summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.qmake.conf2
-rw-r--r--config.tests/common/avx/avx.pro2
-rw-r--r--config.tests/common/avx2/avx2.pro2
-rw-r--r--config.tests/common/avx512/avx512.cpp97
-rw-r--r--config.tests/common/avx512/avx512.pro12
-rw-r--r--config.tests/common/sse2/sse2.pro2
-rw-r--r--config.tests/common/sse3/sse3.pro2
-rw-r--r--config.tests/common/sse4_1/sse4_1.pro2
-rw-r--r--config.tests/common/sse4_2/sse4_2.pro2
-rw-r--r--config.tests/common/ssse3/ssse3.pro2
-rw-r--r--config.tests/common/xlocalescanprint/qglobal.h (renamed from mkspecs/blackberry-x86-qcc/qplatformdefs.h)9
-rw-r--r--config.tests/common/xlocalescanprint/xlocalescanprint.cpp56
-rw-r--r--config.tests/common/xlocalescanprint/xlocalescanprint.pro3
-rwxr-xr-xconfig.tests/unix/arch.test6
-rwxr-xr-xconfig.tests/unix/compile.test11
-rw-r--r--config.tests/unix/doubleconversion/doubleconversion.cpp (renamed from config.tests/x11/xinerama/xinerama.cpp)8
-rw-r--r--config.tests/unix/doubleconversion/doubleconversion.pro4
-rw-r--r--config.tests/unix/poll/poll.cpp (renamed from config.tests/x11/xinput/xinput.cpp)22
-rw-r--r--config.tests/unix/poll/poll.pro2
-rw-r--r--config.tests/unix/pollts/pollts.cpp (renamed from mkspecs/blackberry-armle-v7-qcc/qplatformdefs.h)23
-rw-r--r--config.tests/unix/pollts/pollts.pro2
-rw-r--r--config.tests/unix/ppoll/ppoll.cpp (renamed from config.tests/x11/xvideo/xvideo.cpp)24
-rw-r--r--config.tests/unix/ppoll/ppoll.pro2
-rw-r--r--config.tests/x11/xinerama/xinerama.pro4
-rw-r--r--config.tests/x11/xinput/xinput.pro6
-rw-r--r--config.tests/x11/xvideo/xvideo.pro4
-rwxr-xr-xconfigure378
-rw-r--r--doc/global/externalsites/qt-webpages.qdoc4
-rw-r--r--examples/network/network.pro16
-rw-r--r--examples/widgets/graphicsview/chip/mainwindow.cpp2
-rw-r--r--examples/widgets/graphicsview/chip/view.cpp2
-rw-r--r--examples/widgets/mac/qmaccocoaviewcontainer/main.mm2
-rw-r--r--examples/widgets/mac/qmaccocoaviewcontainer/qmaccocoaviewcontainer.pro2
-rw-r--r--examples/widgets/mac/qmacnativewidget/main.mm2
-rw-r--r--examples/widgets/mac/qmacnativewidget/qmacnativewidget.pro2
-rw-r--r--examples/widgets/mainwindows/mainwindow/colorswatch.cpp2
-rw-r--r--examples/widgets/mainwindows/mainwindow/colorswatch.h2
-rw-r--r--examples/widgets/mainwindows/menus/mainwindow.cpp2
-rw-r--r--examples/widgets/mainwindows/menus/mainwindow.h2
-rw-r--r--examples/widgets/tools/tools.pro8
-rw-r--r--lib/fonts/DejaVuSans-Bold.ttfbin466696 -> 0 bytes
-rw-r--r--lib/fonts/DejaVuSans-BoldOblique.ttfbin441736 -> 0 bytes
-rw-r--r--lib/fonts/DejaVuSans-Oblique.ttfbin434576 -> 0 bytes
-rw-r--r--lib/fonts/DejaVuSans.ttfbin493564 -> 0 bytes
-rw-r--r--lib/fonts/DejaVuSansMono-Bold.ttfbin229460 -> 0 bytes
-rw-r--r--lib/fonts/DejaVuSansMono-BoldOblique.ttfbin177780 -> 0 bytes
-rw-r--r--lib/fonts/DejaVuSansMono-Oblique.ttfbin184896 -> 0 bytes
-rw-r--r--lib/fonts/DejaVuSansMono.ttfbin237788 -> 0 bytes
-rw-r--r--lib/fonts/DejaVuSerif-Bold.ttfbin201516 -> 0 bytes
-rw-r--r--lib/fonts/DejaVuSerif-BoldOblique.ttfbin180948 -> 0 bytes
-rw-r--r--lib/fonts/DejaVuSerif-Oblique.ttfbin179872 -> 0 bytes
-rw-r--r--lib/fonts/DejaVuSerif.ttfbin210416 -> 0 bytes
-rw-r--r--lib/fonts/README21
-rw-r--r--lib/fonts/UTBI____.pfa1172
-rw-r--r--lib/fonts/UTB_____.pfa1134
-rw-r--r--lib/fonts/UTI_____.pfa1165
-rw-r--r--lib/fonts/UTRG____.pfa1126
-rw-r--r--lib/fonts/Vera.ttfbin65932 -> 0 bytes
-rw-r--r--lib/fonts/VeraBI.ttfbin63208 -> 0 bytes
-rw-r--r--lib/fonts/VeraBd.ttfbin58716 -> 0 bytes
-rw-r--r--lib/fonts/VeraIt.ttfbin63684 -> 0 bytes
-rw-r--r--lib/fonts/VeraMoBI.ttfbin55032 -> 0 bytes
-rw-r--r--lib/fonts/VeraMoBd.ttfbin49052 -> 0 bytes
-rw-r--r--lib/fonts/VeraMoIt.ttfbin54508 -> 0 bytes
-rw-r--r--lib/fonts/VeraMono.ttfbin49224 -> 0 bytes
-rw-r--r--lib/fonts/VeraSe.ttfbin60280 -> 0 bytes
-rw-r--r--lib/fonts/VeraSeBd.ttfbin58736 -> 0 bytes
-rw-r--r--lib/fonts/c0419bt_.pfbbin40766 -> 0 bytes
-rw-r--r--lib/fonts/c0582bt_.pfbbin39511 -> 0 bytes
-rw-r--r--lib/fonts/c0583bt_.pfbbin40008 -> 0 bytes
-rw-r--r--lib/fonts/c0611bt_.pfbbin39871 -> 0 bytes
-rw-r--r--lib/fonts/c0632bt_.pfbbin33799 -> 0 bytes
-rw-r--r--lib/fonts/c0633bt_.pfbbin35229 -> 0 bytes
-rw-r--r--lib/fonts/c0648bt_.pfbbin34869 -> 0 bytes
-rw-r--r--lib/fonts/c0649bt_.pfbbin35118 -> 0 bytes
-rw-r--r--lib/fonts/cour.pfa1954
-rw-r--r--lib/fonts/courb.pfa1966
-rw-r--r--lib/fonts/courbi.pfa1940
-rw-r--r--lib/fonts/couri.pfa1893
-rw-r--r--lib/fonts/cursor.pfa954
-rw-r--r--lib/fonts/dejavu_sans_11_50.qpf2bin405944 -> 0 bytes
-rw-r--r--lib/fonts/fixed_120_50.qpfbin3109 -> 0 bytes
-rw-r--r--lib/fonts/fixed_70_50.qpfbin2567 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_100_50.qpfbin3046 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_100_50i.qpfbin3052 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_100_75.qpfbin3040 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_100_75i.qpfbin3081 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_120_50.qpfbin3301 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_120_50i.qpfbin3560 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_120_75.qpfbin3326 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_120_75i.qpfbin3759 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_140_50.qpfbin3860 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_140_50i.qpfbin4208 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_140_75.qpfbin4035 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_140_75i.qpfbin4498 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_180_50.qpfbin5179 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_180_50i.qpfbin5778 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_180_75.qpfbin5712 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_180_75i.qpfbin5977 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_240_50.qpfbin7691 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_240_50i.qpfbin8333 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_240_75.qpfbin7912 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_240_75i.qpfbin8588 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_80_50.qpfbin2735 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_80_50i.qpfbin2742 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_80_75.qpfbin2745 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_80_75i.qpfbin2750 -> 0 bytes
-rw-r--r--lib/fonts/japanese_230_50.qpfbin263331 -> 0 bytes
-rw-r--r--lib/fonts/l047013t.pfa1346
-rw-r--r--lib/fonts/l047016t.pfa1356
-rw-r--r--lib/fonts/l047033t.pfa1353
-rw-r--r--lib/fonts/l047036t.pfa1361
-rw-r--r--lib/fonts/l048013t.pfa1233
-rw-r--r--lib/fonts/l048016t.pfa1269
-rw-r--r--lib/fonts/l048033t.pfa1267
-rw-r--r--lib/fonts/l048036t.pfa1260
-rw-r--r--lib/fonts/l049013t.pfa1598
-rw-r--r--lib/fonts/l049016t.pfa1582
-rw-r--r--lib/fonts/l049033t.pfa1735
-rw-r--r--lib/fonts/l049036t.pfa1613
-rw-r--r--lib/fonts/micro_40_50.qpfbin1602 -> 0 bytes
-rw-r--r--lib/fonts/unifont_160_50.qpfbin1215089 -> 0 bytes
-rw-r--r--mkspecs/blackberry-armle-v7-qcc/qmake.conf22
-rw-r--r--mkspecs/blackberry-x86-qcc/qmake.conf20
-rw-r--r--mkspecs/common/g++-base.conf4
-rw-r--r--mkspecs/common/gcc-base.conf9
-rw-r--r--mkspecs/common/msvc-desktop.conf17
-rw-r--r--mkspecs/common/qcc-base-qnx.conf4
-rw-r--r--mkspecs/devices/linux-imx53qsb-g++/qmake.conf2
-rw-r--r--mkspecs/features/configure.prf4
-rw-r--r--mkspecs/features/device_config.prf15
-rw-r--r--mkspecs/features/qml_module.prf20
-rw-r--r--mkspecs/features/qt.prf4
-rw-r--r--mkspecs/features/qt_common.prf15
-rw-r--r--mkspecs/features/qt_module_headers.prf5
-rw-r--r--mkspecs/features/qt_tool.prf49
-rw-r--r--mkspecs/features/resources.prf12
-rw-r--r--mkspecs/features/simd.prf41
-rw-r--r--mkspecs/features/testcase.prf15
-rw-r--r--mkspecs/linux-icc/qmake.conf11
-rw-r--r--mkspecs/macx-icc/qmake.conf7
-rw-r--r--mkspecs/win32-g++/qmake.conf4
-rw-r--r--mkspecs/win32-icc/qmake.conf7
-rw-r--r--qmake/Makefile.win322
-rw-r--r--qmake/doc/src/qmake-manual.qdoc2
-rw-r--r--qmake/library/qmakeevaluator.cpp2
-rw-r--r--qmake/library/qmakeglobals.cpp7
-rw-r--r--qmake/library/qmakeglobals.h1
-rw-r--r--qmake/option.cpp3
-rw-r--r--qmake/qmake-aux.pro11
-rw-r--r--qmake/qmake-docs.pro2
-rw-r--r--qtbase.pro11
-rw-r--r--src/3rdparty/double-conversion/LICENSE26
-rw-r--r--src/3rdparty/double-conversion/README8
-rw-r--r--src/3rdparty/double-conversion/bignum-dtoa.cc641
-rw-r--r--src/3rdparty/double-conversion/bignum-dtoa.h84
-rw-r--r--src/3rdparty/double-conversion/bignum.cc766
-rw-r--r--src/3rdparty/double-conversion/bignum.h145
-rw-r--r--src/3rdparty/double-conversion/cached-powers.cc178
-rw-r--r--src/3rdparty/double-conversion/cached-powers.h64
-rw-r--r--src/3rdparty/double-conversion/diy-fp.cc57
-rw-r--r--src/3rdparty/double-conversion/diy-fp.h118
-rw-r--r--src/3rdparty/double-conversion/double-conversion.cc975
-rw-r--r--src/3rdparty/double-conversion/double-conversion.pri24
-rw-r--r--src/3rdparty/double-conversion/fast-dtoa.cc665
-rw-r--r--src/3rdparty/double-conversion/fast-dtoa.h88
-rw-r--r--src/3rdparty/double-conversion/fixed-dtoa.cc404
-rw-r--r--src/3rdparty/double-conversion/fixed-dtoa.h56
-rw-r--r--src/3rdparty/double-conversion/ieee.h402
-rw-r--r--src/3rdparty/double-conversion/include/double-conversion/double-conversion.h543
-rw-r--r--src/3rdparty/double-conversion/include/double-conversion/utils.h330
-rw-r--r--src/3rdparty/double-conversion/strtod.cc555
-rw-r--r--src/3rdparty/double-conversion/strtod.h45
-rw-r--r--src/3rdparty/sqlite/0001-Fixing-the-SQLite3-build-for-WEC2013-again.patch33
-rw-r--r--src/3rdparty/sqlite/sqlite3.c4
-rw-r--r--src/android/accessibility/accessibility.pro2
-rw-r--r--src/android/accessibility/jar/AndroidManifest.xml7
-rw-r--r--src/android/accessibility/jar/bundledjar.pro3
-rw-r--r--src/android/accessibility/jar/distributedjar.pro2
-rw-r--r--src/android/accessibility/jar/jar.pri15
-rw-r--r--src/android/accessibility/jar/jar.pro2
-rw-r--r--src/android/android.pro2
-rw-r--r--src/android/jar/jar.pri6
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/ExtractStyle.java26
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java168
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtMessageDialogHelper.java81
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtNative.java18
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtPopupMenu.java66
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtPopupMenu14.java69
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtSurface.java3
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java (renamed from src/android/accessibility/jar/src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java)0
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/accessibility/QtNativeAccessibility.java (renamed from src/android/accessibility/jar/src/org/qtproject/qt5/android/accessibility/QtNativeAccessibility.java)0
-rw-r--r--src/android/java/res/values-ro/strings.xml1
-rw-r--r--src/android/java/res/values/strings.xml1
-rw-r--r--src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java37
-rw-r--r--src/android/templates/AndroidManifest.xml2
-rw-r--r--src/corelib/codecs/qutfcodec.cpp29
-rw-r--r--src/corelib/codecs/qutfcodec_p.h1
-rw-r--r--src/corelib/corelib.pro6
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_global_qglobal.cpp5
-rw-r--r--src/corelib/doc/snippets/qprocess/qprocess-createprocessargumentsmodifier.cpp63
-rw-r--r--src/corelib/global/qcompilerdetection.h31
-rw-r--r--src/corelib/global/qendian.h8
-rw-r--r--src/corelib/global/qglobal.cpp85
-rw-r--r--src/corelib/global/qglobal.h77
-rw-r--r--src/corelib/global/qhooks.cpp11
-rw-r--r--src/corelib/global/qhooks_p.h1
-rw-r--r--src/corelib/global/qlogging.cpp8
-rw-r--r--src/corelib/global/qnamespace.h4
-rw-r--r--src/corelib/global/qnamespace.qdoc27
-rw-r--r--src/corelib/global/qnumeric_p.h280
-rw-r--r--src/corelib/global/qprocessordetection.h13
-rw-r--r--src/corelib/global/qsystemdetection.h67
-rw-r--r--src/corelib/global/qtypeinfo.h14
-rw-r--r--src/corelib/io/io.pri14
-rw-r--r--src/corelib/io/qdatastream.cpp1
-rw-r--r--src/corelib/io/qdatastream.h5
-rw-r--r--src/corelib/io/qdebug.cpp49
-rw-r--r--src/corelib/io/qdebug.h113
-rw-r--r--src/corelib/io/qfile.cpp2
-rw-r--r--src/corelib/io/qfileselector.cpp16
-rw-r--r--src/corelib/io/qfilesystemengine_unix.cpp18
-rw-r--r--src/corelib/io/qfilesystementry.cpp2
-rw-r--r--src/corelib/io/qfilesystemwatcher_inotify.cpp3
-rw-r--r--src/corelib/io/qiodevice.cpp2
-rw-r--r--src/corelib/io/qlockfile_unix.cpp10
-rw-r--r--src/corelib/io/qprocess.cpp74
-rw-r--r--src/corelib/io/qprocess.h22
-rw-r--r--src/corelib/io/qprocess_p.h6
-rw-r--r--src/corelib/io/qprocess_unix.cpp65
-rw-r--r--src/corelib/io/qprocess_win.cpp21
-rw-r--r--src/corelib/io/qsettings.cpp49
-rw-r--r--src/corelib/io/qsettings.h5
-rw-r--r--src/corelib/io/qsettings_p.h5
-rw-r--r--src/corelib/io/qsettings_win.cpp120
-rw-r--r--src/corelib/io/qstandardpaths.cpp38
-rw-r--r--src/corelib/io/qstandardpaths_blackberry.cpp115
-rw-r--r--src/corelib/io/qstandardpaths_ios.mm133
-rw-r--r--src/corelib/io/qstandardpaths_mac.mm204
-rw-r--r--src/corelib/io/qtemporarydir.cpp4
-rw-r--r--src/corelib/io/qtextstream.cpp2
-rw-r--r--src/corelib/itemmodels/qabstractitemmodel_p.h11
-rw-r--r--src/corelib/json/qjsonwriter.cpp3
-rw-r--r--src/corelib/kernel/kernel.pri13
-rw-r--r--src/corelib/kernel/qabstractnativeeventfilter.cpp3
-rw-r--r--src/corelib/kernel/qcore_unix.cpp98
-rw-r--r--src/corelib/kernel/qcore_unix_p.h22
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp106
-rw-r--r--src/corelib/kernel/qcoreevent.h2
-rw-r--r--src/corelib/kernel/qeventdispatcher_blackberry.cpp502
-rw-r--r--src/corelib/kernel/qeventdispatcher_blackberry_p.h97
-rw-r--r--src/corelib/kernel/qeventdispatcher_unix.cpp19
-rw-r--r--src/corelib/kernel/qeventdispatcher_unix_p.h20
-rw-r--r--src/corelib/kernel/qeventdispatcher_win.cpp2
-rw-r--r--src/corelib/kernel/qmetaobjectbuilder.cpp402
-rw-r--r--src/corelib/kernel/qmetatype.cpp4
-rw-r--r--src/corelib/kernel/qobject.cpp2
-rw-r--r--src/corelib/kernel/qobject.h10
-rw-r--r--src/corelib/kernel/qobjectdefs_impl.h2
-rw-r--r--src/corelib/kernel/qpoll.cpp220
-rw-r--r--src/corelib/kernel/qpoll_p.h79
-rw-r--r--src/corelib/kernel/qsharedmemory_p.h2
-rw-r--r--src/corelib/kernel/qvariant.cpp21
-rw-r--r--src/corelib/kernel/qvariant_p.h39
-rw-r--r--src/corelib/plugin/plugin.pri4
-rw-r--r--src/corelib/plugin/qfactoryloader.cpp106
-rw-r--r--src/corelib/plugin/qfactoryloader_p.h21
-rw-r--r--src/corelib/plugin/qlibrary.cpp4
-rw-r--r--src/corelib/plugin/qlibrary_p.h25
-rw-r--r--src/corelib/plugin/qpluginloader.cpp15
-rw-r--r--src/corelib/plugin/qpluginloader.h15
-rw-r--r--src/corelib/plugin/quuid.cpp33
-rw-r--r--src/corelib/plugin/quuid.h15
-rw-r--r--src/corelib/plugin/quuid_darwin.mm (renamed from src/widgets/styles/qgtkpainter.cpp)47
-rw-r--r--src/corelib/statemachine/qsignaltransition.cpp13
-rw-r--r--src/corelib/statemachine/qsignaltransition.h13
-rw-r--r--src/corelib/thread/qthread_unix.cpp14
-rw-r--r--src/corelib/tools/qalgorithms.h8
-rw-r--r--src/corelib/tools/qbytearray.cpp59
-rw-r--r--src/corelib/tools/qbytearray.h23
-rw-r--r--src/corelib/tools/qchar.h8
-rw-r--r--src/corelib/tools/qdatetime.cpp4
-rw-r--r--src/corelib/tools/qdoublescanprint_p.h150
-rw-r--r--src/corelib/tools/qeasingcurve.h6
-rw-r--r--src/corelib/tools/qhash.cpp6
-rw-r--r--src/corelib/tools/qlocale.cpp265
-rw-r--r--src/corelib/tools/qlocale.h9
-rw-r--r--src/corelib/tools/qlocale.qdoc27
-rw-r--r--src/corelib/tools/qlocale_blackberry.cpp333
-rw-r--r--src/corelib/tools/qlocale_blackberry.h91
-rw-r--r--src/corelib/tools/qlocale_p.h43
-rw-r--r--src/corelib/tools/qlocale_tools.cpp2730
-rw-r--r--src/corelib/tools/qlocale_tools_p.h14
-rw-r--r--src/corelib/tools/qpair.h18
-rw-r--r--src/corelib/tools/qregexp.h5
-rw-r--r--src/corelib/tools/qringbuffer.cpp89
-rw-r--r--src/corelib/tools/qringbuffer_p.h11
-rw-r--r--src/corelib/tools/qsharedpointer.cpp19
-rw-r--r--src/corelib/tools/qsharedpointer.h2
-rw-r--r--src/corelib/tools/qsharedpointer_impl.h42
-rw-r--r--src/corelib/tools/qsimd.cpp29
-rw-r--r--src/corelib/tools/qsimd_p.h19
-rw-r--r--src/corelib/tools/qstring.cpp197
-rw-r--r--src/corelib/tools/qstring.h122
-rw-r--r--src/corelib/tools/qversionnumber.h2
-rw-r--r--src/corelib/tools/tools.pri13
-rw-r--r--src/corelib/xml/qxmlstream.h5
-rw-r--r--src/dbus/qdbus_symbols.cpp4
-rw-r--r--src/dbus/qdbusabstractinterface.cpp2
-rw-r--r--src/dbus/qdbusconnection.cpp4
-rw-r--r--src/dbus/qdbusconnectioninterface.cpp8
-rw-r--r--src/dbus/qdbusintegrator.cpp14
-rw-r--r--src/dbus/qdbuspendingcall.cpp2
-rw-r--r--src/gui/accessible/accessible.pri6
-rw-r--r--src/gui/gui.pro2
-rw-r--r--src/gui/image/qicon.cpp50
-rw-r--r--src/gui/image/qicon.h3
-rw-r--r--src/gui/image/qiconengine.cpp17
-rw-r--r--src/gui/image/qiconengine.h3
-rw-r--r--src/gui/image/qiconloader.cpp168
-rw-r--r--src/gui/image/qiconloader_p.h5
-rw-r--r--src/gui/image/qimage.h4
-rw-r--r--src/gui/image/qmovie.cpp14
-rw-r--r--src/gui/image/qpixmap.cpp2
-rw-r--r--src/gui/image/qpixmapcache.cpp10
-rw-r--r--src/gui/image/qpixmapcache.h1
-rw-r--r--src/gui/kernel/qdrag.cpp19
-rw-r--r--src/gui/kernel/qdrag.h2
-rw-r--r--src/gui/kernel/qevent.cpp3
-rw-r--r--src/gui/kernel/qevent.h9
-rw-r--r--src/gui/kernel/qgenericplugin.cpp4
-rw-r--r--src/gui/kernel/qgenericplugin.h5
-rw-r--r--src/gui/kernel/qguiapplication.cpp88
-rw-r--r--src/gui/kernel/qguiapplication.h4
-rw-r--r--src/gui/kernel/qguiapplication_p.h12
-rw-r--r--src/gui/kernel/qinputdevicemanager_p.h3
-rw-r--r--src/gui/kernel/qopenglcontext.cpp2
-rw-r--r--src/gui/kernel/qplatformdrag.cpp14
-rw-r--r--src/gui/kernel/qplatformdrag.h1
-rw-r--r--src/gui/kernel/qplatformintegration.cpp21
-rw-r--r--src/gui/kernel/qplatformintegration.h2
-rw-r--r--src/gui/kernel/qplatformintegrationfactory.cpp14
-rw-r--r--src/gui/kernel/qplatformnativeinterface.cpp9
-rw-r--r--src/gui/kernel/qplatformnativeinterface.h3
-rw-r--r--src/gui/kernel/qplatformtheme.cpp35
-rw-r--r--src/gui/kernel/qplatformtheme.h1
-rw-r--r--src/gui/kernel/qsimpledrag.cpp8
-rw-r--r--src/gui/kernel/qsimpledrag_p.h1
-rw-r--r--src/gui/kernel/qstylehints.cpp22
-rw-r--r--src/gui/kernel/qstylehints.h4
-rw-r--r--src/gui/kernel/qwindow.cpp76
-rw-r--r--src/gui/opengl/qopenglengineshadermanager.cpp14
-rw-r--r--src/gui/opengl/qopenglfunctions.cpp6
-rw-r--r--src/gui/opengl/qtriangulator_p.h11
-rw-r--r--src/gui/painting/painting.pri2
-rw-r--r--src/gui/painting/qcosmeticstroker.cpp4
-rw-r--r--src/gui/painting/qdrawhelper.cpp24
-rw-r--r--src/gui/painting/qdrawhelper_p.h95
-rw-r--r--src/gui/painting/qimagescale.cpp38
-rw-r--r--src/gui/painting/qimagescale_neon.cpp209
-rw-r--r--src/gui/painting/qpaintengine_blitter.cpp4
-rw-r--r--src/gui/painting/qpaintengine_blitter_p.h66
-rw-r--r--src/gui/painting/qpaintengine_raster.cpp6
-rw-r--r--src/gui/painting/qpaintengine_raster_p.h87
-rw-r--r--src/gui/painting/qpainterpath.cpp3
-rw-r--r--src/gui/painting/qrgba64.h2
-rw-r--r--src/gui/text/qfont.cpp16
-rw-r--r--src/gui/text/qfontdatabase.cpp2
-rw-r--r--src/gui/text/qfontmetrics.cpp20
-rw-r--r--src/gui/text/qplatformfontdatabase.cpp2
-rw-r--r--src/gui/text/qrawfont.cpp3
-rw-r--r--src/gui/text/qtextengine.cpp2
-rw-r--r--src/gui/text/qtexthtmlparser.cpp3
-rw-r--r--src/gui/text/qtextimagehandler.cpp1
-rw-r--r--src/gui/text/qtextobject.cpp4
-rw-r--r--src/gui/text/qtextobject.h4
-rw-r--r--src/gui/util/qvalidator.cpp18
-rw-r--r--src/network/access/access.pri2
-rw-r--r--src/network/access/qhttpnetworkconnection.cpp4
-rw-r--r--src/network/access/qhttpnetworkconnection_p.h2
-rw-r--r--src/network/access/qhttpthreaddelegate_p.h10
-rw-r--r--src/network/access/qnetworkreplyhttpimpl.cpp15
-rw-r--r--src/network/access/qnetworkreplyhttpimpl_p.h6
-rw-r--r--src/network/access/qnetworkreplyimpl.cpp8
-rw-r--r--src/network/access/qspdyprotocolhandler.cpp2
-rw-r--r--src/network/access/qspdyprotocolhandler_p.h2
-rw-r--r--src/network/bearer/qnetworkconfiguration.cpp103
-rw-r--r--src/network/bearer/qnetworkconfiguration_p.h11
-rw-r--r--src/network/bearer/qnetworksession_p.h2
-rw-r--r--src/network/bearer/qsharednetworksession.cpp4
-rw-r--r--src/network/bearer/qsharednetworksession_p.h4
-rw-r--r--src/network/kernel/kernel.pri4
-rw-r--r--src/network/kernel/qdnslookup_unix.cpp2
-rw-r--r--src/network/kernel/qnetworkinterface.cpp46
-rw-r--r--src/network/kernel/qnetworkinterface.h2
-rw-r--r--src/network/kernel/qnetworkinterface_p.h3
-rw-r--r--src/network/kernel/qnetworkinterface_unix.cpp62
-rw-r--r--src/network/kernel/qnetworkinterface_win.cpp43
-rw-r--r--src/network/kernel/qnetworkinterface_winrt.cpp13
-rw-r--r--src/network/kernel/qnetworkproxy.cpp10
-rw-r--r--src/network/kernel/qnetworkproxy_blackberry.cpp165
-rw-r--r--src/network/socket/qabstractsocket.cpp77
-rw-r--r--src/network/socket/qabstractsocket.h2
-rw-r--r--src/network/socket/qabstractsocket_p.h2
-rw-r--r--src/network/socket/qhttpsocketengine.cpp4
-rw-r--r--src/network/socket/qhttpsocketengine_p.h2
-rw-r--r--src/network/socket/qnativesocketengine_p.h16
-rw-r--r--src/network/socket/qnativesocketengine_unix.cpp74
-rw-r--r--src/network/socket/qnativesocketengine_win.cpp13
-rw-r--r--src/network/ssl/qsslsocket.cpp4
-rw-r--r--src/network/ssl/qsslsocket_mac.cpp30
-rw-r--r--src/network/ssl/qsslsocket_mac_shared.cpp149
-rw-r--r--src/network/ssl/qsslsocket_openssl.cpp65
-rw-r--r--src/network/ssl/qsslsocket_p.h6
-rw-r--r--src/network/ssl/ssl.pri5
-rw-r--r--src/opengl/gl2paintengineex/qglengineshadermanager.cpp14
-rw-r--r--src/platformsupport/cglconvenience/cglconvenience.mm2
-rw-r--r--src/platformsupport/cglconvenience/cglconvenience.pri4
-rw-r--r--src/platformsupport/clipboard/qmacmime.mm7
-rw-r--r--src/platformsupport/devicediscovery/qdevicediscovery_static.cpp98
-rw-r--r--src/platformsupport/devicediscovery/qdevicediscovery_udev.cpp6
-rw-r--r--src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp1
-rw-r--r--src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm4
-rw-r--r--src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm15
-rw-r--r--src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h2
-rw-r--r--src/platformsupport/graphics/graphics.pri2
-rw-r--r--src/platformsupport/graphics/qrasterbackingstore.cpp104
-rw-r--r--src/platformsupport/graphics/qrasterbackingstore_p.h71
-rw-r--r--src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp1
-rw-r--r--src/platformsupport/input/evdevtablet/evdevtablet.pri6
-rw-r--r--src/platformsupport/input/evdevtablet/qevdevtablethandler.cpp (renamed from src/platformsupport/input/evdevtablet/qevdevtablet.cpp)203
-rw-r--r--src/platformsupport/input/evdevtablet/qevdevtablethandler_p.h (renamed from src/platformsupport/input/evdevtablet/qevdevtablet_p.h)19
-rw-r--r--src/platformsupport/input/evdevtablet/qevdevtabletmanager.cpp122
-rw-r--r--src/platformsupport/input/evdevtablet/qevdevtabletmanager_p.h (renamed from src/widgets/styles/qgtkglobal_p.h)54
-rw-r--r--src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp1
-rw-r--r--src/platformsupport/input/libinput/qlibinputhandler.cpp6
-rw-r--r--src/platformsupport/platformsupport.pro1
-rw-r--r--src/platformsupport/services/genericunix/qgenericunixservices.cpp22
-rw-r--r--src/platformsupport/themes/genericunix/qgenericunixthemes.cpp8
-rw-r--r--src/plugins/bearer/android/src/wrappers/androidconnectivitymanager.cpp4
-rw-r--r--src/plugins/bearer/bearer.pro1
-rw-r--r--src/plugins/bearer/blackberry/blackberry.json3
-rw-r--r--src/plugins/bearer/blackberry/blackberry.pro20
-rw-r--r--src/plugins/bearer/blackberry/qbbengine.cpp413
-rw-r--r--src/plugins/bearer/blackberry/qbbengine.h101
-rw-r--r--src/plugins/generic/evdevtablet/main.cpp12
-rw-r--r--src/plugins/generic/tuiotouch/qtuiohandler.cpp1
-rw-r--r--src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp2
-rw-r--r--src/plugins/platforms/android/androidjniaccessibility.cpp7
-rw-r--r--src/plugins/platforms/android/androidjnimain.cpp4
-rw-r--r--src/plugins/platforms/android/androidjnimenu.cpp9
-rw-r--r--src/plugins/platforms/android/qandroideventdispatcher.cpp18
-rw-r--r--src/plugins/platforms/android/qandroideventdispatcher.h3
-rw-r--r--src/plugins/platforms/android/qandroidinputcontext.cpp20
-rw-r--r--src/plugins/platforms/android/qandroidplatformfontdatabase.cpp2
-rw-r--r--src/plugins/platforms/android/qandroidplatformintegration.cpp6
-rw-r--r--src/plugins/platforms/android/qandroidplatformopenglwindow.cpp2
-rw-r--r--src/plugins/platforms/android/qandroidplatformtheme.cpp6
-rw-r--r--src/plugins/platforms/cocoa/cocoa.pro2
-rw-r--r--src/plugins/platforms/cocoa/main.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoaaccessibility.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoaaccessibility.mm4
-rw-r--r--src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoaapplication.mm4
-rw-r--r--src/plugins/platforms/cocoa/qcocoaapplicationdelegate.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoabackingstore.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm6
-rw-r--r--src/plugins/platforms/cocoa/qcocoacursor.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoadrag.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm4
-rw-r--r--src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm6
-rw-r--r--src/plugins/platforms/cocoa/qcocoaglcontext.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoaglcontext.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoahelpers.h5
-rw-r--r--src/plugins/platforms/cocoa/qcocoahelpers.mm257
-rw-r--r--src/plugins/platforms/cocoa/qcocoaintegration.h5
-rw-r--r--src/plugins/platforms/cocoa/qcocoaintegration.mm9
-rw-r--r--src/plugins/platforms/cocoa/qcocoakeymapper.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenubar.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenuitem.mm4
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenuloader.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoanativeinterface.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoanativeinterface.mm7
-rw-r--r--src/plugins/platforms/cocoa/qcocoaservices.mm6
-rw-r--r--src/plugins/platforms/cocoa/qcocoasystemsettings.mm29
-rw-r--r--src/plugins/platforms/cocoa/qcocoatheme.h5
-rw-r--r--src/plugins/platforms/cocoa/qcocoatheme.mm59
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm17
-rw-r--r--src/plugins/platforms/cocoa/qmacclipboard.h2
-rw-r--r--src/plugins/platforms/cocoa/qmacdefines_mac.h2
-rw-r--r--src/plugins/platforms/cocoa/qmultitouch_mac_p.h2
-rw-r--r--src/plugins/platforms/cocoa/qnsview.h2
-rw-r--r--src/plugins/platforms/cocoa/qnsview.mm1
-rw-r--r--src/plugins/platforms/cocoa/qnsviewaccessibility.mm2
-rw-r--r--src/plugins/platforms/cocoa/qnswindowdelegate.h2
-rw-r--r--src/plugins/platforms/cocoa/qprintengine_mac.mm2
-rw-r--r--src/plugins/platforms/cocoa/qt_mac_p.h32
-rw-r--r--src/plugins/platforms/direct2d/qwindowsdirect2ddevicecontext.cpp2
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsdevice.cpp10
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsintegration.cpp4
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp24
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/qeglfsx11integration.cpp2
-rw-r--r--src/plugins/platforms/eglfs/qeglfscursor.cpp1
-rw-r--r--src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp2
-rw-r--r--src/plugins/platforms/eglfs/qeglfsintegration.cpp4
-rw-r--r--src/plugins/platforms/eglfs/qeglfswindow.cpp20
-rw-r--r--src/plugins/platforms/haiku/qhaikuwindow.cpp2
-rw-r--r--src/plugins/platforms/ios/ios.pro8
-rw-r--r--src/plugins/platforms/ios/qiosbackingstore.h21
-rw-r--r--src/plugins/platforms/ios/qiosbackingstore.mm111
-rw-r--r--src/plugins/platforms/ios/qioseventdispatcher.mm4
-rw-r--r--src/plugins/platforms/ios/qiosintegration.h2
-rw-r--r--src/plugins/platforms/ios/qiosintegration.mm11
-rw-r--r--src/plugins/platforms/ios/qiosmenu.h3
-rw-r--r--src/plugins/platforms/ios/qiosmenu.mm38
-rw-r--r--src/plugins/platforms/ios/qiosmessagedialog.h (renamed from src/plugins/bearer/blackberry/main.cpp)40
-rw-r--r--src/plugins/platforms/ios/qiosmessagedialog.mm135
-rw-r--r--src/plugins/platforms/ios/qiostheme.mm5
-rw-r--r--src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp1
-rw-r--r--src/plugins/platforms/minimalegl/qminimaleglscreen.cpp12
-rw-r--r--src/plugins/platforms/mirclient/qmirclientclipboard.cpp7
-rw-r--r--src/plugins/platforms/mirclient/qmirclientglcontext.cpp10
-rw-r--r--src/plugins/platforms/mirclient/qmirclientintegration.cpp2
-rw-r--r--src/plugins/platforms/offscreen/qoffscreenintegration_x11.cpp4
-rw-r--r--src/plugins/platforms/openwfd/qopenwfdport.cpp7
-rw-r--r--src/plugins/platforms/qnx/qblackberrytheme.cpp119
-rw-r--r--src/plugins/platforms/qnx/qblackberrytheme.h73
-rw-r--r--src/plugins/platforms/qnx/qnx.pro51
-rw-r--r--src/plugins/platforms/qnx/qqnxbpseventfilter.cpp229
-rw-r--r--src/plugins/platforms/qnx/qqnxbpseventfilter.h82
-rw-r--r--src/plugins/platforms/qnx/qqnxbuffer.cpp6
-rw-r--r--src/plugins/platforms/qnx/qqnxbuttoneventnotifier.cpp2
-rw-r--r--src/plugins/platforms/qnx/qqnxeglwindow.cpp14
-rw-r--r--src/plugins/platforms/qnx/qqnxeventdispatcher_blackberry.cpp68
-rw-r--r--src/plugins/platforms/qnx/qqnxeventdispatcher_blackberry.h58
-rw-r--r--src/plugins/platforms/qnx/qqnxfiledialoghelper.h87
-rw-r--r--src/plugins/platforms/qnx/qqnxfiledialoghelper_bb10.cpp212
-rw-r--r--src/plugins/platforms/qnx/qqnxfilepicker.cpp322
-rw-r--r--src/plugins/platforms/qnx/qqnxfilepicker.h107
-rw-r--r--src/plugins/platforms/qnx/qqnxglcontext.cpp18
-rw-r--r--src/plugins/platforms/qnx/qqnxglobal.cpp4
-rw-r--r--src/plugins/platforms/qnx/qqnxinputcontext_imf.cpp27
-rw-r--r--src/plugins/platforms/qnx/qqnxintegration.cpp89
-rw-r--r--src/plugins/platforms/qnx/qqnxintegration.h10
-rw-r--r--src/plugins/platforms/qnx/qqnxnativeinterface.cpp5
-rw-r--r--src/plugins/platforms/qnx/qqnxnavigatorbps.cpp66
-rw-r--r--src/plugins/platforms/qnx/qqnxnavigatorbps.h54
-rw-r--r--src/plugins/platforms/qnx/qqnxnavigatorcover.cpp57
-rw-r--r--src/plugins/platforms/qnx/qqnxnavigatorcover.h52
-rw-r--r--src/plugins/platforms/qnx/qqnxnavigatoreventnotifier.cpp6
-rw-r--r--src/plugins/platforms/qnx/qqnxnavigatorpps.cpp8
-rw-r--r--src/plugins/platforms/qnx/qqnxrasterwindow.cpp2
-rw-r--r--src/plugins/platforms/qnx/qqnxscreen.cpp4
-rw-r--r--src/plugins/platforms/qnx/qqnxscreeneventhandler.cpp13
-rw-r--r--src/plugins/platforms/qnx/qqnxsystemsettings.cpp74
-rw-r--r--src/plugins/platforms/qnx/qqnxsystemsettings.h48
-rw-r--r--src/plugins/platforms/qnx/qqnxvirtualkeyboardbps.cpp217
-rw-r--r--src/plugins/platforms/qnx/qqnxvirtualkeyboardbps.h68
-rw-r--r--src/plugins/platforms/qnx/qqnxvirtualkeyboardpps.cpp10
-rw-r--r--src/plugins/platforms/qnx/qqnxwindow.cpp42
-rw-r--r--src/plugins/platforms/windows/qwindowscontext.cpp2
-rw-r--r--src/plugins/platforms/windows/qwindowscursor.cpp15
-rw-r--r--src/plugins/platforms/windows/qwindowscursor.h2
-rw-r--r--src/plugins/platforms/windows/qwindowsdrag.cpp11
-rw-r--r--src/plugins/platforms/windows/qwindowsdrag.h4
-rw-r--r--src/plugins/platforms/windows/qwindowsfontdatabase.cpp7
-rw-r--r--src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp4
-rw-r--r--src/plugins/platforms/windows/qwindowsfontengine.cpp3
-rw-r--r--src/plugins/platforms/windows/qwindowsinputcontext.cpp3
-rw-r--r--src/plugins/platforms/windows/qwindowsintegration.cpp14
-rw-r--r--src/plugins/platforms/windows/qwindowsintegration.h2
-rw-r--r--src/plugins/platforms/windows/qwindowsmousehandler.cpp1
-rw-r--r--src/plugins/platforms/windows/qwindowsnativeimage.cpp2
-rw-r--r--src/plugins/platforms/windows/qwindowsnativeinterface.cpp21
-rw-r--r--src/plugins/platforms/windows/qwindowsnativeinterface.h6
-rw-r--r--src/plugins/platforms/windows/qwindowstabletsupport.cpp7
-rw-r--r--src/plugins/platforms/winrt/qwinrteglcontext.cpp6
-rw-r--r--src/plugins/platforms/winrt/qwinrtwindow.cpp4
-rw-r--r--src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp4
-rw-r--r--src/plugins/platforms/xcb/qxcbconnection.cpp13
-rw-r--r--src/plugins/platforms/xcb/qxcbconnection.h16
-rw-r--r--src/plugins/platforms/xcb/qxcbcursor.h5
-rw-r--r--src/plugins/platforms/xcb/qxcbintegration.cpp13
-rw-r--r--src/plugins/platforms/xcb/qxcbintegration.h2
-rw-r--r--src/plugins/platforms/xcb/qxcbkeyboard.cpp2
-rw-r--r--src/plugins/platforms/xcb/qxcbnativeinterface.cpp41
-rw-r--r--src/plugins/platforms/xcb/qxcbnativeinterface.h4
-rw-r--r--src/plugins/platforms/xcb/qxcbscreen.cpp2
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp12
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.h1
-rw-r--r--src/plugins/platformthemes/gtk2/gtk2.json3
-rw-r--r--src/plugins/platformthemes/gtk2/gtk2.pro21
-rw-r--r--src/plugins/platformthemes/gtk3/gtk3.json3
-rw-r--r--src/plugins/platformthemes/gtk3/gtk3.pro21
-rw-r--r--src/plugins/platformthemes/gtk3/main.cpp (renamed from src/plugins/platformthemes/gtk2/main.cpp)12
-rw-r--r--src/plugins/platformthemes/gtk3/qgtk3dialoghelpers.cpp (renamed from src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp)176
-rw-r--r--src/plugins/platformthemes/gtk3/qgtk3dialoghelpers.h (renamed from src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.h)38
-rw-r--r--src/plugins/platformthemes/gtk3/qgtk3theme.cpp (renamed from src/plugins/platformthemes/gtk2/qgtk2theme.cpp)45
-rw-r--r--src/plugins/platformthemes/gtk3/qgtk3theme.h (renamed from src/plugins/platformthemes/gtk2/qgtk2theme.h)10
-rw-r--r--src/plugins/platformthemes/platformthemes.pro2
-rw-r--r--src/plugins/plugins.pro1
-rw-r--r--src/plugins/printsupport/cocoa/cocoa.pro2
-rw-r--r--src/plugins/styles/bb10style/bb10lightstyle.qrc54
-rw-r--r--src/plugins/styles/bb10style/bb10style.pro28
-rw-r--r--src/plugins/styles/bb10style/bright/button/core_button_disabled.pngbin1510 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/button/core_button_disabled_selected.pngbin1782 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/button/core_button_enabled_selected.pngbin1830 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/button/core_button_inactive.pngbin2428 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/button/core_button_pressed.pngbin3221 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/checkbox/core_checkbox_checked.pngbin2048 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/checkbox/core_checkbox_disabled.pngbin935 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/checkbox/core_checkbox_disabled_checked.pngbin1702 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/checkbox/core_checkbox_enabled.pngbin1082 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/checkbox/core_checkbox_pressed.pngbin2776 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/checkbox/core_checkbox_pressed_checked.pngbin2652 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/combobox/core_dropdown_button.pngbin1605 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/combobox/core_dropdown_button_arrowdown.pngbin1419 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/combobox/core_dropdown_button_arrowdown_pressed.pngbin1404 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/combobox/core_dropdown_button_arrowup.pngbin1398 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/combobox/core_dropdown_button_disabled.pngbin1587 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/combobox/core_dropdown_button_pressed.pngbin1801 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/combobox/core_dropdown_checkmark.pngbin1769 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/combobox/core_dropdown_divider.pngbin134 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/combobox/core_dropdown_menu.pngbin874 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/combobox/core_dropdown_menuup.pngbin996 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/combobox/core_listitem_active.pngbin182 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/lineedit/core_textinput_bg.pngbin1315 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/lineedit/core_textinput_bg_disabled.pngbin454 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/lineedit/core_textinput_bg_highlight.pngbin394 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/listitem/core_listitem_active.pngbin164 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/listitem/core_listitem_divider.pngbin135 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_bg.pngbin1802 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_complete.pngbin635 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_fill.pngbin629 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_vbg.pngbin903 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_vcomplete.pngbin614 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_vfill.pngbin594 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/radiobutton/core_radiobutton_checked.pngbin4471 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/radiobutton/core_radiobutton_disabled.pngbin3652 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/radiobutton/core_radiobutton_disabled_checked.pngbin4094 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/radiobutton/core_radiobutton_inactive.pngbin4245 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/radiobutton/core_radiobutton_pressed.pngbin5460 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/scrollbar/core_scrollbar.pngbin1242 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/scrollbar/core_scrollbar_v.pngbin385 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/slider/core_slider_active.pngbin1167 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/slider/core_slider_cache.pngbin1154 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/slider/core_slider_disabled.pngbin1134 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/slider/core_slider_enabled.pngbin1049 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/slider/core_slider_handle.pngbin2843 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/slider/core_slider_handle_disabled.pngbin2708 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/slider/core_slider_handle_pressed.pngbin6577 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/slider/core_slider_inactive.pngbin1162 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/slider/core_slider_vactive.pngbin1077 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/slider/core_slider_vcache.pngbin1063 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/slider/core_slider_vdisabled.pngbin1064 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/slider/core_slider_venabled.pngbin996 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/bright/slider/core_slider_vinactive.pngbin1071 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/button/core_button_disabled.pngbin1291 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/button/core_button_disabled_selected.pngbin1655 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/button/core_button_enabled_selected.pngbin1665 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/button/core_button_inactive.pngbin2262 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/button/core_button_pressed.pngbin2853 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/checkbox/core_checkbox_checked.pngbin1947 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/checkbox/core_checkbox_disabled.pngbin787 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/checkbox/core_checkbox_disabled_checked.pngbin1578 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/checkbox/core_checkbox_enabled.pngbin925 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/checkbox/core_checkbox_pressed.pngbin2478 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/checkbox/core_checkbox_pressed_checked.pngbin2256 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/combobox/core_dropdown_button.pngbin1425 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/combobox/core_dropdown_button_arrowdown.pngbin1404 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/combobox/core_dropdown_button_arrowdown_pressed.pngbin1465 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/combobox/core_dropdown_button_arrowup.pngbin1383 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/combobox/core_dropdown_button_disabled.pngbin1291 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/combobox/core_dropdown_button_pressed.pngbin1583 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/combobox/core_dropdown_checkmark.pngbin1588 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/combobox/core_dropdown_divider.pngbin134 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/combobox/core_dropdown_menu.pngbin662 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/combobox/core_dropdown_menuup.pngbin688 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/combobox/core_listitem_active.pngbin149 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/lineedit/core_textinput_bg.pngbin1315 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/lineedit/core_textinput_bg_disabled.pngbin454 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/lineedit/core_textinput_bg_highlight.pngbin394 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/listitem/core_listitem_active.pngbin164 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/listitem/core_listitem_divider.pngbin136 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_bg.pngbin1724 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_complete.pngbin635 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_fill.pngbin658 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_vbg.pngbin815 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_vcomplete.pngbin614 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_vfill.pngbin602 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/radiobutton/core_radiobutton_checked.pngbin4298 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/radiobutton/core_radiobutton_disabled.pngbin3125 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/radiobutton/core_radiobutton_disabled_checked.pngbin3539 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/radiobutton/core_radiobutton_inactive.pngbin3968 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/radiobutton/core_radiobutton_pressed.pngbin4777 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/scrollbar/core_scrollbar.pngbin1245 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/scrollbar/core_scrollbar_v.pngbin369 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/slider/core_slider_active.pngbin1160 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/slider/core_slider_cache.pngbin1154 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/slider/core_slider_disabled.pngbin1105 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/slider/core_slider_enabled.pngbin983 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/slider/core_slider_handle.pngbin3019 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/slider/core_slider_handle_disabled.pngbin1715 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/slider/core_slider_handle_pressed.pngbin6593 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/slider/core_slider_inactive.pngbin1158 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/slider/core_slider_vactive.pngbin1066 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/slider/core_slider_vcache.pngbin1058 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/slider/core_slider_vdisabled.pngbin1009 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/slider/core_slider_venabled.pngbin929 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/dark/slider/core_slider_vinactive.pngbin1067 -> 0 bytes
-rw-r--r--src/plugins/styles/bb10style/qbb10brightstyle.cpp344
-rw-r--r--src/plugins/styles/bb10style/qbb10brightstyle.qrc57
-rw-r--r--src/plugins/styles/bb10style/qbb10darkstyle.cpp349
-rw-r--r--src/plugins/styles/bb10style/qbb10darkstyle.h62
-rw-r--r--src/plugins/styles/bb10style/qbb10darkstyle.qrc57
-rw-r--r--src/plugins/styles/bb10style/qbb10styleplugin.cpp66
-rw-r--r--src/plugins/styles/bb10style/qbb10styleplugin.h56
-rw-r--r--src/plugins/styles/bb10style/qbb10styleplugin.json3
-rw-r--r--src/plugins/styles/styles.pro3
-rw-r--r--src/printsupport/dialogs/dialogs.pri4
-rw-r--r--src/printsupport/dialogs/qpagesetupdialog_mac.mm2
-rw-r--r--src/printsupport/dialogs/qprintdialog_mac.mm2
-rw-r--r--src/printsupport/kernel/qprinter.cpp2
-rw-r--r--src/sql/drivers/db2/qsql_db2.cpp85
-rw-r--r--src/sql/drivers/db2/qsql_db2_p.h68
-rw-r--r--src/sql/drivers/ibase/qsql_ibase.cpp72
-rw-r--r--src/sql/drivers/ibase/qsql_ibase_p.h61
-rw-r--r--src/sql/drivers/mysql/qsql_mysql.cpp159
-rw-r--r--src/sql/drivers/mysql/qsql_mysql_p.h39
-rw-r--r--src/sql/drivers/oci/qsql_oci.cpp148
-rw-r--r--src/sql/drivers/oci/qsql_oci_p.h41
-rw-r--r--src/sql/drivers/odbc/qsql_odbc.cpp141
-rw-r--r--src/sql/drivers/odbc/qsql_odbc_p.h76
-rw-r--r--src/sql/drivers/psql/qsql_psql.cpp61
-rw-r--r--src/sql/drivers/psql/qsql_psql_p.h33
-rw-r--r--src/sql/drivers/sqlite/qsql_sqlite.cpp70
-rw-r--r--src/sql/drivers/sqlite/qsql_sqlite_p.h5
-rw-r--r--src/sql/drivers/sqlite2/qsql_sqlite2.cpp68
-rw-r--r--src/sql/drivers/sqlite2/qsql_sqlite2_p.h57
-rw-r--r--src/sql/drivers/tds/qsql_tds.cpp45
-rw-r--r--src/sql/drivers/tds/qsql_tds_p.h39
-rw-r--r--src/sql/kernel/qsqlcachedresult.cpp48
-rw-r--r--src/sql/kernel/qsqlcachedresult_p.h47
-rw-r--r--src/sql/kernel/qsqldriver.cpp29
-rw-r--r--src/sql/kernel/qsqlnulldriver_p.h53
-rw-r--r--src/sql/kernel/qsqlresult.cpp14
-rw-r--r--src/sql/kernel/qsqlresult.h2
-rw-r--r--src/sql/kernel/qsqlresult_p.h13
-rw-r--r--src/testlib/qbenchmarkvalgrind.cpp2
-rw-r--r--src/testlib/qplaintestlogger.cpp9
-rw-r--r--src/testlib/qtestblacklist.cpp7
-rw-r--r--src/testlib/qtestcase.cpp1496
-rw-r--r--src/testlib/qtestcase.qdoc1278
-rw-r--r--src/testlib/qxctestlogger.mm2
-rw-r--r--src/tools/moc/preprocessor.cpp9
-rw-r--r--src/tools/rcc/main.cpp2
-rw-r--r--src/widgets/accessible/itemviews.cpp10
-rw-r--r--src/widgets/accessible/qaccessiblewidget.cpp16
-rw-r--r--src/widgets/accessible/qaccessiblewidgets.cpp12
-rw-r--r--src/widgets/accessible/simplewidgets.cpp4
-rw-r--r--src/widgets/dialogs/qdialog.cpp2
-rw-r--r--src/widgets/dialogs/qfiledialog.cpp66
-rw-r--r--src/widgets/dialogs/qfileinfogatherer.cpp4
-rw-r--r--src/widgets/dialogs/qfilesystemmodel.cpp43
-rw-r--r--src/widgets/dialogs/qfilesystemmodel.h1
-rw-r--r--src/widgets/dialogs/qfontdialog.cpp3
-rw-r--r--src/widgets/dialogs/qmessagebox.cpp44
-rw-r--r--src/widgets/dialogs/qprogressdialog.cpp10
-rw-r--r--src/widgets/dialogs/qsidebar.cpp10
-rw-r--r--src/widgets/dialogs/qwizard.cpp45
-rw-r--r--src/widgets/doc/images/gtk-calendarwidget.pngbin16761 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-checkbox.pngbin2323 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-combobox.pngbin2730 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-dateedit.pngbin2163 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-datetimeedit.pngbin2923 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-dial.pngbin7221 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-doublespinbox.pngbin2325 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-fontcombobox.pngbin3022 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-frame.pngbin2340 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-groupbox.pngbin6650 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-horizontalscrollbar.pngbin1701 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-label.pngbin1582 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-lcdnumber.pngbin1193 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-lineedit.pngbin2528 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-listview.pngbin8493 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-progressbar.pngbin2228 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-pushbutton.pngbin2153 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-radiobutton.pngbin3142 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-slider.pngbin1359 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-spinbox.pngbin2078 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-tableview.pngbin8364 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-tabwidget.pngbin8179 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-textedit.pngbin12641 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-timeedit.pngbin2621 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-toolbox.pngbin4240 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-toolbutton.pngbin2260 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-treeview.pngbin9722 -> 0 bytes
-rw-r--r--src/widgets/doc/snippets/code/doc_src_stylesheet.cpp4
-rw-r--r--src/widgets/doc/snippets/macmainwindow.mm2
-rw-r--r--src/widgets/doc/snippets/qmacnativewidget/main.mm2
-rw-r--r--src/widgets/doc/snippets/styles/qcustompixmapstyle.cpp85
-rw-r--r--src/widgets/doc/src/widgets-and-layouts/gallery-gtk.qdoc142
-rw-r--r--src/widgets/doc/src/widgets-and-layouts/gallery.qdoc4
-rw-r--r--src/widgets/doc/src/widgets-and-layouts/styles.qdoc2
-rw-r--r--src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc22
-rw-r--r--src/widgets/doc/src/windows-and-dialogs/mainwindow.qdoc13
-rw-r--r--src/widgets/effects/qgraphicseffect.cpp4
-rw-r--r--src/widgets/graphicsview/qgraph_p.h5
-rw-r--r--src/widgets/graphicsview/qgraphicsanchorlayout_p.cpp38
-rw-r--r--src/widgets/graphicsview/qgraphicsanchorlayout_p.h2
-rw-r--r--src/widgets/graphicsview/qgraphicsitem.cpp7
-rw-r--r--src/widgets/graphicsview/qgraphicsitem_p.h2
-rw-r--r--src/widgets/graphicsview/qgraphicsscene.cpp7
-rw-r--r--src/widgets/graphicsview/qgraphicswidget.cpp4
-rw-r--r--src/widgets/graphicsview/qgraphicswidget.h3
-rw-r--r--src/widgets/graphicsview/qsimplex_p.cpp8
-rw-r--r--src/widgets/itemviews/qabstractitemview.cpp34
-rw-r--r--src/widgets/itemviews/qabstractitemview.h1
-rw-r--r--src/widgets/itemviews/qabstractitemview_p.h22
-rw-r--r--src/widgets/itemviews/qdirmodel.cpp10
-rw-r--r--src/widgets/itemviews/qfileiconprovider.cpp13
-rw-r--r--src/widgets/itemviews/qheaderview.cpp6
-rw-r--r--src/widgets/itemviews/qheaderview_p.h4
-rw-r--r--src/widgets/itemviews/qitemeditorfactory.cpp3
-rw-r--r--src/widgets/itemviews/qlistview.cpp28
-rw-r--r--src/widgets/itemviews/qlistwidget.cpp4
-rw-r--r--src/widgets/itemviews/qtableview.cpp30
-rw-r--r--src/widgets/itemviews/qtablewidget.cpp33
-rw-r--r--src/widgets/itemviews/qtreeview.cpp8
-rw-r--r--src/widgets/itemviews/qtreewidget.cpp63
-rw-r--r--src/widgets/itemviews/qtreewidget.h3
-rw-r--r--src/widgets/itemviews/qwidgetitemdata_p.h2
-rw-r--r--src/widgets/kernel/mac.pri4
-rw-r--r--src/widgets/kernel/qaction.cpp2
-rw-r--r--src/widgets/kernel/qapplication.cpp95
-rw-r--r--src/widgets/kernel/qdesktopwidget.cpp4
-rw-r--r--src/widgets/kernel/qformlayout.cpp8
-rw-r--r--src/widgets/kernel/qgesturemanager.cpp16
-rw-r--r--src/widgets/kernel/qgridlayout.cpp6
-rw-r--r--src/widgets/kernel/qlayout.cpp66
-rw-r--r--src/widgets/kernel/qopenglwidget.cpp14
-rw-r--r--src/widgets/kernel/qshortcut.cpp4
-rw-r--r--src/widgets/kernel/qstackedlayout.cpp12
-rw-r--r--src/widgets/kernel/qtooltip.cpp8
-rw-r--r--src/widgets/kernel/qwidget.cpp85
-rw-r--r--src/widgets/kernel/qwidget.h3
-rw-r--r--src/widgets/kernel/qwidgetbackingstore.cpp2
-rw-r--r--src/widgets/kernel/qwidgetwindow.cpp10
-rw-r--r--src/widgets/kernel/qwindowcontainer.cpp2
-rw-r--r--src/widgets/styles/qandroidstyle.cpp2
-rw-r--r--src/widgets/styles/qcommonstyle.cpp50
-rw-r--r--src/widgets/styles/qdrawutil.cpp8
-rw-r--r--src/widgets/styles/qgtk2painter.cpp699
-rw-r--r--src/widgets/styles/qgtk2painter_p.h100
-rw-r--r--src/widgets/styles/qgtkpainter_p.h119
-rw-r--r--src/widgets/styles/qgtkstyle.cpp4257
-rw-r--r--src/widgets/styles/qgtkstyle_p.cpp891
-rw-r--r--src/widgets/styles/qgtkstyle_p.h123
-rw-r--r--src/widgets/styles/qgtkstyle_p_p.h449
-rw-r--r--src/widgets/styles/qmacstyle_mac.mm82
-rw-r--r--src/widgets/styles/qmacstyle_mac_p_p.h3
-rw-r--r--src/widgets/styles/qpixmapstyle.cpp (renamed from src/plugins/styles/bb10style/qpixmapstyle.cpp)300
-rw-r--r--src/widgets/styles/qpixmapstyle_p.h (renamed from src/plugins/styles/bb10style/qpixmapstyle.h)92
-rw-r--r--src/widgets/styles/qpixmapstyle_p_p.h86
-rw-r--r--src/widgets/styles/qstyle.cpp11
-rw-r--r--src/widgets/styles/qstyle.h26
-rw-r--r--src/widgets/styles/qstylefactory.cpp14
-rw-r--r--src/widgets/styles/qstyleoption.h24
-rw-r--r--src/widgets/styles/qstylesheetstyle.cpp129
-rw-r--r--src/widgets/styles/qstylesheetstyle_default.cpp3
-rw-r--r--src/widgets/styles/qstylesheetstyle_p.h7
-rw-r--r--src/widgets/styles/qwindowsvistastyle.cpp4
-rw-r--r--src/widgets/styles/qwindowsxpstyle.cpp8
-rw-r--r--src/widgets/styles/styles.pri30
-rw-r--r--src/widgets/util/qcolormap.cpp2
-rw-r--r--src/widgets/util/qcompleter.cpp8
-rw-r--r--src/widgets/util/qflickgesture.cpp3
-rw-r--r--src/widgets/util/qscroller.cpp12
-rw-r--r--src/widgets/util/qscroller_mac.mm4
-rw-r--r--src/widgets/util/qscroller_p.h6
-rw-r--r--src/widgets/util/qsystemtrayicon.cpp2
-rw-r--r--src/widgets/util/qsystemtrayicon_x11.cpp4
-rw-r--r--src/widgets/util/qundostack.cpp12
-rw-r--r--src/widgets/widgets/qabstractscrollarea.cpp6
-rw-r--r--src/widgets/widgets/qabstractslider.cpp19
-rw-r--r--src/widgets/widgets/qabstractslider_p.h3
-rw-r--r--src/widgets/widgets/qabstractspinbox.cpp4
-rw-r--r--src/widgets/widgets/qcalendarwidget.cpp128
-rw-r--r--src/widgets/widgets/qcombobox.cpp36
-rw-r--r--src/widgets/widgets/qcombobox.h2
-rw-r--r--src/widgets/widgets/qdatetimeedit.cpp8
-rw-r--r--src/widgets/widgets/qdialogbuttonbox.cpp11
-rw-r--r--src/widgets/widgets/qdockarealayout.cpp24
-rw-r--r--src/widgets/widgets/qdockarealayout_p.h8
-rw-r--r--src/widgets/widgets/qgroupbox.cpp8
-rw-r--r--src/widgets/widgets/qlabel.cpp6
-rw-r--r--src/widgets/widgets/qlabel.h2
-rw-r--r--src/widgets/widgets/qlcdnumber.cpp4
-rw-r--r--src/widgets/widgets/qlineedit.cpp2
-rw-r--r--src/widgets/widgets/qlineedit_p.h2
-rw-r--r--src/widgets/widgets/qmaccocoaviewcontainer_mac.mm4
-rw-r--r--src/widgets/widgets/qmacnativewidget_mac.mm4
-rw-r--r--src/widgets/widgets/qmainwindow.cpp2
-rw-r--r--src/widgets/widgets/qmainwindowlayout.cpp2
-rw-r--r--src/widgets/widgets/qmainwindowlayout_p.h14
-rw-r--r--src/widgets/widgets/qmdiarea.cpp63
-rw-r--r--src/widgets/widgets/qmdiarea_p.h2
-rw-r--r--src/widgets/widgets/qmdisubwindow.cpp14
-rw-r--r--src/widgets/widgets/qmenu_mac.mm4
-rw-r--r--src/widgets/widgets/qplaintextedit.cpp4
-rw-r--r--src/widgets/widgets/qscrollbar.h7
-rw-r--r--src/widgets/widgets/qspinbox.cpp2
-rw-r--r--src/widgets/widgets/qsplitter.cpp6
-rw-r--r--src/widgets/widgets/qstackedwidget.cpp2
-rw-r--r--src/widgets/widgets/qstatusbar.cpp4
-rw-r--r--src/widgets/widgets/qtabbar.cpp257
-rw-r--r--src/widgets/widgets/qtabbar_p.h4
-rw-r--r--src/widgets/widgets/qtextbrowser.cpp6
-rw-r--r--src/widgets/widgets/qtextedit.cpp2
-rw-r--r--src/widgets/widgets/qtoolbararealayout.cpp4
-rw-r--r--src/widgets/widgets/qtoolbox.cpp6
-rw-r--r--src/widgets/widgets/qwidgetlinecontrol.cpp37
-rw-r--r--src/widgets/widgets/qwidgetlinecontrol_p.h1
-rw-r--r--tests/auto/auto.pro2
-rw-r--r--tests/auto/concurrent/qtconcurrentfilter/qtconcurrentfilter.pro2
-rw-r--r--tests/auto/concurrent/qtconcurrentiteratekernel/qtconcurrentiteratekernel.pro2
-rw-r--r--tests/auto/concurrent/qtconcurrentmap/qtconcurrentmap.pro2
-rw-r--r--tests/auto/concurrent/qtconcurrentmedian/qtconcurrentmedian.pro2
-rw-r--r--tests/auto/concurrent/qtconcurrentrun/qtconcurrentrun.pro2
-rw-r--r--tests/auto/concurrent/qtconcurrentthreadengine/qtconcurrentthreadengine.pro2
-rw-r--r--tests/auto/corelib/animation/qabstractanimation/qabstractanimation.pro3
-rw-r--r--tests/auto/corelib/animation/qanimationgroup/qanimationgroup.pro3
-rw-r--r--tests/auto/corelib/animation/qparallelanimationgroup/qparallelanimationgroup.pro2
-rw-r--r--tests/auto/corelib/animation/qparallelanimationgroup/tst_qparallelanimationgroup.cpp2
-rw-r--r--tests/auto/corelib/animation/qpauseanimation/qpauseanimation.pro2
-rw-r--r--tests/auto/corelib/animation/qpauseanimation/tst_qpauseanimation.cpp96
-rw-r--r--tests/auto/corelib/animation/qpropertyanimation/qpropertyanimation.pro2
-rw-r--r--tests/auto/corelib/animation/qpropertyanimation/tst_qpropertyanimation.cpp3
-rw-r--r--tests/auto/corelib/animation/qsequentialanimationgroup/qsequentialanimationgroup.pro3
-rw-r--r--tests/auto/corelib/animation/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp6
-rw-r--r--tests/auto/corelib/animation/qvariantanimation/qvariantanimation.pro3
-rw-r--r--tests/auto/corelib/animation/qvariantanimation/tst_qvariantanimation.cpp4
-rw-r--r--tests/auto/corelib/codecs/qtextcodec/echo/echo.pro1
-rw-r--r--tests/auto/corelib/codecs/qtextcodec/test/test.pro2
-rw-r--r--tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp8
-rw-r--r--tests/auto/corelib/codecs/utf8/utf8.pro2
-rw-r--r--tests/auto/corelib/global/q_func_info/q_func_info.pro3
-rw-r--r--tests/auto/corelib/global/qflags/qflags.pro3
-rw-r--r--tests/auto/corelib/global/qgetputenv/qgetputenv.pro3
-rw-r--r--tests/auto/corelib/global/qgetputenv/tst_qgetputenv.cpp2
-rw-r--r--tests/auto/corelib/global/qglobal/qglobal.pro3
-rw-r--r--tests/auto/corelib/global/qglobalstatic/qglobalstatic.pro1
-rw-r--r--tests/auto/corelib/global/qhooks/qhooks.pro2
-rw-r--r--tests/auto/corelib/global/qhooks/tst_qhooks.cpp2
-rw-r--r--tests/auto/corelib/global/qlogging/app/app.pro1
-rw-r--r--tests/auto/corelib/global/qlogging/test/test.pro2
-rw-r--r--tests/auto/corelib/global/qlogging/tst_qlogging.cpp2
-rw-r--r--tests/auto/corelib/global/qnumeric/qnumeric.pro3
-rw-r--r--tests/auto/corelib/global/qnumeric/tst_qnumeric.cpp43
-rw-r--r--tests/auto/corelib/global/qrand/qrand.pro3
-rw-r--r--tests/auto/corelib/global/qtendian/qtendian.pro3
-rw-r--r--tests/auto/corelib/io/largefile/largefile.pro1
-rw-r--r--tests/auto/corelib/io/qabstractfileengine/qabstractfileengine.pro1
-rw-r--r--tests/auto/corelib/io/qbuffer/qbuffer.pro3
-rw-r--r--tests/auto/corelib/io/qbuffer/tst_qbuffer.cpp2
-rw-r--r--tests/auto/corelib/io/qdatastream/qdatastream.pro1
-rw-r--r--tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp100
-rw-r--r--tests/auto/corelib/io/qdataurl/qdataurl.pro3
-rw-r--r--tests/auto/corelib/io/qdebug/qdebug.pro3
-rw-r--r--tests/auto/corelib/io/qdir/qdir.pro1
-rw-r--r--tests/auto/corelib/io/qdir/tst_qdir.cpp20
-rw-r--r--tests/auto/corelib/io/qdiriterator/qdiriterator.pro1
-rw-r--r--tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp2
-rw-r--r--tests/auto/corelib/io/qfile/qfile.pro1
-rw-r--r--tests/auto/corelib/io/qfile/stdinprocess/stdinprocess.pro1
-rw-r--r--tests/auto/corelib/io/qfile/test/test.pro2
-rw-r--r--tests/auto/corelib/io/qfile/tst_qfile.cpp32
-rw-r--r--tests/auto/corelib/io/qfileinfo/qfileinfo.pro1
-rw-r--r--tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp4
-rw-r--r--tests/auto/corelib/io/qfileselector/platforms/+blackberry/test0
-rw-r--r--tests/auto/corelib/io/qfileselector/platforms/+blackberry/test20
-rw-r--r--tests/auto/corelib/io/qfileselector/qfileselector.pro1
-rw-r--r--tests/auto/corelib/io/qfileselector/qfileselector.qrc3
-rw-r--r--tests/auto/corelib/io/qfileselector/tst_qfileselector.cpp2
-rw-r--r--tests/auto/corelib/io/qfilesystementry/qfilesystementry.pro3
-rw-r--r--tests/auto/corelib/io/qfilesystemwatcher/qfilesystemwatcher.pro3
-rw-r--r--tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp5
-rw-r--r--tests/auto/corelib/io/qiodevice/qiodevice.pro1
-rw-r--r--tests/auto/corelib/io/qipaddress/qipaddress.pro3
-rw-r--r--tests/auto/corelib/io/qnodebug/qnodebug.pro3
-rw-r--r--tests/auto/corelib/io/qnodebug/tst_qnodebug.cpp5
-rw-r--r--tests/auto/corelib/io/qprocess-noapplication/qprocess-noapplication.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/fileWriterProcess/fileWriterProcess.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/test/test.pro2
-rw-r--r--tests/auto/corelib/io/qprocess/testDetached/testDetached.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testExitCodes/testExitCodes.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testGuiProcess/testGuiProcess.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testProcessCrash/testProcessCrash.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testProcessDeadWhileReading/testProcessDeadWhileReading.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testProcessEOF/testProcessEOF.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testProcessEcho/testProcessEcho.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testProcessEcho2/testProcessEcho2.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testProcessEcho3/testProcessEcho3.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testProcessEnvironment/testProcessEnvironment.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testProcessNormal/testProcessNormal.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testProcessOutput/testProcessOutput.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testSetWorkingDirectory/testSetWorkingDirectory.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testSoftExit/testSoftExit.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testSpaceInName/testSpaceInName.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/tst_qprocess.cpp51
-rw-r--r--tests/auto/corelib/io/qprocessenvironment/qprocessenvironment.pro3
-rw-r--r--tests/auto/corelib/io/qprocessenvironment/tst_qprocessenvironment.cpp14
-rw-r--r--tests/auto/corelib/io/qresourceengine/qresourceengine.pro3
-rw-r--r--tests/auto/corelib/io/qsavefile/qsavefile.pro2
-rw-r--r--tests/auto/corelib/io/qsettings/tst_qsettings.cpp208
-rw-r--r--tests/auto/corelib/io/qstandardpaths/qstandardpaths.pro1
-rw-r--r--tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp8
-rw-r--r--tests/auto/corelib/io/qstorageinfo/tst_qstorageinfo.cpp20
-rw-r--r--tests/auto/corelib/io/qtemporarydir/qtemporarydir.pro1
-rw-r--r--tests/auto/corelib/io/qtemporaryfile/qtemporaryfile.pro2
-rw-r--r--tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp2
-rw-r--r--tests/auto/corelib/io/qtextstream/readAllStdinProcess/readAllStdinProcess.pro1
-rw-r--r--tests/auto/corelib/io/qtextstream/readLineStdinProcess/readLineStdinProcess.pro1
-rw-r--r--tests/auto/corelib/io/qtextstream/stdinProcess/stdinProcess.pro1
-rw-r--r--tests/auto/corelib/io/qtextstream/test/test.pro2
-rw-r--r--tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp18
-rw-r--r--tests/auto/corelib/io/qurl/qurl.pro3
-rw-r--r--tests/auto/corelib/io/qurl/tst_qurl.cpp26
-rw-r--r--tests/auto/corelib/io/qurlinternal/qurlinternal.pro2
-rw-r--r--tests/auto/corelib/io/qurlquery/qurlquery.pro3
-rw-r--r--tests/auto/corelib/io/qurlquery/tst_qurlquery.cpp38
-rw-r--r--tests/auto/corelib/io/qwinoverlappedionotifier/qwinoverlappedionotifier.pro1
-rw-r--r--tests/auto/corelib/io/qwinoverlappedionotifier/tst_qwinoverlappedionotifier.cpp4
-rw-r--r--tests/auto/corelib/itemmodels/qabstractitemmodel/qabstractitemmodel.pro1
-rw-r--r--tests/auto/corelib/itemmodels/qabstractitemmodel/tst_qabstractitemmodel.cpp41
-rw-r--r--tests/auto/corelib/itemmodels/qabstractproxymodel/qabstractproxymodel.pro1
-rw-r--r--tests/auto/corelib/itemmodels/qabstractproxymodel/tst_qabstractproxymodel.cpp2
-rw-r--r--tests/auto/corelib/itemmodels/qidentityproxymodel/qidentityproxymodel.pro2
-rw-r--r--tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp72
-rw-r--r--tests/auto/corelib/itemmodels/qitemmodel/modelstotest.cpp11
-rw-r--r--tests/auto/corelib/itemmodels/qitemmodel/qitemmodel.pro1
-rw-r--r--tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp6
-rw-r--r--tests/auto/corelib/itemmodels/qitemselectionmodel/qitemselectionmodel.pro2
-rw-r--r--tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp65
-rw-r--r--tests/auto/corelib/itemmodels/qsortfilterproxymodel/qsortfilterproxymodel.pro2
-rw-r--r--tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp86
-rw-r--r--tests/auto/corelib/itemmodels/qstringlistmodel/qstringlistmodel.pro2
-rw-r--r--tests/auto/corelib/json/json.pro8
-rw-r--r--tests/auto/corelib/json/test.bjsonbin60992 -> 35392 bytes
-rw-r--r--tests/auto/corelib/json/test.json10
-rw-r--r--tests/auto/corelib/json/tst_qtjson.cpp139
-rw-r--r--tests/auto/corelib/kernel/qcoreapplication/qcoreapplication.pro2
-rw-r--r--tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp8
-rw-r--r--tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.h2
-rw-r--r--tests/auto/corelib/kernel/qeventdispatcher/qeventdispatcher.pro1
-rw-r--r--tests/auto/corelib/kernel/qeventloop/qeventloop.pro2
-rw-r--r--tests/auto/corelib/kernel/qmath/qmath.pro3
-rw-r--r--tests/auto/corelib/kernel/qmetaenum/qmetaenum.pro1
-rw-r--r--tests/auto/corelib/kernel/qmetamethod/qmetamethod.pro2
-rw-r--r--tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp4
-rw-r--r--tests/auto/corelib/kernel/qmetaobject/qmetaobject.pro2
-rw-r--r--tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp4
-rw-r--r--tests/auto/corelib/kernel/qmetaobjectbuilder/qmetaobjectbuilder.pro3
-rw-r--r--tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp108
-rw-r--r--tests/auto/corelib/kernel/qmetaproperty/qmetaproperty.pro2
-rw-r--r--tests/auto/corelib/kernel/qmetatype/qmetatype.pro2
-rw-r--r--tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp9
-rw-r--r--tests/auto/corelib/kernel/qmimedata/qmimedata.pro2
-rw-r--r--tests/auto/corelib/kernel/qmimedata/tst_qmimedata.cpp2
-rw-r--r--tests/auto/corelib/kernel/qobject/signalbug/signalbug.pro1
-rw-r--r--tests/auto/corelib/kernel/qobject/test/test.pro1
-rw-r--r--tests/auto/corelib/kernel/qobject/tst_qobject.cpp48
-rw-r--r--tests/auto/corelib/kernel/qpointer/qpointer.pro2
-rw-r--r--tests/auto/corelib/kernel/qsharedmemory/test/tst_qsharedmemory.cpp26
-rw-r--r--tests/auto/corelib/kernel/qsignalblocker/qsignalblocker.pro2
-rw-r--r--tests/auto/corelib/kernel/qsignalmapper/qsignalmapper.pro2
-rw-r--r--tests/auto/corelib/kernel/qsignalmapper/tst_qsignalmapper.cpp10
-rw-r--r--tests/auto/corelib/kernel/qsocketnotifier/qsocketnotifier.pro2
-rw-r--r--tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp8
-rw-r--r--tests/auto/corelib/kernel/qsystemsemaphore/test/tst_qsystemsemaphore.cpp4
-rw-r--r--tests/auto/corelib/kernel/qtimer/qtimer.pro3
-rw-r--r--tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp2
-rw-r--r--tests/auto/corelib/kernel/qtranslator/qtranslator.pro2
-rw-r--r--tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp26
-rw-r--r--tests/auto/corelib/kernel/qvariant/qvariant.pro6
-rw-r--r--tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp95
-rw-r--r--tests/auto/corelib/kernel/qwineventnotifier/qwineventnotifier.pro3
-rw-r--r--tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/qmimedatabase-cache.pro1
-rw-r--r--tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/qmimedatabase-xml.pro3
-rw-r--r--tests/auto/corelib/mimetypes/qmimetype/qmimetype.pro3
-rw-r--r--tests/auto/corelib/plugin/plugin.pro9
-rw-r--r--tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.pro1
-rw-r--r--tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.pro1
-rw-r--r--tests/auto/corelib/plugin/qfactoryloader/qfactoryloader.pro1
-rw-r--r--tests/auto/corelib/plugin/qfactoryloader/test/test.pro7
-rw-r--r--tests/auto/corelib/plugin/qfactoryloader/tst_qfactoryloader.cpp8
-rw-r--r--tests/auto/corelib/plugin/qlibrary/lib/lib.pro1
-rw-r--r--tests/auto/corelib/plugin/qlibrary/lib2/lib2.pro1
-rw-r--r--tests/auto/corelib/plugin/qlibrary/qlibrary.pro1
-rw-r--r--tests/auto/corelib/plugin/qlibrary/tst/tst.pro2
-rw-r--r--tests/auto/corelib/plugin/qlibrary/tst_qlibrary.cpp2
-rw-r--r--tests/auto/corelib/plugin/qplugin/debugplugin/debugplugin.pro1
-rw-r--r--tests/auto/corelib/plugin/qplugin/qplugin.pro1
-rw-r--r--tests/auto/corelib/plugin/qplugin/releaseplugin/releaseplugin.pro1
-rw-r--r--tests/auto/corelib/plugin/qplugin/tst_qplugin.pro2
-rw-r--r--tests/auto/corelib/plugin/qpluginloader/almostplugin/almostplugin.pro1
-rw-r--r--tests/auto/corelib/plugin/qpluginloader/lib/lib.pro1
-rw-r--r--tests/auto/corelib/plugin/qpluginloader/qpluginloader.pro1
-rw-r--r--tests/auto/corelib/plugin/qpluginloader/theplugin/theplugin.pro1
-rw-r--r--tests/auto/corelib/plugin/qpluginloader/tst/tst.pro2
-rw-r--r--tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp6
-rw-r--r--tests/auto/corelib/plugin/quuid/quuid.pro1
-rw-r--r--tests/auto/corelib/plugin/quuid/test/test.pro7
-rw-r--r--tests/auto/corelib/plugin/quuid/testProcessUniqueness/testProcessUniqueness.pro1
-rw-r--r--tests/auto/corelib/plugin/quuid/tst_quuid.cpp16
-rw-r--r--tests/auto/corelib/plugin/quuid/tst_quuid_darwin.mm82
-rw-r--r--tests/auto/corelib/statemachine/qstate/qstate.pro3
-rw-r--r--tests/auto/corelib/statemachine/qstatemachine/qstatemachine.pro2
-rw-r--r--tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp42
-rw-r--r--tests/auto/corelib/thread/qatomicint/qatomicint.pro3
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/qatomicinteger.pri2
-rw-r--r--tests/auto/corelib/thread/qatomicpointer/qatomicpointer.pro3
-rw-r--r--tests/auto/corelib/thread/qatomicpointer/tst_qatomicpointer.cpp88
-rw-r--r--tests/auto/corelib/thread/qfuture/qfuture.pro3
-rw-r--r--tests/auto/corelib/thread/qfuture/tst_qfuture.cpp46
-rw-r--r--tests/auto/corelib/thread/qfuturesynchronizer/qfuturesynchronizer.pro3
-rw-r--r--tests/auto/corelib/thread/qfuturewatcher/qfuturewatcher.pro3
-rw-r--r--tests/auto/corelib/thread/qmutex/qmutex.pro2
-rw-r--r--tests/auto/corelib/thread/qmutexlocker/qmutexlocker.pro3
-rw-r--r--tests/auto/corelib/thread/qreadlocker/qreadlocker.pro3
-rw-r--r--tests/auto/corelib/thread/qreadwritelock/qreadwritelock.pro3
-rw-r--r--tests/auto/corelib/thread/qresultstore/qresultstore.pro3
-rw-r--r--tests/auto/corelib/thread/qresultstore/tst_qresultstore.cpp14
-rw-r--r--tests/auto/corelib/thread/qsemaphore/qsemaphore.pro1
-rw-r--r--tests/auto/corelib/thread/qthread/qthread.pro3
-rw-r--r--tests/auto/corelib/thread/qthreadonce/qthreadonce.pro3
-rw-r--r--tests/auto/corelib/thread/qthreadonce/tst_qthreadonce.cpp2
-rw-r--r--tests/auto/corelib/thread/qthreadpool/qthreadpool.pro3
-rw-r--r--tests/auto/corelib/thread/qthreadstorage/crashonexit/crashonexit.pro1
-rw-r--r--tests/auto/corelib/thread/qthreadstorage/qthreadstorage.pro2
-rw-r--r--tests/auto/corelib/thread/qthreadstorage/test/test.pro1
-rw-r--r--tests/auto/corelib/thread/qwaitcondition/qwaitcondition.pro3
-rw-r--r--tests/auto/corelib/thread/qwritelocker/qwritelocker.pro3
-rw-r--r--tests/auto/corelib/tools/collections/collections.pro2
-rw-r--r--tests/auto/corelib/tools/collections/tst_collections.cpp160
-rw-r--r--tests/auto/corelib/tools/qalgorithms/qalgorithms.pro2
-rw-r--r--tests/auto/corelib/tools/qalgorithms/tst_qalgorithms.cpp20
-rw-r--r--tests/auto/corelib/tools/qarraydata/qarraydata.pro3
-rw-r--r--tests/auto/corelib/tools/qbitarray/qbitarray.pro3
-rw-r--r--tests/auto/corelib/tools/qbitarray/tst_qbitarray.cpp4
-rw-r--r--tests/auto/corelib/tools/qbytearray/qbytearray.pro3
-rw-r--r--tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp51
-rw-r--r--tests/auto/corelib/tools/qbytearraylist/qbytearraylist.pro2
-rw-r--r--tests/auto/corelib/tools/qbytearraymatcher/qbytearraymatcher.pro3
-rw-r--r--tests/auto/corelib/tools/qcache/qcache.pro3
-rw-r--r--tests/auto/corelib/tools/qchar/qchar.pro3
-rw-r--r--tests/auto/corelib/tools/qchar/tst_qchar.cpp65
-rw-r--r--tests/auto/corelib/tools/qcollator/qcollator.pro3
-rw-r--r--tests/auto/corelib/tools/qcommandlineparser/tst_qcommandlineparser.pro2
-rw-r--r--tests/auto/corelib/tools/qcontiguouscache/qcontiguouscache.pro3
-rw-r--r--tests/auto/corelib/tools/qcryptographichash/qcryptographichash.pro3
-rw-r--r--tests/auto/corelib/tools/qdate/qdate.pro3
-rw-r--r--tests/auto/corelib/tools/qdate/tst_qdate.cpp2
-rw-r--r--tests/auto/corelib/tools/qdatetime/qdatetime.pro3
-rw-r--r--tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp14
-rw-r--r--tests/auto/corelib/tools/qeasingcurve/qeasingcurve.pro3
-rw-r--r--tests/auto/corelib/tools/qelapsedtimer/qelapsedtimer.pro3
-rw-r--r--tests/auto/corelib/tools/qexplicitlyshareddatapointer/qexplicitlyshareddatapointer.pro3
-rw-r--r--tests/auto/corelib/tools/qfreelist/qfreelist.pro2
-rw-r--r--tests/auto/corelib/tools/qhash/qhash.pro3
-rw-r--r--tests/auto/corelib/tools/qhash/tst_qhash.cpp30
-rw-r--r--tests/auto/corelib/tools/qhashfunctions/qhashfunctions.pro3
-rw-r--r--tests/auto/corelib/tools/qline/qline.pro3
-rw-r--r--tests/auto/corelib/tools/qline/tst_qline.cpp6
-rw-r--r--tests/auto/corelib/tools/qlinkedlist/qlinkedlist.pro3
-rw-r--r--tests/auto/corelib/tools/qlist/qlist.pro2
-rw-r--r--tests/auto/corelib/tools/qlocale/syslocaleapp/syslocaleapp.pro1
-rw-r--r--tests/auto/corelib/tools/qlocale/test/test.pro8
-rw-r--r--tests/auto/corelib/tools/qlocale/tst_qlocale.cpp267
-rw-r--r--tests/auto/corelib/tools/qmap/qmap.pro3
-rw-r--r--tests/auto/corelib/tools/qmap/tst_qmap.cpp70
-rw-r--r--tests/auto/corelib/tools/qmargins/qmargins.pro3
-rw-r--r--tests/auto/corelib/tools/qmessageauthenticationcode/qmessageauthenticationcode.pro3
-rw-r--r--tests/auto/corelib/tools/qpair/qpair.pro3
-rw-r--r--tests/auto/corelib/tools/qpair/tst_qpair.cpp69
-rw-r--r--tests/auto/corelib/tools/qpoint/qpoint.pro3
-rw-r--r--tests/auto/corelib/tools/qpointf/qpointf.pro3
-rw-r--r--tests/auto/corelib/tools/qqueue/qqueue.pro3
-rw-r--r--tests/auto/corelib/tools/qrect/qrect.pro3
-rw-r--r--tests/auto/corelib/tools/qregexp/qregexp.pro3
-rw-r--r--tests/auto/corelib/tools/qregexp/tst_qregexp.cpp14
-rw-r--r--tests/auto/corelib/tools/qregularexpression/alwaysoptimize/alwaysoptimize.pro3
-rw-r--r--tests/auto/corelib/tools/qregularexpression/defaultoptimize/defaultoptimize.pro3
-rw-r--r--tests/auto/corelib/tools/qregularexpression/forceoptimize/forceoptimize.pro2
-rw-r--r--tests/auto/corelib/tools/qregularexpression/tst_qregularexpression.cpp12
-rw-r--r--tests/auto/corelib/tools/qringbuffer/qringbuffer.pro3
-rw-r--r--tests/auto/corelib/tools/qringbuffer/tst_qringbuffer.cpp31
-rw-r--r--tests/auto/corelib/tools/qscopedpointer/qscopedpointer.pro3
-rw-r--r--tests/auto/corelib/tools/qscopedvaluerollback/qscopedvaluerollback.pro3
-rw-r--r--tests/auto/corelib/tools/qset/qset.pro3
-rw-r--r--tests/auto/corelib/tools/qset/tst_qset.cpp2
-rw-r--r--tests/auto/corelib/tools/qsharedpointer/qsharedpointer.pro1
-rw-r--r--tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp61
-rw-r--r--tests/auto/corelib/tools/qsize/qsize.pro3
-rw-r--r--tests/auto/corelib/tools/qsizef/qsizef.pro3
-rw-r--r--tests/auto/corelib/tools/qstl/qstl.pro3
-rw-r--r--tests/auto/corelib/tools/qstring/qstring.pro6
-rw-r--r--tests/auto/corelib/tools/qstring/tst_qstring.cpp433
-rw-r--r--tests/auto/corelib/tools/qstring_no_cast_from_bytearray/qstring_no_cast_from_bytearray.pro3
-rw-r--r--tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/qstringbuilder1.pro3
-rw-r--r--tests/auto/corelib/tools/qstringbuilder/qstringbuilder2/qstringbuilder2.pro3
-rw-r--r--tests/auto/corelib/tools/qstringbuilder/qstringbuilder3/qstringbuilder3.pro3
-rw-r--r--tests/auto/corelib/tools/qstringbuilder/qstringbuilder4/qstringbuilder4.pro3
-rw-r--r--tests/auto/corelib/tools/qstringiterator/qstringiterator.pro2
-rw-r--r--tests/auto/corelib/tools/qstringlist/qstringlist.pro3
-rw-r--r--tests/auto/corelib/tools/qstringmatcher/qstringmatcher.pro3
-rw-r--r--tests/auto/corelib/tools/qstringref/qstringref.pro3
-rw-r--r--tests/auto/corelib/tools/qstringref/tst_qstringref.cpp16
-rw-r--r--tests/auto/corelib/tools/qtextboundaryfinder/qtextboundaryfinder.pro3
-rw-r--r--tests/auto/corelib/tools/qtextboundaryfinder/tst_qtextboundaryfinder.cpp4
-rw-r--r--tests/auto/corelib/tools/qtime/qtime.pro3
-rw-r--r--tests/auto/corelib/tools/qtimeline/qtimeline.pro3
-rw-r--r--tests/auto/corelib/tools/qtimezone/qtimezone.pro3
-rw-r--r--tests/auto/corelib/tools/qvarlengtharray/qvarlengtharray.pro3
-rw-r--r--tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp12
-rw-r--r--tests/auto/corelib/tools/qvector/qvector.pro3
-rw-r--r--tests/auto/corelib/tools/qvector/tst_qvector.cpp4
-rw-r--r--tests/auto/corelib/tools/qversionnumber/qversionnumber.pro2
-rw-r--r--tests/auto/corelib/xml/qxmlstream/qxmlstream.pro2
-rw-r--r--tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp95
-rw-r--r--tests/auto/dbus/qdbusabstractadaptor/qdbusabstractadaptor/qdbusabstractadaptor.pro1
-rw-r--r--tests/auto/dbus/qdbusabstractadaptor/qmyserver/qmyserver.pro1
-rw-r--r--tests/auto/dbus/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp6
-rw-r--r--tests/auto/dbus/qdbusabstractinterface/qdbusabstractinterface/qdbusabstractinterface.pro1
-rw-r--r--tests/auto/dbus/qdbusabstractinterface/qpinger/qpinger.pro1
-rw-r--r--tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp36
-rw-r--r--tests/auto/dbus/qdbusconnection/qdbusconnection.pro1
-rw-r--r--tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp10
-rw-r--r--tests/auto/dbus/qdbusconnection_no_bus/qdbusconnection_no_bus.pro1
-rw-r--r--tests/auto/dbus/qdbuscontext/qdbuscontext.pro1
-rw-r--r--tests/auto/dbus/qdbusinterface/qdbusinterface/qdbusinterface.pro1
-rw-r--r--tests/auto/dbus/qdbusinterface/qmyserver/qmyserver.pro1
-rw-r--r--tests/auto/dbus/qdbusinterface/tst_qdbusinterface.cpp6
-rw-r--r--tests/auto/dbus/qdbuslocalcalls/qdbuslocalcalls.pro1
-rw-r--r--tests/auto/dbus/qdbusmarshall/qdbusmarshall/qdbusmarshall.pro1
-rw-r--r--tests/auto/dbus/qdbusmarshall/qpong/qpong.pro1
-rw-r--r--tests/auto/dbus/qdbusmetaobject/qdbusmetaobject.pro1
-rw-r--r--tests/auto/dbus/qdbusmetatype/qdbusmetatype.pro1
-rw-r--r--tests/auto/dbus/qdbuspendingcall/qdbuspendingcall.pro1
-rw-r--r--tests/auto/dbus/qdbuspendingcall/tst_qdbuspendingcall.cpp6
-rw-r--r--tests/auto/dbus/qdbuspendingreply/qdbuspendingreply.pro1
-rw-r--r--tests/auto/dbus/qdbusreply/qdbusreply.pro1
-rw-r--r--tests/auto/dbus/qdbusservicewatcher/qdbusservicewatcher.pro1
-rw-r--r--tests/auto/dbus/qdbusthreading/qdbusthreading.pro1
-rw-r--r--tests/auto/dbus/qdbusthreading/tst_qdbusthreading.cpp5
-rw-r--r--tests/auto/dbus/qdbustype/qdbustype.pro1
-rw-r--r--tests/auto/dbus/qdbustype/tst_qdbustype.cpp4
-rw-r--r--tests/auto/dbus/qdbusxmlparser/qdbusxmlparser.pro1
-rw-r--r--tests/auto/gui/image/qicoimageformat/qicoimageformat.pro1
-rw-r--r--tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp50
-rw-r--r--tests/auto/gui/image/qicon/icons/themeparent/icon-theme.cachebin0 -> 280 bytes
-rw-r--r--tests/auto/gui/image/qicon/qicon.pro1
-rw-r--r--tests/auto/gui/image/qicon/tst_qicon.cpp64
-rw-r--r--tests/auto/gui/image/qicon/tst_qicon.qrc1
-rw-r--r--tests/auto/gui/image/qimage/qimage.pro1
-rw-r--r--tests/auto/gui/image/qimage/tst_qimage.cpp92
-rw-r--r--tests/auto/gui/image/qimageiohandler/qimageiohandler.pro1
-rw-r--r--tests/auto/gui/image/qimagereader/tst_qimagereader.cpp8
-rw-r--r--tests/auto/gui/image/qimagewriter/tst_qimagewriter.cpp21
-rw-r--r--tests/auto/gui/image/qmovie/qmovie.pro1
-rw-r--r--tests/auto/gui/image/qpicture/qpicture.pro1
-rw-r--r--tests/auto/gui/image/qpixmap/tst_qpixmap.cpp29
-rw-r--r--tests/auto/gui/image/qpixmapcache/qpixmapcache.pro1
-rw-r--r--tests/auto/gui/image/qpixmapcache/tst_qpixmapcache.cpp12
-rw-r--r--tests/auto/gui/itemmodels/qstandarditem/qstandarditem.pro1
-rw-r--r--tests/auto/gui/itemmodels/qstandarditem/tst_qstandarditem.cpp37
-rw-r--r--tests/auto/gui/itemmodels/qstandarditemmodel/qstandarditemmodel.pro1
-rw-r--r--tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp83
-rw-r--r--tests/auto/gui/kernel/noqteventloop/tst_noqteventloop.cpp10
-rw-r--r--tests/auto/gui/kernel/qdrag/qdrag.pro1
-rw-r--r--tests/auto/gui/kernel/qevent/qevent.pro1
-rw-r--r--tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp16
-rw-r--r--tests/auto/gui/kernel/qguimetatype/qguimetatype.pro1
-rw-r--r--tests/auto/gui/kernel/qguitimer/qguitimer.pro1
-rw-r--r--tests/auto/gui/kernel/qguivariant/no_application/no_application.pro1
-rw-r--r--tests/auto/gui/kernel/qguivariant/test/test.pro1
-rw-r--r--tests/auto/gui/kernel/qguivariant/test/tst_qguivariant.cpp2
-rw-r--r--tests/auto/gui/kernel/qkeysequence/qkeysequence.pro2
-rw-r--r--tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp4
-rw-r--r--tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp21
-rw-r--r--tests/auto/gui/kernel/qmouseevent_modal/tst_qmouseevent_modal.cpp26
-rw-r--r--tests/auto/gui/kernel/qopenglwindow/qopenglwindow.pro2
-rw-r--r--tests/auto/gui/kernel/qpalette/qpalette.pro1
-rw-r--r--tests/auto/gui/kernel/qscreen/qscreen.pro1
-rw-r--r--tests/auto/gui/kernel/qsurfaceformat/qsurfaceformat.pro1
-rw-r--r--tests/auto/gui/kernel/qwindow/BLACKLIST2
-rw-r--r--tests/auto/gui/kernel/qwindow/tst_qwindow.cpp216
-rw-r--r--tests/auto/gui/math3d/qmatrixnxn/qmatrixnxn.pro1
-rw-r--r--tests/auto/gui/math3d/qquaternion/qquaternion.pro1
-rw-r--r--tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp12
-rw-r--r--tests/auto/gui/math3d/qvectornd/qvectornd.pro1
-rw-r--r--tests/auto/gui/painting/qbrush/qbrush.pro1
-rw-r--r--tests/auto/gui/painting/qcolor/qcolor.pro1
-rw-r--r--tests/auto/gui/painting/qpagelayout/qpagelayout.pro2
-rw-r--r--tests/auto/gui/painting/qpagesize/qpagesize.pro2
-rw-r--r--tests/auto/gui/painting/qpaintengine/qpaintengine.pro1
-rw-r--r--tests/auto/gui/painting/qpainter/qpainter.pro2
-rw-r--r--tests/auto/gui/painting/qpainter/tst_qpainter.cpp78
-rw-r--r--tests/auto/gui/painting/qpainterpath/tst_qpainterpath.cpp8
-rw-r--r--tests/auto/gui/painting/qpainterpathstroker/qpainterpathstroker.pro1
-rw-r--r--tests/auto/gui/painting/qpathclipper/qpathclipper.pro1
-rw-r--r--tests/auto/gui/painting/qpdfwriter/qpdfwriter.pro2
-rw-r--r--tests/auto/gui/painting/qpen/qpen.pro1
-rw-r--r--tests/auto/gui/painting/qpolygon/qpolygon.pro1
-rw-r--r--tests/auto/gui/painting/qregion/qregion.pro1
-rw-r--r--tests/auto/gui/painting/qtransform/qtransform.pro1
-rw-r--r--tests/auto/gui/painting/qtransform/tst_qtransform.cpp26
-rw-r--r--tests/auto/gui/painting/qwmatrix/qwmatrix.pro1
-rw-r--r--tests/auto/gui/painting/qwmatrix/tst_qwmatrix.cpp27
-rw-r--r--tests/auto/gui/qopengl/qopengl.pro3
-rw-r--r--tests/auto/gui/qopenglconfig/qopenglconfig.pro1
-rw-r--r--tests/auto/gui/text/qabstracttextdocumentlayout/qabstracttextdocumentlayout.pro1
-rw-r--r--tests/auto/gui/text/qcssparser/qcssparser.pro1
-rw-r--r--tests/auto/gui/text/qcssparser/tst_qcssparser.cpp41
-rw-r--r--tests/auto/gui/text/qfont/qfont.pro4
-rw-r--r--tests/auto/gui/text/qfont/tst_qfont.cpp34
-rw-r--r--tests/auto/gui/text/qfontcache/qfontcache.pro1
-rw-r--r--tests/auto/gui/text/qfontdatabase/qfontdatabase.pro1
-rw-r--r--tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp23
-rw-r--r--tests/auto/gui/text/qfontmetrics/qfontmetrics.pro1
-rw-r--r--tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp25
-rw-r--r--tests/auto/gui/text/qglyphrun/qglyphrun.pro1
-rw-r--r--tests/auto/gui/text/qrawfont/qrawfont.pro1
-rw-r--r--tests/auto/gui/text/qrawfont/tst_qrawfont.cpp34
-rw-r--r--tests/auto/gui/text/qstatictext/qstatictext.pro2
-rw-r--r--tests/auto/gui/text/qstatictext/tst_qstatictext.cpp35
-rw-r--r--tests/auto/gui/text/qsyntaxhighlighter/qsyntaxhighlighter.pro1
-rw-r--r--tests/auto/gui/text/qsyntaxhighlighter/tst_qsyntaxhighlighter.cpp6
-rw-r--r--tests/auto/gui/text/qtextblock/qtextblock.pro1
-rw-r--r--tests/auto/gui/text/qtextblock/tst_qtextblock.cpp10
-rw-r--r--tests/auto/gui/text/qtextcursor/qtextcursor.pro1
-rw-r--r--tests/auto/gui/text/qtextcursor/tst_qtextcursor.cpp15
-rw-r--r--tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp14
-rw-r--r--tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp6
-rw-r--r--tests/auto/gui/text/qtextdocumentlayout/qtextdocumentlayout.pro1
-rw-r--r--tests/auto/gui/text/qtextdocumentlayout/tst_qtextdocumentlayout.cpp7
-rw-r--r--tests/auto/gui/text/qtextformat/qtextformat.pro1
-rw-r--r--tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp13
-rw-r--r--tests/auto/gui/text/qtextlist/qtextlist.pro1
-rw-r--r--tests/auto/gui/text/qtextlist/tst_qtextlist.cpp10
-rw-r--r--tests/auto/gui/text/qtextobject/qtextobject.pro1
-rw-r--r--tests/auto/gui/text/qtextodfwriter/tst_qtextodfwriter.cpp2
-rw-r--r--tests/auto/gui/text/qtextscriptengine/qtextscriptengine.pro1
-rw-r--r--tests/auto/gui/text/qtextscriptengine/tst_qtextscriptengine.cpp21
-rw-r--r--tests/auto/gui/text/qtexttable/qtexttable.pro1
-rw-r--r--tests/auto/gui/text/qtexttable/tst_qtexttable.cpp10
-rw-r--r--tests/auto/gui/util/qdesktopservices/qdesktopservices.pro1
-rw-r--r--tests/auto/gui/util/qdesktopservices/tst_qdesktopservices.cpp22
-rw-r--r--tests/auto/gui/util/qdoublevalidator/qdoublevalidator.pro1
-rw-r--r--tests/auto/gui/util/qdoublevalidator/tst_qdoublevalidator.cpp57
-rw-r--r--tests/auto/gui/util/qintvalidator/qintvalidator.pro1
-rw-r--r--tests/auto/gui/util/qregexpvalidator/qregexpvalidator.pro1
-rw-r--r--tests/auto/gui/util/qregexpvalidator/tst_qregexpvalidator.cpp27
-rw-r--r--tests/auto/gui/util/qregularexpressionvalidator/qregularexpressionvalidator.pro2
-rw-r--r--tests/auto/network/access/qabstractnetworkcache/qabstractnetworkcache.pro1
-rw-r--r--tests/auto/network/access/qabstractnetworkcache/tst_qabstractnetworkcache.cpp2
-rw-r--r--tests/auto/network/access/qftp/tst_qftp.cpp33
-rw-r--r--tests/auto/network/access/qhttpnetworkconnection/qhttpnetworkconnection.pro1
-rw-r--r--tests/auto/network/access/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp23
-rw-r--r--tests/auto/network/access/qhttpnetworkreply/qhttpnetworkreply.pro1
-rw-r--r--tests/auto/network/access/qhttpnetworkreply/tst_qhttpnetworkreply.cpp22
-rw-r--r--tests/auto/network/access/qnetworkaccessmanager/qnetworkaccessmanager.pro1
-rw-r--r--tests/auto/network/access/qnetworkcachemetadata/qnetworkcachemetadata.pro1
-rw-r--r--tests/auto/network/access/qnetworkcachemetadata/tst_qnetworkcachemetadata.cpp28
-rw-r--r--tests/auto/network/access/qnetworkcookie/qnetworkcookie.pro1
-rw-r--r--tests/auto/network/access/qnetworkcookie/tst_qnetworkcookie.cpp8
-rw-r--r--tests/auto/network/access/qnetworkcookiejar/qnetworkcookiejar.pro2
-rw-r--r--tests/auto/network/access/qnetworkcookiejar/tst_qnetworkcookiejar.cpp7
-rw-r--r--tests/auto/network/access/qnetworkdiskcache/qnetworkdiskcache.pro1
-rw-r--r--tests/auto/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp23
-rw-r--r--tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp72
-rw-r--r--tests/auto/network/access/qnetworkrequest/qnetworkrequest.pro1
-rw-r--r--tests/auto/network/access/qnetworkrequest/tst_qnetworkrequest.cpp8
-rw-r--r--tests/auto/network/access/spdy/spdy.pro2
-rw-r--r--tests/auto/network/bearer/qnetworksession/lackey/main.cpp5
-rw-r--r--tests/auto/network/kernel/qdnslookup/qdnslookup.pro1
-rw-r--r--tests/auto/network/kernel/qdnslookup/tst_qdnslookup.cpp10
-rw-r--r--tests/auto/network/kernel/qdnslookup_appless/qdnslookup_appless.pro1
-rw-r--r--tests/auto/network/kernel/qhostaddress/qhostaddress.pro1
-rw-r--r--tests/auto/network/kernel/qhostaddress/tst_qhostaddress.cpp20
-rw-r--r--tests/auto/network/kernel/qhostinfo/tst_qhostinfo.cpp22
-rw-r--r--tests/auto/network/kernel/qnetworkaddressentry/qnetworkaddressentry.pro1
-rw-r--r--tests/auto/network/kernel/qnetworkinterface/qnetworkinterface.pro1
-rw-r--r--tests/auto/network/kernel/qnetworkinterface/tst_qnetworkinterface.cpp7
-rw-r--r--tests/auto/network/kernel/qnetworkproxyfactory/qnetworkproxyfactory.pro1
-rw-r--r--tests/auto/network/kernel/qnetworkproxyfactory/tst_qnetworkproxyfactory.cpp2
-rw-r--r--tests/auto/network/socket/platformsocketengine/tst_platformsocketengine.cpp26
-rw-r--r--tests/auto/network/socket/qhttpsocketengine/tst_qhttpsocketengine.cpp21
-rw-r--r--tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp22
-rw-r--r--tests/auto/network/socket/qsocks5socketengine/tst_qsocks5socketengine.cpp33
-rw-r--r--tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp16
-rw-r--r--tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp40
-rw-r--r--tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp49
-rw-r--r--tests/auto/network/ssl/qasn1element/qasn1element.pro1
-rw-r--r--tests/auto/network/ssl/qsslcertificate/qsslcertificate.pro1
-rw-r--r--tests/auto/network/ssl/qsslcertificate/tst_qsslcertificate.cpp14
-rw-r--r--tests/auto/network/ssl/qsslcipher/qsslcipher.pro1
-rw-r--r--tests/auto/network/ssl/qsslcipher/tst_qsslcipher.cpp32
-rw-r--r--tests/auto/network/ssl/qsslellipticcurve/qsslellipticcurve.pro1
-rw-r--r--tests/auto/network/ssl/qsslerror/qsslerror.pro1
-rw-r--r--tests/auto/network/ssl/qsslkey/qsslkey.pro1
-rw-r--r--tests/auto/network/ssl/qsslkey/tst_qsslkey.cpp14
-rw-r--r--tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp5
-rw-r--r--tests/auto/network/ssl/qsslsocket_onDemandCertificates_member/qsslsocket_onDemandCertificates_member.pro1
-rw-r--r--tests/auto/network/ssl/qsslsocket_onDemandCertificates_member/tst_qsslsocket_onDemandCertificates_member.cpp12
-rw-r--r--tests/auto/network/ssl/qsslsocket_onDemandCertificates_static/qsslsocket_onDemandCertificates_static.pro1
-rw-r--r--tests/auto/network/ssl/qsslsocket_onDemandCertificates_static/tst_qsslsocket_onDemandCertificates_static.cpp10
-rw-r--r--tests/auto/opengl/qgl/qgl.pro4
-rw-r--r--tests/auto/opengl/qglbuffer/qglbuffer.pro2
-rw-r--r--tests/auto/opengl/qglfunctions/qglfunctions.pro4
-rw-r--r--tests/auto/opengl/qglthreads/qglthreads.pro3
-rw-r--r--tests/auto/opengl/qglthreads/tst_qglthreads.cpp9
-rw-r--r--tests/auto/other/atwrapper/atWrapper.cpp33
-rw-r--r--tests/auto/other/compiler/compiler.pro1
-rw-r--r--tests/auto/other/gestures/gestures.pro1
-rw-r--r--tests/auto/other/gestures/tst_gestures.cpp27
-rw-r--r--tests/auto/other/lancelot/lancelot.pro2
-rw-r--r--tests/auto/other/lancelot/paintcommands.cpp19
-rw-r--r--tests/auto/other/languagechange/languagechange.pro2
-rw-r--r--tests/auto/other/languagechange/tst_languagechange.cpp2
-rw-r--r--tests/auto/other/macgui/macgui.pro1
-rw-r--r--tests/auto/other/macnativeevents/qnativeevents.cpp24
-rw-r--r--tests/auto/other/macplist/app/app.pro1
-rw-r--r--tests/auto/other/macplist/test/test.pro1
-rw-r--r--tests/auto/other/modeltest/dynamictreemodel.cpp3
-rw-r--r--tests/auto/other/modeltest/modeltest.pro4
-rw-r--r--tests/auto/other/modeltest/tst_modeltest.cpp28
-rw-r--r--tests/auto/other/networkselftest/networkselftest.pro2
-rw-r--r--tests/auto/other/networkselftest/tst_networkselftest.cpp4
-rw-r--r--tests/auto/other/qaccessibility/qaccessibility.pro1
-rw-r--r--tests/auto/other/qaccessibility/tst_qaccessibility.cpp37
-rw-r--r--tests/auto/other/qaccessibilitymac/qaccessibilitymac.pro1
-rw-r--r--tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac_helpers.mm2
-rw-r--r--tests/auto/other/qcomplextext/qcomplextext.pro2
-rw-r--r--tests/auto/other/qcomplextext/tst_qcomplextext.cpp29
-rw-r--r--tests/auto/other/qfocusevent/qfocusevent.pro1
-rw-r--r--tests/auto/other/qfocusevent/tst_qfocusevent.cpp21
-rw-r--r--tests/auto/other/qnetworkaccessmanager_and_qprogressdialog/qnetworkaccessmanager_and_qprogressdialog.pro2
-rw-r--r--tests/auto/other/qobjectperformance/qobjectperformance.pro1
-rw-r--r--tests/auto/other/qobjectrace/qobjectrace.pro3
-rw-r--r--tests/auto/other/qprocess_and_guieventloop/test.pro1
-rw-r--r--tests/auto/other/qsharedpointer_and_qwidget/qsharedpointer_and_qwidget.pro2
-rw-r--r--tests/auto/other/qtokenautomaton/qtokenautomaton.pro2
-rw-r--r--tests/auto/other/qvariant_common/tst_qvariant_common.h2
-rw-r--r--tests/auto/other/toolsupport/toolsupport.pro2
-rw-r--r--tests/auto/other/toolsupport/tst_toolsupport.cpp10
-rw-r--r--tests/auto/other/windowsmobile/test/test.pro2
-rw-r--r--tests/auto/printsupport/dialogs/qabstractprintdialog/qabstractprintdialog.pro1
-rw-r--r--tests/auto/printsupport/kernel/qprintdevice/qprintdevice.pro2
-rw-r--r--tests/auto/printsupport/kernel/qprinter/qprinter.pro1
-rw-r--r--tests/auto/printsupport/kernel/qprinterinfo/qprinterinfo.pro2
-rw-r--r--tests/auto/shared/resources/testfont.ttfbin63212 -> 78432 bytes
-rw-r--r--tests/auto/sql/kernel/qsql/qsql.pro1
-rw-r--r--tests/auto/sql/kernel/qsqldatabase/tst_databases.h14
-rw-r--r--tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp2
-rw-r--r--tests/auto/sql/kernel/qsqldriver/qsqldriver.pro1
-rw-r--r--tests/auto/sql/kernel/qsqldriver/tst_qsqldriver.cpp2
-rw-r--r--tests/auto/sql/kernel/qsqlerror/qsqlerror.pro1
-rw-r--r--tests/auto/sql/kernel/qsqlfield/qsqlfield.pro1
-rw-r--r--tests/auto/sql/kernel/qsqlfield/tst_qsqlfield.cpp16
-rw-r--r--tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp20
-rw-r--r--tests/auto/sql/kernel/qsqlrecord/qsqlrecord.pro1
-rw-r--r--tests/auto/sql/kernel/qsqlrecord/tst_qsqlrecord.cpp4
-rw-r--r--tests/auto/sql/models/qsqlquerymodel/qsqlquerymodel.pro1
-rw-r--r--tests/auto/sql/models/qsqlrelationaltablemodel/qsqlrelationaltablemodel.pro1
-rw-r--r--tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp16
-rw-r--r--tests/auto/sql/models/qsqltablemodel/qsqltablemodel.pro1
-rw-r--r--tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp2
-rw-r--r--tests/auto/testlib/qsignalspy/qsignalspy.pro1
-rw-r--r--tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp11
-rw-r--r--tests/auto/testlib/selftests/expected_cmptest.lightxml60
-rw-r--r--tests/auto/testlib/selftests/expected_cmptest.txt58
-rw-r--r--tests/auto/testlib/selftests/expected_cmptest.xml60
-rw-r--r--tests/auto/testlib/selftests/expected_cmptest.xunitxml7
-rwxr-xr-xtests/auto/testlib/selftests/generate_expected_output.py2
-rw-r--r--tests/auto/testlib/selftests/selftests.pro1
-rw-r--r--tests/auto/testlib/selftests/test/test.pro1
-rw-r--r--tests/auto/testlib/selftests/tst_selftests.cpp4
-rw-r--r--tests/auto/tools/moc/moc.pro2
-rw-r--r--tests/auto/tools/moc/tst_moc.cpp7
-rw-r--r--tests/auto/tools/qdbuscpp2xml/qdbuscpp2xml.pro1
-rw-r--r--tests/auto/tools/qdbusxml2cpp/qdbusxml2cpp.pro1
-rw-r--r--tests/auto/tools/qmake/qmake.pro1
-rw-r--r--tests/auto/tools/qmake/testcompiler.cpp2
-rw-r--r--tests/auto/tools/qmake/tst_qmake.cpp22
-rw-r--r--tests/auto/tools/qmakelib/qmakelib.pro1
-rw-r--r--tests/auto/tools/rcc/rcc.pro1
-rw-r--r--tests/auto/widgets/dialogs/qcolordialog/qcolordialog.pro1
-rw-r--r--tests/auto/widgets/dialogs/qcolordialog/tst_qcolordialog.cpp22
-rw-r--r--tests/auto/widgets/dialogs/qdialog/qdialog.pro1
-rw-r--r--tests/auto/widgets/dialogs/qerrormessage/qerrormessage.pro1
-rw-r--r--tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp20
-rw-r--r--tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp14
-rw-r--r--tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp13
-rw-r--r--tests/auto/widgets/dialogs/qfontdialog/qfontdialog.pro5
-rw-r--r--tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp8
-rw-r--r--tests/auto/widgets/dialogs/qmessagebox/qmessagebox.pro1
-rw-r--r--tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp2
-rw-r--r--tests/auto/widgets/dialogs/qprogressdialog/qprogressdialog.pro1
-rw-r--r--tests/auto/widgets/dialogs/qsidebar/qsidebar.pro2
-rw-r--r--tests/auto/widgets/dialogs/qsidebar/tst_qsidebar.cpp24
-rw-r--r--tests/auto/widgets/dialogs/qwizard/qwizard.pro1
-rw-r--r--tests/auto/widgets/dialogs/qwizard/tst_qwizard.cpp29
-rw-r--r--tests/auto/widgets/effects/qgraphicseffect/qgraphicseffect.pro1
-rw-r--r--tests/auto/widgets/effects/qgraphicseffect/tst_qgraphicseffect.cpp4
-rw-r--r--tests/auto/widgets/effects/qpixmapfilter/qpixmapfilter.pro1
-rw-r--r--tests/auto/widgets/effects/qpixmapfilter/tst_qpixmapfilter.cpp25
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/qgraphicsanchorlayout1.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp8
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp31
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsitem/qgraphicsitem.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp239
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsitemanimation/qgraphicsitemanimation.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicslayout/qgraphicslayout.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicslayoutitem/qgraphicslayoutitem.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicslayoutitem/tst_qgraphicslayoutitem.cpp30
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp70
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsobject/qgraphicsobject.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsobject/tst_qgraphicsobject.cpp30
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicspixmapitem/qgraphicspixmapitem.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicspixmapitem/tst_qgraphicspixmapitem.cpp28
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicspolygonitem/qgraphicspolygonitem.pro2
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicspolygonitem/tst_qgraphicspolygonitem.cpp28
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsproxywidget/qgraphicsproxywidget.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp55
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp256
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicssceneindex/qgraphicssceneindex.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicssceneindex/tst_qgraphicssceneindex.cpp2
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicstransform/qgraphicstransform.pro2
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicstransform/tst_qgraphicstransform.cpp29
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp25
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp44
-rw-r--r--tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp17
-rw-r--r--tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp24
-rw-r--r--tests/auto/widgets/itemviews/qdatawidgetmapper/qdatawidgetmapper.pro1
-rw-r--r--tests/auto/widgets/itemviews/qdatawidgetmapper/tst_qdatawidgetmapper.cpp4
-rw-r--r--tests/auto/widgets/itemviews/qdirmodel/tst_qdirmodel.cpp10
-rw-r--r--tests/auto/widgets/itemviews/qfileiconprovider/qfileiconprovider.pro1
-rw-r--r--tests/auto/widgets/itemviews/qfileiconprovider/tst_qfileiconprovider.cpp29
-rw-r--r--tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp36
-rw-r--r--tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp32
-rw-r--r--tests/auto/widgets/itemviews/qitemeditorfactory/qitemeditorfactory.pro1
-rw-r--r--tests/auto/widgets/itemviews/qitemview/qitemview.pro1
-rw-r--r--tests/auto/widgets/itemviews/qitemview/tst_qitemview.cpp11
-rw-r--r--tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp166
-rw-r--r--tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp50
-rw-r--r--tests/auto/widgets/itemviews/qtableview/qtableview.pro2
-rw-r--r--tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp89
-rw-r--r--tests/auto/widgets/itemviews/qtablewidget/qtablewidget.pro1
-rw-r--r--tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp16
-rw-r--r--tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp140
-rw-r--r--tests/auto/widgets/itemviews/qtreewidget/tst_qtreewidget.cpp54
-rw-r--r--tests/auto/widgets/itemviews/qtreewidgetitemiterator/qtreewidgetitemiterator.pro1
-rw-r--r--tests/auto/widgets/itemviews/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp67
-rw-r--r--tests/auto/widgets/kernel/qaction/tst_qaction.cpp4
-rw-r--r--tests/auto/widgets/kernel/qactiongroup/qactiongroup.pro1
-rw-r--r--tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp33
-rw-r--r--tests/auto/widgets/kernel/qboxlayout/qboxlayout.pro1
-rw-r--r--tests/auto/widgets/kernel/qdesktopwidget/qdesktopwidget.pro1
-rw-r--r--tests/auto/widgets/kernel/qdesktopwidget/tst_qdesktopwidget.cpp20
-rw-r--r--tests/auto/widgets/kernel/qformlayout/qformlayout.pro1
-rw-r--r--tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp6
-rw-r--r--tests/auto/widgets/kernel/qgridlayout/qgridlayout.pro1
-rw-r--r--tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp10
-rw-r--r--tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp2
-rw-r--r--tests/auto/widgets/kernel/qshortcut/tst_qshortcut.cpp7
-rw-r--r--tests/auto/widgets/kernel/qstackedlayout/qstackedlayout.pro1
-rw-r--r--tests/auto/widgets/kernel/qstackedlayout/tst_qstackedlayout.cpp20
-rw-r--r--tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp8
-rw-r--r--tests/auto/widgets/kernel/qwidget/tst_qwidget_mac_helpers.mm2
-rw-r--r--tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro1
-rw-r--r--tests/auto/widgets/kernel/qwidgetaction/qwidgetaction.pro1
-rw-r--r--tests/auto/widgets/kernel/qwidgetsvariant/qwidgetsvariant.pro1
-rw-r--r--tests/auto/widgets/kernel/qwindowcontainer/qwindowcontainer.pro1
-rw-r--r--tests/auto/widgets/styles/qstyle/qstyle.pro2
-rw-r--r--tests/auto/widgets/styles/qstyle/tst_qstyle.cpp18
-rw-r--r--tests/auto/widgets/styles/qstyleoption/qstyleoption.pro1
-rw-r--r--tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp237
-rw-r--r--tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp14
-rw-r--r--tests/auto/widgets/util/qscroller/qscroller.pro1
-rw-r--r--tests/auto/widgets/util/qsystemtrayicon/qsystemtrayicon.pro1
-rw-r--r--tests/auto/widgets/widgets/qabstractbutton/tst_qabstractbutton.cpp22
-rw-r--r--tests/auto/widgets/widgets/qabstractscrollarea/qabstractscrollarea.pro1
-rw-r--r--tests/auto/widgets/widgets/qabstractslider/qabstractslider.pro1
-rw-r--r--tests/auto/widgets/widgets/qabstractspinbox/qabstractspinbox.pro1
-rw-r--r--tests/auto/widgets/widgets/qbuttongroup/tst_qbuttongroup.cpp28
-rw-r--r--tests/auto/widgets/widgets/qcalendarwidget/tst_qcalendarwidget.cpp34
-rw-r--r--tests/auto/widgets/widgets/qcheckbox/tst_qcheckbox.cpp15
-rw-r--r--tests/auto/widgets/widgets/qcombobox/qcombobox.pro1
-rw-r--r--tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp60
-rw-r--r--tests/auto/widgets/widgets/qcommandlinkbutton/tst_qcommandlinkbutton.cpp20
-rw-r--r--tests/auto/widgets/widgets/qdatetimeedit/qdatetimeedit.pro1
-rw-r--r--tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp18
-rw-r--r--tests/auto/widgets/widgets/qdial/qdial.pro1
-rw-r--r--tests/auto/widgets/widgets/qdialogbuttonbox/qdialogbuttonbox.pro1
-rw-r--r--tests/auto/widgets/widgets/qdockwidget/qdockwidget.pro1
-rw-r--r--tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp3
-rw-r--r--tests/auto/widgets/widgets/qdoublespinbox/tst_qdoublespinbox.cpp13
-rw-r--r--tests/auto/widgets/widgets/qfocusframe/qfocusframe.pro1
-rw-r--r--tests/auto/widgets/widgets/qfontcombobox/qfontcombobox.pro1
-rw-r--r--tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp30
-rw-r--r--tests/auto/widgets/widgets/qframe/tst_qframe.cpp25
-rw-r--r--tests/auto/widgets/widgets/qgroupbox/tst_qgroupbox.cpp111
-rw-r--r--tests/auto/widgets/widgets/qkeysequenceedit/qkeysequenceedit.pro1
-rw-r--r--tests/auto/widgets/widgets/qlabel/qlabel.pro1
-rw-r--r--tests/auto/widgets/widgets/qlcdnumber/qlcdnumber.pro1
-rw-r--r--tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp96
-rw-r--r--tests/auto/widgets/widgets/qmainwindow/qmainwindow.pro1
-rw-r--r--tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp2
-rw-r--r--tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp21
-rw-r--r--tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp31
-rw-r--r--tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp6
-rw-r--r--tests/auto/widgets/widgets/qmenu/tst_qmenu_mac.mm2
-rw-r--r--tests/auto/widgets/widgets/qopenglwidget/BLACKLIST12
-rw-r--r--tests/auto/widgets/widgets/qopenglwidget/qopenglwidget.pro3
-rw-r--r--tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp25
-rw-r--r--tests/auto/widgets/widgets/qscrollarea/qscrollarea.pro1
-rw-r--r--tests/auto/widgets/widgets/qscrollbar/qscrollbar.pro1
-rw-r--r--tests/auto/widgets/widgets/qsizegrip/qsizegrip.pro1
-rw-r--r--tests/auto/widgets/widgets/qslider/qslider.pro1
-rw-r--r--tests/auto/widgets/widgets/qsplitter/qsplitter.pro1
-rw-r--r--tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp6
-rw-r--r--tests/auto/widgets/widgets/qstackedwidget/tst_qstackedwidget.cpp2
-rw-r--r--tests/auto/widgets/widgets/qstatusbar/tst_qstatusbar.cpp26
-rw-r--r--tests/auto/widgets/widgets/qtabbar/qtabbar.pro1
-rw-r--r--tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp2
-rw-r--r--tests/auto/widgets/widgets/qtabwidget/tst_qtabwidget.cpp10
-rw-r--r--tests/auto/widgets/widgets/qtextbrowser/tst_qtextbrowser.cpp14
-rw-r--r--tests/auto/widgets/widgets/qtoolbox/qtoolbox.pro1
-rw-r--r--tests/auto/widgets/widgets/qtoolbox/tst_qtoolbox.cpp26
-rw-r--r--tests/auto/xml/sax/qxml/qxml.pro1
-rw-r--r--tests/baselineserver/src/baselineserver.cpp2
-rw-r--r--tests/baselineserver/src/report.cpp6
-rw-r--r--tests/benchmarks/corelib/codecs/qtextcodec/main.cpp6
-rw-r--r--tests/benchmarks/corelib/codecs/qtextcodec/qtextcodec.pro1
-rw-r--r--tests/benchmarks/corelib/io/qdir/10000/10000.pro1
-rw-r--r--tests/benchmarks/corelib/io/qdir/tree/tree.pro1
-rw-r--r--tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro1
-rw-r--r--tests/benchmarks/corelib/io/qfile/main.cpp8
-rw-r--r--tests/benchmarks/corelib/io/qfile/qfile.pro1
-rw-r--r--tests/benchmarks/corelib/io/qfileinfo/qfileinfo.pro1
-rw-r--r--tests/benchmarks/corelib/io/qiodevice/qiodevice.pro2
-rw-r--r--tests/benchmarks/corelib/io/qprocess/test/test.pro1
-rw-r--r--tests/benchmarks/corelib/io/qprocess/testProcessLoopback/testProcessLoopback.pro1
-rw-r--r--tests/benchmarks/corelib/io/qtemporaryfile/qtemporaryfile.pro1
-rw-r--r--tests/benchmarks/corelib/io/qtextstream/qtextstream.pro1
-rw-r--r--tests/benchmarks/corelib/io/qurl/qurl.pro1
-rw-r--r--tests/benchmarks/corelib/json/json.pro1
-rw-r--r--tests/benchmarks/corelib/kernel/events/events.pro1
-rw-r--r--tests/benchmarks/corelib/kernel/qcoreapplication/qcoreapplication.pro1
-rw-r--r--tests/benchmarks/corelib/kernel/qmetaobject/qmetaobject.pro1
-rw-r--r--tests/benchmarks/corelib/kernel/qmetatype/qmetatype.pro1
-rw-r--r--tests/benchmarks/corelib/kernel/qobject/qobject.pro1
-rw-r--r--tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/qtimer_vs_qmetaobject.pro1
-rw-r--r--tests/benchmarks/corelib/kernel/qvariant/qvariant.pro1
-rw-r--r--tests/benchmarks/corelib/mimetypes/qmimedatabase/qmimedatabase.pro1
-rw-r--r--tests/benchmarks/corelib/plugin/quuid/quuid.pro1
-rw-r--r--tests/benchmarks/corelib/thread/qmutex/qmutex.pro1
-rw-r--r--tests/benchmarks/corelib/thread/qthreadstorage/qthreadstorage.pro1
-rw-r--r--tests/benchmarks/corelib/thread/qwaitcondition/qwaitcondition.pro1
-rw-r--r--tests/benchmarks/corelib/tools/containers-associative/containers-associative.pro1
-rw-r--r--tests/benchmarks/corelib/tools/containers-sequential/containers-sequential.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qalgorithms/qalgorithms.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qbytearray/qbytearray.pro2
-rw-r--r--tests/benchmarks/corelib/tools/qchar/qchar.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qcontiguouscache/qcontiguouscache.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qdatetime/qdatetime.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qhash/qhash.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qlist/qlist.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qlocale/qlocale.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qmap/qmap.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qrect/qrect.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qregexp/qregexp.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qstring/qstring.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qstringbuilder/qstringbuilder.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qstringlist/qstringlist.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qvector/qvector.pro1
-rw-r--r--tests/benchmarks/dbus/qdbusperformance/server/server.pro1
-rw-r--r--tests/benchmarks/dbus/qdbusperformance/test/test.pro1
-rw-r--r--tests/benchmarks/dbus/qdbustype/qdbustype.pro1
-rw-r--r--tests/benchmarks/gui/animation/qanimation/qanimation.pro1
-rw-r--r--tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.pro1
-rw-r--r--tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.cpp2
-rw-r--r--tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.cpp3
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsanchorlayout/qgraphicsanchorlayout.pro1
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsitem/qgraphicsitem.pro1
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp14
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicslayout/qgraphicslayout.pro1
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro1
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsscene/qgraphicsscene.pro1
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp8
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/chipTest/chip.pro1
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/moveItems/moveItems.pro1
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/scrolltest/scrolltest.pro1
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsview/chiptester/chip.cpp2
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsview/qgraphicsview.pro1
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsview/tst_qgraphicsview.cpp11
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicswidget/qgraphicswidget.pro1
-rw-r--r--tests/benchmarks/gui/image/blendbench/blendbench.pro1
-rw-r--r--tests/benchmarks/gui/image/qimageconversion/qimageconversion.pro1
-rw-r--r--tests/benchmarks/gui/image/qimagereader/qimagereader.pro1
-rw-r--r--tests/benchmarks/gui/image/qpixmap/qpixmap.pro1
-rw-r--r--tests/benchmarks/gui/image/qpixmapcache/qpixmapcache.pro1
-rw-r--r--tests/benchmarks/gui/itemviews/qheaderview/qheaderview.pro1
-rw-r--r--tests/benchmarks/gui/itemviews/qheaderview/qheaderviewbench.cpp2
-rw-r--r--tests/benchmarks/gui/itemviews/qtableview/qtableview.pro1
-rw-r--r--tests/benchmarks/gui/kernel/qapplication/qapplication.pro1
-rw-r--r--tests/benchmarks/gui/kernel/qguimetatype/qguimetatype.pro1
-rw-r--r--tests/benchmarks/gui/kernel/qguivariant/qguivariant.pro1
-rw-r--r--tests/benchmarks/gui/kernel/qwidget/qwidget.pro1
-rw-r--r--tests/benchmarks/gui/kernel/qwidget/tst_qwidget.cpp2
-rw-r--r--tests/benchmarks/gui/math3d/qmatrix4x4/qmatrix4x4.pro1
-rw-r--r--tests/benchmarks/gui/math3d/qquaternion/qquaternion.pro1
-rw-r--r--tests/benchmarks/gui/painting/qpainter/qpainter.pro1
-rw-r--r--tests/benchmarks/gui/painting/qregion/qregion.pro1
-rw-r--r--tests/benchmarks/gui/painting/qtbench/qtbench.pro2
-rw-r--r--tests/benchmarks/gui/painting/qtbench/tst_qtbench.cpp2
-rw-r--r--tests/benchmarks/gui/painting/qtransform/qtransform.pro1
-rw-r--r--tests/benchmarks/gui/styles/qstylesheetstyle/main.cpp2
-rw-r--r--tests/benchmarks/gui/styles/qstylesheetstyle/qstylesheetstyle.pro1
-rw-r--r--tests/benchmarks/gui/text/qfontmetrics/qfontmetrics.pro1
-rw-r--r--tests/benchmarks/gui/text/qtext/qtext.pro1
-rw-r--r--tests/benchmarks/network/access/qfile_vs_qnetworkaccessmanager/qfile_vs_qnetworkaccessmanager.pro1
-rw-r--r--tests/benchmarks/network/access/qnetworkdiskcache/qnetworkdiskcache.pro1
-rw-r--r--tests/benchmarks/network/access/qnetworkreply/qnetworkreply.pro1
-rw-r--r--tests/benchmarks/network/kernel/qhostinfo/qhostinfo.pro1
-rw-r--r--tests/benchmarks/network/socket/qtcpserver/qtcpserver.pro1
-rw-r--r--tests/benchmarks/network/ssl/qsslsocket/qsslsocket.pro1
-rw-r--r--tests/benchmarks/plugins/imageformats/jpeg/jpeg.pro1
-rw-r--r--tests/benchmarks/sql/kernel/qsqlquery/main.cpp2
-rw-r--r--tests/benchmarks/sql/kernel/qsqlquery/qsqlquery.pro1
-rw-r--r--tests/manual/bearerex/bearerex.cpp24
-rw-r--r--tests/manual/bearerex/bearerex.pro1
-rw-r--r--tests/manual/cocoa/menus/menus.pro1
-rw-r--r--tests/manual/cocoa/nativewidgets/nativewigets.pro1
-rw-r--r--tests/manual/cocoa/qmaccocoaviewcontainer/TestMouseMovedNSView.h2
-rw-r--r--tests/manual/cocoa/qmaccocoaviewcontainer/qmaccocoaviewcontainer.pro2
-rw-r--r--tests/manual/cocoa/qt_on_cocoa/main.mm2
-rw-r--r--tests/manual/cocoa/qt_on_cocoa/qt_on_cocoa.pro2
-rw-r--r--tests/manual/cocoa/wheelevent/wheelevent.pro1
-rw-r--r--tests/manual/diaglib/README.txt5
-rw-r--r--tests/manual/diaglib/debugproxystyle.cpp161
-rw-r--r--tests/manual/diaglib/debugproxystyle.h (renamed from src/plugins/styles/bb10style/qbb10brightstyle.h)47
-rw-r--r--tests/manual/diaglib/diaglib.pri4
-rw-r--r--tests/manual/gestures/graphicsview/graphicsview.pro1
-rw-r--r--tests/manual/gestures/graphicsview/main.cpp2
-rw-r--r--tests/manual/gestures/scrollarea/scrollarea.pro1
-rw-r--r--tests/manual/highdpi/dragwidget.cpp2
-rw-r--r--tests/manual/highdpi/main.cpp6
-rw-r--r--tests/manual/inputmethodhints/inputmethodhints.pro1
-rw-r--r--tests/manual/keypadnavigation/keypadnavigation.pro1
-rw-r--r--tests/manual/lance/lance.pro1
-rw-r--r--tests/manual/lance/main.cpp2
-rw-r--r--tests/manual/network_remote_stresstest/network_remote_stresstest.pro1
-rw-r--r--tests/manual/network_remote_stresstest/tst_network_remote_stresstest.cpp19
-rw-r--r--tests/manual/network_stresstest/minihttpserver.cpp2
-rw-r--r--tests/manual/qcursor/allcursors/allcursors.pro1
-rw-r--r--tests/manual/qcursor/grab_override/grab_override.pro1
-rw-r--r--tests/manual/qdesktopwidget/qdesktopwidget.pro1
-rw-r--r--tests/manual/qgraphicsitemgroup/qgraphicsitemgroup.pro1
-rw-r--r--tests/manual/qgraphicslayout/flicker/flicker.pro1
-rw-r--r--tests/manual/qhttpnetworkconnection/qhttpnetworkconnection.pro1
-rw-r--r--tests/manual/qimagereader/qimagereader.pro1
-rw-r--r--tests/manual/qlocale/qlocale.pro1
-rw-r--r--tests/manual/qnetworkaccessmanager/qget/qget.cpp2
-rw-r--r--tests/manual/qnetworkaccessmanager/qget/qget.pro1
-rw-r--r--tests/manual/qnetworkaccessmanager/qget/transferitem.cpp4
-rw-r--r--tests/manual/qnetworkconfigurationmanager/qnetworkconfigurationmanager.pro1
-rw-r--r--tests/manual/qnetworkreply/main.cpp2
-rw-r--r--tests/manual/qnetworkreply/qnetworkreply.pro1
-rw-r--r--tests/manual/qscreen/propertyfield.cpp2
-rw-r--r--tests/manual/qssloptions/qssloptions.pro1
-rw-r--r--tests/manual/qt_poll/qt_poll.pro7
-rw-r--r--tests/manual/qt_poll/tst_qt_poll.cpp155
-rw-r--r--tests/manual/qtabletevent/device_information/device_information.pro1
-rw-r--r--tests/manual/qtabletevent/device_information/tabletwidget.cpp4
-rw-r--r--tests/manual/qtabletevent/event_compression/event_compression.pro1
-rw-r--r--tests/manual/qtabletevent/regular_widgets/regular_widgets.pro1
-rw-r--r--tests/manual/qtbug-8933/qtbug-8933.pro1
-rw-r--r--tests/manual/qtouchevent/qtouchevent.pro1
-rw-r--r--tests/manual/qwidget_zorder/qwidget_zorder.pro1
-rw-r--r--tests/manual/repaint/mainwindow/mainwindow.pro1
-rw-r--r--tests/manual/repaint/scrollarea/scrollarea.pro1
-rw-r--r--tests/manual/repaint/splitter/splitter.pro1
-rw-r--r--tests/manual/repaint/tableview/tableview.pro1
-rw-r--r--tests/manual/repaint/task141091/task141091.pro1
-rw-r--r--tests/manual/repaint/toplevel/toplevel.pro1
-rw-r--r--tests/manual/repaint/widget/widget.pro1
-rw-r--r--tests/manual/socketengine/socketengine.pro1
-rw-r--r--tests/manual/textrendering/glyphshaping/glyphshaping.pro1
-rw-r--r--tests/manual/textrendering/textperformance/textperformance.pro1
-rw-r--r--tests/manual/unc/main.cpp2
-rw-r--r--tests/manual/widgetgrab/widgetgrab.pro1
-rw-r--r--tests/manual/widgets/itemviews/delegate/delegate.pro1
-rw-r--r--tests/manual/widgets/itemviews/qheaderview/qheaderview.pro1
-rw-r--r--tests/manual/widgets/itemviews/qtreeview/qtreeview.pro1
-rw-r--r--tests/manual/widgets/itemviews/qtreewidget/qtreewidget.pro1
-rw-r--r--tests/manual/widgets/qgraphicsview/rubberband/rubberband.pro1
-rw-r--r--tests/manual/windowflags/windowflags.pro1
-rw-r--r--tests/manual/windowgeometry/windowgeometry.pro1
-rw-r--r--tests/manual/windowmodality/windowmodality.pro1
-rw-r--r--tools/configure/Makefile.mingw2
-rw-r--r--tools/configure/Makefile.win322
-rw-r--r--tools/configure/configureapp.cpp171
-rw-r--r--tools/configure/configureapp.h1
-rw-r--r--tools/configure/environment.cpp18
1821 files changed, 21921 insertions, 57010 deletions
diff --git a/.qmake.conf b/.qmake.conf
index 732b5da262..7121ac2008 100644
--- a/.qmake.conf
+++ b/.qmake.conf
@@ -5,4 +5,4 @@ CONFIG += warning_clean
QT_SOURCE_TREE = $$PWD
QT_BUILD_TREE = $$shadowed($$PWD)
-MODULE_VERSION = 5.6.0
+MODULE_VERSION = 5.7.0
diff --git a/config.tests/common/avx/avx.pro b/config.tests/common/avx/avx.pro
index 8d1b9702bc..bf84089883 100644
--- a/config.tests/common/avx/avx.pro
+++ b/config.tests/common/avx/avx.pro
@@ -1,5 +1,5 @@
SOURCES = avx.cpp
CONFIG -= qt dylib release debug_and_release
CONFIG += debug console
-isEmpty(QMAKE_CFLAGS_AVX):error("This compiler does not support AVX")
+!defined(QMAKE_CFLAGS_AVX, "var"):error("This compiler does not support AVX")
else:QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_AVX
diff --git a/config.tests/common/avx2/avx2.pro b/config.tests/common/avx2/avx2.pro
index 927f64efc8..7ccf66ca28 100644
--- a/config.tests/common/avx2/avx2.pro
+++ b/config.tests/common/avx2/avx2.pro
@@ -1,5 +1,5 @@
SOURCES = avx2.cpp
CONFIG -= qt dylib release debug_and_release
CONFIG += debug console
-isEmpty(QMAKE_CFLAGS_AVX2):error("This compiler does not support AVX2")
+!defined(QMAKE_CFLAGS_AVX2, "var"):error("This compiler does not support AVX2")
else:QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_AVX2
diff --git a/config.tests/common/avx512/avx512.cpp b/config.tests/common/avx512/avx512.cpp
new file mode 100644
index 0000000000..d0c55a09b5
--- /dev/null
+++ b/config.tests/common/avx512/avx512.cpp
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Intel Corporation.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the configuration of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <immintrin.h>
+
+#ifndef AVX512WANT
+# error ".pro file must define AVX512WANT macro to the AVX-512 feature to be tested"
+#endif
+
+// The following checks if __AVXx__ is defined, where x is the value in
+// AVX512WANT
+#define HAS2(x) __AVX512 ## x ## __
+#define HAS(x) HAS2(x)
+#if !HAS(AVX512WANT)
+# error "Feature not supported"
+#endif
+
+int main(int, char**argv)
+{
+ /* AVX512 Foundation */
+ __m512i i;
+ __m512d d;
+ __m512 f;
+ __mmask16 m = ~1;
+ i = _mm512_maskz_loadu_epi32(0, argv);
+ d = _mm512_loadu_pd((double *)argv + 64);
+ f = _mm512_loadu_ps((float *)argv + 128);
+
+#ifdef __AVX512ER__
+ /* AVX512 Exponential and Reciprocal */
+ f = _mm512_exp2a23_round_ps(f, 8);
+#endif
+#ifdef __AVX512CD__
+ /* AVX512 Conflict Detection */
+ i = _mm512_maskz_conflict_epi32(m, i);
+#endif
+#ifdef __AVX512PF__
+ /* AVX512 Prefetch */
+ _mm512_mask_prefetch_i64scatter_pd(argv, 0xf, i, 2, 2);
+#endif
+#ifdef __AVX512DQ__
+ /* AVX512 Doubleword and Quadword support */
+ m = _mm512_movepi32_mask(i);
+#endif
+#ifdef __AVX512BW__
+ /* AVX512 Byte and Word support */
+ i = _mm512_mask_loadu_epi8(i, m, argv - 8);
+#endif
+#ifdef __AVX512VL__
+ /* AVX512 Vector Length */
+ __m256i i2 = _mm256_maskz_loadu_epi32(0, argv);
+ _mm256_mask_storeu_epi32(argv + 1, m, i2);
+#endif
+#ifdef __AVX512IFMA__
+ /* AVX512 Integer Fused Multiply-Add */
+ i = _mm512_madd52lo_epu64(i, i, i);
+#endif
+#ifdef __AVX512VBMI__
+ /* AVX512 Vector Byte Manipulation Instructions */
+ i = _mm512_permutexvar_epi8(i, i);
+#endif
+
+ _mm512_mask_storeu_epi64(argv, m, i);
+ _mm512_mask_storeu_ps(argv + 64, m, f);
+ _mm512_mask_storeu_pd(argv + 128, m, d);
+ return 0;
+}
diff --git a/config.tests/common/avx512/avx512.pro b/config.tests/common/avx512/avx512.pro
new file mode 100644
index 0000000000..96dddb14fd
--- /dev/null
+++ b/config.tests/common/avx512/avx512.pro
@@ -0,0 +1,12 @@
+SOURCES = avx512.cpp
+CONFIG -= qt dylib release debug_and_release
+CONFIG += debug console
+
+!defined(AVX512, "var"): error("You must set the AVX512 variable!")
+
+varname = QMAKE_CFLAGS_AVX512$$AVX512
+value = $$eval($$varname)
+!defined($$varname, "var"): error("This compiler does not support AVX512")
+
+QMAKE_CXXFLAGS += $$value
+DEFINES += AVX512WANT=$$AVX512
diff --git a/config.tests/common/sse2/sse2.pro b/config.tests/common/sse2/sse2.pro
index b4031f13fa..0567eba19d 100644
--- a/config.tests/common/sse2/sse2.pro
+++ b/config.tests/common/sse2/sse2.pro
@@ -1,5 +1,5 @@
SOURCES = sse2.cpp
CONFIG -= qt dylib release debug_and_release
CONFIG += debug console
-isEmpty(QMAKE_CFLAGS_SSE2):error("This compiler does not support SSE2")
+!defined(QMAKE_CFLAGS_SSE2, var): error("This compiler does not support SSE2")
else:QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_SSE2
diff --git a/config.tests/common/sse3/sse3.pro b/config.tests/common/sse3/sse3.pro
index f704c40c75..e2e09bac91 100644
--- a/config.tests/common/sse3/sse3.pro
+++ b/config.tests/common/sse3/sse3.pro
@@ -1,5 +1,5 @@
SOURCES = sse3.cpp
CONFIG -= qt dylib release debug_and_release
CONFIG += debug console
-isEmpty(QMAKE_CFLAGS_SSE3):error("This compiler does not support SSE3")
+!defined(QMAKE_CFLAGS_SSE3, "var"):error("This compiler does not support SSE3")
else:QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_SSE3
diff --git a/config.tests/common/sse4_1/sse4_1.pro b/config.tests/common/sse4_1/sse4_1.pro
index 5cc04e7c5c..273c705efc 100644
--- a/config.tests/common/sse4_1/sse4_1.pro
+++ b/config.tests/common/sse4_1/sse4_1.pro
@@ -1,5 +1,5 @@
SOURCES = sse4_1.cpp
CONFIG -= qt dylib release debug_and_release
CONFIG += debug console
-isEmpty(QMAKE_CFLAGS_SSE4_1):error("This compiler does not support SSE4.1")
+!defined(QMAKE_CFLAGS_SSE4_1, "var"):error("This compiler does not support SSE4.1")
else:QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_SSE4_1
diff --git a/config.tests/common/sse4_2/sse4_2.pro b/config.tests/common/sse4_2/sse4_2.pro
index 6a04b1f9a5..3816fdeae9 100644
--- a/config.tests/common/sse4_2/sse4_2.pro
+++ b/config.tests/common/sse4_2/sse4_2.pro
@@ -1,5 +1,5 @@
SOURCES = sse4_2.cpp
CONFIG -= qt dylib release debug_and_release
CONFIG += debug console
-isEmpty(QMAKE_CFLAGS_SSE4_2):error("This compiler does not support SSE4.2")
+!defined(QMAKE_CFLAGS_SSE4_2, "var"):error("This compiler does not support SSE4.2")
else:QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_SSE4_2
diff --git a/config.tests/common/ssse3/ssse3.pro b/config.tests/common/ssse3/ssse3.pro
index 5b207e78ce..597b169140 100644
--- a/config.tests/common/ssse3/ssse3.pro
+++ b/config.tests/common/ssse3/ssse3.pro
@@ -1,5 +1,5 @@
SOURCES = ssse3.cpp
CONFIG -= qt dylib release debug_and_release
CONFIG += debug console
-isEmpty(QMAKE_CFLAGS_SSSE3):error("This compiler does not support SSSE3")
+!defined(QMAKE_CFLAGS_SSSE3, "var"):error("This compiler does not support SSSE3")
else:QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_SSSE3
diff --git a/mkspecs/blackberry-x86-qcc/qplatformdefs.h b/config.tests/common/xlocalescanprint/qglobal.h
index 243c4eb76b..09b48af480 100644
--- a/mkspecs/blackberry-x86-qcc/qplatformdefs.h
+++ b/config.tests/common/xlocalescanprint/qglobal.h
@@ -1,9 +1,9 @@
/****************************************************************************
**
-** Copyright (C) 2012 Research In Motion Limited. <blackberry-qt@qnx.com>
+** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
-** This file is part of the QtCore module of the Qt Toolkit.
+** This file is part of the config.tests of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL21$
** Commercial License Usage
@@ -31,4 +31,7 @@
**
****************************************************************************/
-#include "../qnx-x86-qcc/qplatformdefs.h"
+#ifndef QGLOBAL_H
+#define QGLOBAL_H
+
+#endif
diff --git a/config.tests/common/xlocalescanprint/xlocalescanprint.cpp b/config.tests/common/xlocalescanprint/xlocalescanprint.cpp
new file mode 100644
index 0000000000..4c84404a43
--- /dev/null
+++ b/config.tests/common/xlocalescanprint/xlocalescanprint.cpp
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the config.tests of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#define QT_BEGIN_NAMESPACE
+#define QT_END_NAMESPACE
+
+#ifdef _MSVC_VER
+#define Q_CC_MSVC _MSVC_VER
+#endif
+
+#define QT_NO_DOUBLECONVERSION
+
+#include "../../../src/corelib/tools/qdoublescanprint_p.h"
+
+int main(int argc, char **argv)
+{
+#ifdef _MSVC_VER
+ _locale_t invalidLocale = NULL;
+#else
+ locale_t invalidLocale = NULL;
+#endif
+ double a = 3.4;
+ qDoubleSnprintf(argv[0], 1, invalidLocale, "invalid format", a);
+ qDoubleSscanf(argv[0], invalidLocale, "invalid format", &a, &argc);
+ return 0;
+}
diff --git a/config.tests/common/xlocalescanprint/xlocalescanprint.pro b/config.tests/common/xlocalescanprint/xlocalescanprint.pro
new file mode 100644
index 0000000000..a37a01f227
--- /dev/null
+++ b/config.tests/common/xlocalescanprint/xlocalescanprint.pro
@@ -0,0 +1,3 @@
+SOURCES = xlocalescanprint.cpp
+CONFIG -= qt
+CONFIG += console
diff --git a/config.tests/unix/arch.test b/config.tests/unix/arch.test
index c50bd8b30a..cfb47def4f 100755
--- a/config.tests/unix/arch.test
+++ b/config.tests/unix/arch.test
@@ -6,7 +6,9 @@ SRCDIR=$3
OUTDIR=$4
RESULTFILE=$5
TARGET=$6
-shift 6
+QMAKE=$7
+QTCONF=$8
+shift 8
if [ "$TARGET" = "host" ]; then
VARPREFIX="CFG_HOST"
@@ -44,7 +46,7 @@ done
test -d "$OUTDIR/config.tests/arch" || mkdir -p "$OUTDIR/config.tests/arch"
cd "$OUTDIR/config.tests/arch"
[ -f Makefile ] && $MAKE distclean >/dev/null 2>&1
-OUTDIR=$OUTDIR "$OUTDIR/bin/qmake" -nocache -spec "$QMKSPEC" "LIBS+=$LFLAGS" "QMAKE_CXXFLAGS+=$CXXFLAGS" "INCLUDEPATH+=$INCLUDEPATH" "CONFIG-=app_bundle" "$SRCDIR/config.tests/arch/arch$PROSUFFIX.pro" >/dev/null 2>&1 || echo "qmake is broken" >&2
+OUTDIR=$OUTDIR "$QMAKE" -qtconf "$QTCONF" -nocache -spec "$QMKSPEC" "LIBS+=$LFLAGS" "QMAKE_CXXFLAGS+=$CXXFLAGS" "INCLUDEPATH+=$INCLUDEPATH" "CONFIG-=app_bundle" "$SRCDIR/config.tests/arch/arch$PROSUFFIX.pro" >/dev/null 2>&1 || echo "qmake is broken" >&2
ARCH=""
diff --git a/config.tests/unix/compile.test b/config.tests/unix/compile.test
index 103321e451..9c0a7cb845 100755
--- a/config.tests/unix/compile.test
+++ b/config.tests/unix/compile.test
@@ -10,12 +10,15 @@ OUTDIR=$5
TEST=$6
EXE=`basename "$6"`
DESCRIPTION=$7
-shift 7
+QMAKE=$8
+QTCONF=$9
+shift 9
LFLAGS="$SYSROOT_FLAG"
INCLUDEPATH=""
CXXFLAGS="$SYSROOT_FLAG"
MAC_ARCH_CXXFLAGS=""
MAC_ARCH_LFLAGS=""
+QMAKE_ARGS=
while [ "$#" -gt 0 ]; do
PARAM=$1
case $PARAM in
@@ -51,7 +54,9 @@ while [ "$#" -gt 0 ]; do
CXXFLAGS="$CXXFLAGS $PARAM \"$2\""
shift
;;
- *) ;;
+ *)
+ QMAKE_ARGS="$QMAKE_ARGS $PARAM"
+ ;;
esac
shift
done
@@ -67,7 +72,7 @@ test -r Makefile && $MAKE distclean >/dev/null 2>&1
# Make sure output from possible previous tests is gone
rm -f "$EXE" "${EXE}.exe"
-set -- "$OUTDIR/bin/qmake" -nocache -spec "$QMKSPEC" "CONFIG+=$QMAKE_CONFIG" "CONFIG+=android_app" "CONFIG-=debug_and_release app_bundle lib_bundle" "LIBS*=$LFLAGS" "LIBS+=$MAC_ARCH_LFLAGS" "INCLUDEPATH*=$INCLUDEPATH" "QMAKE_CXXFLAGS*=$CXXFLAGS" "QMAKE_CXXFLAGS+=$MAC_ARCH_CXXFLAGS" "$SRCDIR/$TEST/$EXE.pro" -o "$OUTDIR/$TEST/Makefile"
+set -- "$QMAKE" -qtconf "$QTCONF" -nocache -spec "$QMKSPEC" "CONFIG+=$QMAKE_CONFIG" "CONFIG+=android_app" "CONFIG-=debug_and_release app_bundle lib_bundle" "LIBS*=$LFLAGS" "LIBS+=$MAC_ARCH_LFLAGS" "INCLUDEPATH*=$INCLUDEPATH" "QMAKE_CXXFLAGS*=$CXXFLAGS" "QMAKE_CXXFLAGS+=$MAC_ARCH_CXXFLAGS" $QMAKE_ARGS "$SRCDIR/$TEST/$EXE.pro" -o "$OUTDIR/$TEST/Makefile"
if [ "$VERBOSE" = "yes" ]; then
OUTDIR=$OUTDIR "$@" && $MAKE && SUCCESS=yes
else
diff --git a/config.tests/x11/xinerama/xinerama.cpp b/config.tests/unix/doubleconversion/doubleconversion.cpp
index c795791806..4bf14a5b36 100644
--- a/config.tests/x11/xinerama/xinerama.cpp
+++ b/config.tests/unix/doubleconversion/doubleconversion.cpp
@@ -31,12 +31,10 @@
**
****************************************************************************/
-#include <X11/Xlib.h>
-#include <X11/extensions/Xinerama.h>
+#include <double-conversion/double-conversion.h>
int main(int, char **)
{
- XineramaScreenInfo *info;
- info = 0;
- return 0;
+ int flags = double_conversion::StringToDoubleConverter::NO_FLAGS;
+ return flags;
}
diff --git a/config.tests/unix/doubleconversion/doubleconversion.pro b/config.tests/unix/doubleconversion/doubleconversion.pro
new file mode 100644
index 0000000000..ae435b9293
--- /dev/null
+++ b/config.tests/unix/doubleconversion/doubleconversion.pro
@@ -0,0 +1,4 @@
+SOURCES = doubleconversion.cpp
+CONFIG -= qt
+CONFIG += console
+LIBS += -ldouble-conversion
diff --git a/config.tests/x11/xinput/xinput.cpp b/config.tests/unix/poll/poll.cpp
index 1d717c0125..06ae0386b5 100644
--- a/config.tests/x11/xinput/xinput.cpp
+++ b/config.tests/unix/poll/poll.cpp
@@ -31,21 +31,15 @@
**
****************************************************************************/
-#ifdef Q_OS_SOLARIS
-#error "Not supported."
-#else
+#include <poll.h>
-#include <X11/Xlib.h>
-#include <X11/extensions/XInput.h>
+int main()
+{
+ struct pollfd pfd;
-#ifdef Q_OS_IRIX
-# include <wacom.h>
-#endif
+ pfd.fd = -1;
+ pfd.events = 0;
+ pfd.revents = 0;
-int main(int, char **)
-{
- XDeviceButtonEvent *event;
- event = 0;
- return 0;
+ return ::poll(&pfd, 1, 0);
}
-#endif
diff --git a/config.tests/unix/poll/poll.pro b/config.tests/unix/poll/poll.pro
new file mode 100644
index 0000000000..70121b4586
--- /dev/null
+++ b/config.tests/unix/poll/poll.pro
@@ -0,0 +1,2 @@
+SOURCES = poll.cpp
+CONFIG -= qt
diff --git a/mkspecs/blackberry-armle-v7-qcc/qplatformdefs.h b/config.tests/unix/pollts/pollts.cpp
index e77898bd56..c2d1940ee0 100644
--- a/mkspecs/blackberry-armle-v7-qcc/qplatformdefs.h
+++ b/config.tests/unix/pollts/pollts.cpp
@@ -1,9 +1,9 @@
/****************************************************************************
**
-** Copyright (C) 2012 - 2013 BlackBerry Limited. All rights reserved.
+** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
-** This file is part of the QtCore module of the Qt Toolkit.
+** This file is part of the config.tests of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL21$
** Commercial License Usage
@@ -31,4 +31,21 @@
**
****************************************************************************/
-#include "../qnx-armle-v7-qcc/qplatformdefs.h"
+#include <poll.h>
+#include <signal.h>
+#include <time.h>
+
+int main()
+{
+ struct pollfd pfd;
+ struct timespec ts;
+
+ pfd.fd = -1;
+ pfd.events = 0;
+ pfd.revents = 0;
+
+ ts.tv_sec = 0;
+ ts.tv_nsec = 0;
+
+ return ::pollts(&pfd, 1, &ts, nullptr);
+}
diff --git a/config.tests/unix/pollts/pollts.pro b/config.tests/unix/pollts/pollts.pro
new file mode 100644
index 0000000000..5109dc33fd
--- /dev/null
+++ b/config.tests/unix/pollts/pollts.pro
@@ -0,0 +1,2 @@
+SOURCES = pollts.cpp
+CONFIG -= qt
diff --git a/config.tests/x11/xvideo/xvideo.cpp b/config.tests/unix/ppoll/ppoll.cpp
index 087e42530e..19d680edcf 100644
--- a/config.tests/x11/xvideo/xvideo.cpp
+++ b/config.tests/unix/ppoll/ppoll.cpp
@@ -3,7 +3,7 @@
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
-** This file is part of the FOO module of the Qt Toolkit.
+** This file is part of the config.tests of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL21$
** Commercial License Usage
@@ -31,14 +31,20 @@
**
****************************************************************************/
-#include <X11/Xlib.h>
-#include <X11/extensions/Xv.h>
-#include <X11/extensions/Xvlib.h>
+#include <signal.h>
+#include <poll.h>
-int main(int argc, char** argv)
+int main()
{
- unsigned int count = 0;
- XvAdaptorInfo *adaptors = 0;
- XvQueryAdaptors(0, 0, &count, &adaptors);
- return 0;
+ struct pollfd pfd;
+ struct timespec ts;
+
+ pfd.fd = -1;
+ pfd.events = 0;
+ pfd.revents = 0;
+
+ ts.tv_sec = 0;
+ ts.tv_nsec = 0;
+
+ return ::ppoll(&pfd, 1, &ts, nullptr);
}
diff --git a/config.tests/unix/ppoll/ppoll.pro b/config.tests/unix/ppoll/ppoll.pro
new file mode 100644
index 0000000000..d08a8a0679
--- /dev/null
+++ b/config.tests/unix/ppoll/ppoll.pro
@@ -0,0 +1,2 @@
+SOURCES = ppoll.cpp
+CONFIG -= qt
diff --git a/config.tests/x11/xinerama/xinerama.pro b/config.tests/x11/xinerama/xinerama.pro
deleted file mode 100644
index 54d1af031b..0000000000
--- a/config.tests/x11/xinerama/xinerama.pro
+++ /dev/null
@@ -1,4 +0,0 @@
-SOURCES = xinerama.cpp
-CONFIG += x11
-CONFIG -= qt
-LIBS += -lXinerama
diff --git a/config.tests/x11/xinput/xinput.pro b/config.tests/x11/xinput/xinput.pro
deleted file mode 100644
index 8acaede355..0000000000
--- a/config.tests/x11/xinput/xinput.pro
+++ /dev/null
@@ -1,6 +0,0 @@
-SOURCES = xinput.cpp
-CONFIG += x11
-CONFIG -= qt
-LIBS += -lXi
-irix-*:DEFINES+=Q_OS_IRIX
-solaris-*:DEFINES+=Q_OS_SOLARIS
diff --git a/config.tests/x11/xvideo/xvideo.pro b/config.tests/x11/xvideo/xvideo.pro
deleted file mode 100644
index d4c63a0158..0000000000
--- a/config.tests/x11/xvideo/xvideo.pro
+++ /dev/null
@@ -1,4 +0,0 @@
-CONFIG += x11
-CONFIG -= qt
-SOURCES = xvideo.cpp
-LIBS += -lXv
diff --git a/configure b/configure
index 52c1be265f..bc44ec0d71 100755
--- a/configure
+++ b/configure
@@ -104,9 +104,11 @@ QT_CONFIG=
SUPPORTED=
QMAKE_VARS_FILE=.qmake.vars
DEVICE_VARS_FILE=.device.vars
+HOST_VARS_FILE=.host.vars
:> "$QMAKE_VARS_FILE"
:> "$DEVICE_VARS_FILE"
+:> "$HOST_VARS_FILE"
#-------------------------------------------------------------------------------
# utility functions
@@ -195,15 +197,15 @@ expandQMakeConf()
echo "WARNING: Unable to find file $conf_file" >&2
continue
fi
- expandQMakeConf "$conf_file"
+ expandQMakeConf "$conf_file" "$2"
;;
*load\(device_config\)*)
- conf_file="$DEVICE_VARS_FILE"
+ conf_file="$2"
if [ ! -f "$conf_file" ]; then
echo "WARNING: Unable to find file $conf_file" >&2
continue
fi
- expandQMakeConf "$conf_file"
+ expandQMakeConf "$conf_file" "$2"
;;
*)
echo "$line"
@@ -336,7 +338,7 @@ macSDKify()
getQMakeConf()
{
if [ -z "$specvals" ]; then
- specvals=`expandQMakeConf "$QMAKESPEC/qmake.conf" | extractQMakeVariables "host_build"`
+ specvals=`expandQMakeConf "$QMAKESPEC/qmake.conf" "$HOST_VARS_FILE" | extractQMakeVariables "host_build"`
if [ "$BUILD_ON_MAC" = "yes" ]; then specvals=$(macSDKify "$specvals"); fi
fi
getSingleQMakeVariable "$1" "$specvals"
@@ -345,7 +347,7 @@ getQMakeConf()
getXQMakeConf()
{
if [ -z "$xspecvals" ]; then
- xspecvals=`expandQMakeConf "$XQMAKESPEC/qmake.conf" | extractQMakeVariables "!host_build"`
+ xspecvals=`expandQMakeConf "$XQMAKESPEC/qmake.conf" "$DEVICE_VARS_FILE" | extractQMakeVariables "!host_build"`
if [ "$XPLATFORM_MAC" = "yes" ]; then xspecvals=$(macSDKify "$xspecvals"); fi
fi
getSingleQMakeVariable "$1" "$xspecvals"
@@ -478,6 +480,23 @@ resolveDeviceMkspec()
}
#-------------------------------------------------------------------------------
+# Host options
+#-------------------------------------------------------------------------------
+HostVar()
+{
+ case "$1" in
+ set)
+ eq="="
+ ;;
+ *)
+ echo >&2 "BUG: wrong command to HostVar: $1"
+ ;;
+ esac
+
+ echo "$2" "$eq" "$3" >> "$HOST_VARS_FILE"
+}
+
+#-------------------------------------------------------------------------------
# operating system detection
#-------------------------------------------------------------------------------
@@ -502,12 +521,10 @@ BUILD_ON_MAC=no
if [ -d /System/Library/Frameworks/Carbon.framework ]; then
BUILD_ON_MAC=yes
fi
-BUILD_ON_MSYS=no
HOST_DIRLIST_SEP=":"
DEV_NULL=/dev/null
if [ "$OSTYPE" = "msys" ]; then
HOST_DIRLIST_SEP=";"
- BUILD_ON_MSYS=yes
DEV_NULL=/tmp/empty-file
echo "" > $DEV_NULL
relpath=`(cd "$relpath"; pwd -W)`
@@ -609,8 +626,6 @@ CFG_SHARED=yes
CFG_SM=auto
CFG_XSHAPE=auto
CFG_XSYNC=auto
-CFG_XVIDEO=auto
-CFG_XINERAMA=runtime
CFG_XFIXES=runtime
CFG_ZLIB=auto
CFG_MTDEV=auto
@@ -633,9 +648,10 @@ CFG_OPENVG_SHIVA=auto
CFG_OPENVG_ON_OPENGL=auto
CFG_EGL=auto
CFG_EGL_X=auto
+CFG_DOUBLECONVERSION=auto
CFG_FONTCONFIG=auto
CFG_FREETYPE=auto
-CFG_HARFBUZZ=qt
+CFG_HARFBUZZ=auto
CFG_SQL_AVAILABLE=
QT_ALL_BUILD_PARTS=" libs tools examples tests "
QT_DEFAULT_BUILD_PARTS="libs tools examples"
@@ -668,7 +684,6 @@ OPT_OBSOLETE_HOST_ARG=no
CFG_USE_GNUMAKE=no
CFG_XINPUT2=auto
-CFG_XINPUT=runtime
CFG_XKB=auto
CFG_XKBCOMMON=yes
CFG_XKBCOMMON_EVDEV=auto
@@ -697,7 +712,7 @@ CFG_CUPS=auto
CFG_ICONV=auto
CFG_DBUS=auto
CFG_GLIB=auto
-CFG_QGTKSTYLE=auto
+CFG_GTK=auto
CFG_LARGEFILE=auto
CFG_OPENSSL=auto
CFG_LIBPROXY=auto
@@ -713,6 +728,7 @@ CFG_SSE4_1=auto
CFG_SSE4_2=auto
CFG_AVX=auto
CFG_AVX2=auto
+CFG_AVX512=auto
CFG_REDUCE_RELOCATIONS=auto
CFG_ACCESSIBILITY=auto
CFG_ACCESSIBILITY_ATSPI_BRIDGE=no # will be enabled depending on dbus and accessibility being enabled
@@ -729,6 +745,7 @@ CFG_GETIFADDRS=auto
CFG_INOTIFY=auto
CFG_EVENTFD=auto
CFG_CLOEXEC=no
+CFG_POLL=auto
CFG_RPATH=yes
CFG_FRAMEWORK=auto
CFG_USE_GOLD_LINKER=auto
@@ -922,6 +939,7 @@ while [ "$#" -gt 0 ]; do
-hostlibdir| \
-extprefix| \
-sysroot| \
+ -external-hostbindir| \
-depths| \
-make| \
-nomake| \
@@ -930,6 +948,7 @@ while [ "$#" -gt 0 ]; do
-xplatform| \
-device| \
-device-option| \
+ -host-option| \
-sdk| \
-arch| \
-host-arch| \
@@ -1249,6 +1268,10 @@ while [ "$#" -gt 0 ]; do
gcc-sysroot)
CFG_GCC_SYSROOT="$VAL"
;;
+ external-hostbindir)
+ CFG_HOST_QT_TOOLS_PATH="$VAL"
+ HostVar set HOST_QT_TOOLS "$VAL"
+ ;;
bindir)
QT_INSTALL_BINS="$VAL"
;;
@@ -1423,6 +1446,11 @@ while [ "$#" -gt 0 ]; do
DEV_VAL=`echo $VAL | cut -d '=' -f 2-`
DeviceVar set $DEV_VAR "$DEV_VAL"
;;
+ host-option)
+ HOST_VAR=`echo $VAL | cut -d '=' -f 1`
+ HOST_VAL=`echo $VAL | cut -d '=' -f 2-`
+ HostVar set $HOST_VAR "$HOST_VAL"
+ ;;
qpa)
QT_QPA_DEFAULT_PLATFORM="$VAL"
;;
@@ -1517,13 +1545,6 @@ while [ "$#" -gt 0 ]; do
fi
;;
- xinerama)
- if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ] || [ "$VAL" = "runtime" ]; then
- CFG_XINERAMA="$VAL"
- else
- UNKNOWN_OPT=yes
- fi
- ;;
xshape)
if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
CFG_XSHAPE="$VAL"
@@ -1531,13 +1552,6 @@ while [ "$#" -gt 0 ]; do
UNKNOWN_OPT=yes
fi
;;
- xvideo)
- if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
- CFG_XVIDEO="$VAL"
- else
- UNKNOWN_OPT=yes
- fi
- ;;
xsync)
if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
CFG_XSYNC="$VAL"
@@ -1552,13 +1566,6 @@ while [ "$#" -gt 0 ]; do
UNKNOWN_OPT=yes
fi
;;
- xinput)
- if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ] || [ "$VAL" = "runtime" ]; then
- CFG_XINPUT="$VAL"
- else
- UNKNOWN_OPT=yes
- fi
- ;;
egl)
if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
CFG_EGL="$VAL"
@@ -1644,6 +1651,13 @@ while [ "$#" -gt 0 ]; do
UNKNOWN_OPT=yes
fi
;;
+ avx512)
+ if [ "$VAL" = "no" ]; then
+ CFG_AVX512=""
+ else
+ UNKNOWN_OPT=yes
+ fi
+ ;;
mips_dsp)
if [ "$VAL" = "no" ]; then
CFG_MIPS_DSP="$VAL"
@@ -1761,6 +1775,13 @@ while [ "$#" -gt 0 ]; do
UNKNOWN_OPT=yes
fi
;;
+ doubleconversion)
+ if [ "$VAL" = "qt" ] || [ "$VAL" = "no" ] || [ "$VAL" = "system" ]; then
+ CFG_DOUBLECONVERSION="$VAL"
+ else
+ UNKNOWN_OPT=yes
+ fi
+ ;;
fontconfig)
if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
CFG_FONTCONFIG="$VAL"
@@ -1959,9 +1980,9 @@ while [ "$#" -gt 0 ]; do
UNKNOWN_OPT=yes
fi
;;
- gtkstyle)
+ gtk)
if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
- CFG_QGTKSTYLE="$VAL"
+ CFG_GTK="$VAL"
else
UNKNOWN_OPT=yes
fi
@@ -2242,28 +2263,19 @@ while [ "$#" -gt 0 ]; do
UNKNOWN_OPT=yes
fi
;;
- c++11)
- if [ "$VAL" = "yes" ]; then
- CFG_STDCXX="c++11"
- elif [ "$VAL" = "no" ]; then
- CFG_STDCXX="c++98"
- else
- UNKNOWN_OPT=yes
- fi
- ;;
c++std)
case "$VAL" in
- c++98|c++11|c++14|c++1z|auto)
+ c++11|c++14|c++1z|auto)
CFG_STDCXX="$VAL"
;;
- 98|11|14|1z)
+ 11|14|1z)
CFG_STDCXX="c++$VAL"
;;
1y|c++1y)
CFG_STDCXX="c++14"
;;
*)
- echo >&2 "Invalid C++ edition: $VAL; valid options are: c++98 c++11 c++14 c++1z auto"
+ echo >&2 "Invalid C++ edition: $VAL; valid options are: c++11 c++14 c++1z auto"
ERROR=yes
;;
esac
@@ -2442,7 +2454,7 @@ Configure options:
-confirm-license ... Automatically acknowledge the license (use with
either -opensource or -commercial)
- -c++std <edition> .. Compile Qt with C++ standard edition (c++98, c++11, c++14, c++1z)
+ -c++std <edition> .. Compile Qt with C++ standard edition (c++11, c++14, c++1z)
Default: highest supported
* -shared ............ Create and use shared Qt libraries.
@@ -2485,6 +2497,7 @@ Configure options:
-no-sse4.2 ......... Do not compile with use of SSE4.2 instructions.
-no-avx ............ Do not compile with use of AVX instructions.
-no-avx2 ........... Do not compile with use of AVX2 instructions.
+ -no-avx512 ......... Do not compile with use of AVX512 instructions.
-no-mips_dsp ....... Do not compile with use of MIPS DSP instructions.
-no-mips_dspr2 ..... Do not compile with use of MIPS DSP rev2 instructions.
@@ -2534,16 +2547,21 @@ Third Party Libraries:
+ -system-libjpeg ..... Use libjpeg from the operating system.
See http://www.ijg.org
+ -no-doubleconversion ..... Use sscanf_l and snprintf_l for (imprecise) double conversion.
+ -qt-doubleconversion ..... Use the libdouble-conversion bundled with Qt.
+ + -system-doubleconversion . Use the libdouble-conversion provided by the system.
+ See https://github.com/google/double-conversion
+
-no-freetype ........ Do not compile in Freetype2 support.
-qt-freetype ........ Use the libfreetype bundled with Qt.
+ -system-freetype..... Use the libfreetype provided by the system (enabled if -fontconfig is active).
See http://www.freetype.org
-no-harfbuzz ........ Do not compile HarfBuzz-NG support.
- * -qt-harfbuzz ........ Use HarfBuzz-NG bundled with Qt to do text shaping.
+ -qt-harfbuzz ........ Use HarfBuzz-NG bundled with Qt to do text shaping.
It can still be disabled by setting
the QT_HARFBUZZ environment variable to "old".
- -system-harfbuzz .... Use HarfBuzz-NG from the operating system
+ + -system-harfbuzz .... Use HarfBuzz-NG from the operating system
to do text shaping. It can still be disabled
by setting the QT_HARFBUZZ environment variable to "old".
See http://www.harfbuzz.org
@@ -2584,8 +2602,8 @@ Third Party Libraries:
-no-alsa ............ Do not compile ALSA support.
+ -alsa ............... Compile ALSA support.
- -no-gtkstyle ........ Do not compile GTK theme support.
- + -gtkstyle ........... Compile GTK theme support.
+ -no-gtk ............. Do not compile GTK platform theme support.
+ + -gtk ................ Compile GTK platform theme support.
Additional options:
@@ -2671,6 +2689,8 @@ Additional options:
-device-option <key=value> ... Add device specific options for the device mkspec
(experimental)
+ -host-option <key=value> ..... Add host specific options for the host mkspec
+
* -no-separate-debug-info . Do not store debug information in a separate file.
-separate-debug-info .... Strip debug information into a separate file.
@@ -2702,6 +2722,9 @@ Additional options:
-sysroot <dir> ...... Sets <dir> as the target compiler's and qmake's sysroot and also sets pkg-config paths.
-no-gcc-sysroot ..... When using -sysroot, it disables the passing of --sysroot to the compiler
+ -external-hostbindir <path> .. Path to Qt tools built for this machine. Use this when -platform
+ does not match the current system, i.e., to make a Canadian Cross Build.
+
-no-feature-<feature> Do not compile in <feature>.
-feature-<feature> .. Compile in <feature>. The available features
are described in src/corelib/global/qfeatures.txt
@@ -2734,7 +2757,7 @@ Additional options:
-warnings-are-errors Make warnings be treated as errors
(enabled if -developer-build is active)
-QNX/Blackberry options:
+QNX options:
-no-slog2 .......... Do not compile with slog2 support.
-slog2 ............. Compile with slog2 support.
@@ -2977,7 +3000,7 @@ case "$XPLATFORM" in
*win32-g++*)
XPLATFORM_MINGW=yes
;;
- *qnx-*|*blackberry-*)
+ *qnx-*)
XPLATFORM_QNX=yes
;;
*haiku-*)
@@ -3413,7 +3436,7 @@ fi
# disable XCB and GTK support auto-detection on Mac
if [ "$XPLATFORM_MAC" = "yes" ]; then
[ "$CFG_XCB" = "auto" ] && CFG_XCB=no
- [ "$CFG_QGTKSTYLE" = "auto" ] && CFG_QGTKSTYLE=no
+ [ "$CFG_GTK" = "auto" ] && CFG_GTK=no
fi
QMAKE_CONF_COMPILER=`getXQMakeConf QMAKE_CXX`
@@ -3637,10 +3660,9 @@ END {
print "DEFAULT_LIBDIRS=\"/lib\n/usr/lib\"\n";
}'
-unset tty
-[ "$OPT_VERBOSE" = "yes" ] && tty=/dev/stderr
-eval "`LC_ALL=C $TEST_COMPILER $SYSROOT_FLAG $TEST_COMPILER_CXXFLAGS -xc++ -E -v - < /dev/null 2>&1 > /dev/null | $AWK "$awkprog" | tee $tty`"
-unset tty
+awkprog_result=`LC_ALL=C $TEST_COMPILER $SYSROOT_FLAG $TEST_COMPILER_CXXFLAGS -xc++ -E -v - < /dev/null 2>&1 > /dev/null | $AWK "$awkprog"`
+eval "$awkprog_result"
+[ "$OPT_VERBOSE" = "yes" ] && echo "$awkprog_result"
echo "Done running configuration tests."
@@ -4004,7 +4026,7 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
EXTRA_OBJS=
EXTRA_SRCS=
EXTRA_CFLAGS="\$(QMAKE_CFLAGS) \$(QMAKE_CFLAGS_SPLIT_SECTIONS)"
- EXTRA_CXXFLAGS="\$(QMAKE_CXXFLAGS) \$(QMAKE_CXXFLAGS_SPLIT_SECTIONS)"
+ EXTRA_CXXFLAGS="\$(QMAKE_CXXFLAGS) \$(QMAKE_CXXFLAGS_CXX11) \$(QMAKE_CXXFLAGS_SPLIT_SECTIONS)"
EXTRA_LFLAGS="\$(QMAKE_LFLAGS) \$(QMAKE_LFLAGS_GCSECTIONS)"
if [ "$PLATFORM" = "irix-cc" ] || [ "$PLATFORM" = "irix-cc-64" ]; then
@@ -4017,6 +4039,7 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
setBootstrapVariable QMAKE_CFLAGS
setBootstrapVariable QMAKE_CFLAGS_SPLIT_SECTIONS
setBootstrapVariable QMAKE_CXXFLAGS
+ setBootstrapVariable QMAKE_CXXFLAGS_CXX11
setBootstrapVariable QMAKE_CXXFLAGS_SPLIT_SECTIONS
setBootstrapVariable QMAKE_LFLAGS
setBootstrapVariable QMAKE_LFLAGS_GCSECTIONS
@@ -4039,7 +4062,8 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
EXTRA_LFLAGS="\$(QMAKE_LFLAGS_RPATH)\"$rpath\" $EXTRA_LFLAGS"
done
fi
- if [ "$BUILD_ON_MSYS" = "yes" ]; then
+ case `basename "$PLATFORM"` in
+ win32-g++*)
EXTRA_CFLAGS="-DUNICODE"
EXTRA_CXXFLAGS="-DUNICODE"
EXTRA_OBJS="qfilesystemengine_win.o \
@@ -4058,7 +4082,8 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
\"\$(SOURCE_PATH)/tools/shared/windows/registry.cpp\""
EXTRA_LFLAGS="-static -s -lole32 -luuid -ladvapi32 -lkernel32"
EXEEXT=".exe"
- else
+ ;;
+ *)
EXTRA_OBJS="qfilesystemengine_unix.o \
qfilesystemiterator_unix.o \
qfsfileengine_unix.o \
@@ -4068,7 +4093,8 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
\"\$(SOURCE_PATH)/src/corelib/io/qfsfileengine_unix.cpp\" \
\"\$(SOURCE_PATH)/src/corelib/tools/qlocale_unix.cpp\""
EXEEXT=
- fi
+ ;;
+ esac
if [ "$BUILD_ON_MAC" = "yes" ]; then
echo "COCOA_LFLAGS =-framework Foundation -framework CoreServices" >>"$mkfile"
echo "CARBON_LFLAGS =-framework ApplicationServices" >>"$mkfile"
@@ -4089,6 +4115,7 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
if [ '!' -z "$D_FLAGS" ]; then
EXTRA_CFLAGS="$EXTRA_CFLAGS $D_FLAGS"
fi
+
echo >>"$mkfile"
adjrelpath=`echo "$relpath" | sed 's/ /\\\\\\\\ /g'`
adjoutpath=`echo "$outpath" | sed 's/ /\\\\\\\\ /g'`
@@ -4158,7 +4185,16 @@ QTCONFFILE="$outpath/bin/qt.conf"
cat > "$QTCONFFILE" <<EOF
[EffectivePaths]
Prefix=..
+[Paths]
+Prefix=$QT_EXT_PREFIX
+TargetSpec=$XPLATFORM
+HostSpec=$PLATFORM
+EOF
+if [ -n "$CFG_SYSROOT" ]; then
+ cat >> "$QTCONFFILE" <<EOF
+Sysroot=$CFG_SYSROOT
EOF
+fi
if [ x"$relpath" != x"$outpath" ]; then
cat >> "$QTCONFFILE" <<EOF
[EffectiveSourcePaths]
@@ -4166,6 +4202,9 @@ Prefix=$relpath
EOF
fi
+[ -z "$CFG_HOST_QT_TOOLS_PATH" ] && CFG_HOST_QT_TOOLS_PATH="$outpath/bin"
+CFG_QMAKE_PATH="$CFG_HOST_QT_TOOLS_PATH/qmake"
+
#-------------------------------------------------------------------------------
# write out device config before we run the test.
#-------------------------------------------------------------------------------
@@ -4178,9 +4217,20 @@ else
fi
#-------------------------------------------------------------------------------
+# write out host config.
+#-------------------------------------------------------------------------------
+HOST_VARS_OUTFILE="$outpath/mkspecs/qhost.pri"
+if cmp -s "$HOST_VARS_FILE" "$HOST_VARS_OUTFILE"; then
+ rm -f "$HOST_VARS_FILE"
+else
+ mv -f $HOST_VARS_FILE "$HOST_VARS_OUTFILE"
+ HOST_VARS_FILE="$HOST_VARS_OUTFILE"
+fi
+
+#-------------------------------------------------------------------------------
# Verify makespec
#-------------------------------------------------------------------------------
-QMAKE_OUTPUT=`"$outpath/bin/qmake" -E -nocache -spec "$XQMAKESPEC" "QT=" $DEV_NULL 2>&1`
+QMAKE_OUTPUT=`"$CFG_QMAKE_PATH" -qtconf "$QTCONFFILE" -E -nocache -spec "$XQMAKESPEC" "QT=" $DEV_NULL 2>&1`
if [ $? != "0" ]; then
echo "Failed to process makespec for platform '$XPLATFORM'"
if [ "$OPT_VERBOSE" = "yes" ]; then
@@ -4196,7 +4246,7 @@ fi
#-------------------------------------------------------------------------------
if [ -z "$PKG_CONFIG" ]; then
# See if PKG_CONFIG is set in the mkspec:
- PKG_CONFIG="`"$outpath/bin/qmake" -E -nocache -spec "$XQMAKESPEC" "CONFIG=" $DEV_NULL 2>&1 | sed -n -e 's,^PKG_CONFIG = \(.*\),\1,p'`"
+ PKG_CONFIG="`"$CFG_QMAKE_PATH" -qtconf "$QTCONFFILE" -E -nocache -spec "$XQMAKESPEC" "CONFIG=" $DEV_NULL 2>&1 | sed -n -e 's,^PKG_CONFIG = \(.*\),\1,p'`"
[ -n "$PKG_CONFIG" ] && [ "$OPT_VERBOSE" = "yes" ] && echo "Found pkg-config from mkspec: $PKG_CONFIG"
fi
if [ -z "$PKG_CONFIG" ]; then
@@ -4271,7 +4321,7 @@ compileTest()
if [ "$CFG_SHARED" = "no" ]; then
test_config="$QMAKE_CONFIG static"
fi
- "$unixtests/compile.test" "$XQMAKESPEC" "$test_config" $OPT_VERBOSE "$relpath" "$outpath" "$path" "$name" $I_FLAGS $D_FLAGS $L_FLAGS "$@"
+ "$unixtests/compile.test" "$XQMAKESPEC" "$test_config" $OPT_VERBOSE "$relpath" "$outpath" "$path" "$name" "$CFG_QMAKE_PATH" "$QTCONFFILE" $I_FLAGS $D_FLAGS $L_FLAGS "$@"
}
compileTestWithPkgConfig()
@@ -4320,7 +4370,7 @@ compileTestWithPkgConfig()
# Use config.tests/arch/arch.pro to have the compiler tell us what the target architecture is
OUTFILE=$outpath/arch.result
-"$unixtests/arch.test" "$XQMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath" "$OUTFILE" "target" $I_FLAGS $D_FLAGS $L_FLAGS
+"$unixtests/arch.test" "$XQMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath" "$OUTFILE" "target" $CFG_QMAKE_PATH $QTCONFFILE $I_FLAGS $D_FLAGS $L_FLAGS
if [ $? -eq 0 ]; then
eval `cat "$OUTFILE"`
else
@@ -4333,7 +4383,7 @@ rm -f "$OUTFILE" 2>/dev/null
if [ "$QMAKESPEC" != "$XQMAKESPEC" ]; then
# Do the same test again, using the host compiler
- SYSROOT_FLAG= "$unixtests/arch.test" "$QMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath" "$OUTFILE" "host" $I_FLAGS $D_FLAGS $L_FLAGS
+ SYSROOT_FLAG= "$unixtests/arch.test" "$QMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath" "$OUTFILE" "host" $CFG_QMAKE_PATH $QTCONFFILE $I_FLAGS $D_FLAGS $L_FLAGS
if [ $? -eq 0 ]; then
eval `cat "$OUTFILE"`
else
@@ -4369,20 +4419,11 @@ if [ "$CFG_SEPARATE_DEBUG_INFO" = "yes" ]; then
fi
# Detect C++11 & up support
-# Configure detects compiler features based on cross compiler, so we need
-# to explicitly disable C++11 on Mac to avoid breaking builds where the
-# host compiler does not support it.
stdcxx_error=false
-if [ "$BUILD_ON_MAC" = "yes" ] && [ "$XPLATFORM_ANDROID" = "yes" ]; then
- CFG_STDCXX="c++98"
-elif [ "$CFG_STDCXX" = "c++98" ]; then
- : # CFG_STDCXX is correct
-elif ! compileTest common/c++11 "C++11"; then
- if [ "$CFG_STDCXX" != "auto" ]; then
- stdcxx_error=true
- else
- CFG_STDCXX="c++98"
- fi
+if ! compileTest common/c++11 "C++11"; then
+ echo "ERROR: Qt requires a C++11 compiler and yours does not seem to be that."
+ echo "Please upgrade."
+ exit 1
elif [ "$CFG_STDCXX" = "c++11" ]; then
: # CFG_STDCXX is correct
elif ! compileTest common/c++14 "C++14"; then
@@ -4436,9 +4477,11 @@ else
fi
# detect sse2 support
+CFG_SSE_LIST=
if [ "${CFG_SSE2}" = "auto" ]; then
if compileTest common/sse2 "sse2"; then
CFG_SSE2=yes
+ CFG_SSE_LIST=SSE2
else
CFG_SSE2=no
fi
@@ -4451,6 +4494,7 @@ fi
if [ "${CFG_SSE3}" = "auto" ]; then
if compileTest common/sse3 "sse3"; then
CFG_SSE3=yes
+ CFG_SSE_LIST="$CFG_SSE_LIST SSE3"
else
CFG_SSE3=no
fi
@@ -4463,6 +4507,7 @@ fi
if [ "${CFG_SSSE3}" = "auto" ]; then
if compileTest common/ssse3 "ssse3"; then
CFG_SSSE3=yes
+ CFG_SSE_LIST="$CFG_SSE_LIST SSSE3"
else
CFG_SSSE3=no
fi
@@ -4475,6 +4520,7 @@ fi
if [ "${CFG_SSE4_1}" = "auto" ]; then
if compileTest common/sse4_1 "sse4_1"; then
CFG_SSE4_1=yes
+ CFG_SSE_LIST="$CFG_SSE_LIST SSE4.1"
else
CFG_SSE4_1=no
fi
@@ -4487,12 +4533,14 @@ fi
if [ "${CFG_SSE4_2}" = "auto" ]; then
if compileTest common/sse4_2 "sse4_2"; then
CFG_SSE4_2=yes
+ CFG_SSE_LIST="$CFG_SSE_LIST SSE4.2"
else
CFG_SSE4_2=no
fi
fi
# detect avx support
+CFG_AVX_LIST=
if [ "${CFG_SSE4_2}" = "no" ]; then
CFG_AVX=no
fi
@@ -4510,11 +4558,13 @@ if [ "${CFG_AVX}" = "auto" ]; then
;;
*)
CFG_AVX=yes
+ CFG_AVX_LIST=AVX
;;
esac
;;
*)
CFG_AVX=yes
+ CFG_AVX_LIST=AVX
;;
esac
else
@@ -4529,11 +4579,40 @@ fi
if [ "${CFG_AVX2}" = "auto" ]; then
if compileTest common/avx2 "avx2"; then
CFG_AVX2=yes
+ CFG_AVX_LIST="$CFG_AVX_LIST AVX2"
else
CFG_AVX2=no
fi
fi
+# detect avx512 support
+if [ "${CFG_AVX2}" = "no" ]; then
+ CFG_AVX512=
+fi
+if [ "${CFG_AVX512}" = "auto" ]; then
+ # First, test for AVX-512 Foundation
+ if compileTest common/avx512 "avx512f" AVX512=F; then
+ # Test for the sub-features
+ CFG_AVX512=f
+ CFG_AVX512_UPPER=AVX512F
+ for feature in er cd pf dq bw vl ifma vbmi; do
+ if [ -n "$BASH_VERSION" ] && [ "${BASH_VERSION%%.*}" -gt 3 ]; then
+ upper=${feature^^*}
+ elif [ -n "$ZSH_VERSION" ]; then
+ upper=${(U)feature}
+ else
+ upper=`echo $feature | tr a-z A-Z`
+ fi
+ if compileTest common/avx512 "avx512$feature" AVX512=$upper; then
+ CFG_AVX512="$CFG_AVX512 $feature"
+ CFG_AVX512_UPPER="$CFG_AVX512_UPPER AVX512$upper"
+ fi
+ done
+ else
+ CFG_AVX512=
+ fi
+fi
+
# check Neon support
if [ "$CFG_NEON" = "auto" ]; then
# no compile test, just check what the compiler has
@@ -4549,7 +4628,7 @@ fi
# detect mips_dsp support
if [ "$CFG_ARCH" = "mips" ] && [ "${CFG_MIPS_DSP}" = "auto" ]; then
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/mips_dsp "mips_dsp" $L_FLAGS $I_FLAGS $D_FLAGS $l_FLAGS; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/mips_dsp "mips_dsp" "$CFG_QMAKE_PATH" "$QTCONFFILE" $L_FLAGS $I_FLAGS $D_FLAGS $l_FLAGS; then
CFG_MIPS_DSP=yes
else
CFG_MIPS_DSP=no
@@ -4560,7 +4639,7 @@ fi
# detect mips_dspr2 support
if [ "$CFG_ARCH" = "mips" ] && [ "${CFG_MIPS_DSPR2}" = "auto" ]; then
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/mips_dspr2 "mips_dspr2" $L_FLAGS $I_FLAGS $D_FLAGS $l_FLAGS; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/mips_dspr2 "mips_dspr2" "$CFG_QMAKE_PATH" "$QTCONFFILE" $L_FLAGS $I_FLAGS $D_FLAGS $l_FLAGS; then
CFG_MIPS_DSPR2=yes
else
CFG_MIPS_DSPR2=no
@@ -4748,8 +4827,9 @@ for _SQLDR in $CFG_SQL_AVAILABLE; do
[ -z "$CFG_MYSQL_CONFIG" ] && CFG_MYSQL_CONFIG=`"$WHICH" mysql_config`
if [ -x "$CFG_MYSQL_CONFIG" ]; then
QT_CFLAGS_MYSQL=`$CFG_MYSQL_CONFIG --include 2>/dev/null | filterIncludeOptions`
- QT_LFLAGS_MYSQL_R=`$CFG_MYSQL_CONFIG --libs_r 2>/dev/null | filterLibraryOptions`
- QT_LFLAGS_MYSQL=`$CFG_MYSQL_CONFIG --libs 2>/dev/null | filterLibraryOptions`
+ # -rdynamic should not be returned by mysql_config, but is on RHEL 6.6
+ QT_LFLAGS_MYSQL_R=`$CFG_MYSQL_CONFIG --libs_r 2>/dev/null | filterLibraryOptions | sed "s/-rdynamic//"`
+ QT_LFLAGS_MYSQL=`$CFG_MYSQL_CONFIG --libs 2>/dev/null | filterLibraryOptions | sed "s/-rdynamic//"`
QT_MYSQL_VERSION=`$CFG_MYSQL_CONFIG --version 2>/dev/null`
QT_MYSQL_VERSION_MAJOR=`echo $QT_MYSQL_VERSION | cut -d . -f 1`
fi
@@ -5131,33 +5211,31 @@ if [ "$CFG_GLIB" != "no" ]; then
fi
# auto-detect GTK style support
-if [ "$CFG_GLIB" = "yes" -a "$CFG_QGTKSTYLE" != "no" ]; then
+if [ "$CFG_GLIB" = "yes" -a "$CFG_GTK" != "no" ]; then
if [ -n "$PKG_CONFIG" ]; then
- QT_CFLAGS_QGTK2=`$PKG_CONFIG --cflags gtk+-2.0 ">=" 2.18 atk 2>/dev/null`
- QT_LIBS_QGTK2=`$PKG_CONFIG --libs gtk+-2.0 2>/dev/null`
+ QT_CFLAGS_QGTK3=`$PKG_CONFIG --cflags gtk+-3.0 2>/dev/null`
+ QT_LIBS_QGTK3=`$PKG_CONFIG --libs gtk+-3.0 2>/dev/null`
QT_LIBS_QGOBJECT=`$PKG_CONFIG --libs gobject-2.0 2>/dev/null`
fi
- if [ -n "$QT_CFLAGS_QGTK2" ] ; then
- CFG_QGTKSTYLE=yes
- QT_CONFIG="$QT_CONFIG gtk2 gtkstyle"
- QMakeVar set QT_CFLAGS_QGTKSTYLE "$QT_CFLAGS_QGTK2"
- QMakeVar set QT_LIBS_QGTKSTYLE "$QT_LIBS_QGOBJECT"
- QMakeVar set QT_CFLAGS_QGTK2 "$QT_CFLAGS_QGTK2"
- QMakeVar set QT_LIBS_QGTK2 "$QT_LIBS_QGTK2"
+ if [ -n "$QT_CFLAGS_QGTK3" ] ; then
+ CFG_GTK=yes
+ QT_CONFIG="$QT_CONFIG gtk3"
+ QMakeVar set QT_CFLAGS_QGTK3 "$QT_CFLAGS_QGTK3"
+ QMakeVar set QT_LIBS_QGTK3 "$QT_LIBS_QGTK3"
else
- if [ "$CFG_QGTKSTYLE" = "yes" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
+ if [ "$CFG_GTK" = "yes" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
echo "GTK theme support cannot be enabled due to functionality tests!"
[ -z "$PKG_CONFIG" ] && echo " Use of pkg-config is not enabled, maybe you want to pass -pkg-config?"
- echo " Turn on verbose messaging (-v) to $0 to see the fin al report."
+ echo " Turn on verbose messaging (-v) to $0 to see the final report."
echo " If you believe this message is in error you may use the continue"
echo " switch (-continue) to $0 to continue."
exit 101
else
- CFG_QGTKSTYLE=no
+ CFG_GTK=no
fi
fi
elif [ "$CFG_GLIB" = "no" ]; then
- CFG_QGTKSTYLE=no
+ CFG_GTK=no
fi
# auto-detect libicu support
@@ -5506,7 +5584,6 @@ if [ "$CFG_XINPUT2" != "no" ]; then
QMakeVar set QMAKE_LIBXI_VERSION_PATCH "$QMAKE_LIBXI_VERSION_PATCH"
fi
CFG_XINPUT2=yes
- CFG_XINPUT=no
else
if [ "$CFG_XINPUT2" = "yes" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
echo "XInput2 support cannot be enabled due to functionality tests!"
@@ -5875,6 +5952,24 @@ if [ "$XPLATFORM_MAC" = "no" ] && [ "$XPLATFORM_MINGW" = "no" ] && [ "$XPLATFORM
fi
fi
+# double-conversion support
+if [ "$CFG_DOUBLECONVERSION" = "no" ]; then
+ if ! compileTest common/xlocalescanprint "XLocaleScanPrint"; then
+ echo "Your C library does not provide sscanf_l or snprintf_l."
+ echo "You need to use libdouble-conversion for double/string conversion."
+ exit 1
+ fi
+elif [ "$CFG_DOUBLECONVERSION" != "qt" ]; then
+ if compileTest unix/doubleconversion "DoubleConversion"; then
+ CFG_DOUBLECONVERSION=system
+ elif [ "$CFG_DOUBLECONVERSION" = "system" ]; then
+ echo "No system libdouble-conversion found."
+ exit 1
+ else
+ CFG_DOUBLECONVERSION=qt
+ fi
+fi
+
# freetype support
[ "$XPLATFORM_MINGW" = "yes" ] && [ "$CFG_FREETYPE" = "auto" ] && CFG_FREETYPE=no
if [ "$CFG_FREETYPE" = "auto" ]; then
@@ -5886,9 +5981,12 @@ if [ "$CFG_FREETYPE" = "auto" ]; then
fi
# harfbuzz support
-if [ "$CFG_HARFBUZZ" = "system" ]; then
- if ! compileTest unix/harfbuzz "HarfBuzz"; then
- if [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
+[ "$XPLATFORM_MAC" = "yes" ] && [ "$CFG_HARFBUZZ" = "auto" ] && CFG_HARFBUZZ=qt
+if [ "$CFG_HARFBUZZ" = "auto" ] || [ "$CFG_HARFBUZZ" = "system" ]; then
+ if compileTest unix/harfbuzz "HarfBuzz"; then
+ CFG_HARFBUZZ=system
+ else
+ if [ "$CFG_HARFBUZZ" = "system" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
echo " HarfBuzz system library support cannot be enabled due to functionality tests!"
echo " Turn on verbose messaging (-v) to $0 to see the final report."
echo " If you believe this message is in error you may use the continue"
@@ -6041,6 +6139,16 @@ if compileTest unix/cloexec "cloexec"; then
CFG_CLOEXEC=yes
fi
+if compileTest unix/ppoll "ppoll"; then
+ CFG_POLL="ppoll"
+elif compileTest unix/pollts "pollts"; then
+ CFG_POLL="pollts"
+elif compileTest unix/poll "poll"; then
+ CFG_POLL="poll"
+else
+ CFG_POLL="select"
+fi
+
if [ "$XPLATFORM_MAC" = "yes" ] && [ "$CFG_SECURETRANSPORT" != "no" ] && ([ "$CFG_OPENSSL" = "no" ] || [ "$CFG_OPENSSL" = "auto" ]); then
CFG_SECURETRANSPORT=yes
CFG_OPENSSL=no
@@ -6180,13 +6288,12 @@ fi
# ask for all that hasn't been auto-detected or specified in the arguments
#-------------------------------------------------------------------------------
-if [ "$CFG_STDCXX" != "c++98" ]; then
- QT_CONFIG="$QT_CONFIG c++11"
- if [ "$CFG_STDCXX" != "c++11" ]; then
- QT_CONFIG="$QT_CONFIG c++14"
- if [ "$CFG_STDCXX" != "c++14" ]; then
- QT_CONFIG="$QT_CONFIG c++1z"
- fi
+# Set "c++11" unconditionally, as lots of code does contains(QT_CONFIG, c++11)
+QT_CONFIG="$QT_CONFIG c++11"
+if [ "$CFG_STDCXX" != "c++11" ]; then
+ QT_CONFIG="$QT_CONFIG c++14"
+ if [ "$CFG_STDCXX" != "c++14" ]; then
+ QT_CONFIG="$QT_CONFIG c++1z"
fi
fi
@@ -6313,6 +6420,9 @@ fi
[ "$CFG_SSE4_2" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG sse4_2"
[ "$CFG_AVX" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG avx"
[ "$CFG_AVX2" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG avx2"
+for feature in $CFG_AVX512; do
+ QMAKE_CONFIG="$QMAKE_CONFIG avx512$feature"
+done
[ "$CFG_NEON" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG neon"
if [ "$CFG_ARCH" = "mips" ]; then
[ "$CFG_MIPS_DSP" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG mips_dsp"
@@ -6348,6 +6458,10 @@ fi
if [ "$CFG_CLOEXEC" = "yes" ]; then
QT_CONFIG="$QT_CONFIG threadsafe-cloexec"
fi
+if [ "$CFG_POLL" = "select" ]; then
+ QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_NATIVE_POLL"
+fi
+QT_CONFIG="$QT_CONFIG poll_$CFG_POLL"
if [ "$CFG_LIBJPEG" = "no" ]; then
CFG_JPEG="no"
elif [ "$CFG_LIBJPEG" = "system" ]; then
@@ -6374,6 +6488,13 @@ if [ "$CFG_GIF" = "no" ]; then
elif [ "$CFG_GIF" = "yes" ]; then
QT_CONFIG="$QT_CONFIG gif"
fi
+if [ "$CFG_DOUBLECONVERSION" = "no" ]; then
+ QT_CONFIG="$QT_CONFIG no-doubleconversion"
+elif [ "$CFG_DOUBLECONVERSION" = "system" ]; then
+ QT_CONFIG="$QT_CONFIG system-doubleconversion"
+else
+ QT_CONFIG="$QT_CONFIG doubleconversion"
+fi
if [ "$CFG_FREETYPE" = "no" ]; then
QT_CONFIG="$QT_CONFIG no-freetype"
QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_FREETYPE"
@@ -6788,6 +6909,9 @@ for SUBARCH in SSE2 SSE3 SSSE3 SSE4_1 SSE4_2 AVX AVX2 \
;;
esac
done
+for feature in $CFG_AVX512_UPPER; do
+ echo "#define QT_COMPILER_SUPPORTS_$feature 1"
+done
echo ""
@@ -6829,7 +6953,6 @@ QMakeVar set sql-plugins "$SQL_PLUGINS"
[ "$CFG_ICONV" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_ICONV"
[ "$CFG_EVDEV" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_EVDEV"
[ "$CFG_GLIB" != "yes" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_GLIB"
-[ "$CFG_QGTKSTYLE" != "yes" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_STYLE_GTK"
[ "$CFG_CLOCK_MONOTONIC" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_CLOCK_MONOTONIC"
[ "$CFG_POSIX_FALLOCATE" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_POSIX_FALLOCATE"
[ "$CFG_MREMAP" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_MREMAP"
@@ -6850,21 +6973,16 @@ QMakeVar set sql-plugins "$SQL_PLUGINS"
[ "$CFG_XCURSOR" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_XCURSOR"
[ "$CFG_XFIXES" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_XFIXES"
[ "$CFG_FONTCONFIG" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_FONTCONFIG"
-[ "$CFG_XINERAMA" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_XINERAMA"
[ "$CFG_XKB" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_XKB"
[ "$CFG_XRANDR" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_XRANDR"
[ "$CFG_XRENDER" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_XRENDER"
[ "$CFG_MITSHM" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_MITSHM"
[ "$CFG_XSHAPE" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_SHAPE"
-[ "$CFG_XVIDEO" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_XVIDEO"
[ "$CFG_XSYNC" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_XSYNC"
-[ "$CFG_XINPUT" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_XINPUT QT_NO_TABLET"
[ "$CFG_XCURSOR" = "runtime" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_RUNTIME_XCURSOR"
-[ "$CFG_XINERAMA" = "runtime" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_RUNTIME_XINERAMA"
[ "$CFG_XFIXES" = "runtime" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_RUNTIME_XFIXES"
[ "$CFG_XRANDR" = "runtime" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_RUNTIME_XRANDR"
-[ "$CFG_XINPUT" = "runtime" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_RUNTIME_XINPUT"
[ "$CFG_ALSA" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_ALSA"
[ "$CFG_PULSEAUDIO" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_PULSEAUDIO"
[ "$CFG_COREWLAN" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_COREWLAN"
@@ -7256,9 +7374,9 @@ echo " Using PCH .............. $CFG_PRECOMPILE"
echo " Using LTCG ............. $CFG_LTCG"
echo " Target compiler supports:"
if [ "$CFG_ARCH" = "i386" -o "$CFG_ARCH" = "x86_64" ]; then
- echo " SSE2/SSE3/SSSE3 ...... ${CFG_SSE2}/${CFG_SSE3}/${CFG_SSSE3}"
- echo " SSE4.1/SSE4.2 ........ ${CFG_SSE4_1}/${CFG_SSE4_2}"
- echo " AVX/AVX2 ............. ${CFG_AVX}/${CFG_AVX2}"
+ echo " SSE .................. ${CFG_SSE_LIST:-<none>}"
+ echo " AVX .................. ${CFG_AVX_LIST:-<none>}"
+ echo " AVX512 ............... ${CFG_AVX512_UPPER:-<none>}"
elif [ "$CFG_ARCH" = "arm" ]; then
echo " Neon ................. ${CFG_NEON}"
elif [ "$CFG_ARCH" = "mips" ]; then
@@ -7286,12 +7404,13 @@ report_support " ALSA ..................." "$CFG_ALSA"
report_support " CUPS ..................." "$CFG_CUPS"
[ "$XPLATFORM_MINGW" = "yes" ] && \
report_support " DirectWrite ............" "$CFG_DIRECTWRITE"
+report_support " DoubleConversion........" "$CFG_DOUBLECONVERSION" no "libc" system "system library" qt "bundled copy"
report_support " Evdev .................." "$CFG_EVDEV"
report_support " FontConfig ............." "$CFG_FONTCONFIG"
report_support " FreeType ..............." "$CFG_FREETYPE" system "system library" yes "bundled copy"
report_support " Glib ..................." "$CFG_GLIB"
report_support " GStreamer .............." "$CFG_GSTREAMER" yes "$CFG_GSTREAMER_VERSION"
-report_support " GTK theme .............." "$CFG_QGTKSTYLE"
+report_support " GTK platformtheme ......" "$CFG_GTK"
report_support " HarfBuzz ..............." "$CFG_HARFBUZZ" system "system library" qt "bundled copy"
report_support " Iconv .................." "$CFG_ICONV"
report_support " ICU ...................." "$CFG_ICU"
@@ -7346,15 +7465,12 @@ if [ "$CFG_XCB" != "no" ]; then
report_support " Xcb-Xlib ..........." "$CFG_XCB_XLIB"
report_support " Xcursor ............" "$CFG_XCURSOR" runtime "loaded at runtime"
report_support " Xfixes ............." "$CFG_XFIXES" runtime "loaded at runtime"
- report_support " Xi ................." "$CFG_XINPUT" runtime "loaded at runtime"
report_support " Xi2 ................" "$CFG_XINPUT2" runtime "loaded at runtime"
- report_support " Xinerama ..........." "$CFG_XINERAMA" runtime "loaded at runtime"
report_support " Xrandr ............." "$CFG_XRANDR" runtime "loaded at runtime"
report_support " Xrender ............" "$CFG_XRENDER"
report_support " XKB ................" "$CFG_XKB"
report_support " XShape ............." "$CFG_XSHAPE"
report_support " XSync .............." "$CFG_XSYNC"
- report_support " XVideo ............." "$CFG_XVIDEO"
fi
report_support " Session management ....." "$CFG_SM"
if [ "$XPLATFORM_QNX" = "yes" ]; then
@@ -7447,7 +7563,7 @@ rm -f "$QMAKE_VARS_FILE" 2>/dev/null
cd ..
fi
- "$outpath/bin/qmake" "$relpathMangled"
+ "$CFG_QMAKE_PATH" -qtconf "$QTCONFFILE" "$relpathMangled"
) || exit
@@ -7522,20 +7638,6 @@ EOF
fi
#-------------------------------------------------------------------------------
-# check if the user passed the deprecated -no-c++11 / --c++-level=c++98 option
-#-------------------------------------------------------------------------------
-if [ "$CFG_STDCXX" = "c++98" ]; then
-cat <<EOF
-
- NOTICE: The -no-c++11 / --c++-level=c++98 option is deprecated.
-
- Qt 5.7 will require C++11 support. The options are in effect for this
- Qt 5.6 build, but you should update your build scripts to remove the
- option and, if necessary, upgrade your compiler.
-EOF
-fi
-
-#-------------------------------------------------------------------------------
# finally save the executed command to another script
#-------------------------------------------------------------------------------
if [ `basename $0` != "config.status" ]; then
diff --git a/doc/global/externalsites/qt-webpages.qdoc b/doc/global/externalsites/qt-webpages.qdoc
index e70a441495..8e7508f094 100644
--- a/doc/global/externalsites/qt-webpages.qdoc
+++ b/doc/global/externalsites/qt-webpages.qdoc
@@ -107,10 +107,6 @@
*/
/*!
- \externalpage http://wiki.qt.io/BlackBerry
- \title Qt for BlackBerry
-*/
-/*!
\externalpage http://wiki.qt.io/Qt_Multimedia_Backends
\title Qt Multimedia Backends
*/
diff --git a/examples/network/network.pro b/examples/network/network.pro
index 8ed72315e2..92003950a7 100644
--- a/examples/network/network.pro
+++ b/examples/network/network.pro
@@ -11,19 +11,25 @@ qtHaveModule(widgets) {
blockingfortuneclient \
broadcastreceiver \
broadcastsender \
- fortuneclient \
- fortuneserver \
http \
loopback \
threadedfortuneserver \
googlesuggest \
torrent \
- bearermonitor \
multicastreceiver \
multicastsender
- # no QProcess
- !vxworks:!qnx:!winrt:SUBDIRS += network-chat
+ load(qfeatures)
+ !contains(QT_DISABLED_FEATURES, bearermanagement) {
+ # no QProcess
+ !vxworks:!qnx:!winrt:SUBDIRS += network-chat
+
+ SUBDIRS += \
+ bearermonitor \
+ fortuneclient \
+ fortuneserver
+
+ }
contains(QT_CONFIG, openssl):SUBDIRS += securesocketclient
contains(QT_CONFIG, openssl-linked):SUBDIRS += securesocketclient
diff --git a/examples/widgets/graphicsview/chip/mainwindow.cpp b/examples/widgets/graphicsview/chip/mainwindow.cpp
index f88c358513..85d1c1c1fe 100644
--- a/examples/widgets/graphicsview/chip/mainwindow.cpp
+++ b/examples/widgets/graphicsview/chip/mainwindow.cpp
@@ -76,7 +76,7 @@ MainWindow::MainWindow(QWidget *parent)
void MainWindow::populateScene()
{
- scene = new QGraphicsScene;
+ scene = new QGraphicsScene(this);
QImage image(":/qt4logo.png");
diff --git a/examples/widgets/graphicsview/chip/view.cpp b/examples/widgets/graphicsview/chip/view.cpp
index 0a4179b364..8c1fc79f5b 100644
--- a/examples/widgets/graphicsview/chip/view.cpp
+++ b/examples/widgets/graphicsview/chip/view.cpp
@@ -147,7 +147,7 @@ View::View(const QString &name, QWidget *parent)
printButton = new QToolButton;
printButton->setIcon(QIcon(QPixmap(":/fileprint.png")));
- QButtonGroup *pointerModeGroup = new QButtonGroup;
+ QButtonGroup *pointerModeGroup = new QButtonGroup(this);
pointerModeGroup->setExclusive(true);
pointerModeGroup->addButton(selectModeButton);
pointerModeGroup->addButton(dragModeButton);
diff --git a/examples/widgets/mac/qmaccocoaviewcontainer/main.mm b/examples/widgets/mac/qmaccocoaviewcontainer/main.mm
index 870ab65ff7..8ef8a50254 100644
--- a/examples/widgets/mac/qmaccocoaviewcontainer/main.mm
+++ b/examples/widgets/mac/qmaccocoaviewcontainer/main.mm
@@ -31,7 +31,7 @@
**
****************************************************************************/
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <QtWidgets>
#include <QMacCocoaViewContainer>
diff --git a/examples/widgets/mac/qmaccocoaviewcontainer/qmaccocoaviewcontainer.pro b/examples/widgets/mac/qmaccocoaviewcontainer/qmaccocoaviewcontainer.pro
index c8c2195cb8..9dea65bf9f 100644
--- a/examples/widgets/mac/qmaccocoaviewcontainer/qmaccocoaviewcontainer.pro
+++ b/examples/widgets/mac/qmaccocoaviewcontainer/qmaccocoaviewcontainer.pro
@@ -1,7 +1,7 @@
TEMPLATE = app
OBJECTIVE_SOURCES += main.mm
-LIBS += -framework Cocoa
+LIBS += -framework AppKit
QT += widgets
diff --git a/examples/widgets/mac/qmacnativewidget/main.mm b/examples/widgets/mac/qmacnativewidget/main.mm
index b01db8051b..436be55675 100644
--- a/examples/widgets/mac/qmacnativewidget/main.mm
+++ b/examples/widgets/mac/qmacnativewidget/main.mm
@@ -31,7 +31,7 @@
**
****************************************************************************/
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#include <QApplication>
#include <QDebug>
diff --git a/examples/widgets/mac/qmacnativewidget/qmacnativewidget.pro b/examples/widgets/mac/qmacnativewidget/qmacnativewidget.pro
index cafff9f035..9da91c7be0 100644
--- a/examples/widgets/mac/qmacnativewidget/qmacnativewidget.pro
+++ b/examples/widgets/mac/qmacnativewidget/qmacnativewidget.pro
@@ -1,7 +1,7 @@
TEMPLATE = app
OBJECTIVE_SOURCES += main.mm
-LIBS += -framework Cocoa
+LIBS += -framework AppKit
QT += widgets
#QT += widgets-private gui-private core-private
diff --git a/examples/widgets/mainwindows/mainwindow/colorswatch.cpp b/examples/widgets/mainwindows/mainwindow/colorswatch.cpp
index d746bbe8d3..cd0543ecd9 100644
--- a/examples/widgets/mainwindows/mainwindow/colorswatch.cpp
+++ b/examples/widgets/mainwindows/mainwindow/colorswatch.cpp
@@ -468,11 +468,13 @@ void ColorSwatch::tabInto(QAction *action)
mainWindow->tabifyDockWidget(target, this);
}
+#ifndef QT_NO_CONTEXTMENU
void ColorSwatch::contextMenuEvent(QContextMenuEvent *event)
{
event->accept();
menu->exec(event->globalPos());
}
+#endif // QT_NO_CONTEXTMENU
void ColorSwatch::resizeEvent(QResizeEvent *e)
{
diff --git a/examples/widgets/mainwindows/mainwindow/colorswatch.h b/examples/widgets/mainwindows/mainwindow/colorswatch.h
index 8827a7dca7..251807d60f 100644
--- a/examples/widgets/mainwindows/mainwindow/colorswatch.h
+++ b/examples/widgets/mainwindows/mainwindow/colorswatch.h
@@ -51,7 +51,9 @@ public:
QMenu *colorSwatchMenu() const { return menu; }
protected:
+#ifndef QT_NO_CONTEXTMENU
void contextMenuEvent(QContextMenuEvent *event) Q_DECL_OVERRIDE;
+#endif // QT_NO_CONTEXTMENU
void resizeEvent(QResizeEvent *e) Q_DECL_OVERRIDE;
private slots:
diff --git a/examples/widgets/mainwindows/menus/mainwindow.cpp b/examples/widgets/mainwindows/menus/mainwindow.cpp
index d487e3a277..fb06bc8ad0 100644
--- a/examples/widgets/mainwindows/menus/mainwindow.cpp
+++ b/examples/widgets/mainwindows/menus/mainwindow.cpp
@@ -83,6 +83,7 @@ MainWindow::MainWindow()
//! [2]
//! [3]
+#ifndef QT_NO_CONTEXTMENU
void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{
QMenu menu(this);
@@ -91,6 +92,7 @@ void MainWindow::contextMenuEvent(QContextMenuEvent *event)
menu.addAction(pasteAct);
menu.exec(event->globalPos());
}
+#endif // QT_NO_CONTEXTMENU
//! [3]
void MainWindow::newFile()
diff --git a/examples/widgets/mainwindows/menus/mainwindow.h b/examples/widgets/mainwindows/menus/mainwindow.h
index 9710580819..57dd036767 100644
--- a/examples/widgets/mainwindows/menus/mainwindow.h
+++ b/examples/widgets/mainwindows/menus/mainwindow.h
@@ -59,7 +59,9 @@ public:
MainWindow();
protected:
+#ifndef QT_NO_CONTEXTMENU
void contextMenuEvent(QContextMenuEvent *event) Q_DECL_OVERRIDE;
+#endif // QT_NO_CONTEXTMENU
//! [0]
//! [1]
diff --git a/examples/widgets/tools/tools.pro b/examples/widgets/tools/tools.pro
index 282f8dedea..503efa8403 100644
--- a/examples/widgets/tools/tools.pro
+++ b/examples/widgets/tools/tools.pro
@@ -18,3 +18,11 @@ SUBDIRS = \
contains(DEFINES, QT_NO_TRANSLATION): SUBDIRS -= i18n
plugandpaint.depends = plugandpaintplugins
+
+load(qfeatures)
+contains(QT_DISABLED_FEATURES, library) {
+ SUBDIRS -= \
+ echoplugin \
+ plugandpaintplugins \
+ plugandpaint
+}
diff --git a/lib/fonts/DejaVuSans-Bold.ttf b/lib/fonts/DejaVuSans-Bold.ttf
deleted file mode 100644
index 040bb9d317..0000000000
--- a/lib/fonts/DejaVuSans-Bold.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/DejaVuSans-BoldOblique.ttf b/lib/fonts/DejaVuSans-BoldOblique.ttf
deleted file mode 100644
index d0fc12f08c..0000000000
--- a/lib/fonts/DejaVuSans-BoldOblique.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/DejaVuSans-Oblique.ttf b/lib/fonts/DejaVuSans-Oblique.ttf
deleted file mode 100644
index 19f9f749b9..0000000000
--- a/lib/fonts/DejaVuSans-Oblique.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/DejaVuSans.ttf b/lib/fonts/DejaVuSans.ttf
deleted file mode 100644
index 7e411a71be..0000000000
--- a/lib/fonts/DejaVuSans.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/DejaVuSansMono-Bold.ttf b/lib/fonts/DejaVuSansMono-Bold.ttf
deleted file mode 100644
index 86f9722627..0000000000
--- a/lib/fonts/DejaVuSansMono-Bold.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/DejaVuSansMono-BoldOblique.ttf b/lib/fonts/DejaVuSansMono-BoldOblique.ttf
deleted file mode 100644
index b1439380af..0000000000
--- a/lib/fonts/DejaVuSansMono-BoldOblique.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/DejaVuSansMono-Oblique.ttf b/lib/fonts/DejaVuSansMono-Oblique.ttf
deleted file mode 100644
index 81208a6cfd..0000000000
--- a/lib/fonts/DejaVuSansMono-Oblique.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/DejaVuSansMono.ttf b/lib/fonts/DejaVuSansMono.ttf
deleted file mode 100644
index 029fcac35f..0000000000
--- a/lib/fonts/DejaVuSansMono.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/DejaVuSerif-Bold.ttf b/lib/fonts/DejaVuSerif-Bold.ttf
deleted file mode 100644
index e7aeb9e851..0000000000
--- a/lib/fonts/DejaVuSerif-Bold.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/DejaVuSerif-BoldOblique.ttf b/lib/fonts/DejaVuSerif-BoldOblique.ttf
deleted file mode 100644
index a457fd82fb..0000000000
--- a/lib/fonts/DejaVuSerif-BoldOblique.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/DejaVuSerif-Oblique.ttf b/lib/fonts/DejaVuSerif-Oblique.ttf
deleted file mode 100644
index 887939c0e6..0000000000
--- a/lib/fonts/DejaVuSerif-Oblique.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/DejaVuSerif.ttf b/lib/fonts/DejaVuSerif.ttf
deleted file mode 100644
index 5d096d14a3..0000000000
--- a/lib/fonts/DejaVuSerif.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/README b/lib/fonts/README
deleted file mode 100644
index 076fc9c294..0000000000
--- a/lib/fonts/README
+++ /dev/null
@@ -1,21 +0,0 @@
-Copyright statements and the source of the qpf fonts are located in ../../src/3rdparty/fonts
-
-The fonts here are in various formats:
-
- *.ttf - TrueType fonts, requires QT_FEATURE_TRUETYPE
- *.pfa - PostScript fonts, used as source material for some QPF fonts
- *.qpf - Qt prerendered fonts (QPF format) rendered from above fonts.
-
-QPF is the portable, endian-independent format used by Qt/Embedded 2.x and 3.x.
-
-The prerendered fonts are generated from various sources:
-
- fixed* - Fixed font.
- helvetica* - Helvetica BDF format font distributed with X11
- - Latin-1 characters (about 250 characters).
- japanese* - Helvetica BDF format font distributed with X11
- - ISO 10646-1 encoding.
- micro* - Micro font (see micro.bdf).
- unifont* - Unifont (see unifont.bdf)
- - full unicode range (about 50000 characters).
-
diff --git a/lib/fonts/UTBI____.pfa b/lib/fonts/UTBI____.pfa
deleted file mode 100644
index a4fda2e997..0000000000
--- a/lib/fonts/UTBI____.pfa
+++ /dev/null
@@ -1,1172 +0,0 @@
-%!PS-AdobeFont-1.0: Utopia-BoldItalic 001.001
-%%CreationDate: Wed Oct 2 18:45:57 1991
-%%VMusage: 34429 41321
-%% Utopia is a registered trademark of Adobe Systems Incorporated.
-11 dict begin
-/FontInfo 10 dict dup begin
-/version (001.001) readonly def
-/Notice (Copyright (c) 1989, 1991 Adobe Systems Incorporated. All Rights Reserved.Utopia is a registered trademark of Adobe Systems Incorporated.) readonly def
-/FullName (Utopia Bold Italic) readonly def
-/FamilyName (Utopia) readonly def
-/Weight (Bold) readonly def
-/ItalicAngle -13 def
-/isFixedPitch false def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /Utopia-BoldItalic def
-/Encoding StandardEncoding def
-/PaintType 0 def
-/FontType 1 def
-/FontMatrix [0.001 0 0 0.001 0 0] readonly def
-/UniqueID 36546 def
-/FontBBox{-141 -250 1297 916}readonly def
-currentdict end
-currentfile eexec
-f9d13ed4c538ee56ca0c8979e615439db5863a5292e578086555752cf04323b5
-761364ec433e576f108b1bff6c56d0f56331bc1243c31feb9985de983b0b3300
-e35eaa63cb5ef5a522d2e2731f37eef0cc62a540af58c4780559b4a0499bd168
-7642677ef167669aa264d68a8ef6da7425b771d48260108ab87a077560b2ebc7
-dafcace10cee472c35746fc11d5304e441fa0678decc0652588a56cef7c28ba5
-5cbd94a7acac9a06942a82d6abc1ed45ef21f4f3f5f61d0002340725ba15b9b3
-0b9992741770f020ec318f514874b6abdb27c3f0dee979cce17199b9f3ecb0f0
-709736e55bc48c55ebc8f7259d9e0ba13b46c2983c6e8265633d11358057019a
-9bc40f9ef8830b5cf7022bc19c01160d17df4ab51d113cd49bde4d1e3b5f8ba2
-7d179464b8fa28e12092267d5c70cc341eb3ed0eec08b343175d5458311a7404
-a9463d728eda1642be73366ec57a705501aa054b60b04983e30b9987bdbd1c69
-95ef18d327beb2f2086a2245602495ccb7851bcc5eb302b980ada64a262c562f
-6b2748b8f7dc4a0a06c69a7231fd40568bb236b33f33ac04f1d2f91573f60470
-599ca51abce802711c7fbd95247ec33fba3a393195a5cd54622434e668d1e63a
-a39a51699962bfcc4774228ebdb0b01f29b430434d8023331bd1b6b2c76e43df
-b3c68753c55075856e9ea0f5c7d60f510bc115bb70e0a8eb9998d3f32a0b72d3
-ab524841ef36b198e3ae58129ca64e005f776a0676dcef57e7961dd2b948c2da
-f392cba950f1101a7bba99952251c82ab5d0eb5ecd8af07973eeafcb3e0b5f2a
-3b6c8852ea072b9787fb945cb7cc7a2acebe92a5458e7dab5ea2551a61a55068
-d7023b6193c750e32502fe1e1d8e8d497453fff493caaed83c410eef050c30c6
-e38339831517101b07fc15d5f63470a9863bbfee0c0002695669900aa70a18f7
-a87f1b0b83494c39c3c90a8313060204d19553e2d66419e7b002b25108ba00ff
-a7e60c68b73c53f306e112ecba3b64d35caf59f11a41ae76aa2fb4882ffffb96
-400c2b6b0051c90d7279ffd0df3a6ba63daf802888bb6b98db281b89734b6e2c
-9ebd473352b36e11b5c3f3c7ecb22095b7aae220fbc89cf6036fa963530b8a01
-1cb06875ceaa143eacdbf1015631e8858bfe5917e01737ec6c840fa7097a42f1
-15884772664b9665e5575dc3003914643d34f329b9cd12b1012e93133a27d139
-ebcf7f9b68dc21575f3ef070ef94d4f3f9ea0d3ab4a75e6ec849a4630f4f13f5
-0883dd86a9903613ecf36ed6ab7294afdc167e0eda4b1944870a2f99ae8a22c8
-1b711d1eeefd489009b86f08078f4510c6846b17ae72c87dc51d0433ed9cb40f
-197db7e3c2ef41f077481b3d194aa3284d5400681001e0531348b91cb957c396
-5611aab14b92dbb110db950073dcaf69d6454588bf63c477112c38ac578b0ddb
-18fbf7f0d44138c4721743fc05cbef7cc3c684328df7c4bbc17afd9084bafec9
-99b4b8304cfd2d604e31d96c466466cebb6ef3a2236498e31b3c8dd8f15c1ec1
-c67d2b6472c3dce8f613c8a206e5dbca88b03ea931fdbb7e2d19625d4aa0d800
-b2eb953de5ae22b2478432710ad8efc57558171c332f6b27a2cac9145badf751
-9cf4987b853ed30d3a726039a83158c03a0f457dfc9a81e78d909f070e8d47e0
-252b72d03d049ed6349c752a01b92072a2c8f6c50ae85d6a5469eedab2e0a5f2
-6e502cf72a76706ecaaf7a590105feb6f0c1f52a820369fe3b903b08ec602ab6
-882e1ea21007443e2460e29de7fc07fa72bf89c145b04be55df48c0ae5ba1bcc
-c84bbf0a2de650ded51dbb240dadc2faf3a2fd0fa8749f0b1e372c579f905148
-706e910cd5578d06c8018e3ff8b88af6002c549b87a9fe2b1f804e95921ef83a
-2810e015e315d55496eec2bd16e0b71e4d7004dfbaab8a5d651c4446e343e382
-8204f6e7b4cababa6aed624942902c65899615d858ca24fe6c91a41d087fd647
-e50c52850049c81a5dd9447761b3a308df7403fa4f8669df366d3e114628858d
-17ba68a92fed47c199d1f7d415c8315d30b394177b161fa487225c38e0b9d9c7
-ab236e90e926614f9fbdb3bc081e948319ec3871fd37193f0889ecf2c47841c0
-666b272328bbd281f719181b4e509c01ce80afe08f6244ecbfc136f8edaccf79
-36399e63e5982d27fbdaffab086e1e064c84cd97d4eef959aa3a452e065618f6
-b549e3fe7207bcdf85ec1917612c098236b9124d6f1c037bd0656777dfee995d
-5d125d678fa7ac5c995515e952194f9620579316eb0f0ad55930ac82fa773159
-c1ac7f4b072f06baef03ee07c23fcb4ad8072503469a8e4eda4cf143c7a68d27
-bbf01668c0abf4950277c195fa1cba7297a2e863299e195c6684f2a076427e5a
-a2f308fcfb1dc11d14bcc8a4a59611eb8bfcbfcd73e963d69c82fcd95e989ff5
-ed486f9809d3f9e1a0ddfb573b37d1d3d57e0fa4594f66ac56fe16168a472552
-eca179c7ad26be24e9afb1a759b73de53e9f7075b7ce0ab8bc8e30ec6d68aa42
-a84b36f2c4e4afa9e59c6dfa9af97a93b2cbd9ba786fff8d8b60305b608bfc36
-83c2c94dac72000fa51ff15739975e9ec0185f3b7cd805e67b5ff91fabfa648d
-81e0beddecb47dbbad28a99acc3074f1c248b2231be3fb01b331e90a1bc723e2
-8a0b2e99f2defe00a0b33c13f0a6a37717089fb28b7c58daf478e877e4bcb73d
-54b358c509a630d73938bca5126547c94f88c97cedd1c65a3d514b3ab86a489c
-317554f67e1aecc75e3c71cd37f268999f17fb649cc52ce4ada26d2d4ff1c248
-e9e4f6f5ccb85aa64e90f371cb94da1ecf5b995ded0fa6771e3f874ef449186b
-4b78c298d5c24e5127532b67c9479f70c3703ab7800ba8ecbca511703d6a1733
-7f2edbaa61171f00f01debc6eba2094465e248cc8262bd35cab622443a1be5c2
-8e6318e4f3b7131045b8f676e2086f0432f51983c74fea25cd5aad0797a4cb5c
-6503695292d798c755170f0ae137674d25759bbd89cf4fe0917e32999b4a04a3
-655ea871b30e22b0ee39f29f7915fa3dbac0d01c55a454728869501335f97e3d
-24b17ab7ea28784b6f8c9e0b72b38f64e0fdb578eecaa5590c20a1d17ebd4ec4
-1632b40553aa80fced6d88079eee8097a410a29b549a0bb3b6fec526caa745a7
-202eabbe2cf3f1262db3e6e309e0afc3d9c808fced17b05c320945fdf0a05459
-ea7ba64fc4112fa68eb4887bc845e63a598e2d31df0ab0d64155e631e3ab4621
-744da7c3da19a2e66ed2bf759505e0cfb47a76a81ed7242cc29c7383989afc30
-df86c4b38be0a5c8b360f586f463e53d6684584a3a5fc75495200fc707cd1981
-1a0fbcc0fa784b02140158ef0913170979c4fe96f3fdeb414cad01b38d2b5934
-0b21cf14a28c24a583472ae3cd667ab094e56744c6b35ab7870ee5b0aa22a70d
-dc68afd34b44e45275ca8d12747dc6fef76b826f1dcd70a5a30537e096935f7d
-ba37414aa1f0111cf7a1844c5e2b3f63764458ce9e113d06cc844bead4d22109
-069b5174e0ba5aabef78dea7e384369de2e4142bfe6521efadfe67aa41fd7bf5
-52ff016ad8d6314b4285e129ebbdbfd3c6e3383906248f0ce045ad370b0f90f2
-a832944cbd59bc7cf15a9c17ee0fa0bbe12f2304fd6a9f56cbd65e7cc91ed860
-7d09e58934079a74d02c1b25b958567133657dc028148e9f13a0ff6db812422b
-6c7cfe064a171b4fc5e1764000d4a761d1c476aeb59a45f7b64ba1c8623b1423
-91d79d124b8506eaf94ef8fd28b5fa6ca6aa5677ffe979dd3d75f540d577ea8f
-9cc95f5b41942294df812c4d4aa4ee701f654be2c00440ba575c5512bb5c196b
-3ad24366514f2b4ea4ab0c35927517bfe166c261c0c7f9b73ab0c52ed0da3696
-628a1f230e48cdaf2ae53000dbb2ee3fe17b9785faf74baec7caadb23fe6e329
-b2b908bae996af74097cdb6e280b5d5c2783b33ba106d6f458179822af89ee24
-f99514605cb4e232b62d92014636841a991b3790ae7478d020d6513e70244034
-dec5f2106a1820acac4b7e091dce521896f25dcfaf58a521ecb5d26ae3b8bed6
-c61c3c25d09d159d5ef58e253dc0f9817fbb469e44eed683ffecb08689e66108
-ce6f93327a5ade948640d0e9347b113d846846fae982687d95b66d6a75ffe876
-a2c50ce60e3f7953d9dd5a9f5d65b1105a7849d734336804de32576e81abd201
-4aff1a36aae15c725df295daaf26238b21c6d288450aa4d94e26ce6a1de7f096
-5838c195a97ddeb019500e8fb95e8b48190b020cbf0582a99df66b7192b67448
-c1695882808efb39a3c54fa42c183f65492f9d0cccd832b5590a6c4cf18e8d2a
-e9f50100f197818f192c39d4204b6dab711c2f8cb53e5ef002719755cfee11e4
-f1ca77783034901fa2da7f82254d1184f2f724e36be731fe923c99d444407539
-3000ceb19548d5c11d7aab1e13917ea4391ac626e02bd7a1960bcdf24e048f46
-76fc3cb4031811d94f83a0c23b309cc9a537b599c174dc862429bba8b94e7e56
-56682c13bc4deb402af2334993c66d6ef48cebcf6dcc924a2a1615ee92edb7bd
-221fd3204d9dfc6b2abe84d5b47a9d03227a4c015204af7dc5f937adc8c60de9
-feb1c1c722a911b2a5f186478ad7540ff28f7cbc82d85e461c740e8aa51c16d8
-8f939075b78f8a097f647de080dadd87dd5a4107ae7cbc25a7964e5e8e0aff10
-1f17185e95a7c432c76f5fba2138ee76b7ec76c691df228099c0de7107aa0f5b
-523209576c023ed23e9ea9047d1def8175e515bd1ee133167f0f92fc87732091
-4be8e6a04a796e5affd91f2e0bfb1b47d960228b970cae0824b32f602504cb12
-9f29f933e538a01fc231eedadd0bea5523ce4acd3ca5d512aeffd4bd91adc088
-47e520f07aa173dc6d1dcda5c7a20a1cbb399d7a11694bd2c959d2546d5cd1b9
-b7afba473e7c9f0492c2d4b4ed1204d6f633a431d83b813b5ec5ecbe41b6c8ac
-003fbe65fee1581fb80c2f4c691f9e8a33630940b198deba7491d83421017409
-6dd46e914bf82841e2377e57cf81c0f03db26133519f638d0b6422585af7f7f2
-589aed2dfd15c02f83bb6fbac42b4fe85e14256c5b5f6e7a287953a4f96a0c6c
-562b87ff8a8ddf922571aedf6898faf7f9327f92a6f736546c5699aefc4cd1ba
-b403a43f8464b215993ef53d2d9186ab1218f7e1f2ccf589ee0a52096a153ac5
-e328654465f3f734fb590ed232399f9f6dcfdfe7f702b4ed829e444ad685b1e0
-d0764217ae144e4af82554faf6d013be83816ab94a6b175905916bea3c053fdf
-8d033e48ce7e6a7338fdebdf9cd047624cfcf3be1aa133690eed083e28939707
-778274ae874e906f972080d9dd453ff5039cd351776a1ed52d3e4a8fbc749f9c
-588478826593e0e8625b013ff1469bf76aef8ae06a63ebbda3176d517a7cc32d
-ad93a096258b227102b2b748359ff2e70a438709eb5f1b60be92f7a6c8f92372
-c3b9a58ee0934083f2300c6423250c00ecc2cfc67a6be83450eeaeca993fd695
-939e47e7c7d28f9db30e2a82ad4895092a1a5a734f1727b4734a14743ee1c9dc
-851c9463451042f28a519e8c532e16c6a7f65a11286b85d48ee3bd6f09caf327
-cd87df6f40cc9ed5784744408da6a2e65cdbc6838812b2da414fcf7a33ebe676
-d381f7cb0bc1d84273b03240fd3eacfab2693d04abe2a89f6d884fc1ba2c0c6b
-183916096f98f062bbe990f87a9d74d275f18d5d97e9eff897b99fd5e5f2353e
-16fe417e644364017a1f014cd0ea62ad0a684fcb1f7a4969bb2d0119d3021ea6
-91ad90564b7cd59c03662d4809943ac3c0316c45b3e6576a9cac3f549f04a9cf
-b21aa641eeced2af9c0e9944bcd355444f1ef2dd626d94d65c1e00b208f06fd7
-526f73917bfebde0538984edc704fb56a92f429f2b3ccd2324926605ffb9e06c
-e3f9435778a9972bc1d9511b1c9e013c9232cfa8fa03b8076de78144e24583da
-ce13c107390a4b4a66fcf41d02c7ea3889fcf648bd9b202a77ee0debb98745c9
-b424aa89f8028129fea8293f44efdfea96ca75d1462715087baceb18506124ad
-843bf5b5eb3044665921c1e711ae61d7ea772773f99f7aee6de71fcd8c5c2c9a
-4e5d5a1f02ba9ad0e31ac0673594882b491d8dcc9b7c4d8bf806845cb7e7b054
-e073b9379f6f7b756786174fdf25b080adf0cb4645dd8fe1b4cb5377195bbbc8
-88e09bf98c82e523794bc350fa0fa12413dbffc006a66c47c402b78164fd9234
-b9fae67432f7a9423ee7569d3e6bb293cc0a095f3c5a0abb6a2c52a0c4dccddf
-54dccede5914afbb9bce717409060d5772bf6c19ec65700c6395884b3da5bd6c
-d81daba48977e3af9653875148fe7ddab905a0cf6c5352a468c36ad2bd09d897
-2d54f62bf9af9688c1454b67f24b5cbe39e9c069d6b5429ab9e8b2117c0b09eb
-7f877d667af2af4c06339230c2e2d082f389d7006f8bacf00bcef8b652a8f1a7
-e210e7facbe69f8b0cebc21b6cb559ce9f6d8e1b0546870d773f6335426b6978
-60bfe9e2c6cfd1206ff1fa27cadbdd58c4c2368e95e17bda712c4feb1e89c63c
-45c0cc72dac845d10847408dfc7dd390ea0c50fbf3012939372707be42c88a8b
-025a77150be73e08e73fa1e15fb39d985d5e6666d2a4f77f947eb1b2228ef0e4
-bdb7f767621b7edf5b863d44c09a02b08a41a3feeb239ec9e022d0d8c2fbe939
-fc242a923b082a3035a23c0ae48dae76b4c2147a7f8126ab66dfbb8c892d858a
-48f8b65eb85d3216b8c156ee4005045697a11f0f349d05620b1c0d41575c11bd
-e8165d443d4e836d4b4b2fc028e3ee7eb995115de8bb5b58d7575a260c8ebb93
-cc5d43766f56ce454dff93669f41be40953c42ffcc98a89e9f6ab320f7688083
-32a48d4ff8eb88c84c7e0cbb9e031ac71c53873da074cd4112dc30b4f27c163c
-0d6371b35d0571dbc1b80f5101c90d4745e978091c4c8b2bfe8aa23db4979a9f
-143dba6c041772bfdda2077985fe5da829d9de5d8c5c9d02175f65e23495756e
-2ba67a1f46d862bb76a4f330c66adc2df5303b34ca0e705f28a97e2782105359
-3ade715c3f7eea39e401af757229bd314b886dda55f418b3a67657d199cdc8b4
-d05a5b7aaf37b53e1c5707fe5454d512c954b6887731d2626499cccd6e80b1cf
-9b3116814c0f7705d53b402fc4e9b6307b22941daa12d9c66849165e8de01e0b
-20c33b1b503c6ac7995d4bda83da72dee3b177389d500061e16c6decd05bd391
-1e2d1727b5436aa550e1bd505e91ce0efcea62d9fcaebc098880180caa252f6a
-667c75a3185f62caa0c28763104f57e93fba3a396d7015b3a55161401970668c
-7e6ed168f6e0f1029216c27c33544cc77111b2ef2b1538f1e89397a2e78f0319
-28e948640198d7d2b5684f9566b5e70988c2516a81623a6fba82c1554f3a8a85
-98c1efd626eea0ea586cea3b1f6b62f97b1ea416332ae107f0f174ebde1f84b7
-4af56a9495913e0e84ed0d8702ebe1c699f8e8f056de6e7728023e6fe0dc68cc
-aa76c3e2aac6eb5f5ee502c1098db8033c4432fd0c6f62aadb989954d81e4247
-6efe3ddfef52cb066d3da1811e1bf13a9da68d77b3d88ae4b5e0ec252a992b2b
-dd6b487458694df4bb1f300f88f6891f2033dfd4ed6eb147315ea84efef20c16
-3b2acdbd1a6812ebfa51f69413d1750c60d374839d46400b9563daea410e4bb6
-4231cc49a6db6f9acad1bd930faa27bc25e636deef091d07ee8c405eacf00d37
-a67027a49443231fb38cf74b4afe723353838866c9d56c2218507344cfe23e85
-264ec426283982e0e299b8557f37010c921d4b1e92b1997498426d3690408685
-5e0ab86ffb4c74192269197dad437aafdfc98809cc865a72f397901a02e22f97
-f035deb4063864798cbbdca6adfdd2e1f644c299d5acaa8b0ebf0102cdc1e478
-77179fd1e5c69595485ce83dd18e3a154e8f6bf6aad3752f209ad3e561cb2400
-0959f964e853ec9cde9deea9278c5988db3f026a6120e0020438f44066d270f4
-af05c4d6568fa3b288c0443be3cc406b6ea555ba97b9fae56c2b7e75263397c4
-f247bee72066fc445c158297eab5151852dc2c32306794b7be0a5f23c22f76f8
-4c80909a303d6d29d808a606b8c0739e69d715778ae843c033bcc8065ce83795
-f3d5b1a403aecd1ce8db79b148946d9f96673b51840fe073065a7da8cf8a8e98
-0e70984d88ef691e21a7f3b52c2a455286d80e3831ef4b7119459970a77e2bfb
-1b2e12a6e2cd4e02d80cdf90fc00a1fbcb42817660487d5fadefde0278d4fcad
-98fe39b3827b681d4427fe992adae296946720129777c73d954e1f91dfe80130
-362fd97c8a7f693b73ebe45155434eb078fc66adde8f9217583680f5e0c9f80e
-c413226de65a1e06fd6bb4a4870e8702d2d77eeafc0ea5634272f19f31a6ea21
-b51de45449e89807b18588c9a43524713c31f27be41941c32da7c5cb636c5e1d
-0ef69e2ef2c18ab0746cb2d19980fbdcf9691c1d74606830522219310193b32e
-f886e8f200135b55e178d832f0416de4b86e2fb4eb8731337efccf833c044446
-1ab477118d9b6d53ebf5c42e46ed8e5d0181eef7a15145d5a51d7a1b8f82189a
-f6ccde81e2f1da5a0e419838b90adc945a7e74a2132aa57807fe6107caff8296
-aca45bdc7366cf3b738cf402674c2c2ef0954ccdf7c7df0377641e9ffa12a165
-725cc7bca1a0d38dbabd6982b2f1c432454919fb58876f7854ec713ebf05e0e7
-01d1135f89b31ffa94413f30f72527de872418559c07c8a87556fb558bbd7726
-aa9cfb99d41a7ddbc8d5e4f8aaf20619b2dfdc18ed319b958b5812867e5f4442
-fc670f55f78be8ec1c3ed00fa36cbd52c5c15d45a5c77746de5aaadbce70eb29
-05c3972ddd7e2c220ba4137a5a6aa178af65fd65f225393a08197057d5dd407e
-9c238702425991496f7c7c91754399ff3be95c95704f26de0cf99aabc5786994
-9b727f5cd72f4428908b95f1b879c2366ebc061ad4ef68ccd4f957cc76594d88
-dbea7f48b814a94be79e2cebf4de7d2f6b2fa680baab5196b132c5970d035801
-e021704e10823478c68b4f791e63cf7d9725088a6fc2279e1d09a68b04f31901
-7bfdf33caf58ef856a1aaa0793d327c91a2224e7239c211f1210ab11cab44b93
-0ac2b75868db9a0faca784a130fdf9f47cc09d44f9bc9f697f698d2da440441c
-1adf05c77b768535ec2dd30b9897c52b1e28d081f1dde26d5e8438c405277c2c
-2291b1911cbd914a714159a957e0b436583b1d90cd36c7ba1b6e1041c8eb3996
-dd2715fc01e9a82bd1590cb4ad8fbbdac9410beda818b81260a3a8742c137f6d
-175fa8bf26d648c991fe684e0e1469900ed0a53b7d44e35e63c7e1fd0b5aacbf
-5e9b854f302f3ee9c7620f5c9e2a5446f7653446f0bdc192a34e23654830e5d1
-52bf36fc02c220ac72569f80795ee9271fa89b438a8fa4de0a3fef6de60310e0
-77bb99f86ae3e0824c593cb2d0387faf97b3612131a2b0edbbc79a4444acd77a
-53ec23d447610ad92120f7702df3c0955e5870e1ede213b5edcfe5c0405538bd
-6d1a06aa55a8afa73fb82a29c6eba9adb721473d0756c31e77a4012d10dab6e5
-80c90caae60c3ea5a846f74536079bd790979059936c7e879eb79905e3b67b3f
-ace6bd0a20a8afbf1034dff455f130347f54b6f7862a772f0afd46f3601349e8
-9d1caf04d0598df4cdb164190614aaa872036855c02c3c92374a3baf5453baec
-0c0d2d89d79fd0452babb562e925422d17e888a9350fa50d9b34bd119618a1a3
-50f9059f36ffc5adb1f29923af100fadb5d32aa948ae738d53ba04c44c3afb82
-e935f0ccf3a7903ee5f939f10d3668c672b75e90777354d1429453010e4f72ac
-23bb5cd7ddb1712a6851c033bfc10470f8ae87308777dc1d69a1b95e0ab1a655
-e46f843d3c4bbf2714177d4c83747f918884d366dad7705e4668087eb0d13548
-2d3c35939ad5402b94d3fd7f2bdceb0ec55ec0fde7fe7a555ab921dac698917a
-fc4bd079834d26e0b1d4020bb50588e961658935079e8b542f927ec7a7e0ccfc
-d03a7bff24ddedd6d7df33c3507c449067e548b0db1a42baa9e3b1d0528298ce
-981f8e35b10b00f69c92390e4aa06d2b3374e868b4ee0cf0ee5f59f1c734550f
-640bd5eeeddf30a340558a831b9e39bff15b35649a22b23b8f39d0d473a07be8
-0c757d16f7738a0190178de0e5509ad9fe624499d7464c43833515c9a5841c1b
-e704c88e2df4508101dbb7330ab3dd863f544294887e6ad56bdf15800ae7a0d8
-e523cc1bd1f9424576492b11b41ccbdf5daaf31e3278b3d1c9160c9310f604be
-1e869ce18ea776bd3ad33ad41dbc5b3a0acce72033b37aaa5fd6854d0f2faf59
-d2e674cf97ed09c3ec2f7a02657bc036f78c29e25284c7caa6e480beec4772ff
-09b02feed2cf374a02b43f653c1d095d21cccefd30d2049c50327fc38bf44e61
-1e5afc9d29d37fc5c22f62b927fd2c5720a8025194734d8d361bd63745781d3c
-996f448dd51f345442f1738ef8915a69bced678b6dc75ce6d77c44464d4e3c23
-0f90600074b5d31a870ccb24ccca94e8597177d51f85f9079d3de3ea0978a8fe
-f94346f14cc5dca7c6476dd60ee8a7f402e498d91f4c3b8071f5238bf16e8909
-0c0d2b246fd6ac9bdff3ec3633c6d90dc5ae76e353293823b20abdaae12a66f5
-19637c1e69ddfd24df8a76807c441732f3bc7d334bdf5cd5eca5b3ef88798b59
-6f0eee2d147dd35f57c4a776a9c89eb781acc56491e6adf40b94df9e8953df54
-ebff8faa7bc3128a375ee91a17ef4e6ac5fbd17f84db3bcb2ac0468efcf8575f
-b51865ed827e1dae4a3b601239519fc552e9959875285d9f688b1f4da4a62ffb
-b166645fcc7e587fa82d02f8ea43049f9c589a3b570c16aa3d37f34f999c4f13
-ef852c19789834269ecdc91433b6351f1936b24fda2c6614a467855679c50162
-fb62daa72b9b971511e81c8dc7305e90cfad4950bc2dcfee8f1ad6f30c2133cf
-c117dacb41836efe6d5ddb09b6948475c21a7c7e0b843820564b7f4375b43c09
-a07632390ba4fb796e2ff6b45a0584f763873e6a36768ef958c306fdb23607ba
-73cfc5d53a282585b9c7c97e8b59ceeb43360107efd16c2d54f825fc77e4eeed
-50c040e210a2be8034648a0cd886e2720b8d939ef7c94df36bec7ceb983e7157
-5d8c7d688fdbea4c23b8bdca5e5719ad6bbd1384032235ab03d05af8e86b2e01
-2f6ba96703f6d2e4a014c3de80067fd3fd665ed1c64c3362f254e3c7fba06800
-389cbf12c7b229b66b2df82a823765b41235e31a1e348cf57da0e304fca82b44
-0b2af48040f04750d7df18ebf95da0101b418c3820e161be149a3459e1c39758
-e8063dd0fce331702e9f7be3d10da99033bf2c90a1a24ebc48cc276d78f61cc2
-a6721f3ec1d48d86b54f8eb88b9ef248ee50896901be472b8196f52289869d9a
-a656932d4872bab54cfde6eb67537c70078bb808bdd52f4d4b99f4d3a3d7fa4a
-ee72b2b5202983641496ab3cd44434d44062db39d6c3e8b60ac6f73ab9b101a3
-2d687ab24b84e27043126bf4eee162f2cbea040586f49fd91b5d4069704bb9d6
-9ea28a6c20643c3f92f648b38273abb8bd944e7edabfd4e3085056f4b29fbe1f
-ff5ec131de60fa61812a8ab0d3673272309e36f6a1bd1552a3c41af2a2228f85
-f3809d222aec8eedcb4baf373f37d2a5de8ecc62ea37b335b81005f8e92f27fa
-6b2397952bbbe44fe9a3213c33e368d9dc37465e84f538d969f97d55b31956ae
-7d8522a5ee6d6fdcef2cb6ecb636de6ee1b2e7b44530166f7b2eb278a0892504
-30cd9e39ad1d38748ccef3f201330fc43f12f6581162775064b6275c6959ad21
-b5486b450d8581de96291f870ed3768da5833520cc36c14b31a90232d1d1cb03
-de7f8f0a506c979b765205d82b518a8ddf6e3e494b4217e47c5dd770c51e47f8
-106f23e7e9c0c4c9b2bdbba64bef04c5acbcf437db53d1c47fcde3bf88d58f23
-fa8a8c482b5d45c78985e7e850b676d773a4ad42bea32e3090403c01c1532a7f
-ec6e008ca9911f15319bb2708a57499e19b3482537ac0bcfe8a2dd398b0ad1a3
-a4f9812a66e9b82b095da83a9925c4e9128ad159dfb674cef7090c06626853c9
-0f5d64f662ce69cb135a4ed6eab6f69df2f376f1e3ea47a1903d066441d157f8
-858848b89aa4634011799b26842adc6981686381638e9d7e2c6c8ca22e8cb9ba
-d86986aa0300a224d2d0bc6fd227fd557de7da66c301e4cac1aae538c62697b0
-b2258394e0af0333ef56007b98b436dde0d40937923c9c72ad3e3fc7b39d1c70
-2851b4dde84e697f7983d5f71089c3f94abe8ea47392800d7300f4576e9498a4
-20b537ff69231fe3643209c59c485471b2cfa89aec05e50b2ab081eefc80e1f2
-b08f772631c8c649497745610363246af135e2c3231b64be0d5db3789aa6a000
-f27ede24cbc19346557465818d4bf4c4286e08840f030dddf30bb175e81482a6
-bdbdd5c83a361a28b8ea5654a9066b5c8cfc8f5d4380cae506d6a61cf0ad481e
-832e08f17bd9bf87749ef53d858b2a9eeab8d7be7e259bf110c4e3313d6ea87c
-1ae3664089e4af8160d334fb3c3005de0d5037211f888ac0d959dad0a586b61c
-0dddb0be9c5110479f5b0674d00f0e54ca7f642b62b32593779591b4dc119a25
-1e8fb9c40b68ecc9e5a08e63bae86aa52235dea3902f3c355fc1ae6b8c79644c
-01a54c68fcbcf46ebfdf0a54eedeafd5d1120bf228ef499913b4426ba7dba017
-75d6e240dcb7d41352b5cb624bafd11fa37fde8b4d4fed2c106a34d8325fc31a
-b86701cc72fc1e8db68a1508337947352c46d46d4393384cfef2c9e9e9d6d877
-f13780441ed70e86aee02516ee87bf567857f6af21aeb625ac3e30fb1b873bb2
-862a5ba6c7a6f30dba14fea378a41d38116214c999ab4666e48ce091751ce700
-62bd9e47351e9458e355e08bdf9f38ce3f52993df8d6893bdfa29813fafcefd2
-217b481c1100b8db69b9f3a2169c2a66300af2099a9acecbc542f140ad5d3a64
-6a1d818b0cfad8cd8b4b8a3f8e8ffddc03ba62a624e72df170b65fafed325883
-feb1bd45e3865043bb008d3055c08a3e4c95734db50f983f3ce6b6fb9367104e
-c44b96c80b2fff43285967667a3edfd341ce587b212e12b2fcf156f03b0848b9
-3545bf50fe4ba75c13529ee16857d317ae98a934a369b83db5f6039b72bc09be
-6d14c88a6e2c77543796939789252b70f51fa37a69b08551be5416fe8c785110
-30264f52592909c8e7f81f54f1b37c2b488f088e85994336c7a075779b168464
-fb37e8f7085f8fbeee68fb68ca9fb2986a53878454d72a3ead0b5b2ed507528a
-ff6aa53b238380d6f0e59e991f4092d68e2001c0e6d945b810141d3d1bbb7405
-46d378af9ba3fefd4d44f6caf78b74450a0e230431a5c46e79c222c3767c4132
-90cb9f75baea5d1bbd25a718e8cbbe551441b642f10173e90aaa9b2cd6301332
-0ced79e66e38e8dd290bf36fe33244548216916fad18f20da7b73e31838930c7
-f4a9c44b3207eeb6c103f633f3fc8b2b74fb04a072fbc156089ee3f7351ef196
-f365dd43088f4d4a280be7e81fe73293912000e3e5f493dc4bfc275b5b8a8796
-bdbd266090733ba17e45239f7c0dfb4153be451a8560de6551202f700efafa6d
-2bdaac1ba9c8f6e084e4b273fb8c501f336b005cab01ffd38cb6d27941096f75
-db1721eeaec315842dc7938dfa1b9e530b285604ec2c6982389e6c22fbb126c1
-e6a21916e06ee778b51fd72db2dcc11d878f21276a00bae3cf3ad0999c64d007
-f909d0ee79251810c64c4d05a2a759ef0837cf5563a8765817003dac3aa1bd1e
-7e3b868307e2d1ccc93b1a5a0a4cc32b4eb6961f71750644fde26dc7b01a66dc
-667005b396bb597d1eaeaa55b46506d447449497d29872485b31207e460df2b8
-c5b181459bc68b686182f1b6e164a825199c3ee24c1bd6a1dca450ca1a3fde70
-2d2e89bf6d8b98e4c4f25284b667cec77677be9046ede444a1b93b3b03db6aea
-f89aa0759cc8aa7f10a2c4b36f63487f59bfd6e3a2025f26c346847fc257741b
-629a3f662e3bda8c3c010c5dc1838afd26f875a56fd6042aebe1dbf119cfd387
-477d713cdda669f61ec1070705382520548a94749711144d8311df5db319ec0a
-033f2d5c4c639b5af42549b1bcfd95afa55994389ca8a66b64c28520f821c808
-4ae9dcc9d6020aa6b1f93de064318e5e464e8808bdf0ac519653752e612c9149
-6e3c8e61434d012a5e4537465cb678b6e9a9005f5039e415dd2872ff0985439d
-12d524a4f34c520aeecdc4d96383e1edd0059943d59d47880f51729e54a68a98
-a03fd6ba4ecb567c47422e04966c4655f9bb6f74f2b82d4d3ded42a42e90157c
-6639f18ecae1cdc636bd616b60218d1b6f8294ecd09a88fc5928c37c9304d7b9
-5bc609286a3524fcfb9e406f636bf1b40573225e658543c29be863964556b622
-da308dcbb6516c88155f6d9b8ae4fe34b17374d46dc560809fccb19e87f7fede
-beaece1ec0f41102b99ba6c4de9dd105dc5d90b6d3b392040273e0703b204d26
-89d1a340d0d32d6e201b91244e07ebbaae8b4c877a213ceb2f1b1d3ca07880ec
-3f4817c00d48a06102352ef4de3440699cfd69ffaddfd1b90edb42034e5b8e3b
-c42fa37c38d563554f8d5b96956879b63866e552fb931c6462b934dd0454dd9f
-965055bb3e969b0063dfd2bc299df5552d8edb68b6530673fc08f3a0bb96557f
-13b068d62dd8b42060e67d2584b4e6fb97e9dc7439f5c1d23c6a324e72062395
-6305ab4be3a430141d8e615b9f59c3a3eb2b1267ede3987cefcc1419a9f6de7d
-d73ff35749b44018da9e79aadebafd0495ee9e29ae4fc7e420d86572f735134a
-f54e8f853b764c6e0319f720e8350110c1b300290c8bf8fa4cd3be47533482d1
-53553691ebcdfb46c6879347e3573c318195bc13ea1c732d8d0e7567eb655b22
-1960e8476188532af8af85f7ed7d399ce2ced204894be3a592ffbccbd831f027
-7ae604851702b50c4ef6482c78c77c7959869e83001f7f8f93bb3b8be70d587d
-9e5cae3aeccfb455463adef4038ccb6eb8447a7e1992929f5ff7f8e6f37d4a11
-d5815c2ae35f90d3708f3e2a166953d9823846d87d2e7a7419abc47f4044c8bb
-a9129cbda3c7fef7725b481fbfab1ec2b3700b3b3780ce5e711663557e873531
-72c3bf0ea8ba03a66c5033602f12cd8aeb3c5cd0e0abd65c936cd7d973e8d3d7
-c5d09bec259f41005187115317afe5f6ef895eac769459c0ad7ab039febed7c1
-dadaf14d015a7a3356982c242713e27eccc7c4d7237052b004e8e5f15008a826
-ed515dd699e6bf60e3a2aba08c07b8c8d9df393094069e781c7d75b090445c7b
-1741949aeddd01691102b001781598b87f493ed956b500b2d813d50ba749ea1e
-bdceede30f45e0fac0aae683ae087a635ca344411c26a2dcd04a084b5d1774fe
-c1f77079af1f9d8c75f383b3755f3ea120e2bef4375dccdd221e1811b4b775a4
-f45b142ae17f1654a53a938eab4c2b2e71293cdc8e2d18ebb8b502af594de4f5
-00795c3712a58bb65b8287aadf183e508d907290cdb9ad20e578ee485ca6aedd
-432f01a550980bf7ffdd0a61834748fa4ddd4d2f561b9aabab279e8c131f4d32
-68d89b5f8f542d881286b3c8913a0a71036058755e2f47994157f645ff086729
-67ae4c8461191607b1cd8c4c83298a4bcb397fa5eeef83c5955b301fa270c293
-88d0fa7d58b00f5f79cdb0326172364a0f4f91e189101a2bbbbd448b576c275e
-ae6b320f61d6536649b0b0f9340d25ed5ef2746f385bec9526a2d989271e9a38
-302c84169518891d336882d85871ab751c147d1c8563e2d7bf5c3a660c0b0ae4
-9c0981e96dcd4ec45c166f7a34270018a852d5108219486b706f84ebbe9ede96
-6dabe61fcaa62658db716919af23f384948b4ed54ed369dd3e6e9a4f0422f35c
-afac114819e7b1b9a09bfd1b985e18e6dde975e610f48d752eebea00ede16f3a
-0b090103100000d0c213c4425a5b0ff3193941e27eeb978c7a42dc6927bf301d
-1f0f366a5d0ed75b8a969ba68c8106466db17cdf5b516a0ab63f3772dc7ffcf0
-4ff5a952d0798b68273dcefc30c3324ab824690821875bb8580543ada7b15b50
-aa04cefb22aedd548ca17e0c334493245c2eb4fa7549fbf0833f142967753111
-96dfd986a2536834b4dbee2945c2ed76205a05b9fdef35c9b4e41a808220e6d6
-e0349659c3ac8c3f86462866807ee5179d6994dca75b8d162763e8af6107b272
-bb10c72d297aa93c0055125a426ca0ef9a2c79a4b73060ff6b45719c3dfe2924
-8ee4430acc1c9c28f8b93f554f668cf14f39a728d7b2cf00523248d5877c718d
-28aa6d2b25e1b0ef7fbca7bd87a1bba4ea760b7db91c7d8f0811840654860fcb
-ef679163d03dab048f05194924b68433b76330a6ac806034e954b80b5a7c8652
-719aa83b70fd434ede624963a0ffe25bb1f72b71f3351164d1124712d58a79f2
-5c60a3fdecccb25a5658ad50961a756880b81698c2f2915d13f02ec6cbd28edf
-587457d825544af042a800e4387e004d0701b12b8281bdc76197de64309c5a33
-463bb7d317e7646ea2e7bdf7c0a38e82b0142d51a055bb90689f11bfb8cc5065
-b98cb98bcac7c740d9b1676a103af5a3501e6949ebd9705131b7f30f10323ac8
-0e69159b8da52acc1bbcccb8096d378536ecb498900fcf1d21a92dfcadcca90f
-cceeb56d38916c2fb64a9c9df5ceada68553e18d5c5d184c8c23ec78dd5fbc1e
-f685737e77767afdf33fc585e5d4e9fa1d85446b1b209ed0f18e529dc1487bef
-57c45e10759705297476b4d9b323b45c9d7b364df726b9108f4efdf1c080c151
-5d379adb369724746185abfb9567978b090f9159317be68fefd735a62d686ff5
-0b08e19c87f668aebde88f66fbba5c614415c7ba4085b35b3b086662064ad401
-abe40b7c4d0541d69b745f7e4a9ff3657e74c797ee656e721088409226aeee8a
-be944ef94ccc9d0d7f4f059eeba35ad008e961a252119950277e7f1028305b7c
-a09a5f4c99a3620001d53d8df889589c9aca04f525a39a67fe2f776fc650b3f2
-ec5a895911171356df2bef1fb6302d4e9ec698af4e2c4320821f37533e1cae94
-a5e14eb18f98a127c498ea7e70b1c8599d4ca425272bca3aad3f499130c386a3
-ec3632c8ce2d714d309b52a90ae662ffd310e335a3690bdd831f52ac88279a31
-c3441d8e0c6a741f615c78ef08502af34d81cb1ebd03af02a3fcc76b6648efa4
-d8e550d995bbfa02d5a1d08d0625432267ed55aa34fecd3078c75e1d8e4185f0
-390abfacbf6dc83e8e6bd75094a54a28ac5c44ba886c3b586759e192beaa88ad
-b1f1e7b59703ccc55d0c4383875f8d9fc1e24d7574828f8db01ed10919e3abdf
-f062f0350da3414719c765b600a281ac245f4f7a33efdaf6ea3cefcf081158e3
-1451b8bef0e8ac74d0ecd0ea1958e171fe2a1f23b8557556927b4db67a09a077
-fca48bfd110420bd160c931c07799fddc47df1d5a7050bf1221bf3c5335f994e
-c002a6621068cf4630fc508cfbb7a89ed86593370fe36d559e4fad3853aa596f
-50a4d4fa7c28ddb348986fd5e41c12aa6612e1b8ae69723decfecf062e7108d9
-f0b6f92c3d9251d7d061911fa6d35ed466763f82f669b3ff5dc1cdc5ecd21b23
-6424453dc9fd542578983cecdccd279cd52a2461499ff3709ca9b52e7d8ca177
-b59ebb7aac2e5a65dad9f3d07694e4f161b6c78c37f85cb9d21f2a4908c523e6
-5faf1a391066e68344a9f15467991f809d421af2cbdb9692e4ad9e64d0175f59
-729db92384af1d1c9d058b4c5c9808404e72db14c434929a2ee56772a623811c
-4bd21e254fc99e23ed1f8b2997ab725f809b5b4a6a9019d61e82b151a3a03c24
-4189ad819e0c0852ece01cdb4829fdb205a3f704480c57235cef0b9960134ab7
-4b3bdc8ed7376980e75d48829dfa6b1f6b3300e2ed170771b9c450ff104ea759
-666461d62a16674950d54d804ae25dbe2540896e7a9fe57006efa21a6efc9630
-4836db559319fe389cf960f041a4d9a0366121a1ead35032afd4b699db7e6252
-abc9a67d9bbd956f5e99de22a0ca48ae978d2c8e018bff87406a9f0c437eb552
-e19d2455b56d4ef37b47577d009d14b2ce56b87966b8d2de7a7c423f89a22ca2
-60c837d76b2ba0d5c4817e9f67ea9348d65975fa356851a9e56c19bce0ef8aaf
-3905b73c16eae90cbcd8c1eb4c8e9d840cb7158f145120e3dd6398e3a2034fd9
-95f34006745ccac381cf8c36a13bad6cc4a5420ebe75ee9aa608437fa831d5d3
-3113083cad048dc0730667388bdbed24b33d2c39f67f501f948fd810b8111903
-63e2fe20f823845f9a876e679120f93ba686cf408bd7d69237538e3751c20e84
-4b48e15f86188b8b1002be79cbbc75f226bdf458193c024629aa680f650cc8c8
-71f4a6983ae5a1598821f3f4d8a53aeca3fb8b3bb4266c4aca496110962a8de4
-bf4d133bef58ce2dda36222249d0532cb935804e1ab3fa15066bd90ce643ef8f
-4446bf23d64a9212f5386f4cec60ac632c0e9d7404eb70303f35c50b3ec8dd5a
-99d309b6b7364cdf5fbc1ef653b661442b260764c902e8f4cf6f2ff2252472b7
-53fdea2300d5d6e1f77e46494d6dc0533a77fc007e723591769fea95906c9a0a
-c65f04a8fab8fae134b1227406bb3e44fa20a8379c91318d21315f730b208763
-654d279af7d123b98f2ae67bd5b2f7920187ca936b45b7e3d1da116953f1416c
-46a41d922df8d5941e1a860879c052020ee0ebb78eab5e0936b1c8d02eb4061c
-11c2cd1098e566a180e63cbc8ccf70a0298f45adbfd0db942abb2470bc1b9c3c
-98f61b3ca787d0f823c90231439ac4c5f8ffc7057469b2955b9bea13dcd9835d
-8d020f593e21b87cc8becab62522a1b1dcde669760e830be5c3bb7b12decca2d
-785e1eafc5d6bb3ddb447c2e69215f7647d4e725a2c647746b7bc7f5df9d3189
-d6239ee2a2bfded2745418befb8def463433405f4b4c278295c8c2ad9ee43917
-11353ecb9ae9685f17550f208bb3eb7179a1fa69882ee2691d280ead58e93f37
-70ca26ac429ee5b8e0dbbb7dc1876f11ebe6f1a0dc330cdbb24b9cd1439b3044
-8cb62e50b33ff18099602c620af45674a3ec0c93fde12ebde8b1543c1f9c5d0e
-0a12916ed048ea3244f07060235145cd2a366581ea658b85272d59cd429fc509
-8f62c9937dfa11d29ef22c74e5115f6383d5aea6b2de0ca4c5366800a2bd802f
-162c3e3774b12b016914e4c4e008d81b0278c336d764dad0cbbda4652abd4a8c
-213c7da9c9fd6ff7270575c6c15bf622b6f6f4802ff6f7991d371a7f06755ff3
-cc7b344749f239036a68803d367d121a24241a559e8d64b6658a8363371cd9e9
-b79231afa2f6284a1ba5b99f18bded77db058469932ebe7d405cc7fad3224536
-fa5fa3f7c643637960e88b0e50014a391c65f22424f7edada3a7dd72a3bbe5cf
-47a7dbc05a7955d77fd115db666f4858df46260425575b8ad8ad44912540ff7d
-1cc336c3f9056df50f5a0a2c34f12830f81a332b982db204d218593b804661df
-5adf14c6ff71504cf9a6faf948601e3e1319c806301ba2915fcb59208ca378e7
-afb5adee01e4167cac25e8a1da13034162c5b1d648bf608174a38205ef838067
-c4943118642ac1d5723eccb0d5e365226ff4c34ab97cec6c9ccb7b73c01ca8c5
-85ec906334753fe353bdee090a79bd56905deeb8e4314620e509a83867ea1c19
-a16599dcf0f2d2f3eae58d8bcd8da926a1af99b4057ce29d6ffdec24a7db1a14
-4ed9feaedaa325b6eb583ed87901c43f9f31bb97563afe8630df00acced9d95d
-4b8c1d0f47e02a76730b960e95fb78a4a11284923e9c91a2a5804c14ffb3e352
-943cefbcb1dc6ac888c3a332528a89ffe36fd2824c48eaca69919838665a3367
-7d528ce020fbf68a32d10f0e0708e16611e734a0b20d18aa6dcbf8c450e2b5b5
-f09d32c94c115e9ea5e1a634a163cec01c3a2f3c7826ef7e9d5e8d19d4c4866c
-84666db73ec62d9c5b2508b05145522c3da50a31871ef2b6ea0f48187c191e06
-e0d8160390c05376f0eb931bc07007fb313af86bc0934bcab824073d6b30aed6
-5bcb843f80cfd4c3ca11926c604512bb9c14ddc64bed2eeb5522a4ff3120fa47
-d454352891efe9fac5fa88660011a8c0ec0570e0430b19b698160d4ddebf7051
-079809d76d8aecd01ead398d4e2fb15423fb38a6dbec48fbad2098a9ed738f81
-f6330165622f646fdb5b148ae89168c3a1fbadedd5d316246ae37e45bc896d9b
-aee9dff0f5de45b6121e9a092ac8b4c69eb61138505ec66b367f59b0c6f18fec
-c0010864ccc7a0dfb650115242f1664ec78b1861b93a82a793ad55f1d27d646e
-90cb1534ffc6b9f5e982db9070fc65c9559b67285696acb8c7d680e7f109890f
-4df338c15cc2359fdc3d52bf64c5f1f04d2507e80b4f3c51e68c2fc099e56fcb
-89d0d3bc15657fce79a2633352e4b6ef022f23f17c9b99006de8f42b6c09f5c2
-c82d88b0bf013d7500e10a838d34098b657ce411d22916acfa09121a3a84fce2
-a6ebf229b12763e2f5777c99234ec8a966a7858330ef3330a3e3d0fed0c8969c
-1d5099164cc9f1dc0e398cd9d30bcaf6a4b02b148705de166306633ae538f9cc
-e791641864e73441382828e68f406a673cae2853224428921ffec808630e495c
-64ab4c0754cd85327bfd7fc9ef957642a6d30258b4b9d29bc059392b7e3fd339
-5a6e5a0eb060f9dbd09d110fadbd8a061b1ee8880c61e01fce52c661e1d1b5f7
-cc45b9efab2880a9bea2bd64e8ec183632b1a7a996baa7eff23b18ccaac6c88b
-1835eb751974d2930c1f354f5173c9266918872eb7c70d90f64113f12b86e6f2
-eca0e29c4d4c20fa26df487b9be3323ef6de8dfad3f81c7a23a4930fd3a1c6ff
-ae0a952f8e074f0f034d4dc16e0f3c11463a57ce0c14fba845733568ae0e8f46
-1a00d55508e00a80be53d818d38acc4f7212c628cb2047f18bcaef075e7fb3d9
-6d090ea9a95a21ca3e7f797aa2934653176bd7ae0e72c52dc19196142e571338
-572a939790b6fab6592f56f8a876c99bc0f9d04afb37da897e2dd8a3818f9134
-ff6dfc66c7142738167ac5688b4da11dbbf343aeab2fddc82631fc7f5e3e5bae
-c857ff3757de3c01f097db34436e6d9ce0736734acc91c447277baf1df07c5ab
-ae7bed411bb203043f0c16155e38f62da67dff78f94bff4e8ee86e0261628487
-0290e8b302f9941c60a04973aaebd7ff2c4fd0c5fad6e85625921e641b73bd91
-8ab85ecc505552442e1d1802460024a9d3f523fde2d1139733fe54e74dc1322c
-0d67261490354ed262e2601098689d583f0feabd9b90fe030812442be5645817
-5fcb9cc603f45146004f4f06d3b6325adb329b6c0686403678ee2901165cd44a
-f85d7977c6e3c84a0c5f5d7ac40be097e91259eb0928f84166b2bea549d82ffb
-e2187555d160a406a8f273d18778b42f37ec7045734e579b9a7141f48559d8a1
-2a491e774eb885449bf57ed3737c42ebfeff262bff74eed2d0a2a8915006950d
-24b1f2ed4bccaaa7a37f126759e52034dc7264eedad951a69dfaa509af59549a
-f2de1eb4a74f18abd83d7e8bf00ebc4755ca342836ecfdd0c11221aa26c187ea
-95700568592036fa3a03b7378633984b7340e8080f82355c2a572579c06d2c86
-b3602943102236aa99d971cd3fab42db95dcedf44d04c8f05a2a1381c6e9c58a
-a526db2ab99b4033ba0d339ab2e1d93b57e691e66efbb79e627f2d0eba005080
-7ed4a60011be87ceae68fade61f969daec01accbaa640cca88a550c7de3b13c0
-ee86bcc1b3d11cb069bb2c205c205b35da97c554e0eac66dd8585bbfcb18c8a0
-cb3941d9eef3a493a2f7dc187a480d21a7b4e5285de82b81e04d6e239f7807a6
-6a334b6c7bf6fafe27c1a81c3957ac1590de2f5d74a0c9b8a990e2dfbde91298
-30c494a28e29557f3cb2ae8a6637fa3d83eb11331f8a3554a1419d8c5e84c1e3
-35f4325506a08bc8ae49a113a5c3a10f6d4b5446fca9a287d02d8db0bd53d706
-00137e83ed703f3e72e6f5f3f2fb14b6dc3e61c1bf7d910f03610666f5579a81
-644c5eca8ba56df6790561ecc91db4fbb7872fa49d2b7f10ba2aa28fb9ac85a3
-4d571ad54e98993f94b7c551e237b314536681cf8e42a26144ea39d9f9a9b295
-9aff80e5b965d2b3127d89e27ab1c8804c68ff4a1ab678ad2f1bfd5b2df38985
-bce719099c9c7a128e29ca4ba9187ef9462d4059034d7379a04aba778756f48a
-2373c32c4b29b769c6e9fb458bacc4bf10bf25320d757b76bacf1745c0593e2c
-fd20432e32bade5a213d53c77d56d34d67f436c1566395e6143c36c16796cb27
-bdbdad5cfe3dd3eae67b9474edd492c85879169324cd9fdef636d5b9c3abaf36
-edbb4ac14a98893e36dfbe7316c3b9dd3c072327b0bee8bf09fed0a0262f0e5c
-08bb6dc0474ac2b428a4c1ee5b624bb1833be8b2f4b14c254d7129a2162308e6
-48035a579d1a7c236ec5bf6255630be94bf6129b96989b933f9ce2745f69140a
-515da1fdf975588afbd4c39201ab3ae8b016635c2bbbe6aa27bdca6215617e2e
-b9d4c0e1fdcffa313d847929c37ac7b07f96b0180fbbb67f46e9b6cfcae1a66d
-4be0afa99fa7787e7f8be5a04e723d4f30abd5a25f080f51de36130b7862b025
-eb56872f2744686fe5959fd51b40e6d11876f61bd9e3eaecd57b40441b5bf86b
-378c83c4deaddddb6ea17f6997549eccdcee9a7a48a24466d9c55ed17d7733fb
-f323871fd7bcb8414609729c27575ba9fd429553e3d63ecdf78851b72dabe4eb
-9ac67e961a4dc4cabf70946cfecc144a87dbd9c73259455199412faeeaa3644c
-2022489a3136253e1497bb3458be497afd4c9049c4a615a102829c85e9a4576e
-350e14d837372b4b1663d415cbae6a3a954880114b13a1c214b61ea6594127e5
-742b98849778893631b67469aef59b15919872a7cfd255910f17c53576f03571
-0819d59e2c1a46d0dea64fa7e03a63256a8e65047a1ffe4fe36497d2281b6aa8
-9ce1ec831cce61de63c1da6c8a5672c25e5a5a7bf20a7f933bfdc45cf7bbe921
-42d8625b3aac773bafdcc614425fadc62699de088714b72691a1447506e9a37a
-093a960287e418f2e530c537c08a3e19ec7becfa4ca9320b05f27974d4c22ddf
-61a0ccb6b866d8961f04f9f9b85809bc57d358cd918dfdc9603b32fcbea81d3b
-e193034bc458941b7a413947a1594e46b4ac9bdfe9416c275807a4302694f7b9
-2a226b8c96361a389a9bf92a47b28e501a06d91d6cd54fd2d2707ce52af2c279
-24c6e95948a936b4e0cea35c6bc62edb1f545a28ab762ebc3c2ab4c4c3a670fd
-14cd631fb5fbc26cb51ded32461d69a2b82c586c40cd1841fa3ba780dbad789a
-cca61d286389dae51295141ed27217db047eea3247388390c153c22f949642b8
-5f87f9193421abdcb6d4d3882578f9e70b28ad6238d1fc25877f42e3899ed0eb
-4cd9f13eb898e67a053d41ec485931655c9575370aa8f4ff30e8d3e7a26bf27e
-f32f2ad0bd244272f84af019bcb2bc6332142b4d0bb50fcfe13b9c4e9883f0cd
-c4773686b3ebc08b1dbd2ee12fc3f18a28be0610c4bea2df1543ae37dabd861e
-2c1a65515d8bddd314f8949b5941aca77220073b541c9ee457e24c862781f8b7
-56fa69719cfcea364a0d983989ced39ba2c910fcc25a00601b0340d8d6083f54
-73d54c577012ff8895d006922198cbd4718e32d5fdfc56143818901a670d67e1
-0971b6754390848db25f059764a99801ecb89fd0f38d46c8da9e01011bcd32ef
-c3c445769122d22409c8492bd716782f411aef4b4e0f1234a936e71b9e8a6237
-9b18088464e5e2934c748c64d69b3f2a92d81a1e0ff81a3150013c3764ca0194
-110f7691c3a2b8809900ab262825cef744812fd2f5566894ba1f8d2250d98b89
-a8683f736d4b5a59f51f2e332c8ed0751089e9c51b91b1c54d9b260e312959f0
-c692d4a760932264214ed92c3ded8f45ed1f40dbde9f20fa7a658b6a36e121dd
-cd1bde6e0b8942715b5080fc04a7e6db224faedd8c5778219966177e476de4a5
-a22be484107a0c11d6eaded4ebb020651777add24537d83b6d61b407df0f60cd
-34ee532a9343f5b4231937839a5b330df795293ffb2b27521d142065edeeefc4
-8fc9f90558cae326dc18fa6b759e4d0db1decbe33bf3c1fae3e3ab33c9392d62
-429506196d1050a0e2da447161f2e323103da806d05c40618288fbeff828d053
-d3c6e0b0718f5c9afd1581f0098eb9b97c35aad2cd590e97f4a139733cfcc7dc
-acaa5814d3b63efee7c764c0d0a8ef392e3dc3f02c8e89f64fae8ee4ca05f115
-4314eb98e6a0e032886fdf29692dfed62802e84b48e4705cc0c158eaccf4d7db
-dc47b91aa3c5a49ab600679c13a2177c145759d8bdd337e35c77717a15c55caa
-45339aadbda46e71a8a018d7782b9299a2681c927888408328699da5b8cbc45a
-b2705038b818fc0bdca4d52896057e105c8b859a52676735022208a76abe3f53
-3b012a22daadacfdf29aefd86f67ca840a1473dcd650f03c315f23bc6ed8285a
-9d1796862a88051a4ec70fab8697b54c53260eb12edcb9e533eba6f9c1668f5c
-9709dc308f35b927c974fb1d0c58757086770e1774485e757f1b777db15a6857
-1c084f48b3da6102cc7b38dc89f7a8e33411d7e35434750ebc98dab8439fce99
-37f7b35ebdef734e2b44faf3dc68fd5d36e8fa82face91146ca6bfe1b1710cfa
-60a6178c88ef1137074956c67cf81e0052d7109debf10409d752e3f770933111
-a069a639005c0e043d42f622e96fab8a4a203857a788b32d3b2b5867c7fcc075
-9236e5dea77a574f4cf964d0cc2cc786c6f0068049f20015dda844a3f409b4dd
-bc95f22266529f58e88eb9568ba44cc414535075b383937d1b33135f77c87a92
-9e77f95cdb0d71a1807f1193ef20ecc1c497df8e08732505288fd2ccc73b77dc
-cd88fa4db43b9410af1524b03864642f44ded44466b5caf39429e2c18e634834
-11bda54bfb6787cdf3810a3f2e15141d7dbf09aec5b80675d65aec2c66e80177
-4bd3e428b6d111e50d6f2e6b5d4d9140689598d147473b57a71ab08080d37d2a
-7f2b89ae2f5948eb11f3808542b8af7ca2173bd33eb513c67f28bbeb87627ad0
-09fff3b7ab0c2deb1668fb922649bec4bde78448bf7070e07b101055584d002e
-93826a781916f1e2ac7d272f1a31611835737d54671d9fe6e5b9460b15e39fa9
-af198819f2073d6dae3b3763abc240732d719b0b1c8a37e5f9f76103e770c0fc
-9343289d8cf3cb969bb4053cd377413a610084e68c255a6faed405bed1e4437f
-f93b34eae37559b78cac42761c985e280b92c57c0641c244f3c480bf57fdbf6f
-8749fa7a45d44a40f690d7cbf8b6d9d014a533b8fc62717eac7e069cbe6e3a2d
-62e0472bdd23f0edf4202a643c8fe7dcf37f4401d94abf44c749ccd26c2d8fd7
-1ebf9ecfcf534280e759959c243f3592622d799747efa7d5b75964090e0a3dbe
-dd08b6106631bdfcc890bd5eac60e6fe316e1780b0073eb4a25dd38ea62793c2
-e3e73f9c4ec3d85693dfe038e322c2c383193b789d13c4be802852b7c877cf29
-4b58bf6ab55f9d6669bae41771d926ca28aa6a58c2601f13fd1aa9b0d7b481f6
-2be12d72c3ee24851851bbaca53045b24823e02581988e4432a8ec843866efbe
-5f4511418efec41146309c7a57d665d8ff4d97dd85578dece104a6589ab5de28
-c7d3e653f01ca8492ae98a2dc7381be07abdbb5ca3ef9241ad0e74561f9f5a15
-2ae8cd680fe804aeb1f73eba506da5aab780d3fb24f617957f7835c406c2f017
-1bcedf43715e7f01450f3bdd30c91d91c64e55ea52a8fe5423d54965aebf4574
-b1e9c8e46c78b76fb87df3491440a7bedc74af6a963a2d34486b81daabdf4ff0
-37529951e2bac3dc85ae2aa8a2a0543a0093d2ad7a872369458db38188a346bf
-43d572f9e2bc2f780ec70a5b65d94aad411f888b5592894da1e4486a0d800895
-c08accb0c9b8e0f18c0ded81be332ce12989c95f451c661496fae73ed7f0eced
-8a9a8754bf7778ff0b4cb4ba16c67c9a905e781ddbe16bfa57462ccb6044d891
-83d761ce58941024a403ab718764a1855d0673d39975a286ac8b32f043176f85
-f2efab1f0a0fa4e32ff159be4f53292d5e393262e9f6404b6ed6349ee4ebb62a
-53dfe5dbd2f6b63960cb2bbbfa89d7c66a44b2cf5969ee98854cea3e04b27c19
-f4c79157311318bc975bdcac70548ace6dcce4d71e506e4fcf2eb115309a4444
-f76b6c271017a02953d0ea0a2448aa832e89ab0895bcccc314fb02968cf754ed
-3307f1c59306eb773d7f63f7b853f0ae71093da716b6c0b8ab469c2371c26c85
-193ef171b6c1f48c559146d1989af1700d9d08e3d60ffdf548d5cf7a8712c75d
-24ad4dc445f310b625c4a00e0879b95a2699189cbf88fa7d2c3fd191c963164b
-d363998c215e8121fc3c44a6fd4e428b244a8f2c08b3b058220bd3a83ecc4b12
-24b192d8972430693d9692a045df6f8cc8e04829a1ad2a690cb876c8c72ef8b7
-d04a119430d9882aa7b4994581ea9d846970e80f29c4e4386e95cc74e60d1aa0
-e0eb8d5a9b018dcb3bdb9fca1605efebb39bab3abdeed7585fb989f8149db2b1
-22bff8090404c44bf2da1492a697454804b85f7f282f78ed0df62d59d911107d
-524f6db56e00f897c58015f399bc82d4340a62025c7867c38f7063dc4012a795
-016ee4d90f14c9568d5e324e73f6b7c57ee5f5375907bc403584eb44a4e33c4a
-88435a399d72307c46d232ae24b3ffd31514ad891b7af711263d5778f1412db7
-4b8302b179fa8810340f07fc9b0acc27c06c915f1b45dd1d4d238e00796d937b
-4539a8386a42d6d73f66bea6d8719d057d54cfcaa282c4f06336c05285f53667
-8feeae08253eb094aa8290c40ad00bcb7e1ec20cc99a0ceb80f08f8f356657da
-ba56829d869fde7c4645559f9349d3371efa44f58bc36aa493d9a0624b5ed4fa
-935703ee695de66e687f27e1f88228261eb8c5a42a6c9b30eb45227874f42fa6
-aeb66ec01d1b140af535b1e28d625b1849d2914cba6545727125f739bcd1da1b
-7d1fa4b2b0e6db67c549e0e2e52953cd3a240d3eacbf623043d28b119193923c
-94a15f4773e0c3c974325f608d0ac0015cd450c02118fef94cd39341b8b1144d
-9ed9f3764f3c7796bae60881f6d9d84e76fc18ed060cc82a1beba6123f05ea92
-9a3f3eb82e2ac1eb99e5c6ec65a9cf2a4e0b3c9d55816779edf45c429b49f553
-f0ef1f1c49966a822920230d1a4dd6c05e2c676780ad7a6cd325422d3fb97cfb
-1594f9a31f0730c1c811cd0533671940b3dca7a70fe1c1a79cb4d22194a7eb83
-20323cea558fa1ab48573b4d56fadc9ffc911c8e94680985b0f527be4d218233
-890a06787f21b60b459b8a712eda9797f9dfefea8bdadd077e56ae6035fd5ce1
-a405b543538c790b0bac9c7586d9677feb4518aa590e4b4499902f8afba48386
-908d301b8ed6b87ee1f1ddfe80c37eb0affdc1406617d37613b9a3e82694f7b1
-60b2d43483a09811ea5f50cb559022034d9726c0f9f80b5efbbae8d1dff34e34
-ad6a03f4fe2396b50560fb8a9e9edb2c33f359728f2ff393da760f9a50a04320
-916a583228be053cf17a11246d97e2adf68891b73cf607a1c2705f9066408137
-39c09fe101bbf9d6f0be4fea0b469c47ce6bc2ab1df3c5123f3693ecd1e29ce4
-20f76b77f99d428254f8bc54f0cb95ec02872f83677bdb3aa42e6ac247df1a65
-9c53f63c779b4a2d8a720818033395d47798594ae67a5d84c4505697991830a1
-b244d86dbdcb1b57499332ce0c7c2b69275d043e5be094d835ed3058fef037d1
-2771c26dcbb2da45f3cbf68f219f102b5926200726ae55a214c5267b0ea374de
-41c46376cfb6bc7c005fc5cc803822982133c604261f3a53c7f100fb43638195
-5f4d544d99e3296fec2d65b9f3c40636cbf6f6225e62498320a0148dea171546
-6ec4a4a6626c2d69ade49abc9856a5df5d5854aeec16070750dd7de29b8b6a30
-63aeb9bd772f232e80080f9eec514e8578ff7a51f2d7c083695c50c679130a83
-9708e9e7111c6d8abeb055502ab14e0e4310676140a79bc88a0cd652eaf497df
-e92d43ac0bc724892d7b44926852030ba229527177d42f648f829a77942f1181
-2aa4688d4953c18b231b0e016441022450b6a4efa08a10b550734c2e7794bf06
-567fec60c62d0c159025dec3805ee2ff0e85280442f9cb14b5e6d2cbf2035153
-b49ba7836a372a2c4a4173e2b63fa839a368ac7896cfe0e3c8b131cc4385377c
-b4ce47bb4fc50e84a24af35342cd3356b1299d421ef7d172679816d7bc8ec23e
-e778c76e59cff801a01bacea63f46568ce5fdb81e5fd21f9f43661a9f8815df2
-58e2e9de4b22fb8b2588cdb3037b5725ebdd76a50ebf6afe36eaaa072aabbebd
-0c6adb74468395b34b84567cfa423b19deb4bc67dcfc86345cda9a9f511ee834
-a17ea4349584ece87b4fb9ea12718c600a1122c1096326e06e193da1b32f9945
-3a40f5f8b37245c99e5225c6b75e1bf9af0fb5d0b522fad58eeb2d6dd9d63ec3
-d9dc272a5a80ee7626651f9181ce39fd8717c870dd9e84ce9e942e1713c11c6c
-87acd1b3415c15ac0b34c24dcdfc59acdfa56d5980efbeba111a4e5693c341f8
-613d83b3a0828d48ea00487e55a27ee4be7b93c30bee530ebd2bd0c41e280f60
-eaf6ea444894e24af55e04c7892dc8860d19dbd60f157537e2808d2f561bf869
-143efcd8a7e3e52911c58f2148fc2485e3b37ddb23e933b074638c6459c09e2c
-29244a49f8e7fc86546210e7bd68b966e67333b2b527ae20180f8af858a1e2d9
-8f21bda6e98e02f310ad7960411eb89bdd97e79751ce5cad665ecd7e7995cc6b
-18969d13e902252b163eb346857d6b091c1f8e5f7ac76284be6eec4748e92c68
-4e31a333726ff7d5c1fe6d9867814781ccbdcbd1d270cc2bf014d8d1cce6a8dc
-b184f18651a2cc94975385906e22128aadf419672cc862aafe5110fd9cb4a028
-4f7413e4e244638660a20968a81ad923eaf27bcbb2aae3106ebc5050a69a92d3
-483e3ce8e5ce69f06edfe2c6a1ead8522184f4beff28313a8109731fda4228ff
-e3ca429f4cfd68035d2f73667bf0510135d968fff85cf8c516a09cf60bddecea
-8f889b3e63bbb6ebd2ef7ccb0db00ef5a92794b162c82846f7fcf3e69bc6956c
-5e63776482c6043bf73c986f1f18c6abe32c71f1a4a74f29e9fddada315f5ec7
-e4b38e1225ae92ba3dfd4746ce74c1004a7c2007bc3a95d0bca6eedaacc05078
-ec3a6e32fe37b6b3edc1ba46da5eb8bb981867b64404805dcc91b4b5e0b527b0
-be53e79596a7db573edd7f8f913082e0ba15e74d44ba59f89b0c9d46fb34c2f1
-25ce2d967c903debbdf67040af8bdae68ee0b1e0e89d79e9bec185394ce531ec
-8ff639e1ad00caefc9fab3880fccf55dce1e3937860b25a47aab8fbe4376f854
-f0c983ae950bfa5b53ac225557d28dbef67a89ea7571ddc8a710756833bdb5c4
-30ce1ddcb86623a82cb4e1be4ffe6b777a0a8409813580b75a89f6a8c65e81c0
-168dc486916be4f40cafa4cc6b1e22d553963b2449e00796e459c57b94e34ed9
-5bd4f1eb9798dac04521d031bb8eef565c6b0740dbe50f0b23fb1d799fdc2f61
-3f46ccdd6ff1ae778909d8998598fb796e9921069e4766ed35a4422782f62338
-a03acbc0a8f42c0dbba5917d7fd0bd2481e1835c660ceb5f2334acd57d4427d1
-97a82e44b0b172ee769b69666776597e018d05db7161e3662e42e0a1d5906c96
-607ae2ed6447cf857ce0e58984d8c363a3a6516bf4713c3b23246232b5e512d3
-9d2c3e32c33408c03262cbf5c517772ace92982b59db582ff69a3ff6c0497405
-8dac147089c03c44bff3ac70e685939ed4c1097a0cb6bb9fb399c5c0950f6689
-5dd9f05c7d262061813eca80e87e2c15a266f5be420796d1493ff3547db70f66
-26543b1ae2d6fa431c5623191327118c5eb8b331ccaa0f198f062c51cfbb981a
-dbc442937f63c8a0c179c2c42d572564bb872a2e6dde8e7d680372b157e840f6
-6fef984b009c671bbec94d3446e85579806b11586cdfefd7e2bffce117f15e11
-f9f47bcc9e390595b06f7207f6457cf1f775f781af79b5b825dbbc98e3858056
-aec61f1d9210769e2761f216f01038b24422e67b5c2386182a4e9382d1f345c2
-c6ee6299e4e3a784a4166183be9c2628afcc27c45ca0391975591961cdd718a4
-3c3d1b85b793b5f3a8b6d7590daa27eb6e73ed7726d9719b43aa13e05ea7ade5
-ccef5bf1333eb7880311869e055391412a9f09b676ec67c994783d0be74cca70
-76424bad7f2c80f031c2dcfefb6f2c8e352d2f41e010dff7d37dd6b03cfd207c
-6308d43432d33a1ffc94b74248b5db43f044764a865cf2a6671bb1f99a7e0df9
-5ac614da6c4a8d2f8fafef2fb5358abeb8cf307e0a710a4d3670de75e0f19410
-3062037291a143c03375e6c1fcca2711de12aafacdd5c071adf22c86dc240ce2
-d5182701ade04a8a1c73144012e2b88d4d5621e76a26dd5418f171f8edcd1dee
-3bbe3d6a357b75a217a40e79545113fa2ee15ac0ea2a94b8abdc82e7645596b0
-d8de0966693b23183fc34324b6b7c3d58dcd3b9a6fee2df7b599ec03fddc0aac
-632305776c092c7d45c8e64d9f4c4d9342fa55f9777ebe941ac71abcbaa94a0f
-91ecd9ba159dbaa6ab418c1bdc3580728705e782b6259478a036df71d56cd481
-1e5679ec3fe59432d6491749a9653ea2f22a16cb93a0762e7f2aae8fcfdfb43c
-fee053fd488746b2af285ac480e7830a0707adc87161595a5cc5a81feeaae5e7
-64a73af7c1d7e8c1dcca93374c6dcd57d0d31c479b3e89ff4135e66352290dac
-86d663c53d9b2f4479662c8a335b00ff194e0a29931552a641510bb9b08dc991
-78a63331f41b7a813ac7640ba77d7a82d9f9823f75c01175d49d2d357b2be420
-b8137c3821f260f3dac79818a7d0b4d86d257af7bec5fed35f157024f89795fb
-6723d13bdc0f41a1d16cb2a232d457376acc0e332fbe5b36344fbdb22ca8d7e5
-660a86f3902f04ad8e1685998888baa9b4e0a2c064d2b63cbbde79914f3d8f52
-059ba32a5f541fed91ab69b69ad53d045755270345d3ce9916488f75bc83e7ce
-041b96eded251aaf6abc9b68b16da135f86c74556394cf9042b54cb38784c548
-6491c83043598564ca6c64ac7e11fa09a3c3887fe20d9314c21ad36136e6bc05
-561c0c1e9be70079846939b84eafbb0030f4a9b0cb303cbcfcf16ddbf44cf977
-7f8cfd027bad28fb461b29ec10abf2655341f0dd3950a508026ad4031f3b139c
-1e16220521c36ed2f7a0e11780dd8982747af44a62bf13bba9eec406077238b6
-a03acfc88709d33589cbf6341eb2d1f3b096e515efbca9b6c1328d97cd840dec
-e341741bac9d0ac07f5608652af7caec833adff0e09eb728588a6da3e3fa8038
-b8c1f4105a5fd50dabc7609007ed1ae39a0b75f11772a452ca7d0bf856e0c9f4
-fa0e98d21df2f47924528b6edaf372b937d3fc9e418b6e5c18058f93d5bb0e28
-a2b59dfb5b5924cb20ba6aa4a5e5a1239e864c9de629aa43543ac2eacf89f6fc
-cac316215a3295ff05f42bc41cd8504f33326a3f1596c63f15272c2484386544
-9ce9e479d5df3214c91b9ee0fa94da29036912a6b1f2b8e240a9123a6854d84a
-08f647bad14829aeb65a3a6fc8b7cc53723b992db9a94d8057c33c369b401ad7
-1ddbf2078bd8ab303b399002600d5eea4dc469535562e1e6e50366728441fd2d
-35cd771495ffa169ed4cdac01f988e7ce5c7d28f9dd0093bb95aa97ffb30bc6e
-dbe2f71fd3e70aa1e2de7cdbe96181e92326d26a7558b1c1fd0edb58c63c51f8
-b1d741513d98e06d3769d64e1a11fae44088583ee7584e867b9492e66e9c7114
-3e165b672204d444aad59893d4212860f074d1c6079a261f6b3e7383c57ef17a
-bb600552eb518698dff54a48ef83ac82ad43534c07dce6e9e32078b5d60240f8
-b10d07d496f7b7de76fda6a20db434f88428dda2c5320a38836ab84de94645f1
-c511080a50d8254c0cfb67bc3ac2101c401541a34959107898bfacc611bb2962
-f4b3d1ba8006c28103c2a55286bcdba75a3537f81e7cd0d02a9a3f574cb6389f
-332983f4cce98c6d53089588532402a4b8a1d1427d550c7015e5ef584272160f
-a044a92664299ddfc990ab0c885666c09b6f2d6240db9f7dd3f1a53a6e312a80
-963080a78e62169cfc1a1a7a329ea2998568d9be427b7c69a504e56a7920246b
-1d12fc87e7f797798b01aa76fb34594749fca31041373c2a3e1bdf066c839925
-fd89b479bc991372dedcd1c4588f1edc25ba46b7f48c93d13ee470727c9f9f27
-dc942e55051d4f73af8ff183bcd232980fa907def8f9192c3397552070d0792a
-0e13f3dce6f14c904992940dc66abcf4de5d31be037a8d913fbf6f0a71c8a9b3
-ae5962d0e70397aef6d42d2959bf2f4058f4aa2226afdaf9a24f326e37d3757c
-56d590dfc41a5a2313ef3a460932e71c16229a152a36bfda828d9d68a411d64b
-24e4854cf677d412d22db866c7f70ce1514684a9a09203572a0b5088ce3d2652
-b014a181389279bc373f982b2db5d6cd9e6f17af6dc1ffa3b05787c50ff2b9c5
-21509b9ff68384217c6c8027b93478e31083e71b91ac4e8de22352ac08aff22f
-e7821600af0d1a269bc56a658bf7650187545a1ff2b85d73c969199277a76dbc
-5f1246a6a7066720b62310321411be865fabd80cba515d52a7767fd70d3bd0c3
-7512150200b4d5e8d92548bd3f392c1f16a55ae1a110fa2bc6ebacc5276e6983
-7dedca629ff9d85218522e59566991ac22a584af50b6155873012e623e64c0dd
-9b029546c73368bd1a91a1365a3082b715738d2d470b4c9cc0798a9d09756157
-74b8b5fe0fd88864260e3af1b2cb01f3cb6123834a468fcf1de1f1ecf945b6fb
-6e2eac258b0e67cbae19250eb2ec927bacde291d4424d8a5537bafdc2bea300e
-3fb2eb614a952717fa35749dc90a683359dc426d901b4f407710ca529f6d100a
-143cc3264586dcf7aeb6ae1e0a38ce7efa0bcc2eaba937bc1d924c61fc4e1214
-f421cab4a51d223cb75fb13258fe0cf3001760df8081e5d8796e329b2219c773
-4ba75cd625e873f19d07dca484886174c089c1a50482edce0b33e297980eca19
-7e80f95612562f655958510bee41fc43eb6f3a6dcfac20af5492449994016664
-9f17f649844b0061a2c7bdfdc3d2d8bbc0decf248382e29b34ec934c3be95aa4
-4d7ad210d2f47c986bb74b162a8b646246e7399dbf42e744dda2aa4814f184be
-9e5b40762dc25102e036833f22f02ac701bcd27adfd7233ecf8178c4406372a9
-44b2afe64739bec4f3fb782643245a7c76a541997da6ab9273d73b506775db1c
-d1009aab2289e1bec86bbb3079e20b0814a0dc046c557d8d5d9a04fcd8deb4ac
-76bc3daaeaa95012770da4d96120e153595c2cfde91499ec1d3371e4f662cd2b
-4b3becdaf3d3cef3c93e786bead46fc8b7dcafddf067e43571cfac08e2c2a94b
-33c824176159bd0612cbad0ab9c87e86ecc7e6fce0e09ac6b42aa81cf1d216ca
-5fa78b5e5df6ea279a8466822c15e9c570c782dbedfd2a2b472dd555551d7e06
-6c582844169e4ff992f0632f3a5d84d0ad97e5e0c87471714f87fd02f7470af0
-f64820292af14a29e600293cd53e9a0d3c2e4a10386913a08d3aeb81830745be
-be651d33c4dc3f9a362b295a9feeaed0a2691659f86846dbf96fa73d14c69fb6
-2934e3e881ed6ac09db98bc4d485ce9b190d1aab30e1bb2c6fac242505c68e89
-d796cafde8195ca0922fe315295e9644d4aed6b4f2a0219784b3933b7814ef25
-5e37a309edb100a6a9484778f195f1b89620e7a46a719953fbf11ea504575842
-9deed1c4d9d9eeffc4988e1db72107ae09873586256168e00f74efc803245f90
-7191058b70b823f06a5728d4bb2cc329b16b1622efe45898da9c3eeb82a0faaa
-ceb67820fc60ed2f8673e089ede97024fd7e7a4c34fe53882f09aaa8fa14d5a8
-ae172b4a20774dba7e98bcd626b6f45ff15742fbb2586c581a44ec7197019e2a
-2a53038e15af2acd5e33fea4f76617d0bdfa83fb7a8ce070abbf357a394c166b
-7991ccfb463e4178d4d4e92629e993639b9f2e80d90d0e040e12c60b563426cf
-0c5444224aee42c44f7dedc06aa93cee86fe7407f2f8cb11d1ecd71852eabc6c
-bf25ce66d4776da60f4daeebfcafa240620e9b261b922ffb670d53007ad659ad
-f25e33c2635201b15afa6ccd81b225d9d59ef78e6f809d03f39b6b968deaf8e3
-b52bcc1c9dc6ff4de50d039d98d0b36773cc230153fa438f8fb4de8fe1f0a3d9
-548ef3078abac9aa74bb499fb06fecc78db02bfe48dc441510a393f6805613f5
-a762368142cc9b1de1163bee652ff1427f0b81836d42bc0d50e70d29846115f7
-3299bec648eaa5afa960b13740716767c92e4217eeabf4f42f7773cf08eede70
-c092e17c4be3e18a0a18bed80c2538f53dbc7410e9cb346df72070dceea70d68
-fcf91f821da4fac781a50ace3f2fa9a4d1f843e07d24b906ac9eee025ba98f5c
-29de05050c88a0c5e645bb6abb68ac9b6e1b376e32d0e6e312bf8115479bdc62
-c34a9d7dbd3b7232e96e326352c6957e316c4b68befaaec0d8c72835a4833ee4
-e745985eacb33c712ac6639f86959c11d6d22c562de124dc83613e86e9359c07
-a1517830eadd1286aa48f699258e9d85678cfeb425680f630c5090d9528ee401
-26b02bac723e01b5613ef12dc9dc22f5c3061f5c39a3948bbb46c20fe86f48c2
-408bfc9d8b8d6bbe00b14bb86070df73dd49d24db3e54a11c87aae6741ea6419
-bd9a370f71f23a42d2ab67d8a7b01967416dfec9220c40ec6203e0739034e29d
-ea00e150ad58da630bb057036216c811a26fd1dc945babf9af676f1bc6f67a7a
-f4ff3f67e34677c5c5012de714c8c0fb6ad2cebbccc73f82b0cc4b52eb992756
-51dbf27622056839bb491674f7632c55a7ef67b249e3d695a883d6fc0cdde6b3
-79cdecea565d186d798bbf65b2a420896dd075df38bd54236a93e968b5d9fd75
-cb178a7da86634231332d0382a0e58c800f453e1fc1a83e19d17115037466395
-71987f6a57092bb46e0ae10110f84d1d959c567b67b9603d22b4e5cacdc827e1
-85e5559fed3b702e3f79577c4b4b3ad26fc8e14a326a94e776f4ada16ad544e9
-0b3a19012f9d6e0d3583f2e814648e86c01561fed1bddcf9b3cde825d0a7eec9
-bc7aeb705c5d1476ecb00ae4b8b8a021bf03aed4e7c9c5c6753f04fd87bb1322
-350e6db3ed8da517dd938dec6befce20a854567d0fcf1a339149369235889a1d
-70f31bad6c47c4e52f6b2e785a0eb141359d76a05a37bd1c566e36d262780140
-65a4fd366723c4841bec798e4ce07f542183a01ef9d7f8f1979539e84ec241d6
-6aa2339275f588352fbe3b05bbae7b7bef3485b05641ebb8c8e3a619c48f93a6
-dd301f0b108ae77b36302af00e580cae0174eb6d30813e9ffad6058e7e850338
-1e53adb9f1f03d8524c4aad05c98ab3862d6d7cbbdcd7d2d7bd921a4069392b0
-bc8a531ae000b67c7e8bebd6b94c2c79f5303c53b045a47be451a3f10afafc76
-a28360374d5fda8895b79d1f94555c30966e5ad8a5f58d54b2dc4c4c39e47b1e
-b3b2a57c8f7aed2ae776fdf4f839cb77f1b2be2d23aa4cb8b8d205152fe3f9b0
-d9002b58fdda551caac65569880995267003437b20cd3a72c3ab3166e593f3e2
-c5399da8ee17843e224b01cbe2c1548d1054a8c21304085b93b95caed462679a
-fa228b98a458e5f08435bcc981e58e4cdc310f57c85478e56b186a65cb8ed185
-4e8a1b30ac414152cabcf2773a2a6c296f89fda5f0cb3634288291022eb1e608
-d7d0a8a46f84aaf58929f8dd7097ca83443ce71f56455092d27b22816379eb04
-4930c56449c419e37978806f3b42e97e1279e9e897a3a709dacdd5d87d0d774b
-e14672a4ef12ba4b49915c76d4d574d44f3e94a20d911db728d973356e91604b
-45e6eb25bc0dd3d285311bd2b01a22559f1e14387c996d531898d5fafceba4ba
-0c6b87aaf5f8e82afc71c04d634c782ae7288f397e50ca0cace18eaa1c17cea0
-cf388e326c7ea4ba925331fefbda0606aec1defbee547666002d478a69538c99
-28106f509a53bdc2167903c9e1d54c41b3696e25106a6062c10d945602e341c9
-b50f1df6630a886c8c6f27383f29817e1b2aa326cc85e43afb136fa58ec24dd7
-03c43b4694b403a1471053cff14fbf9b34567b4eaa0b96adea3a5d428bdf8b9f
-c0159e4acb57deac8d87597b4ee450e93f682bca0712f2136f8216945ea482ec
-8ca99a112e447aab44850a576b69a254a9cfaf86d7cd1c130dc6c1181515b79a
-d703f0903faea4c8e76375951b03b924c1079df5ac55802b53cb34113ffdc513
-8201c1fb93767ede80e76cfbea2f07ac0f95f250697ff0267c206bb7048a862b
-7715741877e4c27b7a88bae1414be335d97ddc235deb4b95a5c51089f50996d6
-a812c4e9cefbcbdfe18388e75df88d04df66eb53cf3e7eac5fea15ff041ac3c8
-834356278f31517ef1d30d53e0dbadab04bd70f2ac190c35e7273d45a0259363
-40dc1e0b0017a7ef36c4c8669f29f21591e43541f149c4a3b1412a5057c5348d
-33b8aee4f452db49b54d4faac7ec9c4eff03bc3c783d901a896fb7533b51097b
-81783a016b20dacb75f52bf78dde107172803db8d3a24300aaff61863ac87c27
-f62e44bafd260a687a8cb47daddc2bdb6570669fd3b63b9609c57caad4fc29b2
-01082b752a679423dde1a8c86836c44dba5d1e3ab96676707df07bb47f730363
-cf78ceff36ff2ca976c969cb74abb3f72f693396518e9f1ec0fab6b53fa334ec
-741b043045e31ace728698c097d458dc733fa74a63d61f53fd4f45b9ac1880d0
-ade4bad2e774af7ee6549e2824168f0aadebcc069efea4a90d4f2d327a242042
-9557284971dc1f1ecef59b92550929dcc42a3168d7f5df5d18e53837ca6bd01e
-003a02c3700842fac98946f6d516ef503be66d4897cf2f138286ee3aa79f771b
-4af8541855c21d583f747c294bf1d1016d3e4313b5df8fd2c3172820bdf19792
-428072fae237ea94b4e28daf257d41cbcbbf9c56dc2d964ad26aab3df4f912db
-71546ec1fb9dbaef67a4a8771f859e0e78a9f6972724df27f79ded61b92ff3df
-4de0f497c50f569891279b968d0567d17c99cacf6c07da376b986299423adc90
-84d4f8e93dead2970857b2c562244f898a59995b5ba464087cb3e2318eff4975
-5079a9ec897cc4dd5bed02e820619bc1edcb56385e0fde4c2ba27fb51a3e80be
-9a2116bf27a5a42e2a70487177d1ab878bfd89347513c54eb92abbc87d50ce70
-3e2d237187cc8abeda00f686bca95cfb404053b6261d4795e558f3886c523282
-06adbea3cb36212dd839d26755ac16632a723754890ac8d9a6599d6f2663f2c9
-b920d92da7c773aecbe0cc7b950e619ba5eb1abc667cd354d417995d6eee1b0e
-e43f5bc9061b897e0779b023eaf9aed24ea5cec2082050c92e0f30e23ba713f6
-2fe14d9957dace391f05e8370b9551423dd76bb50dc218d7fddbbf235753e1fd
-f35e73d4b81e2f8bce061451a2c53e95015a7be71df27847b628bf8d3b682b4f
-0ea381f5635fdd2b8e49e534a9c4d50e2e3991a7d5d418c9922774246f8e9e62
-9096c4c4bbbdb0b7fa78877883fe2f47f4570b4188d540163bfbd5d10975a80e
-c4a21c1ecd43e211ecfbcdc391869a27b06a47bc1540a708a4e58c2fce67bdde
-94fbf0310a60fc2baab83cd16b1c0c3b05a6fe84367b3e46f93a409633ce202b
-fef120b0c791a48d376e3707689a186c73135f034ec6bc28870ff0f9ca5c2dab
-2412d8292fdca20113abfff496ca34eb7829f43d6e1b51eb79ec9d331d6aad28
-2046c1eac346953e6db62225770dda2d02150601fc66f53f94e9d58b4d3499ff
-22494b4ce45de3739f3ed286e421febeaf9e125168babd9b705b51ea733e31f1
-ce295f4d144d86a26bc8aabcd042a4953ac9d61b90e2d4feabab18648ba16ea3
-ae99f53b971f48ce1985c0a02703f1c609b7cc77d551fca1a6dbae9ad7d2dc7b
-a61a5e6f8b729bd7623d9c73d33fe9ae249a3b776634e10dd49222cbc4705af6
-4e262a75bf5e60b249acf6d40358f5ead7fc3096342ea25de703909be907e364
-0a1315a1589df358b7eadf394d4b355571809b1e860d96f4d1386b9d8276b85d
-6ff051e2883e2fb05c809d189e66bce5465fbe830282a23f1bdf0fe3bbf77780
-8b2c93fe7b69d6156f6ec93cae83bbe9c54638bba8d6df08da9bafcb3d080d3c
-775c0347a472a23da6a22ca855ace9385893fa7d851cace8768fda1b2716e6cb
-fe875530ed94c49e8c67922ee003911c08f2165d97d8a18f62d040e64b35b544
-d740bd40d8715005dd5469d106a4bd8040fa53cef750287560433965c6656508
-9cdc19875262c227b8ca384cd97047d279224e13bc8cb280f18e163d1aceaadf
-d4986a6db5a6bdad04d188a927b6b7a8c21bd67bdd4210eca16dfdef107c8228
-0d722d8a3bb5102c0dceba5e75a5d8834e8f253bc5b9938d5099873e1848b0d2
-76040a020d677b2b5b4f7e029df54650b0d1408bb81824f003232c5e8fa4cc52
-8da2f15b4cfa2fd8770e0ef75a7a82d92fe20af3d5132d00c136a8740d88b7bd
-5004d69fc459d373672b2b72f3ca1fbe58a3c2dbe5708b57bb3c2489f28a9e3a
-81d61c0a661b8b039b1b7677438906399a6b8fabedf9b25dc024a038574d7719
-cc4686a43725c624d07a0760aac63f477123f7f4af8caf41874046fb963eaf4d
-eb027b0651dfe68f224a5631eec6342258f71bae4053cb491c6c37bd9c4c0915
-2a643ca05150b84e2342205415be8556ce7b2f22ebceea680873da60f1a1efe6
-97e3e9e43c1756a243d3a9757f1219ae739579d393d46d747bf36bbea11dc549
-df94f5b12386c770d6927ca29b80eb728d68b7c20438ba3932429e5e7cb190e0
-3213cfe74fe392ba93dedd3b1779fc44c85d9ad678d92bc25827807b607aacc2
-414b2d0d59147ab8e0be0d32f76b95b27fddb2ff275c870a5c441612faa47330
-5ff3ea6caa6cfd284c2349ac9e5d185beb1eedbbe07b8c2a3ad4766142c02434
-042568172b0d3781bfe703b149eaa84fd09e8d488b99aa38eb577f7b21c740e4
-6088dbc4e17d9333a3e387531f97b4ca1ea179952eb33878bcaa465333e1de7c
-83616e413ee6e4c5bcc1fde1987a0cc78d279468b9b1511081f6e3bc802e8d6d
-78b19dc59990579eddcfaad310e0f360632da25ed5f6f16d560ae7d0175e7b2b
-01c3dbd8c98f55f494bfc52b49f3227ce12dc4f458de34b2ad36b3b00168ac80
-85e35caa9ffb7ff60098e5027e32be43790a0dbdeeb8223b692aedb3d6c6130b
-b6089c764fa7897b9a36207c9fbf50ac0c481a37096a57da8beadd05bd16deeb
-d93fd56fe54a6097c61c1d647f2f52553609c3f936831f4f981862526139cb29
-48a02146d1815d3d078bc3dbd7c32f2167a70edc28b30025ef761cd43bcecf7a
-a8ea6619cecdeb83147467c3970c772db2989301cc8337350be1f55c8566d14d
-8d963234133bc7ad37397be014950d325d2b67d70232a50fc6a4a064dab0a970
-e7d4e1949f7a0e50ea970934a621330fd477107843bcc7713dd08075127c19d1
-5497f2a13f917c3b7a8917a5e7be2009dba70ea513b405b8926631562a0a8ffb
-4bee56250fd7c147f5b515a8f1032564b6baf2569e913e7660098d72eaf586a0
-078af231d4595d67cc0c73faaf4463fe6ca8f94a8aa8f9132106da58d45bbfb8
-3e574f76201cd5ef05d47daa02001a89452b5a8bcef2cdb714b0bf5c36c76557
-7e2eb7aa71d085de5a4f5fefd4b22e25854c21a8e9e8460a2686da7f4dd2926d
-3533f3fd3ef0d7cf276fabccf0c1dd01eaf32d788aa6e01d810713bf2d236a83
-4c67f4c69fa9281451c98307d7e69afafe851f8502421c4276061bd6c3790029
-5f72f1ac5d78564cc221302cd97889400b3238c65a2cb820bf23006208c65d23
-9b428ba1a5f9696665bfdf9057d645615993d7f572c6646d710482b9ed62f0cd
-4dd6515b31ddc3a154beac3d89c81c8628daf456ac62abbe9de7a5b6062cf650
-4060c23ae920cc4967798b6eefbc752e3baf2492d8327d295f710814eb11b167
-629c496c555117f76309ea311c03ed7fc7f248f7d1492587d0cd5c5ae5e037a9
-57e68d48f4b8128c31dd014ad5230ea69ce33ba6c0c4e6aa1e1a7b3eb2245445
-979a59d7796a059f54c3a1332e06906cd565d21c0acef799d9d8aadfa6f5aa2a
-309b296c1bd84c1fe08bae310f5f22e60c9ec7096490bbee14ca80cafee768f5
-7ca0d7a51894b2d52ffe875b3762d20f0a1500adda6a401dfc1adace27677890
-ec2794c07529ee08ff575ebcce496c16e6b36f9a9beb924f95c4566ac092be59
-1694ca2a76062112ac62b1360cccda1c5020fcb4f400de7e87b26391d4177341
-c91c4633b878ff121715bdf6eaef905841cb096f66547d03aea8d8c66dc7b603
-9b354bf14f3bdb74184393f00dd5840e23b08653d045f18155098fcaefaaf8b6
-2c548f4a756994f8427598ac8f68d7304ee37107738c74c0b1c911396c7de26a
-3f33dc50809c971c394d2846208999bdb9bbe252ce67cd7df343a4f0e108623a
-837a18e3f19a9689b823ede76f782b46d3635d60e4fb66d7a672b973d3d14262
-dc6e05092fc79544b2d82b03a089e8314c4ad8a64498f1bc699f58983c1c5087
-98aa563860b833bcc7c490b0eb852d2ec7ee9d9a02c91ae1e94a4f5a94688492
-05bc1df3e49c6368463303c81ebd9ec0742a8374ddbc39da1ba8e51d1e074e05
-1b3311fab5daab09de62bc9580ba9dd337f8c72fe557ae91caf5bb3c1932b544
-04eb6a55d79892f70331e72acb7093b38e7327c336fb6b4a6e6cfaf17ea978f0
-04b58b0c8a04b0c8806741abd1684835fd5a1a7c0345d5a2387f22ddd0b93269
-8559f7a4b1170e98ca957fc9c903cffd18fe9b92b4b32c508e53efb68883e042
-7f8b646afc1d1c597942e79111d571be9cec5221383f5f6b03193e0c8eeedd50
-261b9f57e594b795c3c7f493296e9a8ba1f4506f868b8502649d7784503fd253
-c5e99f3041f2b4cd9db715728f1e692ae507e234e0e8a3a8f6c732413b90176d
-48e910abc918ccfd30a33c872f9efe34a8944f692f5f770c027da9bad3f65866
-2abeeb55a57dc13c71bfb71cef2886453b43d9961172723556639642ae281980
-50fb7ee850651738a68be6420eefae78d1a20817ed96dff413656bb4a968a70c
-b9fdd1e9bdb2c0e1dd5d32ea1b50cc487de1f55407eadbf2b3fb9c03b64c15c9
-5aeb67cbb5ecba0889ea4708141e82d2ace7a841896c77ab00dfdbccfafa1f64
-61abe7803872d15961c1c31a6b1ad50f120d555471579bf02399f815988958ff
-97d0132e6429769ecfe39b270a07ffd1469246229cbc1450251e71b1beb00886
-35399527233576ead74ef01d7bd7bad02d951e93b2e71dd1a82c523abba753e0
-95af0c249ad1f5d59f5c95da00d4eafeede3a093e4cb6e108469c6cc80fdb8b4
-5116c29b0a9a02a48f6f77115649b583ba4474900f69e9472ff178e41a33842e
-78b476a924c14814191a61620e398ee3b48ebaff1b3635edb48ad16d497b3362
-ca9fe38284e1261344b34dfa8d46e43324b3d3b21f31146ef95c2c7c08029e20
-776474fa622d5f145ee66aef74e4d42b40e981fd5ca36c6697c2655b2183c655
-9901a8f632beaee841515da5956eb82b341d4683c37050ce998df19480662d7e
-2d09b430b0d79441295b2d599bcb59a3ccbbf3333745e509903400c74b30dfc7
-7da9616b21b268b07f65a4a32d878feca9852a78d43e341e893238a2b2c0cf1e
-3dfd75592bb9f15c4e8653dd6e8aee0b772961a9e54696a266506ae7146947f0
-ea378bd1ed22b391795bbe5737994bf9756ca3019f42a032435f9429eedf2d41
-5ff27dfa5aac62a418667843ad3995684018c1b1de4ea68848e3762818e5b80e
-0d5bbd9dd866753537ed7ba8ec145d49df30fc8d293d69e3083209754a4b425b
-99e39da47bf27152049231f60dc3a849ad6a21b86771e945877cb2ecf7451261
-b5943f02252618cc734cd0ddcdb312ab729f35826c89fa9420fb1ad70647a74b
-70474ddd8ae200fca9317e1c50f9cb68de8379399bfa7424e66311c9d7574746
-e19d44413a0c6149f28a340062946288f9f78b1c2b6f5233885e6a19cacb78f2
-31534202b24aa659211adc6420b95b17b20226e74e9ebe01948582b8ea2d3ab1
-78d5b4ed4c778041fc17d11157d5262c90571ff706099c5b06130412490833b9
-c5267a7163ff7e1d45c89050d6497d097826f5b26be150ddf1ee486d232e687e
-453116f0b6b7c93064207213540cbbd88d549b74dbea59176bb6d7f7712dd598
-5256a9273aa32d1701a6b2faa0da6d21356be95968dfc03221b0ac65b2b22287
-90c3cb64ab2a65909824dbee9b5399b0c651bf5efd603621b94feae2fde41963
-c266e40755ca4266496ece2fe93c4397d907cf8d413a230701e7045cb9da1d17
-f1a00e00ea64b45dbca755a454a9fb232a8b4b80d6032650231b9fde78ad9664
-71232d9076520306940852e529fc46d83fee4d6fea15056cf42fafba1e8482db
-6870f41187c0906484e8996738b52a946aa34dae017d19faa08c86845a85a543
-20dad4f4002f6625b84a1b4b80467d102c678823b676df24c9ca802d568ccccd
-615858fe6517ae56d631eba96da6b71e0e0e7b71ad9a9483c61574e23c47bfc9
-a0394b4bd85fe41c3a8bb60ee8c6f788017ea90ede0a70cf82f14056b24a6c3f
-58849d613f08ec3ee21d990dc4fe661dcf4b3afc8ed34ec2ddd279cfc2cee1b7
-f1929ecb72d10752ea012342923450110ec1868292babcf755d0b393768de27f
-702fb68daf1154e8855a89bc32bc378580ad405a05cd12b35826a9d88a3cfb65
-987f364b89c30340a2b1e25ca29cec4988afd940c1321d12cbd50eb411a29a65
-657b2e7fe642bd8c90cce146b9d216b7f87aa135ffb9ccf0fc8da1146bb6f03c
-1cea3f7d532fb572bae2db81b7f15c14de973f6bacaadde5cd0333e71a9a539a
-8356038f876ece85f7e6b2d057ee8d48626483ba054f8a662991cd52fc317738
-2d029b04dc44da269de8be9b025f7929a34ccb6efeef271232894ba8c837698a
-fe6cefeb4c1ca0180215c2adb029986953af902ba21c7531850ca7ef798ce22b
-3496988dd07347e36f26cd55db9caaa73c5ac260256432c9e0f6e3bdcebd81a6
-59e822ba4188ef395f10c448c4c09270daa19a856c34f5cf0f91a74ea962b4a9
-5459408633966d6730b85c54e2de6ae317409287414079072d9422ff38db6c93
-d37994e7ef1a0e65c88019e729528b51ad23bffad9ec9954de8678f03a307c43
-0c498a7c16b3b348947e25a896bdab2168bf3119b296a327c2378904045e322b
-9cb321d23d74f470fafc828404612288252f1701df6c743de571e2e876cc2672
-23f2aff00d26f1155d6d41a3b08322cf8eab002fe47f5265bfb67a405d4ed77e
-89cbb4a61b54e796b8f3cdf388d5418b96615c1312ab7d4e7deb1aba8984e3a6
-76dccad1bb953569931f8c26f7af460c5689412648cdb7803f1c93dd452a8ec1
-6c8e3e6190d558919b855b7b5db34bc42b992ea155615cab202009a96fe13363
-4f649e77e4268cf651a74b8c8c645aae6dff800ad17b194c0b883867151c6230
-dddfaf596c2639a46e6746fc3ccd1593d432063ba27bf2476bb3ee610fd7d92c
-c09b70c657a8255cbe2d8ac281892280d5f19fc27b5f0e912eed9c38007e748b
-079ce05131c3956dd078c0846963268fb4dfb5eda5ee8894a89920088f721d1e
-b725870aa43e92c565d10d5d796cc04a114b5c32e90c9c7f5a9b5d03d894f96b
-9ef0b123b9f90d1692be30515757e54c2f9e073c16c04587363c1e9bd4f834df
-4134a10fffc0b5960a83c4f75979a14bbbbd52d4d4b5eb75901fd20a36613826
-0d39c035f3144381fb6d4eaa99953736614d1a46fc05f800ee66ca63b1c6ef10
-673e4faec2288afbf5cae62b7f6ab8c80e96c8cbc7b666ebe78e68d184d85c4c
-d8b92adb253aef17ada1dcb3eb1895047b93163050a6f3c1a69a7935a12244ba
-cc164a780f44dba4c432f913f5b649529721b123f4d6816ac8f1029bba12f442
-935e1b03a434297d33e03357e0a4a56a10f0fc2c16dcd060cf858b58f3cdb5b3
-4f571ca4ef8a7a22bf7b54c35b38aeaa6548be8a70027994834ba2d55b4893a3
-c70d9d44cdf6cb9d1d6b92af027a0fa802f207d34c10f8c4aa3a2cb64f8817b5
-78408cd8f98466905ec58a8df6cf060d6ba17235dc6591e2ebf061f5a7f1bf9a
-7690df303dffc583b98e8765977c887e776814899b45feb0f0cac642912d4b81
-e51c5ae48c0cdf9024cb96f421d1b7ae45b5ce9d41d9d35c2b00416c8b9c032f
-b27680c1f8c1e55d9973a698180a786b92fe97c1b0a9017e37b51cab3f388b2f
-42329ec38e452fceaef2152d36471573caa830a5c80eb0ea73c1c7161f7b21b4
-cb7d3e55f29e36dfaa09c8b3592fd8afbb64adde44d8665143ebf1f3afa1a5eb
-a16860b8e8f52eda1a6793be62ee8a682a1dd30b6482a3188b5e6b8dcad4c688
-98e39892691434d85c42922a035c752827474e01cfa507d0c434f746993ed746
-3d32f530ea324bbe0ff4a38581296788fa2dde0db5dec9666d8af2deb947f200
-b617a83e84114e684442fe3360e0a66880f3a87f1030dead88eba805cdceb8fa
-4b110dcd71f720d93de7c0e8122a09081b9cd1152dbba5f0411728ed87028a21
-9cc36c72bccd73e3cd517b9a7210cf1f3c719e7e23511b0f0c272de69951e0cc
-c264387948b95b3fd7d7d849947117e1f14bec10d2d718374eb09734709ca60e
-c7037c7c3c5d1b9797b9e4c539733fb69fe61cc569f76b269780fe9abd497f54
-4d728bea738a4ec3e17aae0ffc36c2bce74cd24bb8a2758b9c8554d92a64413b
-ad5f35aafdb387b28f1ca329a32d8d99db75121207109e6fba304fc86e027bab
-b631f93526be28022f06af5126cf0a69c7de8aec8043aff5a47f6397097b8dd8
-8538bb33987fbdd064558e7634612b8b2c22390f35b8096fb0674fd62084d7fd
-15d98b22fab5dd19f9d222a2c4d2573badb76db8383c74b4996cb068ad4856b3
-a01a8f42bda0501aa7c317c275e050a133df090b6274f9beb1af87f8b48f7b03
-64bb4e937369972839448dc459dbb463e8df91e0fc7fb909f5a423ea9aeb2f23
-0d24b27dbe955c4b6c3a9d22603b42c6c5ebcfd67c74f915a47ed1b762e10738
-b7f181feb8e6a3b2b764336966c6acff5a2e2fe237a4dcd64b7dc7b7dd33669d
-8dea06bc3c1ad351e2305335036b8f109fece9e30cde9ae2f472907780dc1667
-e34cc399da1ae24fb728529cf610c6592df901ec9a7a1d0c52ef3840a99861da
-b28412b3751b07206391aa61c33ca87d4164876b92bd6d27de24d6abe4af0119
-aed63c73e43a696bebc21252a6c39d5ecdf45042d230a583e177b1e41167ff25
-1e633941dd1808f8a4436e663197fd2442e085c596d3fc12b654f94f05453599
-e7957e70a965c87132bdebab6eb857a450c23d36538da886be9785a15ed6a2d1
-64dcce81504e271f58101d36257f8cb1d146c5dca3d00963d245634ab074b95d
-d490b8a999b83ad4e4fba3573858fda34ef4735ece350868c4ab772298e22b6e
-d78e9faa6af70f400df8c6777d27a205fc1b40b26e9ebd72e37a18948d447dd6
-021aefcbc2ab7939928daa51eb03d66172d0d4df7e01b032de40c3ff156e46be
-28fad368241ae811d6914a3cc4ecb640531adc026496999ffa429093a40615db
-81b63de704aeb0ae6363559a0b70d55940bfa22415edb9239b27bc5ef0e4fdf6
-3a91764ca5dbc491df84e07875da4814bcae9b715d3e4dccc55cd83fcfd63696
-c30648600c986bdf4b1f00c1334b1403670a56d0cc8bae15187e1f4dc8082eb6
-7d85d9413fa5bd3215c6af814cdb8c1b7dc579c6f8f2bb11836a5760021c0fe5
-e715080339b24aa017ce4aae8bafa417f889c5d27a285004429383bf4cb8f65a
-6bb72bcb975d903020bc27752c7e40a2d00ea67609a04b125da0ae443cba553e
-d3d7bed8408f3cf9d22176f96382fe832a85fcdc995663c777ba80b9750000a7
-921d3fb174ffc454547a90a74289c2a5b49029b3e7798f5587e9c646ac23f2b9
-254b151cfbab3472eff67ded7ce08db90c0a9a858b3d58e7b185212a0c45c1d2
-ba5d5527e23860ff4a9c985f74efa6c70a749206addbd93278965d3b6ade68ca
-8e2e9ad4974a836fb78836fb95e4fb7dd7d6c2b5423334aed2644b09259367ab
-8a06c57a99803b547e3becb7ccdbba446a7061d624a8ed0ab1f86740351ffa61
-2f55ad009fe1486418119f3b9932014cc92ed1f13ec433c62c3a004f9fa207a8
-da0dc1d5adc59d2268866b143868feabd83a7a27aa68c1d2d31b5a3c5b2dc1b5
-6f65f46b5a3e33c9d2202d901c9eb2b100667903493999f0a23bff58c6dafedb
-7f2914f65e1654579b4a7df69ee950a223b679161f4455cde3d275edb6e8977b
-5067a80d040e349655f4a3a60adffa2a9e56a4c0a3b1d4475c29dbcb177b18bc
-2c755214570988ebdcce1d8f54c59fca0b0e19116e6a2bf951ee7d00b3feca8c
-bbfe7c9914ff0eca51ac6273ce6e8f5915eae72bb2e3b8c67635da114e783e91
-57f1ea86d828fc1aa506e0fd7843bb036aea75714c5638793076f0b87de3f6d8
-8527a8b3adfb5171c076ad8fc47b68f186af94a0de3b7badfa167cf09c7909dc
-d9649484238f6be5c2cea6b58f37e55e6aa1e331d2bfd64e5103841ebd324f3a
-f9b9d7ff7dd9934a1eca605ba4a38c926c654d0c9ed2ef59506fd93f25ee09f9
-ef6383481ff4f29d33098d0b1c3675a256d924c8a344590fde46880cf9c12128
-dbe09c32735b56de14dbab2957fae3ba143a07de4b48c25b399b0e77d537da00
-f0fe4d154f1e9a09b9c4bb74f62ae698fbfe43bd06f038089e8b1876eb07e249
-533f9aca9fe1eba0d89e0bc4a0f98488462a11f95f6d77ee6ff20508293d8e71
-cc81d9bc80450c2c6e6a0fd46b8a24aa263acd703217ff2e19e7c61d7d1200aa
-b8c6234e397ae8f474f7afd9dabb65cb6de25212987a8530dd5ee78aeea4226b
-56fbc58fc736c7fe3eaa7a842907cb4f4589814479ad2a09bd1e3bb0bf575d15
-f0aa886a56e30b5991f7064d4b298c4eeb2c6a33a7307014315e3dae2ff72581
-283e0a607a7d8c62766a23f42c8722590a784b34f5e97b9707bd45fbe3b08630
-1df111d0aba815c03369f7caf6aa950498bcd6bd02736bf70970525b70c023eb
-11ef2901a01abc672153ddeb66264d59a7eca681c602e1b4a362bd4fe09ec788
-2e739d4c3aa9ac9446b2cb7da376c4617cdf9fe436aab026d2e23c755be7ba9c
-fb61013c90dd986c2f90ab7444661c16ac4db3a8402b03450173aba644a61e98
-99d1cafa06a27e428ecd6307ae89b1747de0609ba95f4d882986a904f1c1f3bb
-da550327d637a29fb1b4b23f5e08772889d27bf3cb461144d0f01db6699b2cc4
-8c2a7cb91090432d70fa673b7ade79f862e9b79a94f06405c44c2b0de8f233b4
-8080e440921cfabc9133916a0419613528f04b00275b140d691f4057c5420d49
-a1e53fde0e926a60613d1168d886ba0e2d5de629e212cb9b8b4e2253a7c7b531
-8287a0fa5438528bd414e679d20b92d0ae2ed58d2c6874354ece38b933a1da35
-508e5c4e63e62437a77a443a2a9ad7044d63f36c23b5f3a2ab443c717219e02f
-dcb6a4286f765477eaae1a18bb63c3375fcd109a953a644e168f2ac0e1d85f91
-3d62b34dc51e3a134aa30bfccfd6178cbe7dfde088a435ecd7b310f5f10a5b8d
-9387ad196d7e1b37047670c8ef0397cd1f380415de77419a20ea5349ce908027
-a8f8d1498f5bffa712690e4ccca077a452c902fc4a9b7c7882ad7b9db0d626c6
-7def29713c25d7ca466958350d56aeb8dcd0987ac05fce2205081d301cd3e601
-f386f99eef9857fabc6bf49a32ec3d4a921ed57063e5366cfe51adbcc48b3fc1
-ea1e40205c7fccec4fbe6dc0bcc7af55984f6e49a8a466e144b7e1bbf63506c5
-f60caa2320f9ec1732e9767ff4c9effc5b2f9ba6a9dad549dd30771c53f9a4dd
-24adfd39cc5be74851d51b4fb038b22fb65eca6cecf6c7e902e9391c89b1587c
-509bf28a987cb1c8ad74ebe7557792a9ddad7dbdb1a367c633a8eacb91e3131f
-02000b5d06213700a011011cc1cfc3abe1bac54878cf32145d9b18eea7b59b9e
-19f551170b92472f8922c0838f5d7ab5421d59a325c05372fe2c4c37184361a3
-71572d378c3d0de308e2c1cf3dd7f2c3dfe703de9df84e569dbe2e8cf00c54f5
-15db602bb2d44d1f99cf2aaaf78953b4e838fc1532e2ef4de4f0268b2e6e2c2b
-cdd46138aac78f9f34d6911ae387008d594291c7a57d693386170e7e6d377cf8
-11966b59bfa3cf47fae49324348a91f80399e29991d659b32e0fb0af79763ad0
-93630b21d061cd935351fad564039a2fac55b025a04e9668771118e86f9216bc
-55c4cc8ac588333bbc1b8fbf6b76a08bc14e1f83a683aefed0e20c7bacd2ee51
-96d723daf15279d8e2ebb993847b43d63e4960ad2f4150b07fd081517de48a9f
-6f4ab09802181a2e4e44cb0204200fc112fd99ee2e09cbaa3c6d3cbf97f95bdc
-a4f6d06ad415ebe00d6a78c3ac0ce6cd4dbc06d2829749b7e410e6fbd6f8390a
-b958ce73414a8766576c3b642916778c22cfcaa498afd93aaa19cd506e231a81
-f9994006f5e948a2b20912d70132e6a0382666f35fcf21b6edd947d1e497f66e
-da9cb07d716cabfdb6535e5ebffff6196b495327fa4e5c60778f76b40d46d4f2
-769ea09961f24b8110be2c59f426f16928866233066135ff9e1f15379ed5b11e
-de442dae3895e438ac05889c683687242a4758f1a234ef144510bbcc89e20954
-93272fa2dd7373c6b7cf9170287f4dbe3022b20bfc08e27c3232514c813e93b1
-cb37193b2eb17a832c1833ece9666aa24c12424d6c157d4f279e1950d45b4940
-2c54e2bee3f3eb017af95881e32f009764f5e67b93eeb2172023b510a874a159
-4975ed54f35268d3df9c2cfb65c6316b8178d1945abae3c5566b9da3c8681b4d
-acee486d5084d66e88620af120a44b5e35ab55591ea5283b4a69a31a9f5b212f
-96456ccee559dd42c58b6da34dc181a0ec0a5be41a9b3e0958f399d083fba072
-686a38da9b05355fd47c3f59708c7b7d4c31de833a87a4d8da6abb4b9d2ef519
-7575de9dc5b012e2e3aa51c407afe407001a0714d7ef1184b33afe085754edeb
-3ae4472f53011049af4ce4e0ef299720cf8c10911dc0bcb0f9f81a8caec00855
-91b750dcae4e3b0e0f507c25c1ca59cc38e366f27ea5f13427f2bf6809fcff29
-5d513e03c98272a0a822592dc9682a49d9324dc1c07f5b8b933ea9232ada0108
-27eba8837797d8782f46dadf53cb7404cb6612e71820478bf37f88615ada4989
-00f10078a2385cb83c8e41aa5464148bd90f7f2a18fd0b3f41a78b10471bc33e
-0b2815ed757515a331a6dbf861844ffcbf6b37ef7f348d7d918fefa2248d82d5
-56580cbbc3ff9c079d04b9ab4fccf1682c0b66358cff6840a9808d91374319b3
-09fb2f795569eab9c00e850a50afeb42248a251473156bf4d220f220e8acd814
-2554128f83693005694e19707d0630ddf56bb55f47f21f87c37286015677685d
-d6763e4a3e28de9d9f7292f659ac307ef3e83d84529389f7eb0639c02239861b
-86df711f11038176d9a70b04aad94f14285bd7ba4b264696c383bdb6cde76ea2
-c3870ada2dbd7fa7c70e3fbf92ee9baebf07e97da553aec0c90ea3feb38ff428
-7625706fd41f54aa6d85124920c33c48228cdfb0e426eefbc3732e12813bd368
-01698802e58db4eed2aa7fda4c1e439ce2012457c55115d69eedb9f587e46b5d
-35abf7e7372203b01ffecff24226de4e428217c5313a2e8bb58efd0f465cc612
-c143ccae5d8b6dfe04583b1168259f15c363bd4a7db272642b0816c7e0e5ba0c
-b2bb4690aed8e0455b878e139c15ffa403828e30c079b3c3a26278050ba66ba6
-fce91bad29dc2d980c06678131d961e47363f11856b72f5ca039fc991ba248fc
-f838d935789da19681db4d9119cf55bd29847d2536ef4f69327163c3e262cf63
-695d42a83ab0553b4c72c5eebb9e71c358c5fdbc209ada006f885f262e3d077f
-b9966e8f53ce61e144d5a2d096a2ba15af75790609218bcbf7097a0342e1dacd
-4eecf33fe3c4c7dff8b4c1f501007957f8aaba2e7176a707064c266cb723ba18
-6139e0bd697b37528fbd3a4bc8be5f7c6a50aa6fc65a0a52fd310140e750176c
-698a919512867a1ae998b32043c0e11106f81154aad48fa3f6acc98bb2b38493
-863b2ab05aa77dc16e5b01b328d10dd7af79ec3a5fd38eb7712e9624cfa2a620
-74988bbd4014a7816a4826319490594c0abba1643e85e961870e7125de720ed9
-db31febdcb739b3f8f0a5a2803819f9f7f3fb3ac983e3b6743c7cb3feeebe578
-0b0456f15047a76ade4d764e56093b19ae91d52cd93ca61bab22095711e2dd56
-cdb2db4cb0a1120dba8939720c84f2faadbda3b0cab8ffd83bd77580e0dd59da
-67cebf38ac126e54f6b70b55e7940c6b44d459757958c13f1c6f248eefb5af86
-48d752e91788945fda3da668a887f657de389b123260e3ef4f1b93393c1f484f
-7268e84e78585c0a3695ce84bf217637f8326c98407c1060a00ef8950e498d0b
-79ce31264ab755493d4ec00babe341e431d34c8b7228d0c5297bb776992586c5
-ae9ceaed8020f3ed8c0ff4bb963b9c488f8ca6c667c851861e8410973373fbf7
-56b0355b1a0dea5adf037ccf59bd1d4957c116187c99c558d5827d609dd27cd3
-b2fcede2d281ad3c33c5f9d55cce22bb1b8e9b14d9b6dc140620733a10389574
-eed9fa2caffd5591b8091c8533cc29d600b4a75b738f8dd2951983f06da5cb54
-26c1b1039bdb3550ec6cba9be971034a125f58e74152bf38e59b6365e7c6be2a
-8d5decd0397e0edeb638238e8320f0425c5ba6f18ed9bb32693dfe1b079ffaa0
-3bef302dad880b1b4625865d2e8794793e1e63fdd5b0acc91d1f83d12238427b
-47dc31e3b218ddef4813ba2e15d872b0e6b640905e261405d148de380b062b9b
-a73f115b4f5ef94d4023bbad60fe61939b5c6cfcfacbd85110cc027a194d92b6
-f64b2b2bd0c5648e744da3048486e5d9b77b45f0360aed982351fadce42a42fe
-f2151ec97e2e546940a7d9154cef3b2b8dc94aa1076369d9b1fc54e22d65b6c3
-bdbbc16f315b52e31933acb14929e23f0a1806d7bef12578a6
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
diff --git a/lib/fonts/UTB_____.pfa b/lib/fonts/UTB_____.pfa
deleted file mode 100644
index 36ef339558..0000000000
--- a/lib/fonts/UTB_____.pfa
+++ /dev/null
@@ -1,1134 +0,0 @@
-%!PS-AdobeFont-1.0: Utopia-Bold 001.001
-%%CreationDate: Wed Oct 2 18:24:56 1991
-%%VMusage: 33079 39971
-%% Utopia is a registered trademark of Adobe Systems Incorporated.
-11 dict begin
-/FontInfo 10 dict dup begin
-/version (001.001) readonly def
-/Notice (Copyright (c) 1989, 1991 Adobe Systems Incorporated. All Rights Reserved.Utopia is a registered trademark of Adobe Systems Incorporated.) readonly def
-/FullName (Utopia Bold) readonly def
-/FamilyName (Utopia) readonly def
-/Weight (Bold) readonly def
-/ItalicAngle 0 def
-/isFixedPitch false def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /Utopia-Bold def
-/Encoding StandardEncoding def
-/PaintType 0 def
-/FontType 1 def
-/FontMatrix [0.001 0 0 0.001 0 0] readonly def
-/UniqueID 36543 def
-/FontBBox{-155 -250 1249 916}readonly def
-currentdict end
-currentfile eexec
-f9cd86fd4821715265f16a614e3770ef80561e77ba6ecbb4ef4232445eef2839
-94e93e3c8c9b09c09d71542241821e07888ceb54e8cacc8a45802f50c0afeeca
-5e3d9114c1860bcb2ba5fd2a879a0d79953e30c90d8347513f4ca5f05b2e231b
-4973bd1e9db66a39d846a8b3d9e48da72e2de8743ba2e104893167c235719245
-87b43ed3b6552cd85e4bbdeb9f46bd813298d531c74be81995a52ceaad4112c7
-f65773b088bffbc9874f615371c5e7b50ae99d5b6acf9c80d87057bf3a424377
-f4284b7232096b6ea623dacd1c925ce09cfa6515f675aacf815c38e984b4ba40
-0d409bb62cd4ebac75201c8e782e68fd73e8622c46b696b1ba37ca9621400041
-d95b948a6bbc089fe6b230b39bd358228af9b3e68418166a9adc4e7665341088
-c47c074aa4b21b0949fef9929e1a32ffddd2d02145cdb256863cf6067d27ed9a
-f0aba85b1e0cfcbab7e74880e9693b5626ad31e6b5c2d208087d86c116513212
-710c9d6ca50e1503f8d4c2863fa378f8184189af0cf109f4affe7cb74563d513
-2104fb9dc6f3f5992e075633a0baebda8ebe9a07c3ec4b25fef015d9915a26b1
-d401a6722015090672714181580350560caf79bccd6040c0c1651d917c73107c
-2d46aad5d4a370b55e896ce1eed127b6f0aabaf7c4ca62e89003032abb2c95ba
-58c4a0eb0bb1a59a439a6a0c2082e50725b9e8139324af06ff03b4269a697342
-8fab0c1fabd320f1452d9c435e48037eb8cf6df4233cd9c05691604146cc813f
-7ea131f21e9863b7bd1b087a583af14675b9bd31fd364d5dbddbc9b533a6ac38
-c4bdeb28a1ae3d2b374da72405acf67b1b3a83d80726301b3677c067c748d857
-ae1da4f723d4365647de10f90e96dd7e9ab9ef5c7e6866a13b807fd3f78136d5
-72950a10bb0165e61f12c60a813c7e35eeb9a0500725dd912ca2deebb238538e
-790af851b14643f40e5eea13660e57b5c407735079a292a7c162dd11d0a3d342
-67290f1c9261fa5de6b92ca1e7daeb7cb970c766b3e0396ec0ce55dffbef0bdc
-b437fbb4d63634b9abcf5844e76f9313ab2182e1fb3c47a705a1d97b79e93dbc
-5e48ac19b45f9be4b9225e5a7e1d3679dd21001eca3c08d6febd35fa5453290e
-1269c1d195e45338c10aa60fb8ab9e5a5aaf08c82e737f082bb6216d7cc1d5d8
-8906c8b05c4432d04561377438447eb5fade652af84c1ced99551365cf9e6f99
-03d1593de0e450003fb0d5b5588330d6527fdd0c8193fc0cd2293012310a425e
-0ea0f8b901b991648ebbc894cfb7d95da6d35fb7c947e887bd3b6599e673b921
-c96f2a033e30b341a14066076ff0abd5fe77f393b548a15ea2185f99a3545b01
-dada854fce1ddd3448a9aa42ba260a4f85a0d1bdcf08b3de2ff8b6411adff446
-4a2929193ade35f4e26006cfdc45929250bb76ef007043d739d798a4973f350f
-52fa1690423381539e3a4cc458600fed91fa8e16b5ae0aca710dbf318d16e3d9
-16a082a093b59f35ff92a1b235d5621e87ab471310ca26a07a9ecdd3cbdc9bdc
-7506ff13b886b26eda6d4ccc52a312593a0f2845a4a30aef829109e6b76bfcbd
-2f2fe267d9376acc0686c9b1df3a25fc41d9e5390a90249cc26c502e4bcf582e
-ca5054d96b6ebb2bec79ae23125b4c2a13a97570153b83dfcc4d9dec9717679a
-ba8c37c02697d8f47269b9ddb983bd4dc029968d0d1729bcb9f94c899906af40
-0df490eaad13acd5a893663fc90a850533263cf6657632e8e4df31e6e6636521
-78dac783feb9616172d7651e3e4092b409383ccfcf8aa04b330119c334d6c8ab
-bdf97d97fb475c25331044413a117dee0f15d6560cac5ca6c01c1c98b56d2971
-724c135de3c624fb7a1994a8267ead0628af72d5af1dc0ae3177c3b678dc15cf
-9dcf100dd9de9bb71f568661293515002220681b0afd9775464be2f66df08c5c
-7d3995a57ffd2af299564dd57614e3273d8555f705ce2a2cb095cd662acb8163
-dc5c587747e27fbfab667dd449228e7b2f40cea584c997d2b98e78a063edd327
-9e23947ba2577035ff349019293b13953ceea11b49b230e2a29d295b032ebbe1
-dacf823e3587184182d0b910794a1d784f0bdc21c74a65d12b5875cdf0c1cddd
-5995a6e56c9a95dfff55167f82b3de41a2eb653b0d1eb61e9c48654424ce13ec
-8671211b2b8a78839a4569b3cefae520e91c538f09d96f98ebbe905b01ddb080
-f7f6ff00d2f662e02bbe7dc3044b66723956559669000810f706f4ad544b9a29
-b384f554816696eb7b59540b407d438efb6c8bfdcf05324cdb65e9ffb8864a9a
-05adaa3678a341983aac1f6bed28040df2f0e18d27300cab0930958704d900fc
-5e194b149740b089814d1050e11a9d885bb1d835a7cc092ada9f08858e1ac5b1
-84b6fdfdea41d4b1241ae64fa3c47f125f48cc05c5dd8e2c896bb88b0a846379
-4477252f0d7abd31d4bd5703b9f280b09a59bfaec0663dcb2ccce2821e0e382f
-837f4a4fdf0e57d531383155f4fd633bc4b7315e54425a0395bd91f050783685
-eb0b85e15e331166795acc5dcb2ea1239209f8296c2c4cd1eb15b37e3ddfd2ba
-33a25c3761da66c0c08635101534607ca02990447c210689d31e49376d152161
-7696160aa2da75f993535e6cfbce229c657578620d7c8de8cf720f21ccc22ed1
-2be5c92bf7e26cb750f707fa7e2348a04a642ff319cda45fb9884caacb562df1
-365992416084a4d40da9831865b02246bda402f4354e8882e98215c37d3eb3c4
-d2f9ba2b93f190005da1bbb506a5d39e2a24be0ddc50e1bc5235d221a151698b
-803f0f0414bc085a395fbada62a73a9a3d4c66415ff1704226f8437e9bc470cc
-63011be0e1f3dbe6e6ad3ff35541961f6dfaae1425b2020349486880fe7fae78
-5a2db27a586f0daddab8ca62887db0a18462a9a3d821f31923c583bb731d7299
-f051b8db5f33fcf53c37c1e4ac7fa0275dd39ab9abc97cedd1c65a3d514d96df
-8b7a49217fe1af15b5c738e927028d1ec523e8e8575f018e7bb3f7e9afc81ff9
-3de7a4969ba59f7093772e5696bc4f2d6616419b43ff26f2a9da0e183f7bd542
-b31f175724d2e8f18a61ccd010d8c18394f640f905b6832fcfe7d3e9c02e3e03
-911dff14d0a1c73129ba85e2179372aff3c028388f30621d1f8aac757660079c
-63c22cfec96ad9ee4846c0854ec912abbf3f934e293e0f1211786455019a7f7f
-38f9e877f4186a9440c75a4babf3a9fbad1c5fc484082e1be4084ca3018b676f
-0e037cfaa4195a18948d8bb46a6d00b68213c09d5e69673ed4e00155fba9d840
-9e08ca2dffafc93110751b59ebc2b6ed4bf5f535ac9d73c9399d9081eb6b2ba0
-a13aabde56a7f9200749c9e866cac735bc6e2f7859cbda912f0c26e85d3f7b25
-3185ec64546cfeb89d3992b12815e70a548299615c6889379218c0e7dd1cffaa
-ff4ccaf3c35c77b09513b5f9b0d501322a862af4f6df0af50b62e4e1c1b3067a
-f5b24a44190c41e96b659f62921dd6075609f7d7db532298a425c675e4537952
-bf06fa9b1295e32068740c361048301f6ba6386602b8cb54bf8f38fd77669f5d
-791a7b1854b7f3effa193e9e5a435694b1c8578ec78426134c9c56e6c9f08951
-2469a5137bb452be5ec3b3d27c3cbf6e6fee0d58d73dd3d277bb0c1540ad102c
-50b746093832be65d05c102ddc982b08c7ec1fba629dbe27d4604c1476d91392
-801f91ff781aeabec88132162e021741f8f31f06db82b29d17fe66ee04e9c200
-5240d68ba82373c7a567ba33bad4aed1d6b5c570d03c5c394c09e5c5eb9e924d
-9e1c2f161a9d52cbafdad75dd674327ec81ce286cf1abfb5ddd8606de9265784
-5c950413caeca8ef80303793826c3ac4b58d9fd4b02fab612fdbf71c2a1698f9
-048769235eb9dd35823536662ccccc128c74818c8ae48edbe9a4624ece9d1ff5
-39795c7b4808520a08d611af58eec60bfc8d272a944201096c45749bc97f32ce
-a52618a1d6d53267ab4fde671ef1a47b03687a59e47a8e277c02a618af09b78c
-f5be89f5da433ea9d31cb8319bbd220099a8d7d2f879abd99b4a96b06ae3f8ab
-4cb89e72fea1355a010405cd72dedc7bd35b3ae32fac3d40642fe88e7a938579
-f4c10f751174cf042331e7274eeeaa28e5829f0e6e866783412a45e8ce8ce127
-5438c3fedf8cfbc9078e2b6dc439d9a513fb2a74a672b496e19af3c092342811
-983b1a3d6c60981db5aaf03b1fcd375f4ad64a10b57d378f52f29cb89dc77814
-1dd5106934bae98eee32b779eddc6cb5fd13d38ee5b39d4513338af4feafcece
-dda1f3d9b6f0b5cae4e7efa14921578cf07ad6e1eb7e0a3bf7d52bb7e2fc9656
-32c5c642a6ab07c108d79699d56727db2da956cb576b97648ade80eab2ae12bb
-2dedab0672ae666115758614c91108c9e4a4da0bd49f15379cf6716a303accbf
-477ae6756d18a0f6e3801f72eaff179849888104e38e69fb722a385a630e06ad
-e71c5553a14c5955f6189e08f8cce45ba8fbb5c5b6b0bac8ca48d11c0656f21a
-9b9286c4f958db61b111ffd40b3c8d69720b6e2eeac5452ba0837fd6806464f1
-0cf5bd73423b9f065b6ff58954a9090a53e31a16fa9703700fba14f8b6666ee7
-4b6a7bec61fdce1fc10245e2e90e31463bb7d326857e389d87834ddffa9ca581
-5a5abc54a958bd3738753e38b255cb1012cadb7278f8e84d9c649a4a659a8385
-19e128ddbd0985505fc613d9c577fc10c429648ad18771b0da1087ef584c2628
-b91d33da27c403c0214e0b7f984a9bfe6c2c574883f446e4dc1a563c32898bff
-ca2433f1161168565e063ecf045408d619f2a3215ee881cbd13a7751b14189bd
-a0cfafee7ce4d9600fdf993ceddd965c4a608129c89b52b5b59419ed079a6f57
-9efc222187cf25f848d47bf3bdca06ec2573fa8fe20624cfeec3f9ead6ded709
-75cae667bf025ad867944faef14fa9d6617b74cee3804d5edb688d9ed4a0c2bf
-1aede05eaca61e297f03026864c738014d8afd79294e062e04e5fce1a784d850
-b00e58fdf6fb5182d6ff08bcd05d2c7860dde223a37ce53131c09cba9c52e9e5
-76cf7e58bb99f045c8b23d67c43449c6c3f6acdb5b5f35be96d17fb0f8d42685
-cc79fbd421fdbed2fbfbdbac976736a6fb34c62eded4a12ad456d94aea2a2bf5
-f1fe4e1519361177998c8272866d26cc0e1af48fcc5a399edb8550046f3e8b31
-baf20c0ba1210fa2487cc2982e3d39e6a630d11813801bfdf4cc3695384410e6
-067d10d37aed54394448427032c9cce4d00f89418f10a45fda8aa392db636c06
-a26c0b39b25f128f7e5ad81a548f643eb1802117172d9be1fccaa3f1a73b7c1f
-1cb21f7f8f71fd8d063ebf41cf2f3eba32392f0303affcb36e113a7e46e5406d
-20e6c47a9be1e8f8085a8c49b04d219e13082d344c91dda69384c0b16d3fd7e5
-e46f213b789603c5d89257d6510ab618f24df56b1ded2029779af220b40eb86b
-cb9ecc32f2b1b713132ba229c3bfa888b014e12ccc1cc902b28bd5a9d5263ac2
-a47b38f37f0c9b279418b1bb81b288d0312667dfeb0aff86b8072c2bbdc79835
-f6a04d34c0825caef54293348bd6c672ba2ace4d7d3fa604faacba1a42dfe02c
-0150abaf33d0a6582071af6b15929a4857cd57048c9e32b04237ba047a2e2837
-a23da6917bf5912e2b1abaab68fa65891788a6c3b30ced2fb907e603a7654c27
-976d2fffbad1538395c05cf876bb3b64198e0a1b94f40d748c03373736018466
-6a9a9e53e0a159ac7a5890bcc18cab7172dedf4b8fdea3544184b0032edee0f4
-6429cd0451949277013d89dc6bbb23566cb158489d168a341271aa99618de261
-9580e6ebc094ebc5d7122fac0cc95021df41feffbf34ed59dee7556ecad36d75
-12b96ace5f81203e47d9e3b9698163a175767762fe2278648d0823b7a41e8730
-16fea5eaf17effef6b2c537b2727de3ab71987b49f9bed16fd8aaa06e5580643
-c2514bda11e7fb68f310bdded37ff6e6fd67b04c83fb8ef288da520954f0c2e4
-ee463de5ce7bcbdfa5403a4de7c64a7d9807dc7fc21678fcbee60d8b2bfa59bb
-c8303d7f060c0a2182f6779a386fd82b9b44550a03d98cfc0095524a7308cf6a
-e0c2c366b8bba56ccc354f3319a888e1483595b28f38868231631d25f50743f5
-07d08da61232da0353fe9fef9bee08c93e66b4cde93369efa538d03dcae19d88
-1fffcbd05c767b97fdf225685d18d7076b2b9b788404b79715b18655bf816f57
-2d96ea5f0d6ec848b399d0629c5775e5edde2a79a3dc6bb189506fcf65ff104b
-389ccf9387a3d6d243e4c83a5d78e9ee659b8e47b54559c80e15e1d9b3fdf838
-565e0ec14404dbfb5da05ebd0c3cc925f2a0be3ba741b9dfdc0531c2d35985ff
-89268541bbc6e4ecc13a50d937cead6b3a9863f85a8c1870838f4abd35494e28
-92248f65c7d3c452f6f743a345087661c3f5e8f09cc6854e7f2d6b5c9461c0f8
-3170337fb694d91478be1ccefe270f28e1c8ce48ffd25ed2dc83c070289405ce
-533af0bd4aa922d8d3b9220edc5b2fe6fadeeb81dfd270ee469b434f44622223
-307e041823e65f762048d028c2b66c306422102c19e3eb113b6f613759b68d15
-9ed5665ab83a1fd1e8d45f0de9c187db9f0f7d145c3bc457b5ac065a0bf447d4
-2f92b61a915f4dc8c03757eaf6cc115c87cf2aba456e01834a0e283347d487b5
-0e9bf1ef39ff7ce6505d1be0e20f425943cbbb4c188a359348d67c0247da0c3e
-3116f9a961e616894a704f192f550ed25503bf14c828ab8bf3211ce02689ba55
-49b2237fb5861f7fd2003d4c82a15ac10f5e1325928aeff9169fcf585334f62c
-571057f3e5d5bf3ebbbac63110353fcb05a533af4199d0abf922653efecb2177
-5fe358df229a5daac3ebede23bb469173a33ada03cb2afbe309195dbcfe08cf5
-472f9979956828289448a9781ff3b8a4a3f375a57ccc6d1ed120ac150b1b4ad0
-5d76760c330d85616e88801050c93c9e44dde990a8d1867ecdcea7700b6ad389
-010a5f0b846c2fbc7e4c4b2daaf0fc6443004d6993fbf3990f78d69350bdec37
-66b9f8d3659fb44cc7917208072d1cdc3618044e0706804aadbfd6e6823e197e
-e8dcbeac8f6ae996260f5d75279b3d1508ba47b61759dbc1dfe41cc229ff0f5a
-a3ff10b0e1ab34e1b29fc95f245b69d61f8ccd5835937b8cf2afda032bd85635
-9448b70d736946734ecacdfc0652cd5fc7653b3fd367c4c5d9c7f7ae1be27671
-8bf62030e55fed95b073eb8b805088eda02d726e2f9416eb02ef7ed5ee19b57f
-f196b0ce036cee614680585d911a289a4953b5288dbadd44e2e6c1e406836a6f
-cab530c36ddfcef4a58922f96cdb00a41929cc98dc77c52dc6c7e9d83b188a88
-1c8a16de3557f9bd5b23e03d5c9cd00f921a1e7f7c520b6c55205ab0dfc8caa7
-6f6d7aa1e2c4819e4d19af8bd07aebb63e716d0a4fefbd0c9600e5c5a9857ff8
-a637e2da191cc7bb8b1a09f4f4d1ebad7549b7b2d41d74cc991cb0ef99fc1bd7
-b3575dc3003914643d277f88131facc8b58b3bdcc55dcbc372de6e3104a92609
-09d9fe9c16e18ddb44a481438ca22330c7d6b7a4eedda79f01bf19c266ec672f
-99fd1f26d55faa7c485af35609a799918dce99225bc28a60256f5d393d488bc8
-660af7a2651391bfb765a8e7993a8701dec9254c983682fbcd136b4774ee2c41
-bb2e1c64a6371db80c433e8b0c14658ce0ae511bef8da3ab0d10d4aec7d9545b
-90881504302bcb086528834bee3a0c744092067de2205a7d773a5b1882d6094b
-9f32b36d94033259881aaf60c7ea2eb496ff2bf705aeb576a41170461fd95e2c
-0c4a65ba15357e7ef123f8a749b89583e037e1e9e2ea2d8f435bce1627cbe529
-7183f4634de4d321d6b63d939abd38085a1d1ecd916fceb8dccac6798b358449
-ae06c3f7dc948b9f32346a3f492db2b894605f0d33bf2ad98445afcb05b6be5c
-2f38338c78b40cc533b4d7dea2b9760f48a5822ce3776e87a8748f81c84ee7d3
-d43971f8d572904da8b6e1f2f20f95bb2c31a4febdf195973dbb2b8399883d9d
-7edd05e710d4161fa96e30244dea9c2dae7ed30e36058bf077f060067c3c6331
-b26d7e358cf3efbd5dd8820d0f383071fd7c8f29886e7fa098a9521eeb557af5
-d275f95ccd75f593e97aa2a1d7463ed69ca8b87e3ca8359861cdf24ff3a01955
-befe00289476891a2db20b0c808ccd590598c4486d00a53ae66acea05e921f91
-b6b8410bb4708bf580998f9e08df92798f3da75b1ba7e380d4e3a5efac7424a1
-83bd2adcfd45d84a0495cb2cf6f647ed38042d03ebc57cc7fb01c9b6eb809815
-aaff355c0048fd1456bb3b666d69b61e62e5f8764d8fb8cbe568ffab07b2b20a
-dd75e6e8afc57cdd6a368b35903177c16db14c14f861eb4318e158caa7615743
-c847e066be616524248056f1f1323cb75f976f3c45db703df818eb011499049a
-3795c81add7bdb60c942fc7dc78cc0644a6cbffee86744af3127d021b0db7cad
-29745fed8dcc7c814da5085ffb6537dc87b2b10c0d739ec72037060d77d03479
-80b7c1c66f33594dcb8fab64cb6a7595bf4321074e177b613d8ff0d6b3165734
-ef7ba807198398cbfa82b5c22268966bf1c6efcb763bda2771370fe353d5f74e
-39b97d0007c8f07cd4ec408d5fd8e0b91898da51c5995f1bf401201f3d990741
-a413a1873c0630b02461dbe7eefc315718b935819245a3e4ed6f7245205b0260
-2ba4e3fbd10e9e9a6d795b7e5faeeb4bb327f8e2bf6288afa17b33febc30da26
-339646fde4bc2052156bb105b6495ebb1f109772fc0cf4e74d04fc343e59455d
-f66e127b01af76306f1eefb66cdde33513c9cd8cfde5191a30a611fc740c7778
-a8ec6ed6ab7294afdc13c647b5beb50d055f1713d94f8f4c34198de9e7d69140
-4a6ac35aee04add4622ee052dc6e5ac069ca16f44699d6dd1135b167daef2640
-6354b17dd0065b0667167a32152e0a1bfabcc906d6a83f57322b6aaeb665739b
-0a129704c95439feae80813d4e016707e58501284f589bcfefb24f2d4f4a64f6
-8f498156b4b33739c6d709353b297803d5e2be86d22a8537ecd6f22eae4a9a08
-8675186ed6b6f04bf4ebf656f62c93b707b488177b56c671218c0ecfc7c331e5
-ebf4d7d19e24e3874722d2ec41850586bed01c51501cdafb58f62da3bacf1e5f
-fbe991ae47504f4cff536cd07c27ea98c7874d0332184e8e9ec489a8b88cf4da
-3aab2cbf5fce08fce1aac46f7be72bfd13b2e68247c6dbc126e94b6c223b65b8
-e10e023b083a73ba7116097cc30b32619e0337e0234231d125c615edab87a076
-11dedf515e1015422838455580e1ee2332f79b66e0b187045fc80b02a42b5864
-ca8f5ec65bcd6740cac58c1bef50462dab2b0148c1f38ece89fbdc8fa08aa8c2
-6bb7f7c2760f88e4b56e3ead341f6696544fc6735122c136ebab68afa8dadb4f
-54c6fc0166bf56990d9b28d0fa8d843f1c971029a46665c1e5b7bcd2b9d794cd
-ef19e52d4a154e0d537d14c4bf0feb4ee4f289cae0c86cc82fbac3b43102c28c
-b5f6a82948da4c51fcf85d95a91a5a60806815f04c7175f695e1af5270f961ca
-bf7ca7376887489e598d4014b2bcfb9f4a745a14f577ccb2f402be279fda4d02
-3f464004998682716083496d4112ed9ec7351d81bd4729511a96f001d119e714
-7641307abad87eef8cb42bb7ddd62f61eee2a3944a834039a5456d3324c53c4e
-7b44016242baa784eba34a2ca7556dedad425bdefc04f11aab77263b508ac9b4
-4f372af561266420f852b0f288c5a8d08cb682b47bcd0f8c738370c48ff9dc51
-17e8551a946b9b0d0b441e8353e15214cb669f5a696b50a23a4092b65d3fdec6
-f174fd8b2d51b22cefac51cd5fc7653b3fd367dbf0aad2f94172a50a1bc5c236
-103d08e2aca1b465cdbd6441a8b9f05b2e998d330ae453cb4d2ecebd069ea9ea
-10a0652dc518141e6bf674282bd3ac1aaf7361513a945163bbfd249effeba765
-38c41e708a6e765fe6b7fde08d192ae7e1e4a12e61ced834f873f89bd13934db
-828fe9925e412e687fd5b99ce4f0fadd5d20a2d5d2c083b98d7e85655df6dcb7
-f488d3bafc7e1cf88a8ddac3e33b3f38c1da0bca42f052f379bf663f7ddd047f
-227dc4461713cf88d27780480ef4154c1cda2c40ef944a86aa053375d9504107
-4149481e9f6d061b6cf70d533ea7f4df16075c1cb2d84fe52ea967b85adee81d
-976e3b5cc75fa41286cefd804fd3b471c74e973e3961346a3b6473390660492f
-1e602e7f27c38f282c7d398013f133812a6e8d2d20c45f8c31c8dd26e53ac22c
-5581ab149190010f6e3213f77da2662dbe1919d79a23aa976d23183074171102
-9dc5311c96a7dcd36bf4e60780ba68f44292b23c6301bfe39defe3f420306b6f
-c94a224e43638aaa1d3ddcaf6d4976dc33831d413f691ad7867feebf53ff31e9
-05a6f084f525873c6e1a7eaf956f8c1f9728f88303c6cb14b6f79fd730febac7
-1552d5a8e5f4b8e0bcb10efbf8a49ca6f470ef4ba8fc2b5b05d0e2077ff12202
-bf480f21c47ef74592b6f8a25ed1bdec3a87a3afca117fd40ce5fd5700cc0b62
-5f29828d7dc95812d142e1967b748961b343cb96408146a6aee63d8cb82e0984
-1073d3085e5db40b230814bf4a2fe816891d33003db3cd0a585c1dd306042423
-a212af55353f1e915436137cb6ef0823dc1f14746d0de7425e036cfb6722a890
-3e5260dec6a7dafd44c995c215d6a917075a3c8220884be62c0660b833b658a8
-74f9af8d280d67bcaa96429d4882427c81b38570c66d0e309628d8d7cc28c442
-2511210838a12cde39af4eca0423e5b040c52124b5c549774e207401ffe8a771
-08192fcbbfb5a127c24241c8d3e0bd8a70456ae850725fc1dc1b2d5c2d1acb49
-71fcdcd33e027a562c0ab202e73bb3e701d4f675fc4e301a710bfcef00da6ff0
-926112665593322dfac72485b8eddfaf4cc449154c53c4403eed5332f38c7498
-9851e9e056c6b8cf9fb7079b48420f04cd54cc12d505f13f111df1a51672447a
-71defa3128cbd7ccd50afa388170bc80162228c1ab8b8b98ab9bcfb0d49686f9
-2fef95de610905562e92665992fc6fc31c2a0e9ec7fc06bd22addc740e02bb02
-d08cff9cdd111cf41b91a7e4d8f38d88d8cbb7dcd4120fbb76f69a24a773f32e
-a1f63f906a92a16861db77523c55cfbfee0e96b00e1f93dd20d154343ee774e0
-1fdb1be91c43a7d690a557dcd5f75fc2bb0e3e18286dd8e1e23412fd61fd79ad
-602259e90d0e5a2894a29eda1c096289766160e356931015f1ccda0a56f3f2a9
-d9c2e495157514e1b03768d8190619e0bd113afcf91f67de3ec80a09281107b6
-b2af3e22a970ddc8a28c61140b102d990392c923a50e55971f6751287aef256e
-f1c4540af2b1d7754b16fec88e3ecaedb6b713ba39fe835b27cd7fc8c132a740
-46702a4b9737dc04b12310ba7f30ad94de90c4cc2c0e174c5a119d14ba6488a6
-a1134a68ec0ea009c0caef6c0b1edbfcac670162a1b3235757ad4dc4b0ef153e
-a4c396a809c8ad3945607752dc6ecd49348d9100c3029da91cdd15852d80cff2
-dddce3e7e2818294a4113ce0bb2e4d930b1069156c346c2eef80e8441084fa66
-7ed142e5f9414f02a362992ad52055fb82d627dd481405966836efb51f858f8b
-6104fe5d335427b528c2a83512fc056de5f0590945e84d9da75012e2382cc99d
-cd957c861f43582d982411c74d62c0ba1320d0e069cdf1ad193a4afdae8b0b3e
-8bc1179ed8b02e0acf0591edd39971dc36698a884f750694b57bcd28ffa1848b
-621f22b1a5c9b85498caa13e82aa9573695d3e1ddd2c408123494d46e671b50f
-5314e92a073fc52522f6492de090208493f1581017e05d7f8bcda9cd8cb62cf8
-2cfa57390a3e27ea3a15014a00c9b6189bc82996f2823b1f7b6c932ae9d44cd2
-351af96c918294e743f054f1cd71f1287e7d0dd8908e573c3113734c091cd343
-95647aea885cd9df1211028b13f99591f653f69df2bc629297ec1c273ff6c446
-a7d6bc6579118915705baad148ce2d8d0f032ab0ce4608d3f2c19ec255df6b86
-c88700d11dfc2953b60391c5c4eafab97fb6fc87c467f25db92c05ac2aec8ab9
-f4f624b08f92522739d920f7e07eb4d32807990a1f03dd323c5b5d2b4b5af128
-c18cf5270e0cfbb3744fbe8041d7ffebbaea8bbc7b851f6e34e7abe48cfa8b72
-00ba0034a95bec468ca2f49f7f34fb3a441936128fe1d842380aee63867b2ec7
-38963bd51781d14bb5971e156e6fb64b2ac5fd5fb3c1c1569a6081ba0f98d8c7
-7736a52aa2313dece258c0b9e2cc3c8547fcdf0ecaf7c704cb646eb9b00b0d29
-4ff444b03c4d041667206d44adf45890b1672eed8cd460c32b8cb37e21be14c6
-0852be32de9002618df604770ffadf5cfc05857966bccb01edd59906bbf4faca
-52a14c2e1f0857cf039a4a82474f03dafd54b8c163882ba77436820fec657082
-45bb02be9e7fcad3cc9ffbd119ab53982acb49e7c74fa8fcd92b2b0dee92eb87
-fc7f8bde3000b42656b338078c2ae8f58eb616fdf447c06ca70048b2f5ae25c5
-123655dd45b546277bd35b63a1308ca47cf4d8917c4bbde2b8a07855a0628c7e
-eb5bef472819729b3878168096a81bf7dcdd59df236fabfcb0c95c86ad80800f
-c2f69fc835544ea36403ff2cf0f3bc8127bc2eb5abacaee987b76e202c8de7d9
-954fdfb49cad1a5e9dd6e5b943d9b3477acb63cc884168cdda0961b483c20b73
-2f7012e980d1c6a353134e2ab65b8f93b6c6929ba78287c215daf08f480b786c
-45b5ee6df0b2b030fa7a27e39268c1526759aa0e095606d2de48f0e7ead25596
-09eae59437b3621716a4892a241d8fa957bb65db783ce120cbd1e6bd83b8a26f
-579f062654e17f8e35159212f7b1b7788934279c0315b9a603b3008cfb1393d0
-edd53889e22df7108a6cb6e2732f9edb9ea792e00469f192a288ca6fe995c7f9
-e3b321efa32329d3b1f0d467e49aa584000810c5b547149295a7676ff1e4cd89
-d8d6da7e117e8cfd0877e8d7ad0869b15e69da45fe038ba3d62ae756bec8802e
-e27ead377a333d62377718b523658dce2f8669a67a70585fc50549b52ec5289d
-22dd47a8892152cde34423e671a3820089f4f3b4007759dd686bbce52c7c9fde
-61585a41e1e74d33d72e052708b3163d62ca2e89fd981b595b3840c94afc7b5a
-3148be452208a894dab2becf9820d8e7769ec43d9635aa867edc4453e7d03b4d
-f0e4b89b4b6a3297cfbcdb97b158e46503f38c9543c49d81a41665228c07c28c
-33965bb4fbdf8fe213bba119605114bf07c4de83aca1eeaddea3345caec6ef41
-ea7bc93bab21a2948eb3808f467090058fd08f00510ff600658fa971d1f66e54
-7ad1965a174786e4d92e059fb6769e965b1147f4048648fe82ec51b13bc56c71
-229b19829abcc1ffa85a051c413245bacfe48d720fbf8d4496c05d7b5f45572e
-6190fdc37301f6cbdc44031c1e97cf47f9c5b9ebec8f79c8bf8157c5fd861ca6
-4a5d258d12a8e48f7c9ed901fdc289b53641d5cd5e63310a8be495b1104a96ea
-664da883db4d8b8dd8ab1dfcdc10d771d37562edaa793cc9019389d060709efd
-18d78bcb6d3719a0ee0a5316f9f40fa503d9707a6d6abd1cced61dbfccb06be6
-714985a9ca63809cbba77857712c2381c569207cf9db2699dc0aa6b7f5565043
-816bdeb09e29be611cc336c31e84302245c9ed37231a7b92d711742c640d06ce
-e484024b5335dbd0387548b2b71655e83cad37abc1496e1cf9d8fe792fde96a3
-bb684ca9fed1bd75d9bf50b06d58bc2929de047f96f003302fa2872ad8be3e0b
-68873f143abdfa4a73702f481ec4e32018581f19ff862c93fdba310f5914a242
-30a24df9f56ee75d274c9d5cdeeecd61618c14a3c2d36ae5167b04312e7a7797
-0267e2df6837256f0cad7af1b5e29386fb384a8ec2a3a116e026bd2e48fdbc5a
-90d503e2f3c5919c715724b234b71349ccc9dbee51808884d39a8b1ffa448488
-504b67e245eb403221348735723197708a564298581b5d75384b13ba92a7e25a
-5c40792e86d3401f9fab4a41762d95982365f6408f9683877402ce4e98e4a00c
-c3178e104c0857719ac4cfd53d07c219eb60e66d463708e3ed65cb4280285c2e
-723673836995e18aef5a9a503d7e89aa2ce4e17c33a1214df21ef551d68c3066
-64583dfd9664e09acecee772d6a70a23f3840ecdf6a671dd7870e1fa9f261e79
-6048168a73a20c53a971656d47a0ecdf7e7c5cad76073335ccdc14477746c675
-e2628951ee83c402f7a0b581af8ee6a594923a375d18c98a2dd01d3d5eb8f71e
-657bd49e5b0c4f4cc0a62ffbe13f10cbca8bc2b631d21b43827a5c3ee7548ed2
-baee96c94af70cadccd81dd3a48c7190b0630a0c7ce48249b91d92a1bfd06ba3
-123f97326e31c195fd1771fe71abf66fe3fcea8b285d6a1d4cb55b9de4699b0e
-c55bf2f5d6c245f41cd933a4ce3eda258cb90e401c6075a02757e36717c8f547
-4b4e9f3a8c2d172b5d380dbb9e5cf8dbbd8b2d8cfd014a5011b9069cc00b7dba
-21b4d17f44a55ef1e5c49ae01d91ab509c3313f2b0a8461194bb89fec131a396
-4e58fceb5677baa816bfb9e15a5121b3f0649562f920ddc302a949268741a677
-4e8c2fcd11288f6705250232d4de4caa56a8e8219dcb805ed08722a674d94491
-ee9f530d2eb8e07173f86912f0e585e0051cdb190e4d0040f9da037f29890068
-4e4d5577f67a9359e6f86b690ed5e6d3e772f7817edc2867dcd6d11dbd59b9ed
-904a57f2c5dbaedc298dc4f2bffd42a93e77925e00b4d74460c68196f0326f39
-f1ba9059cdee88c8a5377b623fe791c7eaaaf6ee2454ec3f681bf42600a97acf
-bba69df07157f26b64a642849a3da66f0e458fa885255699024771c0e448e620
-c3a2607b32cedb6e0b72a5a5dddb10981c3cefe08ed3921c4d0ff87c18cea04c
-16bde8148e530979c140973c68ae56da99048448c6041f1e15d162163c46f7f0
-5f9bd3ec2c7b2012d6f3c29eb76abfb56641774cf6b6bf17ba63b7dc94efd7f0
-c5412d1448ae3a093cce169908469e6ce06971d89a547f25d5479fbce1b89278
-2440339e904500a9446ed22e000a9213858c097896a83f008b180d942e397804
-a669da5d731b2b29c3af90d009e4d5fc9885e9a446a8e4c7d1e4f2e64629d829
-444da50342173a10deee11630aa33d865c532f39cad6326674ec49a348a02da9
-966cf4f77692ec51253f5dbc8650e28992673c97a8bb57ae2b2a1331644d3de2
-0236f8cf1c3f071fa6bb2bbda641410c39585a57895988e5d653daa8558d797a
-87d8ad98fdd07477a82c09076c6d5b8c2b6da0c3f4b916149bfae6ab3e47b977
-9c00f9e01cefe0e56a3dc2820a78bac7ce577e4e3e9b30724ca1ae980bf5320a
-41f38e2fea835dd1b7f8f252ec7052793b34314e0faa27ab4edc58ce25feaef4
-011cda00461160b772ac3dbb072cb3bb02b27f33ac2b9873a8131954a4abcffe
-1ff1b3acbb237877ef0faebe4ba87e886a217d62a86fff64119cb68a54ea16e4
-6042eb0ac3194be279f6662a3bc1f6d46aad795274df8c5810832a8a7b442a4b
-acdef42384bd3c25765321fa46f000e330d01a4d63cd71f11bf2cccecbc0916d
-3a78816f519b6ab5e58cae3543236eea83678c61c3bf8da0db91f4f9553565a1
-ef7cada3a2eaf42bdad0fb7702dbf84ccaee6e01b97b2acec60a47cf19f42871
-c4255eae175c0265ce822ba301bbf495104a995014cd9456e73d2ec34d417402
-38c08c6c296cca1ca3b6591e3bb34ed9aa0061b1309444c29f544bdc8b22083e
-f8a1975c3b20d6d5ca9c351c26334eea4dd8b8a94f33e6195c1a80d6e37bd2e8
-4122ec755d4c52614af9dd42d9741e365b019654bfadfc69a90e2ef9b84957fc
-6d546f6d8d8f75f7dcf53ac4f597cb302ff298fd67a72ec5fd2d2e480e239060
-d6c242f3101f449fb1c394a0e5aab4e2c045506d3839f811d173c0564fcd1657
-f668ba835451a95dee465ae2ea790afe0e9538a6da482e3c9dfd134366ebe8ef
-d446d7daa9c05da01815985a2a5f2c3ec1f0a7a929717d234e3e2eb26a5552dc
-3577e7aa7bb1ca1ca6c3b36503d08f079892a2e797a54def5681eee1f9a3577c
-40e7ca2fc5dea406e54890bab23732e6384a647926d8e072de0bd636f1c75e51
-952c8aa250389079d6b04490e372b4218613ab658ac1c77ea9a1ab429277b778
-6ea8dde78ffb71bc0bc4dfd9ff7e1a6b2ef19a12276f3ce7d4a5b281401af046
-f8b6c6548bda69192ca355cf43bf1175b033f01e1bf61ef403053a79288671ba
-85dfda331ad1fdcd203e875047c740c42bb12304c4a18a407bc99a2c13a87c60
-645b158b0513a90049845a03cf574e1496acd0f2fb0f914e011b103533e61aa0
-1ac25bcfadd456f33b64000440c1e935fc1681e9fb6685786b72c909055e4f40
-b70afc227ac5f2dc1e3e58363547223cd835d369351f36cf698120403c53e4e5
-a16b756600bf0a37d1965a2ea457df75e07f3021023072b12aa7f3d9e8dd010b
-2dfa92b24d7375b7ba1290060b5b5c9f1537dd0969cf9a7701fda9f9a96359c6
-ccc15f736f5d2479824e8488f6aba11b3d25187a9337effa41ae611da4e35763
-f60ab26fc896697bddca64b70300f09a104d041ea41c4dff6f33861b8ce4f45d
-98fe08b1626cd9e60a4453597e2fc3287d9790296da5087c25ae7b85be898583
-ba29d25a59c776bc93fef8f3059e77827449056c2e55a4772385354bfdd19284
-7a02b8d0d5ab6b34ad9968d68c1641a4ccb2c03e5253f1aac444c1afcca8c94b
-934806c61442f810a7c53f06db5b23d0b017a72afb5be70287eedd1e0289ad87
-43965dae9770a18faa7944cad4c638eb8d918558aec3a0a695765172d5c834c2
-13e680fc79d9566fc3b47601c706c2609892dc9d1650465703ee6c2f7eeadf92
-809cd4831e47a0188c633102019b6425cb76403f967af48976a2737504060649
-954c118f616bae1de9cb94ed75f6a3dff1ce4954dd298ce8b5007d1e182a7e6c
-e0c6873f582d21cbc2f0638d4a7b2679ae58bb54c7f8a1bc1c3e9eafbbe909c6
-40ac2bba74aeed432242720e473163091cf6fbfec4d44095434600789d7d795b
-e5ae5500584e8e637daf9a7ac458532f3e44320be7ce7aa1f106b6420e67a96f
-459c23b7b02404c1b7620742766142545551de23fa8ca655c1579fb2c0a10e93
-1c220e584e9fc86eca3aab882f3881c530ff92dae83340193d5aa93bc857671d
-ca3fb1f03534ef6ab4cab64e29c02a5c37e19d1274618211f2e7493a4a7045b5
-3d39adcc8de68bc7f2265914218d2d69abd7c49bc9237535b4d364cd67bbbe35
-f13f71b88e83e3bd6f09caf327c629cbc2b8ee728daa1626795c2995c7919a2a
-e966108bc76de252e4df625e95338332b6aba850f0fe97fdf247e85db1fa4a8f
-3d307543c80426061ff86b4ef8d26997baaed5679cf430bc88ce20e31cf510e6
-987be01e58a170bfc8a6259f113cdd3541fac41467a862acb3de36fb60f72de3
-e0cb8a02e17ea8cd2eea27aba315fc34795ab06dcabf5ffd1b83e2308b2a21c7
-72cb356f98a7d2d0f0cfcf69d672aaf7fbe6198344aadd2ec28f593c7332b0f6
-1809ef49d7c19bcb6c065ec2d890d4c8a172e061f47ef2cc392e974d1874278e
-250453cfbbe55c77a0715475a7cb383a287cb83f5a14fd027c332f79a09cfcfb
-2c7546c8aa601d925ef6b72a2f1ac1df26505bcc8229a4aa0c7167b9d7c56508
-901efdc77754cdc396482d17a6e9fcd200a0cf35f67948d11beec6d38794a826
-7c48da337fd191705e26eed2981df5ac1e8f4bb23952b9eb6f92cef4139e1884
-bff9f37257cced07790b6ec333d66a6800d8c8befb1d6362786b3ed00ccd233d
-80e8c4fbec37dc7dcde3e5ff2b8a81596dd10b714d9697419ecc542a661be66e
-a5082e50ab273dbae50d60ba68273be1adc6f750ba2115af58ce22e8e10443e7
-2048d5b248294cf81e9e1995dffa731795817c556133b714d4970b379b310698
-d4f690f2d799153b8890e74dfb72a5a50c476be90cd65157b82fe6b42c5f1be4
-3d5cb0c00ccc62f270ba879311467dcfe9fb62aec22c5d4872f6b02b8a8442d9
-d309722c4d30047232cd0c97049695a2cd80478ef3845f6d1005f36730c41429
-0576753e869c83d458f0dc3f42f68264e020270889c63218df8e1a8ee73488f6
-49ff10926847ac73be9e89879157cf78af203a66ac491eb93ba365b8891dbb8a
-bf8a4403b36e0334beea6749cc202ab18dcd07028f2f6b29b0eb5865a3748aaa
-c60575212f532b4cd4c9dfdf00aedf6cfe6703ec89b63950a1011785f6dc9c78
-d09280ba67eb5a78f9bfb797add8d7b705ac5ac61a16fbdedfc1ae720f9a4ca3
-4cd9828c287b680c24f11bad00b644beb9f6196dbaec8ba231de2d065bd7f42c
-d731e09725adc7213bb1f5e675bc11aadaa56da37f62ede33a390d43f42a795a
-0a5df034adca9ecd0e3132453aba99fdf4ae8cc2a7600e4aa10db1db113674f5
-10b2427b1dcb424623a259cca49ed14c97f0613edeb93f459fe9b9cb75b4f308
-15f5c65f839208a6f25652c8f63196ebc83c081c4739a692bf14ee8ee54ec4ce
-72a35bf84d5f4e6c0015a4443e7f799b7bc6828e30a97687a0e5b8b722fc69ab
-5baa477d07bbe2ef09a4fb7f05db2e02923bc8582f27693a5ce2b473ca02a815
-9c0789ef683ad4c7d8708dd28c408a21e358fa2c30cc598bc36c5651917da2e0
-593e472b57d70c0d6854fa5422e8b3825a9e39b0a54b0634190c2aebff4913a9
-7534bc70e3e9b3458f272d24087e74a538764b43168e74108da00351ea558e3c
-34bc8bdac1e1bc9061a688723bd54f0bd4ed7c165f32dec016b056b7cc566a4b
-1c873e36ffdb7e29fb088782ce60524e2d75cacd23fc274e307dd1d2b07558a2
-7f64c4742eb3ba451c8ef3b6591d193d4a55a42fddc17f12ec3aaf51de8056d2
-80f09997bb31a07d6112a855dbf7062218dbe89a6844a006f23899f98624ff6c
-6c364bf079c4b3c2f92cd79534f89925cfc55016218192a98cdf6cf4fe1b5fc6
-9540ea49643891db45a7a71cbb85f41035f507dbc6b161f7f1eada70e7905aea
-0b1983f7909d5575e3e7e8095bf0f4978217b23f329f057f1152ffc14b9bad8e
-cd6fff8598542a6adabc992ab3563f424d108d95abffe9977f09630ef4c6ba01
-90828d34098bb40bd230685153e7282671478138e578f608873d64b00eaf1339
-6dbfa02de3fa983735d90fe2d0cf7d28bd9f35a475a6f55017124a58988d00c8
-713745c7c999ea746bc969d31aa62eb0d722cab1e57cb0ee97cb969d1c3c1b41
-cced2d7ad87df16215f908e02a358b725eb5b234fd620f7f54d70f764eafe8a5
-de65e3e171c885eb012b3db1707c76724b62bb0c1a51be0b67179f96a46ea538
-17bd480e774c31fa131141e017ecd4c1864f62636127a4c7e9bdd05679462314
-042f0858441e3d261ded65833d91d80a6ce303de41060312e60527a3dd45404f
-55c93a9535c3a393f1748609b002be9511d87af20c7bb2c4cfffe466df21b100
-e20172c8215855aec00e3680c7efc58128a95820085cbe598b9603c70638e128
-bf0c2ab7113eb95b62fd40fef845b1eb5414737cd94ac65970a4d6dc2726d2ed
-2ba7567155154ad30301ee997a3bd52738dd17030860d3a479426c652cdc22b6
-2c70f185d812543f836c7d0253ebf8788cd6148ffc163699f72a85bd2600cd2a
-72104cfae46c836939c5a8a6584a58022d0ffbbc1d1f035d959fe58013611cd5
-be08db068630e5a4c5fe915e20e5652bcdcc44f0ce93221ae09c55fd565c2523
-79189a85ccb93f2d6162402f2209df604f140799d7e0b34639149eb5e54c33c4
-05389d46c775ef19519f1ad4a6f63a62435c090d8e3bdcd6423f5b7dab32d263
-165c93dbfb1af542af08aa5ea25595b3d8ef053e19a16e5a1b13f437fcd2586e
-4534aafbbfe1e76906e832c6d1d47a3c5c868e65afa7af2e21e54ce233170b0d
-e44bf290c512ff3acc84f0e492c73a0d827d701bc9766abc4c08d12fee986020
-d06762d4a0163a976031bb13e7e86fdd3101b8d5155046ad9d82fc26496661d8
-8cc516350229461d6c11114c35a0d13a1c6ffcb96fdd56105d67bc5666512de9
-6aa15713998ad53064b7023f64dcbec8ecfee625ef76f5a024c92330585cd17f
-1c3f82bbcb509d4d31b535cd5853d803ab7cf1862e8a87cc3d6557aeb7567ac7
-9ee04bfc8a445169afdd1b1375274fbb78ce431ffb9c6fd61a99a0bf1b41c19e
-1ccd5dff38a45647d51fb014099c74ebb11c5a07050078507d45a1ff1fa2e178
-567f745448157bad850f1fdcf9a37afc8968120892ebc0f85f5dfce9116a7108
-b5cc34c5d85a91a65d18b9093fd27e9778ce26bd93644e4c20ffad131503b509
-850f4fb260edb6d8cd0bdcca4beb8a25ec1fa44eb5b31e9213d11d0a42d1aac0
-650e1ad3880d59d2256a2720081fa2a7482e3bf1e4f4afa59ec16b810c0c1cf3
-2cfc726205b285ad7cb21d7a59fbe526a844a5d75ab5d61a801701c2984b48f4
-ff020607f2ce9b468df2f74e04812262943d8932d2e3c0478afd42a8a04eb7eb
-44f9dd70b1da28153f4f366df0fd25e89f942aef374fb9bd31d9575803c03e57
-50e5e75975f108b6c7bb770d824e5eb88d67dac4526d6e4df1c6fca0a5fce033
-84b06624e906912a26412b36cb177fa2dd18279591a0db289d18b1754461b97d
-076631b5d598cb2741652bcbcb9804e1d01a8502b03739981b42e4754e21287f
-ae2adecc9ab60a3ba753bf94d1b586c0f689309cddf12131eb442180c1c25b75
-05bae86b985d6975d1048d3da9ccac02bac3e6d8a2748082e252167809ec7b81
-7cd72fd364f27f9aa276cd5e70edf56cd5a0b9cd00b815411c766b67dfa424a5
-1d9a9c7e27cf57e513965379e180f1bb94b174bf827dcbdc89ffef77f5e2ffe3
-9f1dafdb747f003723dfdfc91af3c6c23619237e4f661de027809a510242ea85
-d9b93733b9276e37c01da481bf86fd040b2a21df21b3aebd8cb974925ac339cc
-110b604531af29325b8d844305196e5e1366edbd5e6196ddfcfafb27e28b1adb
-6c2a3fd16d904a1ffb4a998a4614cacc85157d8463f7cda5363f5f03b9141bbf
-4788f8e92de9680f3fdea66415c9ce8295c8a1276fbb9b57e97f899caa8ccd60
-275e20ef7c0ea888cd60bae018ab8d59d4b9b0e9a19d71cdaa96392893a7284f
-6d94291130edefb156dd9a7d172c89b881aa5dd8d1a4d9177640bcc8d308a801
-547a4fe7b75f04f99d529c854dc059641c7652132291dcd0deca5ae1044880d0
-4a82600f293dbce78d2dd503a4b20ea39f25633c216021b78cdeedf51fd73c9f
-ff3b4e7b637e90de3838f8aa7e1703cbb6b5c74e1f0ef474c9ecfedd79d0b8a6
-1559407b87435fad2ca5ec36b170391fea7cde5824286f66bb0f2b14431d2481
-0fe6b2a6905c2ef0908bdd4b05a16c01c00b2eae7bf294251633e806ba08d21c
-3e1823e8c0e9b6ff171c19f2d4b27f070389606d90ddbe0303133f565644c8ec
-d9dac4daeeeb490b2dd2ffecc57d69daf3fd4ac8666adc318c245e14f5e67d44
-d8941a967696da623d22c077d7484bb1c9029bcf536aa060626df3d5593bd4b7
-af56296934d03d03c682426f00542ad5d3f9f8631e97eba46416979b6b2fd5f4
-4f19b0cc18d28d551fec3b3fc5440f3dd5a0d79fff8df917dd515f68eea2ed9b
-73fe68e395c7fa2cfcbbffbb4a7cef13b875b96f5e805dd45a7c8d3e2eaae5a1
-34e00e26988281b159cd8f9d31a2f15246efd8d927e881a173487df644cc7656
-b847682c04542f35de33a7d638b5a2187a74f036ac693e4ad95142e8fd852899
-b8ffd2405f5d79af6fa919f2613c2f6f4fb729f5d6c3fc8ae921eb23a0827667
-11432b8e7ea4c6c823b57acb073fc00ae93223a0f893bb8e3ddcde28de69cec6
-5c0ab65d48799ab8d1c269ce7ce346d40256992947b609cf9d3da1d758ceb593
-1d6f05acddafc290e2b59a93bd94507be8a4d4d675dccca80891ee13846be24b
-8cc4f7052c5de700c953319b29aa4b87ac3c85377ad31a14584ed6970928e850
-5819d527dfdb85e330a5cd47a60932ac93b359bc0921ca40703f8abea6ad6d63
-83f8d2660f8c8571c5a13d889437d12d6a41552d9c4afcdf2fbc2bde8055d681
-3b7be320d48247a34cbe1b84791d2c8e9c417777bab9869cafea2c522c59b12f
-23cd59779cb58f047e0b81fe4d42d1f4433dae0ad691b9c26e8f82b5ab867ea6
-fcb2d7f2c0718610130ecb7ce93d1ec2eddd2cedf1458412dfed5f7f067c473e
-aa0235862bac6f8c8408c0f61d978312fc1a671c292620bc863537d286a60a22
-03a2d5dbbb772b365b925b9a616ec398359425e3b935c7e833e572ca8ecddf98
-121a7bbbef3f8e262d4c08cab12d97f15776e7e202f493e2e12b87f2e421e5b7
-6e3db0ebae2f1e62239072e98391135f5ce4141cea6d7e7a19ec1236b81d1ea8
-0fde0b0f2fb4aad1fdde1a004ac235c896a8a5cb15a4806401727e7dbd148ec5
-8bbdadd754e31592c37a7207a82989e5405a7ac58067f07932acadb77de65c56
-92caff85e5c183181cfde88b045e596cfbca6b4e0d37e6b881bd3f081ccc4a04
-a6d576b41e277b1eccff69feeb5253bbd9a8e11b554e496a16f714ad3bd963f6
-b8425f07ca5de122de2717d09917f19ec3238fe557c44782caca0e4e52f38b5f
-7c207b180b498a8fa04e66f6abee7d7e79fae9e54cf566803a885db7488506e3
-8727b5bd772198624051c64da3945da5e904788ec969dbb890f264e54e2c661a
-9574347d34634550d5b1a1355f35140adbc07be4d5ca5c791cc8cc01c4b26875
-26d8937cfea55684de8165b792f7740044e50ba4c19677a30bd453419a7b8d46
-437f44d206dd8a871269c903d78bfaa35c4d1a054d0935afc44f048da40cdfdb
-5c15cfe9c8f19cf87cb93a6594cd394c7f64fe21cb599985a69836ddbaf80410
-4848eb7252b523563b1c24e57d4966d1eb261e4c9c5ecdb8547e936506175440
-381020593bd8cbce659a7a345a4c05a9790df98ef2bddc9fe45f6968c49373d2
-d55cbdb4de22c4f7d53f8263843f8690baa842f6f1bc7cc1545f3e0a169633a4
-01e5656f08a48b17a69d7babea61d476ec62fe1395d1c01988926fb0e69326da
-c69b5e5347167c0541f226d4d2d8ed2b4828ba74f3939a4b77dea31d881c7b70
-18e1c1b646c10a935807e6d3a9e6674aee575023f941a098d2df22af754b5296
-360777bd1a5b1a8fbb29ec9ad201dbe0170850ecde219ad290af01017f26b777
-56c14a5d3ebe7ab8560ddf0140924131cb0a693433437d4a17f33bb22e92503a
-337de079b27ceea348d9218278870e1404f7733200e31de980e38ffc55268921
-200bb4a6bf116ffc94e5d68015c7b0957254589bbcfd6b0d7318e1983d18bb22
-982e598484b2c7c7ca5b08482cc0f23f74d1ca4baa5bc61d1fd9094b860edffc
-44c5bba1d314b46d6c45a5a1ad97706893733a9eaab22bec79f4437a5917beed
-f24271040da4386867c830621ffd6744ddfb078caf5cf59e7e7fa456eac5abba
-dfea921d226d36cc6d03c73716badab60c4021630643824a81ae62a731d7d647
-69749ec4f34068330b11d2f9664f56ab8b8a91864a3a2d2680717a6f7ebf8785
-a18fababe5abf9b1e759573dad33c4a968505e887c7b0f9bdf65db75bc04c8e3
-f397740b94b07dd154a5523b19b87879f8f0466d8fc9f3acfee32fba47661417
-a6a97aa66eb83ab06a8347a76890bc83e6bbb6de46f007e7ddf4c316e904244c
-214382939b4507a69a29fa3a60ad96e420d6873f0f28c8283fe85c59f9a5ec11
-0001740aad1de7f7bb72ab2b699492b5b6855c1bb78562caf497ef78ce8ac3fe
-b5f05639785318ce1b7e9ece0f28d560dbda6d134ba8222d94fc98e1910eabb5
-b8ac30c4d0f2574f2e83f309293c3530ffa08d140c4b568e1868c7b5b3edc79d
-716a5597bc45616e2f11b4caa3e248fb96d9e84afc205280fcd76842b913fdb0
-d22a1c741274af30fe94c29a2c690e4e32292220e58e31e815000aadd624fee2
-4d72625d57ebd75a24ead23e75889bf3fb35738516b3b77a6fddb6590ce59804
-6bc39e4e9ae32ecdccb0bf9490ce9c8cd23e997a63bbef088fdedfd9ea40f21c
-4d89f264329c674689a8536d83e395b5c17e6714cb48fc72a4879e525a954048
-595ef80d4b03d92f12664b841e00220e3a2c7abd65457f95d1d6b53ac96e545c
-25b8ac77d8549bf343fbd27700f1d5b344e965aed917c82211f723410c8260e5
-ec603111b03673922f118f1b41f1b436dc347909355467db3bf0dee4a7844c27
-5b15c9ffcdcf334ccde89fb61c58e42848582bd44e2833619b0ad907fdfaa8b6
-97a09f114e9e204db7e2319a41a5866eccc8665ef6d94a9abaf54a71760bcae3
-f253f7079fde5e138dfa210368707b963f0c4ad772d30e1b56b969d911192482
-e1c3484f52bcc8751b4c4a20430316d90adb8114ac02e8fa845dc66978cdf313
-4f1c58be8a9c2990a1dbf0c1151996d1eed8dbc6f35d4a0a5f44c22515575d32
-6772a70d00dd938360ef9940beec9ac9a9aa2143cc02c3c030fc6288ae783bf9
-e6c6a04cc0549e2e0108807b31acc0def31458a8b32096d5ec0ea1e9871db2b6
-35dba89e4b0cb6b965c48be61d891a0faeedc6ce4ff743bf826f524d4f313414
-9368b2da65c9c14546084d955e937ac3ebeb5823d90670e2480b29402d0db8c4
-31e12164912a5214b439d8546711a39648e652d68cddb4c4e28aec95cacdf5d5
-73a7141e0963422cd82cb1d4568ff99cd8cfc938614f13a5948add5d8914dc57
-ac6b916f4fc5fa6b0a42f35e7c2120b623c61a6b95e35ee2c6040654623d2e78
-f2009bc55a897e0373ec35427787370450bf03ee788482396b09dbe8e2ca8d19
-dbbd3d71115978044e3568b63fe15d56cc5b08767f5a72861b85262e8b194db3
-5e2bd58275c19de4a46f45b3ac0c297a9e1d8238cacdad6b8728fc1c3c7c980e
-49e05424f7cb02991dafd70e277388591e3e34923415c383d62cb366dec6f2f5
-da863baefbece4000fc620227cd325071aef5e62dc3e4bfdbd4915c03e686d17
-371c75ae25ac8cbc6683a378f9f617d19725057d84531c89cb0bb686bf9e66e4
-844fc8d6ac46b4c309cc74a1a948bffdd1d5d663672ccd358c9ed2e21e72767c
-16a968605b3c403d99b8bc2bd8d9fc41a1f30a692a1302943db69e5b9c69076c
-51233bd6963cfa363b280b8499331c172abef2000c09ef43f04db75fd5502a77
-b0c1027c3fb29456f60b56d7e9983e8574b1e75032b8605a27a713be6e0106f5
-fc61ff596c600275a27a13140056fca17426d235e71cb6c4eaede2cac9529d0e
-e0bbe303ef02bd6e4cf0446fc21d90079f91eab4484a9251bd956483113c5eab
-36e7b8c94cd0dcd6c5c82a082d335665b37effc612bcb5793e7db4a831b51ba3
-2b44f1f9a10027a92cd92634c93167e88b0564498af080eb0e1f92bac9672986
-ceda766c4d674cf74a1124f9aba60cf8074b493bb28cc379485fc6d11f050dd0
-80a6fb444933008df47b50a0214bc210090f9a0cadff94f254e58af23ed76340
-34eba92a70693c7288a79477d7e9a6afbe342867ccbf6b44ee7c9adebde42793
-e4a59ef5953d031f33fe4f12652f26a74b958fe4ced8e6025289027340bb27aa
-946ae6445d6c3f79147c67393cf739061c2417cf81c75f85be80c99c8f37331a
-e6526df9d46a11c3c1fd15886f07ca08112fe60ee83cea46016d15f68e64bb48
-167cfce032d138f6c124ac0281f297439995583cb9825547be0017918dde64c0
-1d78776bee428f7534f80a3bac7005aaeb2ab9abc0b534be7563cb582d298390
-f47c2e5a6f0376e7312d6d0093bf017f64f6697b18b9ef831b2a29ac630f80dd
-1d6cee9eba526f2eab63cd1a53d842f52e58df2815f07f166e7960a410726b4e
-b4437978696e134d4cbc80a465744b872bbf340155d9789194a06e891d1a1f88
-7a74da8de0065d6bfe492d1326910624cc8f50405bd9510c27dab17e281b462f
-7decb40932108ec5ad173e146a3258d88c43c9f30be963eefc7bfe130beaafd4
-98e339cafccb138f954576ad1a38c0f149aa852cb3f0354fde3c7949de59dcbd
-a42a73f39348a8fa776c27b5e23dcb6d90adf52289f3c84d49c185fd5394f712
-0d2c35f112a99197484795467b3215ecc0d51a807fc77d76264c305cb61377b4
-97a0f1dbaf69c35529584a46de46f516fd4d1a8172360bb1e1d0d0c44e158511
-87b471d543e4884c6ae7cb6f5618cc584d1e978f744b3bee0269bbae4dd4718c
-ba02513e332a6170d0ea4015dc74aec1ff63a35b13b2bb91233026504a8a328f
-ac1e11c82fe34d6d24bd5753caf5f0d8b83c945add3e7b36cd0aed086bcd0e47
-3996dd6f821236d36324e3d387ca7bf1707e7de378286a5065e050dcbfad91d3
-5c82b436b4fdf3736b422c00c6728583539527b554ef64b1c2e6a9c1d17e35b1
-3c58226254ac2a47dd1223193b4e1649095013734c40aeaffbd7160679f8e801
-f18376260ee6e393deec9e0693b4e6b728e35de36b1f40a6683f7e34e6e086cc
-9805432b4ccda429b0136dcb4115c56cb01fc85f333204e534fa17558f7fe48c
-ad9a89128ca6c821b01864bbb67062d5286283ebc1c559e5668e11f469bc7e33
-ef69003732d1bd8f0b3f153bc22e8b99a3ca9669ebc50526461fe3baca5cfa6b
-5f7962fbc8cf0372cc716062f29dc7728499c9861424ee92b094227303046fbf
-54aa62766e8c9eec066901a8a54f395beadf01af8620298cff08f20a455416e2
-2247b637c6597a272f7b0a28d616a82e234e49b0ada3999073e77b58f11fd0aa
-ef941d49f73e962e9ae57574d57fc46a6b3ba2547dfc9e9667c08ebc05c98fbf
-02e2e43bffc8a244136206f481f0d584fba9db1ba41ef8a2e4c10227633aadb0
-846c79c5d7049648f50528b5ad34e449540418ae28b53c3e34ae0d8867ac3902
-9746aca8629d847851a6a13b21e2cd95acac4abca1ccbf5f955e6749656314d4
-5bfa890e77a9fcee0d7d67b9a34cb2a140954678555ee64f95aecb843d32b4a2
-281ea103839fd3860ac5de0de726d02341bbec556d8626fe39e3df189c3269a6
-b73d27881d4bc81c125a1cc26b0c6f28811d4f74bc8a757785053162f64ec819
-4b9bb8300b7184699ac7edaeb491f1f7bf236ce695a5ff56bf5c1f4390fb3c68
-68fbe2d542005635927e401e338b6bf6bfc12702ff8fc951a22fdab1d720faab
-e66f16d85889d6a15586b2f53edbc5f907179169c2a8a22e747a12d1bba358e0
-b0fc014a1c42990e01d76268d311e05e4ce5948c42bfba4ce63f0b86e0cfde4b
-4be316bb2cebd0e73e26f446ca8478bebc132a064ed117f1a02affff29dafafa
-c4ecd8e8e32bf8128a62aae5e7f2d84e6b63435cf6d2bfdb918a5d28ef147547
-f9e569b09b50dbee423c1a7ee40355a1cbece709a13273cba0da2e3825c8a970
-8037c94de0e67d5ada84c0bfbf5b96c0741fa043868c402079df2ffe8b8eb03e
-2492ea5a6338a5deb290315e26eaf43086655014ba9ffe48f4d19e172f9bedd1
-218e1164730a81bbc1391615488c5b66d2f4c66bf1bfb54e226df3893a4b5a48
-2f540f19560d9f7d3b32757582782aeaf607567e8f4f0a0a30f976dca0ba5206
-02488b0b7f41861a28247eaa84af240a91ee8a4292454f7c3c05ead6f814bcb7
-84b96a394e834cf5ef4dbef50ca3d287409b060f767758d95114a26b1613266b
-6debb528e85d77deb7f3bcb8a572ea917bf39aca584c4f841ca622e6e06ff8f9
-e8970dd1c9510c1618d01e1af0baec26c3882b6eb80a7e8f945ad9abd60911e2
-6bcb6aaa5f0ce78068400f9eea67fcaccc763770ccdcf7477f32dcc49abb5566
-4e75f91acaea2a9141436861ecbc358628590b2adc5ac76f1971818a49383737
-9fd6fe8d74e76a367abb6f7b624568fc7a4e2132513fdb1e66e06b9f81067e91
-3d6d1e5d95e052d569e75164830c1cad1bc168213da1cd06de144f4c714b0e42
-34ad2f8037115ec2c1a8fa611ee4094accd1ac585bf7235b1f07b6e2b14111a7
-409fe76c1abfaca8a35436eec605e4b43760883b31c6ef176342f834647de59b
-b54c16ffe522bb5d71f432a253b966587dbc5bdf85472472d9111b8a23c49285
-391771f0e037bcb24a5803b323a27f6f0aa96b46f1c23dd91cf899bb59b2beaf
-6ba551cacfed10663e3e7c6e7dd856ee8a3aef30b0dbbc22aecf3b3a8ee10fe9
-873892898ceab62300309a4cbe779873fb3bc7784a159e02ecb484f2016af7c6
-bff8798c7f00bdf847a6fe0e317465343b4c1585d03f83f2aa56904148de6d90
-65999bb74ec61877d74bb895b7dbb977d88e55fde157d4e0176416b03044e895
-655fcd0d98ea455342ce0e27a1c71c9178fbecd2eb6c35666763a6558d297fa9
-9983a24384848911542f0fb3956c7c6761b7e2b8588354eeaac4aa145203dbc6
-2d3b319538af1da0602ec260085ce3256b9a0ce6be0208920dc49eb2954ad6cc
-912846d093aa398ae77075faf578d0c86650318fd8bfb82341281507691449d2
-b498947c9ac0c46f7676e0ec94a1a7aeab00dafbe8b1a464bdc9b41137e0219e
-9eeb5a8c72795c7bc34600c7325efac4f2cbf55aa9b4a996c42dbbfc0329a694
-7f9dd261330856fbc0819043b357343eaa1d3fcf362fbd0af9a99ad57c5cc4fd
-a10dd10097941bec739ba978da465599d16b6be018bf7fa1ee3ffff04d35db7c
-a7f6acf148a663f999280b36e51bd77763d6a6ef6ff28950a8d4b04590d8b51a
-dcb555cc47d92b21ad032d31cd54ff911516f356127e38f2fa9108aff32d2e5b
-1f1452901c38cccfc8f23122f4680bc316785e012f61d2ddb468cfa55ac91998
-93a8ee273eec61e760ac5097167994cb9f52e62182fa0845b2fa6779c914047b
-41d1a35ff4c499474ac5c277aedc0ee957400fb6643a0437f7f6eace0f512ed9
-3a33686f28bbc8ec68aca9a2bdeb407e975a8524ec3c068bc0a63ac6779cd84e
-1d46c983fac8c89073669d02af734fbfddec35e195c1444c4ca678835a54b0f3
-f8a0aba3f3b5db7cefb364f491cd80110b6333f061613b5bcb834a3ceb20d95e
-8119457df0838105bc9998b41067b9ce9612825cdf10a56c7b3af464fc4bd133
-a9d9b14bbad06ac3598419ce3537fcb383ce9f650bcec756592bee0205e0ab71
-77b172fc8c15425359e43af5aa75959561e3b0e6ed08ded9da737f3181218d1a
-1be1044211e9d9fc86f23f48ea8dabeae2de9ee4ebca14a734dfffe643c55875
-e934dc377f170ef8fd4e83b1ea53026cf1343dfff18fdf667bfdcf21f82a5a3d
-d40d34e7c3090e76c1dfc01aa0194721d9a0a3783dda58edcdd65a497718a66f
-658a3c0dc104bc44b36a4372794702baadb0f7cb1594598414d5eaf0369405e8
-9726efdc14ce04bfea94bb1935c4d07587400eaa1d565714a33891f3e64c1d25
-fa527eea2ef14dad353c11733d6b0189dbf7c910601528d5bae1f98c01c6a347
-47b9c484e09e03e10e13b5be1d22ab7b8906c5e41a0b2ebacbf640e187468ce8
-af86b096de62d206bbc54492431b8728c55249aa887c01a82219e62e17b62eac
-82a7e09b484eca291295f575593607af6373ad85c692e7130a4b652ae5a706f1
-2457875d6098e477354eb52010424e6ecb1b69447261fd1b1f93e72de04e3f31
-7dd7313d7bcd5afcfff4e0f02f7e2dafe2f476810450fa2cf4daae1f85150f6b
-df4e5e7ca6533523dbe78054c7bdf73b04c4b562fc75fd6f6e2f9285410fb08c
-7bade37df9910ded1d21f0543b24ccf0c1c984a4d7811b8dab97ea56a14e9028
-999c9f71c8ee8fbcf78da616194678da5311ad63acafee762fc268fc2bf79881
-60f1a3a61ec3467956f15085c1808c8187ac5c5cc91b9165bbd978dd45d2c100
-de3fd8533581beb1864ad04e7dd74a016dd77520d2739a1d3e9524c8498bdf6a
-d7e9e0571c5108c7c7870dd240ca2a53e30353d7bf39bf075d3839681c1f8eb4
-b289720980a1d3ee6c5bc7349bfc37345b1ad0d770bb12819d72834cbe2670a2
-7129cb9f51973694153d80309e5a4f6f3a0476025074c15b091989d0976b5e15
-858a83818105b144f5097087f3219bcb26b446b033510a955c891a501983b25a
-d72cbfe682ad3b64c90853163504c4d2872a88ff8db26c3a62ac564d49eaae00
-c7f92cba1712464281b4100725792f62d16981ec1b1ca7a7c82ae9687c326ee6
-36ff55fd3211461deaaff7dff6bc94b248ea50f86a39d5edc51572afecb891d4
-c893dfd74fa47ebbacfb0d4490b5a8c012db8a6aa5f4531250869150c1c25fd9
-2769ee82670d8ea963329d3119005d280dfae888d29494533edb026fe0f11018
-3bf246ec4bd9f5c0de7dd158895ff40b7c2fe9f8cc537d23771cddd1bfdc171b
-72d58e2fe9de17cee61af288318932a6137f976d3804e2fbfcfdbf66bc31f435
-ee1e0dacc8599ef22ec48010d4c79707118da59588bd89557142af786ca66ed0
-a5a2bd6424d137c2352a0fe3ffca8db62656d143093f205c18e8dc761448fec5
-510fd026493991ee9ce12f4b2cecdc157f3bb6bf46509abbdabeaf66703a6a2e
-616d5d15f1145ef8654f810b2e30158cc883f04d31798672421afe80979630da
-fa9c444aa6e4b242c28df13c80d8799b8916c9dad6eeeca41ca24cbe3741de73
-193674f95269bfb2f832513d434c34704365a3aa76d3f6fae51b8d75f4460df2
-95b64bf0668fe311f78177bb0f560dab089ab5a6fd11ee9bd6faac3e6c5ee08f
-79c94b34fe82b1a2561000fde54d3b8fc1fbc7d82392690b2216982e8d9b09cd
-1151a8aae36231d9606f2d737dbf282f4f685698e48698815664d0a4eac63dea
-f0d58ea4edc1ef27ee2f4995e0231c246aaa5e212bad9a4f133f1752140cd8bd
-7e203b235b3f54a74a8c2d8a4106ce38d558d3e9061c34cbbcb5d133820cd5ec
-fc7ad5c83bb1b22781bf049a9381bd3743c6ff79bf98a25fbd361dfb8a7facc1
-708d075739668598c9d0b597a9417849de1e8169df8ba2f2dc6fd57d7d07ed4c
-bf6f64734a56795c6480216208026a24e0272e871a44752e850892e9fe72b22c
-15d83271bc1613cccdf6616838668fa293c564f8dbfabfea0305b7497286fde3
-411e00adaf00fe89f1625c57ac1121927000bf28cf712e55b2a717a4f5d2db33
-c2921df3f6449bfea10d566ffc096450e78807f7611e281693e30463d32b2135
-4d94b8a6d32f158f1053513eea31213d73dedbd3db635e0497bf3ff4876049d2
-922e0bf8a8da35e25d19b6b0ce73eb7da1402b73627e90ba89877bfc16f3166c
-5a458aca38c58e7c652926c6547d018e109c4fc5c9961aefb4607e48b0c89cc5
-b373ad46dacdea10a1d503a7496ada54d41c342c36dfeee1dbbe8e7fc3664460
-6860622ae1c90d5045e3a6eba40df23d4eb867693a5c3d25ea2e1c31d8d9e630
-b22140e1078d577df6cc81b92bebafd700562ed45772247a7edd7fb4b99db8df
-6aa8ab82b059d995474744b7a7bc637a449cd4175d19116cd1e122beda56868b
-f904ab38fe601ee18ac0d56afaca712d10c09763cd21df0b222405160cba40f7
-a1828fae4db2edd32a8e2c5c173434348271dce53562d1c7f96264023f4e54da
-63035f84596d3a2a028b4692ef98b3362258c59996c07b04e83b66d7e5ce103d
-2352d8404e32c8408a5b05cf150f151484d3cd493f2429ca170b555d7d2be9da
-96212b3b60936fa14a71b72359b03bc93d72f9018aab793ea640582b24109e63
-5bae72061eb66bdc9f28a9c6ba27caf470e05e41dee81b43ef660d5baea7463b
-d36c47bf900b78f8053cdc842fa4c642c5e313fefa82c1aed58038df06201027
-79450a5b69923a4057d090544c8b343d45be71ecb3564b5ae59e18685679c804
-3ca2680a60ffb8dea818085870c75b54014fb031764e95b666d6ed70b3711b9a
-012479e72d988d5cd8f8a95c3d923b9ea9717eb15c47885c7cc5ce411d4adbf0
-8cd49e76553efefb04888f85f17e6000c0d1c3a875b54ff0aa1a85bf1ca4dedf
-d0adf53da875eefa66319d47b8b7af2e641dafe9466a8a1ee3f81458359780f8
-4037e4c647a86cc2630a6cb49675ffc1dc97667a589df4e77e3cc5c41215c16d
-43691a68f62e779eb70af689ba7770ce5c2f6e060b35c7289e3fe5369ea79179
-8bc466d7c415a0c68fdccdf5af35776cfc5074a92a8f131b5c2423cdd13315ad
-a0e4969330ca8b505c0d86efcd3cadb7f5c77c2666dd9e89b9b03023e1db13b6
-34d442bcf0e3df94c239e06e9519c70632788c64bc9f4c0d92be238be009cd8f
-c8765e62d5702bd31435c9eaf5f2a04d3e2cff1406337338821096da07740689
-68e4918bd0e5e26d0404e4a8b0169ab68b2980d2eb8a5c1ce0a8c751f5db447a
-b0cb1f731aa4c912ed0e07c3fee570ccc6653b649e6ce447bf2fa355ac39f692
-b54d744d5a6c1c03249e03b298301941d89bf065a2b30a0c3aa993ad18eed0b9
-cd70955aa7aff8003711178da2eadac58cefc9c1e0e4fe7ec10ced8be8e1b40e
-56effc97fcd8c1e68230a111da8d36806ff8c9bac32c879fc461c4cce809c49a
-5c489b352f86456032a19b6bed07c13089bf948d32831f2ed25c587a477f21b8
-ff3bc437460438312fad6141cac9311bf29dd9f221b7a0cf442b48ef64c810db
-82a097530a129f2e087cc45cb96d8e7a9b3e761d3f3ff61f8f84ae47d6a2407c
-c653914a9c1dd0139f299c84f5f964e6266edfeeacabc4f5fb89b9189b119ce5
-7c8ba8709b3f3b73e9e152de57d9be8c3a339ee8ca40c1bedff6008c158d777a
-611b1f2a7e8ab0b52d211d7a8998f6cf2e59d5b6ed0f0ba65985353d2734f025
-11d235720b0860e35cb63b65657f2c002fa54d6ba8054cd94cb450559bf18ff8
-41f886d991d1298cec09ab4bff98440cbc4977521f74c2c1024eb76c6c827b20
-64af83474d982ef71b5b4d10ff5e99f69943d9ac4cad444fe5aef239e51d0bd9
-2bf89b9aa0462413961b459b1d7fe25672cfba44da5d787590db7cf6f41bf8ff
-f568147f252935fe642f45be670a1f5ae82a53d6e850e6a0d7a37efe8b6c3384
-7df10e6dad855b05d8cc56db3d5b457cb44ba2061ed18bcd714b6ae4cfeab6c1
-f44a983d3b09fdbdbcf49ab4d4328aa83bf6d35136cbfbd7d9efb9387bb43859
-82761e4dd9a2e8af77f8f975b08f158dcec98b861a7da0da7b72c54fc7f32ded
-961d8a402150fa9936415195a5d45da466d90bcf96269b77a549c615291b4aa1
-9387d40c6fc1befd017e98de8f8353e8eedd53e13f858f5b428d8d481d43b23a
-34cc07b024e84e56ba46df541baf7ae5444de3aa77a387d27d5149ba0d83a910
-44f1f3692324fb3a7cc2adb22d5063e5bda1979b7cf64e264da24a21c636699f
-57b75385698366c7a44d025c4d96735ea99cc446bb20371b234bbe531aa36e4e
-2d2aadb8e6282fbee95b8b4b71f90f2d7d6d38c9030428b0ff301c8e6620375c
-13828b08801a6099924f114fd3fb26afdba9100caa7796f312e5b98b9057a932
-e5789fd8f710032d29b526c9df47af7023d4acaf512e4b7f4f2d13827e235821
-3c4a8e0224939013a38fc7d73fd599b1a7f2fc9e314118864621981243462328
-61e1c62f8ce1d4ce8473d8dff76600b670e7649fbf8422d09dd79b80526a6284
-e74b3d04f1ffcb2a31bca539a25b64754f893b9ad03d965b5fdab567cd967320
-8a1511b9442f896f0d5d5094649b6296279549ad3699f348796aed2316194404
-e0ddb0d0f89682de1648f4675c2d8db63b68cc653d390fe2333ea0829eedd9c1
-b6f6a945aeb5ae4d7973756eb8297231c9ce5213446345bc133ce5b1470c6b79
-063c8877442e16dbda8de7c5365a9c8a91a8c9c99767d15acbcc2b82e54c8784
-7c93f7a51f91c2dbaf550130ad4dad6896d9c1d905aa7746d7af81b7f22e4e9b
-18db615cf7e7bc813159f5b125fea93787fa42db2b4602432c487bfb49f29d3a
-71ce1ffd9c30206b294f8281f58fbd27218317587316c308ff6f719cc347dca6
-49536a86205c1273edfda12610b212f375b91a841657a3e9b9a359d398edaa43
-f21041a76f2b2249e0f07925a996b24d56bf902cd2e6a2ea2b21c1840c0c1a2f
-85c98789b1438292bc27dca7dfe417258144d267c15b53532e49023d620b4471
-da5f47f99ba092cda984a7b9bd308b65fb0dda4c92cb84fca3e5086df0100ff0
-7a031a99e1b432fdecbdb2136e29faac53425c65cadb7ec198da5cb63f6e652e
-c84866add1b4f754c639ed962928edbfeef1325fb2bd80f8624ebc1465fcd609
-0931ffbedbef0aab40593c54a51d44ad7491e07d443ee0ca86167233de12657a
-34a84d7a96e9b73698356f5b7010eedfd0190287810dfe3bf4b75dd58e98ce98
-d10b180f754b686e8ab4c621e4684b34680d062bb6e93c5676f9637d72520771
-82e1f2d39e889b03785b28928291fb0997a2a859c7e732b27cd15ad1b70fd13f
-9200246496651f4d5580c0372a946a6a272c7eae3b071afca478e5f23e95f950
-f58ac0bdf7dc5e4ef0616bfd8e2b51fd5d2ff5ac5a816c4f79efa4a4435ff54a
-bc65250ec3ba0671ec26fd1179edcbf4198b5dc25434170efae9f03b5e6da69c
-f9d7c08f7aecfb5da7e493708e51339a7ede11d3de96e97300f97b550f84fc78
-175fa0d6ec79c2b29cabba67356f91f43bbc1bb659dac336d54a39eacb36038e
-29f8c412a4b8ba0272c2e0bda184577d41e3e257194925643c04ced8484e7f3a
-899b12a5d50b058f62578cffb5fdd06eaeb05def00d246c2a7233629efe00e24
-1d5a9e8bdb053c506cf1ed8d8305d4ad7bc7575d84fa8cd1c135a6e69ac8da9d
-09b0115a6110c6df36f7bd530e6f01beb2730acffa423c64537f419bfc76e56d
-099a956ee260ec7848be76d4ee19d16eed24b8f0a3d8ce3df142125dd863d00d
-8ec3a0b843378fb2c3ea865cae64914acc78f8951503547690233b4541f3f07f
-a38bfb69c3747cec408346d846d9a94b5e259b51833e258f78b8d56562190a80
-1e649a8ba76fcb180b6c93925e26d258c7c407262739e0252e1c41f4404d4e85
-458d6c0c821b6b5f099628edd92ed5e49ec2e72c3429ab2f3e5745d42d2e2d5a
-8f110fad66cdc39fa4a5cbf520130e2bdc9cae5b182e4d06d4e14caa48f035ea
-f9661ce17cc29d4c91c57d757ee5586400ee768b901c4fa51ce00bcfcfcfc5ce
-1b2c8a7dc2eaa4e4acce7692f00ee06e6f9ecc8be980cbedeeefa1de4571dbf0
-2ce7bd33eda192d31d31befeb2af77c43795fcc79b8d8f6cb0c693d3aa6cf49e
-0f3925aaa9f1173ef04f03d98e712334039fdbdc37308ffce34b411448bdca7d
-cbc32d6da5087c881d55e98f66f4679955b7a93c02f6b2960052319bb62c4063
-865b82366471478fd4f07b44d6443e308f8b2296068e4a32301cffa189a2a287
-74ee405234755f042addeee91b058edc49d37f438bb8693b5c8ec0dc84719b27
-c578b0586ee86290d38c1122da90e89102be47e53ac93f3be3fa55132dda885f
-4bccd87bdc334c32bdeb08933d4a5e6d85fd678f3858cf91f2338207c490c475
-7ce9d56960d5043b8c6b373bee6c0e173e6b3af58578fe6b36679793f07aaf5b
-388c7727d8e04a6f0076eaf9095a3ac2ca87eed2bd7a5c35fb9ef360158b0f64
-48ff114f281f2e8844d0ac1eaf0d3436c5310e6ae25b11e3740cd03ec49fdaab
-a40732a5bbc101b84d70449cb1c8880b0723e07bb2ef63bcc66b95aaaa03ad7e
-c163bb5e98ba3452d5373fc320fb774b13861b72624b46f92178c2d6212fb3e9
-abb7827037747261fbc93521cf1ba38a47a44efdbd6223a0f3f929309cd4e160
-83588b4ac6a9b874aea87a69a8081c5b6fc2f2f70a6b5a086493b644e5ab1d01
-31041fbd60c970f675b13a311e48b86425a83f68087dfe05a6aa22d6238e3e76
-d31d029915bd11d27dfaab5a3ae95e04ca156d2a600166616ebed20132690873
-8fd58eb219a91830624f6c1556436d82ceba3293b1c742f29fc5896fce7d9e54
-e1fa81bbe5b0ab391b73172c7ce9b1bee7b0784cf4495bc6fcb755092a5f2327
-c164e6d783be38ce46375f27afff4ed0878f8eb46634b8f0d84df58a54226d5e
-e4d25edb042bf51bde2ab6c83852c628bc95fb10ffb4cba46678b30f7b108ff9
-3adffe98f6adc255bf4b0d323dbf68fd559caaa55166dfc4f1987508ec46d6c6
-f1db251152af4b9366b559382a3741e8fb0383eea8deeb6b4ee9ac5c9cdad65f
-5996ed7dcc672c41852e9891d25ff257dd49989ed6eda6b3e5f762c930fe6d39
-75b412254c0279ddcd9fc664b9cfebbf06c884986340fdc76c8e4eb560300943
-3d2d96a10f09e80ae7b2eb1f74d82bcc9e16fd11617663768f5f51dc464355ce
-f33d0c912abc567c2d327b0bf95aac49f503927236814663541abb7c689365ce
-75587190537231e16c0d049332d3ce07562cea63b3dc191d68e86824b43887da
-4dbeec79ea7b0089f9bf2e61248ad3d27bb881b704b827e303c21cab98d23447
-dc20818fe8a249bdc03d772aa548f6c75925c74287ca9100e91ac1693d029f7d
-73027e8ae734e354f2828f18a8e87b13d803fa68e6d7c4a79333b21d177c61cc
-6097ca7ccbf700a75ca3b340472daacac6e39be45dd201f4517b22fc0acfd06e
-8920c858542ded1c95590a1b5814103c700c13ac904e7ca36aaea572110080e4
-0057ad118b690e48cb8545bd2eb99b06003c1387354fe3947eb5fbe0244e9350
-e7fa6e8da13b62b862b22fe5a28fb5f933d0d97d0e54d2ea8811762ad02488f6
-163c146a53f8ee78478ffab1b9e123872ee7f50e7f8b124765f3bad9c43b588e
-27c75b8e7ac979e20edfdd2cf68b506baade781facd7c00fe6c967d84c2a8758
-3a44c786038aaac152a10f82d5fcad2fb609f62c24fad60bbe5e8e0d3c3396f6
-3b00be25467570f5595f6dc9e53bd5a437fb7388acef7cfcbc22689149c386e0
-97f429be6c7ba8d70d8548e796192921b764deed94f5d4de9365d3535901aa91
-6081b7b548c3b7555f8936e343eeb062a2596b3065ed42f1489fe03ed0441236
-eda3796353e768a256f7eb8f6f9c05d9f8449bbe0a1d7e99519b7e119ca452ef
-46600b666c010d1f9a2eb21a66cff233852e8fcd21cd475423d32a5ed8f1df40
-e18b1290ffce0fb278066132598133f094b52988a9e3ceff74297f4bd6f8b8dd
-cc069cc7ef14ba3033ac19413afb7676de9a07a2ba70df9c96bd135564e7ffdd
-6ef470d939c5164eebd1d3824401c6e75b1b5695fbff0ecf5056142cc8afe527
-e260e93ce22b5e0098fb54ca8cb1ccb24ba0c4c8ed9ebc172dbb1b5755d34b29
-d175b739f71d3befbd43edd58f0b3b560466348628aeb205a6db30a05da09ed0
-a2a99eb5126257cd30c90758af231106871da538b340e7d6ce24fb0c43397f2c
-9dbc10f18c1839cc15c0e331deec3fceb468a9c6f60c233df45b0c53840dc659
-6a776c43976449b2cbe76e0939f060263cd00b837d21c32e1dd78d1b974fce3b
-e8df3ade9b4be5ee8c02bf10fc08f0148177e4b50bf6f1c98589092d8d9c52f8
-2ed71c6009abfefb3a2976e40e700a02b2d5ea69f59dc6598d46ff6b7e3050b2
-983a3e12acc618b4a2d369151b49cb89ca2bd0b150d6faa0ac681c932a7fef1b
-e77349f948e67596893acf953df11844fa2b074fcc8ef0b37e5d43a9282f3f82
-92436c0508cadf1b59b4e03f778dec524fd6465467ebe7b064ab2ec7f1e24a7d
-20ae5843b6919e1f4bd0215d91ab1ef346fd97fc9e4871ba30f83b06cdfd5180
-79d2926690101525f2361a54983ca427b4a7937b550aa9d3fa3409f6d4087cc3
-3507a7dcc6b5769a8023cc0b790e149494e0b4a62474fcf199f0522d0c0edfd2
-68a3b5b86d600177616323dec75753f4462239d88eb6c44827119de33665e57a
-a7a1f133819dab77d51b264df8b9028651050598ee266a645cf34719989a059b
-5493aa548ac308eb673f9c5edd38fac3997c4f7249f28883d763a6dbe8faaa9f
-ba42981773763490fd6ea356aabc5178f8e97387390910b3310bf74d879a02df
-15ce08929c489e7ab1b7fd5dba4b31f4d10a4d5d860b354549b948179339d08f
-09459bf54e119824e5a856cd287ee1066a69f78e0846fef677dcbe223357861c
-80e5b7f08bff3a08b1d3c18e0fbf66b43adbd1a91e0d609d92636ddc654afd83
-d490b7909b780c130d5ce89818169700a3ea8de81df1ace8a8443b4c365531e6
-ff35353f0923afa95c1c3fd19cdf0b9327ca8708ef9c891c5d5c96ea695d9047
-0ef9b222757d150824fe741bc0f9afa6ff11a882da853c1ef45a7f6936fbb2f6
-6efd8fcb33650ded480ee0d3857581fee0623dcd0207e6e708b19b0b93822994
-0151e373c3d60366d6a1b61f42ad9dafb751e557a7d4488ab09acda685610bdb
-4122e2ae576196f50c38a26a757b2b6e6ebb332a62b98c801fb67bc10a97df07
-f5b6ee43ba7a1c4583439a69b90f160a46f3cd05ee9d58774ccb8f11f8a1bf9f
-736579cf2d3b1ecde9546d86aac7e5a9602bc9cf2cb68dd3264a6b12f5d185bd
-10d2cff08d2ee240c3b2d4ae0d5f93e2dac55b8d3adf1166473119c3ea90cc51
-bb7f28012b48a63ee7acab3e774f043a008666af6d0efe9460c40ad82ff85ab3
-cbc09e4cd5867a52e25b1a72e678ae7cc06f6d8f913ac783749f30dee5feb866
-5ee18012b1c596918a5869a2eca7539063f16bbc2631f4ea99f041fc64b0be69
-82d3761638d1dea2ef828388c0629e3d953ba41816bb171d65e4b99cdb003281
-cd6c9b350577d2a922144402e90d8b2ede231304f055f7db115536c6fccda5ca
-a5f182bfbcb454c4d45dc9754d04a0e881fd03fed5383d8b30e8397fcef19169
-df94e71ba1689f4cf42e60fed255e8f49ab1c90a7148ac377807e088bf4a9110
-afb3a02181f44a7caa8fdc61d2fd78fc18883ef6bf006126737d5889dcba8e99
-7223053cf17a110798b1a1c5f319317ae63f9a6ad23eb6d47d61b34c596e37b9
-c1e107ba5eee08c98af96261458d758b9077c3874a4b7ad2cf2bf1d3a8f7abd2
-9533934e5f6adab0b87b68d953fb98e219f956ceb8f172f03286cb84384e9288
-6166b2b49da6e5696f042bb6006d942e34589984e970c2641b97fa88bc536d40
-5155f236de881c851a52ab869969a377433cafade08178b1d1133891e9df4b21
-f8348e0bba155ed17ed3c26fbbc282aa8c3f27192e1cba91e2c461dfb5a52977
-71874292019b743cbdbf11dd1a6bd6b7c1695f774a34f37748d49aa32b5ecf5a
-8a1a30e329e2ea9eef8f90bfffa68641bd11d749f5ba343cfdb0181a92ac9702
-97725b3968c8cd20a0af360e9b740bcec8644e4e1bab4cd7a3dd1876f09b6af7
-a90fa670a465949784201096eea610fcf2d5c15f57d39642bf0d3b246da6fcf7
-d01da8ce59b4d349ee76e8ae72fe26a170b2b320eb5d0a7d816488e248cc016c
-d9f4af759126fed20f54f6176b44203b3f1c248d9cc0e3c6ce05aeeb2d127183
-e1f89aad8ab25e5660ae88852b0465f2bf00f234aeff78a82abf21b3bd807172
-94760e71a0472d14f9d3445c24b38d72df442b8f78640c55412f21d6b42f7645
-277caed0dd19ffd5941e1a325aad194512d13e144259ae01fea735580c28c4c1
-48ce5ee289d8bc05bbe1323019076da77187d90a35fcc1d0b52e921ebef447c3
-fd0e445d5fc62c809df85bc141fe677098b65d78c29d9f279cab0e7b452d4490
-e93e6c3ce30c84ce73e2c419c91a304d0e265df004b549f73f69995347e3a654
-7e6a0ad2862de39e182bc4e880bf717643165a90b094ab19207369bd92fc3cab
-e1b71c496698044f2f1d2d30248eb0de57281ada534155d6991921fc3442c8e9
-0c77c1b1811bb3ab2bf9045afa0ef9f74f8577e48580eb9840354602b222e9a6
-cc9dc2c70f7c7e7ff18687a420c3f2a46680007c14d75fb701e5b8981f4e4175
-fc81d4286920db1080ad6c8d066ed15881d710952e5bc28c444448aad1df885a
-634ee6bc8ddb52470854ad55958e179f05e61f8151a6fc6311bba2419dd9a122
-93d6e5cf69411520f281b8ea2908ad8f4d774e777a633a8e9aafab363f426b65
-cd8889d109f0c0ef516da05063d1d3256250eed899d6ecbb587c7b2ea943127b
-f76453e581002ac170d6764cf3ef98ca600f07c75e2d124e3faff95fb28e23b2
-3969ed2b48b2be9b9c388660cbef5dd96ca0249dd307bd2044a5acc598aa0bc5
-73a97be07ccf5b6bec78d99b0e97238e550e4c56da12ec2657b6dcc9d9687795
-8411cf3d159f8796f6e9b8ee98daef301c4cd44bdf9da4c6aa6e50ff517dbfc9
-7be31ee0955a1440fe1cf27b6a708022104a9131d6ad031f87143394c7d21655
-2a540ddd9eb2cc438c06c9e38caa404ae87726a1edd9aaefa7e6b269cc543224
-35319eb5556497653b293197f1a5fee96c0c8fd7cefab51a34022eb008dad5ef
-e010fbea98e316dce7b94a9a766c121907be64f3759dee51413669aa882b454d
-51fb13a4b428d61b3506c20d551a6e96c1b538d6f10098abdc6fb8dd739cfe69
-512dce4336bd31eb5a626457ff6c1495200056c716a10c4c8e6cbf24e5a89a91
-a78d31db4b1dd71d65bb978edae1b0821bd3ba879a646c4e41ace1fb44d08e61
-1a9d945397ac69d01e8eb8e75fd60ca662ae1649346031ac32c3cfb352d84419
-52190ff0f58283bbd1bf4cda15bbd219f22e738d2c0a114e3d50f66f9fa5214a
-34dffca2cf6c88883b0e416196e49e45a513994ce8f1abe93591c2b6d67a151c
-820f1c7f4ec6a0531d2d13056f35c2c625044abce5111e3f625c09fa566c52c3
-615e8f83b28506f21ec2a9f0d93fbcccd3a2362ca0612bb8ca2123300786581f
-88f1632c5aa76dcaac69c8f0140b45bb46871caa9ff1c221dcebca18e506ea12
-c8ca217029dce549a4d34a58c3a5333e90286ce87919665657acec87d268c255
-36837e5b6cb6d46367faa2951dfdab709b2d2932f44561f73545c82e85599f5a
-8cd72bad593341e0de99b41b34f3e5f8c1ae749cc7e551f465da293ba7af4973
-35bf4d08a68e7abb0bff04ce36b4571b4212e6b98539da495ed516f0438baf8a
-ce13dcb57eeb473bec625cb3c5bc70ae22067e6f9a8b0f4b4fd231110aaf84c4
-a48559e8303e7016c0d02125d73c690abb75c178855eb2cfe2ededb11e76b06e
-6942a101a031fc5b110576389fbade6619ab0e05e20b8d750af2241619ff8224
-fd1396f44683f3735c0b83f93da04d435aabba9073a7985040bbc0ce5094ab39
-7579d5bf618b518ca8b1c4f9a8856c711aec8ca0609d7d338fc6edeb27fbb400
-db045314795a74317812652d0c1ffb1fcf453d5d769df6b38831c3914aa0d5b9
-ad41e0b7b9da3074043926028a84d1b09f52b619703814911710cd915e3ba310
-d17cd6d1e5bd4b7a9e7e3fa2f9d0dd50f88b50c895f3c7cea1077242cae145b6
-b6311f96996d437e369ee8e46d6680affb65c151541ce5e2eab2c851b693cf8f
-2b304d62d428fee0c99841d4518fe2f67ffd0a26934bc70b2d970e0dcc13892f
-d3b725ef5a946c273da4714ad1b2f4f54f1c257511770cb2bd0c010c3c8b03f6
-3190f52f50bb4db5aa56eacbc174e40452fec845b974920633f2185bb09beb6f
-f7f1be65ec2fef9d10313e6830db245c9c976784acd842f22c9a12d51fa47759
-d9c0db2858e0ac424e923a48e89eb55b4d8ec738caf394d3b4761a1370fa496b
-6d318f951299eccfd3de0b94ac27a952911e165ef590fd2729cc2cd86e0362ff
-f5b51dac1c08519ea8fd5cabcc45d1672f3f04d1e463acf0bf4125434e72cc76
-e900f78a48609069187cc80acb13d0f177b56280d468737cdfc77501bd9b4036
-fb146ec5319f7a3d828d5523ea007c9cd545ca043bc48f174f72bdbbc984b40f
-f6d51401d414fea2bb1ed31761cd919dd49199c0e0d0f1ed1f00e8c3b59659ed
-55a1bcbc97ad9195e1104af67d4ca355c0c37ee8fb6ed7be5f5ff6a68cc2ddec
-49cbbb71871262c4a1a7cfaa39aa6c86002050d91f7cc507715fd6b2d3777d2a
-3b9074928121dca38c6934019d4fb8401c4c2484dd0c0145950067025edaac4c
-67a0d18a77005bf9c9f953e9e55344f449278cd75a65a3b79071f4c3f0431c82
-f9fc739fc4f3e54611bfb7fca635a02492dadaccd7c85d8a4465aeb5285620be
-fc6180d39c44795748f3fa23b9de86a548feb40bd8658b4adaf79ba705edbe4d
-1e5c36ec57d22a9c8d64bbc765b504658c167ca8829e60526239ca6af7624781
-2c3d3b0d06f4a51cc6d8c8edb841bc0a5ed2f1ac4b9fe64e09fa32417817304e
-bc2ab036447956eaf189ec62f0e415f7020da9264ce26c5dbadb6dab9166fdcf
-56e1e323947513da6e14e111996db6f92e93c429cc62d4744f9ea96cc7c55cc8
-f1859730327991842fcc7c2f2fc74895ec3974ae60a1b3345edd7929761b6338
-5450c2927d83993844e156ecf5266e8bc5613bae81fda0a628954e111db74915
-285e808bb8a4660c098b60f251ce38512910d17628131476de7f1ac985ae1fbc
-a382688cad091dde470d6407a0967cdcd26328fa9a28952ba14fc49af8a908ef
-82cd09ef940c6f66076bf67250e40b19a1e9e4f164246f6d1324c702a59c143f
-53a829d967d83e905f49fa3a64a2b72689d35213f3ac78f80ae21fa415f2440c
-4bcaceb6ba89836679103b22bc93a425606d83c43fef202e4d6f20530da1ce81
-2963064da571136d79edefe79ee876a4e01fd64a5466315ecb61832fddcff2c0
-73e6aaed9940bd8d28eb78f75a04dca7235f8794074ccb5b2b8e5099124b91c2
-047aeeb70e8fc5dc8bec6e18376fb7d5546edc7bf20671931dac014c6fdcdb35
-43d15211873ee65f793aeb3291f3e88a603367f5beaa7ee59e862f54add1a819
-1c4b38065adcf525170842879e91529f35bc5f7f78e58f17f870dde83938c149
-b9d15b3e8996fbc2429993e05683a4c7e64f7bbd5a7efc2c9ddee24ba3f329cb
-0a7b32180e73cc1eb891104bc8b0a294816011bee7039c6fcec289e625c725c1
-546ac9b505162aa68156bfbf40720498408809e5312b4fcb1505e42effe3d3a5
-04d792517c2b85388280567a1554181855fa60e250dd91af20b44bc17931fc52
-a88f9a9eb5b8c1823ae73f4a7bffcdbef86288b38efb87dcd76ba02bacbc8349
-3613b0938cd5e98c4f3966339748854ee61bc5592ec209de1759a50663bb3360
-831bbcbe02f72cd061ad784137e2480fe026a9c1130a5a557062d72808530bd4
-0b470f97a025ec3b2789b6274ef44b92f5d7a7f138683cc6dfe03e0cd78f9df6
-5fc8eb68eec6f8528ae8a469cf0521062ab95a4c7997f38969541cdfecc7f89e
-3263cd46c25cf6b7cc64fd20e741017b89d0298e2c55e9b582e6afcdfa1edc1d
-fc65f458a91007254db8a33c38db16db0fb35352d54d9c88d602caca571af64c
-b0ce3b21689d64fa4561dd65be69b6e8fb81d3b2e32f7aba81353cb0f583f90e
-57df42cfe601d5c05df071b49d4bc7a45df5ca2eb8a1b547d8767a1c0263b93b
-e41caa3561b425093e8c8a44034d9553d96fd11e72be93b81b975533b30530f6
-fb7c44a81fc33028d1474d6d04ea1e8863403a4f27da27dbdb37f2af7eaba079
-ac68f395e8237597cd822fed413d10e4bc700e8e3409729b51ec700b17732149
-742fc60c9f5b26b11aaf47d3e80d4c671e5bc0511f8bd6e7dbd28790e622a32d
-15e9cfb4739f4c6d67c8dbee302232a3fc9cda721102dcdda24447202601daf9
-f6c374b9b5d687d06c0755df942e51d5522b896292211705cae907523b9e872a
-04f49baf43d89c3a4a37cddba1d3f20301666f7bc970b72f5cba25029bcbda99
-9afcb5df7a9fca9e11239902bb4b2e4609fc6fed679f9324c16216e4fdce2f3a
-50057b1e73344eb5a8b739788b30d3c4e3ed6336c95c84a2237525c33e59dcd8
-4a08ca60d031829e9bdf9a3ab6dfc6f8bec79e40cac1e69ff6d5d2ccc9c65a38
-bddcc8526320d847d7c6543f29f6f50959efaff66812939136bb69233f36d376
-c01c368e7fc20fe2afd1192229305000ab8c2068d8d2158878144b545c2ae572
-20700483bce6259efaf2cef4706059847bd721da53a0f842011e6ccf8c2c3ff8
-97a477bf6dc659a256cc73f4f3b02f541bffd23439b12520e45e1f731e06af12
-0c93c3b21993d1cfee5ca71eb495e705a830eaab201d4ed332d65661cd38e493
-039f250a3ddaf8c3a88231fb9a92c72e02d50159faeb9aea556c89017a8703f4
-f2bfc73d0a40182597a260cfb29c7cc946780548fa1fbf28d35a93a2393a0793
-1c789d864ef906249c1d36ee78a62512e29a9a3f970f7a1be3e7e566206d07b5
-15135f143706e0b713591524dd318f1b10210cda652d5a6cd43e4e4a1bb0e855
-26157e515df835a962e7fbebc7f51a74d5224d20b5e0472ffb65913d8da5900b
-31d90ca409446da57450fafdda1b5975d898b4ad2cd43b9d0660aa81417d2847
-d4d0cf0c9d73ec645e61f16b80e1506a2d2ab8f87a1ae7617d7fe8e5caba611e
-ba028b2036b33721f78dd420557254b02c071c99fe068be1430a1fc3a29ac15e
-37097bfd6ba1d7f095e98874ba909a6a58a419f82545c65aa70f5f2418fea14b
-1dc7efcb3144c4cf060e6bcf0bb68c3830e09d069e83f830e6e4cabda75e9cb8
-cdbe388b0a7c23f7e62a4990c705ef96fa6d95ecfd38b2575b0be70d0872509d
-d66bf4e2951121cae49c0b21a13685782a2a83a1ec70bc987bb9a0fa8f41b273
-e071a94a9fa55c8cfce83d1c7d9b0549c6227b8f8c0ed03760f5ca091c29a663
-749627d4038021a7c90bedadb4fa40b8548126986369e04f62c1b9c31624ff89
-debef79c9ca9b8ee82c6db65d8a67fd9c6fb4463e956a1d7120a5bf735902327
-6cd611fae157909073a41db7f5586666efea0c0ee7216a8a5699102ecc251f18
-f26c6630cf5273bfc9c1a27e6abc5156231d8879c0d1d767f6c86e7bb09829fb
-6b1434eef852c1c72751010e25f689adadc0e0ec47fb9e4515ee95bb75a77271
-0b13290ca72e10d1ee9ee35e9aecc6f32c83f2b2eb30aaf52d6948bbadef1b58
-7092fede63953a88925df565bbe37456e085bc3c22c2b340d07106ad7b699614
-f7e74dcf82bbba467ee87152378a4ffb6192fedbb103b9abe1d6af8e0b84143f
-f2da81b8bd16f4b9c110602129530d051a23df6d993e5f0251429a9dd8bac65e
-e13e0ad97335e389f3bfff17b562ed1526ed4ba8f1e52450de53dd275acfd050
-dfb13f167c1f18ca022c2b6a74cf496999b02ffc072a6aa998e386cb1418dbbd
-c30ab9ee4cd0ee2f0b4eb816f7cfff1916d0cc8cf278cc8a1ff0501f48a46b6e
-8dea7d7242efa272bc744d96dd89c2814c27417ab2d6ed7b765c02d8b9a1403e
-3ec34f94e6c198994da83a17ebfaff5e310140b44f9496caffedb1640d85d8b5
-d3e2b2b5ce786f6d910da398db88738498eda315c4c84acd1e3534f6612b1c41
-a27fef1368c001a24ec8b5ee18a9e0d84c6d79671cc362b0c89217158b930cbc
-c852b3ba003143a4a945aafa7d9c060c911722bf05018898840e8f72f459ed72
-13d17972624f593de7d4574a1a9c7e2590cf1d17c5e284021472e4c16fe656ff
-e0cca210ea8ef7a64190c489ecc098c09ce5d0fc6700ab2b4ff0d6dab59f37aa
-8962226106bcb7a416c48170e107f5bea3fc9fe680ad4a7858be6f1184bf8521
-4eb16a7549cabdd7fc6dc23c62f3164728dfbadeb65487fd0b979d3ddadfae17
-06cc49f9e781de915ff8d88ae280986549fd6e8e228940aff26e1263879af4d7
-228c6b84de15ce2b2a5ea3d3771bf8e95c04afa2e922582f3b7b4aae3bf322ff
-30a6464cf8c3dbb95a21a4f724c4e59d581a01bd6be1ec8948f82365125cc16f
-3caaecb92d36829d781ecb3b6cc69c70b28912a75010ef84402c6245a9013d0f
-7f24bce18f8d73b5c2ac9e9d91337bdde61801fde21bc848876817d2cdbd500b
-f745bdff95fe3e4e3751b157a590e88ca7cc089ef91d55757792019742bb9cf9
-000b47a1f0d14a1fbb71b8875f7069f246ce622727e771363475a132909f2723
-9d4782bf2bcb24db445a975d7b84c0c0668b0dd8dd990583788bfb5f6a4c853c
-32bfe6ca6718801b712e3eadccbb086a9245fe255413893f64a6a4083586f476
-c66112c90d7f9572e2ad81853e8157af2bdeb4d0945c02c046a1f0309ca2c93c
-fae5dde45a34e2d6e27f28af0a606c854eea86bc0ffdf96c77df1b89b39dcb75
-a49c09b7047689abe355ea5c2db4f5ec9c67451a4a3b7b92ba4a202b96b1f314
-ba8935ee7497f1d4375fe761841bbed442591f8154a5e9a62cc7091d594688f8
-70f11412ae503e594e26b3a55d6ec4f24b4c3697343f22ef816bd8fe8d13acc2
-c7544368358b2dc55ec9312ec58c536793ad6488e7a410427ea80bee493881e5
-273efb06078b999d66884513052db33f5304aa8a5e35f2881c3d7a3400fb6302
-9997a24ae45d0a092bc78d0d005da85969615da06213333c212cc42f4ac43902
-750caf338f4cb0c590c4d5fbc21d676c5b5c39e1cf9139ac9b66272abf97f0c5
-863f4a4be9c213b2b1bd67aa45b917d919ff99748ac72fa997a52d5b5958b38c
-40b3b89322dacb31b2ff49b98c2c6a5bcc5d2e26ecd69659bdb88ffa1e226a74
-d4810d6f0a7602d79992067908c058016b9d0d71c6dbf7bd1d13a2cf2280b7d1
-c5e53ae86e6480fe7fb57efc26de2df4cfb7afbf0a0f6fa6060f0b2a3d1c64c3
-cb9367e1f54d49cb808c1adcfbef9b278095cbbd2d3720f5ded47187106ae1bf
-becc86c6676c98a95eda58cad196e2da2bfbb8f11681ba95207df27dda96d8d4
-9943d4554ab623396c271b4a087a3693cae43f944a00bedc65e2c724cc3eef22
-0289695379b2bbfc594837e20963dfd0cf5dca06d8b2452be1fb37fdec2229bc
-e6928948e26596437978defafaf1020386c1523f047ac699802cd674359b35fe
-9bb4dcd3e2b60b54c70a28a5bb780baeb2a12c5e333fa7315b38eda4d03af438
-ed35fecb6f50f5cdd3b9fc770fb3bd6e3564b49737dfb730fce448a1ab008366
-2ed9113051be9589966ec890c750df83b89f07e95a8d34b9970503336941c35a
-fe2f09432285cedc586d70ce35ef5b6b678c2f20b5011e92d285421272c052e5
-4bac78ffdbfa89d1407572c8595e274244973fc29f3c1e3a85fb63ac3ee099c1
-5cae84c945970fbe4f8513055d5803139b8207687d2aaf9eae9f87f459422bce
-6fa9ac1b6b7cf09b8529b93b31abdd91a44278ee39faf29974f34ee4d787ecd0
-e689b5076c9113e4242c5e62c01a847825e402376465ba14d12477a241779bbe
-659eea57ef267d35ca3c88d34326028bd24747ac2cb6fd04e556a99f0bc44d8c
-35137b165465764bc92c9ccb13f77462fdae83fb68a2b36d70719346f56e79ce
-5271fb10bddd68982938c5a4be1601b16b32af11586fac8299a76d37ed286643
-18c06a87721cbfa8c5507b6b40458afd111e0945077f145cbbd2137ceeeac951
-5295ee98c1747f3209f8ce643017911a30a0d184889104fbfb01f9f1062af6e4
-b05b489302bfb2c8ce55839f7d6186b081e9ace3799cb323894e9d9bb59aaa91
-a7d78afca8aa91952fa5cdd1c76f602c95c31d5f83470c62e4fd90fc59f72b92
-2fb22b1f4414753875674e00ec274551d88a5a15341a2f98ab8bd6555edac3fe
-c5415609051a1c0174e69929fb164223b6cc9171758da0a676a5a95986229dd7
-bbc4f2e3685bad35de0cfe6e42dbc304bd763d8f1fb6557de226e00ce34b6f26
-2f7e621342a34409b3390c4b81c50d1de3ca485e1c56a61d6d13127be952cbb4
-617a079b3137af9e35bf8a65634b212199e232775d98f937d6a8bdf4c8aa233d
-5e598dacab2e87363acf2748ca7670fedb4c7f5ce9dd007a0b786e4619a82cfd
-350ba74410e49e93a15f1046b34c2014022ea2a44c31ca910e7105138c60a289
-a1327aef09a7e4dcd4b63ac29038cf2c57c5440a355446fbae9c90686493f055
-81a1fe20b5a1d9c657ed6c3a0ce0d363c86c5d9bf5a608e148d2e512b9234aad
-295ee956dff7ba58bbb2e2b62bf4d86099c6daceed8859c8f666f758e5533dc9
-63a98e679be18626d5cd0e04f2d92922fd0b1657c57bdd39e85adf80019953f7
-bb5f5c4b7d7b3df072a764e6f1e41ad3ad10d23386ab594cfd17d330c9341e39
-e67ff6cfecd3d7e2d4ba48ffac38572b61bef1f6ee7d631967a357b6299159b9
-a20dfdd3aa5b2b7edb1e686fc8081106912a5524b234b740a627741751ccc556
-ddd0424f5491a7a9101cbb197b99e3e9833790f8a7e65b4086e3f6014f0aa6d1
-424e405a5f75a55bc7d55374fcb4c1f50153f6c3bbae87b0f3af8261bc42f7e2
-48ae94a660db17d3db51527264501e8a5ffd8ce7582c71a0c220573a86181d12
-7346b4c7218a87f9578fba642b365d57cda7aa59a770f402f0c8ee2334360193
-1d519df5ac2e9cba36be0cad1a3817ece63b75eec256d0678799ad0a56f3b56c
-db021b6e8431f840e1a2aa9c898c5ee73cec569a8110878612c459e0356d51e5
-8d132726b2c4ca26209156b91950bd344628d7e6aeb7628ae4154ec8cd1cd6e8
-f77d9ae90930427d682fdf44239c52f43d93a5649ab1a94c8691622057946600
-23767f3b2ac73390eda83db23e6d1f0a3b58f09f7d82221d6ef5835a15644a5f
-6359a98de0acf1b8c06ec0de6d3c91804bb86280e11a982f4f238651e1d42335
-eac6301249802389fd8b45c30056fc29add3c4ec7cb007097799549267a45495
-9b83099d6409ef78d725cff9e13a0d5b13b59cf4f6d6a3b2402a1f80c1e35c19
-c448bc004cdc88cb76867b97b0156b0988a152eecf47b30d473f731df755c8cd
-8693cc86e9f0a1a0dd9dcfbbbc724f521dc300ac50bcd78e181113dcfeb74710
-a70d6e6c9920256d613c6b28b46ab08f82b5af67a4f216ccb31d3cda24d91782
-0e7f45b0a135c50e03fc75e622819aa54c02339474366c07129a5c42f4d8f2a0
-e23a38c34d47cddb09a417f2fb90923cbc508655de01235df27c7eb511aa56c2
-4fcd572512586843ac6a80816816e6dc852a36223bef2299c6a478155776e16b
-90031f71d6b7ae2b7227c5d8bbe57d1af693ccdb8ff883730cade61fde996bc0
-6566259af76a91b9b123665686d660ad9de6b292c5bc47eea9d2ea19a2adb49a
-7a1cb138d99e4473cf1a2c52579ddd41c04d302a9214c5ad7ac412be4794fef4
-15a5e11eeb5a84ec3a2e68811820e084a0256dd625e6f6a61241f8904bfefae0
-899891ffcc05cb11519da935e3b9e692ff22927da8c03efccd2aa9311e014ca7
-548db11e8e8c8c6aa5aa6507c70ffaf846a571e76fe421661dbd503141431262
-fd436c79108d8c7ca8c5eec44fd9eebf54181beed85aeff4e1b6ef6a9769e2f4
-ae97060298f4c7fede54865740cda6cbaf52ceb0c963e935fc894318b997add1
-977b0229fd0eb7d13ddabe457b7aa8a2d05b2b99421e01b4d775cdbcc820b1a8
-3ff39d8a7c4d6e4d96125ae2ad688f997e5f221b6ecc4134ce16f9613881f4d9
-049e171462845117cff0bb70669a62570e7361c5efb8aa5b6b858d8aed27c149
-70155e3406acdc035b1b9d1e49664a75c8d52b2e8777fe77aaa8ced567bbc904
-a44305a7b550
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
diff --git a/lib/fonts/UTI_____.pfa b/lib/fonts/UTI_____.pfa
deleted file mode 100644
index de07ce5d4a..0000000000
--- a/lib/fonts/UTI_____.pfa
+++ /dev/null
@@ -1,1165 +0,0 @@
-%!PS-AdobeFont-1.0: Utopia-Italic 001.001
-%%CreationDate: Wed Oct 2 18:58:18 1991
-%%VMusage: 34122 41014
-%% Utopia is a registered trademark of Adobe Systems Incorporated.
-11 dict begin
-/FontInfo 10 dict dup begin
-/version (001.001) readonly def
-/Notice (Copyright (c) 1989, 1991 Adobe Systems Incorporated. All Rights Reserved.Utopia is a registered trademark of Adobe Systems Incorporated.) readonly def
-/FullName (Utopia Italic) readonly def
-/FamilyName (Utopia) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle -13 def
-/isFixedPitch false def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /Utopia-Italic def
-/Encoding StandardEncoding def
-/PaintType 0 def
-/FontType 1 def
-/FontMatrix [0.001 0 0 0.001 0 0] readonly def
-/UniqueID 36549 def
-/FontBBox{-166 -250 1205 890}readonly def
-currentdict end
-currentfile eexec
-a9994c496574b9cb23f8cbcd64a4a16861c70f0f2da82f0c7b06ceacd6521bb0
-cc26f1cf47836cbab75757d7a81793f43e56cc8f22f926da04d715ab6ff2e257
-5a135dabbaaa58f31f548cbe8a76c69e2402589b9e5e46e757f06bf2eddbbe6e
-e48a624cbe1c4840a338e90f7efbe9f2194aee1c869bc4cd76e2f1937d78e207
-d8149c05b50ef0bb361f5905977c40be7d4dad07b54e087896acda5aa70ab803
-9dfc55a73134c7f1c9be9028d3ec6ccb0fbb8fda52bba4d7551a8124e68481d0
-775ed7f8ec68d8073bfdd3b67f72ec68634ffc57727e16b9aba841546ae54d99
-b60e227682315510edda09bd6ead4d1652f449d737592c44bb178689a3840169
-53d899636686efc6f838b19f966be5f833f5e7d41af38a899df96fdce1ebc116
-9b0ec87c930d9fdcbab7e74880e9693a24de9c67dbb0dd75b3dbd113b079c490
-60018433ccc06ac1df33fc090c4642fd5225fa0a188c131974ca8820319704dd
-14b1719b958779d1475d92e712322eb2e6a79d652c4e3f5833aca3091675fef3
-fde103446e565428267b009d87bb7d6bc40f46b498b19bf1223aba33079e41ba
-a9561254a9df97a48d71015b6a24cf952539f664f172d565f39a55e063154d80
-a960cd56c34011fe26e8849c6677427b2c7e728cd16272363d76661b3ab8bb2c
-85c20b747519a4431421d4c83783feb896c45688ff7f824381cff5654a1bfc68
-6f4894e1d265455fc00064d08c37dc3a47b59a5b2d14dd893a2b871492b07c4a
-591695c8df012ef46a750d6cb7fd86696e7ead280648bd737e9ea490140f3b1b
-1dffab2ff8e085a8b1c78e4b9ae9cee277a29233cec5ab2588d1cdaf4bbb6512
-e1b1476c68fd3db18ecc2536968ebebf4333c2c3709ca354f21fffc38c3858c0
-561378a701158ed0201a3b236ca9cb7f7528d1e5e07a9bfab04f8d0fa3d12405
-5ba2fa9dff76f41b980bfb36e8db1300f7172c902dcb9f5f0bba3cb9c212bf31
-76cb802ddebe556f4610021fa3700d476a2be2a66ae6c658fd0a95bc1b9629ad
-03fe4e775ffdfa9f87a274fd904c0db5beae258f9af213f257db2be0265b964a
-681fc4d2855f5356fc87576d847db274fed9ca5bb4961ffcf53f28b673f50e31
-c3c634604e70fd0895af711c9fa302572eede069f65502f68884a90d9f1ed7f1
-cdd95fc73ca6ae925cce4e01e49934539739f082f0ff1398deafda84c3d9b1e0
-cafdefe5bf321670bfa286078bc066bb1895b1a3f0253abc079b753c8f020fae
-ceb70acca52c4fd011825ba3ab32ce9c7ec263b4828d979b57588c48de210085
-e56eeb002dcecc967c95f219728511ccc6c51817125e1afdd3e4a9b35c8e5551
-06a026900808425393fa10ea4b6f4513f0af047d326d80462d36c2c7d033125c
-ab05bd0d3058b69f11a1d16f23345b3c97e444ffcfb4b3496743d9f6abca53e1
-b702a359cedda4d78e1a771989290f86ceee70502c574d6582a64045acbc33ed
-436871e9beaaefb12174806003037e8616b5f12ff470cc6e08b0af6789b9614e
-6ce98441b72e79b0c613e4a01835cb4d61c9cdecde9a66184af5876f0c6bea8d
-8280472a4c6a2f38fa95b7c475ce75f8acd6850e8e82dcbbbb96e7b389612cfb
-082c280fc4babf5da29e26f1f163d5ce353c9eb61122a10634ca3224261089f5
-e999b1d591d92216afe16a409f7735043885cd0218b4bb7289fb4547fdca93a1
-30280807d3c5fe5abf6d6ce88af04beb42ee031be89efad865f05daadc0ec4f7
-871c1a8d78e51a453a8c4b0ea780268639009c2ed6741fef8c598248ea9a2c5d
-f3ab0401a05b0fc35f66bcd6c812087ac03be6cee22ff97df7152681279de3bc
-be0a5c3574240a561f667c87a9fd065b788c9bf4e38dce8abc94f29acfef1933
-6568527336b48570be215a8ed6c54642ff28aa5edebe0228873c55a65430ff76
-8502e836e97ae8f2f6ac4dc5eee76beba71cb16389399a34535296a0175974a8
-c44918f7c668fcb07a72c0771fa8c49ab7d238611d8c2eb17a2a6f7bdce45b45
-2616dd51ec465225f83e886237b273488f4ec220d1837272df8a504273fdd95d
-ad88d197a3a6e92519eef80d7c18b31df15b9530d96f9982c1f7f870a95272c1
-325b394ec41c9e7fd2f13ce4adda1cc0cca0ad9b068e4d1c92e17d1ebbd4e365
-f7f4a9c547a81470f3ea6386dae456937b302a2e6f9c4553a39ea280895ad232
-57b00bf0b1c9c38746dd5438067ea5ba365b1a4509a29bf938f3c028cd2d0dbe
-441c1e881135b7abd353f1b14f225001812697df59ae92b11a92eb68b41a6e62
-637f097d4b079e266a81e6bc30a69d5741ebc518a6bab96ee0f79b9cdebb1d35
-04f88ac6a46db5e7be43a3c290399f00e2f78da44d348c66d7d12ce239b30dc0
-8f916c875e3e54cef7f5f1b966f606d8fa3e072d4a417b3cbd43bd3b644b2928
-626f29f4d369502b63ff43c7be25193bf11216db04ddc2f39faf825a559576be
-427bdb147daa9d9dc8a9839daba32fbfbc8d9fe41bae9d7b15d8106ae01e2cf0
-d59c6f8c2cf498fe7518fa7b84f38c6f4be7cfcfd0e75908650f52a107ab7d7d
-2bbb6361d5378232b80edb45dfc91750eadad74c9b42a19339d0227d83caaba1
-72a43d3e5c64129284a50ecbc669f29a4d4caf634369d069118fd7a3fe12bfdf
-e202f3376727ae5f1a9340d824dd8b76a517da44eacd882063c8243e121769d2
-809ff04b1e23d34d9ce5f496c7f1926cf1b0930466df9076dcd5b82c97fe1b45
-d1579437aa0820561298a96e22c94befa09929f74c067706594eb37375c136e1
-a9491f80c7a0a0fd447f078898778428309ad92d89cae7f48727d8912deba5f0
-d7b49674111a6033b67c19bb92129b7127d4ce80bce642b1880628df772a87ee
-5b48f395b55aee658c50ab2c81ab7de66eaa52382fadcc60957581a4e09ee989
-331ca245586217a7e6b0f746455c59552906d8a525f5ba5a07cc1df0c45b6ed0
-95230142ee05ec75e12531f65374f78173615c913532a330659b9beaa653eaed
-c0895b65d1a44304e09765cc9e070f61820249b6236194d952103f17799b68e0
-8b447986aea15ecfb780f7717986537516a6ae928648b16a51895f33adc17310
-f0813e7c715368bce559bab6c2292b42198f7f28a2ef66661f70aaad4e5ff132
-07de7de9f1691d5d1235d1e77a71403c2ce61c8f8960c262ea5fdf4e93fe87e3
-b4d7a400080f90a71a8805257c24318563575bedff7ecf2ee53a6ca8a24f8ac6
-e26c70b028f87a1806e63784542067b3d9deb6c96122c644e4052624a9f5e2fd
-c04d4c1d02d39b438097040027c0b7131dd5febaa0f09b767cce35c4e4447387
-567dc3887cbe792114a9a0bbcd01c3aeeb167b5ea4e08f2e04eeb67783669fc5
-16e91b1fd880efd3b1e9c1553a2900b5f1ef5f7b6ac7d3574456eb2fb6494511
-cdf324639998efce019716334e92407673b4ce1d19dd9ff89d301a7954e95b4b
-11e33d64682ee3a8e215ecbb482532e9f0dfa9859b014711a1789d97b8aa0809
-a1338f2de4e58a9c3d727b6efb754806c2cb3698d01ffda6ff4baf277aa570d6
-524ddf0898a02c508bc6684ae45ced430993828c8193cdf0091b2dfd7d811424
-364490b8e607aa52cf695a4179703ca2ea9d0b595770729228f912fd9228360b
-359e298a8845c00bb1fb2aca1abdfc1c570b044bcded5e35986c484f0c84cf37
-6fcccd6374804a3d380b48a6b50506b0f52c51dfa6d49c83c9a2a8bc366137cf
-3840355310b16356606f84b5da7783d2f6d6f46284f63f1ca4bd7672e114eb49
-9a2d80bf132de70d992d326f70a272c64f6264b68aa7722e7a0e400eee21e634
-8fc2524eed6e4df4ae7da2667dca0cc4d79eb78dc7db496a7f54564931434aba
-a06e085a1d1ecd916fca69e8cfbda338b6f873c90f3440ff8c442646dbf337dc
-9631f88f60d4efe91d35df767fa8a0e3c1db3d0053cb419e78453c595d6cb05f
-a4205d1b3334183c34b5bc80a898ed9ab1cc015c65189fd0efebe5aea9c71196
-ae040a0598a301c4aeeef4864e4789b1124dfe3f8e1aaf66a3a510705f6a21a0
-cf0de7e2f9a2b89179cdd4b009b33935b87765f3bab41ab667e39b74c3774edb
-443c772d06d80f7248bb6366d64b1a408044b55f61f641793436d23b35fd55db
-3a8f7d0e99953a6e74338c1d20083b579e534e887994c2080731ef4f9c6cba7d
-5ed6975b583022715232c005033ffb24995ccdffcb1f8655de53044fc3a46950
-694b82f991cdacaef5879fbbbc1ba7de04cab076fdc76b7e75aeb177c61143f2
-4ea610269642f4b1c765063418ebdb6e0fd220f6005ce8223f956d6755b7d145
-e734a947ffebea2904bad11b0fe43beb9baaa38108e475ff79e8ac33bc9d7138
-3feb6e6e7083fed7a31f178ba5b930f47f4c197fe5217f9ae5b64c3ee13ce1ea
-5db10538f5e54aff7b81aaeee741713bd60bffc2c8d3f7361ceacfdcca39882c
-6b0e2217bfe1990908c1c79c59939a2344174f73d069d0bf1279aa30f722691d
-faedace1bdbe056026c8c7970def57b68fb8fc30e7a86d461a2210998c103c6b
-835238192c02ceb0144f2e035fc89f160fb9f14f3a6772b5dcf908244629ef82
-30fd14e830fec7280100b5eda94d83208463e7358028f83fe2605e7dedb85355
-50384276f3b72f5895a6bd4170abd2bf25d6a6d8c165b2ac5620a3417927744c
-2a9798576343f472e6edd840b3082a22cc0efef8f53787167273e0cf926ebee7
-868803e55a266e761dc6ab8f7722efc301fa93ee781e081f4f58e6b6ebad140f
-ab33411eca49b23928a425e4348cf705a1e0f4fdd320025f3c315cf0da1170fe
-1a13ae53d45b712a3370f2e68051c1381311cd34da1096e7cc8d2c8e018bff87
-45621d8452fd40edaadb9e5d4f89d92b51f8ed170dbea911ecd14ac32be75dce
-dac5e26c212d389c94cd67126b98cdfab76600fdd7f36fb51813987daa38bab0
-974d2ff8e114b529a87d187e5d6e782e8f4f5e01342a5d8c95131a799149e496
-9549a3cd70a85c5e69894ea8b544c3df17e4f25d704b96e1ab28aa76babe5b74
-e39b799c88ba47826dd52f55d7840a32481524a5067c247389bd392e80318ae6
-cca790fbfd0d7c6ed9ed7523b80390e2a67d5e11d03cede53ca91580a4f90e83
-17fe325ce9f63b99ba9874c84cf44fd1b87d593bea28b5b674a643753758f9fd
-27aa8213e088f885272f0cdb0792cf315ba0b03ede938756d26a025ce9f682fe
-2c6cfd369314eecb40063f24f365edbeee61d41370bbec9b08665e43857ec274
-6516dc151c4fb114da529efafe44ba73a2675d1d19b1dd9e696c380379df7682
-42de54a93033c757441b7fdfa404678109b0034c4b4777ff05f4badda38c5b88
-d6c1ce1d281521ed0077f1bafd0426e63b522c3ef1eeeec9df67f3bae4bc48e5
-15ba02efc3be471c0ddb42372553ebcb4863d6625245dbb6c0eebb15efdf7e37
-27335a4e3ad99e4f70e57e218e749f30bf9c9a20f172c40f0532dd17d93eaff0
-911ffbee62309b59cc549faf8048f56afbd6936cf686514b16bca3113d17671e
-15731aa12b2ea9c46f887180c3885878a4b59f965f15e1af4cfa20f1d9fd84bf
-7d21d8488356d638867f2ce794c2d1b836bd471bd561daf63e1b427ea3e3c371
-1acd9f55e8fd1d53c279f5c93a2da8a8aa80857f1312d2e9e418ae4440a7c4ad
-6216861f66844f4ff36f5ccf37e96f76706f8dcf7d2a8b6e76a8bdd30d66abe8
-6846fa3b8d5e8c9b516457aec4036b402bffd6913d24cce8714449de2ba50848
-6d3f3fcfc5f81e9f85c99e20cd7551f1f0b63a04b5d8d9734fbbcaf55b44897d
-621b90bb0f3039ef877c04ea5d7c747cdbc9c25b98df15c1ae3946453ba2b8ea
-733dddb19f5a1f3ddcbd8d0c6bfa2e4b914249156d26e0e0bf16a088a9eaa107
-60fcbf45dd8e9d8bd7a837c3e4f840e1d747ec1bd31a82172152819011c53c1c
-7f2ddeecfa67ae102bcd5b12532bf43d6e1b515b27918c89c32d4df49c3afb6e
-3b719f37cf1cc9bd04c45129bde8b221f88e10cef81a75e890543f0a65afb387
-7df9dffbbc8a0bf424628a26a48448e17f180c4dca4c25daab5f4b5fecba8ec6
-24d80359767b2bb4dcc58163295031ff07ffe7b73bd22928f63c62c2e556c419
-c3aa968ba13b7bb559197339835490f2c15d7617578787ceb25e01cf3c7e031b
-607a2397a682db4b4ae408247d00136abd2e631c85653f45c833948b48aac4b9
-ce421dfc528d49cfe98ad6f5bf332ea672288b85520b13efdd67bd326a10e118
-6b9e7026afe8f70aa21888e25b6e28ceea8dbca35e168f23aeb233a18d291a34
-05cf105b4bb6966acf3a2ea3395cf406dc6271a358c3cf51ee3f63949e738c69
-3a2622ee7dd92ed867a3c279aa260499e75ce46503f33c62a85404c6715ee35b
-861357f1e5ad91e1779f474165b3c61b3f5cadb6e38af59fec5eb9fb81773bf9
-83e923c4a9d7aac4c64a4490d575030e5d1d2c788de808e626968374fddb4977
-954430d7513b84f74d7c16755027fe46e5b9ec95cc3913dcc28f8963e90cb00e
-ed7d1af4c8c05c52f4f799aa42dff81ce677d750aeed905ddce7ed886f1e7ca7
-ad587245d7c74f4b9272860b36a76701b184705e7e0225ab64ccdf3aa20f102c
-82ba6d86254808c33fd7205f340622360844e19a937645702c923faa2dbd1218
-ee5a8eafe6e66913d3a895ba65dd825c7dc1b579b0b8f6d4bd47de45e5f922a8
-25b20041f7b8a1a55281f0fc44b149f0e346e0f3e1e8fdf5634eed22537df9eb
-40d8c8bd63d844ba24798ca2060786679aaaf1753f2350f12c3a984628362db7
-f4df3e4ff03f14be6ca123bf8d4bf43817df72c92dcbd6234c0fee3b8bae81b8
-5d7495a6acdff5033bbc102016c267ba56013a739c9ac62dfe9fdafe427d22a7
-1fa02c29744c713dce48b9e52be12797084cc12dc805dda41fd60578a10a9f2f
-0a51b5efa3feb126888d0430649e858dcb9c59a17872602334edce0a92336f99
-250406dedea2e1b1d3f8031b2eca7ae2e96973b852c90b59878faf06286e8dba
-f7b1ff75a5454235035d1d68158585cb5f08aa68b4c5971ff0499f0a3f491d41
-8e2ed07b0cdfba8001740ae437674704ab6378f650d84b6b562bf346d5b3a338
-e21fbe69d330a12d69703a6625fc77e4eeed50c3eed7db53553e1183258cb374
-25c209961144262d9145735df60c1e3cee6c21ea9667d328aa6424dc1d0d4c31
-bdfb91c001b3b9c30e6343bc3e6af5148ef219e48e9c49e2d9f8818b86e13ec1
-ef1ba0e04c9a93b509972038925babe2964cc034d5947c9f8232fa9a40999fbc
-b26adb0ad1a69e25c896c97307ff214ff08b76427f982d0eb9eedd8cf2126219
-9758b2b07735c086e9a6dd43b4094d320379b3ef0c20bb9fcb691a6fb40b9c25
-9612905890f8fbbe837b1edac168764ae7721a97d9e0ef67424d2fd6166951f8
-00097747f5db43cd16c8f0a5e2041366bbfec05cf950876f7e4462c4231f83f4
-3f14e61553b99ebfa7ad033f51ecf10ad964d71c18b90e360e208ee79f86b722
-d6f062498e4294ec0991b318d18270374de5212418f54a5a1700a19b23a31dc7
-b1c4bf77bb4c4fb26d219d87c7c0ac10a88f65bf5cbb122cc250035499ebd3be
-7b839f311cb67349e68cacdefcaf9970b1e22a120ba90bdec02374a7fb96b232
-08619b8a9cb59e86fffb65f1f0cb64579de0cc5b4a1d428c0c4f4b46ce3ea0c0
-3a4c815b2d210e3ee18f1c5cef74ec07c3415f2dee72c7511cb479e78d3a0d96
-aa7f15360ae7455210f4528a18d74863516b1c688ce1e539306e260fcc203e9b
-5af0c06c3c04fade53ed1009672d75ddbf3358396868c2225e9460590590a37a
-d9b361c5872562a91042a635d8531a62088d1341f9519903f98e339a196c4e2c
-8e6ed843cd24fdbeb101f09bc4516a7cfc4554320a9318f10448fb9d10c45939
-050a55114e979f4cd9473af6254311e3f50d619d9f304df427ad53ffddfad0c2
-f849b4ea37eaf66005afa5269d435d1b3362553043e98eb631d8b4e820e9571f
-88ac251d767e3e92666f3c0aad0f5a5901dd5f0a72a44ca5f957b40bc29541ef
-5c28f10e36b8102e5038c96ca8a7cac9698d6f8fcbb82bc413d364e3bedde064
-a77e2347719c840ee53489d836646e8fd4ac6019d00a045157bf223f32f0e68d
-379965445dc50bb7b2c223f2aa12fffb8858197093319a10d3203038f4e16c04
-c62294d51a206da6ce0ba74e5b204656bc172c22cc2404f882e91ad157bf4dcb
-dd619aeb837e0bf53c4328e57e5be92943a9dc6f2c5664255d7872c976386c42
-5235e3ee2671789c3c32b7d5e7fee0262a43cde4d3bb98d2aab133429ae002f3
-b71c2b3688d9297cef802a2330b12b1e03989fc8b9d1dbc91a7bdaba94703525
-4efd991952a2be03e1147e9b5ca770638a5778a7a141a705ae4ce474000033f9
-e1ba21d948c4b016162cfff6bca97a7f8f81cc2c22f8011b0cb74e4c7c92ac80
-c7c53ee9c0520d2c7a5dc97a78fe15cee47994362c65210336de52f9841b8d09
-4be1aaa04e39d7f66d0c4d01eaf270e26eb38e09c8b303816c34ffb8cfda9f41
-c03d95d95688a154c087930ede2dfa63ed8f228e3917dcc8722d1f8636305073
-31d43ea9b53230b0d0797013e7604b528215f1a128cdbb26b0cc3fa43e3fe25c
-b57c9bf8f8e290586e27924cd20025c54d6d8792b4fa52450684c8d0e131aa49
-2ab0a4fec2d0f91f4b81d74153b5e2e9bcca216c1b49bcff347c57a727202068
-0e040eb5d5e2479209d7e085760a7604544f0e1b541bbc73431ebd722806cc24
-505dbef65e4ca3457d0587c4d4fccaf7f14c31b5cf62ae5f0c08661c9f5cb386
-ec057c82dedeedd54c8f380320831f2d6d9094a5d0075a0c5c203be292231353
-3aab44061f0c75483c8c90ddfe2de61eebaa5c23f3c1e14bead51e741963e5c9
-393e8c906adce443244f5fd6ad7ab164ee9a217e609fcf90e5b8157d27623d62
-a803207d9839752a19da399e82082ded26d15088bc3623923fe5d5bcdc2bec1c
-639e190dcf9181e90ddd7a07c773e6a0511f1e268acf8d1a0d985abab4c95363
-c88093bb9f111cd66e7b7d8cd8eca3407fdd45d01d566944abbfb99bbcd5602b
-dc8e250247dd7a37f4389e94c1342b5e6ccd99ac4d62595b91b15462dbad20b6
-5bf5fd83a8d8864cc9e75f018caba8d7feb8dbe58766dc0a06405ba89e39a6dc
-a302161f88b641a7427aa926d438cff5b5e463309a6cd2abfea827a512d03128
-ec1f323c8a92929a4a6f63c798fe0b73fe59ebcbb1e4614c2d3ea0ce81cf5cc8
-8a6d82334df23cc978d9a97930cee6f567067f7c3877cd46b672d116805b1543
-4a019e47fea549f9942732bd1537c24fdc2f1b0780f7c9b3ef7e846906abd277
-82e21a4a8456cd0a880174efbec65e6eb267a94a9e0bb6bdb6c1c4998d7523ff
-eca5ed22cd608abad4f8570d80ff8cb65bca81b09536ae22a0925ec620cfb875
-70ac3a8e19abf258af93113ffc08aa07f0ef6d751440d874b3631f8a4bbd7721
-9a796911b9dbc0b2e1fc5768d40cb8dbcd38ee9f970c35bbef52deec4582d18e
-17a184203a891ef39fc8d56c29ed3b9010bf9092c8afc63f072c6ae93eeb9342
-6647475cb38c7a634dae53b14995468e4e39464ad9829b48c97e78c580ac32ae
-b2f5631d37bda7f69936d4cfe342279eddc7ce5262969c87e74ec6c4728c82bb
-eff94703031bb14d7743d97690d7a2ff863904ebcd94d1a2fd7270343f38355b
-ad318250da6b388c644a9f62bf59482d7a7161f5d3b65ad5b41005bcced2c16b
-c60f81fb3b013544a32c81c2f455f34cdc12e195fb29631b613d0db8fe3b4957
-a49b3e0382b3ca954a0c135e19cb83b7e29c7904b5852641bb08cee1bdba5a09
-f1f03521a866d99a6b5e670351b73cfb453263adf92a8677de8067ff52ee5a63
-e9ba822e8a11dcbbfa745caf433ef673fbd0e6c7d28f9d3260e2b2d75b888181
-3662efea0548a4f4c2ea1031376182e12b36987f2afbdf205af3229b7e87b20b
-6b334fe8615d13b3c640d25b5c822a2270111d964e4cff01f36d2df200f41872
-29389c1482c576422c158fbf2405e3dc0d87d76237f6666e6e89c46b83289a9a
-718686fe767577688e8524474e522ba5fe3f6222ae659a12855b295d408b7da0
-042c02087ffab03b422ba9b4bac8c39d08605624026e355fe62328d4df8c5d9a
-63e3118bdd69a142412d43f20d23d990ccb50ef669a76a9fc3924a64fbd9bb39
-fda7015bd5b56d3402151be6c4240dd647138bce226f7ebb9b723b3b3e6b3b27
-4da0d1245dfe453bd9ea5fcd36eed1c09e800b20eb206e3f1782d70c67a82d88
-10451c2cdf052ef603a41d50b90dfa15a5e967c6ae7b505b1136fabc9898c004
-5c1043754b8bd712703233855db0895697dbfcec02ef25092d073f37f8f86fd5
-e647c80b0af65453bdd645f92209412ffdf14cb48b7daa02781bc981d89e075b
-39c7e8251d2d384835691f495b3d5a43557f1dff58b935246c2c0b715b40d4b7
-ed7386bcdf5be2beecdbb223dbf57c9a06864f399d4748c11b89760579f1e420
-a4e8c67241a8348ef3bd04634b9e69d5dc5015f89b10f7580a008e5dd424ffed
-60f14a39a759a0c05e4bc3b1e344feaf613be4e1007f5535a7850832760b84d7
-3391a60001d472449b3e4920f46186d0fb8c8a1b96165e2f463e39e289274985
-e4062504ce4ce8b24764d050c371e6545c3aaad645242e39876fa2d8c8fa931f
-73d56e5206d47649cbeae14ef3187d43f6a3bf48bad527f6c01c8b1287edefa1
-1016690d1f50d310d463f9636d6f8514a60337fce30e6d72ddd2f381bf2bbecd
-d416f7ad7338fd928296aeb8c58c33e08737974840b690f1e8d6c46928fddf4d
-65c07eb4cde5f6b5dedab807a67ee995fdef7e7fcb285ea981e0877da1b8bc42
-fc201fe269c44a48be11a5ee8a365b50760c477e51005db9fde781c080f8ab14
-44181e4a0bc80741530370fc987e7eed25cd1b2de3bd5c53e0cffd67f24f9e2a
-82fc866abac0d9e690a0075cb623a625ec6154da7bc0c36431f20fe0a8df2fe0
-50cdb6c3d767b5f640833e7ff56016665ab4d42f28853f5bc2726de5a7372ed4
-8666c51df290f796fb129d441bff05f661a123dad14e5b8bd3839f0de22e44ad
-77cc296603290f731b23a695b45f5b930a8d6d3c6783466226fa0a20ff0ac7c9
-f63eea109a17da0ddf5e1356e23c37528776ebda66b0a5ab37b7aaac291eae01
-aadf7c555a4fb77722c0a527b5a711188e28944494ac58f58c6dab6df90971f9
-9ed636c4eba0dbcad659aafc776c3efff28a7d28da972a8bc5d8eeef3b7bdcbb
-8de66ae1d2fa6ec3eb33c37e632118bbc8dda3bfa80da3b7a2770908fc4575ff
-de9b1db2fa31637a13f8b97e73a55f7a975fc836eead6dad2453aa31d00447d5
-6350145197d430f8e6af1246a7d605e7df7a5ff4fb58e8241469481bf48b8436
-31acf36fd14a7de24d3a90d681246d5bd65d31dcb7795f2c9f6dd3f04ad330ab
-37636fb9da5f27693b7613cb6268d36cbe13f628cbbd5257f2644b9be91b69f7
-2403f914beb707992fcc653b96fe7b23eacc1f46c325bf02427894a28ea28e74
-482a2585f57f4cca2a49fc473b73b2cc47ebe014e78f9dd868dd4c63923f660a
-0d465c1053e7a6dd9138ddead25cdfe5f3a211d6f06e2c19453b405173a814a7
-5017f34fb8504208864db35ea2406c19d989e65e5417105ddd09fe62ddce224a
-daffb81a19999b0459da464d3d10492b62c12d085f4381fb91b597f218b7fc1e
-c0418a9292c6d2fb2cca2786b1b9a5cbd5edef092b5a3afa05d09e6e59a70f02
-1346ef208122d8c8f6bd2da33609aee5917f0c92fbc0941dff2cb3df9feef235
-4efa7155231d3403ce8211ca2786915280811d9dc9275456e491331899265c69
-8b3698810effb9e6e6fc2f5b1daa88e0740f8195cc8de64711be512f43128d28
-58f130156cc2bf774075a2b0bd3a0fec0729494003d58fdde93a2fddb529803c
-76834d20a2f0654a56d1cb58ec344aeac5bb976c694fbb328a3cf9c355a5ccfa
-3de62645b792d17c86e64a14465c5d29686a03037abb8eddebf2c55c94e4d984
-713982f983d942b390674695a46485ee6eac26cf864348762b018ce478fcf5e1
-c434b8a26187f6707c6963a933c1e7e5addb9dca4d5e9f5ea43a40c43d068b87
-f3d8bd0324f2d10f52d92da826ad20917b039076bafd236881654a5abbae112c
-7fcb2bd027c96d69fa1224a8108d1b7caa4d4b03f813d461157a7b5956be1296
-d929e3e3e5249cded2fe79950e619b47b99cfcf0ce26e6c5135ef0d5a05662d9
-24d57e0be99056aea4094b3894b644585ecc7a6f016df96ce3fc1ae75635ec2a
-2761bf9402fa697a76e326afb8d7ae5f7d375d260ce60143a38913a4e085381f
-ae19ced0d207c80cfd0da23b999fa947408f31c00ed5046f48187ffa4a9dc8ee
-1e410719a9e1fa29f15ab776e8013158bef0615e6960273646af89da0fa935c1
-8a7a1b67df2b0fd72b42cf02c5e916b0761e89550303ff45560bcb350b7e9ac8
-0422c68d1e34211212999f5a99800c7b103afdd7c8c5e32ce86d906031418297
-415ecd921c44e3d65759bfbecdc688167896374b5cd91a64cf08e3c224b9f22b
-06d26bd1bb52679fb75e2489027a7cf868ce7fec588def5493f6570d2340a2d7
-61a6272402e9d29d02546929d02ec741a4f54c94a25ac1dc87b8f2087e4d9275
-32d6afc9597fa33166e593112001404b15e1691f002afaa8a4fe0fd803adaab4
-ba64ffbefea2acdb3059dd040b2305997fe7a6fd78db6e47e385af2cfa834af9
-3cff1bd3773d6b6d2f303ef4950825d6c3768532ba44a111af37f8b632cca18e
-7325171953b66ec7ad79eff3b69219cb31201f5bdd8da70a8bac1df11ca37519
-5658f07151fdecba4c1e14c375de60affcee4998a0a377587f54271bedd8b226
-ab3c9b3638b4e1f4b633120aef8e4a2989e2925cc84c7281674e7089b71bcd8f
-da8d1a26cc2181ba716d80be532578d6798584c364f9220f1725670c78007454
-0ece6487869cecd8e66f8adfefcf23cfc5fb8f1ce23a5e1e7159493a78742f05
-660bb55526f65f17eb255e84cf0a5c0b6b98f1d54d7fd00c1f8236c60c596f6c
-28c7adc584b38671839b5847e37a7017f4f7857e31c3108cac29640fe9cc2ddc
-9165273404769a556bd04c3bf5f9d76627603543947cf885de71f44c65760076
-a889b5b2d3511219936476ffd38e2d5e86fdeafaa17dd36436ea3dd6914e812f
-b1d5d0333a7ebbcf6e908d334ec8dd335357546e241e6f3064251323b2fd746e
-54d67d5e2d5b425cbdf89105b0c19ab4cea931a557f2d7d488009fa8685a1c78
-57f58bf6f62a8c71eae1b8944d78df9897dde68b628df2706d7aadbeb2d4a4b7
-561810d4f7e1988262f7460684575b38f13c4680c3dc254c7ad5bf5bf200950d
-857556ee412c33b42820f740ad368a8392ad0605f16692e2c06b78ed542729e6
-d399a052823686f83e8c3f0e0befd2e7405c52e1d083c13e9283b50b4a834249
-6214238f65e52491566c183d5ff36711e6a99eb49f5518efdae0743467dcc32e
-4d4c92ff8de5f8c649152d48106228117f5c160fc8bd2c69b1dd365337722742
-2c59cd0589bf70287b487799df5e698698f4ff13bf4618c63c2b0e000e57aad3
-dae45bdae9bbb459fd55584839dd185f48a75687a8192f3a63d2280648e9322b
-02b9625144e67c6080f0eebb7c741968736caaafc151c4a9a1c1395f31b61ca9
-004eb39a789a9ffc247a249991106df6e1c52e40e4533f0fb6087a59080bf55b
-f197ae35804870900129d9a941004273ca0065c42ecec8cb517609d01405ef3d
-b500f09d410e230f680e12e5cd607cc0d1edc63e1845fd1bf3d9ba07e1b7a5c2
-eb0accd178e1c0178ef55eceba43a30599a0477fa4f8ca397b69ae64f6b6310d
-9fdb875a00545daa9f0dfc0ff9fa355a9ad4b08d08ca7bece29a5d3a325c1463
-8f38dfe12ccd5c942a5aca6414a7b04c698c9adae4d8d43732e41dc0f04da349
-8bdf6b9f3a58296957d88f217d5c46f45c7c3a433ff9c355a5ccfa3de6553bae
-ddc411e40b9f5e95cd6e9f62dae79353c5e1b874f6677bc593d2a2a07b1c3b20
-9596abb07ee8f71212674a53b3a604f5af5449dbcef830433acdcf845e44d879
-fc619fe992d5f6ea9b0cddfc24fe223e7a357cb0d5771cbd12bf50851f400b49
-9e55a3efcdae3b6d6cfb72ca9e96f9355234ea284bf70abc81d29bfc928dac80
-5eaca5ca15e3b8303bd3710a1eba32e3c13ef7641c7637afb5cef5dc59902e6b
-aff4c7ce9fae89977d96691d306dfb9a54bd8b9cb8484ae4b50f7e2ae5ade3a2
-9076c21e036a78c3d78918c529b3eafbcffa7c842dc917f162fe68179bb45b4a
-75ccb684f7c4b5a6d5db3cc876537e4b643e447dc64bb76d9e74a3d378517880
-9896262b00893cd7474bb605994df0ee028f4a703b4ac00ec95dc3ccb3342835
-418a5a158b4e6072a657a7e3d2728c0f64242be6fbcdf27d5093139fd7bc95d9
-89320f2ac958c06cec8fdcf56596bbb45b18abf2c6b5b891236063441ba7331d
-613c0f1de49f50a839bceeee1f2ea065fa879f50918c6a3280bd7bbf1e366e27
-4d5e9e0a6bda5a8768f72b811252f40704a1190b5887bc5c586b1704ff1f7d4b
-a8ea68ab335a506771a681f80dde3b8aa04ee1bd6cf881217b829942d0282c3b
-e262314736557d8a43e8686f3280d4c9aeb9fd78262834ea5569a233d459abf4
-5e50d17d666d3e9caefe4f8d74710aaf2497a405d73fca9e107a922d0a9eea59
-6de7f71ef541a0a5b141f786dfdd1861f81651f540f82505b3fe83aa32067db1
-13812fa761a7f3b28342bf1ef531746b033232fbd06a12a0b80a9e23571fc1d2
-184a850fcceb331ff7076d3a03e8ed50991837925efc91e1ca33491b36cb1aff
-2c1c58338fccc4a9f0e298e781afb718990cb9eb141c6ebbebc79e437b52a17b
-0b4a8cfd0da2f9401ce9370a1ef04986793a67fea0fc96d8eb325cf73ae51c14
-c5030d9a8340b8b33986ccc325f93903c0928af3fb3766c8428fa690cda94c97
-939fd8df41abc0652e0ca8e82e048b133aba600278e3a227c4eaf8b557856ff9
-e6d2fb6671ba75b779e90f2bee7e349ec394ac76e16c73509b5e99d44fa10636
-ac63f8d546d5eba3c6bca7b738d4338134d2b79dd8436932d6ee22e2183a5c07
-a72f4742edfc2ed11145fcf8a9bb54313894709b28d214fffcc4b917e0c389b2
-590ef307e3ebbf0e42570de893328dcfe81e7edebf72b88ff1a557e2f038ef1f
-8c25c68dd7c037226f7dbab36cf73ee00b92ba6efdbf9a9e0f4a7a91853394b2
-a02077209350a2b61d4771f338e739c5382c07e18386e398b2946ade4c3f0a44
-ff6f333d550ea7db004654aad32542571febf3c31271cc5d167976c6407c7570
-115bfb3f838701b58b320496c39c59553b33fdd7fcf135bf4d849b130fa58739
-6a983a93344bfd37afdb01b18232af9f65d5e3f5131bdc40063d7916a2b67ade
-09e2fed7968e96c6ffdb6b41b0a7bb6b8e93c2ac4f1b466f16e219321c9ad83a
-8027101b3d007ed0e43594efafac9dc0e4764477f6328ef0936444bbb4fd20e4
-2ae35cc3090ea9ea8ffc5a85236a4597f661568964f6a839650470f79eac69ab
-e1794cc369c4183f66715746b9abff4c151ab6f06be72ae63f41f5f806b3fa05
-eee4f22990464b7e4950f5654b36b7e3158a7b4ecd4fc7d5600c831ea7521df8
-e61c5f5a3942eeb82e06477461ddbbbc9551ed095d78309f0dc9465f88e70fdd
-7cf599e493318efbb07aef45a81f2d36111838a736b422891c562c933005dc2f
-99a44557c978e4d9da41d3e2c3820e4a40fe28a8c268cb593960058f0fec18bd
-c23102a74807835b1244daf8bb9a7553961977ea5a7d0e8a59f58b868c9daf82
-5c4cca4d84f4f37484b6bf8c1da54c5e089d3cb47377a99eba19e3e81a13d2f0
-59c22952aad0fa4f3a4d82478a06a1913b8f2dd141e776fdd43d76fc9d28fb93
-d198f84310f271baaae7e44752a4f8fd1ab089d3555f9d7083999bdedafca730
-50598a2b85541f071716d335c793b55b007392a1f757469aae1436de65d00f07
-66e196c47010731b77aa457876cb8994b97e20991af4e7b47bdf752f59c7e6c1
-27f3043e2b06dead3d6fd024aeb2413d1dc2ac897aec8c2a97c848d09b102982
-06f2dc08f0f0ea755c68a0aa8062521d34f16beaf87d359db9cc79faabc3d256
-3cae31022f3d4ae7dbda58194866a7a29dd34f17a4d9b7f7987e01a6db74bf0c
-5e0c53bd07af310a2756f22c1cb9bf2a0e1a57aba6753d037887c4b65a661f70
-b2d10fad50c5ffd365d3778295d880f498ff4950257e5ce855161796989611b3
-e793c99f4e12e947b51643fa80b129c6664b283c100b5694d2d8bf60a3213157
-a17b72080842b4ee055d0860a801d930d63e5354f599854b5a142f11f6b78717
-8897d66f3f6a3ff20029ed1870d538076c1d4fa4ece214b0075ada5cbd5f4087
-8975b21a79d8a67be6d73f8777ba26c18ae3b8613387b25f43beda7a2c9f6692
-667015b80847d0759ccf2ef45aeb00a02d63f630dc6823d5f61e91b410fcbba3
-677470b440063d43bf734b16ab45a42b698037ca3cc5b460b563467d9b6f9453
-d31b47822f6fc7fa1604e77d00ab1f172bf8f4cd9bde3635703a4166293494b4
-37f032570a165604cf5b8b153da54077095196e55252dfccd90a8ebc09bb7f45
-ada3560fd014a844b2d9bae654a533733ca8ae359bd7537c60b52997e10ef2e6
-f9a2210dc484431af83a956af66f06646d918d2832ecd425ff9cd8e9268557c9
-efc84868728aff4d8174e6f85135c11a6968b13f7d8346334dba97a1a3f0990c
-d1d2bac3aa8a5c294e4d0d67e893a609189383a24cd3bf86c22720d320d59a6b
-5e543b799bb5d45fa9826b832a809026d104293f363200780278d973c9c63492
-8576754d19d28c0e4058684cd1a71a919e5814346bd40fc15eeca1591e0a709f
-f083b86841f04cdf8aadaedd95f26fb807bd09886a011443d410466fc6bbc56f
-95468646ababaf39887f25e485776892c89a6cb7bf5d20b6c4e8a0bd65c5de90
-7a988a3e2e39aa721dd03ca69608d59cc1e8a1d2ea706b0426622e4dc6c94013
-3f979e5d141f06fd2051a54d84fdd4c7170a44f81ac786d258f98893bb4559c6
-ac59332f599dbf644367e28fcf01da3e8f33b14f8f83052d9c0af2061465b059
-5a923f4567274cefb60341ba793ec77e5d8c7f96bb88b63591d8cbeda48642dd
-c631a115cba7694f64506c787271a8c9cee064d9af1ab39cd121f7a1ff1c812c
-903aed1a0d13791c051ae21ba92b5db47e72e7d6001fb31535a385202edd815a
-40bcb9937ef719f7cd20e30fda23fd356476d22ed6c206f15cb2a78fdb45389b
-6cfa3cc388cddb82886b8eedbd9447a48844921a51d4cb19921c3d42e58c0173
-5189ba388aa32ac9b75b5ab43e428b20957bf253a117efbdc6d9dc0931099af7
-eb10790dbb14844be86d80c5e1ae17d0fa0f73703f180effa98dc52c5a8a9740
-869fa97d0bce9fb59b36a960315cc1d7264f5fe730a397c6ee121021a3c82cf4
-bcd40e844b78f99ac28c27d9c4f4c90cfe0062736be1bd39d45592020daf0b9d
-91efd616232a6aed299c9a01388e0460b46ec288d4e1cc5b08769ac88002094c
-9b680abb4d3e0823b0832d0d60d08dd7e1a27531803b26f74966f6f4fa2f4117
-2048782c3e3ea7744dc52e7113d3e290d309881514fb40773b1ec9bd7932f7b7
-42c3a3dd44ad5207b89125d7a11aed1a249863a6e537c887b00161ffae6817d6
-269d93d4752375c48ad0a598d2486f1a173bc55562bc889eee0afac3a4b12fd5
-cc2a57080eb6e3880e1e2930fbbf7e6629c428a1025966b47ddba3d48874e8b4
-ac01d33158f31760d82a88ee60be24a62fb5ad9f24254e2198d968255d79e4df
-206d37d52891300c669855a59e666dbb4676c4ec6fa988d6378ce4d00892c711
-3fec62c89dac139cc2b77a954f6fe953064c52a9345df309d8baabbeb1cb7910
-5aecc2f99b451c1b028a81d62927e2c932805d38cc8ab7aff70fc84f944d3fe5
-12694fe2dc46e548177bb78e4a51ad574c30f29145be59a24faadf91d34e9750
-1b1bba9cd1563e7e339e9d8795a3cf887053f1ee7062fe98bbc2257e8a6a964c
-d8542df1129217515f38beee762ca45f9ac85c4497afc6b7200c540287d85c40
-7dd6cac0ae86a4d324d1b3fd2f249d3613772ab3362840a78ee8633b3f89b46e
-b6749c008a46eca09c3ac738011772215d2e61e59e2b35b0d9bd012378c2e8f9
-7a58b7febc683901bf086f32282a9e539f2816acd16d5b5a0d7c26372e1b7ecd
-d64464cbc518da0ab436329afd5f6e12d0ada7cb9bd84cd2b6eeadc4b966e2d1
-33dbfa0ebef84b45019f47c668325dd037f85dbca5fbcc54ef9aa710d998f3cc
-df1e64c0809bcf0386de718201cb3c474fb5ce9cb8054ad3394bb6626f7eef64
-f60626142f6939666fcefbc920932d389770acb70180dae25a1e06fd6be4f45a
-07e382d0c055447a99dd7e0952f24e89401a1c15a277d02dfb6d31f41ebcb754
-2f4f608640ef289ce4147dc1cab77ce02b1823a87bd46f0c00cefe0191d68573
-6af019569e89ab388d3d770af3f61546fe350adac3337713bbc091318cf92de1
-7b61ccda6e28c314cd2d6a27e758e48dd6038fb55c6841dcede725a1a30d5fda
-87a37ce7461be94135e94dc72c976fc326a32194046979c351a53fb544d1ea5c
-dc87382f3e020e019e03ab3ae26eaa4e64256cd32aa1eac38539d04ae425e1cd
-e4548d0c352b680b4922b6b407856f1ebf6f3ea6ae68eb941d914d50642dbf74
-fa2a8df6b682e0d53f3b21ffa7225b105e359f49488183dc94cdaf1d7aa849d8
-88849fbd3bf680dd02198a557e768668eb2fbbfa23cf3af7bcd76940e1329b04
-bea1e1da8d71850e11eed811616410e2f7db0557aad2d531e1d3af851329a38e
-96b192d5ab246fb72788f99e07d22f9bf6c35bd15036db0fe66364654ca2c34d
-4aa14542eab8d979311725ae045f9af9790b26f13d0e447b3f58a8b817eaf26e
-f9ac8938054c130583237c616a5f3be196c9252a0621cd35183ffa748b0c4e23
-869a58dc345282066b213b441823389934fea2e40aba453edbb936ef4695b6ca
-5734f49bf4c21f0c66287df7cd723cd1d0e6d1ef02514a89a0360d6630f41781
-e06d5d12f793d64c257de894f58a074c06e4e18a5991b46af372e7c1065a9132
-f88a83fdb08a4a54b50d4218785e15b6a86d90b7ed621302558b510c0c205100
-44c2ff47efed6ff373b46f1b1188f96da0b38b0a9430e571d4dad21eae98dcd2
-8d36affac5ee640128374d182d451b3aed3f2e2080a1531a2723ef40b496ae2d
-f0ba56582870fe7ddd397548d59042d981da2c5b15c2d3cf8ac934d91679067f
-e601409c220b8a6647414d0b73afe5e96fd5106f9e5c9883132953083730f75e
-2947bb0a0ad58d73cf0b0ff80481d2a152262e1b024df4ee74d22e9933f1f222
-f389b8367ec1d5200c70f7f48079fc559a6610e483fd55df95a8621c4e42774a
-0e978ad53ca8466cdfc66e1eae6ea5df41dce8369b40c6aebe585f4e9b3b23eb
-19139f371c9565ee85a2d8eec6e0c48ac857ee2660ce13eb5cb81616649953e5
-53e23fc2fcfbf98a83cf202cf6ec7f3816e9d70a4f86391e51327e047315f653
-906b49384b9c069fbdb27c84521aaaee74e53055897cdbd167a7b5d33b8feb24
-aff3e22b5d9da4966788ced11943e209ddd32f3085aa28f2b631e56693a390a1
-74b5cc902bd67a2c3959dcd84a08f8ff2dcfbfff5f75e2ef01c9fb619117fd97
-f8682a84f0e718362659df2d082fa8d9428010a76268380f525c4a3292cdaa9c
-475554ed161cd2c43355af9350c3fbc654993a3f8901391308af9bbb1fce0813
-7592a1a4b271cd98d094d77ba038314ea68a4e64d68b0165bb593b873b24fe3b
-8a59f22ea3714023825140e0658fb050e8c4e32d85e92cc0d2eeeeaff00c353c
-c00483ad71627438a50b4dade6b0aa1caac73ce846581b858910486820ad2190
-33a9a108a502fa6ea60b8c85d1ec5c816a325dc802f213ba6bfcbfc65306d07c
-3202f0d42fdbb7b62fc6eeace31837cc024965695c529e274ea638ea2a24847a
-db9eabb31283bb13944309c17e3615256c7b95d8f99f86feddc2c7a566e4dc87
-bb060d88c661f589080fae039f4fa4b5b611caa6c65455dcd4bff9ff89b63f60
-5dbbdb21c07404e02688b7f92a8373ee1a6a891bf6c315b793a9fe81079c1ef2
-804238c72039924ea63039020363282f24f969f6a1aa10ef2d9e7cbcaf53c9cc
-1f0925637190af45c7aa731e7dac0f091dd22e5ddab9a8dea87a0269d5343ef9
-f8297d133a037679c6834beb8741396754f2dc5a89a1621c13722289eded1880
-c9859ce2a9739d003bb874f747abe3ab28d79930680ca53ceba6db84aa3eb869
-0830eff19972d32f37eb6eab0723478f881127a84536374025a782a7cb24f90e
-892bf7b8b9a44a237779c4cdbe5325d3e67cd11ff1a58b9d69ce962a659486ba
-6649708daa2f7a0cb144f6b11161501464b7c7b20659f6e5ab21231aceb813fb
-b30f9d6c6afd24d638ece5dac5259af8eeaa46abfc1d6f29383188b4ef4d8e08
-fc13a8cb07f61f55727619cde4f86944b879e23dda590ecc57f312c9d6d6fbc6
-8c875291b617f8040f4494323cb93e84f2100092b5a0527dbf02fe55175a1b8f
-7b8b130de1ee8d39589b7489f2d087e6f865cb536b595c552534475f1bae5981
-807cfd89532d91a6316154dedc1b8fb3f8fa0270651107c5ab24ad8310303d98
-39b801b2f0158aca98833b79846369993bb4a3a715afb6eba5a2237652b17d60
-2dbc21281bbecab7df65812e9ba59b78f6e3f6248d5cbebfedde90149d823635
-0ad0a8cda735b701534eb682dd2261883e19355d6e31d980265351f1895cd212
-a8a006a6953dff2ff7ba40d5263b6547b6cd5a5317bd77c08364987424033bf5
-bd9dd20c0ba69bb3d25df2ef5fc06092981c2f57ac3d38b93976eced658544a7
-942cb27ef9cc649835863b2e14a4390fc3e5bc2c0be8fe2a67f1ecb3d4734636
-6b29b60d7261a743583915fba3c8f832c4c41bc1dff13178f2d61832fdd13853
-db2135b4d92b1628b80f3baca26481a48a9e0d0847e4c53427e5066816b474f1
-052fdbf71f550738c13f1c3ab27d1fa12a11194c145d90f61e4ef2a1fae0d25e
-6974f191d3e1106c406ce4fba266c952faa505954f6ddf00068422eb0cd4baa5
-34b06c1805468d7fc0b88a491b48a393c55726d4941ea7d869b239a69565a892
-82e020721bc7ed828c88681584e0c49452fa8f2bb88914491074cf0ffcb5fdb3
-628b292a0f2fbb488e96767aeeb4b5b738ddd65d50e143aeb6e37fd6110e0dda
-5e2120fbd267c00b1b90626ede7eb1fd37636e7f3b01ffc6f7216b396bc1a5a6
-04db15b065c9a030d08127a538f69779a5bd73a6d6f55d2da851afb9da60bbba
-d782ffc339762792fbf66b2d139b11e76a28e8b483aa5d858ad779e905456574
-8c2f59a94010ed153e90a961b45a225cd9a131315d2691f6fcce8b321078deea
-6582997e824705703029a8aecbfce61d427d476b559145f5ee40364c49ae13ee
-bd940e7104a70a5501f5c0a632ca1902b75598d3ae606319d0ff4f0bdae32c70
-b1e4d5065157499c15fae5349fd68e77acedeb296cda2c912562546b9d1a966b
-e7959a20045af835d9e7348b5b33614005f05fa26f45c3de3397e5ef9cf02036
-37b89a5085099eedcc025785eb5fc2130988a19570a1661772be2497d4c8ebdb
-fde6619b3af0fb42f4d4c3516db21d44941a62f62f087ae3731735beab50f7c5
-27856884c3c4c01b83a40af32613638be95390c4c66f71672651df6bb4c4a0bc
-a9533884c477f6ae268cf7c21fb12678c54e4b3fd8ef032d3e3c2d3651bd905c
-562e643f42d81fbbdf819a28c81c9874100a65e70466226d90662ade31127e95
-c7f5052cf24df0a04d14d1d8a5d5d9b89d212272860db459e07731b3a6537c6a
-83c352d2d1f09389fd4da36da0cc25a57f402976cf3a473ff27b6554faf254c2
-ec8e52fe59d346baf8b1fa0afb13289b6ab06c8d25afaf4f218ba88565cd3acd
-f1fbe77f5209e6d5dc361c18d9152ea6a5267116769c987b89dece4fabec70de
-3adbac8e5e7cffa82f4b7e2ac41696dfe89443c64d8fc50c5699117d094ce852
-c2d7dc91ca9f1e764bd117ea7cdcf98ecb87648e82c64d93f58daee619f531c3
-615ce9df8abd7a63b2957eaa3cdb10e48c379a96334f8510a1f04a7c433f3756
-81c565d30f7c7d9e05f4d6f249d203b286c45eaf851190ac74822c5a6caf4f04
-94520c329c09cc8e0f5ac803219b76c8be672d5eeb878eee0c1116ca9942b133
-0734efd931c8e5d54bf9f22d194475e14eb923a453c9b7f4ebba83c80b4d36e0
-617ba6de745ac02953a63a9d73bc2e07c52a6fb3182e001c021916ca4993647f
-8be57505636b75e2013b781c2ee65591694009f1aecc0195349d48d780db2da2
-dc8c60410235e5c3c7b4542873c609f921a62953760759d81b718500fa45b09c
-504f9cff973ce3e32a35b426c6f3fb2cbc366d980e133fee86f961dff6a21602
-d8e14529e91e10105afe9f88c9f65052db9b32cc2d88c7bbd1248d4448706d3a
-defe4dd13ed573d1e8d31bfaa9fdec9fb1dd2ecba1ec8cffb0601523d86b8187
-e1a1526c20166314bb65cfc266d01bbd562c79f00c390ff40c42e424976ba541
-ee3860910e852c72b4c8de0cbc50679ea9434f4f21940480f148365bcb9f8889
-9c6e39c309a84f63a0b01896d4165395618198fc9ce773a874074a2667120e7f
-3bd73ba915a657c161c04ed2ad2a25d81c286f5ef0e0fdf91f6c0a1da5da4d13
-56a4df2f14c4cc408165ad0fe1c60373909ce04828b2c333569b78f35c6594cf
-11becc7df1fe0d9980cbfc9b083e6ff52fdc26cd74e64b22196586f4b21768d5
-2fa9107d541384b53737b872b0d7b0f931eb1525e118a45764bb1945fa8b91cd
-944fbf3b63be737baad604e8e93d08521e00f8cc93052e4692f1de842505c39f
-054d49d7bc49a836c724d887c0905d218fec71b710fb0a5fd2dd736354c6b43a
-4bf4cca989e6deb360b45e8a353b712c2745da57934d5629923523686d471c60
-6e09b539c13f1c803dd11cdc41a41e8427a513e4808dd4f787114870b3bf8ece
-f68fcdc6820e82b4d537534cb2a7c81f4e6878bd0cf435cf5845fb8402aeb47a
-8be7f8658575e7fbcce387587b6563eac02d806aae5a83c185627d9e8857edea
-2fa37ab90a1aa2cacdacdcca8a23a2be13b1016b2716ff29c2a660d49d4d2400
-dbd73edf65aa2981dd46641d15f2b5bfd40768309c570d5b5bad657915ae022f
-7fd0805df33437b8ed5d961a0c65b33a6ac36a9ddbfe78169d4a6d2cfaa5672d
-9354964e4c756a20b65f1550064e435dc5b0b8a53732a97ae91c337bbfba8e1e
-87d2ce72b4577c8474a0ef36cd33a3dde20e650eba05a242065b8d1fe3c702df
-ce2f7ed86080bf5e0efd27e162ebc4471770197c13ab838945cc2df10daee14d
-901fe063ba909462ade61c130d7911c73be3d448f36455ed30c21bbc2527d0f2
-5bacfb066c0c45300752906845190fb3e76db5fa537fde62a1e7dea1af35898c
-3edf2d9e6bc359439e38d363fbc37f89001e3dec0a7b6a4a7b112cd687e7c5e8
-4b0fa42d52b534b2d16ee3ac26b4dc3fec6272d1867a390ff9fe074d449b6cfc
-93129a45a6624d91800c7e638c32c057c99673e7b57c5fa81e60e1b7a0604424
-458e1bdf2f7f77d1fd1275512e3f6d5411cfc20cb8571ef52c16adc6073a9542
-da94754c931e74704ac639fb69b227ec66d4446231bb566792321da24cc3510d
-89b59bff3d647ef55be28555e93318d9eb888e32abfb2b0276ad9483ae8bd4b6
-5f2a3876c094f8e22056b9a26dbda1b09b0ce8cdfa085c8803151de9187d5c63
-406d87c00f3ce085b9bec794b99b2365504e7274aff81c5032db910e31c8f2f7
-c647a598171a4e8b19d05b5a77f1073ca0d5f58ebef2be11c6f390af9c835f90
-9b726589c9e75687dd9ba33beb8a42b5bb63076a5cd2cbfbbd43498934b67f6d
-35556aaf2341c4d3121ace6338238cf67a76ad99ce7be30040484133b44d08f6
-e0d6acf93cbb3d7b3b860e620efafbb0c644fbf90228a339e9a5e99632238e99
-b1644b65c08859787d58988cb9b6b792aa43981c2eba7136fe17c9fa4a671864
-d39bc4ce208357e4e178a4c0ece034f01955199d38dad2b9e9f3c47ce7c652a1
-29476742bb9219514553a1bf9aba5af84a3530746f5d24795f7d79a1927f1266
-4e9e31e2d86be65a64463db3077fbb4d8ba24f577ad99d58220c09d15d7478ae
-7360e3f048ce8bc4e7c171f86d2055c61cb4e32c8e28e52d3e8a87109f5b9c43
-b3948f9e62356c4f55797f5c349ee40bdd6e6d98406e361af69bca61870057a6
-63c08cd95a45c1d49e5ded4ca719b675f8fecbbf6cae5bf666352afee85c48da
-e728a4672cfd6a669015d51c96e74ef3d42233fa3e5271134aac9354d289e7e6
-4d5d7be4433a62bbe54900fea32c6bb7863dde80c914a4d50e11db676af24cbc
-6161712ed2e4ae8f0d7407c83889a3e52486a3d7b1e4ff2676a80039d4217eae
-febc054ff700f06cbc565353cb08267b50276528e5da421aca6d458c8d381645
-3d524f1b7d143791c3939bb177dedd8000a364a4fcf6d27912cd57f8b1aae2e1
-2f012bd0049675d4b47fab974f28d57b151bb0cf1290aff5fa25e4219aa3e1d0
-e6007552aa41b3446b5624135d748405749cc1db00a6575685b8f78856607a3d
-db56c0232cec6d31608342c785fcf455898832088ae4e608d6fb63c57ef4b2c1
-055ba60b0945c580292adeb56bded15de6311695fc74c35f311ebf99702b54d8
-77a677ac6df01ce3fdc54c527c543d3bfd19265fc579c4fb688ba9f1b7233e29
-ae0355e5a94f2a25fffb4a8fbd74f6798c863a2f318b4ce0c826f738614f5726
-2a2dccf3d5b00fc8140b153f360dfcadc36873b124a035781afb7ed41fd3d546
-79598d5030a8661603465eb2ac7a615c3537ff96556dde086f16040935e04a1d
-32fca9256ce570eaa1ba42b53032bea880447949fe73fe1633a552346c930fea
-020e94d8f22f115b195d0d8ebab7a07cda81497b824bd9961b660836709e0c9a
-a7e61662b0684e925e4dd74fc97b675b79674aa3f6d16e96a1c86fdd2c6cc712
-1b00906b4d70c2b27390ad840962c2aea555822be94c6a46dd5a09d0ef16d346
-32e6e2d9563d10762b2606ed532d652b7949ab11efe383cd0afd2a92804998e0
-7559a8140c01ae4b4fb4eae2c147464cc71403bbfb42cf1bfb2e009327d29ed8
-65feaf33fe93c081568949c382806f465e178142d956b250a827bfa2c39f462f
-5fa069853ba2e2d18ef99bb53878c78ae61d3ca268e5123ce3706d0aa11c336e
-f5d8cc7036c9ff0e73c16bf7fba5d692847cf0016535be27b2119efef09c8890
-ea845adc88dae8bc41a11a861d31e86ffc64ea135aa53c1823a4e1d4aa8ba507
-9e5df4efce318b6d3f486b385377ebe65bc916f13609cea424f9c42e8921f757
-50a6c10c6c13ac5f8a5b629fdb16ce10200ea8f825280a115dd641cdf1763f47
-acad9790c90657ef835ee1d02f3d2e241b7d6749c9e4371216931887778de4b4
-60d0ce386aa03cad70c7e8a133ac4ed3ccf31d91dd0986caa5962c6312679d01
-359dff0b5a357fee803d61922367be5e97abb50f4048aaf6c76b6c65410a57eb
-77bbdaaa596833dabaedf537786063320d766fc6e6826be6fed511babaaee583
-7b0643306d7cdd12f02e183d46350bb7c25b94b7d4166666c556d2f3adaed6af
-fb36837cd861192b7a36e91b295cd832a67094197972348f44d0ce3870a0891e
-0ec2fdd4413f67060f412a3cd31a509028d6361353a5e50058fe4ea46a6732c9
-98900dec7fd4b20e6d6fec5a30fe1f4d743d0deca667b5fe871a7c68143acc21
-ed2512990fd94b7ae6fe738dd326258f6cd6060f243df995a3af97687a78eed4
-271f3dc4f79ed18dea9a84694cb969ef7221be2485c8ce9101e9b1dc59af6222
-02a8ff7225ea661d01d5370b535c33ea4202b6f1a3ec6525a56e1ea71611491f
-47bd21ca86ce6d8c924f28c8d5e5f66b9222827382dad72df22ea440726154c4
-19aa0517d06423294bcbc7c6f64940c999d9fe1c6f514c73cdf05acc4105bd2a
-764b69f7d17204e9291a1d13be111261c53b5aa1fc255a44acfbd6a3e27d20ba
-0c2d9fc7cb0fd2bf3a9cbfbb53eb0b03c6ab2cd636bac90076e486ce9ee10b8f
-e69b03cf6aff7b5a3fec75294bdf32f198d65680f6779a9c6ef6b8edd936ce66
-e9cca6bbdcf4cd0808f33175d40c3f2ab76a02d0051ab512e32adbc595014767
-1ff6c57a77b8303e50e7bf024c8af22a2c7d5adcb9ba42ee6565ffff73212f22
-5f69eec749413749bd663976da9e39c7f2120fc475427a64d578e332cc5d2ec2
-84307c30b92e8ec05500c8635a069294902bf4f2969dad5068bac49cac00a307
-0e5203b294f7a42c2db51b4bf3e80bbecb780b0adac425db4e167f893ef4d257
-8aca20afe2773ef6fdc6e07c20ed0b0b4620ff0d5dc28edb59f39ed3e976c510
-e339c4a0fc9f56524df0aaebc9d985fb6781da97e651df018635096cac944d58
-ab8634a3b02cf1376b1c5fad86ab57c5ce85435ace10216a9eb3bd3deb8ee5b9
-acd93838e9c5b26f6f02f5541ecf8e94ff33839b93e16b740beba88c19410250
-301614938b4a69ba7b9cd47d79d9f58649225ec073b8c86503ef606afcbcc79c
-287c9315cad03844d0a465ace3e83ed75182fa6de0166ed492659d8e872e5f32
-c3043b055e44b91ee3bee18777b28169dadc7375fd25ea67288c8a7919fb6b90
-e5a805a38a40f1ebd4bebbf6e26b5d5ef18e381970be0753c35de24b6253f9d2
-4a77ed4532f5eb2f464e946babea6cfb2450543655fdd5ba1d46894538dcaf49
-d824b3dcf5484ca5098cdcd138997398a60b711568f26ad6eb964de44038fc32
-07c85ae853ccf6406906bd00b9af16f3eb2246d3ae95f6944ff39b64453b5a99
-5592ab75507ebdd4a7f5ed567eef5aa2697e973e95b512549da9190dafa3f3bd
-abb118f5a81cda2103aac289be4ad5dcfa566bc51d8ba2d5b19b7bb31a484cd1
-8a84c5dce3c7e50429d637c22b29d8f750b60e65e2fe3a7316d458557c1e87c9
-c6f8105537aa3b5bc789cd7c370b741477d21af453ea2781d5ce29d20f2176c9
-9418ea8db195cdc57bc982e91ef665411741fda4f9fbfe4bb3966ac00b76e517
-c7c0988339bb8848e616a134f95078a0a5c1a295bee68499d1428ada2d995633
-39d92748fe4016a88f9d534b35c766c9f970903c0b466bf4867cf914c570ee9d
-f4ebc45e058759a851b8aa472d14c305f6410fc4d05acc1b11b431fa438490e1
-816475c1a6316c7635226b49399563b3dda5efa5b38d1a32efde767ba4a0fb3f
-3d93da113a8e3e32a33b5fabf64917251122ec6dc8165f26af07005b2da6aacb
-b7c8e299cd7cac6e3251bb812a600ffb1a028d36ce351b3216a7d23a195a9afe
-e3461a40159201f1a89b8ad3da7fccf08906310fd84eab1ae0a76589d69e13be
-ee3ba496b5c3f34757363c4f5623f975ec58c115901ddd9cf4b8e135f1d996e9
-1a438123b50d453656a44088b62fa37f575da53a2a42bc659540bc759ca7f24b
-d7290430dbd53edd3c602f2decc5d5c2e305e8c9ce56626fe5591ae3f6fc9b50
-62fb69b77e75d7e0808f984b7a062383d2514b0d682ee525b39fbad9b84663fc
-3b74f5ff1adee4775b8060b227c1df3c3b2fba8bd36cb216a5717ae6d6629a06
-c099300377b741877ef1db03047a531dffbf8dc6aca4ce0097b9e623717eef1f
-b40465ba5b56d6d618aa3e837cb2791736223243621b3c0f36e8cf3c5fa3b815
-36815d1a277411b9026a9eb2b1d1591aacbfc92b49babeb49269eecdc24efcbc
-7b0871150cb009a229b3d1665d05a796f84dea63d9c2e23af3a999f11f53aede
-953dedb336ff92e7839bc7023f8f4b868b5171e03857ac0ad870c8dc42c6ebdb
-cc7d51d1484f93106fbc79a677e97db44190ca4478f1c6e3ed2dd57eb8098798
-f3f163280a6ed0a87e57581fd663917674328cd2d1c6f720ba8c01f8ab79d4fa
-7c08f1417a9a9eedfdbc6d7c84bb796f3be629e476565a34885dfb7c4164e821
-529be9d79022b6e1268cf6517a0fc2864e4b718f4018744984a2376a822dff4c
-0344668df1caf06b38c229dabc5a8f51ba120b53ff9291b99340e46786c809f1
-912c2d910700252081efab3d5e1d96d8933b6709ec5198b27fe6c511209d84e3
-cb1aeaf13f364a8dc62bc37803dd71c663f7cceaee35e5b39f87bc7affc1dc97
-16f93f931ccb3164490787b1432be66246f8e8d2d01232ad3ecb7962b9ff256b
-886ca9f86af2956dd082491d015635e02d867a199c481d51f8751c6c9a3efc2c
-7de4970992cb00d45e1d71522ae651b177c2a5afa2ea22a1c083eec3fa104296
-b5b9b74464f293e394fe8ec2d4bb82b7a27b7b4878eb9ca6d8fda476b76c872f
-5f030a803c7b1f1c0483a96c6fbd43a97302e17b5e0e28eacca87be1015d91f7
-0ebb16c26c51a8d7efcf50cdaa4d7c3449b1134c30d181932ccd93ec16b44993
-329b44a6c3638b23521eefdd79e7200228425465b0c3df07868818cdf53d9945
-a740ccd2413b8d53b52f3f6b435f960173b0b4cff2e52cea7bf54e5002d254ed
-c7ed8f69fbe4fa8de61973454ca0a0c9ab2c2a9882f346d5ae456b074f367547
-54e4995e568d48065f9421f039c6b36d2b4baee80bec636374611123995da79d
-54a8e318f034d9245cc5f2fcb4096743366a1b6ea840461f45a74129ef2be0d1
-ab028681ab144f68f02aa84cd5bf824f06d7ebe88d55ce185e9defa29b55592f
-3896f917281ff282a252bc9e725ffafe2db8374c7c34820944991671ebc16393
-cdf712bb663640cfe1e700bed129c5b3b37cdc5b725396e471534e75acc23657
-12cb452bb410347fa3de8f13d2ae52de9e4a0291cff3f45bd1387e0b0717b0ab
-c7998d15558b3c80adc7f8d1dc3d3565a506050f3bb187f49ee8019da0b49917
-124e925bc05e633da732acaf407477b47dd9329dcaae0c3af728c577b5402521
-887d20bfefa2028e1ee7ebe6f5092cbf0493e4256dfb59d62b9f26ebbf5e3b96
-5be553da8a9e3ffa7ce4de7e428d8e02795ff5d7fe6dc2ccfde9c708233201cc
-b433e0fabcbc498b649af575066ec7a198ebd6d6bde12a1a5fba108bb34d316c
-03ff8b0368fef25689c95d3f1a1dbfdc891cedd92dbe22a037a2f3054897eeb4
-ddf01d1bda48d1eba76f5441354c342963da0b9b3f86b0738a8c58f4e798fdcd
-04882c1a3f18075e31b33c78529f4ee2fa66f09ff4c3975df960c6ba32ae0532
-3719cbbb5702844f3a84478c7e234341a02d44cc60e4390f335629b692832ffc
-ea98f9ccfcad11ea232a22998660ffd04320d94dc276af68dda0050406307287
-5e1af46fcc2859f6e91190b15e68e7aa56cf02593dc4e76631c3dcb7fc9ddd64
-6c7ab907941ec4348ff95fe5dba5d6233696b3ed777eaab40c4eaea7766f4856
-3679565c66ca57b9bf714be5504191337b4c9ac40f87b0255e22d24e4adce456
-3502c29ac30988ded18faafc96bd0ff8a268b0bf5830a6ff11cddda5929659fc
-ed4cee41b07eee3229d1241f8b0a3b9b1757e1a6cd2b53b29d245c0409321e53
-7f2c66df8356115857782d74dccbd69190852001b7bd6612511ca1c458c0459b
-1b1afc2dea548cd9984cb34af196b08d5147ab49aba60c0014077442e5b39170
-2c6c265b25a215fc6bb84931dc00156975908b76cf1fb54996cd798ea06d1840
-937c7e1caf0f5c595bc038d3689e7d4af6c15a3943bd3d5fa645bdc0fe0c7fa4
-a100b71d2b60cfe9ffc65d2503372bd5d7713cbbb0dd9481c19e5b24f987ab34
-861beac180f61c7e8ee68846db98c9c88aad992d8875d7b44b5de8e8c780722f
-4849ebaf90244b14d141264fceb58ea3ecffd9ca893f44a1d5104c6c9c4e63b1
-ced9e015b9f415690d526fff0be7ed7a93535c5f823ac753dc074d9cacd4a3fd
-c03879f8216a892924cc696b1d256f0d7f8f24850db602ddb9591126aa067343
-d61163475489a8ce2a4643c5e3db6a9608c1c506cfa2439991d807b8a3d89a5e
-711969217daca3bbee9289e474a0de12e6ccff0984f10aa965e6a38725f99f0d
-881053165dfe7f8a1bab8b24b9bfb7a382298cb7e9b625b78e53b731de5e5938
-24f1d53d970622a380d913c0db2b4f156033aa2c3a4423c5ba3be0261808c000
-a42bda95a6768ada32b929234e4c3a9d0c212f0b197615695f84c9a12cf77a02
-d446971dc5ffd7cbe68775d948fd9c9aca5d93438b7b2f77e83cca3d3c3cf885
-badbc9166d3eeff0473edbef598a9ddc5e5d50637fe9cec73e695d38e413fae5
-7f11aa2c1453c9c56d3a92fc33ad60e0f79e3da79b49c8cc77c40e4c82f2e9e9
-3f7eed0a0b488dcec44f8846f8a58a970dd88c12114ea58e1cdd105c656c4c34
-3d01f7bb5a35e18d730c3967c5b0e711009f14574d947ef626b4ed333baa9537
-ad0ad7d4bb5daed5af9903990bef203a529e310e5fee72aa629cfbaede5bde1b
-7a53c7cbf91a177fd3a40fff8a1eb215aa5ac9ecba228b853d55d54e5205d0d3
-2d68813164ff61cb3ed67387de44ee9d93ab2a082b50aa39050f11cb7c894914
-3850b334dc7db907ad6b5e7f3f89bacad3771604f0f1eb2843a1a5df85dc6d23
-bdfbaf5665edf79e652006a822f6b9dc0692af54a51860be74678b1c57f16240
-8c18a8efb515987fc1ef7522224dcd42450dd4a195c43117885d66850aa1f701
-54af834ee208ff22b3d49667cd64b18aab0c528ddb3363c1fc375f1f6c133f1a
-5e5ca1e83aa6cde513b11d0d80ce36bf7562a35643266996e4502fdc85ba05d3
-c1a7e39f62276ff85deaa199c3e357757f547d77467886ef66af72968e363221
-25b228b05df472afdf38d64dd4b846df73cbbf2ce1030d8ae964b330e8d7a3ce
-52eb0aa4f164d44d8683a6270e952f984dfc78a720775be462cbd41bc8d56ccb
-383daf0007b58e6fde73ad44e701c23750fb4a2afc174905b2554d8d95aff499
-713856cbb4cbd369455ba97b123ecde74a928afc03e2e11235b0c7373293bcbe
-6193a86693f5db6c6aa905dd539c19a5e953222e1c68007068f5d6b7e232fec9
-4ba203a44ec7318ef6a0db9d255585b7589f0d3e08e420f8ef7b612637a8ef0a
-2692f52d9b094d32e8c197d8c3aa8c671529a4012453bf23e7ae1def8600f056
-e715dbebf72bb7eeaee282c926f4ae871c495282c6dc98f191d03380337c8881
-07e6113ff0fbf360a225f354f0ed4ddf9c97d30fe5d4dd03dd929ee799714ce7
-6182e399f53969cf4c8cc2df7332a9de56dbd19a8704661d842997f06f3589ba
-f63999f94b4c00cf23d1b540818fe68ffe739b1773d8ac1746e51d8606e06400
-4eaed25d729b5168e8f4bef2c59eb953fcb9956d3f3e733591a3978700510553
-8f9c1721aa7cf7552188c2ee521116b1cdf4852ef70b0d2066a2b2e5dc194fe4
-c14503d57f7d7802014079f915f3af34d0fa4b3fd4a0be01952933c8e939eb95
-dba63306dfa0f2ecefa6f8a868e9b513f5ae04d8fa9715e04daef3225ff5dc69
-b6e455f4c8e8670f7b4c27f62f0c9c3083945d538b46edd1c20cca764e370178
-fd0e0753664691abf1be81c197fc26aef772e4cd6e3b3c08b092e84b80946788
-1a00df4bc03890f5464d453a683d59eef81734570e635e4c2ddfa34b41a6736c
-b740641e676556182d98b7e50c56f8bd57020f515d73867fe1a24e098a656833
-38039c76da859391f701e404a0218adb77abb649687e685821f0f32691a82b07
-15ab96d0bdb3baab325089911ea11f6112b69c1e877cd8f2b8dcfe55108f0fd2
-12efbd4f7954149e64e1aa1bd0d0b709f13d032d1ffd5c68bd4fb14fbd7721d7
-a9f9355767875dd2dbf55d85ff6f0378d60e81b3e37ff6bcb6031668ffaa0ecc
-cf414fe67e9261eb0f791a092f7c97dc98f9fdfd212a363bf7473fc107ee5fac
-0790704f6fb87246143e0a53472593157180617772180173d0b0ea6949dcc49a
-3f8ffc3f033bd306ef4b6a9001d34d05e7a8a200016afaaf6a69b5a10e6fc316
-5d9341b62bbc709ab8424b84d25965834f27750afae63468b791cba8dfcc32b4
-158cec29e8112e70bd237c1a180d078070c6feaabb7d35f5167447e54ce4c6f6
-0f55d9f97ce8f1a157af6b49567a16bbe23233e68bfadba699b69b22d70b94b3
-bb551113de57d25e2cc22a3096eae40bea7e353034231ec33554fba3920e3f80
-3611e4dc2d2bb7580869d0bf7cd3a0b24ba6a2cee9210164bf0e14e76642cea9
-bed0b279b01007826296ff79b3fdc11c24beac7857667139a80f0243b16b153d
-a927925575ae6315fba5e54d5f9958004e31a4acdb315b78d08188accf9a0099
-e8e706553f926d14afbd8c39cd805eff90b3993c96405990aa9d189fd66acbd3
-123e94f66d3d1a5f4061b0ae1a032ed9eb5010307a368c1c6104767bab95bc46
-86ddea0248d2eb0a886115e22304e81deafce6e1dfca09a8a8c93e7a44b6baee
-d222d3cdcc5a8b1661b9a874c1bd871a4cce7f9666d0ae94735fa3535a44920d
-6740d5e6dd0372733bebbc603d89cac8450df40be169d9bb90e3480f3659f28f
-5b2de56f7c596b3d3c2b80dd82c1f01196c301855d6217b99bfffa93b9d40e43
-1a22f7a9ab31462d3f14b5dfb0795ca0675cceddb8e7eb010b1521406689b491
-9d264bc1f084564e6a564a76437c6bd4317fcfedb47653f191d6c6b649270aaf
-d083771031afca63850e7a552dc8cde90b1c6556d49c09bcd3284956ff555e57
-77365a2ab6d7e265a1a4f29de8203a2a15756ae595a48e11b958c6ebc478ecec
-29e0ba3a7cdba448c7abc3bb6e21d21bedc9e49e730a5872082e9b2ce588956d
-b35eacbc2f3f41485b0b0403029b7a5405ed1a40d6d0a7a802c0bc4a0b1fa6c3
-32450dc5b1cc97378a2edba812918155e84e78267ec5e73f2c0bbdc96604294b
-3f840dd3d7159999fe24b2c6f297adff2074ae10a9087e2222af7bfa938a2058
-4dce0e6185a493b9c177b8238af099bd737ee30fc40381833e6a08176f3cb0a0
-504270ae6e7701a47a721d70ca5099a2c55e9558320285e4584e64d639560d37
-50993e0757a1419eeeee61f8186f8493034da3997e6000354bf0e07d948afd88
-ed9fb679b76b39b0b4b444bca762ffe47103bf812b63a2b7c26e56ae4b8c73c5
-58d0f7d6971cde60c257de6688d38bcda59d35ccda430df05fb25f2a3c75d377
-d88b1f22eb46731b7b36f8d9ecfdacd3f11f9fbbc1b4587141c4b3b9b0d0a9d9
-bac41cf6c67a995491d52d695aa14aedbbe48d49126e55b2ae43d0545d031e05
-1d52602401c68d41fd21e4faef1cc86a15dcd17c1975b2d841556017a8f39f26
-b6c0c9cf80e7b5d9488f9d4b08564c8ff25c52c16c3d11ee55e18dd3462f9436
-ce1e4bb7eb090929b4816aea6150fea2659389445800576aac75dd801524bc6b
-3f8852f9a999c05c7b29820afd544071e9432ef5cdea3610acb574cca130ddff
-aca7b6ac5a6d86758edcc686be2a61b6f5f2a3405faf7a9b06edc40df07b74b7
-409e2a172430b1d504b041a5c7b0a4107bf60581e1fd5e43a5732ad62a2301d0
-07c3a3489e8ed7c963cb5ea2bb5f4befeddce251c8fa914c424764311d16c7d4
-1e855f4b2fc2d4237ab0457b3a1752971bccd0e321dea65684d0e44a73023a19
-4a9823950a620ea838eb5d98f9959992f48d5ad23be313438385a6ffb29362ea
-a69f16b642066ffabd919bbccf49db54550299476a7143d3d89a6c1a18e94db0
-656a51dc9d77dbb58568b3365ccdd85d0e98097342559bace953b33cde10d826
-8a3839a28d7c218bb4b0a31d105c5d5464c2fa0ae31f69994057717892369191
-3b67d16584ae555dfe1aa32d4b40d144cdb9584cc5777d1e30429f09e0fc25ad
-c87af39d21328dca6c31be361d2382b2c20435e255c6f3014f052e8f4d305a06
-7b3866bfed5eb9b9434909f117bb602c1b743496c9ea13dfe4558b443c347a96
-6665d7e5c06125a8aa4e906f7cc0bc04118a26e9129fc23a63fb0eaa010deb73
-76fcce5d4a3d4ae626517d2d77550c50f7a45b4ade74018b746f5aed001cef52
-fec5e73534a2de1256ada58aa26e5bc0d9d848c8d0a7f42dbd7ecab47d6be1df
-71b7632ba5fdfc28fad09fab97fcdf3ba729973d39a5cffdcec0d1173be7e7d0
-85a59a4504617981421dc9600b2b65fc122d34ee2fab5640893e34ed50f53037
-102330d718f7c2bb7b9f50d18643e04af5c860215f7211271fb2075e0152d85e
-c440a933a87d20a0677ea2717baec45e8578a077805615c7d492db713259949f
-0392cd91480059059dff830b24e2e6e5c715efb4aced3dc637f88cf3ce57ca45
-2e96edc986edce66a831ee92e6e284c72b1307ce4ac479e57014d5114a9054f9
-cf9fba1ae66b0f83e173f31378fa74e8b087490bca05f77da7842d7167d8964d
-c59089eb222f1a33963622a9a17c3542d9940baf4d1b8d68cd4d51f16acf31f2
-91570def9261b67da9222acbeba21a6f3fa905e081be29befe3152b326902afb
-bc6a57c110bdfda8a5c4ce8e272eabdca671be16f4eb7953d1df46e250acc0b0
-674deed452de3b04f258e081110c5ba20a934fa9180abc09806e257abb22041b
-836ab3b73f5ea8dd1dd8cd56216d1bfee9a8ba78d83e2cf0935586c0cd7340cc
-5980e5ca4989174cd46fdadb86398bbcca75c9580310422f692812bbd8a91602
-4f28a49d35ca1c80d5c6c7b879f14d037ce98c0be18eefbca8acccec2fb01923
-69154709b772b7a13d2a9737652a1bea28da5be3815867a952fbdbdb8c45c347
-afb7d7de74620d97b52a6bb27d2b25fc3d0515129eb92be62f7efcadaeba61ef
-88d82df3daf2d1b0a117493075b501ad84ff1650bd7196a1e481c393de324dcc
-c50ed36647ad32f2c8c1820aee9190126c1e622d1f686c71855f8a50062abab5
-54fbc041de1cb0f6163df274e0b148cc24ff66aa16590447b5018474e5bc20eb
-77a870366b3ba577a6f484ef97c606cf71f15470905be27bac6fa4375629f80c
-b8aef8957b856abe4f885c47acd94a7a32b2d81cb5ccea65a52328820404f5bb
-512ae315f257f6196effbbb484ae7c877ca278a1f086e771092915d375667811
-f874c618cc6a117310287382fecd5fad1bf3656f9d41c6b798cc1f6e6f7f789c
-8eab2b1634cc255f999a72ea0e3e201a4335558e1dfc26a8b02a8a1fa55cfbca
-d1bc49f81b8f7837a29d7af533d9fdca050cbc2809ad4cb54699131364977a03
-775148adc0957ecf2d7317ee6b582592baea2f25d926a1738df65b37a519ab95
-a99bab4dc07e56df6e4ebfa0a8e4d8f90693f8de9d1cba77b3f11dbf7b1eb907
-a381fa256e2e943d68e773459c7ae4e7ff969b43d5693b5b612fbbcccc4c5411
-49a3dd6f01ba7bb3d11a331cfe3734ba2b9e1f8a353be0f7a6a0567e1f0acccc
-0e5f27eb18fd60d809ddea01e8d6d1e8c5f59b9554910206ec9c56e7c483478a
-1e4a4cbe7bfc97c7c96f119726e45d23b337e547667281022269e8b66dbf241b
-d74d3cb856da025944794c90cd5196bc8f3a57869c9f9647a0faf133263e96d1
-78ee01be0f6b67db214b2e9c3f10aefa22e7e0dc1ff6d463a2cf77d66218fc1d
-9a0f754c3681591d66f8c455a85e3e7d396fa1cecc04b218a892da24ea8dedf6
-2084965bb34be5e897a6a6c7818f0cc42be52edd5cd7c45cbcfaf89c94569343
-de0c4bfff1f6120684fed8652a071b6587f37aa970b5be3e8574918b97cba372
-81ec8e16a93fd111d796dc5833b76f3f3254a1c126fe28e103ce61a0eb89ef8c
-9202f06e04949602431a5cf57a940c059876b3724e461b7cba19a398427e0d07
-8a88c2eb0f9d12b608d777cc1558522e5f0e96362ee59cf1ee03b1ba9b864bc1
-d186152f24e7e28b92e3a799b23c2416afc0820ecb57a0fc36f44b73aaf6ea3e
-3b952de790af21f21a273a5c0f86ea671ed2ab467469a0ebba738b6257ad34ff
-499b8e21a77a5685dc1de5f21f8ae20d85c6c921f1ca434b67e876e9d3bc0136
-dce9e8d97c769e07e7535ede8bcc169bd38b5f3881f94fc7526ffa91b7870255
-f62e423e2ea2946faa96353152b56ae03010a42f15cea95dd27c89a4614605d3
-636f44785350a920f63f0cbc5566aa9fdfdaf29c109dc83169b3a64ffb0a7c58
-084a88d385ade5c3273c02f809e3dac76dbad71e76462d909348c609dc0bc7f5
-0cbe05994df34bd38feb8b5876cf5a50989a44792c36f0a989084acd73cb700b
-64103a290df126dadf1449a45c713a71353969d41bdda892871644f895fef631
-15b63299dc61de72c7201d8392dd3f10b819b792ef91f1bcddf9f04bf3b94c25
-ce81c6edced5ac26c9cc0e304683656c9ef456b1b666bedb3fac1c597bff1d9e
-932d05de433889db501bfa1abf7158b428b24a0d49b467b3a38f916601c9d36e
-22374c7c96dbb04a5de8ee1013ec7d8515a9eba05c41def2b8af7bae6691abad
-51b58b489b3b20f3276878bd520e6e70a9005ee6cd9651199e71269a9dc9e1b4
-cd24d01d37448b25ea34d6e0ec921c4c1904b7c4deb93a5c6a0c736a501ce7b3
-5e386a065c1f5df136c8bb89103febc7b9b3de8f74e0504fbd7ff702c5c7250b
-881e83499ecb6d80b3f9d9d17aed8414a6e723603c8762a3409f6766be726bc2
-79f70435a56a0e096209231f5b0c134bdb7aa6cb3db9895720cd02b9dc0476ca
-90c7a9ed37ff0b380348f66d85037e9abc95499cf6a3006a40c3874fbbc4efbc
-93b261cde619c9f86a4203dcb642e59c59709dfcad0d15235264fc7923227094
-ca105019b1bd20e4bfe5f3ea8edbc33a7bcb6ebc523533228ff682e8a1150aca
-fbee38b10517877329be50b45bd87df864b02c6c8cb5125b01e79c64048ddd3b
-7bc817f3998adc78819febb2d81c7cbfd179908cd36b7e5169218b449cfd1a1d
-d0979eee4aa2c2f664b9532775113f6d528c0e7c1ddf7f92738b1ec1c903710f
-9543712c0133b208a9bbafaca0a5ec4a087a1e5de118fda50b4b79a658e73a04
-ea556ee2b9891278e414984da3dc6d739ce951cf058e2bd79d671877c4d5680c
-2a757744cfe0cf31bf587043af1acf031fe82e85f1199c1e606232edd4501949
-dc70516a3c30b356f35c2b4e14fdc62abc3cef6b7703937a1c5561694b2e2022
-457603ec1210cfe44401a8ef8e43ab2c2244428c4f8138828f2a7646a8482b49
-00a7fca8dbfc30cf7dacbcb003d06c36644d61e901114cc5348ebf805af2f70f
-84398891f59cc49846e23463d89ba78dcadb3efe0f1f00f4b45c40bc0d2f3cd7
-63c231487557e68ebbb01cc9f96f246e9c2634cecff4a381dd27814e07cf1eef
-75a68378e92e56ff486dafb1bba124ccb1f2e9dfdf43c5fabc0336d8f237f9c8
-c0a656c7691c674c0031ec4531b6e7adffa69d634c9af413fe014cb6464b4ba8
-649cf7bf0b6ef90126d312c361fbf4618957798879d967496ae34ecdd53985be
-1bcea07ff99f19a7bf3dad5bc31e1941161e60b98a7f78316b95db862315bd25
-c46474a7e5cbe24c54f54fa23b299901cc2488480d258db25713dc97ab0e4b5a
-d66bc1131efb7296f2edbf6d27734cd45603cf5c1e0915dee25996df850dfa31
-13e23c722aef49ad2be71db794c86926c13ad66f17d8b8de2a4b66d9191afc44
-2b4e95d2cd04cf23374f172a183ba3d6adf8b2f919f14b4ab794f53531aa0da7
-fa0d5ea6f4c30e24db53640d51248cf1001e7330286c1668a7250d3a0d34f84a
-7acecf297caec2198b56eb1b9263ba531658d06a3d9902c3c96034cf79f4038a
-2859c9e47088ed6025d59a69abe6c86ffb467b4d8b44028fcd099729e37bf8f9
-5584763055731e7d7ac8b76765955c5c73c00bdbd426950f69ac97f55f9f9f2f
-bc217e166c442e627ee893965fbc7200396403b1f52693f6079886eac12d3553
-a02944981ead829e3bef62ce5d9274e039e305c48b23c604a86e6d816b649faa
-ecdff4777472f32094796aae48960b0f3d74e40fd1e4e72bb37e54322c126341
-039c3b3fc15a137fbee162877a2b1a27dbc2cb91b9b8cecad345cb00d519c051
-f46df1f96224e95646e02d4af7739638c5a261e36e46be731e3425d8f62d25ce
-5a7f1e72abf75237bc7109d0f6503b684c728a888ce8a67d622a298fc09d08a0
-39b7508db67d1fad998be17d49438696e9c402bf6ca7e5ad7ca7a1450e04d17c
-2b0fa2feb0b9d5af5dfa5367faab7b3e2f104dffb5da896d00b890764b83543f
-70d04bf1fb56fdf0a5873edc4124e42b1546dcd43f4896a2b313617c5675e84c
-1fb558d1b944084e431c29a8b1b1ea67f22bca2ea0e503c422f13d3d18c16dc2
-2f8215c71346762875d4864e20c107f50d9b42963aa2185db553e60af6c6a6a9
-886ed38b48052b0cce1e5b3f2f5d96975849eef01399553443d2722f1fbe8266
-aab7b8c1d69ee6926c1f916c62dce7a293589e10141173e30b5790f18763f1d8
-e1168cac05882de798bf361b1ec201c9f5fc970e5bba72515ecf3ddfcb14a6d6
-2f38cec6004fca8ec75d0b2ae1fc8bc94d4bac124c97b770759987d4322ae181
-55c7a1d7c0d3005385eeae58b8a07c556dd439b676b496682931327031d68f43
-daa631dff340b8531a8f1cddc1f7061dafd88109b78958d52acbf458dd3ee2a1
-fce78a3e5a8ad9a5314464a53699701ce17dfba2e176e9ac0f34e1692224926b
-61782f6ffad4c6278a32b1bdb73cf6b8b2f5646dbea6de31b2078cad5a87dcd9
-04ea4e60601f7547c1544b863ba383ee95ceb4a42ce89e815740e0abf8d3087c
-637a29e0645de6f2edd027cdd56e8b558dbd26e9582186bd5b4792500926f8b2
-5d0dd38c7af1ce0e2d99942b0099757140f9dfbd514c38e3d15e502dbbc34c0f
-61e3262e48f80bc3b6f93ac5aaab909cac3b776094c2a101b0ef5c891e28ce69
-9ecbbb70fa9a71bab19a9a4ae49f9316b7dbdfd63b43db9aa064df4092cee544
-7507275807a430358ff0df98f2fbaf716785742ba18888994a8e2b54aa0f6fdc
-07feee88c4c98951495943bd42b395b92b545cce05be3db4a0ffc43ca064ac4a
-9baad9d402c97fb79b8f70184e011f78d8e96538f4ef66d45950a80d186f3b96
-56ce530f019a1269ecd2249f6514a6b77e486198ed8e4c28760a6482b1d3bd8e
-8104a8c964154d8d23fb33f0028960d92c5bd3dfa6bb390f6dc708a9f4fec7a3
-7327a97723acf7b62070cd7dffb6aaa77505a05fb292c54baaf428f9b81e5ded
-8c92353e46081e4fc0edf39c53ad0e64a29e34aed73d18e25d0fb73134ca03fb
-382c1f2d703e241986e9bcb36f4a9a45bf183e5898364d95369febc1c8867d7a
-77b76f92c3668ace60e180b685698d403b86e27cb9725405955fecf496aaf327
-e4f5e75ff5123402b23b0e8c5f7cf7ccf1364fbc8d9bcb94f0f3f018a2902f61
-ce2e4992a5dd21e2432a6f412e77b13cc968355f9298c0fda7bef338086560a6
-7c774e05aa3e6d1f0a3b61bc1ea89cbe39423ab0c3bccf10e091a76563ff8b09
-c509f9f69409b7bbe8ccfb574ea7a80cb1ff7502388b4969f91f319e0c609bb5
-c3ab477330dc67d7d900f2cae9890caf14312ba25c8722f73ab0d9b0c884aafb
-b548a565b92af0ff6940d36d40442671cd9513f93d19107cca2462d5432696d0
-97f56f580721b0cc583aee69922f3d0209989ed6e6bf55e70e293c0c3e89f0a7
-caa0d50b519ffe06b5e86068deb84ae448d5041d20e03955b5bbf0d78ae45bbe
-2e548c64687229f1033fe264d1eddd5437e2519aaf8d1f7f2b8acff36cd650a6
-3cac39cb7c215c7b34e29b58fbf5d8493cc1bbc9e4dc92d8df9cbc28cb3884a9
-b5031e13c12ea77e63e74504fb6609b446ea85900cd8351853e71bbaad97ef8c
-14c8691ea4a1b39c94b7ffd97605796e7125ea5a6ef7cb631ed1d7805155f6dc
-d64e6773ab236b4c9eeabdae300229d4710af35c88f3a61fb3934dfcf4756533
-bf1a27c68f82bba998f2abd86aab3b741fa09837a3f32cfb5f0a35732c7df553
-1277c984e1c32777107cfbe7962971b6bc352ef17179d94a3accaa0730f3d360
-ccc9e41a9d019759443990c8ad253b2726872bb53a3e6217b3ecc57242068b70
-1116465f90b58a16e703ad75c3da86b2ca6f6e2f88ce00a60175843321e6e6d1
-8e1fb76455d729634c196a8048ba1d7e399b7e5529e312610cd6e38e11de0500
-47bf6d8e7fc899e90a40f639ab3ed83e4f8614245ae7929da6a8872a15b3b6d8
-c0769d8468fa9911fda9fe875c7f4532d2cd641d8024b1b43de1d9fc0cf0dd55
-0337769be1a0da6afa42b12c8b3d21ea450df447196ed23071ecc65385cf7111
-d025b3d4d396fc2ff5f814fc7b249b88c012765d66402a3cf926e3769522c650
-62336560b22fd0865350c75541ddece29da646b137d467aea2b14e0c8a9d004d
-c914e1e36247f010d5acdfc06a5a86477392e6b5df8bfa0201bd160c16edd42a
-1611d8569db8d294d64cd76f9132970e961a57cbc9478fa37507f44197d73490
-3a6aa1706d0e0b4115e3c6bddbd4cf4be087fe8cdde3a8d764b299fcaefbf13a
-2f480e9385aa9db1d4358cecb9958ef760f6dd14459f2a93bd2d49e354b7a672
-8e6bd45f17e2c6d86512f24234f1e8df4e5ebfab6c094504041adaaea0139028
-5b4223e9cefe6e67c7a055c9b56402202fc3964989ae3d435ab73b071c022aa4
-6c2226809e1c38f8436f42d3ac3a262c94cd71383b50dca30ca2d275ec463405
-e7de48bbfcf53a152083382b8426ce804c958b9aae95a13f2575658991c91988
-e3af9fc6d24986700798775ed0edfe717510f248d3fd68a5e229c9862f7e5850
-1527886041988bcb5fb8e76b80a5292e982f25d51a97a594c4bc30a0cf3739e5
-6381ee320c7a2908da6732b29184ba5312b24e0935fdea476a5aeaa75df407fa
-4ebf181d5a15a5ad7d0561ebf0a4e55c220a9beccae6fd830c0fda764583cc5f
-f59dd84c9c2486afd7039eb22a657ebcb48c5ca9053f9c6671cc6cb448897f01
-a33036fc2438c9afec583261506e1ce938894644af8d14b5af8b020f0061502c
-685d2919d5babfcbb1658002a2b5b6f5fe8636f4addbf97dc7c28eb93dde4f93
-831cb9aec8d2d3f6173f16d4c31ae3871e4bfad4b652c0f5e11af2270c983cf7
-47e3d8ef4619c2d76db67ffac11988cf3e7f6a2976305532a2a2174656a926fc
-1e9dbc981c19937c1fbfd11871ab3b96599182227ba0f840f29bf8533d33e4c0
-052e60cc0a266a97857f7c6bdb412ea779b4094a5ca237960957dd0fa2a37c66
-97db26e03b892bbf9ea9b6e39d131f8ceeaced68e12b7f2ce9ac64dfc61009a6
-a4959924651f7158dc9c25f3e603629c979aac5c308fb57a460f4229ec663d88
-51e6947cc40678dfc56e8472f021d3264c06a3b76cf1f77f4b4d0b1886039d3f
-e166d739bafe7cbfd72331c343fdd7395cb8cda3a85c735bb35a286090b6055b
-62808bd999289763d9e433d22573fa3f069f40aa45df44cd9e17e843e9841828
-d18b10f2325aafb6c872e26486f9c059476a50a4a3654ea8ae9e7f6fb7496a4a
-887054819293cfe78eb82ce32bdaf4c291faee9b01a04ca557cb09e614d0568b
-4fd1eb0cadaa3014aeb0325eb68606f07885a5234e54e76ef6d9769b80e640c1
-8b21a8f0d80f7029228c704ac5d747edc455493f33e844a3b450f36141417a52
-0677fad5d7812b65640113f8daf1c45aac012f587719d26e84e8f98cdbc9e3cd
-a9e148ec08d03ebbc9e875b21ae8a3456a032d39fb1e726effa0b5039871cd72
-6faf210bc4927de53fffa0d987c2232bf27dcecda650bb7d7ebadaa7036079c8
-0f067aa09ade73b0f22f92ca57ab4a1873ed901c7eb934fef1524824604092ff
-6f255608a2ad18636b7f69d842764c672d3392b35b7e12ddc355aaec9023f8c2
-730ddc4e7b49e754e7550c70a21b5bdd7acd0bde562b34faa2ecbbded4956cc6
-45747aaf479ddf5269180428781e96f3589ab47bf5d772b0a6a01eda4dbf27f1
-49cc8d9fc57e95245f9da122f1e3b6a31ca21d7bce9e846b3484bc32310902ff
-acbc3b5e1191ce9a65878695678a3ea186d03fa6cd13b1743f327ab65a848d30
-1dd0abd9aac5b38e9f727365120dd5024f3da20c5cd4f6105490e3e45df85ac1
-300a041e5a5ea1d8d882bbb1afd4cd7156f19a48f43ac58cbab60674b4daaf45
-7528e5c201d32ca7e06ff8719b79b94d6c571a99221e5ef00c8bcd7d82ce818a
-e2c4f8b426438788ba84c02e7c9395b00f9780b7770facde25094236e106c405
-14913fcd39c2d2b0d084931cb5b4ebdda3d91d8a25ecdef23154779b30a277c9
-509902c229d32557328bfb32b20561dc38e88fa16a9ebcd74377ee96dae69167
-87481289a5d322e9c34dce09c833d7e479200afdd9998669b16a30264e72ca70
-f34e79f2c544ab96c323dadda4c9900737121d68aef6978feac182fe1214b1e5
-e2f3321680eb5f0e6fa1f2bee600b07db3d9546954fb6137443956de879d58ad
-cb7d8a870f12a58c5475ab59790565de421f59b39e643ab54f38a94336cc0f6e
-c5c54c6fe6f61d6c6121aad3b9b1d66350061d1679e795c252dc429647c83d29
-c684a07d0b41c72a62be91564cccf41edc5b079b2f06e6a9236addad84d0fc4a
-b5d3403b42c9dbe80d119de3855e1b17498a9c2e827f4a8b85736371e39bc01f
-7d7d14421219d136d182783f5d6f8aadad83109f5bbe65ce504735367ca9b26c
-40e10288fbdea5d46532331eeaabcdd5ea937f1537796f43c7a3ff713ea2c86a
-2f325acf06ef921222eaaa928a4dbc95a9a720bdcab273737e7753294e42a8ab
-3a27daddd130ef705f2702702f39c84de8e5de998f507bc54a69de88621f1968
-bc135bd14c3ce226befa65d8e117c7dad682ce6dd839c443e5368b1dfcbb8cb1
-7357d126b021a47bc4b3eb4967183f4a5ad66bb4ced909993a13f365604432ab
-42bbda92d93d132d4194a64717c65d6bdfad697e3e2c1b2962382d43cfdb20c5
-ed6a61484b3322140ae300953acaff45077505701f7c161f108b902734803f93
-b6e89a2cb7640388248e2c263135f0dcf9d6945f8b648c89ffa5d39911bf196d
-24dd049e561cf823988605fb0b3b2b960be8448dafe7cb335dfd8870f2fed3a5
-ad8784ec4c5835f2aaac6a5f7fdf8f15e1bb5f28296f6af7f8fece5ba290030b
-885e30d245ed99db82c0d669ac135390af59032d6b44b34cf43df8b7e3434bec
-eb8794acf138dbe43d028c6bfb9b27f2690324f201352eaa4f3ae5601cfd4802
-81180cb05c6bb3a90948f261ae1e31edd7b34dd8f1dd2451eff15bc7b881e47e
-98183454b03554d5aaf541f087bf56ad3087681521bf3c7b84c8047d3c23b02f
-b80a55f6a26ea426feb545f7075a84d903e1ee6386e8bf13deef625de5ebef1e
-5d693c8fde15c264113394b035931bfd00308cb7fe9b84d4b18df639a65f454a
-9136598ad3f5fe4a71e2d7ee28ac54ab4735957cd1aeaf5b91247426a706415b
-1f974db500682c188fecb8ec291a81647d09c3326e05a671e6f406140d94a86c
-edccd20538009a2867c3fd9d8b8a703de2f9e2dda4a495f6c8adf2d8da8e06ef
-9f21cc11807dfa35a9732f9fe8bdb8f2406552ab3d67621d23bf5f425b4dbdca
-79a2796dd74cab6305c5a8459e54f5cd6d8ed1768676386d19e483f257b9fcee
-1c8d9a0ad09997343314ad22fd713a49b8a7da1e2302ab57360ac15abf917f4a
-930dece02b588a0564271e207746e4e7c330889a3f272e85120c7d1348379a95
-80f40a595b1a0f939aa46b7eb17d07981136851acc677e78e8715639357668fe
-fb162d0bf9e7b58eb0a0a8e3040de3cc5d6ba9236cfe5a921dc2342167ec9d9b
-1a6ed1b7da0da8474ffed17740221cfeb7de9aad199e58bbddce88ba826a14aa
-9b11abcc6f897453ddca5565a096a79125a192cfebe71ed37b5810f13fa07e1b
-286bca46d8f8c1e76c7ea100c2dcc5501653c7cf156582152bb6aa34ae041580
-6292f09c7c3ccf7581a1d1828a99866f5148de42ab060932d1366c2bd8104053
-f5d3744c9d825171812dbce8ef600b937ec0430f4a6129d69fefbefbd94aeaa5
-12673d7ab07f05528c529d4552ed20f00e8bfe54721cd959ccbca7f5c1850168
-5d5ab669a3aabbf6d431a429696274df399f3cf3760a4ac9453d407b211b2bd1
-b8416c1c23b3e68343ec28cc5e520fc2dacff7d41274aeb8f77beb6174560e35
-fcbf7fc20042393bf52b5278402ac5cd9f2e1ecd5a9dba963b9acf08d78cc5ec
-33bf5c620b6f5520cb781a48f247158899cb347b977cd62c54cad66c7e6cfade
-433e5be9ff8af602bdccec15daaa4316c8289921d19f809c20e68fca2b71db82
-df2bf6f0ab9d90b9830d399d838547fecad841b07fc429abdf02d544b41d5e31
-7655829d65c3c4eceb08dedbc1b2db023ad5e524ac9cfba00bbfc2bb2df14d60
-954d55560fa6e2ff31786acf9277e5e2018ea2f839873e3a4cff611d83a1cf8b
-7ea655c6bd34c7904818fd857cfcf4a9b39e5fd5cc551655dd75602a432a077e
-653d3096ebdfe93e0c7c7fdb0e52ac0145a5857d5bc46daccc9d9bc048cd6e56
-1ac2f5cac16d537abcf20dfe3c6aba54f400573da27a781dcbcee2bae55db664
-18f8f003aba535662a2c891070ae99839b4e0fcdf5ff9b7201ff83bbc9a5d39e
-bb61de440b63d08fe86bbb51e251a65501f8ace59ec1907c1268c639012974f0
-d8c09babdaad610d2c065174687fa1d783dad6567f1bc9056b4e7f90796ae034
-529735bb2c26f89166b67385c0b3ea8befaf0d3c5d2021c5e95f332659f57c20
-7b74c058fe712f9f6f7bba2afa24d922819590e2fdaa7b44e2b7a401fad4d28f
-05ab33026864f395ec60b658d42784533883b1cf6d5c32baf24262d835be78f1
-eb7b30ab043abc420085fc13622e1eea3438d9736c4ea328912fe1f587d4252d
-bac29ae8f47e156b7183c1b79034bbda31e08619fc106ff4ab743bf8b9d8bfcf
-a8ab6b810c1e1f862201010a3e3da3ebb9457071f5bfc811869fdfa0ea873a0f
-fc47d86b663bb3309bce467a81d6f757f62a195f7c6962a729794666635c8703
-db1e2d71ae67d5dcbae3cbf5b948eaae1e7e7ee478a0e4584ed70a019449b463
-9f812dea0ca7e191c9698c48defd784c76b4692337749365039b13055ad9114b
-1a456477c879893ec3bdd4d34184ae5f3e7bbd8b8ac1abeb315540673a792b21
-6473e225bf2b925d77276d0741cc50fb9ffdd34459642d337c044cb4d58c123d
-652dffe4dc9fb7df87bef364cd7d62d8fe7046cdcf4b387798754c409fea2867
-c3c3e9603e79d53c02465ed8b57b752f76477dbbd1c8945522901478aacf4871
-c3dc4aa90b10c08351d608a02d168a5978fba8eebb48ec93653a8e178d44daba
-e42ec334aea08544a01dd57943e050e87fdf8200d2cc475c02dff5ab8f90e58b
-d3efce06d49ea472df3f149b629059dd9e839536fe014503ebd1e6acc1c35637
-bee2f01138614af7521c7a9b0ad46187f168e387a095d795c067660f71b43521
-7132c561f442b12f84e183d1f5dc887b3e38f904dfa73777e7bd7d3ab6e91fe8
-fed58db8f42e4b65856d633c75e5c9f27fa20a7c352f30d2ceda868f61fc0548
-f2ef8ebcaa18fcbb4439ad597a2f2d89ecba33181e770d5e8b89d95ac0c9b137
-a8cabedafbb3a2071a0484c54dc24ba3b00314555dd3268690308c839cb0f0e0
-410116d5bdea76dc4e37d89e5262df1a2d5214bdc3287a67e7657cf5b5f66892
-0e5b549eb0929093bc809afe32a60894d7d5dbcc546b0664cdea07442c75ad9d
-8bcd96bc17af39925125ccad1a305829e9054454ae7db205fdb3c459836ae540
-ce773785b55b103bbb400a6472c14b125d85426138c06d67c5944cd0cb27b224
-e1dba5ac9631e37b2a3ef25adfb0271f729f6c4b9402771e0dac6068e12a0df7
-7dfe8ff7eabc22211bdc35062527e1ef26da58a905331a5062c66abafb46feb5
-05aa06ae1a4d7e88143666dc8a7add3f049fdede30f7785f968dbb0ea2de8bf0
-a08da2f0c9473885963b710f96fed7751c4ce01b4f954e486325488951d4bf83
-01662f9bb15f48623f8b61c7bf7dd47fc35e73669f03286ac8b1d714dfb24415
-7083b0340c5535e329f6a114070d01df96675ca34d6a0280ae26e81a64ce055a
-8261cf5db776cfae5cf1fdc3f8bee14efdd08b832ac93ed7094b7e57a02b86c1
-574ed345d13e9f9ee91bc99fff620fba401de9c6265a1ab696a581e15a3e5d56
-dc74fc5c276b7d1136c94e1816aa95c0f3207ee25769b17948d9a4aa60f7968b
-e033c5e124780bc4f532ec96f64e542a0851a75664b073dd16034e76adc06931
-5f5f2492fb97859d59cf2f6fa3a6053caf4013c4f47469b9bb1636e7017a0c3f
-5d90c8d94894613b51895a11f37e9f31fd98a37bbf4cc1e01e5420556160dcc1
-25bd769c66ebe645bfdd4eaa9c53d414ab9757c860861eac507a612a9309e5fe
-e75c85868fc360a41846a8fc79b60a175606bce995b584b5d645f9223b7b3a3c
-e4e249600921f783ec8f13abf5aaa3b5008389c46da5721dc304f56d7ed99f40
-264d7c378d96a6d1a960cc2e412a85fc3a2c47c6f70edf2cedede7cf39d8512b
-9679bb345fbc28716239bd95246b59d21a9d8378897e9c7607af76ce59e66ca9
-d07928d73ca7744dc5cddfbdac11468497cfc89dfa1a24b120753229598af48d
-0d2e6332a73189656cd1f584496e6f3b1552b04cdd6e51a8388dcaee3dcf8c88
-072651ee9cd44e3cf938172570ebb994bb821bc04e1a7723e16ea720bd8cceb8
-af7ddbb6ac14a58e144ebc37819ce9f2e78c0b8e5f68ed48a5529e47b2d9a7d5
-b381bbbf863a318d719ac4e678cc1092f721b5ca28430dd1b597004390ca2a34
-a54e73d1d8a556c14c4f04eddb0adfa43ce6ec57c8fd98ef7abc2cefbe991786
-a58ff65ee2bcc0ac940a0f07e367c032f0a306375948b54546c7379053ce25a5
-707d9c54aaeabe39fadadd74e1710f617d751f7751d396c5d054d28f93314ea1
-0e6803b627f3e1a1b2a2c4f14a8e9f9da3a032f7bfd872f86470b2f50e7247f8
-97ac03b1a4fc9ae5fe6dd088171746706b39432cacff853edf1b2fe87208a44b
-c1304b88b88f70b2c7596cf5ea33d9d11317da7dd2b8497aac6100ca08551dd2
-a57ce4efd1522a62f292caf6e273878073c82f48a6c9f10c42be92c439cf49aa
-8d4302a85a9f6f313ffeeef59e54aac64b7dbaa8265613f46e62d9a93b3e5740
-9eed68eea907fc84a6ad170b8e1ca16b62e46b1067f28eb6b35756c71443e0e7
-f0ea70df14dba384368a68baef33b7b2105085d179980d6622db47c1dd4f027c
-0fb25e8b1ed04be113f6961107c235eec39afa4db672fccd5c11737b22ca2a50
-af750d838462311c1111d31211fc41b76a96197ed5f62505bd627efc44c98cbb
-12d82f9969735d8f4f36e097ef1cc66629b901cd7d530d74521decc86ccc0707
-07e8a5208fd26e0fca9dc03e4b5b5bb6ee8d899d439457f139f7d2eaa4dc6676
-a411a40412cf8808cd1e9ece8df377dd30af8dcb28e8635c0596c9f68728a877
-671ff5872c81635145e98e055dbf7eff602a4cd98986e49a26c3754b8a264b99
-b53dde3ac4448ba76a550df75661094484ae263c8bc0613152890d17b1a09774
-a16fec15c779257a9038a6b81ce29162050e1fcdfb9aa0c88dad199a74470938
-21b4585d40e628823c42a45bad0c67427ae3dea6367b69d76820550cf3b9820b
-043f6c646cf42d20f1241d0ce8196b2c652e9e10278545cd289bcf37c813fe83
-1a437c6e4991750aa4c7970e200b86ec8e26657deaf058e633011946e8569c27
-fa7da592b78df95c94607eb1779393c5c2b4de50c425384431505a93cef43c13
-e042c12a57eeaa2c48d002369aceedda1b7866c865c8f043bc4e50d824d2e312
-04bd8c1a4d01a688bb2133a4ef37b858fe1de27fdf8e5382e4a3f323e016e151
-8b1da5df2706b1d76b72db59fd5753e23b41306070650d6990cc2e7ba3014d2f
-fde0d8e36ddc3de6917bf3ef03c84f8eafdbfa7dce1c3007bb57c3860f65e991
-13cbca57852b97ed21a7a55ea9f0803d13accab45fac1e4009be81d3da217dae
-45b421d6a76150d7997de83c0aec3d7c09d5e0cacc5678f2834e21c22aeb8ab7
-aa20ed2112bf7d3583cb287740f2e6f828f9d07385eafed61527d19055cdb129
-e1e5f1326edb56d107250346184e4580fe83bf44e2343cac0f366e04dc9aba72
-0261224f33ea17f779ca8532400edad7ac6a5868a0251b030360b1ec93aad4dd
-04caa52edd01246e2e275f007849b317394f9ef09064dfa18fd3c0b32ab4073c
-855cd08ffd407d937292f54b0857c281b0d7dc4ded8070d8616e92faac8fdecc
-710a60c61f88319733d888795c8b45ed895fd29863943b6632336aa49c2fe365
-752b6463cefbc1fcec8e8ace944ba4d35a4dbd87a519eb5ce02348e106c3eb9f
-a57577ba58e7d357e55259f182f72c426eb9e12daa1cee7210f75cd7519fa1bf
-80b5b2f3bb7eef8348e39c270336f4c96a4e458f71699be5eb94f26d0c7ae5a1
-b815789c4c038cdc8285c6394b442ae05dd2322f5aa943badddad4449606020b
-f0f63647645d0c1cefe0a0e4964c2f2c9df5754c5d671182d8e15774752e06e4
-f9bc5cb91fc5d31fe4fe2f9bfcb53b920c22ce8d0c244851c9433f2d8f9d00be
-47a03a8d4246ed7a9a9bf27235f7537d071a6208b6eaca1b2b6c7c43e4354a23
-b97ba4ecaa7d93fbb73a4bda88c406a9a1fbd9861252f03b2385c3517c321411
-2f968c018db6e3e3de8246c05da9f4dfa2b5d0f2cd2fc3ccc8005486b9c1d1be
-e1e8c14ffa77b18c024a98dc5a38b6b0e057d80111e7d2296414e87276c13da0
-e550c489381ec3da91eb4dcca6affcec210ecee0c8911fd338b9dc590d17896c
-9f96dd780503bb15e0638db81ce3f26b1857c3705fed78959c83ba079e49fd0e
-08b3a60d8641ff061398f779498633441313aaad5d54e4b3fdef4e0ce6013b20
-f17c6b7b1bcf14289c52cd55b0c456a69960f32fc06077819f32bade75c69b23
-bc97b0dc78532580f9fcb1a7d13b2dca90785a7e958b579d397a5df187d4b0b5
-f76282b4b00e94c92cc3653a047ea5a003a72f2fa4053e3e9098f82944131394
-8c471657767911fafb254abb22cb50693c8c644096a922069e2e2498d230bd19
-4d2cfb8086eff1761fa2b13a0ea61d6ee0923c7c4d31897eebeb1d73982e21d9
-66f303ae3ec4dc108f8ff4da3bb381be3f4050d101d37042b11b314535a1c370
-1b3dd8305868241efaeb394ea2d3efbfbbf3cadaad79416bcd47f8c19cec479d
-19bc73567bfe6d55713ad85a42337200752777a1af0bdfe46bd53534c4fee290
-c23aa58863bc3d0f1afc9622c886244c3da73f429f8a130510505b554f1688b7
-709b0282c94e36468a0af39d04fe42825369197784a82d13011cb3d193bc40d5
-5ca5393d2b32c57abbed3a0bdcf6f5dc0bf26c97aa46daa4269d6e2e104a78a5
-c96a39b4b121958a0e643244f646480b348563e417335e5703c368081c178054
-293bd69b1d6de52d140ac2dba03cf45c83dcadcddc046526b004373d8aa9d2fc
-bd3b354ea1136b0161a7de8ba06051f3cc22b028a2f76b6780f74c5509c49268
-0ac5e71a1578e344dfa147d4136d57a579bbae76a482d742b44ca381a96ee349
-613690f1a6f8bb1e8af1df6b2555681485122512162894c2e85b2b9a3bf5628c
-2a7d925e263edcf66eda45022c012d0ae52faced11324543ce842b5c6349a832
-d91999d162fdeea3451b87671f83bfe321726a6244d6f948088c0392d140d0d5
-5931ea72d9f6ef32bfbddc2fc6ed0c50decba208beefbe2da0f1b6d918f55ecd
-be29f3017d358dcc4a3daad96fbd6edce1a0144dcd3bac07d163935f8580040b
-426a9434da7a234354e273f62500f88237cba7771d4ca0f50a506f07b7eced7a
-6704154a7eb342bf879fc79f7bc6c488a155fadb56df553ac0b5546cdf3a167c
-528b6ea5f65f0e02c863a738ffba4c4a0fb67a788609bcea6e504547c6e66cd4
-45ac2c76dcde706679ef2d509f7f45624afc984e0a3f2bb2e1d1364b038d214c
-11260ea09afb681a4fdea1df8aa130bfe08ecb071e7fdc72c90dc1b114d81935
-92e0b7a609fe06b2c805730195748a02b1879ee6e350c7837c109063628d1f76
-e39e0b4fd212b2da075c82e052a9f66be9446c306a956f412a39fa903e430eba
-d831d86c7f66765f92137a8cf309cefde84580726dd922a4defc48604b992684
-a793c7a25a21438dc7eed60e0a0c82007888457ff63cbab3184d5009ebc30428
-b5c1359c3fd71ae27bccf2be4eeabd9ad709ac34bc6afeb60c3afecc39358bdc
-5b56f65b2768111635621d7797882dd1db755d26bb2e0f03b1a8d80f902c3960
-396dfc9aeca6ff7d42e7f6b4f83d1f217a68f3affb54e7e9aa1d0524e1bab538
-3843852ddf61b2ad706af3d609a8d1f841f9e9d12b1b0f92f3b47b0dd0bc5f04
-866528c0f63db3feab76645cde31f0283fb8c711fc34504697fa0cfb8cd7b150
-172cfc93d64ab6a1da1bc96d501d49ac87cc6a04db1635c167a1fdb58eb9e3cb
-94c90d2f9046890700513232d5bf1678651012e2f817114f46a1019e72220d7e
-d216d12712bb8ae73140aeeb48a3339dc1d5a6efac1e8f50c92b58e32725424e
-ba86033bb1bba686695cedd75be66d54275c8ddecbdcbbdda44f595e6b686af6
-f6117bcef51df5e3c98e90171952a23f445c2bca9b8626400905fdce9e0464b1
-c1d241ae619844513e9cc3a58a6f978089d209bd775438d7b87108a342c76b62
-8c3a6a28b9d0c42e696f3d5908cb2c70d8d3ead811ef4dd19023faf86ee053c3
-014ff20983774efe8e26646abda4954ead06c80c7670
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
diff --git a/lib/fonts/UTRG____.pfa b/lib/fonts/UTRG____.pfa
deleted file mode 100644
index d9fa0e782d..0000000000
--- a/lib/fonts/UTRG____.pfa
+++ /dev/null
@@ -1,1126 +0,0 @@
-%!PS-AdobeFont-1.0: Utopia-Regular 001.001
-%%CreationDate: Wed Oct 2 19:10:38 1991
-%%VMusage: 32987 39879
-%% Utopia is a registered trademark of Adobe Systems Incorporated.
-11 dict begin
-/FontInfo 10 dict dup begin
-/version (001.001) readonly def
-/Notice (Copyright (c) 1989, 1991 Adobe Systems Incorporated. All Rights Reserved.Utopia is a registered trademark of Adobe Systems Incorporated.) readonly def
-/FullName (Utopia Regular) readonly def
-/FamilyName (Utopia) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle 0 def
-/isFixedPitch false def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /Utopia-Regular def
-/Encoding StandardEncoding def
-/PaintType 0 def
-/FontType 1 def
-/FontMatrix [0.001 0 0 0.001 0 0] readonly def
-/UniqueID 36552 def
-/FontBBox{-158 -250 1158 890}readonly def
-currentdict end
-currentfile eexec
-fa444f2716d92b815f58ca9049c815358e22e32e73a3e6a653c538ee56873363
-67713b8cab082730570f5b5efcf34c2cdfb6f8dd2b7905a37c1924a2424c16e8
-711db76501f564506b0f45fef10d83c3e3c6df2dc0af7802e7f42c81b4243697
-ca09088b868d983e79e4b2c3e17321993cc8837921fd4ff7b92a1294c5ba33e6
-8fd40e63df624b51865721e034f71bf57bee0e0c2a9c169c7a626496540d45db
-585d2bc93f83e6829eacb859a194d7a57904cfae75e6188c7121003ae40153f0
-0fe6fb52f339e72d4aef38469328465a3bf0ca1ef58dfb447612eef4ada248e3
-ca525b0884971b85099d73538152affcad51d03eb4060a5c580f453ee78e5c4b
-991f77c6e9600c135395d56335a7c3a75c0341979d6b404ee496214a5d20ae06
-e17d80d37bd3540b8fe913bae1674afe37d0c41e3d9836a7b5147be32f9ba01a
-df1a73b89d30bb595a4b279032e37c8230b6d4933065947c3e9150d2c7c4d439
-d60197eb69991ef059edf886ec0bdd28158a71a2df96dcb67fc0bf81c34cf27e
-12d6ec950a75993af99fbb040af595134198151e7361672d8538cfadb4716785
-dbd48da442ccc911ae9157b14e433559dba1a1c5619e99b57274d6998eeca3a4
-7e804d8fe3a664f39f33237831385949a230a21e52a2dda733f2f89b02ef4ce2
-5d603c9bd2f8e4c0443070940f0380dd1ac60ff462a9a71965a79d787e0711df
-0a69bd86a4846965ac6c77f2e1699c4620c1bd9f5b2263e13a2213631c55f7ab
-cf60d2e63a7830d5011d9b9934bcee2103f4a5d56942ce0f590a15dab480e5e5
-723afc8e1d8d96f3e0d8629b88ee477ea6cb8121b0adddf20405f8a32756004a
-8a59b2cf922a6dc0747bc15e99079aa12ac0d9fabf8b47c5a61ca5268e01317e
-1f0a38c468ffea597a392ae3399daf7c03126987750258b5e077d703cdbe05b9
-a5fc4d80e8551c2c06a2c579272877fd462fac6569a7a9f964797df79628ba7f
-f77447fc2aefb25089ce946e0aa5c5ff21370f0cf84d8e2affa8b30891081b16
-6fb86fdfe65e7e02ee551c6b3e2e324cf7e18664883dc538018ec8cadf7093f4
-a13708013d6ca2afdf644c0155342917c2725598fcafddaf8807200682fcf04a
-4efd5919c21ed2ec2f7951c2db953ed292a54783f5c541bca68d305b05df5c5c
-f17b9af31035dd8a77ed8b54d4de7d684f54c58a28f0dc55e7c692cfe444216b
-18751c24ec1c8a00a5cbd458a0ad54e7c13f26b4c4257fd992fbd1338845fc69
-6b97a2ee6a4d4f03fd387e745eeb8e97eb67e40bacbdf1d6c08e9fa2e317d30a
-c4234559096affd5b2e65602ad9c4868e24d7f1d35e8b6679e436a010be5ebd1
-52666a26ba7f7b68a693add1d21138ad64425e9202a043cec98ebc182c152b93
-9f88cb8c89069b72f3c264e2bea7cea9aedf1a8736beb55cc77b02e3989e7013
-b4fdec2767194fa85b1aba185aa01fc8902209068fadfd1d282a59f8b1d7e30e
-3829383779fb9a28404759c595b986deb7c59d315023e542b461327e8645f440
-3d1b571403e30d988d5d17b09590d644cdaa885cf36881602f220a7891130e31
-2ed47ee703368c5beb240427e1b30446dae522143ffeac91f3bd6a3ea5c57a63
-f81919870daf71d9b522529438d5e51173973f612b3afa5e4c5c042c8a8a4ed8
-27d00b1f5a102ba8a11ee7d942e1954cf35b875abb184df026b1f600b27aca0e
-4dfea33866de9d8b6b8829c128876a2b882b1aa1518285d87de3c39bd74863aa
-229a0108f3070908664f4f77a62f0e67923d844c9ef91a6affb8a72606f5085d
-88c35fb9e8eeeb663742369e6b0ab87c82e3eec3dec4adb2098cb25a35d543a9
-70025ebe038e7057a8d0e8f7b2eb86418dc39b494884bee8c92c87f1af4cfc44
-c14a177f200389c0a23c24ef1c59e9a143756c1ac0ae50a12a82228faecf86c3
-4f7ba61f010a0d285063676097c7c3fad3b19479c8c50d712b48ab99e4858096
-a1799936df4bfc4169e5544adddf343c7fcb63e83e2b2b6eb68c8a33edf201c6
-5d89e5b0c3d21d1aad02bb07fd463f763c09dcbbf7c216b1554a9402a8eeb5cc
-9de4edf0753d8882ad183a9d14e2de51fd81daee2ddf53745a076dbbb790cdda
-4b25bcea0f98d832886f26bc15fdae9ebfe42f0a95b7d02c0f65ebb1fa0d730d
-a1f6d63c3da03f9ee0961f5e93cf943915e0dae3147e4c100fc97859f1db0e39
-a85a06f140305e9cad70247718385e9151a091aa9a09552c199e3ab164f28270
-fc60a08b30ce11e5d115577e54b57c73b2008fe0f9679cb7d60c3c80b8e63cc1
-046a093b0838c832125c9084c9d3691fdf6236f1e4b2cbbb4ce8d898d4c27a97
-5f4eb9ee7e3c2d1a694465a632356ac7c06abb42f89eb2791ecd146d29fae767
-2f132e065ae5f5432a5705414049f68b871b55c409ac3f02cddb56deb21c8d4b
-202b93e8a5f22d09b287fde695e9beab9fb790fadf1250dedfc8188b0a3975be
-db8973fd1ee42841b2bf6ae539bd46d0339dee6804a92a0c32ca204ec9897f76
-95d04cd16c3e09f37306109da8b55b5c69660682e8328724655f88a08f11f9b0
-6d3f1629240662f0a0ca024f16265503390d9adf8b521d971d419a4cbc15d322
-1eaa0b79e4a45d2f0bfc9bcbf135e44b937e4bed0a4ea896da90e40bd793ff7a
-d0bf85fed6224690f801cd8c0100c4a79be124833774b86ead4d58bfd2598e52
-6bb5d08264df1c4ccd29a918bb27d7c75d0fea288e066a74236de1828a0c9fe9
-6b1de344a4f57ff0997707f9e83c25cc5639ffcf2cd01152d9f676a80c637a69
-5cba153263f8c1d93bfc03642796263c3b460b1fb22fd4f63e742064a337d1cb
-c12ad7b5c36cfb0a62341c849e97ed8a6b5e3e93911dfbe3795f9debeb3cf7bd
-6311ccabcd1d80c76d608e0366e23725b4c27210c788f25726bcb13149c781b1
-3e77341630a99a22cd95717254844bfd4221df25ab740978011a301861c4f0cd
-cbf77e1b69b90ecd4aba88d2c0298bf525c4f6f0be9d34d74371517e485eda6b
-d38374ebc2ec4abd9b7969b426b40c356982b735289f80583b377ebca2c14068
-77d7a6516135878a18deefa530a88685cf0bb9ba03c45d283510a68b17853cbf
-c1c16428a598e078564a8d50bb1171771ff483ee395ed074d7f524eb8af23061
-5b30a01122d440365c7787ff477ce068ad1c8e4f9a409199138cf49a435326f3
-645d5e093179b96831b7dfc926ad11a2b9bf2ed3a5f4ad135278dceabe5f8aaf
-298bcf406c9c11cfb55400fcae95910ea7c09e607a1c2447ee82ce7e3faedbdc
-2b1827ec539eae6ae25927a35be1aa6b7951073746e5f684f758fcabea3cac25
-f608e033b3c92cb05b7c9738d3a6d2cd5e0c2d29b968ed7c7bb43d7fe734a959
-7636ca80ee97f6d88550c39d36db458997a98e8bef087c1000add77f8c6d24dd
-2e0f6f4772ef61c5bd5148c3d67dbe77df27a300e5d8c9e4b325a6d8cbbe8675
-15ad15966b130bf4499ea1923bef7a9047eb1b0d35acbf0b8303fa08b26c706b
-7368332adefb42b66dd9ccf61fdfba00b5aee231c2232e8d752703b0af6ae850
-ab8274563f8fead4bbe9fe860dfd95a6a7e0cfa3d8f6ebd0e066cdfd396d8c57
-f8f17bce0c5678649034a62418dd2463b8f963b43ca02d011a9a1ac4aef9c9fe
-151ef8c726e376158dacf1131f0ee855156d95730d3626003e51983624b417ad
-c258164ed5b2bd3d4e562f16da8a0b69871787cd9142d297ea3fadad3c2c6dfe
-3491c8313c2608cfb1d6a6b21d9569049031b0cfc1d9e96a7186164e04d713a3
-2f1350ab08811688619335e7f331cbf390039502cfa7f68ebcbd75937862add8
-f0c7f498d6695e9d48c4d3e07753062a992675f1eea3cbae77c7bf35433bf424
-45aeaae7876749942982520abcbe95a7ceeaff412a02f6922a1e6c05e9a94d82
-11db8144984dcec1d1fd6418934a57338e070b19ce6d45c0f861e429b3828c9a
-c98821dc4ec4d5b7f64cfef16380c478bc5a0ea0c4b82d94e3e01067b3027c73
-e93899ee5f37db55e0be88844dc7c5a538e43510a65716320dac3e01e164fe26
-3406de45c19c250cd2a9c3bb3bb7cd5fafe16d9eb7e00d012b65668104a68eff
-bd0c11b55497378896ac50abb47a6daa32f7c21cd34b19f3f797d883fc8745c7
-db21a910abd7e9733239c6751f71b126bd8e26f7cb16bcbe5a066cda9fce63e0
-a9d40a9527bdca47211648ec231d0aad9f4659cad640181b76d6b02309365348
-4e7e328bb1f7280ed4f8fb571d05a7a55842ad1dd294cc46cda410160f2f7c09
-4a34dbb0aca809a6271c8fc97f4103bd83b701f2f474e0bd1e7f37fb7d898e16
-6612f9b03e25bffde2a8d6ae1dac8b7c28b67c371ceaf8020ffc9e1e35973dee
-63cfb07a6e3eee03799b4841d195eba565c03e10998fb80fb279fa123c2e8dae
-94644927b473c414c1fd0fa0b359a279310e23fe44104f0988de3345d9aab3e1
-e64dd94ec8a6c20556d785e7e4f4bec46c0de73185fdf9a84c6f46ffe7c52c1d
-c7d62ad792987dccc225abddbb6fed504864476f1e8d0e2ae009de5f4c50bc6d
-8d3902c6c169cc0c2008dafeade6308daa473bc4f8af398ad4a8300f6b989271
-dd59f6d52ee210bab4028b4160979401ed9f626526e43b2362ff92b208a29b04
-8110c2801db3a59f1cbb89139c80bf025d45d61b2bbb6fed4456089976a94d82
-a094aa8201027413899a402050ddc0421afe5d357a8d8e0ab398e01da601a0e5
-1c6bdb86ca2d064b2d8af3ab7a8d39a564d2c2cfbb74f62aebe4c9cdb668909f
-2d83bf84894edf23a3db2d3b4ed77d091f21ff313c67a0abab68e57a541942f8
-58ebe5334687a8dfa0bc1eccfcb1b793d5aff3d7479a72ef70b3490f7ef3dbcc
-1beef6d171dc7cf8acb25d04181009407b2d61dfb7de55cc433272a46e86a74f
-a8a5bc69419e54c39220b7b3b716c5c4cac5313e4d8e1389a2217de9ebc0a4eb
-f72dd28b7b2e7481457123167f2a138a2a9ab099706c81b83e3a02a9f9e2e321
-c9658c611fba436a649d72ab9be1707e3711d20e15d778bfeeba66b09286be38
-2f903ec637a8ea274ef8a8c488c5cfeaaf616fa0e090ca2c7a767048b6086dc0
-ea0e3bbc8ef9d01a74cb264b3ca824f0d6ad786127c61d0d8ad13c31e5a25555
-ef5e64e1d19d150d24d1459e8da3ad799fa554dc7877a417f51dd1a3a02e7341
-51b6cd7a2c6915127017f748942865f30fe048b7e749bcba0e015761c0a9e1cd
-e1cbae4bb1807245d7547f062a05c1f13a753eb6fc3473caf620347338bae987
-1d2bf08764c309b32b0c915b4735481e25259f53c53c144b8ea3e8c2a4dc2725
-85e197f684936c0690e497653a46a7b86c7e57b8f4c890319279034cedc18bfc
-ebe1828d23cae6d1fa854149d1cde376470869f9383e83ccab2af11c2d35eb8f
-1bc9273cd399c7e8478ecf742c2db209479460e310f8013f1a64a385209d2e30
-000d71f5fcf62f251989a3d852b9c36e57273a60d565aa387236f61162e46821
-9f755ec5501247ae6bd14644106c04f36662afe7c3cf741664c6a4789f3f8ce5
-baf6e347f6564be8d6fd92ba9bf04ef31c9fd60a2650b1086f9a244a113d85e9
-405dcf23e29d7b46281baf01728b7355b8a1e50febf4443c2d1a2560cd47d652
-cfec6f5cbe060f8c1b20fd4720ed00186609c40771ec8db4e7e4434eff8aec89
-007816aa98863f8f8fd3ca454bc228bcf4d2522d948ab346b5137f1cb52b5a52
-3877acaca92215b9fba427112786c2fac9e5b57879d28249d2d71040aba21fc0
-f73498c856cbc6c5a5f25bbcf19ec97768b8ee9aad3436536a9ff8f22ff72206
-8555d0356ab16b1fce02b79220323bfee1ebbf156308bed2d91febd3f3a13927
-be4d619c75ed738dc1913971fab9a76bf697c6ce9db692d0495abb1034fe31c7
-23eea2feaee80aa07117c16008a7b5e00a13fe2dba4c4e3174762c28da98a191
-0d15eeef183cb994c829de35324614301a6e98311d9f5f282d28da1b485997ec
-41eab629352822a5583d307d6d417b869f6dfeb158523a581557f6acf91c4f28
-ba0af9e428099b152946769932a190410319fa3cf1274c6745ab16df56afc3eb
-4e67f521dd52f3e3b38e41d0055a8bb6f957817850d693f76c2237f78ef9e660
-9ba5ec79bb0cbb08f461991a7baf70e3f8c8d619c0ec7d3d7aeb964f2e8b7113
-8e9868c98d8fa3a5769147fb72bb82ae844c1331ab285dda9df924cf36f2200c
-b0c4b28f19aca7c4591413c8e89ce410d469a7844af4ad00b6089d1efa64de2d
-49069a4094f2af0552b68fbe03655686cd845e46a319cebb984fa717b7fc2565
-4cc9843d079512d8ad6d58d55332a962c7b20514d1b53818b47d028b59ec1176
-43d3571e690531d6980c0bbf2150f5afadf3198dfc48995afc745a8fd0b40b7b
-d48c00010ebce60dcf13ad056bb53ad3e7a3d0984dc28b8b4aa109ed4d62bbf9
-9f7be92fccdaab5c52cda9fdc972e55a933b2c4c1d2c54ed5d88ec8132d0241a
-91fda05af2a736547dbc1da85588b04ac56602cd9335d9a31bcbc50a5e13626f
-f86b9cf6bf32d2a5b6c4a3754f9447e2eefdb2207e1c277794bfa5defc88cc63
-1ff2093a0100c2db33baeb231846754a10eafd8640674dc03d737446a345eda9
-fa03143bcd01de7aa1486de001ff31f1f7e67681017a32dc46f8a9aec6cc0573
-4a0253dab3476519de29344ad7b0eee93d0e4438bc852f4ff4d018a690781924
-1730a369bd2312732816efa8000f0b30e8d19b8551857eba645f76f38257d96e
-4088b20e11f5485dafce80ab03820127a291acd4ddfadd039c03962078aee0fa
-6429e748bd3ea0290ac67f1c14eb8f63cd5b7f4a3e61b91f3428a73509151784
-3ec501946e468e8b68374ff8b0560cdd38f2eeb263106ddedaf7d54ff1ed7c65
-c9910de2993171eb6f5d9a4f0fc3368d6f6b5e57e280fd9c5c1969cc814d46ae
-81c2ab001f03e1aaff8017b6d7e84cdf0e3a747daa3d2e1d674cc49c8049e8f5
-8914f54313f1084396beb5defd89dfd0d73ff6ba76ece9939b988bc5353f221b
-e4bb40b79c19612319d196938935747e96030a5df12caadc7afe24878a2d6e82
-5230548f931259546b44b4460eded3188fd76d06a2d0392e2371036401e9ba72
-a14e50d6aac474d148a40872f222d3d3ea322c37aed0d04cbe2551e513e40943
-04b30dfb33710c66f3df8e24296604bb84e3e498200d942bf52c452f79b855f7
-bfc47420a44f80ea16be3f8e0716695d20ba1d28739ae88c04ed2848b70d7369
-46734ecac041a14ce87397706f1ddc57144b7a61231a1d0e458d3d6d014ce66a
-b6e37b46774a7a9c74d6a5b636303d3002151be679abfbb7399a0dcae5bcb5d8
-7c84bbc66fa03df92d4f5ae78e85313acd62522caf4fafd187c553302e692133
-f7971b24b92b9e0321f93e7b747bd6ae5f51cdbb247d36255740752549bcf8a0
-09e774a01bead6ad931c11453a179e0ae2d23c09acb7b2bdcb16fbecf07515da
-0ac8a4b2728b3d5c8945aaf10fcf770008a0aafd33c402b7304f6b203d0d6a7a
-be7a27608b10f9d67c39f5fa2c09ba5900f0a6e6c6bcea1a0ca14411ada0a36c
-d19c25ddd2d29ab25d4cb7dc3afaa0f5aad7e22761863cfb427fc4fb8c991251
-31cd3376c227747a6d3afedd341a4e6474ba273e687640eec85bae3bc83d762c
-3380159c2af1dc118fa1bd2382d339c5d213bcb89e89fc8241707e9bff40ec4f
-85a889421643ce7a87953bab67fda678da5111da8a95f29290ef70d672f0ef5d
-ce90ee85275392766ca752cb7a2bb9eb416ffce5166a955bcd54fa2082d942c2
-89a0fbac57b9cde759be0b98d0e6f5b51c7dbd6331730a15635edf1a3287c679
-61c0a248578b53559a3d040f8847813ad1d76480c43f4b674bc0659bebf9f1f7
-e8cd4acdc0e0fc27104601abbf25304f8d5aa221e02e73c37868baea6106e069
-88a7b580b091e6c4ef56e0b52bf9055039d2c3de83c3a6d4f8186646a6e1ec4b
-5ee53764f122509d63e339c51b15fdfdade4cba2880c66bd607977684ad01aa6
-d405553066de3d2bde7eb27b332d5bd0371881eb0a9d2c2b7728f827444a13d5
-758591eacaee4121c2a00c05b58357d8053d2223490b5124fa646965a0ddfcde
-0f99b41916f8f80d81970753daa6079aa0014e800c54052e01d0861a7d3add7c
-2b542695ad2a3d6c56190a170d23bb34829b049e2c02c69e79d597fb5d2f9ce2
-713d681f072435c8e3740fb61127f5d3bf4cf1adae5e99e66a0c472076f476c6
-171660a613a35eae2d353cf78a06dbe7dc227dff30a501a547241c6cfe8123ae
-053293e9ed0c1bca42ceddc775a9200420a37ef81552b721c077c005afcee2fd
-fb2e9088451e0260fef0be7dcaf9d0e4eeb3557241bbe429583e4fb813fe1992
-1ffec808630e4b3e64cdf9d2e664802f3f0846f0216b8422245a0363a2a6ccc7
-3f7d8b39438246611428c6c32584976b10375003469fe0efd968e21319e382f7
-50c386b57d7b7e8e4b5dd8dbdb8d816ce712bb7ec4d3a2ccb6fc5784c066f79d
-f9fab8f575b42bb18f22a7f2919364c61e81cd47d0b121bc0352247ad8d83ec9
-36891e106f85e8fe25efaf00582095dc7f16dc48b3cfbc34234aedfdd357643f
-79cea8fb1fa81b91b49f8c063fecaf8b8bf0fddd8f2063eaf6464de3e963acb4
-33a3afa3944fdcdf61597fc7d6caa8e7538a784024ed4cfd497ac35c6796fb14
-65aefd0498b994fca5c74c003c6ea1d6c8f935df6ef5cebc5ae7024986be09a1
-3a368d9da9061aa8ed1015a60778e63640addc44dcf2e32bb1d017f10a319f44
-fc8aaad5cb149ebfafc0dfcd665b07f6387f4e3fa9273815a7c0e87390b89964
-18fe077d8330190a04f348648e1eb790cc3cdb5005afa7dbeda6e102d848e725
-ce4d4a9a9e7dc16a9035892a73bfbbe130b8d059e0282693ba7f062ee031cd38
-edbf41556bdc7c34c6f2547797f2b4b202fcea7d6c1f6d6a890dc850549e2d9f
-d4fed66e6a66f93ac27cfbfe938832d17c171729fb0eedb5befd2d07fee6db06
-ee7d2e5302904d0ca4b21b40e3ed346e6976024f6ddf05ab1b7a339c42d2989b
-8afb7447b2b772f3cae03abfd55b1d14f412109e7e99057c66ed1fc1c842e336
-8f8ad95e67626219b6d538fa55e6146f7c4d2819b6ab69628d3f918d5c21ba65
-6101700f2f9b5d5399a1209e0fe5cf62cd4dd8b065abbb2024b7766478b78d89
-3ea80e633d445a240e27c7671018dbb01e4b38beb85ff02de34a4c06a092467b
-2409c7a6f7d94461d55073a87ced3a6048ee3b688042bcdaf6d4ddbde6edced1
-7c0b7a2317e60410453cba8646e00976bbf1542aa0614f93a6a323de99774176
-bb2babb068c8c29bd4e4cb7f8b3646ceaddcdb611215a5ee9e61bad78d8bd5ff
-f66177e2069d7b4f87c6fb13a61f2772e8632f158b4f1cadb8e3daf55e5df78e
-9d50a27bdece942f579490f570d3eb34cb69203627abe7bbb6c5b2323fd8fa7c
-1a9271f36f727ae3bd9bf660514a052c86625b1245e190fc91df37b7e6960fb5
-1396405a4f2de27f7146ad45f9e5e14755985c189cda794fa21d336354bedd98
-14ccc92cdecbef77ee962b78d053752a22f5ef66879af4d77cc798b2d6579d54
-9077dafbf4dcbe07c70ff56070ffcd869bbf2d96271e461c5432aacb7935ac07
-fd239929e5d27e34c91a785fdcc479b84a99dd3db6711f1026a613d24a6f5de9
-00e4a410ea22a81b1106f6e11edcf83a3a9f3adba5b22b129e3d8f30807303ed
-fe50943d68951bc743e7391d7aa1672fe0dda7fc8a6c2e87aec891a6d8ecc050
-03fbb9bc38114416c4e330c5b7b43ace475f0c8edc9abdf5fc137c9e07f1f8ea
-bb13365b3f7e3dbce2afc9388e9279136ec6e0edb289beeaed74370bcb453884
-3ce1b3afed75a47bfb50b7bf4d267b014f2480cff2d9e21685a64b5a6fad8963
-1d5ccae56079f4871aa6b9b6a7ec8982f266b6eadc060087f2f7af187dadf05f
-c31a47b30f2a250fb501f4faf7e18c3aebff55fa08c74ef27d96aae869a26b2c
-45ba8c84b958db1a7679ad0e6bd09c498543e6d20691b072d84c6760c70e8e90
-ec179e6d00f684e6c2d070f894b98d495cf2d2978b96ea13cebf5c8b9ccfbf05
-72a00358a8faa812b00c06f2ad40237839f0e2ecff57d359a2c2055a1361768e
-f816ffec8254c512e3d57ebb23da610fdfd5e1e16b97e1fe97e10a279a203e6b
-b52f0be0ae9742d1a7faf2a0d5d6e1560d6a3e8e1596fc57a3288fac6a541646
-5ad8c50485e42cb5214d4dcbb82a16c2a15d406698ddefbb5fa3dab291c4020d
-52b76c9f0c91b5516143d99d82611eeded385015cb53e07a30bab7f27f22ac73
-95210586bd245bc0d2366952c1d85ecea90e68e189fc313823433321d6ff1785
-0d8eb6f1e4f2f6153d84b4b0bf198ecca9c87a80dfc33977a9b06e994bd86800
-4ab2f317727243b9c9704fbd88a0e6fb5ab8c94f38c7e20daa078edaa9878c8f
-3509b2c135e9801c79500327adc9537318d0f6b700fe99166d4e7c8f6a41bd45
-6bda6719e0ea158b8aa25e73731e02d215294d91f44985ba21d4045b1f8dcd99
-69a0b36e07b3c7534e9401960683ac1696459b2a45e0a4133d630e5bc81024f0
-b1ed05e19a6991bcab03482ad446a1d542249cc9e1f13e091508eeab9f744a67
-85e3d64fa0c7c79275292a4284f62754d46c0835e432c3a1776396feab389c20
-775f2f94aaec26813eaffc4d1e6b4df16f7b25ad9cd3e8645dff53a354718283
-e6da4a788dca6de2521295f51bd4b41d7b1f06c02f9cf60ad1136425c7996c55
-a00798c6f180ee8bdf52c71c01b48b3798eff89600b2281d68fb2e8567d61d22
-9b31ddd64b49fd662131d12bb500ba609e2f298c237b90c17c4a29e1c4e75ad5
-c1631c7058f7aa486b9c19c760b2bbae67167472490d537d14c9c70437d8a964
-fa40effa6af2862db37b5ba62da47685971093e11103228b85a6a0acc3168486
-cb4d94f0b1b01bb35ff617b5b36a120f82f783752079b66cfbfe2088290ba9c0
-cf8255443a6230274299b82c7e0078a9435c2a48ab298954043521391cdb627a
-efc038208a97a62fefbc2284290e83c78fce56f1f6aa31428092800897d6adc8
-ba2c0bdb767e9b684dd51cb44dafbdd3f084b3ded0fa1af187bedd1e7271ba2d
-9b040ce2d98fd7a56f82191756bb8f582cb83ff0188350d8d5451671a2bb3478
-97ee71a4621d366d810945c790ec3bf4126eee53265a2ddf2bfdb8cb8d78352d
-8032e0b87fb87323d4defe5c5c974db8cf06203d0cfd1470aeb474dc0fa2d32d
-e1ac57cf43f5dc2d2751c84e10a5055ce00c594a0dea8c1f65268de077f06ff5
-c8e083d70fac84a5605eb80c81bdeb92a65fcda58979a93566b29c935b3ad83c
-a1303afe4eef046c2ed3646c0ced2e1066d4eb7f5db11f171b2440a0ca362253
-20098d9388aac930db7be1cffe5d6eb05dca2a6355df026393b99ef5e3cd70c7
-c82ee1fe5cd113766bf011bba63e78b2ddf4d86519aa68bd991d782713ccd2c1
-3f2eea70dc273576aafa2a0d2ed22e35f246e92d88c907425ad6843abbfd75e5
-78e1cbd1e59969cddfd6d26f89e617005718492b51442c55fe617da67d8ebe5f
-bef9bf22357a125d611e04d9e5e28d5178c83e2c3b073c205d7e3a792d4d0232
-c70e596680b5947e6504a7aa48c67795a15160d49d40174fea72dcce9f97edc4
-75d030d02347961b7d725b78c7024f98aa0d4fe953807b39632f0d4531c6c1f3
-7062320fb655447c355e55dac7faed0643d33f14cced8ff7398ec85fd93bef6d
-e6032c7689658a96cb9ddd856fb6c0a4be0fb15bb46c068673374bae1fa73bbc
-20dcaa9398b526128991d68eadf0b90bdfcfd097b2f858363d819fc6ca7fbb47
-6aa237cf38daa9653b5877aa322e3039f86bf54ca078c55a35301fdcad322d14
-8e65067a0e48cd62cecb0d7f50faf272b51c6d0a22c402f0df1373ddef2d3c2f
-25f3c636f9f5f8710bdb1f5998f2040b7bc4bf6dee428357a695e5f177feedc2
-be6ca3d7456f4fb7b97803df6de76aa4bd622cf080800628d35841a838371511
-04623706136658fa3cfacfc116a30542f8825d80532454675cd5c9ef6640dc79
-aeb9c37a0691d14bd260f58995b7ef2cbb236da7a93c042450d940df347494ca
-6d5df95bd04d3077b47926e34610583984253fa1cbaf4b0d544e71d5f7405e49
-41445c23b0a1c3c6882254602d0ae6582f64dddd079f2d112b0dbd31ca685bf3
-dfea6d3f310bea2b2f4cf4154cd37fb19016f703a1f9a045c7e21cc994c0f23c
-5e4a49d0ff47deee398d478302cd0c90380885ab4a59b6f3d50bfaf00d9e7f3f
-0b97562161091b4eb201c7bcd4d1cd239b00df09d03836a63e8a9419cc9dae0b
-493aca2a7fdafe0ff81b6a9896c7e57faf1355fce5f3d54afe62c018a5211fae
-935f1f9795d1606cf77673b699829c9a136c6534438ff817759f8684d5345417
-70f6554539184ad886156fd610f331532d0ed22685d56ed02fa51e265ff34a1e
-fc8cb40b749148ef80016f71cb0647e1232b7450237f686828c36dffba04aa6b
-46a526e693da4fc9e2c84d7245b76ee7dbeb360b2f92b112de8e5feb3e433321
-eb67e59f3a41c7c91e5fc51e811b2ea7a70a9562bcd8fd854d761ef290ca50c8
-16f3c58d8e48d13edc3ba242c35ca241fa15e6243aab8f4b5441cc0cffc1c9e2
-7729da8ba3fe1837504d73bb13ba53ee7029aa5a1b137244be2d16ff3ae6cd71
-8151c53d223def6463c124acf3c37bd5a42e4ccfe3db5d3a22f249d0a5cf59ed
-ab67a3a6cee4f7838314e9e167d3ac722539c6a60e5961cca947c8b9d818802e
-54162eed974283ead7dd09fc33bcefe33a78ae540a98fc6710011f0cd96300bf
-e5b9acc91af99c6b38d005481771655d1b89bf8fc5fa8d682ac36a54753a106d
-6cee95baa71b131786a76f6ca7cd143270f679c91635822a4a2285d6aa44699f
-38603c3af88b82d5658531bf36ff97bb959c44345f51ad2c990347d7f803c2d8
-3345ba5554ec0af247e7ff00f483ea94a3a6407a2d0ccc9fe5a530139336190a
-166575049e84f3964141e64f9f9fbe2feff15930340b49adc782b7ec9c2c24c7
-816b7cf5e7aa3c194b3f50af218aa2b1a69e9772a74cc661a96100f9607fec9f
-0e6a34b6d3b9b6df0d0cdef014c6e3ac43491883a33304b464c3219b883a1f2c
-9a1f882449ce7c0814be53e0a26aedb003f25f8ed3f9506efadba4b8133db373
-d66c0fb02ea5d1db6484418398a374bc43f624dc1dbcb70f9b6b97691d297b4f
-50b0b7aec4de5732ac5db32e488e8131d763ea2234a8b6ba67acc6ba688c3f09
-b1da0f7074b2ec71ef2778dc1dfdfa2b27d74756a43fdf2fb8be3fdc9189166f
-5747a30bfdd73b8507e6d41bff9607a770cd6d30a8b476cb972c896b90f15057
-f3b5095adf44ef4347da078dce7b6a41f01c29abb94e2c70e3b3a24f4169f80a
-7eff7a9b53909f97160964eedcc0862697c872a164be415d28661702c33f4edf
-bc8c172fdcd3e70d3db0341ef1ff453232617b89935a9249bef30cfb7115addc
-c06bac8b37d4363710731a69e3975c983b96bc5b8033cf0c17c4a6dee8e45f61
-53c1683d296a937f733c332fa08bc9f4c5455e308733567fb7b51300c3dd4665
-15a2d90c58d2155270e64f2a555f45084bc75cc2fcc2dd5ed0582943a7a5359a
-4fab1a5310c083343ccab56c224f114e46c8e6f8233e9fb01a352048144592ee
-fbffbe37b26c257f91220d792dd0f08da33f10baa54d92044f24646f9b998283
-1bb052d3873debe609ab925b8cab12a80067e52adaa1bc0f469b0406c975a17a
-c99594a7a8c7ff29754319338e16508989ecf307e9ea3680ee18cee760a02b76
-90e09970a402bf91895df85dde19f9f125c75558ec5002cabc1d4ff0ca1dd979
-ac53b2d742f45d787eebe0c983e12740ac3b74eaeb8ddb0a058030e2b5aaabe7
-3acc75052330fdce054d0df654b4dc7cce4b07b9e48abaa918a2c45b0675a360
-8f9aa1f307b1d93c13075a57903935978e764ef45628f219ea21740a2c720dc1
-4037ee1edec2082462f882bba13fe63a335eb8c18d95c420da75b152b5791200
-2dea7d6f2eae40f84a622f33376da36234c4baec46bcddc2a7874ba2f1f57b19
-b47a7f3a4f834b5780eefc08516d223b42a4e201194f03cc94aad45cc49cb238
-2f6af71dfd8abee459fe9f9e19f1d52659d6dd9d378c4f06c39552012e17e541
-f40704a1190b5887bd0cb07fdf4a3a3adf04639c237242cba12758e371dfb2f5
-5871567815806e74fe8cafda5031354aeecf88feaa172bf8f4cd9bde36362120
-2938fff3f84180ab0d5e2ca492631ff71835add3434bc1aca1589cf50ba27fee
-f0d86e6de410c00c5a40188a91c01d944d3b941ab249ce3de0dc988482ac835e
-ba5e0a045a6dee34f7c92ea4a1dba8c403d614dfdf3bbecafc61ee5762ae4f3e
-11511eaf682fbd245d75530476c2151c4ff6aa7959c5dd0c2f54c483ea556c95
-8774853ea5f841577eb57e89aeab3ed00e79902cf36fba0a18e460c849f4e5b3
-db02888493dc249f1c1f44bc7d7011ae65184280f5f4cb19793b3bb002a439a6
-5518fae1d5848e10ccc01e75a77fb1db966111754111044e6bd282ebf00b3731
-7227ee6f76a51e1921b2ba047a5f1f09f21f13e1cf44b3582af9c2d26df159b5
-04738c1d27acd2c898ef8148f9058dcdd4ce885927ef51c36b43fafdb08dc186
-180df681f94cb9b84c298bf7804280162f58f62fedfd7bc0e9b8214992f4063f
-7685d655f248ba694252e5ca13623f12062c4872b5989e13d9c162773f976144
-cc8fcc96013595b498562ae4261e7a1efede4b79efbe7ed5e4398d1d9e66b253
-a0f99f969c15fbdac089a5ccabbbad21402852801736f0dcc64b0d4d7cfcad33
-ee75b328427178082a96435c3c9f40e9cad04d223ab295eda1ffb193abb5718b
-f5efa9db4ae428bcfb422ef2ecb16225c67def9ef76ad21cf8626f46854ccedf
-885709053e56e6e758824ee80b0c8e4d67cab4e5d6d9e92fdd9b99912c709ff4
-57d0ae3c258229551c93fbd68e47b00bd643872e5ae53f292866e566f2f9787c
-1edd81b005745b10fafc9911644c5fee21e092fde448155c9f69ee2f55c023b1
-2eff9b86a86f8786b26069ff3f2a5f7112070db4f4bf93f40ce24d1a5c4bc5a2
-b577d39f069f506f197be8c590c73bb5f44ffd6994e2eb11786004c71d349521
-2efcba99561ba4cfd479ffe07ae4c45f5ec38c164db89b192d0dd7c07228bf2c
-0ca8374f377c4b8ae58a265cee76e71e952accb01a9cf1676faa4f49dc456c9d
-c020521a2e88d2e5c3904157d3e68158ca53371c73be43bfbe2cb78e3e1a9a15
-f29359be03fe111b87b252b060c453fe8bb0ce288a37907e7648352fbe66792e
-e4060dca4506ad6a7a8806951df8d3d29d0347fc5f4f408472edf2c4abdb7418
-28dd1afa26e6e8f84e09308bb68de881a61d106757c09840e49993551dae5915
-a28a25ee7949c3a00b7f33d3b2ac252f1b8d0896d3116396e2a7fe57c028308d
-d7864d81cabe4824bf15cb5778b941a6b5e9e46539a8206f8bdab18e92bc0aff
-2f7640dcdbc2b04f7cf5781345ea8513d00c7a22dd5f1e43b60ba05acfe45572
-76ff2374e36f5132b884ed8dacaf72d5926bdaf62a16715486bfcbe4758ae053
-687031d0fdba9199fb4221ffc9b12844c4d2e94e393f6f4ff2d6842abea45372
-12128d3234738783ae23850090718bef9adb55d26bf606dc4736e8be6ab5c079
-d5a6dcf0a6f1b1df6f33ea9c1cb5e916aac2b80395522382a1801e15b44e97bf
-c32017aa2eb223c188e63a7f5e093b7354bb25071eee2c3a545763dc93e44e35
-96b9dbd7c4b4818fe8237ee258a2032153fbae62f5dc4afc16bcad79d2550a1e
-2221482e072b9ff488bee9730aec44740b55a35d9454a4afd2542ca9e992d781
-6fb6ab598ec696cd7d58db737ea1e72cc4e4ee39e1d50cf8af3d94636239bb87
-2d4532e783ea90cb1c8278a9541e90aa0b6cb5a6522617b406b495cd2f9af263
-6d9e9453174251786b4c449aa9ae25f9f48d6eb00234003a421570f08b3081cd
-62e4de0418033395b45f559ade69a75075f363a13add803d20d13f54f0f6fa6e
-4061f653d4021f3eab7808ef212a5565de8ff35e46e8bb02660326fe6bf92cda
-02f4990e9c9653d2ec5687662b965468505f26d772499e649c3a0d69e118247a
-72077084bbf6828daca78ac4524c599df56a05ffcf11d073465fff2c52b8200f
-2ab7de3212d573455e4be882a31e3f3b92b79a9fd621c5dce0c70f09df800df4
-8a594435652f454905ac19fc7aa3d43a5a5f360778e85e0b6b82d126136f4858
-3796833f454bee0f16c40dd79fe440b263d9a354ce8e7dda6947ac89828f0a0b
-4ea40d62a651421c15fbc2d271cc47116df9ffb388093efe6a3bd4a6d21150b4
-286cb50aee34371b13083fc5cb8ce57ade9ddef9bc4a77f5ba71e9c71d159199
-b29203c64c53041e38b413b901e90bbc9c67378734c049e497cc67bff03fcac3
-684c5f18857fb8a0d941660e9b04b55209241226cab4684ed71dc9a212d2a7d8
-75d0090ebc27e3ea81cfe4daa0c3277f91544d134cec4b5da927a8b9c0727ffa
-9db44a2d6d9e34a8673903879b041462708af18ec1c658f83d4f65d3df623fc5
-db60e9ca57db545ba05c10a9a68e94f85b4c2a42a686de90a50f482cf150ca6b
-f1758078bf655b04bb9cb71336c96ed9b1a217d9a0619a747cbf82c4421f5520
-3ccb5cac0067f83d17b6e57264856491bc1220aa9b628ce4252a9932aaf5fd6a
-cba6cbc11a5cf2d34bd21c77f3963a49ca746d4f1661cbdf2803ecab28f50aae
-66d2c2dfb81f0aea5fc3ff710a5e35edadc08792b69c4af174fed9cdfb2e0c43
-b5cc87adf3fc71121b1cdfed660ae99d8d036c4896362463da11a7d7ca08c7c3
-49ca8733021acad25f152e797a946d1b4010deb8c6dbb9432979556e0cb80a89
-493d58cc933e173cbd48118605bf7de3e8a909519b1f7d58c4b9811e7d3b50c7
-297270d1c1edbcbe0f4c3e93143ca44dc128eb5b17d1cdb1cd8b8233387b6270
-d2a8215407cc1df046713aed6d1495150bbea29bebfd0c08fc1124a4624b7cd1
-fec7f156f95321825fdee4c0ea668e2fe1b0d92d6aced305ff511f13ca92afd2
-e99535de55a09a3b3e0355645df6b4547a50c2c29a2536cba3909bca6b761b91
-caf5d4ab8e9eb5cadf71eee71f0433b9b9d9ce0394b5c87d38193498f3961673
-7a748fdea2248f936dadf0d8952c33a4ce3eda258cb902f87e4f623c77151eb9
-18e6e4fdc9537fbf03b743693187dae6c9a749b5c7c07c325b9b27b025c38b48
-c5ece2d82a1b982b9d058dc49b33aa425e7eb79827b5a62a4bd7c5bd4488099f
-f7c8d9aa169ad961e17a946b4e65599e268a2a96d53a9c0147da713517f0bffd
-cd992a1ab06f6057e17eede9c7f9077fa60bf4f11e885810564c0f40b29ffd2f
-b6e9a8051c661dfa341ef0ca3c630e4df019eb057bce4c1407f9185a8ab4f882
-81d175eedd45086905342282d26ae4df524b713ef2088451f1073a59acc3a1f2
-4004418469561682e72d20f59cb9ad4ee5232aeefc996ccb77fb3beb9a635900
-06fe6d2bb606293d40410919e31db52063c87c17584854d108f711af8112eefb
-890429a772e77bd03e50db3a2a1ef371268ea9cac1bf7bb15a7746790d67cc0d
-a592fec74f0000f2d1073985fd1053537a455548d43a12bd556063a6fafb0127
-e8c1190f11b992a0fd26a3ca823cce5fcfd5742afcdc02a790a25fa57dc9359d
-ff8fb3550da075e3eb3582ef454c92493e1578788f966db39d0038d2cd7811ff
-da49bfeba9cfe0654b68fc512616439226b08264533f295ae94108168eaf284f
-290d61a62e8c8247b66a64289303ac847dee0f651c1b4575115d79a9abb9e71f
-8cf7dc4b3db7c835f2abb42c37456fe3202ed6ce061841723bb2cb759bfc78c9
-07c51737b52469f1f2dafa7ece85cc798050dc1bb63436c94ed1af3a0e6628f9
-dbb10bc24d2a6d94000b2d142f654a924911de0779ee7ca12d82e04bca01b3f0
-bf6d1679d8a4210bd58933be71e5bdd9e22ae192637c90e7b8905586d8312945
-4d68274af56c5d9636dd4976c0c8574e7804bd8fac44fef418eaa7f5a0410be5
-a4c592bf762ef8e66132f71378c37ce7c1fb485d5be0a27628125cd768ca1427
-790fb8c160a7f94b80188dbb55184ea6d657178f30c055596a370c9f40dd64c4
-f7246bba74679a347e03d7037a4994f348c8c4874df31358f02157132f98ddd2
-322231a9271018a49672897625fa0041550c99ca2cac35cee4281ed9db5cbb0a
-229fecf98aa5facfb951a1b116ed5c58cf4015a9bf03a0b1505132a46ca6b3cc
-02002c40f040e0b97303ed8c42d9f62a95610de3506c7a628546f9e4d6e9973f
-2a77cff929c7a41603a99363dd7f87f3c076990546e7814ba3150d70ce635943
-88152a0bb6d23bb4b0ad0c7edda0e5fd83842a6c2db044330119c3557ece70ef
-8297d1d86334958ed8037d6fb57ef20bcdfaefa66d2f02cf9a074dac8097469a
-b35a644035a7a0f91a813aedb3d9ec6fe2ded7c9d5a414cf394dc646df0510ba
-f27f501fb2627834376f9776d4f00869bc8b0189ce88008503bb16bbc588eaa1
-edbedee5e41b81774054df5b31c4323c4f2d2289f018a3d07dee4397b69470b8
-b1d64a694f1333130b5310763054870b88d2d017fbd62f3a2d042ddbc4cf68f8
-e1aa1f790bf2c7f598ddf275f11899e46d18d9ce4645671b14617cbee762a485
-95bf927abd6aa985c1bf117d82727432b8cc573197cd87a096daf130de5c101b
-ded264c14969b04f8f55299ff35cb77b033a1752ff04c96a4dd43e9e66fba118
-9dad547bf90c89bdbd77200042172c6243d1c465751dc96f5101eee86c76e4d5
-435d1f1fa667e7b575760681d8ef3b97f01f58e2406d3aa084552ebcf985ebed
-06baf00f2098f01976db0d4a36f39221b08c00b680ee425a9fa22b5baeb571d9
-31c9009a03a88501ca1cc8da7a3afaaceb87a92835161c3f4c84970ee219dab7
-ee9f5542d108b9326d5fc58cadc39d10527d481d303cc11cc424398756932aaa
-b06d5600e4d24a0d7dc36da7e8b32871fe36e59e1049cb9ae8c361c3c3ebb365
-5ee4a2facda18377394b68f046655d679ff8122da647ca64df6a7b99a3bae5b9
-da56fbfdce787f9f8263eae5e16f348c22aecb06398d714a69dce1a932f2b50d
-4964641ded3143548e33c879b8c03206f6feb025268f61f9cae4642e6009c804
-3adf0e4a1b5ce27a812559bbbecb7402ac2a580c6d8471dcdb02e6960fb51396
-4058ead51e6b121158c9e3d0dda75439e6eb47293c642c60a70bd9307ef337f5
-ef4601dc0eddaf6d675d17e37350ac6bf3cffb442a602054b52a5ec600f883d4
-cce1ff0d70304522df3d2cacb5bcb2cb37d453b76f7d4d915663e19c6e1335ef
-6fad8e7b76fab514abe26d837565908135cf8518819916bc9f0db07fe3b6439d
-c42de0dec1f5110b8fa5ef40289834953438a7bf83a6261dc80cfef8405eac76
-32815aef696c5b86d2cdec5d3588bb8fc5e9dc61d97d2a5869115c8260f31f06
-986110dfe2c477f80bbf6b3d9f59a6dd573eff782887c9b84bed766b63fdaf13
-dc4ac55b7a127be7c2555bfdfb63ddae8346cd6ccb6c77ac057bdb1c51372603
-8cbb594119970a50f42acae2b9d69784c5f621f53292fac082bf8a78c197af6a
-8b56466e9b14f825e45a9d8f554db27cafcae033831219f6bfb6e3568c7532c0
-ddb22ed77cfd1f46bb98480d1cea4800e3d2b8f623051da01bde6c8bfd1aac33
-240f6f89d49c824e4b5d8bfed9b536fd1773a3ea254d2e56725861a1289de1f7
-8960dd096d6ba285716881f26795345504bf0685127d91c893b57122f858e1f1
-93ce8270796fb9b0fd7246445d484005689948c40376a8e612fb8827965ba50b
-565748c8afb55247f32feb36a4245f136d6cabd1f491b753eca2104199bb3f1f
-461d1be91c8ebbe6379b2ff0eef8a6fdb5fa98029d7cf458e17e15631c2b63d1
-72264f66e45a8c108460e3e353997d9ee098f83537a22b5cef20fde0ee260b85
-c98befd03e86abce66eb6551625f8dfe379a07f53c32888e9e4c04817d6d5abc
-f02ca074a8d11754f4c6fafd3c0751886de2fac502bd1d3d9ec6b56b4d5d5c01
-90aef863969d280220e45f9bc52a18784cafa7e9bd0aba47832cd22e6c0cedb6
-28cf6a1eea4e519495c60be2f0657a43f311cf331e83e9e8109b6ca5235097e6
-d116373c76e9dce208bbd9573c7b815e33e3e39f8eda3d1d07be9ade9f74181d
-c5b9214372c93275865d0d4f3902c5dafd4fb246808dc253d15626549fd97102
-1be3384bdbeb3e70f5b846a85088dc8c4a9a411ef04cb3ee0399e2f92e889ec2
-800faedbebe32208a0f81f4fb33b97bbc9daa92a3b3a53d1f7a1a957cfcda2ba
-76ec22331c2ded3de9ccb0f51e7ca924ff8d4f0f541bba1a62da701fd2a05c02
-204ea9debffce3adeb99995087932d5963d2a6c39f715225d7662873624158b0
-a3fb470af5036028a3f04600f9e86ad203fe14dcb5360aa9cfe4e225b5abee97
-e21237ae6d76aecc97470950ee7a2d6b2c5d6ec7a88578ccd349aab544d151c9
-67d693f7de7005e4d92c5dc7b14b6979b1636092fd75b52ab6e83d7de079b2e3
-f5187467a0a6b3fb4e001ac42c3ca4ba743536d9e9a8f0a37b23a5509fd88ef8
-bbeda576aa8440eb7c76ed2c1b2309120478e5a35e071d75c16ef0086eb07ce0
-4e7242a68c801dc3c68663444db00efd46649bd00616b5a346955ba95b881e7d
-82733c8f7b563ef8a124d7312fcd0ce0dd57a26e6e104a080ae51b9b80b48960
-f1ac9f15f7ad23fdae73b7e93edb14823fadf09afe275d1503a0bbbbd57efc66
-e7b4f6468369718601a36e3b163be29fbefda393416a86f976d631b80ec34755
-9a0b2e328ffdb6a1ed1ede49ea6749d7d55b04342e40804f030b04daca04b43f
-f04d2e71c3686d9a3509086cc247524725cd7ac89fba7bd37212754fa0afa635
-317f846959f2a4ddd0dcfd1b1e5cb66bad528e47f850941d7ce69a967118f490
-95a8f8978254def9e7c5e91d736a70cc3ac70d1aad33d1195256020a9ccada88
-76c0ea39dabeebf3182b0fd89fe5be65661cdc62afd9a3ced45628adc41a1a3b
-d681dbb4c941020ce8b8478cacb0e4fceb5b6c16ed9ba14f1c3704c89114c5b0
-80d1a7115d69e6f932096eb9059a6252cd63531e9a72a36bab438a17686c41b1
-5a7616d857eebeb60c66d3b2a991fc2eb3f0b93df445b370cbfbc1754051d1bb
-b2997b93b66ecf29d6e7d3c552e0538fa41e0896d05c10684e280d683e48379e
-164b356e916afb48f42fb90acb10223b54e74a2a821787322e628f6eb02be9d0
-55f46574342907e69038ed2258dd96cfe873c6fd5ecc7d460252762e7fc4af9a
-608b65b1abd49db62324c1efb0742c2ac7453012840729e4798fb62bf15a2db5
-13fa7ddf79c204efe0d4b7cb7978aa3eb36a2c53c8d2c913ebf3debb9df9c52d
-c5ec37eed5d8924adee4ab8313467f3f0afb3bf9b424749f73715cabd5b86ec8
-7264cdcbb8c111a4bab2fbc568b65a081a8e7e18fa0d04462720baac968cb6a9
-445cdf029ab4adb8786f35a8d2e02459401b5be2ba6522a7a90b46d8333c35ba
-38437539b4b994e1c1ac8f6ec84a301b764b284ceff5ffa842f298d9c2f3c197
-54809e99550cec6ec73cc66b94d6e2980c54f17506e7c67902631704f51252cc
-1596405bf72ec7243687fc7a0de9b8c2f4b311dc8ec7fee6bc31645e4322efb2
-a59483c1734df0ab32ee58b6a156ca6b9507797706894aa412b9903203fb506f
-345be538c0e253dedcbef172cb9365f99e55b740b45a091848f8ce635f54f499
-43afe4697285361f718b6de2b79f98e0e3adae0509bf571370c425d1aa795cb4
-a1b10ced0d43b59bea690990313afe7ba7eba130f7e5639bf12c6b7dbbc1a17b
-4e0fdd4b02e7fe481ea5ca3cf45337d47488bfc09a0312b0258596771ec1e26b
-c7803227bd4a5bdfa0495c227a454a579dcab23fd4ae8034458fb61b7d89de7d
-4524d7bbdfb4e00a6b4275691be8f77a490e768309d6174379f52ddce411b55d
-80843074dc394e4e88b7311918985a58e5012c6eb8007f22903f3ee0cfa1aa61
-3128fd7b6dda6e93a6cafbc6a7f3f277868dc34939542072fa746c228745319e
-c0aeb14792d9d266b2d58c804d7f4094d5cae77bfe150debdc47f2f23b0b37c3
-b19e19cf0ebaaf50d64df8f624048c3cae65e0c5770792d6a6cb97202174b003
-a4deb8a3758a83283dc162cc88526a3d037d8ab1f823eff5115da7d2373d1d11
-56b883d419931f7956024a22312130659a8d2a946dc9cb721599fe7d5d28dd66
-12977032a94bf26215af645d8659ce53528b367e30368fe0db4b194487a4890c
-26230fd2bce623a12bc09b437df3a3faeee49571df114d6492b0c1e3ef4adb7f
-8ec807c39c3ac56aa82b2a8e7b4bce3777ce3104d3a62e8bba72608649f12b04
-e5908b5f9d167d865c9cbdc94e3e8c99e06693fd43283c58cde48e5295b327dc
-176b0ca861033c1f183a41a7002e9ebecced00584c5c1fccfeb630c20666d91f
-0eda19c9a59ef508260f6bea436b351af6518cb4e009865fea06d4fd3b2ba970
-c3632c4556861e54a6441f7398d420a99624fe52cbfb68b8c1ce2a27038809c0
-424bcb7e54c5781be2be39e52bcc1df2b74ce7828056cf8e3f5a56df1e54e7db
-d281570e270dc818aae4581789c7494baf7b1ac9cf3dcb9cbae77da67c39c6ba
-db606df4098d341e81cd5a24d1abe2dea05ea064cda4017526b956cdb79540bf
-7f1324f9e256d555ba4945767f2c72db5597abcabdc81e3015660232c67e0949
-0ba4b7a04074154e8083a8c883c8b884a1681cc2525f6cf45330d8818cf92906
-049da3a2455d2041a0cf9aeaa2ca7fd0f4e5d15580e5bae137d39baab9c400be
-0ff27d17d87970db423398e931f58afbc415758b1b1a8312facde8c4451dc91a
-09cdfa481770f0e445d35b98460b6a7b3e93f2b3d5f0b49b967a3819c13ff6b0
-4b3e665d95d8760fc380ba7f7d400154684e081ce7e2000c6e3a02322d3f3835
-4e49daf3c8bbb58422d64e73e0a491d3edfdb599614ef55b603b00d8e1aa200a
-225f39bc76f58506ee900c2db1d8fd16872998017927c4a561b83b6167a34ca9
-4407b21a2607d96846a9bb7b543382980e39fc1a9dd9f47c562de35e18a341b0
-63878dc89f993080a1d995ef07991d52ea00c6372863b56b744344541feddbf2
-75b432e36368e85161e1ad0ceeb772939ace8a7db790c66d5b821a90d1cccf7d
-ec5b2970a04efcc3060b0c163594d7b4f0215cc30b01e71b97f382e11f27b871
-922ce013ba8fc3bb678bd64630936f29f853e1379760bde9562f8708f8905a59
-6df302ff8f289896a7a38809246e2ece8e99e96b6b471916c883bb7c948e8fac
-6588e2b30bfed55f074fdb0989b85fdfd023f15f1ff89c2f29f4f5381c5ef9ff
-8e702aa40c1c6dc7aa48430c564ed5712ebb99af607df5860af30e1b4ec1a492
-6b9ddf2aac1352f4b15613cf6e86708c73bf73728f3bba7eb6b0d30c427454b3
-c8e882eeeaa998e9f02d10a787f6017a5c0a55027d2ea1da1485ab60a397f449
-4f2fab1106c23e3ed97dd268a6f5a9abb2f0cb470e1ee6411b27708b1f2cc7f6
-9efde016cf7c122903ac89dc47aa11d0c45414b8264bebce5850b39884195860
-39a7cb52c877e5ea6a0bbcbfbf3a104c0a66af928f6aaaf062b8da0fdb290f51
-9b26b6b2cf2fa49ff36e7435b86f720c06036f2a322c3fd0fb37ea7b850ea80c
-6cd6b4224e8eddd5adcf97f69d9c80102ae4f6f6e5663d0e47ccf992e11233db
-5f37e9efeb51f8cb754b919a80c0f0999311d1784221347d746be1590d077f8f
-c8a98ec3ba007a04866bf3e1e24bbdbe7839bb7adedb55c3584ce2e2b85a631a
-5bee6015589a877604e67121ede937afca89af6e186d10d3fa057c9703b17f26
-30025f6332087e97b1ce60c7e26e48d546ae484dbc604a1b33528b5dc41bc2b1
-1b9d717dcef2d469f7b5f0b3047876c578f3dcb15425678136229a7387966c00
-593c6e96e603f222d4bf10880978e1d0f2e246176e6daed0ecf75e30430ed2a1
-8907963577026bf6689b4a4c420c5a622602f2390ef9fbd5f6c716c8550acf50
-3180e80c95e8d4db4a8fa3eaccd85672b2fb2c0f7b0f8deb4955bd625f131904
-289166003bb3451c1d82b19c461b21f9523681468ea247f28d6e8eae788cf06f
-3148ea2d53810077c14b98b5aa1bb2294b202885808854bc6107f4667ebaec53
-6dca8dac30a933b183f5465bdb24ac02a6fe61d7c440e068d5c1b2511599971d
-09ca25be37e1baa6580850a7656ef4875ac5dca306ae04090496932140464a48
-2b60cf202b4e308a97d4f75123e655e4d210b6f2f285ff921a9906028e331aba
-6542a742fd93bbb77167d04267e3b7fa862437c37c2a8cbb1e4085ce24887ad9
-b00155d04414e5e8d35903c4b2f842b43a333442d17a0545681a20188e6f58ea
-bee8d954f42963533dead29cfeb41dc6cb8e70c122948be88afec65d315d3a1e
-8440ec98d8191c891affca48a8fcb5feba24cdb0716466840bdcec527520aa6e
-2fc538993766cd018effd726855a2759a0b90c12995b475d6e4703a8fb39a59f
-1499ca0079d2a25ab06e0c8772889354840c25e10cc6706e9108b62ae8e545dd
-1be37905f8adb05fa0265b736c55ffd4ccfd8b0e4ae6b558c1debdf02a836d0a
-bee910df3e245d668cd878f528b6d9d16f4a0fa5540623182028ca199a0a8386
-ae47cda55b8c71081a78efdda2d709d973d69ef1b8f27db52ebb298bdf2fb718
-afff5377c78edbc3a58fa3d56a3b811bf5873a8f787897c62ce1a281141df5af
-be323c10e74c8ce430dd192dccde81adc639fef9e5fbfecee5be9d0da1547211
-6d6961617b07b6d8a8e184969da1cecc18745012ced3834fa40dce5a0e93a673
-8f51f43afb5ad5ae0939f4d3cae2b1e386fbefd8c840e2685b156c4d2f2cb563
-511bfd502ea44f80eab5a58ea38a682e863e13b07a442864c1d8215db4e824c5
-bd5abb55ed959042b65bb7d1272c0e4d429024cb101d8d340e3c9b918661a55a
-d29cbd42b25000959044f9d5f9256410d5dbdc9619a54229a1ca1a96f939cd04
-7fb87288db04a3a105e61b967467123d186ace108abef8ea741a4f3aa45738cd
-37b9af8a997c9f6a4cf1b335e3248000dcad05d7565aa99dc144076bb70721b9
-eafa34f716ca82830e8981c4368559f859ebe5a89ef467193a08a3ce62822321
-4637619f8ec9595107d156be7153b6433bedf24d330968dd9153bb90a09f0a91
-43c851d4a5de88c60b0a5d8e3fd2ce90617d14c2ad91a3b9e54b5447bc0fc905
-d27e961b1888ae18d5455fd5878cd43849dcbc2b01a1cfd2543ef89aa4ac0a07
-e4b3bc437520361daada75f76668e37daf5c2f21133653ea1855851a3fac8a3c
-a8bcfc449febdcb4566b0ade704fb68e8715eb37461750897b802d099af47ba5
-3efd1f74f9d13ee62aa163174cf38d8e75f793f763f9ab03fafd8d52bef23f5f
-86f4da2b1cfbea8233805b9d9e47e7c4232631a56360dea075491e410ce10b33
-8e9bb61387fda4dee805d038c67ef2c9cf36ef4f2d7705ec90002afa3ee52059
-d4412a1ace2939ec8753653aab214344cc65b2c2e2a0fca95fe6144953c4b2f0
-8dd8b6d0bb097ee5d333e4f9c0c7a54687c3f2745a5ca79dc3238ab554ced0f6
-29707805440078bbbaedc13a2ebf81fe9d5686b9ea7aff8d6d98cefb0f453fbc
-441e9d82023541d3dcdb8d255e16a7b48832bfbabf7802161c7b164bd7fa7035
-8cb6f75c1dd4838277a5baabb00276394b7d3af5dd1ec4db34c33e73c6be810e
-d1e1c0f07b397c466ca035edadc839ccc6c3b7b07ec1f669ed0798d1296b191e
-31551b05356c2fed9fe7680e0b5e1ebc1dd117730554c57fa82854729f3e4c6b
-2428a8de3d3555ffe2220259ba377772616f367966c983a3ac18b04471506e6d
-07fce9847e39bd3a845bb894f7b0e04daea1f10f8a23d030a0054659db2b8949
-a79ff3d3df5e76e7bc5a0163e1d108e30d47c01a0d17780736a36b664372f6fd
-71f65fda05da8fa900c3f9e6f78c2e3a83e97cbf56aba6e4d6be0faa5ec5d7e0
-bb97e659c6c1a778354907ed74bd12d79d7a0b4fa78b2a157c3fafb6814b4759
-3db04c2a8b16f3635efb2d03525be6d6372560bc4c96e489e971559e49960bfa
-a5be48071bc009df1482b6c9b452dd558cf537ed3263a10b278ec050492728d0
-4f335c50b2ff81c70a78f8d8d3f2e3f9efe9efcc2c5f4e52e00b97ead7d11295
-912b35bd0dab31c9c3e661db42eb98b86e090e55db806b16035848de4b60bc07
-f6b7d9ba8841a73471692dcaf020cda34343fb71a18910aa400927d4359c535d
-773d3e4b7b95fc2b10292a38660f0aeee380148ab062142399c767c4add99367
-f28c35d5b8aea728aded4ae367b41d43b6adb2032410d70dd875828fdcc5c976
-e221f05c764c5042d2a7ab671a234a4baaef58054064a3265d6e5c92dc532663
-87c81c142f1b94ed0f5a16eb83fa9811c475aa0dc93f9ccf237970904d983cae
-a7914a8e481400e58f431701bf0cb884c1e5c1f52d592ad3caa7d8a37d1c9568
-acc90fde3c96fca19bede3d8d92114d4702e1d38e9526fb918c2b8b8a80fe52e
-5545fdc287108a435029613684952b6d9f5b14ecd5b02d607a311b90b84d68df
-ef5dc37f2c55ac5aba975bbe16f1f18b2f17b4a9fb96754fa1228a848fbc6fb1
-c874307680c9c58f46e69bd27ca7e55e7cdd7cff4271341dcb34ee5b300e8dd4
-bdec4fee74bc74cdbbd0ecacfc1a4ac7f4714b4bc308ce6d88438920fca53ece
-8367968559eaf9df11a0d3bb80e650e4d836ca854dc1556b5ef36b9e64bf60fe
-650125a292b63ef6982b7fc80de9903cfc18ad9a1a14dc03d32e9ee15adcacc5
-a9b11139757d948bf23e547769f4d9e897ba15ef4a495735af47de7bdaa63765
-40d035a6ae198f03ef371a49fa624478fee97359bdbab730e4750a79e4ecaa3d
-182c6bcf9af7f132392b5e0940c10d8cbb27a58f84001a951c356706ad2463b7
-24baaf3a13bb4aabd80f4c1d32d48a0a5a5be34b03fb140c638de3cfb14c4c1b
-ca45d82c270692d193f0aa4286cfa414beaa7be6908e4d1208b5c2ed29407091
-c6fd5e78400d148a9ae24dc6589dca89ada0ddf0126203229b33de78f409c247
-90ec215d8889e450b6041406aeb5732dea90891059e6f03edba61e003ef6eac6
-925e213b1b4cb51fec8578d36527de080e9b6a2f2a8cc08dd888b705e580f4a0
-5dfac8b6c05b297368fe786caf8730fb703b28ff3fb63c5183f4f8f97719e4ee
-d65d13043f1b28b01a2b555ce07acaaf98e47d034e6a3e271122935f6224a167
-5b4cd9fa85ee51deb3b132b36fccd473d1ec278c87a6e4c2976ea93c5348cd6b
-9eb4dddf8f3c9fd6d5b7a746756762f641adc4e1bce84423d589cd4d66d521b4
-a99ea4c0766e9de460ba8f32d580383884a9c5e4907d7469752ee7d68d04372e
-db9579b6b20fdc55c9bc29b227248252f595272fd12639d0f2179f27754adc25
-334f39f6205ba259f5544c39dada5d7ff050d80afeac0c552fd467b10023e530
-f791ad4b12d04665a9f9e04f7fa19f74c73890f6bffd42a7da2947ae70dd13d5
-8ab82e2c44a7bf38c6bce43d7026441418f12fa7a2a7cb81b7e4d4d0652d13b2
-2d6b130dbf0b6433db47ebd76cf0ee4f2aca9a4d8c9b3339c03087f871793105
-d25f5f4591a8c6af03c42ad8bc129437b5698a6c67fb36ef68ca0e9291a3eedd
-1e5fbe6e97a8a56482c0c2f99919648a24e4067c6180a35f37e066af4134abd4
-e366adf29467371a14c80002b5afc5003db922fa92af13306de6ad27edc0ff47
-ad4da4af9771c76ef2c77b54fe2a67719478718989abf9beefbd962b449ad634
-9ae7fce4e6f425e752460dbad42163fe5e9f8eeb93375fb3f46990445ef2e59b
-de0045c70a03300752482f1ddc1755806babc181224471af546b31584d50ab56
-9ff247586ef4e52363df927b8810a5975152d92915572e13c92a65e5444a8ca0
-46fcd260cc88761a3ec8834e169af050408655605c793f9298edb5f657fd9e0e
-0142cbcc53e74a5b00c3d0c77222b4b5df610ece643275968122e36135d86ada
-7fbea4d22e1b51017274365069d75851b50e8401c1c34a228c23c10cbe330dc6
-4ed9b9aca8f3069f636e286bba6cad0159321d5c27718f410b39f99f4724aaec
-1afc7f6ff415a8fc73d5e26be4cd6e93b5464b764b7cac70827d48a3fa61c7a0
-f1943551599bb6216bb70b19a1a0b763e2f6b1c4babd95094bb87c222fdaf5cf
-9eb0467a5c93a6c42f4ad9be37d0137a057aeee887f9ced56ee8ccd85bb8c5c7
-7de9bcbcb7200c063735150ae6f2fa20cf3cd920d5198483ecb81c0eda832843
-27e0c1828a244ff1106323d4ddef2c71430b4c4de536abbb28f87e5ff93c3a23
-7697a73cd0653bca405e167aa727b132e98092629971184405e342bd802d5b72
-f1a61d42152936472892786973ef23a6f4254b3c3a42531fe34af9569c466373
-8bb88d96f27a8478a732fe405840e685aa416052a8a86beb62fad458e6b90c17
-a45b1ded2eb9a31e2c2f7ae2832c34326dba870eb3fe7439fc69d6f26d5572c6
-ce9b77a07d977392f52594c4610d5c1974378d2626a79d7f084ece540d32ed18
-5ef252ad0b4be2fc499cc708cccb88a80ae59a31e3038fef230dd0c101781d95
-b754338c0286917d565feda78b54e9a46f929fe351c74b649d05e014f4b9f941
-14d84223a0f3b11f6985fac073e2e6a3124b664883a92a0efb9b1d017f823525
-fac9bc150808a58caad6b7c0f4892e0285d86e79d587686d0a52284572ccde01
-7a9eb12d4559e1793e09f92a84e99a0ca40e00024a9d80ecfafe6a4a0afd607b
-ef3c195148ca0699a363057b98be0ff2981bb9413fae9891d8ce9fa723c278f8
-828be8479cc8f1a792d5cc074bb7ec4c3e65c1e2ef34c14241fd0b6c097ad945
-479e7a932aa4654f34705cabc11d8fae6f4aebed345c325f907bfb04b41b35f2
-4d261885880bfb5b1f98b138ef31e3a7b96e439232e4d0d9bb84139f41f48561
-d828648a60ed3ae4f092b86bcd6789015b085506fe1f266cc02ff5c5f3ad7280
-4456b4ef8ad3c1eb2f4fb956f726dcfe2d49a73d7e9f7abca13cde848550cde8
-7e083b85084000f39d390d707a017c63b44a9563547648c48f3d3e5c577a9e15
-a7e663c19b7d82aaa700229bb541d7dc95d83c3a953670c6aa4ba8a95e2119f8
-ed8b056d8dc936c4fea8e8b298819a56cf089c0be99820bf2eb51455e3482f57
-62acb88c1baa53ac2dbae3030043e8992ebe1a7863e47d9e106a60fbb83355f3
-b98fb2744652df95ce801cc169936cb12c211aff9d77ae43dc7fbef2112e2d44
-a3ecd9a8c2cd6fc94b4ecc6d1f5b2fdacdfd153e11d8c936d822306ce7cd6d7a
-2172d8f72ecff7f8a4d1eab8247c1261f8df09ad23e5893f900e1e414d13c25a
-1f235af5fff7743baac23af56c8d8baa12e095ace339a4541e87eed758ae490d
-04da6c27bdfae6c59e263c3143caf2febad0f61a618a372052f3f550e80f6a25
-3109a9d2cd667ba408e019fb67f8360d5590850e1ac72160f57ff00cb8e766c1
-dfd23f82fb24b407dbe5cd232641880da9054ce3934475db0ecbfca3cf56eb3b
-5d5f9d5b69a847eb7bae3f80f5d96e49cc11251cd4e3ec235b211a75551d3df6
-8c9bf13c5cb2191f42a92d9ef1419a0b31996a53a1b13235b6dedf6719ae00af
-af731d1bdeb99eafdb8ac4007e4a689aaffe5afa456ef93cb02b4a6842d60ce1
-cd0b0d9ec8c90fc47779fc2494dbc683b6db5360887f367ad6f5cc2986d21cff
-622f47f4dd116d5e0300b0d1d5ac15ff4162435c7a10ed614359d63d230132c7
-bab8dbc07d28aa915a91c5bee6f3073f6de313d561c0ef9c8746ce87cee5d42b
-74a9bb276cb8797f1715136b8a181a7ce12c85f5b9e288ca852617add6b72ab6
-07eace83bf400342f5273f2670212358c22192bd0ad7a5905074e42081df0fe4
-de698f14471fb3162a847f5dfb83a84f93f8ee6b6519ea588e0d4baff3953bf8
-81b78049dcbd4b84ce45bdc45499e3a5776b8e4e9063137d4e2556aa2e62b2a9
-eb5ce11735ed65ed5cd49135bba4b6d5f184eed7933f698157525da9793c8b10
-41d1bdf92d244fe701d30ace06cc28dc4afbc99ac05f2b8ece0bd19771c7337d
-d7470206c9e4f9ce5241ba4f038c02a8db27f75218875cf8334ed4bdb739a13c
-9d1469d58033f821c98b3684b51731451d3b05dcb1a7a691d3f0e2fe44a82688
-cc91e3711114d2997e159c81408665b2050c89e10a045ebbec019bb9e7567d95
-9176ee0cd69104974a26c6c7da1f690b6503a75cfaeed44e9e37be1a9454b7bb
-921f7922c213b175abd329b680f5def8130c911c25f4ba34fb2bf49c65ce74bb
-223904c11d7860ee74ce7aa113fc40a64fa702db89517b0fd444d0166cff31f7
-da476a7415e5c308ed98b09cb41adad1807694c1a39a20d3ffe0f33211e36d54
-395061b0df33dda283e1d7f5a9399bc144ccb6863611e7aac1817fd2b95182dc
-92755c6bac1b4074dcf43e556641616541284d5eb13fb49a4b375c31df13db9f
-ed989c06f374582862caad3b745fec8145649dcc6b23adf6b4852b6021394dd6
-a19ce0cbfe5b041afdad277df48db2955de8cda9a54379ed246370442196dd80
-0875fb8a65e3300e3e4b97ee6cb4134aaa59ee3517e285982a4e65ce966836f3
-0465e0a7d4bd636870dab95869fbe7b7b9cf28db23839a964612322be21c4f0c
-3cab665c4dd6f40150542c3ac64d147c09e5cc969642154a35edcae9c119bdac
-2b82e582e2ff515e1c88f91f474e03381368417b4084f6788a8e19519c9f771d
-92133700a7ffbf3e82ae50fb19f59a7a385d169d1393c150b88e5156c41e28fd
-055eeeac7fee07c6a3be5a8587be73b77826274bd3d35574e2ad12bd1551be0d
-d4ff959077cdff691b265cb353ade31f77ecf60057c0eba5c51a7bdd69739633
-b45c312f9b77b0d87ec77fdac0049645c979663dc0314c8f101681e0e47aeeff
-fc8f7d39a57009ae49735d6c386262bd09cad0f52d862b60832ead3b3cbd3efc
-bb992f901443f78f45f9112a8b79d83888b412803e5621e70dc7b2eb475a7a3e
-0d07c36ab6dd2eb352738536c879ca83b31906ebc89c7304dd1cf95559cf7bae
-eecc29a5d0f839b64c0a24b6b9135dd0fef4bbfa01b7d6a86d407abeda8775a2
-6e20bdc6d2189cd7055b39d30315b9ba68f717840c10f27b88e22075a7288c8c
-3db83c27b55d6032a2b71f326469af86bc7342f43c4c95c8b13bf295ad130cb7
-421ce98e16cb34afd5342289819a8927447c0df7c98e9a965ee83269056a7c91
-961efa627927d007bf3836ff5eab5b6241ec8debc29dba3055d38101d1032307
-86644c8ae82f2c516028f780853be93fb7a220d71e60dafc26e582065444bda3
-5afe0470dfc2f2faa9d2af52eb11f048b16ebc88f23f33944085e1d9b1e85870
-18029b166b6a6eaf36f2507415fc1a58ad4b403c89994910896bd32acb360703
-17534352e8b001ea7a79e81c07e740c3dfae6f247579f957fac2c71cc792f7f0
-1c5d51b81f5029866f454fefc4c15fbc369d0b5f45633fe46a0fb141ad869770
-91af47762fb7c2291a413e51f9d697864c8a7018818a03203bda7d356382fe40
-b271118745973af3455e9021cffffc9c429273404e0813699841332ae86aa519
-608e948ba76806963b3656c44263a1c5df864e8634cecc6f8dc053ffedfcf030
-fb3c759daf5376152d39ad6e724f2a09a06e77bc1eb78fac830149954261f8cb
-765d2aaef1847073e6a5ed1d965ee9d3ef47650fc131a229bd68a22aa3bab374
-b0ca5b3ae476fd880957cc7c08f8729185aed5de06dc4ac1727ca7942ca50e7d
-8bd0c697d43c70cc1992205c9b914312b4a91344d47be4a9ba955da671977af9
-a92f0102e56705575bbb13106995f75de702f0eef35474ac55608c72bd513cb6
-e6ad69f1dd84869c03cf13d22550471c04cc72a5664d3154d56886fca7cd18fb
-e7e172dd975923c6e6a34dd59653260a28d90bd16e5ef7ed6a76a55345b08015
-b5e1e209e9db3471b9d0008174922d1e120f00620519d526e85a80fbdd658357
-56428f1549147e1adcf069508723625f929ceacdcfbcb0eac8337b3de3276894
-1298a952cc3fb5f55589aca8bb44111dd1023305f8a1d2b70d1da6fd510efddf
-a55a18dfb4cc9a1b4378f9dba73e29d16daed328d3b915821159b0bfb6872240
-acd1a3fbda983af9d64188be5412b15a03b52982bb60a7748f06897c63d97775
-3e60bda00e6cb10c4fd1c14a49a9ba5383f025393f79efffe774ad9cb66bdb11
-e3feae202ac9ab6dc25eb347b967b9a9af308368cd0702dbdd5f8ca2744eaad8
-0f0a9093c127b1b01bc718e7979c40d2c3c130dc3e9eaeed82e44f12872ff753
-ab30138a8b8ffa23123abf35e67a20a44fce65e6f7d20abaf919f8e1dae23d04
-5e3c5ff827a3ae677e0ec586f828a0f2a60e61eb82019ac0e1798af174de34f4
-d65c27344cd9f575de52695e1564d76b3bcd81d02fcb1ad4b12499fdd6ebfba7
-c1c55c98c7418936fcab4606dc7203dbca8471df5828ba2a8d6ca99d4aeaeb7c
-bef1d59a6daa5d0e7ec0a82fd392790b8e17d25f51cdf802784931d9f10b824d
-ab7026fe65d2832d166cfb9b108a75b02ac5b74c7726cb5f178784f68d478ca7
-e29097b39014e81f10828dd37e22889551489ba2f6a2f53c72e831c75d2c36fc
-e19cbb452652673c10a79b0eb2cd2bc4360a464a8bed2e369cf49660c9ece723
-7d8cbec3c3d7fe2b223b469a0feaccea1451d1cb931ecc6c307132d89a281fa5
-85626cd2ab00279137c326061a1f3165b68d04ce49bf0d308a21168d54f4a3f0
-7d8b8984b41248a4b5ba90c1b88403e69c920179c41c83a5e2dca301dc67bc54
-7171f622980e28f452568ea30e9dfb145d06afff9e28f43b04535ac63250cd37
-22ffda3ddc5049cc71ff4592766a786190c7fe9c7e87331b3bf1c8c25e289e00
-e9aa9e8ac24a978998366cb808f1dd3bf204af1adf8b6c3fcc93482510c720af
-03e18d7f6820935881c4732bc2bd68b1663260581ac200be9b0dacb1e6a910ee
-d5186437c5bdb966b939edaacabc104c3db19553117de2371839e6034f0f9f9b
-878626fb6de546c64224475d416418a1fffd40341edf45f4d91df8571000b6c4
-e7e890ee4ca95e65f18bd0ac230b98d2487a59af084feb16e4aa48cdcd150549
-f93a03156ff8b76913decf03fb5ca3213b14686b664daab69d9d6f056cc6d372
-31122a599b78080a0ef40e75b9d61b17612c0982690bab7a8dff6265189ea5cb
-4d8607b8a3447e2de6463f97e35c40efd806d021d47f01568ad586ea33fcdd4b
-37680417b08ed5fd7bb1cf72b3751fd861e0f5170d6cb02a803c908420482226
-e009240ba80b0275b1402f6536da71325bd6c88e2d0642d60f964ed85acfc28d
-d0fbcc7ebc3d462cb97fc41b8c4bf8352a09d71ccf318db3f2ef5e16d6711c37
-93bd1ab7f7c73db89c93b7843c2c2f2deb720a2e840fda79d3220ac62c280628
-0062d213b27010e5332a1bfff9ae17063c4aac27a190a5559933cffe1fb01db3
-b048fbb50add93b115ff5370ca33678389a703bb381841ef19d8cd1b930c2c3e
-0f1211744ea18b15e6b29d8fb3fee9f5416718e1da724b7b3a1e82a28ee059fe
-463640a5fa80025208ecdd98c0bab3ba2cbbcd80b730686ca27b14240fb1e9a5
-c751f88f42687a2901c489c8e7e428616ae0553d503d093729b64edf3937434a
-390e6c6e1094848d10511feedeaf239a1afeecb5981ff1f6d042914f02f17847
-4ceb12269438aa42a0f9bde00db8783c01383be5c3a45941f8afd0177055870f
-484eca20fe4288a96ba1d7a341b3c48cd24ba4dcb14e703db1389a5659e86ee6
-e4884fa3363238f8532d950d5b1566dc7f68eb0a31a0aa314deefdec9a87a7a6
-e7fbdf52e14cf413fd6029a77aeb5f0806ba51f9e63063185c926ad04df113e9
-265be0f9fc4e71d2b18680bbd314dae429c9eb2d84789bb85064468c26c04215
-321132cd4eac9046092f1979e2833d2d5d1a724d10629a0d4e9c7e03a9d3b2b6
-3c07d9f4cfed06a476ccd1941a071679df08f38154c2936fa47177986edac8a7
-925814c83814c705994bb0c9546a1fbce22111adaad613960c0a95d98d9452b8
-7441c3666b539950a27ce6d892c2d65b412fc58547ab21a6d02f1209cd304235
-ec32f4349fda2d1a6d9299c9ad560781dcd011e1d2d7cf91ecb6f5193bf9a33e
-9f73a66b5184f9266afc4183131e7854f949d4114c48cc079cb892e8cae078c9
-c88223e65723bbdd78e23843515712bff13f4544d43a144fd180639c00e0f6e3
-9f871f8c056d8e774fd3d05175e8b411038483f333e18f169048ff21000fe84b
-2541309205f6635a05de58dd71efacb7182f3972ea4aa2c5a6483ac9e38ddb1d
-008e5a2f4940fcf820987e2bb7b73fa38f8441806ac0de93736109af54048a1d
-e95cab99b1f3c5e104af17c67f0e0a99a0dd9c7cac7d917a8a0032abae8c577b
-f6a647f505fca2e854998057387da13f8189a3f9bde597d66a1d87388d840f09
-8a9e712c6e3485eb1b8005e3e3224d959b925a237e167e10965f6aed03941a4f
-90354b6bc6dcab1a2079d0fec8afb174b57d339252bc36a554682cf59773fca0
-36230a8bfe5538f7770e126ebd9dd87d800663c14f5f8a4d4bb935fe7d05d2e2
-11b720bfb754d323a8a252919a048db606eac7c590ad68115d052a78d8f0f7b4
-89e048372b293ae6a44169ea795cf46d25637c7252bc7a0062896f546624e151
-891ca2e70dac19e06a3fd3c67de2ff19c3d3838413f82a38369c5f2166ccd869
-5d4dbd9856755ab9f7c94810488bbc713b1aba7f66c07155138ce859a79f023e
-8954decac00adaa02e38cdfb927460cf42cd34caaaa62acb7ad369f917bdabef
-9e2103e0117f6f99b1e9dd73edae4b8c353f6961c8f078327d7256b5ca6a5996
-bcaf0cf21718f574f6f2b501dc8a3b115d4af7af8062e17a9f43ef05c1103ed1
-b406b350ad72f31ed50de231536a0ca1db4373b3641b39471774426a87d5731b
-7aebab1f6a9cc832f7a8e542abe1b8815d20addf94c143f4824ad09d702acca5
-f80bc581e0c848248613f5d86a006ed509a5a55591852200aa9a3534e90ae0fe
-95098ccb45bc63a4d86e2e1883db0bd1e293360158a5403467b96c1b9e11f082
-ac3d3a5ca47a04b7605ba54c8f9b34abe2fbeade06c3f3d32d667b6a0074eeb8
-84a40571a4e5f2c31483accf78230043c5a17f8da13b1bc9fa92d1db17724bac
-73e48427410b582352164389f95357f53902454e167ab86c5a5c404b648c4c37
-aaced6c49af4479405fb9d32f6cd78e2114b820cc03877c29cf4707642c942c7
-3874aa52f3f2955ca7832a12545f745cfb8768b1d24354f9bf721d55bd9d0722
-acd1fbbea4b1f26128902892bfafc8c9b1c5860f33321edc5afe7009f6ee10e8
-d5cd98fa521b3f45869b41f8ca4032e8f814ed3eb0dac7828893cc1ef2649390
-e70cef649f6c469c830a2820ac2b19bce71b76e2c7fb653093b9fcf65477ea03
-0e09e3de1306a2131a1792a616755b670e91a002166433e03a221310b633f96f
-7c4671b45b9e5933f67019ce6992ce8575efb90d4691680a02a4acb8978ce207
-817505cd7f01e027a965f79e6d698d6de13f56ce427a7ff627ed78237f99a702
-efb328304bfb288641d8685cbf43e96e85e2d6aedfe97e8bec0bd5f9622b98aa
-316450a090f406879c74985decdc96962a50b5de3a5848f92492037011d0f4e7
-dd0fdc25d578a0f86f80a8ae25b9975fbac71fbef5c04810ea0a19b89facc0cc
-aa73cd34b809854296cbdf532f9593332114e100ee289cd181bd3b3aa05c4fe7
-b3f323638087a2b97157b23505f9a653cee29017a39666e3680df121aaf641e5
-f971007acf53e8065a0fe536bb72e2fddb8bc51701f5d069faabd6c101e786c8
-ef8d299eee8fc6f7f97c1d9c09bc82f8204c9231083394ce840312344d592d98
-f652724515c99539d2c463fabd42c8360e0f0f5aa9739e3d2e484d3d39f2ce73
-f522a79dbc46266aa36518f0278432bb380904ebb6f30ea6edc835e33b81be18
-21b6e0d803f31e8be97a261b3b1426281b00b8b6baa6ddb76ced67d802415006
-1dbb011d04048481d815ea0db0dbccb20044fec53da88ec8cadc39bd57a2dcd0
-fd36197e8075729a1bd4517751dbae89bd44e2ca7cbed060e3e6e6b124b88ae3
-02f90a2388bce72b3ce9ef9e1bc8392246271d4cd5fa6067ce5eb426b2692836
-6f00ffbd94493239104a7d71adb54f3f1d74447676511fdcb82674cc89ed6b67
-7e6a24a5dd5d29f76eff3bcfbed6b5e81ff42a04b42b9c30763e501b1bd830e4
-4c9890fbe3b039eed303f064e63b7bf7291c58f2b45aa511b6e6fd2b169d6ce5
-3c9d4331ba7029bb94b7b5265da7c0cbab1afeeb6368ad410552a8b23c4838f5
-eb07bdafc3d60458649ac2c8fc787bbafb1b17128e82359c89a20075bfdb63e6
-d9be78d619689ca0f8c2e9c38a5e8b5eb42b4d07a9a3542cf835a423cb65bedb
-ba210e7b2073919ef7d76471d17b165d6aedef70651f46d22bb1b6d3a8b3898d
-e9370aaa67830689c4773e20e0264978655ee01d30e42f8a6ea3ce955c657970
-23129accb969cf84005341b24f92e23b4b3962834ed91ed40c6866f6aae07219
-f49f0d260d329c287d4bf91c504dbb44d13da65a96b522673b7912dde6fe5e76
-2ee0d89ed7fd96886e761c4f262c88db3e212c603e8981298e4520428c058480
-2f5fe0fb223f697f946330d97f6275c100e5d15f36867a7e9de9338d654cf267
-5bb52e5ee6c925faa522780519c15b655ae54ff19203a3465582e7b40e904716
-45152728ad912b05d25eff9cdf03b762507d6980908e22ba5399b2fc2cdddb10
-47d8d3b6d502ae49527a62ca8968a2c8b6c814ee0cf1a7618a8ea8d7e7c5f61a
-50515dba6ed6187394d8051121b685be8d029d97449c85c95b4d68da2a31278c
-dc7f39c44039a3a363d243910bd26c882ba1ef5be080d0f8b8eef954d9b7c186
-ea5e664aa4141f9ffea443d59124e25899d0d18dced06702499ab54e72894285
-fa1ce9a831ab914be5711a225ced342a9de51a7178a4e5c4491a3aff1a606aea
-4b91188a20a63747374aeb9014cb11cd6f52bbf906af5aa6b5ac2cfe27e75efb
-c554648f01f12eccccd3d94ad3b3271ec690e9a874284fd22587a58a4d78680f
-20bdaa27a59c0fe1eda28b86834234d291682efce38bcc93bf85ebb7b493066a
-40ecb74eb37dd1d018d3af16977ca7b539e5d9e68312d255b930cf1a859625f9
-bf81aec791a6fa63f578a4ecf972e1f61ef9258eff34f91ad002ea7a5c3b29ee
-2ab6d77ac6c14c71ad07895206b0a68ed4c21e197851ad6944d4f61f3d089c06
-d0589e1dc7494f3e4ebab1f56666b2290679a7656cf84ffa3f1a58c1fed9a62f
-3c1b0de1496a711f5b8e074712c3b44f49bffe341ed6e5926368388d0ff7882f
-ff24a63273155908d94e78ed8252603dd8eebe7d19e588b029e5136840a26664
-9918867370b5f8d3942127044ec81cc46d1e88fe88e47b8af625b6826f2c9ee3
-5f8a6afd319d66812d80a171a13316c2a4c73900686d4616126aa83d635c4f9d
-27fae14feef992bddddc1bd7c890e67cc544c31ac9d05541d7af116724081cb3
-8517dca6cc490a02295fbeed7e147b1e45033c70afbfd711a2d41248cba6b56c
-94e1b2c1a12409ca6e529f82e0f23bd91da21fbba01f22968a8cac2a231362e3
-61523dd5ebee42c524cfdf2eaf818650db8da4e382cc519214a7b4fb3f90e82b
-315db75c77b7ca98f2f21258a68417326cdb55cf6c2b31f197872a8d9d65e17c
-dd64e130ae2d6d2a16a717de89257bca08f5bca777b3021ce17d5b1a07aef098
-88fc1e420c9e08ae3ebd4ecd38d4417191658035a623a3dcc20257c0e1c4d1d7
-d7e0e54defa4d27fb4f815ddb2604103030e95f27871c7b0e9a4c4610948fa16
-012c4b30cc2e6c03a7ccad7f0643b9a1cc1eec9c7a2681ed802ddbe7d8eb18f0
-2770b022d4f2aba40045ffd23a888e04b800735f917f0abea17b934e4a7e4d06
-aaad3add44cca6826070ec12bc89e716dc416bcefe0725c086e7804ab8b7fd91
-6b1e1e3b289afbcb202d7074de5c61f2819f13735639aaeb50e7dc9aef89209a
-eca7316bb46f7f03ee99f56817d385102faaee63ca8eda61bc7b905ee48a9625
-69dc8122ebd8bfabcb8de515b7dae09542db46e0e6036611762442e8d3943d90
-a89024e8cf46bab577380287f30284717c433f304119762b276fe84fb0d0f075
-3d6591879886da5fc0e179a7fef454699e159e8a2d35dd1f678c8a5825febc07
-6b2d56fc48370317c9fd3cc71a4cf3772bc6a9f202a736e863ddb4cebe059958
-1ee4c17ea43b964cbc2add4d2e2ac013b43d11d1c1471565b90d1bb0da9b914c
-44810b030e137b37ef8942dbf6b041d9f7f90305afa411ad92527177f894c2ce
-835b8942eed694b6e7503851d5dc49bd40e05056841fdd21d6c29012161cff37
-8e213657bb2db9f3655cc1d18b8c6a4d31b2d37036b1be5f51d1277cee26c758
-685b9b2bb9b9f9e88f9146ba4ab794f535358fb49fc0d40ffa41ad402644120d
-0ea676f3d5588683683b79520de05a35c0f394f0f5ec6d13ac6b1df71e030dc6
-9d51c242324df025c96c5429f19c7190c77666731a46f8143c37252db87120e7
-8bf1c9f22b7a80dc4b999baa805d9f1eb5ac4e28a70d0fbd6c7dfdd7c1fbb560
-26073cc5cae5a1cdf5f8471585165ee0191d353ccdcd05f2117cdae9cce71d72
-9d0f61304f1d29eb2c5b6ec18290a9b27baceae80a405afb5664ba513ab26596
-bbaf87266ef51dbd35112eac5576b04b650031528738edfb937dec3f9b0caedf
-2447aeeffec2129814289b09842d3dd90b86300f1a035849b87fc2dc2e4292eb
-568ecf43a518512f9dd5287988e688c5f040a442150d447196bc5216df070c0a
-551928a0629cf3c7e430baab504b2315156cc367f55f090dc1f6ad0214353780
-f1cc7f4a9b262debe551a5de29cf1cdf08117de2df62f164fa91d166eaa72758
-9b862a3dfdbff31b404c11e411f0c642ca06962c18304403db2eb93cfadd392a
-c7a030971f2f897017317054572a4b5fe8fda9dfbad4c079b0c9c3e3336aae94
-b11baa3d0257a88a1919be409db0e1ea7f2f55fbafd3b4a8b5f55581aab8fb31
-a233d2081374327616cfc745b3c7039dd295a0b5068560fb68eb67c567c589f6
-08a45a312ca25accb1775badfd7b2eb0f4bc948b62362b3bcf40766b987622b7
-da7d9b68a7909104056fd5e0709a5928a0c314d407745c9b5f4c9a65483a7bd2
-3f550b7030671bba32d959442573fe4e6cbeb995b2fbc273b6894f70701fd2fc
-3f6ed6fe95cd521e83862350df167894510c93b44032187f171773b42f483e61
-2048daacd1f4be69c9ef5e6c1f63c72b759651047cd9ce71199dcbab1c36c1e7
-da6dd872b1a4c03d7145e4dca72064e2ffca5e43fd66a7c532feda1000904032
-843fcb1e24d99146dd27fc507cfba1a63b0843af0ebc0a336aafee4eb27d8796
-c0c1298a23874928f35c7cdd27145835742eab898c2d04e7ebd5c0fabf4806c4
-d44ba374cb1ff5052be5066d3a52e1f2ba4841fe35ae6c097cdd1c8b04883764
-efb0f51f646cccd0321ecab07647066dcff2bae0916983248b080730e45b8aaa
-df9fc1805e6c5fb1b536c598ad35c0f69f561dd949ed142ba7fde6778620e8d6
-ac443fdfdde254bf1475ef95bbd54d1ec0d9b531d1cf690cfea6ea9dd4d732e3
-e5bcdec23e92eeefd411298360effa920d3ceefe61858b9a356023766a181bf2
-aedd269b7d4c610fcc03cd8fda705186b3c842bc6d7299abf6f704b419bd2b2a
-a3f75c8b0ebdeab45eff8f1b9bbb9b187b03a0735b28813860d2916f7279fc8b
-e6df8e6f5155c3dba782aecff52b1be8710747c51e9a76d2574fcca699b9fdc5
-48043c2fb363a596f6b3b371657bdc2be900c9707a78fbfcbd1c0bf881468e2d
-f7adefd8bf30dee1b2347aecde496c012f0cbfe3816068ff31f3b3adf56b612a
-632703d469de017d29769ed5d55aa1f37651c11f0739ebb4c3af0a3c62c4523f
-05081ee09ae3076d361ca40f8b13d4a631b9f24a5366f4e678481abe3993ce9b
-ab8813c00b4b95be15086c69a55e65ae908fc071f0b3c59daa9719321edff148
-62fa6efdd42bd192d0138f6bbf5890f78a9c38d147ae00157f4307dc3095432f
-5bbe889da9a5bee8669c6651e758ed5ad38856433fb9702d70c12aa29cea4424
-8e50e17ce514b8ef3131a972b8db0b0be78c93831806e98916572e7959b8317c
-54149e5372718963eb74983316ba7a0418a921433d759e73cdacb1bb6ac69df6
-7961040ac80e5459f3120ca3c8eaea02497b64ef871030f1501ad79dc405019a
-00e355ae3b7c48ed22873196a98637ba2b25bf8b946ce509da8bd25456373c29
-dbf08751baf2bbb23ed57b32d3abe306c29eba95e3a404c3a15b172a8313932a
-c5ae1588a0227de80156713ea8239110c31e0452a2e2cf376cfcf90a41f68bdf
-c08018786b166a5e9326b1beff6a4ed7fa44f523911d1819cb6aa1ea58fc52cb
-51a74b886466964dba973726352554470d5c35353b60b68830bfcc8f14cbdf00
-f8974ab1914694025375901d71324ba933b2ba61204c4ba5f6429077f429f17e
-8f1f95c2308b2900bca909945f96f33d73a7a2186e28d4132db91aa6d8751e47
-fc1665361bbeaebdcf6bae29423c6fadb892bab7cc872ee4cf3490d2956907ff
-baeb199c2ccde45a2649aa2e4d8dc65142df9b332691d9b154dc072ea33d1710
-e64eea0969e54a54fcc812d6c8ce00c790d71ddd67c6b8d4ca7baa6575cfcee5
-8af7c205f455c24ede135b653875780f54c98e3159ed284139f4fb00f64ec8c1
-1191c0b484b9fd15fa6f0fb5b6999de6358741a0a48abeee116a44cbc015c0b4
-5584b76b7e73d6d3148bcd17cdfecbefd83aa402162367bc40e7835fb64a4b04
-dc4827158e4b8f193bc470c9bc0c46047b4cc4d797ea9ed7f35868331517fc43
-15b9a080d5171104dce9c6b8d9105b0031f4b1f9ce7d8e2b7d08c5d633290fa8
-8356b073770339203622f09407cd263412ecec6c7f58f8d8f5be935ccdebc64d
-5f0a0287fdcabae9ffd00c24e7cfaeddf9fae5f60d4864e8268885f71a8a941e
-facc6eca987d76f1ca3ff9795045b4b9057a7ecee50a04d09b859207ee869750
-282bc24be3dd0d84e33963c4c1a484de057541399cfe79a5bded1bb90833d8ef
-4bb6f36b7b9f236ff00bcf441ea1e1ea04bec9f3402e7993be2d024a5d06c653
-6c2c090d51187ad3eafd64bb0389da839cde99222868ce4ad6e03d6fad5411b0
-9826c410db9179d22db159ff72b0c9246c690b527bbaae566d145284f3e7bf24
-20c2a7bc2ee6607ced1e89c558f3a4bf132f23ddf53b240284de7c4839ef3b53
-6532a60c9df1cbd3470d44c7c0d26136cf4955951fdc3f0b85ff4d4057f47a6b
-8648c3640059f4543316ba9007c0e784f79c79156b04f60b030cb98b4fd47577
-dccc5c223e0f1211744ea18b7c0e676bfc5ca9592a7d9e7c13b93bbe2bc62251
-71d0a4c44950754ddc2ccd486d2b702f4188987595bf8988130b0c059b279418
-ee3d0e21a1a8e2b1852ba7e01e9cf19746131e126bf5eedb08e6c635d700b0b8
-caaf2de2c01f82ed911278abf80a8a47aebe6330e0d1bc308f00a9fb8944052b
-4cf11ec1f73f3dbac7a9124c6fd2009944732d672c3d4cd2d387b4235fec275b
-907d25342890dc44dd670020814e4155463f6bc4804f68efab0501388a3ef816
-e2ed8b83840782e22be4a0b562a6b0361b8129872c5ca1c0055940378bae85f8
-2a39e182e758f970c22aaead53ee5f934dfe39abfd55bdd3275b65b0b71eca9e
-467dd786fba4f8c7084db6069703dd97b05f80013cd99dea6698ad3ab5f09f11
-5a00e47fbfcd13caaa7e82191d1881b3992b69c6cfa15307d6ae8370252145b0
-97709d56b69ecb253757ae7b1a11cd9a8c2210af5c91fe93bc2147681b19c75e
-a360636446935d85470b0c28d927b07afcf63809a53c0a8baee76632982e9fa3
-1cd9b8f117a7b41689c83a23043550a3f165bfe81f0e0e224a6568e60e28c466
-28b633d66fc7370f65fd2ac5694e7c9a616bb88298cc7a7bdf9a39f1ffc1aefb
-16de11a575a58fb8f65c47aaab60b465d3e8eef5240a9773874bb658d7356723
-f449270f0eaa74cda1a6d5f732bffebf4415e77d3a566d48e47d7629fa6b8a21
-6e8032e7ceedbd8ead4e922685d6be6448a14fc839ae4a74f6a5a59c01375a4f
-d57555f569d036d0337351c7305c49217103adfe4b6ddc8376f134eeb11ca705
-92d1e2e80c423ae05a0822375e0d3f059cbe839b07a290a6b421c7d513f1961b
-27c632269a8c35eed49010c561b580412b9363aa0e9c76e210b6a86a55016da9
-e04e8f7a5c525ad3ef4edd7550b6e2f6669508051973e36e435579c178d2d39f
-3e27bde7de754bbc68da87698aada323575cca997a1cc75f706634834d1dac10
-7103b40c71a1e59358ede2d1ee87082235e808481f456968bd649a268e566680
-3a8471be291dea8358c52ad22508da5762fb1e1f6128b34e32bb68039237a400
-c1afe9e07c69d8b486281a9ec09067d09b0c8bc16c0960771066aca2f4c18907
-4e2ab98be4da38b2ef92f3a922a1fa3afa66ccb7dc5c59cd06f7b6dfe00eb86b
-8abc28551decbfcab8ae483839cbedd2cfd6e7c8f6348444ee0e67e943e88444
-f9f871e9291a5eae7d63522caf0396c4cb477d2df5377c39c46b14125e100ad2
-4f15e1aa3dc33b356f6a6d9e1404efa7f05b6208948b01acbfb8a1079181872b
-f06cdcd561a855b1884008e605d67e653ef3357b9c6d5af90228c6b4676644fc
-cabbab905c7e9164a901ba7fd1c4742d454784887907b7e1a9b2d1c844ca2f03
-3991fd9fdd19fb4af35738bb380bb940b03e9fddaac1f64afc6e3c99ee1d7dc5
-5ce48afb651c9595e41c894a8d75af382c709720a2e94f03fa45ec2cfbf7d3e7
-6fc0dba65ae93bad352e1b14aa0f3c39cb8766c106a1fc656401e4ff5c4584ab
-974e93b2bc7f16209d80bb566ed5b67acbc84635bfea38f1e87c39027a0d1ccb
-1a93049e936116e1847fb3123585096edccbfd0aa63e623b8503a0d4760aae40
-0a88a7e87400875eac6f14fb7a7a8682560de6cbb43fcdf303758e182c4d12d3
-87ed4533d7c9f2b8e13489130d6ae5fe066f4ad856b167725e4ca2e7b842dd7f
-599de83285aa617d5ead39c7ac6ab77e42f5e1153250803103f7769cf35430f4
-fc5b91642a1b798ef39d359f7196d3f7b0f864e016da2e43ea1a2b8e8334e8ba
-c0af735eeec83a2e344ac6a62461cc1dbfacfafe1cc1db2ab1655ba0a7d64eb2
-4f165b64608fb31dddf15f708f052adcb6ce974d807e6ad8f7b94979ac09fd65
-163a3699cb80a8a32d49efcafad68856da3be30b616873ee511e361963983106
-f700c080555e719697b0de489286e397f5f81af94632216e357f1020dacd270e
-c7d9bb4235aa738a8dca7f23680c377a643b0b59e6a7fb83507c8cfbd1df3758
-3a565760689d25526f064e961d0c3d2071054eed80850bb10ee9e73f27654d20
-32bc2a750714ece1a4ede7b7c4be79f4e0c3d7a6b433f44774d6cc6a93f6dd1a
-29b855b805788ff4436794d2aa348da5ab69ce698e7d5b1956d1a7888607d7bb
-a6b59226b144dc8589e4787c8ab0342c8a085e12fe9ddad5fe1c185099e207ac
-f4308371fa4afbdf90eb5d08a0076d70615a4d17264baa2e712063032c188877
-fcec4971f2c7f4a9012fbf3fe15b76adf4f35e5c0f337862584b12d04bfbf85e
-8b3e8eeb64bc0fea31faa7a697b34be4a8c3fcae69ebd8c25fba58f3d101c9cc
-7d6cb4a6835a5262a28f9304dae690bfaf6eaeef09d44a0418b78e2a4d381047
-35a4523e8341a74509eef699744865f10168cbe739d4eed29e6542cb0dbad470
-d9dd0ddfb8164959ec59a632863920e18ab5c001845ece330868dff7b7ed51a8
-c50a11861df524d4dd80c7b370886921b9f6b28015a83412cdc4fab786791bd6
-37081dff54753214e35477c847ea13286c28fdefe690fef446f4cad67ac3ba20
-958743af664767e8d8ef8a389ec1c138128aaff1b7557b52eb59dee75db67cbb
-60d9b08b3a443b10bc84417aac4aa89973c8d8932af5b91b82b7569cac09d69c
-0cae12b7411269a1c550c94dce68d60ef418f21ab29ab552eca48a4ee94a4b27
-5d174ae06ce469bd5110d23678269b244cd596650ab74f024460c84b564cfc31
-f10b7d0a15166acbc8e9a70668aecd4fda96ec72af4d438f3e9c42e068bb2504
-66e725c097f17e533d6ddb0223a8c018e6445a468e5afed7d7d93ca5e8807f6b
-cabc59e9d7eb20de335ee9328a6726bab86e2bbcb847e18e2be079bda3c1a380
-2d338cc33a35b0bb17b37188cbcd54c760cfb17d5da0c66197da9123942a8789
-6bf0e622dc9e93457e1b73b7f5b96c894eb76af290e1f9dc439e36e972b3f865
-187781130941b3596aa9dc699a6a586c1acfba7e1d7b340312856ba9caf63662
-02f6f303f92f15726dd083b1555263d2e3bd50baaf7c0bcca4ca774f5e35cd0c
-85caca2366e06fb942b482bbfb1926fe47b1d95a83a5143ba801efbc7d62c003
-2f915672ee8ae1b235096c8f62635bc5c42a03d6be518e9c4a68ee0d8e48d1e2
-2de2828cfc76efb4a12ba5c3a3a08175545256dfdf53edf0c91bdff981f5b9b3
-fb8b9ffabb007646755e76a278cb1752b8081ebe91dc77177aeca8ca90ce2077
-f90d35e6f7aa90b1505e472ae5f09bb05f2a37b5e2cea2e1a3e5fe0e367a07c0
-f31f855d7f1c7b4272ea37398bec83f7b79fbf86129799e2ca9e07b2a01213aa
-2d73499beb7ff978dafb22518227532efae2a60cae34347ad352a00c0adfea43
-e3f95208c6f5c21e1fb3c0b07a1d143d5a8b55cac717fda2b72ff0c3fdbabf56
-34cf4c2051dbc59ec4c00b6e1cfe454cdbd9fda033cda90a2b66fad3e8271e17
-fafa42139467358062f2a1c244c48d52a9fbf5c1f360bfa45d0b03ec7ec4805f
-3e7f67e258936a690090abd309b2b93424efeb8d5d7deabee5eaf0db5d56c33b
-3a728c08624ea5d0c85f77beac600c5fb8c184ac63b3fcc5344f22dd878abe96
-4320ad7ad8803c28b4753b071213851247f35a2f90a59072312059373cad6276
-2a17bb449602f8424ac583843810a1c6db922a87bbddf800bea24f6ebb071d2f
-3a82053bc5ddf3eb11c3c32f551a81deb3000e57282552fc0b8ee17ad909bb2d
-b851793f65123af449d07279de0999aa5208cc293593eb9ef607c7e20e873e64
-6097ff18507152a8d111e24e419c148a5a1fbd339428f184bb3c5ce3a36af6a6
-9b211cee9150c40506c1e990d19ba8b4f0b5c01e7c19a05904cb63d127118908
-5ab937a91b2dc3b59ac6bd1971c084e2c156c10661b2c7a3d170bde0fa3e682b
-abbbf187ff39304d6e5ae80eabce1c54a0bfe09f22d97133e94afa9981e837cc
-0a80b34b29899474b65ebc6df73e5abc2f2300226c4e96e7c32b3f80a26fadc1
-e503fed433b7cfaf681e6cb33057a915ec53112e76cd9602ff64a75543eeb82d
-e6f45aecf9620a5a3bae1f4459b9ae6162e472e93eb2e0daceec8f0608721072
-e456972d5fa6bc4a45afe5a8a5694e538e659107ff4cd6a8ee3d38544e397ffc
-26a98e8771a5e07c99402b1722b09cc959f9d25126a82c7820de21a9855eda2a
-1b7e4d0145ec7017caa0349bd13177070509276241a0aa7dfae14f1e2d1805ee
-58714e9f2a647fcede216c7b3297910df45f91d8e0c9ec279f16a744930f3b77
-0b80d299b44b478377ef237341ecc5d9a59b333cfbbc229be944d368559988c4
-940209b2a4fe6d55713acce94181339a1d70589e96a54a952163b072e116f5ae
-4e672556501ac126d0dc91531894b69d5c8c6bc531db69a961cd517d4bc07375
-5683fa7cd9a77fc56c6ae62cdf6bb0857e8906f835035e78d3f7ad14375b6f21
-fd0436e6c914c3b8d6e543df1ee4b992c024e9d9fd316dfba3ba9809a089cc99
-8f34466ac94d689350a5075998d7240efcda132f3b8f2ccc0fc78f5d77a313e4
-09d5ae9f2839b9ba67cb79e1a0e7ff8f77e766aae4e1931a51890b3f0e3b39bd
-5412ab04baeeae007ef88984afdd56b7f81f403fc6eae6993367ac9071b396b7
-f690f613193c638b9c6b10350d0170696db08055fc583cb04c3c66cb71d354a6
-6c02a9c33e312dd36d23c37836795088375e42241d176d2168dcea614a14850f
-d283c962ddd274d58fcbba7668fc6987cb0d204cc4db70ad44c53ab5da5e15fb
-55c5c53b85d0468b1798bffc105d55973d081db5cf801d98525597cfab8be326
-f6723c6c5060c6001ff9da8d01855933f68d88ea8c403e6dc8aa446e5eabd57a
-4d8c080ab4c164e3a97c1c6e87b3e279b97e99127fbbf1126099928ea8c0af7f
-3e592175164f46dd15ce60c6087d1893dd388b7a8eb65d0c38c56fa3fbbf88cf
-314e3ca2b710ff61f610ba945f7405c373c2b4147713206be618b238ba3e367b
-9d158dbbbe4dfc0aaede3f9457893910f3a83bf6baa3688fb1176c93132e24a9
-bdbecae4b53fd2cd971091dc99359d11af0aa3e94264538203459faf0cc36410
-def19e919a2714e2ce1895ceeb1f26ce613e5f1bee352ef3a63f94fc343fe7c3
-4f831ab892db8e438144821d5a701cb71d36526ac44a9354f3440f74e9e1fda7
-723f0120f75059513bd52cb2781a08b52142e53d0a4a23d7d003cae26b838552
-a1376832da4a1b8cc20cfa9f72fe3a9380a282bbb73a9ac07972677045589c0f
-e08cd002c80e0064a732a3dbb6dc83393d470f826fecdba4f1d2e4be76a5a433
-9a5e25b1f2b734d4f1469b84d977e3ccbe5951c768c9274d0423fe5d740ac8a4
-e3affe4fa68dd8cab058ebb21962d72dcfeaaa47e541a2ff3e6ecdacf0484ec3
-7151b6b1fa6109a0113e3bef3145b53d05c62e0391e266393ba1a4b39a806a12
-f2fe6562dff2fc97eff531ded8dc6e0ed359b2bf16d00031e9e0753bb32c156e
-ea81b7db813752506558d39f967450fa05390368950c456f106211dfc0621e52
-66c14e1ebc6a9f3de3165500218fd683fa0dd2b4fcb937f14f7d3fb85faf556e
-3f53ad74a4bcd96872b46716e0bd737dbf5d3115ce382ffb8243c499503283c4
-274a0e51c9d41b302fd57c648a4e1769dcab4668ee624f3b9c84f296ba9ca925
-056358d1e7f5a56ce13333e53b5676d5e9ccfa4cf68f18f28aee890b1bfad737
-03b64dcd7c5f34387f4522f421045adb7cb8b552d5145b83e24667d4f80cf636
-45f80b863f0293b1d494ed65532c3963b69fe1a858850799155ed2450d836d30
-d28dbfc50c7a58fd713346961d7f0e5513394b29c06c52b786b48a2f13b95b9d
-56d6aca8250f3b716f055275af003304d36713f14228b5ec40de7c3ba9ae32cd
-eb91f8110bafcf7c92ea383bd9ca4d4fd0f6ccb0902b07841a4cbee2cbe21c4a
-8124a11ef70c32d89e4b86d0e84294412f305ec186afd600ef7d72634e931f60
-a75a22b03abbb87b4a163044b96d43cb1a8eac9484df8955edd18bb298612f6d
-a9ab0fe3153be8def9616e883e5ca081c79f607d7439ce5a28ceb6b17f51f0f0
-9affc2a8a766dcbc19e1dafdb34bab555934bc8b3bf2255e4aab837de34079d7
-3b310d8d82d2abe249a28e1fc6f65e529c301933849883e86fd7b7b44271da63
-15913982ad40ffb9c796f3b519f84d15ba2fb42fdd632e042b7d9f94b28f5b81
-5139956c9d4e3521d59777d3c34a07e4ab2d92ce1e64c02c612023bd84153d02
-ac1b86b34937b82522277d5c11a7a3daa95e63e4d122e626d9167a5a17b4d041
-8d5aaf88b8a59de837362e48c9fd7123c3c30d906cc081ff9a0a1ce3b168b9e1
-ce50fb45fcaa3061d7dd0fce1c7051ea3c032fa52fa63442629461bbf742df11
-e6a548e7f73cd0441032ffb059fb81b468380c5eafb679d5ae2f384fca2236da
-5d5d878a6e29e282d045a419488daa5d3500bab9ddbb6123112949548b37cd85
-46e466baf1c18d05475029cf8b06206338df4d287541137ee8d509ae9e3716df
-32627c0e28eb8edcc62bcc37536bf8a36b8a545d539f2754fc39eb8da84fef99
-02a3733603379181d07b780b1f0dab6b69ab3268adeba5cac438510e80b96eb0
-79ccdf7e76b2f88a37beb1b83e4b3529ab0b6b1a35d5b7add114578ce3783582
-fc23f6c5df43330e9397c71e984817b908dddb6a02e6da93c87f623b3dcacbb7
-5c7b032d24a5e516bfe910b1569ef48975b8b7448f2469a41b4ab69f419f9f39
-2d3ca7b9bc768151274aaf55b06c3e399cb19b6e0f15ec8868c6e668e524aed3
-ec176ffb6a8accdc068a22eff5d79498a00a99562e490c7cff7e59e7d3b3b1f5
-8e48e1ef5e08391391c7e9ccebcce6376480909156717c07de203306e8c7c7db
-0b8737da43a6a8e9218133af777bcc505e5f5375a3fe8411cb5a317619e9d259
-07cbec0088f2610250754acf52e22dfd59a160aace94a7392f2f3a578980b1bd
-6d1dedb930b6948583f7d978fbde76276822ffa4014cfae2ac22913621b0f778
-d50edfe8517092759af5bdd038316d1b08f2b31550d1fe1fab8b62e79419010d
-6a59355a2e73cb08443700ceab7ee437401683f20cc5e9a21f056866f2b67dfb
-4e1e8df8ddcf2c5823e7fef6f91ebd1fa571ce77ba080c0f604a263379ec4e2f
-f5694975fa6adb5a646ad327db787c204f9b5ff9f9228a3337c111d32cbd6f8b
-1da885425af61709e40d4352a1be6d8e2775372a3f7717e9aa9b951f79d2bfb8
-399d1f915e26836d454d286655657b72378551cf133bfcaaaa2a45e98f840bca
-522311100c7c92f46661aa1a75fb44cb28a1a7f0cbeebc2008c5fe882108e2ee
-1e0c683320c084d1e5ff7c0657de7942b0daad28494b24649b271d82c10b7373
-f02be60741104e31bc70a2fc2ceb7db132f272caaf093993de5cc3d139d559b8
-ddfd287fb1705ca461eb03a4e039428ad0ea3baf3b29f824fc8c8edfffed4803
-e5d0af7bef8aac625a184911bb28809661eb2631a078fb9a244f043adb379476
-d0dcdabb21be4f1cee1b21d775a53dc6a1bfc4a8
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
diff --git a/lib/fonts/Vera.ttf b/lib/fonts/Vera.ttf
deleted file mode 100644
index 58cd6b5e61..0000000000
--- a/lib/fonts/Vera.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/VeraBI.ttf b/lib/fonts/VeraBI.ttf
deleted file mode 100644
index b55eee397e..0000000000
--- a/lib/fonts/VeraBI.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/VeraBd.ttf b/lib/fonts/VeraBd.ttf
deleted file mode 100644
index 51d6111d72..0000000000
--- a/lib/fonts/VeraBd.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/VeraIt.ttf b/lib/fonts/VeraIt.ttf
deleted file mode 100644
index cc23c9efd2..0000000000
--- a/lib/fonts/VeraIt.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/VeraMoBI.ttf b/lib/fonts/VeraMoBI.ttf
deleted file mode 100644
index 8624542ed2..0000000000
--- a/lib/fonts/VeraMoBI.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/VeraMoBd.ttf b/lib/fonts/VeraMoBd.ttf
deleted file mode 100644
index 9be6547ed6..0000000000
--- a/lib/fonts/VeraMoBd.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/VeraMoIt.ttf b/lib/fonts/VeraMoIt.ttf
deleted file mode 100644
index 2404924856..0000000000
--- a/lib/fonts/VeraMoIt.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/VeraMono.ttf b/lib/fonts/VeraMono.ttf
deleted file mode 100644
index 139f0b4311..0000000000
--- a/lib/fonts/VeraMono.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/VeraSe.ttf b/lib/fonts/VeraSe.ttf
deleted file mode 100644
index 4b4ecc6667..0000000000
--- a/lib/fonts/VeraSe.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/VeraSeBd.ttf b/lib/fonts/VeraSeBd.ttf
deleted file mode 100644
index 672bf761fe..0000000000
--- a/lib/fonts/VeraSeBd.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/c0419bt_.pfb b/lib/fonts/c0419bt_.pfb
deleted file mode 100644
index 4a49dd591b..0000000000
--- a/lib/fonts/c0419bt_.pfb
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/c0582bt_.pfb b/lib/fonts/c0582bt_.pfb
deleted file mode 100644
index 9baa1da24c..0000000000
--- a/lib/fonts/c0582bt_.pfb
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/c0583bt_.pfb b/lib/fonts/c0583bt_.pfb
deleted file mode 100644
index 08f6871c22..0000000000
--- a/lib/fonts/c0583bt_.pfb
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/c0611bt_.pfb b/lib/fonts/c0611bt_.pfb
deleted file mode 100644
index ec6ed0607e..0000000000
--- a/lib/fonts/c0611bt_.pfb
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/c0632bt_.pfb b/lib/fonts/c0632bt_.pfb
deleted file mode 100644
index 0701172896..0000000000
--- a/lib/fonts/c0632bt_.pfb
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/c0633bt_.pfb b/lib/fonts/c0633bt_.pfb
deleted file mode 100644
index d68f639bb0..0000000000
--- a/lib/fonts/c0633bt_.pfb
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/c0648bt_.pfb b/lib/fonts/c0648bt_.pfb
deleted file mode 100644
index 72a1606b4b..0000000000
--- a/lib/fonts/c0648bt_.pfb
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/c0649bt_.pfb b/lib/fonts/c0649bt_.pfb
deleted file mode 100644
index b5d4ded6b2..0000000000
--- a/lib/fonts/c0649bt_.pfb
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/cour.pfa b/lib/fonts/cour.pfa
deleted file mode 100644
index b8c097b068..0000000000
--- a/lib/fonts/cour.pfa
+++ /dev/null
@@ -1,1954 +0,0 @@
-%!PS-AdobeFont-1.0: Courier 001.003
-%%CreationDate: Tue Sep 17 16:16:38 1991
-%%VMusage: 57844 76768
-%% Copyright International Business Machines,Corp. 1991
-%% IBM Courier is a Trademark of the IBM Corporation.
-11 dict begin
-/FontInfo 10 dict dup begin
-/version (001.003) readonly def
-/Notice (Copyright (c) IBM Corporation 1990,1991. IBM Courier is a Trademark of the IBM Corporation.) readonly def
-/Copyright (Copyright (c) IBM Corporation 1990,1991.) readonly def
-/FullName (Courier) readonly def
-/FamilyName (Courier) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle 0 def
-/isFixedPitch true def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /Courier def
-/Encoding StandardEncoding def
-/PaintType 0 def
-/FontType 1 def
-/FontMatrix [0.001 0 0 0.001 0 0] readonly def
-/UniqueID 263786 def
-/FontBBox{-48 -288 684 841}readonly def
-currentdict end
-currentfile eexec
-b2de7b9b2a2783a9a81f7a04e7605e0bcc84ad7a981f9d6b201c5fc6acdad3ec
-d09a8a1907296b7bf5510822bd65c174d41912f5e2bdc23ec621dd28cb4f8b62
-5882cca862ca3c8bbed56696f8e17809439151596792163977eddcdae7b5c346
-e93a0756e7da36a403e30b34b70eb809ec5a5e6dd43dfc5d482e2424a93fd4d2
-d0e648621eb8f9339f10ba2db9312ae5c071e20946278b5d54f7858a41f0a1b6
-b2cecd201fe0cc773a733fd892bc4352fd2c68554ad49658bfececa5de0a4178
-07560879485b17f950018e00fb441ca6e0face6fa6acc95daea5b530a954419f
-a15ff97de6a7ab23540344e0193d5356ebdb99f60fce74a4c1828a36b3de4ec4
-92551fa4f0cc7ed791d897ed75bc5d034f85f7326b59e16a9e9d20d7c7072a4d
-311fff4cd4635852ab3e098236a1eb05be8e5d3e4ced8ea930076fb27ae7b5f3
-a135b8e3cfa19b4144c0672503b51641ecdb779eaaaaec164216beb4de034575
-66b93918a02aea1730b7f138623f2df763d6ccadea312d4059487851ad39fa5d
-6ae273d56563eb3788c4d9aefb2bd85feff2c8f6a0c383f653ddca8d4072a397
-26bc47616d936e336d1502b65cec60baa4f7c423c290d9a8e067b433ad52790a
-b3de64436aeb25a5b8e18a91e616b9c310d8bda5546cb5f46e8d74adb8f970d4
-88a1602e8ed3390cbb9f1e4564f70b2141cb8262cf4dfefbbeff3d15f49afa29
-da9deb04f1e004399a20f57f770b838059aa75ffb5da99581f2fc90dd7b7f4bc
-3d3d32a8b2df7a3b9ca0311f5a555e6f05babae4c577b02379370e5a364dcbb3
-1962317eded89394dd26e5e37e5f776a9ce97ffef9429f9e89773a6db3d642cf
-319957b03a0434f4f81e782121d8fccd08de4e54e29b1a25b1436d859db45cd3
-c254fb02b22288d080139bf20c4fa130f98e83fde39963c3068c7aafa1c6afb8
-2ff6753842d6dab630e63fd8f7853e9358bc6c074f0acbfe9d56d3b93eb7eb9a
-901ed2bbed92737fcae60b95e7186ca800ae2db1570ca4b0ed9ea9fed82ad73d
-ed3977472c257b253773de2ca37eccce4faf68f1eb5cdc827dd5bc8e3c03bbfa
-e9bd30bcb3cc1d35660637a882f0f4a037bd07fba1c6f5c0e8a88088ecf853dc
-b2dc41ee4ed1f75640a93e9208fe5cdc7366cf3b738cf4177df4f922d8081006
-8f8f2b0143a44caed520141238781111a1331e7a6afaedb2019cf0eb438177ba
-68fb0d443989e67d21f49cb8a52711507792c45bbf0c25f634cf7c1323d6146f
-7c778eff204c71778e5e9723e662106caeccb514b9be0936aa409567ea40b9af
-b5852cf3c9cce25acbfdee0097f828d90d21cfcfd46ea083ead540877e565883
-3234b8609a3f376ad94098ec1a1685323be81a64a6174851b6e8e80d3d8cd6f2
-41e2492bc07c052dfd66c7fa12ea0ca90a15f49194b0dbbd6f80aa49cc52e0ab
-134571c2883f5adf6b57a036dcadd18f7e397b87fa80be532ac7aac3673796f6
-f20f5341984695dc99359d6e923a79441b64b85d405d53f89edf79d76278604a
-4001ccbcf3e10ca83f71202d6f0a2f26db5114515f8eb58a2eedfc6c9f1f9a3f
-c40205c32ca33771d7497307b4f67618bf46d3ecadd0d5b6f21d298784f9e22f
-e8a97443e951a141e79a2cd6e500653fbb8e34613e57c270301dbad7b89d35b6
-b7f6cfc81e5e9f58508bfdd6c50c8b4d9114f9d9d0764232abf8c84b8c8d5284
-f78138778565991ffefaa9b63d205e74146229c2656d126e3664870c9800b9cf
-ee76f078dbb1064aa5609c6c553b2c660a4054e46fffd645e8eb8864d1e15c33
-e20d690b90b6a5b9a7213bdde4856236d9f00d882d8d8cff4b27fbad85503029
-b9a4a75da575bcf29ae444f0714b5580aca0bad9460fbe2c847cd770825c8b0d
-72fc684ae45ced430997d41467889fc1969702a44fb77e8de557851d4eb34433
-631c225a516281ac5e0ee6c0dafbc40855c315fd60559e53b5f33d9ef0fd1d04
-31be569d13f6dbd52bed9eff8e7eb514fb469daf3f9f31c7b8d31411692a72f8
-fc3907df11992b3aa76ca73c82710c4901b4eed793d4909a451f5f09f73db0e2
-0c32146422d4d5f83a4e2e92cbd9297944c8bb7205aa2adfc88dc6dcb4e82ff6
-07e4278885300463775ad999e2393ac0f67cd635d955f4ca5a9f57662c7e76a7
-26e7c4256827f0c03cec6855174fff2b78f1870ec2366a59a4e9983ce00941bf
-17dc97b59104d05746ffcc1f7bbfd007fbb0eeb36d42f959c90382e49737352a
-f582a0c76c1d86a1323af83fdfd653373a3c3b7460c839858f6fcc885f3d47d1
-902001ff877043ce9d13b1f8d1e819320f6374975e740aa77886063741e378c0
-ea28694a1bdcb89c1e2d5e8cb9fd5ab6d20be8cb0a2a74ee73d5f4c32b26c067
-0e7608a372b6e0cdc1819879ca3eb1870c22ee21b8d42780d9ca1489a4abaec2
-7dcc2fe096c55b528baf52e468bac2ee1db1c6e1609740828ad1f4faac82b9da
-066b8472b15faaab3109dfbb85667a7def1794ff158cbd6fdaf9987567d8a6c6
-f86ce77b9aa3fed671f7c74a345812c978fead18ac776f7cc2957540a1720941
-5b9cc4bbd5d8aef5997110b41daf2c3d41adf834aa24862f052446ff8a1747f6
-5dadef8451aa72f9c367f21a98e1cb18b2010fc17637a673959e5790df9abb82
-9314ba4785b7bbb5e68cc6da2e021cc4345f4e6f5c6488d481947454148db9f7
-c289ce25764ab1d810268a6db157520ce871f1dff95396f03780bba8202d430b
-f76046c04e1f0ef462afbf3650327876b5ce19d87ff9a6ec2e3c294976778c66
-9bf548ec241a295db3cf4139936b6127009f9807f48f09cd54e920474fc1ee65
-8dc69c4afb90f7a737df582b406c98801e77b02a02212a0d924ed58ead539b7d
-18f4940a717b46ad908d521b7d07237aa25b4969239fc4968f5cd9827ab24272
-3d29ffec1926011161405f8a9a5c9e1bdc9a9152af563fbeb44d5e4ae05405bc
-6a92b23e71cbb866366389fe0d91bcacd5b98a2ed4dcb9976ef9eb6c7cf06d9c
-185ef69af37163d441b756f08060fa733b3ebff43160d0ccf5befefeeae06468
-0d18f7c38748d1cec437e170ef4bb6d85eead3105b2a354de80a6396c185caa9
-1d57966cc000bff2880e068d61f2ba670f7f9a2fad0ac5d1f205c1e1fa0a1d3c
-110e184837018af730878a978ab3d08581e8b222307d00f86909c39c12d40bd6
-c7299dec0867f7417de60edd1897bd627767b29cea62593542c642f1089242d8
-53f2db5f45b7b21fa906851b2f28437933bd4229e32d093eda4d448641380da1
-9696d7a77fda761865d9a4a8ff48de5aa6550b2f80c7e7fef54f5dc709a9b2fc
-120b03223ad9ae5d06298699ff21ea2f71bd34afb79799e67cd496a57e417f1d
-87bcf2bb0c5f9fe9067af267e5740c26d6f3a256330d68f138c81883d7c07eb4
-cde5f6b5d82cbf5dd32e0c27c393cbb77cad6dbb058fb1c6653a5cd1a78f0577
-87c9dd5b1a5f83a13226571d38d367f2a4e369b4651a77789aa785f4a6561c92
-e0e82f217b2597d8a180ebe4547aa1500b0f814d309b5b1fe9dc53282c914407
-0fc79d82b5d5ae8bd272b022b35e66cd260c046d102eea1a1a4c0d376daa9b2f
-e0dcb3a7254130d5787191998d88d4872834f331c75485d09799d467bfb62465
-5ea38fd84edff90fbcae880820fda0f2a3bd5cab972b4d22f1c649f970e05549
-f33e95a6d0af69653ae918872958bf100a04a7c61b8fe7433697a92b451ea444
-4670e38e33893e59ecb4a621ecd68e76308ec0eb2716fc7427ffd64fe309a635
-71c7b86839add49634114c0aeed57a2afb2a46afb303fed2ca4a7b3cce180595
-49bccef00e92339805dbe1b0c05ace5cd5a9c6d8931cdf62ce4f5406f8ceba6b
-29b696b0e0ccbe8b9f9e1afdcec58064e3daa54676f493af1ebc8a2c26ccca62
-9418f0015d84e5931f620207d2c8b193113c8e6af5a0738f7085930e735227e3
-7bf703da80016e492cdffedd077be121b35093b031c35d369298f78134093147
-363062d031233a26726d549b16ccafe56eb0324ddeeb4ca8904da4fb9016fb5c
-46b60e873074c2e0c78364bdbd05e0246fb44e77dffbed7fb94364a0ec0970d3
-29ac31712d356bdaaefa99865561391247a78c8ff19f6086b4d8cc464d0b3b41
-7fbe5f6b3e68de6ece2242224dba66940dd25a412c337e4c19c3305e4e1699e4
-53bfa096d66bae0ddf3a3f6d84cbc7478a00f2ff606f86913b768a18f5adafbc
-8b18e653351cf8d251ecd0f0d3002862223e3488701c0a5647bfa63b55b5e162
-335533f701659833fed17ee4ef0281032344faf499ae8e33a25f97d5839fe077
-1ad9bfd9e2c1a863e0eb7ce72cc615f4ff19a8ebfe2f44aa6a636bf3197ec107
-37b3ab19482250c61d1a1bf7fc4f325056fc30554f92b88e6c8bc8ea8e5954dd
-e367a169447091d9d01b79265cb1054ff7000df3b659208c6166cae1973f3559
-6f4f9645361ecdb125b87b6b9096b8c1894e5e1cbada10134d54ece4bc0a73d0
-7a93de3a3b943697cd3be33ddfa0696663524a7b6e246984620dd268ff65291d
-e84855ec9192f88540c57826f6e6f25fbcb4c4e39f6b7fa2a3defd578c08c8ad
-f66fe2cc07a3317b3697ac9e5ee19a9e225edd3d52323982d83d4cfa156eb858
-681dca6e77ad60dd946c8a1be74a8bb83fedf6dab14f5a2a5d1cb08ad95f2a93
-c16c39cf8672fc59bf40400920265c7e06ed02b2a788aa23425b45dba3b35a53
-098d3ca23c0bb5a9e16ffd99cb4846121c6f5656bcb8d34d29e3eb078bb39fce
-be3b98fd375ba941c515c88cca36f7c55d325d3ff0932244f9c8359831981a10
-67c57e4b0ca5e2db14a9c2e24b10fddf7e037d4cddabae2e5b0443c3387eece2
-04af27ae3befdda5e88267ddcd3eebd90560de14c8f2817b6e6055e53e40b35b
-93d64234e4e749cc875d9cfd48032e1059f2d2ea0e7861f3f525c81fe1863640
-c851079cd35118f98d53ecf08b86add9fa65016797fb13f20fa4f9fa0c5644e2
-86e4f6427a278a0715ad34c88b103c6fb8c09d6500886c93f399d56dc0444a53
-f64649f39e423e9b8c5bd7e8711a4455b9bc82282ac372524bcab6140921f9b7
-10f75c662901c3ae885424b03f12a4c9f589ac693c7df6e188913b64a7b1f70f
-0c315dbef339b801d0f228c5d82d08c00a9c9b1d825559b47b00e98e58204a11
-257dfd1e7cfb5db205b0dc4c3211374459a58a3d23713068bff43c8b73fa51ce
-bf259e69f45b37f30869f44bf3898ef27d9f3b4710b28579538ead0240f72be6
-15eeef499d8d2f0a7aa72a6fffc68a0947dafa98f52e94aa14da157cc2c71aed
-17f3c2661ed84e058555d0354770c155c54a03186b815440cf8c7e37f9117e94
-67a5d50281ecea2188537254696c4b50c3aedbd3eba04b543dac970a7193bc79
-bc707725c13b8a747ad5df929cc8365da27c028745fcc82dde3b297258ee413c
-d84d17166ae6dad65489dc8d98a4c760c08dd0de05754b408a39434b17773f32
-a3519b27d51781c807a352880f5d667dc8cbe54f2132200db7971b0be03eb42f
-aea467cc7a1bdef783ce5d710772da9b71db45c7ba4f3c22ae9a9bdf1f26c29d
-811037a170868a8f6644b0092e7cc538fd5c13568ca262ba0fe244f7307727d9
-318a281f38b607c172e64134edb76d6535abbeb9689840a297accf5c15150f2b
-29e8cfee85d099297d0c6d50720d686cdd849751966c88e3aa8998c0c5c17665
-69029750afce844147abc710780af405d2a4163d272186ac4d486fc32c1770c8
-37a0656b6a0563e5b38a080f614ae9d49bafb92c96e2bfd140a88c4989952edf
-2c835503abd01565e2cafa4373b790376483d4762a99adabdfa0d7a7eaf9da29
-530f626e330c8cc65113b1b7ddf5b01249b9651ce4c47111a5c6590755ff0744
-5ea2a3afa851de664cae6706bf0b640f80ec4a178e518bf6b41c793995934999
-0ccc3cb8f1864b6f20b1160c9ea3f1f8e658e88c81fcb7a28280fb37acfc06d4
-5d5c93509db13e88349ccb959dd1f23c6d5a574b9489fefbca90f8c24982bd5f
-8fcc0ee7e13ec573153b51a760f47811a50c1b1e981ed0007e952d15de9fc00a
-64966a945ab7cbe49e6bf90062cd8f6fd438428b14612085dd18ecd59924242e
-e5c9038abee84cd94acba6c96e805305bacde3a0390a456e19dacc83f8767c5e
-a9fef61dc22613e3048cac14ed6a75fa28c06d348e240019aa36faae66d21853
-b43a4c05372b0a958d3d26cd22186f95057ee646602ba13e1974758307085b23
-6ff8b0f2194a00258a76b18dfda0d5049bc9780289dd54194800554a086b80ea
-65d97b1d6d03ef0ad22356fd31c90485c34a1cd00837c419c7295b712a9a9258
-b7f0452165473af73b7e21cef53ce54be278298053937f89d0d3bc15657fcc9f
-3246261de1a1443c26cca0bf28d291f451d3ce279eec77ab32d5463f7f5ccc69
-5f6fc60739a5ff55dee8232b2b868fbf60a2137d8371422c1fd08fc21468bb4e
-6addec19fb2def9aed1599fedacc1e5a38670011bd19ca8415af3d94010a50ac
-69e8d2f36cbad97548090d37e081824c5bff928e0a767e0947c8c4f00388e4a9
-5e992a705ca0e7037000e4c191a898b40a74808db0c15c9669d2009ea5c7a391
-dec4f2f4685dfc63fd94703f948d758f11efdd2e0a634e2d4274da9bd84ccea5
-8fb6f41e617ba30fa2114deb639b7b579e2ba187bec24145664921599b6b0559
-d742b3ddaaa4f91ef05cd15db7cb7fa2400f66fd9db3d207cc5728d65b866295
-10b2b6a1cd2a33424a9006a26e8bfa8b3571a59e5cee066cc10bf301269621d7
-4f1c492a02220c551560eab04213b3e8be62fbe2d7af013072ef82f1dbba5b3c
-be1974b35ad6e92e6d15c2609c17706422beb22f12d3c4c0a748426dbe65cea3
-a0ff0b208a66460ce8d359b09333e208ef39fc7fefa453cdcb028b195e70c577
-260962e2e8900a286e628bc5b0eac0328c2c6f64f0229ad0fc7872f48fed6d1b
-bc490da985c19f622bc07b388a4e70e79bbe40e75d928670eecf2911075dcd05
-6f0010a492dba50abc966411d49f39515b27aa1e16e7b6104b16c6b52b428ab4
-9a6e98ecdb65aca5377819de9d99db481a2d0ccb90a1663cfa6eb6456d101609
-a1958aee3c8f2fa4396038dc4aec5dfd472273900e50bcf3cf5e5711055b90a9
-dd6845b57fcb0d9c6cae3ed0180c7a4c554a1b05298518f4d7de4107993f2715
-4b90a115a8d1a3f074a4f34b67ca5d733d59630a5b0ed10fd6459f4f9e3d17e5
-352ef13aed05ed7a17a44068884977c653628d8bb5d185f5783d041db9644d0d
-69bff8433e2d00c9f6a8837a414270c66d0249e414ce0e56d5051ed7aff463c0
-5d6cd8ea3b09e1a3fa4c1a866ef3238fda1b43606f29cffafd8f91ae673bcc38
-804f91178c0d596e109b65d5a462a103a4a29d995567ec16f0263a03bac4132d
-e2573eab9dc7349b6b1fdce50dc21125e38d17a3f6ef66b3212de5e0b74c3dd3
-7541e341be122bbedb6ebc2db96dd991f71011aa719c1784e24479deb65f5d05
-3bc429785d4aad99de7b5b5c03e5ce4443dbc7bf483ef1be808c8e508e6000f5
-1dd9d907b07db3d9f6566e5023a8ab0eed23857b30a6ffda86dd1aa3b98eb1b7
-bca8ce298ec3cbe5049272ea33fdca7a8a5e701e27e07cb3da0d395d258a1dbb
-8714d83f3ccbbdaa9fe08900475ea6ec759f425bde968014214728d08ddd7358
-1408d3974773001d9bf782dc9cbb5209a5d3027aca7bc277b5dde20b991e8535
-1889d8d498d5e8ad712cd499727f61aa3953be4eb62133bcc578381ba3acddbd
-bbd5de324e4195cdc594baa48782031b9df8aad86ebd62218b119123e213615c
-cd6894853bfd77d26740d044f58e602733ee307442ab929222edb68527550414
-9ca05eced3d317f03715b8799ad1ef2ede2e3e0fb5aaa71931e70c33f7557128
-cdf1022264f9c9b5dd2d9b548a76ec92ecf9ec2029158b376c89a27c4f738009
-b555618b66865c2f98af0733208d65b1822c734d3a5a2a0d359a32dd566648db
-eee996fc085b7025b47b0f8f4df03a5f9a3168b722351088a1eadecb90456a05
-ba74d908d4804034a3b9a915cff7a3b2d467f9a6adbf12c2995b75c03db7b23e
-b224cdd2b64a0ea942ee4c07af8eea6587a8d3781ad7a6528d821bfd7028a2fc
-5478b6460aa696ee868319dec5e1bcaea69f007b1dc80c47701adacf722b5458
-60158e090398d30a9f049adf3274a492fe891fb7b2bf76b78bad2fb05bf43bf6
-b14095b00eadf94491eb50d75fcdd95025dd329127e4746c2b433cd4793deffe
-5015755a330b821f93f96ab10b508e71363ddb55cf4c6f9092201715cf26d859
-784c49b636c639caf84e044dbe3c14bf6d64e9c259af1f24ec73c9d30fc0fac3
-1f9eaf2ca8f49d0d5c18e6a12dc8acdb9f3d8ed49f607258c94967989cc31a21
-5020a9fc65815c230e8da7751552a895b0064c2a1cff3f18f9ceb908540a92a1
-06c7d46c596ecda2e25d331ab85f534313b214ed307dea03d4113ed6fa2ef1e1
-db3adb7861fa48ced61f10ab89faeb82caceda7fb1e9ca240e38611acb421be1
-119683647413c0c063c1468f1376a099f08351bffdfabdfce352ca87c125c021
-2301c6793146014d87d22727aa014d56c375945f7539863eff029d046197d65c
-6a7474feaf44f7c07b0ba500752ba29f5f165d4abef0ec13c625ecf722fc9ee4
-6958a291ca5b1f385c6a5c6ed4fb0036cfa6fbfc46f1622a59f019983d1a2f2b
-6662970ba2ffa63322b5bac4d58adac06e2ac789e0deda106a28a860e87ccf66
-39ed41fd29be8e218733d486633b763d0c226c18f264a632767957662400393f
-4ccbfeec54acd358dbd43e71fd59096150e9db5a2aa6b01bdf8549dc0c9170a0
-05a2e18275d6d74b6815f0205a6990862a083edf44b4052f83ead884c2d891a0
-698a2cdda09d43d67fef477eb0181246a8ea49d8407ca5e24691dc83c45bafb4
-4e555c33e59bb6a17f2bc3501217502c545082e1de1e43a3fbea39ef67644fec
-e36492edde144cd3aab6778cc0a4be0fb15bb46f95e86f7b4de290e66cc69f66
-5b20522987d2d0ed0ace9e250ec6c0c4793a2eab0f8f9a00d76d624cfed7399e
-d1e766b6c2dac1c46c6a8c3f291ffc03eb71dc220eba0573225e74c9df93e3c3
-d31f4bf8b79a0eae363eebc0d4547d61d0d54c42dd66fabc8befeead4fdc6bb2
-0586a0a47f373849b0b6ddf42a21c6be6e1c9ddb2f78c71a334f855173f681d7
-253a9084447b363872c750476365ac690bb27460e4bbf22ecf0e4d2481bf3b0b
-afa54d4295efa2d38cc6490324b12dc991060dede02e8e29156ffe3f9116067f
-0478f9b5928e44075e847e0864e06191c88f6ef0408124499b970c5c5acc28f0
-6f15eb4fcda631fbbeb199ec847fed052710c5d3e1f1598f7a279110dfb67e87
-8a0caa27ab4efcc03a6953e28aa9d660999624cb29ab8904942b5df81d67a462
-615111d743ca174075f3cfa6d239741a4e6bddf182de776addf3810047c24c44
-e453a67241e96bb3ed0ca17cd928b8f67585a228176d85ef4b7fc0374123987d
-2bc1a0fcb9c5a5be1749e684270f9b77c5cf4ae8d360c14ca596efe21302d343
-3f7881e8a25a88ca999a9f31a2467fb739511a42913b98d56671c74683f2b8de
-6cb20b8b9fb3d1b51b9a9a43b8afcee655a3f7217f5a952093f7a7ad84593aab
-fe0767f6879cc2ec7e9ab5b59bd82f48d06c9adc0fa218bcf9e1f63e9000eedf
-ed014a091dc952e3e0f07eb8e7dd1dfe0cc0e6af9072a53fc95199f9233a66f2
-d04c65bad02d00c3c5ba1f5af4d33a94e8eb5ef8b21ed1637b1c3e3522cff141
-77cbf28628d468249a154e900a9deac70f0be7b7d7efe43b9243eeeea068b03d
-0122feac859438fe96eba107d3ebaa99817816652b53944df5bde7b78eae04dc
-d2a179fa5c3002457ccce48def5739cd02a8bebc5d65a626bb50e4857a592d46
-52d7696129b176e5ca95c9c3491858d341deb70a0e2d57b811eaef78e52ca362
-9e9dee7e39259100ea60488aabcc05ae2c6f751f41bcb2c690161e8813fb4e7f
-d734f2c6fdb37ceee6f7bcbc29b2819e904e61f892fbaee59c4581e2f171f9f3
-60452fa11a872267d49f62df732dee74c8074370bb37d33d939e4a933758487b
-280b1d83cb23df036ea8304a2531465a647f81e63dde4734c49a51ad26401384
-0793737f31f69413e5f5152e30309701ea8e96357cbc6bd39053135647519300
-70836262da78a79f8ef1d9a17458e02d8040629b6dc7a7dc114d05a4bb01f90e
-01480ca86f291747c4c1b226b2ea6c15a38b6d7078f2f51b264eb125891db1bf
-a669525940531976089a9a63fda1c89fbbcf9e5a8ef413f837bb541b1fd6f825
-b7db4d1c1f3fa3eef70eb4df0e962393060034581ae4609479013a72d16803fc
-a455f9722c2bba278a1ba5bcf1b8d1a5139f5ae71ff532481524acef4fdee7ef
-14d343a1f0e3fe847d9c9e5878bf1e5530820de3e6d438e1e66f20baec033b4f
-92d055105ed98345bde4fbb5612dc76b7f51cb9d66150d153a10427c027ee838
-38faa910e77fcd45a41bdc6081b0826206b56c08232984a85a5251a8a8362cc0
-c4b4f4dce651519c55777e6ca349bc060f9523c421b264d1b30895da4abfc4ab
-9ecc4fe0b4a1ca8310f453de21a1e73e8bb587ebefa3f4555b5a332499cb2f1f
-49b7d122ed4f470711f436d05695fc1f275b93ceade6d04fb2108517d670949a
-4bdba8b6cddb62b1c9cc92ed63a8890d1e287e0051e7c8bc47b4a7fec9c7c33b
-f668abf07c2ce4e080c8c4e9503b61940db11c5f17c54d09b8b8c5ce3985b422
-1ed39a00c39e87166c7ba0ef441d352259022b609513a2b134e13f48065c7acb
-4b101230ba98195e8b49d570347fb95443269e9fcf9fd03c7aba76e7a1b13e18
-7d344d41907fcbdf19f616daa51df3b1b1be673f95c4ef1a271a908548cffd0c
-5f70521eec3119ca5588b4b7e04954df14b0589f1448eaa347734e92128f4d51
-28243b9e8d1d64fa12f0c89c604ef7ec03587ba0858739ff07b07dda99390b74
-a1ff879e4219a459c6ecca54896449c3bdf93582f0890bdd0bd6cf8d5168053b
-9a33cb7746f62a84af705b6135ad2bf04803e34abb34185acfde007901cfaa43
-64c992303e28a71bdda153858d252d7fd2da0d8dc618fda68f3d26c03641019d
-7dd2050beecbf38dd29039ef1923fdb29576b7e3f10671d1cfd93a2e5dbff204
-effcdf0035eea6912163e8a3d995ef07170e0d74f88762a3cdd080d6cb7cbb60
-3adf3cf1e8079a2642cf23f40277b1d0fa687adc1ce2e22ca28d2715d58cf727
-a9bc686734ec03602ac69fe7ee9c08a1a38ce9871e9038cc624c1e423f34539e
-4c1dd622e6a2d30e06e2095e30b6c545dfba323e78413ac65afc1be958369d64
-f21405f98fe5b5e58e9ee85dac85dc318349e91e64c839e9c94ce019c32c6cb8
-5ed016f2e6069a4b374e37155400beb75dc3fbdfa829980698b9d725996db955
-e4702b4ab9c406991b30154e150ad128f2bcc1d6aac5383acd6a9ce148ef92c8
-70931f701e867f254c7c82aa34f8d55b28f546e9b7f80437e5a258f22d55ff60
-916a502103299649fa9b14e5dcb9d2beea401e2a3a12bec2315fd88f23fa8a9d
-f60511057ad5ab55a602688c5d9b215355bd24cfa4dcbc9959d1facadd693a32
-0bd8737235896ff92faef4135e208e0b52fee9ff7f101a4957c241cb836ef31a
-4368603d687ebc95ed844fce7c18983c888ef7309fa051593913ad1d767e142a
-d6e6993375d0abce782bd9a6ce804fbf4634a65c063344c1d8469684c09a9d41
-d64736dd3c7dac43b546866d7182336b6a73a4335b8696a43116f9d4a83518ff
-1ef7be60d5a243461737ccdf00093ebc76627a1e24d3ac2a60cc8eb39b7ddd3c
-205d80bfdc89dc0571abc93def1998bf1c9c4128be86b52c362446f2ac2695d8
-8ad1626b27d6110b8d130fc7189266c5bb05f193e826a98e86374c57ee9af55a
-2ebcccf8497a068d6f60769d2c6a22bfb9685fe12e239b4b7c70f13d3ceb0dd5
-9eb53809883cffd0d5ec27e0b66b7a41e642ec1d989ce0ced2f386ee381ea1ef
-0c659556abc7dac2d458f816f04e0fcceec190d561c0683f4d579807554ef59d
-71762374f6bde146e18ed9944e053f99688ec4d84cb8ed2cff8f7aa3a9b624bc
-0bfcb231c35f93dff1382e9568db2499df08dd1f8f8b49ebadbbc2df3943d11f
-3a18992b25c7562a7f1faf0e6e653a678942ef689200eaada357e28f2610f9d2
-0f5fa45e81142d264e1e1a54a327ad4ed915749e9f27dd8a36af0b61c4440c6d
-9703e5d375f449d352148cfa26c266ef7afb0c3b598e6458d82780dc8d262fb4
-57a136e4107749b0efce94a6ac6c9d49d725d3ae79a217a38b238e4b766edaee
-64d0d9dd1e571f16ba46307838319adf6a0d1e7495cc545b7f1ea4911c21c8fc
-b88075446a45baa28a9ef33e0b3f3b8db25c57c3a85e34ab0c0fb1b18e7be01b
-cc2629fdc69e64825a845fdd7bae1cca2666dcd8a7f846521f4eaa2ab5eb1b51
-af7002dccab0a9a7389c2d3129175d8ce87cc4d73c6d46fcbc10018ea1538fae
-45d1b02efd79b908cea0b20d186dfbd0ab05ae06084c5b338d1f60111f5dcdc9
-e2818773fe82b7e0a621678987b93e37946bb24b181a4fb4cba56e3ef726c158
-b0e878ab6469ea8fc0de95a17742141c1ac2b765be853343cf3c935be5b14b37
-203788f32c418aa6206e80edc58a9af1b9547a5bbbce6cc95b56bca4994b32e7
-6bb19593d6da2bb4db58c0b0d1bd0f94149aad4b85a30131f56931a145a65f1c
-ccab13dd4b4f3f233d6eab4daf44f42b89da53d2df61dd7e1fa0575f27504b1b
-74f843847454fca0e5264fc642a28541d6f1d1caedf7db860ed45d9965121b53
-5611a3fdc881cd1366ebdfb490085ccf11f94905ede6442391bcd93b1d44bcd4
-a7b2f17c7b0ab3bf04d07787451e43b3f25d5e864fc6abbcee5297a293c02937
-b374d8578b71b911556f9c0e71dee07042bb46706f5523f72dda2156e364dce9
-644756987a5dac995c0c86c4df48c1cca629126a0b67b59d50c4e34635c04cdd
-165d5607a353568ead3949838d4e5ca7a8e7a9f88540508a122ecd371a77cddb
-588e6392fc187c1a210dc63e42491795c21f9f50421bcbb5f2b58fe1db5be2e9
-bb7938f70f3f12aabdb6cd26559d18fd1e7e6757c5470fc2dc7f8fcc6564fe95
-c2164fac044b3243c72f3fd8ca843f111df1a51672447e49070f6ee4c3adc8e2
-5754e8fac50535bd2b164987dc02452a9de63973203ede40ebdc6d0cee93160c
-05aa3aca73dc14bb9b8b01b94e8dbace5e937e7f0f09834f266d71d71bc4e06e
-885356033cee9a7f346c8609fabffebe003a54704a4035abd55b26fe6819805a
-cd33b6425a3b61dd8f3db2b7b9551318d8048b24ffa4b40861614765716d5e67
-a9b1799a48b69864e90476f693cbd8ec106c20e94502ea2ee452c200dfbf45ad
-273ced950370c316ecac58f3dd67b523261a30fbcef78d51d427d414619e812e
-72afbdfe5946e0e5ff7029808e6fbeb849fbd716ca435bcecfaedfffb8a2c48d
-3bf406a132e7a3fc2a9f52c28763e7575bbc2f22f4029bd90c19d9c816205b48
-2b03f88fa36332d72e5f0df82134760d26ffbc3c5867556120f26d10bf19a25f
-b52baf6a8f98f0a6322b2735e9c7cf5e152d0b7b01d97c5ee45438a287ff2172
-b164791b1b60b29e88f3b4eb5fcaf195f5d53910c8f00517a82c650621a83ea9
-94cc63f4788c98d56676ae219fef3e446356fba4b49a24c3e0a8c7413c8ac1be
-4d0a063d6dee027e9fc4ca54943cefbc760615b6ab16091114003b158b019e10
-5f8c488dba09b70db0ab77ea949f889c1498faf8883d63c36caaf1d3a198e2c7
-6a2c97a0a14e5c3dcfb7034ad7357b3be8cbf95d93131d778758c29887f5cf4b
-493044e28e29903a3763fd76b3d69aeb4ae6f95b160fd9519af1a8c90aeb2977
-6f438f1313feab076ccd14323a237ba5bf76faeb29d0ecef23adb8cbefcd6df7
-6741644d51076cf66f92b52d852c8994b9c763dd08099897b11adcf00e9dfcfe
-fb6c876b4f076f7923fc3975af92e9606475c78b98d53f60f656b5ff23fc4b60
-32de05f8077319f6b35e97c43dfa17b4de3cf2a3cc799f8bce3aa8c9d1b83a4a
-bc42a89abd121d46c1a0235aa761af492e2e2136221ac34039136c291e877912
-d3946118d5afb7f44a7bc0abb2b066606c7d4cb5fc0c8133a84721d8cc7ecafb
-fb6b15b6ad5adac50a7c3a3b8beaf70054601140cb8cc08b6372ff8fafb5bd0d
-f04364633edc41fa1c4522402313b35550fd3515b9feb6a17c4a5b197e694a07
-477cbd4a46999edf0f0a500ee4c701f55f00d5751c65d08a621cb3f41c298c6e
-4ddfe05703b6ec04c25de3e0e7ad4f11dc918e011c5fbb236e5bef784b2ffeb8
-d79be24f9c1c394d5bb839142c1193bb7f224acd259d1a90d2d237addfcec05e
-fa0c387d984ce73e67169dc36eebcf137fc9829e4bbddbcbd5f61c2f3155b72e
-8f427a15b099c2561ce8b9871feb7c1cfcc24a639e0f2d051ecfab89797d1b1c
-0bbb7b374df1d3df75e16998dd4198358e2829f7bd40f50a449b968813949115
-db90a7c403a2832454be362c71875df7476c7651f3414c0d4f497ad1b67b2952
-d41641c740028167677c48374b3151a9021fd3b9c21ca8a8efbd86b11d998813
-f01c3fcc990c60fba08f67d3ab4a302b62ec0f04b9063e01a8c6178f3806935f
-638c972686fef41baa1cf372b735fb19bc389af9d7ddbc7d31acb7e915d4b418
-d7a5ab181ce663314278cf8881ac4430ebd3ee131a7a2aade1de7731da96303d
-ff212e8fa851cefeafa4969d11b0c4a74e23654821ba2458961cc2b1361bad81
-a8fcbb99475b003c29f738ef40e4f9b1d89cadcef391db7cd117be434d085636
-3af49df9d46a0cfbff5af6e5e4d192a4d13050f5ce3e30471e489d57330853d2
-728007ffe1b7ce41375dbc823b84812a6794b58e38de43b2e22d0d059db64238
-5d32f79fe0d2b8482f61a0e1c2155dd69d2dbd2636bc0f07efb9f6f13c4e61ad
-16bc525b35930de9dd5ef4e5e91146acc78987a2e9578475522b3c87d2f5c5ec
-ac8e55de0399eb852551148047019fa08fcae9bb7831454ee0d5c36e3744d7a3
-4eed0cb0cc8e82810a673c1098986b7d3ca984597f37f695df8aa168a70d0ae9
-6f526f09ec75fd2c0d2fa0055c519459adc3e7c61816d57ca3bd36f78a06dbe7
-dc22505a4ca8af1b284d887b12b7f161fe27b6f1ed063fb4f7a37b5af0d1231e
-9ed802879896ecfad70260c1065ae88e593c75b6d0ce546440c482f5503467c8
-54758fdc1c95cdcb7d5663a0e1ac98d0a518894aa3c6f4e4adeaa8ac81d8952d
-585c2b70d5ad861b13f6b48616332c765d1fdd8a97e8b15d38097afa88cd7bb6
-b7c82dc031da0e5e919b3a8cce89da12b8548a7c45fe1ac418eeb8b2318c9516
-59a30e56f4f166a6fcf2473c213449f46cfb906df3ff8ac703020e8cbc71bf21
-6518a3c76265e644f62be4b2c17ce1c8fee549fd14d1cb94b646ecb1d14cfdb5
-cc422d8dae5a86550d4862acca62644fece36492edde670bc9ce80b0ffdaeff6
-82bde3dbf0c403b882882af7572a42b4f49f6bdb5a8aef91159546d90238ec37
-0ba7e2b0cf8bc7505d8a2936e88836d097f48d57aff9b04d08e9fe8f3f35d046
-47d6ae41ab09af7bc1335369407a9558436be878be6e8b7f4cf88cf09a6792af
-911ffc61653653d1c6c8da705377941c7d4c1a6cfa6f47c2984436ef697052f8
-8dc07c91414283515bec6bf581c046306800b755c301e5c5e2509c8717d7a450
-1666d78c7a63c74279dd218840526d5c64da4cd356d24ee7382a471e511aa7fb
-94dcc208f1d79e5b878bb110d5df78d7a25facd252ba729213bc5b60093c115f
-61d72b91eba38d54600893f12f41c59b26752d3efec1336d8a1bdc0e9a33b9c9
-cfb1946d4a60836b1dddddcab7c18a1db24bffe3df0aafce0c145f5c27b8bfef
-908fbff18d2f398b914a5803d2337b95bc7d0520bcd60d3730189af04c8417d6
-e12c20626580881bcbf4c7f6a6a5f43e7792de58f7ada1d8784f6a7b4e6f96ce
-73c7629a1b3f78b821629b8027e85eb5241d8723f1632145263b0457985be78a
-4709401ecb03f96444d94f3369b30b41ae1a16a7671d2a6ab6ecbdad3753fcbb
-0edb46887cca933f5909694344f7282cc7bfeff1c3e19e7668db02447082f8d1
-72111d8526c17a4458326bccf6aac24088a3f6dcdc42d5c5587e05ddc8ccfd07
-38e7f9185281192a15d248f7a7c7f013508024e4f2386df48f076b2674e5a720
-c8e5d5db8b7ea56c349a963ed8441501c23b7334c245069978b1d13aae19581a
-c8d6bd5bfd27b3083652678c15ea96ac0a901508d2dd0d4d89a772c740ac408b
-b9b61c28d5fd3f46463888a3ff49ee43721a0d03907f2d20f9c953c6c1db8bd4
-32afa377913b374443bd560f68d11611b017c876d7cd1a2bed5789a0e5bb2756
-60a68957b69249f0fa1822e3deb8c8c879287fb81344aa625a772093c6ba1517
-11232715b0d53725ab50343c5b1917e2d2575340d003db8adf03b3835475f098
-25e541e87a326369ac59d4b9a71b2d5485f01cfd40313d14492e828a47fef188
-57aad991e624ab1d3d8d696a55d34e3a3689dfb64c5c33fed34fb0c8293da01c
-83c58943509507870979b2c51f74ef700bc52509da2802c0f0c1f4516807c3dc
-fdcb32c4b5ed6a87231e58f5896c85687edc3e7872206b3c19be99a863a40ff1
-5776e396918ae1ddae9acd9a3c654133aa17294a9e57ba5287db3c71dc1c0d12
-d9d6a6b85f5d1cb487b51e8c1329204815962b6937a22375d5db47c4bde26ed9
-3ea18c82839f55a28f62a508958bc7fdffdfabad5757e5a4e891efdfe9421686
-7dfd4e36a3a394fc1451e38907b58d16fb110d8b18e99945c9d1a215f6c906dc
-5c2a8b98ba49c225c437068ed7120c3e591f754bbeb880fa51868ebe4735b7d5
-7c1107652525b3b844183f4cf351ba35d655bd5e66527cdc311a4f0db5412956
-9dabd87a4e45081b4cf219a75432c6c628b596afd87b39b68f600611b3ab3d83
-61b8b056e3aa2b403f6550b72019be02a27b7cd023c45f72ebafca0315f4fea9
-d490254d0adfd8702b6ee29af2e47be8350196e470d622bfd3febf223d7358a6
-a00f042f7d168507d7e69adaca8cdd219cca5ac0a1d28ec684467d9a16152c9c
-a31478464b5a35cbb18f064af9de5a5044ae920b9897d6eda7bdad45a2ce8196
-d918a6c98eafdb088df5e11e3eca1b860fee77e4a7a68e21edf484532e24246f
-345bc0136909dcdeb2d637b215f1087a3b14a74ce614e00dd9b52795f32dc03d
-f2b5fe1c2b19d76b3ec5bb517b0623faa536c0752c796b2179ca76a40c0171fa
-99c78e06bf1151c9384a0ecf7e384bc11248d954b21c9de2bf6df4229df208fe
-a16848c893f1f25b80020ea691d92d47d82504eebbab22c4fabb9aa29ebc2aab
-197d861b9a7949fd86f201a90ee2a453bfa2f49be46e87935cf365b21f946b88
-a3e8647fb2330928c1e5fde0a807c23fcb55b4e2008d5e3add8df3a74e5239b7
-aaec108ea92033cc581aebcf23116ae19f25b8d31eba90ce20388fe73b79cc93
-3fdd183ae909e3122384f79d2fe53cc07cea9151bb3ec076de154e672b580ae3
-42763452c9fd521e7be2ebd9f2a410e989ff4c5beb38346e37d6bc91108939f4
-3edba27cc6d69a60eca3cb41ddec11536719e3cadbfbbbfc877d39021aaaf578
-7b986a01db572a62b492c38466110e1f484fabf38054d0fd6acecc367fcda35c
-f928707a3e15a0cbd3f0a6d555e1625582dcf088b8fa6859b01357a3fa460e7e
-5cc1a3330318b3fada86b2c55f904d77675ef57f137e8d3852e1cf505029dd33
-153640e04fec2575888cae0258b22f309c93e9042d567ba4a0ffc57cb9e9caa5
-14ecba866518648f968390586f1cb0ac986ddddcdaab912a09c397d12a9973dd
-c5abc02b82c7b3c1caac0f1da96154677b7112bfdd1c349dfdb5c4bce5d7146c
-8475e3cf71ab9034abacae8182826bcc8836a6c0cbef7b64b67f874a11535956
-2c9a996748958e7238777f23511b0f2c18848599beb4979e22b98eb5d579611c
-86d917d84c50b23d55e5975a2cc934a1265c0731c9510c003930cd829e40a4b5
-7690c4b63595f1735d8c2ea162db038f58bf18f3155d0d6c5982d43e0bbcb187
-2eff929a6e4788611c2527175460fc9a8a8bc2b2b3acbeebd6c53779a1156257
-0f53eee2be859bdd702d4e983b2877f1f3ae6e4893cab50d607c42cc9dbd13fa
-64f20956338528553e7f0fd6db1fe98257c7acece718e79e6c3ea3588fac6ef5
-a280f937f89e570796220fc2b939832fbb6f34a9cff554269121ef6aa6c3b331
-4f2e22f5e597a4ff253fca5f757fe152e4fb5e6019766336e6288c352042fc2b
-e780c7e555f03b991bc44a7456762fd05c9c2e997c626379d447dc056d66332f
-fc2a137fc9c2dfa584b127429914c40bc3a8a0ea5e7d6cd3a86844cb8f1ed4b7
-63af17e80a0b808dcc5c70b38c1378c9cbf77601879d0019a8b2ad2d458c17da
-932639d69cef730623acd1243b062ccddb62116655812d396686ddc1c8938edb
-bafbfe0ccd33221070a60888c8397ca3924e55c5820f4eb29ff35bc501347a74
-6e3704fd2051a50c4c4c1c09c74c9e6ceecad42d37ddbc410485f90a0fea0752
-1d6508208d4d86ae19e2446d21902441b44739849abcbb2adcfa2fb353e6838a
-0444fc13839ca5edad7b5638d76537257187eb5dc89a1f412c35ee4d8bc661bc
-e25d809bf5e3b082051090b20b6b83225581b547421138abe92a2c3c554651c2
-604f7e79b48a1fe0e630a4caf13fc15fca552dc094be6f359736a68fb4791db2
-9b16edb6e06d3ddfd451b111a06bce53b70b7ef5858905663629e780d0a79fb8
-6c239fd3da4d2fc79a2b7619a3612490f147a44fb5a9a5a8826c7e6f70d9ac90
-41e33c39108c8b963f692c8719187246e9d34f34d5d6053ef759da18ee8251b4
-df0bbca723f7ad791c3dfb0f1db37b01cddda2ce698b3bf679d2cc1ce8685ce0
-c872c2f89c6a6897f8c203ed61aad3f8cc5e0371710f5c4c86343ac388770c56
-f7d1c14b15ca0434218f86befc24136ec73cca2ab768faa087ef70b3d5fb7f20
-0a68082ff38e522eab0ac5c74309807eb4597d8ede958790885aa18c792e6953
-74dd77595a94f74fb896587c5caf286f43223bbfdda9e89be778dffabde05823
-909db8ed5b5310ade1e80da1ef16805f5f8aa900be2ae91c54aa61d40a0cbf91
-4dcec7a0dfb650d6323855a5eb0adf481a2189f7b2736106c56e30a50c27578b
-b7b21db20bf5496e50df4e50c834624fc1275dc25375db000aed74ec1a1a6445
-4f041db66cba8a7c7455b4b55eef149414ee08bfad9bab1693f197efd3bd22fc
-8368d39b706cc7982ce7179cb85b9eb073fade8bacbb9af70f7101eb114a773b
-f5fb3b4231bb9f5e439bffc1464f50ee94b499b3d84d879fac0012433cd406bf
-b7420354879ea2220ef28c07df24dcb079fd0dc2a63f9cc9c709dd122b658f95
-e5211c61795a791544e9c21ffdab0acf64bd60644146153f02822f1518d0f6c7
-e3ca9a4096ff4c424516835c7f6607dafe23c0b70c8f8990eff7b8ae724a07b7
-13297d9d7c83d87a6b19eb98c48c6e9422dada99113c8540f48c1ca03058f052
-712c1a46f17a23b45135c443c1128563fd6a66fe9e3c07ba27511b4cf0ff68d7
-792f6fb1589fd22a2cf5051ed798976fb83d3b23b6981f169b44a3e3cc47af92
-9ba4716c51ef979a3ff7e4266899a457a875c0bb296ebeb8384586aa380f9eef
-9d52ef6c952e848923ab3f564e776dce58f21b6ded7960f326f4e925ab2cbdfa
-863e9c79453e338d7d61b387c193a862fa9e6c456b7652a791a91b0bf01a799d
-cbade03850b816ea002185f7740c8e5b7c32b003ff7a8c78911be015f2996455
-586fba449ae8f9b27940cc97d25d77d60b0aa847f586dc6672e0c0f6d2cb636b
-51aa401ba97d84da2774cb84912e47c9dade61de470b61994b83b75207af9abe
-5e10e5e8cfa8fdb8131bbc68a63886e7fdeed53ad867b6d3284f4e957322274a
-3b7b1846d860c446b0c5bbcc3c6241a56d2de295173c3d64103955b1bb8716ff
-c0dc492fd348cdd46707637eba91fa455d53b9f528d2245682997bb43cbcbc5e
-8ea3e9e2a2bd19202f67d7c16a42c602efe8254c3b2fe935c1f5bdd67d21d270
-35814763f60ab26fc8966849352d3fbdb628486cf74c5224f5d8965c5932f80e
-0d8be4b9716e5747ebd84bf452312042fe88d07e57a42a8049fff714e690ae0f
-5f7d54fde33112198294c3c6f546b09c76ecb3c414a5ed2a2f93e94c895a6010
-e6bcd4e883d2c7d7e826c14c9ee12f474948664138963a96f83ba7906736e893
-118be766df46767c4464623be7c3697be8fbfd662ef959e03b688d73d2a2d1f7
-4e9982faf31d21830d338bd8bcd83ac92127f9d48bd2660432e97bb6887e869a
-9e1871fa2c1eb361bf3916f571d9c7ff2b864658ac152431b931ec6c4f1d48f0
-665a90054febb824b428c2a997b404813e861723fb6c9e2c4bfcd04e8a4d2b26
-2cdce120e24912d32fc6cdd7d7235ac5f3d7840eaff18bd818b715afc03eba17
-7a8c3c3066e95c8840f291521c8429841e8b39d7dec80c3eb56b49a21a02ac90
-0e7a2b67e67732298f4e324825f7c823b7611fad2a8b7eb6bc44c3dc0705b4d2
-58fc26fab5d9c20a786188f593d010a843a9b6fd47f5a71cfd728c48279abd0e
-0a26dedb870faa7e19fffb970bcbfc6a61a487a19c56bc4e8d2e3ef093df0b55
-5a928a3b8f8f26c3e8cd4e1fbdb913d3235dabe2fa3b66c832bc9533c12fe5a5
-d6a004efde58f949bfc8bd48c44f8dc5f55d94ce79aa7d71ad14a4f7517ad7c1
-f17cab05e7a745220c32913f3c8f06cf02bacf882d8c293c8290740eb05c22ff
-c32c4cb2012c3d7dbd643ef84cd928ef8aaee42797d010e0fca4ed02a1edbe1e
-1d7861eb0a741cf976ca07bc02c22930776cb0a36b46b1a4aca00fd2d77f685d
-8ba3c1e24c522e43f198fed209ed810b0a7214faf8d583ea9146b26e9ebd52fe
-30826222af5fe432bd82d840d0a22b8ba2a7635de4c7fea5aacd8f946df99c0f
-cbb84e5194aeb9fbba94a33ccdb34b44a309954dfe2decc1c3f5056bda9456ec
-5a6e0bd801218083ac309c737f10e9a42e69b5bf74d0278fba6a691b934d748c
-ed7644dfd2f5c5ecac8e55df3b5a225e3d5ba7706fe4e50b7d9d53df98880cff
-01aa1a5936513db38de449dd1b1bcb6cf199752df7e2161857fa86cab9d1b645
-95da5a17bc0f305f9023bd265e341558f73a22bd4a01fed1867179986ed99822
-f6eb5eae2fcb74be99f34604fb47cba6c3a0f0cd388ed13dd07337175ffc9fb3
-3befc49a742d6f667af2a4476d6e8e0bb61a002b29ba069a4a78ee1bbd00fda9
-ac18a33cde76217e48b0444e7c90788e60ff3c820ffceda02891d12333d6788c
-8028507fa8b9c59d6d6d476c349c1e3646640fe504893b23587c0fef7c278fd7
-e1fc0c12de081c4bc55ee7bf65c9be4c6168abc5281429f3d39bd0bbf771d574
-8b321d993df752b5fecc462ff8306ff73ced8c946f61087ae9606699c2e85261
-c50715085f967542e98f92d89bd22d1b96c1bbf45e11958ce4f31ea3bc994ea8
-e9d0b7cf4ba9ef66b8b6005d6b2960e68dd0c0af4dd9957a253e2d4c47d46a09
-cec1580c02d05bd3720daf7e8fd3d2144b8e5b3414fe89b2b95f8cd153b326e4
-25b4733ddb2b4e1f02000dcc806252311c1e313a1ebbb4a9c445350609cb8bd7
-25e67f6fb760765b01ac474780faa7078d0d0a0973cf6a475087b720de8c5200
-e953eee885e5510b83a16014a6a255bd8273610fd698b773a0e2911690b1d5e0
-517fa1e2909905419d539b7d91f06fcfbe4c05041a06cb8a35bbb51b563e425d
-0e65eb7b086acab5475bfe889397b2326cde5d4f7b30da851c55c630805a0548
-eacaec8b20bc10ba9925d13990ffcdb569782c39032bc5c6834eefc519747cef
-23e1413ba5c6a03a399e7adc118dab0e5a1a8ddfeb5888a6855ad7ca9b8c5c96
-b33538ca373d4934a879387f55ce65390d313d93e4cc7ec7e0f67c483c3cba57
-f5625699cedee9da8622f0553d19231f626404329268f440398ac131190cb74e
-4cecd5be8cdb1a01bc980b993cd8b3ea77eca9642da8e185a363e7df2441b2b8
-d991a14e5a5fea3014aa375197fdbc0b1472b321d5b0d8a543cd958ac036208d
-6b33858d4f5a454fda0443a5976a1008da84749552fed657df42290ea9e0bf14
-49b2f609c3b69b8b2618a73e5839fa69cdac52a68932ffd4b9eac9a96aefd44f
-d7475a9cdcaf91cbf86e81758426068aad6dccbe6e874248d86bf55aca000641
-4e21877854e95f7b76b3994424bd597f3fbfe58461dc5eb0c03df892baaf83b7
-e5b743b0fec309198e019cb64047d127e47ecda08a6398a46621ee521d05ce94
-be413888a3ffbf5039563b15d39659a57a9044e6caac763d25aefa6ae3315fe2
-a2ee1f6fa44554bddd7150b8d852515988753ea49ead18885ae5d2c876335be4
-c4e022ab6fd7ccf70ebd8afb12c741f8a6b559aca8b7c8c71f2c7c2b046f5922
-4d15b2a85fb38fb2c15623bd669b4da58c1862a69e3d01dd5098887472bddb34
-8f37053c8a9022d23cceb6106487e1d9b3128ac1dc75cff1cbbeb778ecded89d
-47e4e96d97b8df40e2b1b21fc062a353ccda5e734d9ed9b1800a27f3f100764c
-5f568fa7668cbd8c9cec6ad262c36cac701239b6f462ac4936ba7593ce53e49b
-ff228411d4f133a019c029ccb7b973c8ed2239e18c207bfbf148019d088d2dee
-c58a1c243f368d42a7123f976cdd4bb47a754e112a27939bbae57c1335f365f3
-20d1e89079e71d3b8f7c2a4a4cda6961489a6f884d75d7493296e2dda3ee5bda
-4ec01a82354be5ca793904fa722bf37d85e7fec21b4e98c225fd66e819ff11df
-368257087feb4355932627f3f6b9c288afd80ce4533967f42b89da53d2df67f5
-77a03ad16d54cafcbb249565325b7609e419bce2f136756adb46f2bb37010fa4
-211f58e74d0931c6ce66474089df52b9401ea0e26c19714dbfec4f138d6a0acc
-f4cab67c1aac582a768819f6eb7f1591bb471640e8a262d8d6be3f935229a8fd
-e0c762f89935c88b847d7e7e6b15b2956ac4bc9095edf740c615c9018579fb81
-064a1d68f6982c0cbb0a33cf9a8bfc6e094c3f87bde2ac70fe526cbc63672520
-e6b35070550449599914f3be35eaa1e326bb251d9c9ef42a9244ca8ee79fab1a
-dae983f83af2a712f9bf9a2ef74b288a23ca7e958ce8c24ba0c4ad0683306da9
-51071e3ee96c25cd8123e87ecb93cf760360ca98727a7ca23f1273ef4a26eb14
-8e00c231bf56a66f74feafe07322ee921c5de6979821441201c46d7e6cfcbc31
-3edaabe7adaaef5f7f2d7d297de18b504ccb3c0b0d77f03bc9fe79394441267e
-5418523ae7f91bfd7389d20f77115a4a9129c33531cfd99a2ca3f7d3f39635cd
-0ec256f7bb65b980a9353e9692bc936d8ab18bea370933ff01e8eac03bc98f76
-87e754593e3e06bee184bec18b126f7bf3fd083f87cdfc2c1074ed007432a6d7
-97182114ab1c8e763f8f37c705584da16b4bee27a6b9b24746df9e9b71729bda
-630abb697f3348adac537b97ae350f64c8c8b05c82a49f8bdf4a2843c33be4f1
-3a201c7ca5b41823923c9d510ad2741b171e8506b0b79d3f18c8c363f3f04384
-1940e1be692b06b13774d4405ac2ff62876fdbf10d1a87456293c7f4cbbf8a7d
-8a0c5ad8da6698efd998f58929c2919d2f8b4c52a904b618a61d4a3936ceeecc
-fd97cecd156c2a5979b7321cc4f1b8cb84b00bfd6eb32e12febc812f0115b57e
-b60b4cb41d6c109d9d4c4684cc2e46f7a8012aeaa0d7effccf5057cd4efffb16
-79f3b1e8bcab177a67427e3643105ddd8a6d292681cc9114c008febdc659ee93
-70aa08e8bafd8607a45721df8f66d072ba67b863797c96053df935e1950a7ccb
-e9f22ee34e2e3607f1cf4bba18eb34480ee49898f7dfe120a3523646c7693b6e
-809eeb360ff12283e6c67f84517cc4794c580810df85b855e394d7f1a35c8905
-d61252c16ed95e1b8b64062d122ea621777678d13d7924cd71666c191599921d
-f18bbf96addce54db9ee2dd1d4083eb31593b706542e8cfd5438668747dd9234
-afee940b0c9ea6cf1470a700aaff7c1ef56751ba9b10fc5772dfa61f471890c6
-911d9b68bca77b2fc6021d86d68b032f1ba6774830f123e21b4656380efe06e7
-0a6755d5b599dd09e4b1e45c1dd74f7523f447c5fb468a871db7fd074305fde5
-ec49a348a02da990b1fc5cb991a715fa79f49b4d32f601f102618731d98a10b3
-05625db0c0e0eeb02a4fb69a39e4b716993caf7222e329d83cb7e60ea78ced15
-844f3079f7821a44c27c237873b9729c0d690c31e52f3b93349522c6a1da789c
-75cc0d1059a2d1339a463acb7da3399414b623751485e9ccb0523a5d0d42ddf2
-e89dfcae5e6a7b743f7e247d171deed57bd133eee43dcf5c95eeffe36b3440fa
-2276ec0e4f99715067736ff688c881396724214099c6e2f821721ebdfc68f16f
-936a7ca1cc3745ee9b127fca1d9a338cb602b03655e8de2111ea1371808381dd
-3190a5ab16fa563e4a71d2499e095eec2749e67e532583d7bb28c595bc45c665
-f14d206480ac3d562c7db8f3314cf070eb696fc952dd964704f7705c58351736
-2364b2b1017c71623027fa35e90a24d7f5172b16fe9a88bf97e05576e582edb0
-8893b5e2465c61ca3157432a1ffee7512e94e63060b4a5c43d8205da43c6f75c
-065dbdbfefcadf13177c2b77011e121c1f5d19b6bf1fa1de2a141c4b6210ec1f
-05dc8f30bb9feb6d9c22d6aef88aef4ce2c3c9563f0b0eb391cfe00df55e2e68
-1ea1707b2f0371d7095f718ae3bca6c483598937251cc43209701e55a0fec0ca
-2a84abe42e58b16b19a8cc1875463649b037bd08e0f3af1dd70348450784e46e
-23aed8305e833a81740513e494ec2f1083038404b3a79b679e530d8e1cc833f8
-4fd29391aea36d2b37d2ffeea00e90d50d52fa2d9cbe5224bd19a4bfebfd6d36
-04c250544cc529026dd473b7e906cac0bfd8b106953e4801768dd2f21a12b674
-3dc8e9ea6e662ef88cf8bce0e34f7a88d2401a80ce26d44b0897339dac523c85
-3953cb6a3794963e5cdf296b979a20fb69a20884894c05e38da4d3097da18417
-8185f72ca9e34e0b842662d9f51c59c0d61579414e44f294be31831e7f806b48
-a9c60ccd6ee051d4d29e406c6092f867ea3563fdcdbde1925fecc354ce0ec01e
-281d1b4360f3ebdbcdafd217081557869c8618ce923ded375425b9ce0a1f4a33
-eaee378ad6a1177df9432a2f140d5131bf576271a0db8d1e74ebdb78cde4c193
-a7f2fd5e1783013db6401acb51b108f4a71b16c9cf57ef903998163e5201a02a
-137992528337a595d9c17828074609b7380f9ea731edb55d4f31c542b522b6c6
-ea2e25c8c562d392317318150d4869c0417be8f5ee48600dee3bad8076d86109
-8a2a3b62bd512b4bcd48916497dbb3c90935321ffc39b457220cc32348a2d2a8
-02547d1f4b4d4bafa402b8a7a7afafbfbd3207b046a576e3f039643b325d8474
-1d1d156f026f664f2cad54fc268f41fb9ded61b9ab9dcda646b42c9070f40635
-a46dfe209b72eadd40049867e8b15bb0a927b1c51c31ea74ca99c4b06322dbc7
-1da693dde3e686c7494d7b49701e8f2b8cd754c30476cf9bd5e0d5af5c6d99a4
-bd87f1b73c25858ede3d1d82710e3bce544fc397a91cda4604e5db7ad2d6460a
-31bb35c9ba6df033a70ec0c6f601873d4c6a3d14ea9fc616786920f468c2cd0e
-ec9d63e8d085d0be593d8344d989bcaecd6f770f7763e0f8f8938a1a26afda38
-a79a1a0780ca251ab2d9b11e33e394e4ab7bb1f459e9695ad88ad71331277094
-5d3d6bbf673d418761ac787ef5159f9fed9103b28f0d5d86c4aaf4ee462228aa
-24bd59026dba7831062dfbc34276c5bde5eed1f7091a216d155ea9f4d9e1e4fc
-850ef02f31cf85eb5c9eb8d4f5c55ff4147242cce03827a0c60abf2a727981b9
-9891e361364bbe822a4a5a88f52328ab182a459e5856ef9edf6c835111e2b91a
-04d83ea913210e40015d3be601c0b43e2e677d5c9cda5a3d2c405b67095f3fdc
-f973bdbb333d13693924369c36f5ae1117bc90d9624016b22a3d6f23a80577b7
-5562f3d48655db8a537bf3409b92d2bd3b02b1aea544636a6b2856d0a1a8debc
-43bcf2023a54a3cd885fd9ee3fda7f3435a911c9103f101a39b5a3b5166eaa66
-6a348648ccdc9116fd0167dfa044e6f3f73539fa3444faea7a34b37e49c34ccb
-3851f03148c78ce454712f42044b159167701fddd5b664196666bfcbcb7b0b26
-1fdd85134d0a46fe319cf381a545b577d523894b7492f632c944848ea6901adf
-9deff2feacd94bc30f6db00a591cefe205390e32974b78f82a6ffa0c1e746ed0
-430f333fb242cc438e0e107faa0ca1a4073224fbdb3af21f6926b6c327f14bb3
-680282dd37e809b2180b112a1d686ed5beadcb5a230b890a30ba2832c1d08aa5
-9a6e9321c362edd0042c1483bdba5ff764a474e6254c16904f76642009c316a1
-41e3c824949a766c5e7067f9eb168a2f152bed22acc112bfdb3162a697698f8d
-7eebdf52bcbb14ff206de000beb437783d141f93daf468b1a6a62ca6422e0d3f
-c51fe03209132e719c3a7dc6a1aa36aade44c9f9b867afa34f3c26129cb619b5
-01ba4224c7ff90ef8b69650045c57d58d37ab9268abe8bb62459917aad27d939
-69e9c089cc4f417a679bdd99de84a400fcd4e388f4f156fefb6466039fbe72bb
-3d05549bcb90a7ec0c2c3565801b3a7a437615337c8dca761d83a7644b04d4da
-e67e00edbf2b3139c40dc3d470f8d476728119e9ab31d46b3ff3d6e34bbf6532
-62ecd23a9ecb93ac3d2498f63193ef72d192f98b05aa779b5015b6cad18fd29b
-421a17e01cb394d588e37ab7f986e20e204a0f5fe06224f53accc121f112d58a
-79f25c60a550a1b325bf33f568d69ca9a4cfb249096b8efe3b43cd703db80fa2
-0bfdfd3e01433f2f69913d13c1d14031545db4877ac7fe4f562322dbd2572cf9
-94b7eb300f26c3b53e75b02b5889cb0420f378a55c9a9b6bba64ce698ceef061
-349f8eee5b3a486870c6a11e9e3ff3fa00e3480610a449c9ea48bee511dda6cd
-9ea3e4653dbefb8224bc55a02f77bf16e7b9879bd9ac48788e2fb2e237dba707
-fa90cdb918e02cb6c3e49925b60e2a05a71546d49d1bb161ea5ce6d303fc1876
-dc17e24f47344fdf6029f63d8fe1cc789a7753e492f5421c8b7ec7b777ec3497
-4575b63e74fc255ec95f3a1e93c4d752b42fbc1b1b7dc52b3bd4e33102046fc1
-e16b7ee6fd0411727965c75de86e547608807e51cdc1e51b76b8f9ae0484488a
-7d21cf0f3b7ee73f691fa048309c990db12036ec5c299a4eae7411759dfc574a
-c321c443af71421b7ec71550348ea60512975b17d6ad6a22463aabdd94befd38
-88ccf264e94a723bad53e4ee0a32245aea16837b570ba36eb70a0414695eed42
-e02948c308e22fcc6d2e1bf714ca662f615aa7cf0b71941fe08fd416db23e1a2
-307575f66fb214814bdf38383587cb14f5096241a544edd522f12bfb4864f0bd
-989068be6e80b36c06d4a3609f45a3f249353225d7b0360c438ff0e862a2f29f
-77842f954c289477f1654aa13250611733e6c7c531ac69fcedbf29c1e6de2d5c
-edebb77f51a6ea25a3fea286986232a2410240b9b7f31ba31a59c40a5882f794
-832097dc9cb0e806db71677341efd5244c8c23a520c8267213204ff5f13e4bd9
-ce3e44c9387c17161ecc5d9c9f40b8dc4e6a16d93f833f07277e976ffb09be89
-d1fe74c1c6e1cf5e21724f8b83e70fd0d4ae72eb2bcd30eacb81710ac3a308f7
-e138c921577a06c8ec7293ac443fad6fd7a6a1873c09011b29e0469e411358e7
-f5d274a072ab9f84f3c5c74c7dd8121084019d89479d44bf25b47c248d4859e9
-c46d6f0acc65a9e1403ae66e84ef3141d688fcf71290cfc65eadab3f43474c2c
-c8ae995be0f19d7c0f8a3e2d3e40e2ecdba5efdd8f07981db3fdc34b3d014039
-3d2cb0bfb72e821d01bb22f461cd8f0ca7254cb8937f9f228f1b356c0eb3f522
-8a9337aa9e0b24d3bcdf37b2e2255a8df12b1b343f8df33908e6bed58d5ff638
-584c0c4bfe04e43a4237cefa6cdfaee5507428543ff220a987e68c769d0440a9
-d4a33739e9072bcdd885c601dd30771d731a7c57713bd4b8ccc0c3c188edd8ac
-1145ceaee80b1bd2ca85d582f05799bccd97b8547cccd71d10892b1409f2d672
-dabd6f0be7864de89fc66f758f120ca8a7983688e0b05283b5371ef01f2a68b2
-68d9fb855d7d7238b971371a8ab5f9d80e151c132a377d48704342146f9744ec
-d7ab4453d258a8719b8455ebe73d35a9f70dab2fdd5d41d2fae8cf56146215ba
-3fba4abf8f98765c6ed70b6ca8ab6e28c61611741eceb33e6c2958db40202f25
-8d78853a789ff3ec7afc19e5348d8422f6a28d65f2566d046d7b74973685473e
-5cc0ebeba1c944630042e7296d81ac8caa96238bbc09f3067a7d3bbc45b27431
-1abb8e4c580de95be79dd7cda3903094a88fde6a8cfe77633e0481b2e67ca61e
-2dcf7872318e63a4134c0f98a472813d4fcf98dffd30736ecbb4facb9c6fd915
-2461f90b736211e0ab68d5cb662be0b511a1e60132f7969dda9b229091286f87
-ec576661a94f818b99dd27ff65a4c2a3c500ff9cdb4b7df109db016ecb5a239a
-4cbef1d443c48703f62905ea599b82f76be0fcb01263eef1ef411c72875dd0a7
-a5157265ca3cad3d27f9f9c20577a552e59910187a9d04f4002e07e92d8f5929
-fff98442ffd6d3f8eed65f2c2be666aa6220ec4e18ffe0d2f3daa680d4f27044
-0c3ec7971da783bf7928f77cd7dd11ab8528a390318fc0572f13a5a2b20e5ebb
-1daa9df821c0cf3a34258dc56f872175f1d5d8bdf14478a19b53e278cb4fe83c
-527bf56a42eacdf193c6ee25337cc2215016a7014f1532df6711d9b637a3d500
-3849a0881c778c74e8e5a47204bae5374afcd1bb8e901bf2a703c5cda6df6915
-c9a93eb94d553d50d3f178eab2f8d6338416539f225964b688bb649f4f148737
-410ff38f25e56ecf583f62f09985f94ec048b8b460de00e58f4f238570b689a7
-ab307b7113814d5f3ff6cf280262acdf7b46aafbc234ec32a931399bab9f2ab8
-b6c05b23fa2152c10888ea6d4e44b44e65721ca646ecae52a79a532565371f14
-1940d81923ad84adc5c6a9f2d1d1efce1e53b5907122edf3df1b69e2d9a87acb
-303667cebf95dac21b053fbd39511df938b33032db098fa64fc7bc6407d11be9
-8402713b6bbd9027ba62baa364ea172aba41d3cdb8c6ffafc5468f51644b1576
-84bb51f49fb04a8a56a6cdff871b78b413d8b7bc595bc8e81e453c36087db7c0
-92ccee99d0d3f8ead6877edc5e28210a35dcf3cd49c594171e2531da1536f451
-0e0d51ef1760ec7b1fe195bcb5785c3f26d3c3cac4989c66f6f75a675ed97990
-5621f8b814be502c4c8a940bb6d825e27ca6633eecdc0f1bf725448950a37bef
-6abbe0bcd5620ef0a66a736b7eddfaffdf62796577a1f482ec4bdab07024afe3
-18e92459fd61a4277b5e885c50a825e94ec3e8aaf4292ae4bc9499a00ff14c6d
-4f742615f0f63a62f273218da051f35a1a429e1b79be5926c10c5a2ac38ea8a8
-6b055407faf2cd0fd6a6b16f847d9ec7e911e436d1d597e012cec5a08d98056d
-63ff4d16365a9033251e8dba1ee34f7359fb1115ee681f78a0d9840fd88cde7e
-e4791044bc3618b646af915e316d64bfbeac1f6c50cdbed248261813749e1c0c
-f998383bc6454d6b384ad69f9a8833860df4d66f750fd45e36f9aa1da976e55b
-0b06477f3bafe5feca828fde3a373dae7c2c029f2b2c4992d71ae4fc1804301b
-35ca5e73dd0a354b53d1c74531a4c860ca8946c9c05c93483c0f315caa8d791a
-afa03fcae03ee7f6378c9ae14cdaf68f002c3f306682777ffc83abccf992c787
-425f604253359ccc2d30361ced2137d2f825eab125a9f4411453292afa0a5228
-e5b6b4b6cdded786c3623f8d02bae3733a72bc1d1c5d8e6ad59a371a1769512e
-c26ebbb115291652182bc46ab673d016ec0f25487607fc04adfc072cd084e66a
-2d4ef87343c42a4d94cb9bef449af70bac826c0688e26fb2978bc71dcd25fae8
-c3e2d96e8812f882fbe9e0962e1bca90ce38a0da87c42579b1cc21c117ae7533
-1016b8827a466609f215fd6b6b4217beca5e741118e7f77600e1ec593fb3ce2f
-cd61c7083a4c5c9b4dc9babc7e573710341d678c527068533bd6d38d9d9c17c6
-51ab8db46418ab6a794d330c7d0c2c5f4d8e6e198b47ad4410fe1e3dbf9ce038
-0d82be729e3cbe262d2bb7f05f269022fcf6c89b204288de95aeb246bdecb355
-341eb2e622215e967abe6b6814e4f76f6dbe972688d7c2ceedbe858b96742122
-8cf1718747cc0b5ace901b98f4a99d7fbc8e5c675d78f0e822fea12e8100b88d
-5f8d86c5e048d4d33942bfe125d27f2a4cf26ade4b16d4986ce4e8464f7fd90a
-20a162991146ec48522d334120d140e31bc5dbc0c038f3ecb63ff9a2ed0efc3d
-a2d7c96b19d6ed49cc04a54f33d365737297ba328e3d646cd0390ec55747bba5
-248d44e594fa8389c72aa738a99dc4dde351d381d010a0f5fe48aade17f62958
-773d1d8500819db54d5f7a21a507f767f2ca63c5ac7c08fdf71e65aea255b971
-f5c2d65dd53d9f62d85be99c8ee05bd698cc7abb7e596ff0d11c51d0534dbb49
-2b219763fc99ba557da54c10bef24935e45364d8cb1ca2471bacacd1d67a77ac
-ea885796af2cad89cc2075f3b8bed21f9b56d11d21561e5752289352227e944a
-76f5fd44513b79a03f3639bbf8d2c7f4b8fef335a20482b0a3b401923458a4f9
-63f1e52f94ead00d13a5f0fbeaab7826cc8408635b28378899a05e4e390490f8
-d92a93eb8a105a4116a86611ac89f27d946e52ce39eaf255fce513d2b2042e66
-618cc2bc91e8c0128e8315624acb66f2d48cfe637bbf27cee5d0fbaa4b9f99a0
-ebb9f9d8093c08bd4e067abed9308ae286ecc5b0cedd695bb863da43eef448ad
-6ab3c9278955e9c1be2a059ba2524352a720c49e5db9eb8d06a09af38b957f78
-c686bfef9f881d906e5caa32e496939359397693aed22c868b2a0872ffd968f9
-53b7c508ae04f706876bc1e165c26abf7ad0cdbb6a0176df1564d7f7cff2359b
-cc151a058c48d429db6bd161b8410082d3ac53331c4b57a527d18847ef744ab8
-af983f3d22e35b8724dc460d0484f6e7470316dc9554906769faf9e1e070ea2c
-816a9c681e3e00be2a1ab9cbddc6a43a96aca4f4e7359c1535e1e88e4f360569
-13d587efe19e00d48137804dcf153719e8b7b80ff47c0c007d80a1c6a1327d17
-bdf5d8c0c72626ac7e5f569e12ef87a2e142ee2261634e8210f72d92f64e34a2
-c15f7f588e78865b3d6a62b0c3f5a3be15c0754e400d62e7e2618ec5a93417b9
-1a079de49906243fde354491603335b4bf6daa0798b51ca307e41f41baf0bf79
-490f892cf47f2fc51560023dd15049526e134d67f48181f3751305c34ee200db
-772cc0dd679264b45a99f5d30c7e893faeb3906d243a037e9baeea613596f222
-172033b01edd18c94df6641f049102ced150c535c70d1c4c66805c5626b52bf0
-9a97e5b539778a096b79166a592e0d5bb8950f7d28ff143f99495cc7c0778405
-fc7fdd349cf53686572f89219faddd5de8f3ddfd828f333edc15f3614f326975
-c9fe749a6a2730670919b4276eaf9b482ca96a0ca64af391696a78a377fd1010
-74a90f73d9895c89d4008683f0759813a61714269f67b10c082843a92fa97b55
-d2f9a40b8e4156f3aebc7fcba0773e00e781b80b07004e5b20f8c9fe14e7df67
-12a64ba22cb262799c84746e45f3f41c4776314c3f4a0b9d7eb83feffbeef166
-0d4590a43a9373c08942f46daaae287a420749f7046742e7b6e15ab3a04d2b97
-2ae73510f57de8d24e555c438d0953e1c41db9d6f6c12d2ae784af55f696efa0
-24b5aaf5b3e20cd6aeabb356f33b6b93ba8cdf2537f4570332c0dd0fce1cf8e2
-ff3cc038ff272b1df339cafe3659ac4541f2204e934a555ad9f1e9ba83148113
-8a8947bc49b9062e71c202631cd8c856e87cf08278f9fd047325dc4be74ede82
-42f483fed616aae2d6a5dad1e1e83f124dec374d57b81da43a0983daa34af7ec
-ddec60dbed7ecac68409956a0eaecc110145ceb8d99bda1a766c2ade43326b29
-cd6bfa4416d9e0f2153f4f9a969b033087e152ad9bb85a40479fbac509196c99
-a4f0841449eca6dcac1b9f9d7b26fdd6f7fbcb3cdd32b75091c5f96b3bf114f9
-610343ed284f5658752aac710270945c0a41bc3ddf3bb0b21448311e9331cd27
-06364e3090a1265a17b1b424d03b1e950c824645e11ab766503b0ce70415d410
-afaa5b33eba7b498d80302fe982d9778e4845f3659254ea382964e395d4d0341
-a9feeda8f963739e10ccc58baef8dd49a1361a0cf95083559ba32a8e5426c981
-42ec2e925e4b382d5a531912627eb2a0d98a25fcd540cd5fc6df156d4a5eb1e4
-14dd84c16fb9c6945e7920179130036b5f05f6e283ed715306cea7ecea13e281
-fd69e9a93b2bdac310088ca3153323138d52bb2db9d272b6ff67eb59f3db66f0
-8d1f6ce77c4519977721aa8f532006be856b00b33369fba6b980c420e34ad5b7
-810122ec90aad038dacd3db88ce061e05d12ffe44066c1671738aa913836edc9
-3ab7e596024fb3498a29e5bb543a67ed3e14b9eb13dba247325e70cb0e1fdc5e
-b3784da0415cff2b1a089779fab42debd53920ae48556e4f906f92abdcb35cf8
-d53e938b1ad434904aaaccc9463d608bd4dddcbb781f44b864e1703813fae91c
-c0b148445b88e4749cb9f52e8a6b8f598d754be58c22aa33d00597d22502a71d
-c207d7ebc4efab16f0a9c3bcf6f888698b443779236c33358ac4fc59c2f5ecab
-3ed32277fd98ba68be767aacc6abaddc7755b15c62b458a66086dfb464f6c7cd
-adad1017b7f4f14d98ef09f0c709ab6c529d19afbbac325ccd80d57ddc19ac69
-57f50212f6500e4adddb800bff909d6117961e6a1bd8580fae0e33103618d4d0
-ed7af5d04ebc3388821c121ba2067e10816fd1dc7a75dfc98106c6e9105f01b5
-99e845e0236258628b904df5441abd12772594645537c75b20460c48b5f21fd0
-2f73460068ec2574fe6829d86d6958a91a588ff609f3c9bcc2bfd3d2220e4550
-3d0e5a0fc0a837f73351be9752a659fee027ebcb926f5ede378f0bd10cc567da
-8a829b235b48eb7735919563136fa1a79f99591d431c768b5867a8d2e69e05ad
-4f5ff1e34e6971eb4413328c45f3267cfff49e498c870cdb50680ab42bcbc34f
-c836c1efcc10e50a43b648c88a7cc7d703389dae2b835cbd5510e1b26d4d436e
-5f5ff8f7527c1519bcdc7bd5fe20a390f484db9ed9b91ae7c4f03dfb68b1f204
-5118f5e814af4ae832444f60827aab48a9dd05ecd39dfc943775463889604a74
-58c324cd27782d8bf4b3017821759d70a344eb605bba453527aa7de48be86d71
-c3477d99f41360c647d103666648a5ca008af3e1d5cfa3b40ac10dd1e79b302b
-eff96c18bf92a086103a9aaa81e55d1af9fc36931952a736bdf7dc57354afcd6
-a964933bdb66423ea58edbf68618cd5ae35ec562f343c5915df0551e54888e29
-5c86cf31506cd44e8b3224db4aa472bd23bf94e1384078713baf280093460a52
-fd49cec5c2c29d91bf98064e53137575260c5867e73dd117e814a1b2aff8c497
-406a5dc5ded79cbe50fd30846c34d7841a850bd3fe132bebd9852d9b2f1d7726
-559e1cdd292bdac58eed6ae15d3f17b4ad0cdde87b584b190675d27b5fe5d0d4
-71f3040390f6d65937c6d83dc34ada9dcb8b2b401cb1e5396505d0af8c33f113
-518912b0b959f3c2e8d208e1ff28951f403400ad78ac0e4e1456fe9af63303da
-adb9fbc8e99ed0a02d960e54c39b3c27e58198d01e358b2336a4be0eb99ec566
-73d45d79e6706c7304c6982d64c00432335da50233fdd28d4dd03851cb8aee4f
-523bc43b61f26affdac9bbd7305d389f508b35072c30be43147727dad9199881
-c7044b0abecc5c64d7d3f13aad67177d34237ab9f8cd77893758e13619efbb0b
-67315237f63312eab8e1ee1e5a594ed963326bd2c6d54c50b8ee10538b4fec25
-16d138109d2d48849e015934d7e32a192ce4abe5156402c3ee8a3a5d502ce829
-d40b9c801b78c024fae15b5fb88c7ac33028235330da644482c0a22ad5444ed1
-0f69b227de49da59eac7aefcb4ee7dc0b5d1d1aeb6394ae1e0d9e130c1b1cafc
-10787eb5aeebc4e7235e6f5b1a991ee9a4cf0c0439025eafb59959c32604a640
-e9007f46f9136026d058b594b796e6747ac3cb6b14eb61a1d03dcf87f05f4edf
-e1c6c0dbf6c0618f2ba9d1a690cc811c28033815c699441ac4055e7cdd9d2b91
-b631f7c3ef32648d2ca927186872cf2fa646630d4eca09162ae9fbb00d1ce3c6
-585e4cdaa971d4b7d4ae0d5f8db5da74ad58fcc9e3378e7b2d4ca0036fb50611
-c98fcd020027cbe5faf311ac7a05af6039843af9fc3b830e0a2cea945eea5396
-a5dc74a465a0b6560b6663ac69e867925fb1a69cb553aef3dbc53d8a631e87b0
-0d48619e77de39aaed7dcb68a7a4108ce2225010964fc08660d54d73064d7cc9
-c7c6a2d12d7f5898280324a90128e4d0730ff35e7b93bbd350669297a6214df5
-6a775a5b7e73be6a972896e05d423f9e9798622b632d215812e911a93bdb0ad1
-3c5f628c4ac5704cddf78d3272fb1225bd4e12713557a403da937ea52d193726
-dc8178766f4e739d2e95f14939270b6507f35d83e1fad6c821ea1dcb5eb2a3cd
-be3870ece243b7f406cd6b5cb1caddb1b98c32ecdaabe8672dabb042cdecc286
-9e895eb6fe13df2abd25e66acdf07d402998dc54815386a3956cf36458234147
-c90a39e7101e4bf2186153c63ce96f3f34499ae1e1c234a3357ca2ce163106d7
-94083eb36aaa93e85e1676cd94259e173fb6ac65d133b16bd1314b259315c462
-56f294e37c763c5f16af239738efcedc3a6bdf8dd79b34775709ba54296899fb
-e9a316485274ed8363da0329ad0f41c62cdf48d7a25ed45ac95b5e6a4e1bbac5
-6da304edcf14c008e3f0d306c7f845b87ba80db258ba7881695209352f41d78d
-316017371a32fcd84bf788b511afe571f71e217c0dce3e04ab749d4596d0d340
-87540d4730c013796215caa073a1b99733cb7121a44e22e4fc2b1c052798acae
-0f086dba8eae791662949a26eb35613cba94ac58e47f4b7b953ef9913dd2c535
-37da9c1cce1474632288903c95bf7bab47f056b62d11401abc85b20b66d0ce72
-545566f9bf44f5cfa099b66ca02a728afb9877021ddf05c1245849dc6b6816ea
-b3cce3e604f604cc7cad40b2c919df5c92b356e0b81f6738a8dd7469a1015a4d
-6c5c6decb0c3eae39b7b3fcfd482d53ce5c171c73e23aa44ad41c062e8c7857d
-e8b56561cdcad550c6453c755e3e081273763f4e68233213a4059f6363f55741
-973356725ead4dc6398d1d6409ca8d49cc901f6e9958974a7ee5c02f9c426f11
-f29b54c316daa3f1d66e0c9ef73624aa70d23c0f15448cd295589bc2915a6a6d
-616d77134382687be88b7c1b9c63c0e695de5487a5a5162411b8218b1174f035
-216716b67f01661902287ae5b384b916d2c1682e2a0664600ce5e494f13ee820
-4b267bf8e863072bc11bb5e4506167ede7aba31f58e468d3f60cf5bd5a2a8721
-018ff213e5c84f672f6f2e651c4708a4f24c0302dcce4614233ac6f540ead177
-7a1155534ea0b6acf7dfebc0c6dc49fc9692951f587cb8c1cf3293328df7655a
-d82a144d193cf8b9a274d27c22dde2358ddaf79400a7977a1917fa10f445eaa6
-260ea56720e322abeeb790731031a345c323b9e2e220e9e9fd0d121475c6a7f2
-464252ed44f00d02181f1a5814d682f28c692f969db1d834227cd4b539539ffa
-46be32ad1ca3c9b4b337c64d3e61fa5a6d7dc29345a44d0470e564ad61cece8b
-37595d7eb3c0933457be8f73758d8d6f38b3e843c8d049103f5193b0e855d5c2
-df1092085c80154c50fa825254dc1b8a895e0bf3f681c2575bbb2b49e64a3c3e
-77794024051769ca5903cbb11fd3333656c4eb07d1d366d656467df392bdb9b9
-373e38deb2d83a9eddcb2699116e15b9d0da679aae82655eb917986e768788c6
-279d5559bb5b104b829164cce27896027913105aedc252cd0bc68032feb026c4
-1792df669bdb1d4bd94aea620cfef970e8756b258fa82a9eb86af25b6de4e5e4
-8b0bab5d552326d8c0e6c57783935d7f0cd66c078722682bde80af3645d4a9a7
-ef9aab474929c1749186c309347db0a5020865337542550397b2020dc666b333
-9ba495f358ab8d0adafcc5a3cf7014ac94b635e2ba1779bd0c44aac60cf3fa4f
-ecafdc876bbb528cafaf4f577266ed00509dfdc52aef8ece25912c04b8283f6d
-a8cbf712d5df4bed83702a76ab73d0adc789924a600c1b00761b986bd668b6db
-3de4008316053ec633300ee2e3ef9d0ccd3e2e5ed6a829ca814c8d127dc6f618
-d6165639c5ceadc8ff161f081a019def0f888ec6ccf12b69502a4ac2e802546e
-52600c91d51e70bd891c5ba957ed3951d84aa76f6d2a1a7198965409f1ee699c
-08694d9852f4a97839956d8060dd6004b0df827d6daf19325ffacf8773f5a14d
-b92eeb033282a681b443b54f242016dac22ca7388fb8d00dead2af7f39fd58b6
-f109bcbf96c58e46982148c86ca3bdbf8b61e8164b08f992744c67c636164fd6
-2d68c25016e9c672edbd444e058d3cd9154ae39993f1d5f319d58991f9bcb03b
-34910a12bbb597c3f871244561495f5d94b92f3c6b5e1ea0254c7f989e033eb0
-de0beae9676efb0d75ca0ec0fd07757bae8caff29bf2e1c0098e6d0843a2bfa3
-1031b383ebf4d12c07f1e3caee0397f7528ce5eb04c595358875d2872f19cd45
-7b41ac5dafcaecf120b2b11c0f3e927366e7a73bb033845eddabc9c62e373117
-de6a7e7d6895b6e6972d6c36634d46d55e0070e82f96ec375ffebce8a4e09818
-11328206eb0f4b66e0a8087d0145c1d10c49710c3fce4a5239df90d0ac21a0b1
-04d2505f7b5243dc96d4912c9dee3be9dcbfd9f7c2a9c8886dee4c41c58e9ad4
-71836d2e48f5ea7b0fb04ff6d2ba7b8e78ae70c765b11939aab939ec9b9a025c
-f27923c7bd0455bb858ac6f74baae573b066943598c3eeafc7f1bfa1b0e5fdad
-cc763c0badde7dd314d186b413216fc35ace73311dcf84d0faec0dfb9483eec8
-895fb678dd36d56618c3b125f7ff3b20f7bb8dbd86f52ebb08bad2a73ed6c940
-44706ff7ff263b0dae915e78cb36345989ccf84063ce6047e93a2acbaa983182
-db3ba114d80fecaabd2816ebefcaf0dc6eb42fb47b3d2318fd557cf96eb5201b
-b0b265bbb77da6922fbf9184afe896b88738ab3f9ec78e711e418275b101f8da
-be795d094d3b2c5f1c5e01da37b4e5976cdfb56fb459c8611ab2cc9081863e48
-eb4515035709f715f99fd62abc2e495cc8d4f8a1becb35d2126ffb08594ff4af
-bb82f793854d96a50ff37c24d198f533c348f657ec4726ffb648522893cc36df
-d25665df44ff0d6465ab46691fd9445cd3290cf2455618cc3a52d8056f179be5
-649a1b17bf25108f9b5b5a3eeeb22d970d968e25e20c5d4e503ece7bebbbe696
-465191dac3046b7dcd8c3824836bc6ace208dd60982451731e82aa0e85b2c6b0
-af9b9b14848146b09c64abbd9625f7a3bd7b5ee015c8f5edb3755b6356c37301
-18bd9f49bf060984259ae5d7fc6f3ba6f3ca2223e0782444bcbf911885a0dc77
-65d705146b91ebbe0cab032ca8336ce9133136ebe740d0a126f12f43b76fbd35
-4c09f5a66e3bd1c295a6034187e0ba7f916670b840f146d4681d43e9ce18387d
-70f44aee7ae7bfebcf588759213263a8a7c4c3fb7c31e890f285f502c5e88963
-964556caeac1f31b8975a9537e40c010380042359200b4a951a9effbaf6fcb28
-1fedcd940e10ceee8f3428f1e00eb8b1626ddc9c6554a8a7ef2e87319f3c532e
-afba30b322cc358c2ede14a5aff1ff1f835963929a3f396361b714f352133a81
-406515004549a91a192127406bb9f7a61536f16b6e2b51dfddcf0f31ea338259
-a0ba5126d1459dab06c8ea7d88816b2a750b4e4c6c45109cc8f0944f4a42371f
-383a585be96f72ad5884e8337582329971407ac1e6fa94d7faf980550004be9d
-a86af226e74b6b87ce02bc9949e3edddcfe0eaaedf502e649122829a4b5a0a96
-baf1aeecb528b092ba289cbe641e2775bd74434cd3915082c4a36a898d2a0347
-6a639cb3665b8621c9ca4b633e7b5e7fb699c39d2fa9583aaa000b1b3520661f
-398e43ff8ac75221bb92a5a19ba43def0c89b9ac73f936babf0c930cf3f22eae
-373a4c86e6356973490e17ce7163ae33583588d7b7d7e9d3ce84d68ef9c0b524
-8f14be69001dbf85b887e902b37813eaed85fd1b8610e2e964455bd3525f1e99
-c8bec17ae486775dcc124b4a3f2acbf05d6a73146ff4bd922a07022d09cbde83
-5c4dc2588db5720f6d73829b6fe92e592679efd487ec842be2a87a503d88d397
-36bef70dab7684f29558b85bc5ec75db196967063d4ea3942d18b6bb4842202e
-2ec18bff6a32a85a82f16342f1c8c2ad3e0cb12d4e61c7ac250f481725256c8c
-c7b29e35caabe5a130fe0c917b568453805ce48c7822f8323b7b6bde5450065e
-a4a1a6c2c11adc940d1dd15fbadab619b677fa1710eb86cf4d7d7b0c543bd182
-5cf7a30310c18c874c8040e10addd57de7c326253c2a9f550bce08565de02526
-e0f014a504529dec9086aa674b94c1e0786982849905fda956a2f85fe487163c
-c68a363c2d44a3300c0364d66824f31dd0f11ef7fa7553cc42fd8961baeecaa0
-edbd70d3f34363147328b558f8247baad15c994d33fa696af72ac2a0c8347179
-b041645dc46262a64d3983c46a3b460295b6afd8bb2de931bdb27a2e94f23553
-f1f87c2d47b88755575e09f50499d1cd6387c16c11399a6b4bac761e80b97370
-0d4d8e3d599119446c9de410e33aa6d5925e8c4947533bb2709b9b1d4d0b96e7
-4012b9cb27a8e1391ef72870058850227748afbbc55a03a79390b98aafc2869b
-fbc9ad0d171ab701befe311c559b3865fc0c1055b3e8e881a69fa630efc7a431
-75af2b55c9dee9bff2beae961861e45773e9e37735859983b9603008de8d569f
-a9a19016c9d9f101f64c345a4ed17113dc187584c1ac1cb7577927847793c8f7
-0c544d329a753aaf47aaeb5e6550777080224c57fa44a44ce4b16f7ab6a3fe74
-368f6c2d0f8df4f3ce6b762e43645ab0996894b358861c4927c45fc1cfffb7a7
-52cf9ba3966f53f00a3b26a394bf92094d579552f79ef2531e375876e52a88dd
-8222317318357ffe48d43a58229a93e7d6113dd47043efb48c85714ac19da484
-08000c866b7675813786229a16e5789f73c1c16b876a790913dd2cfcf92f9c5c
-31a33eaad8f368d6531c06ce189e07e9f1cd61aaaa3f8291a61311481e5ebf9b
-a45feebff7bd242fe2f018aafb62a4188435c46fe68a7ab09aa8c16b2fca9892
-0b9a2d7148603cb336fbd6b08eaaddb6eeeaf325d25c50f726379d9de1618c36
-d2a1034a29fa981b94220d711e6ba5dcb5ce7ea16d7ea03cbeefba5dc585e5f8
-bc032ff17febb2879e61c079f9b90d0a0b6eb537480000352a63ed828370467a
-c526f861c5cfc6e53e9a83077509573239c1d5a349fd53638689132f831ba29d
-9963a7497c2bbe933fb653110aabad3629e31a7cb3d6d3875b45b7bb8f62d740
-5a6ecde413d365ed05e7de1d2c95d46783a8be9d1b61f24191a1119078283800
-deb44a0cd447d47581972001497fd5d9972541b6ba2ca719a8177feef3a19097
-20f082c42a5de8a071e16e1bc181e34ad5018131127fbbcda2a9ce8b9f5eb83c
-c59c96bf0562e6916be9d99779d8d5294a04aa19d8dc839caa42f48f770f60e9
-18c593242436bd1dceebcd354f77e462fc249037b0fff2ee093a799010800ea4
-8da10c23b02dc20f3c3682b32bce8d7073c13f20ac232a6a42a4a0b5e995b197
-1fdf05dbe37aacc0ef62364c466817274496cbc8686650d480054a10c8105ee4
-47e2347c5cca657dc944fecdec1616cfb16ba4442d08d7f6b8cc69b38fa05211
-3213e8ba2990bbe7e3836c167d2c8fb126fb7cfbbbb28d33058c595cc6a16d6f
-e84babe05ccb4bce0b62193e337e8da5320f29f752f03a92cd843a99bc7a1e8e
-b449b0c95dca19b9ed1861812c7ed1f2ac7294d227358a5da798d7dd314a601a
-3bbed33797c6d571e9cef4a29fc421d2b7db70a7e92ebf91ee50f0ecf2ff63c7
-38a713d1b6d1c542d5c6d95fa4e9fd16f4d219ca943317baab091d2021ebff72
-0a5a81cdcbf5f3bfa3a633d16f4560cd3cf9bc1df7ea6504a3e3b9377e9869e3
-e149ab6fea0f80287c4fb26cc5ca6927f5219a8379c58450b7525bf017d72f4c
-b5611169c7d001fb816109b334060b0f2913bdeaea69ff36286c8fee4bf2cc7c
-83505fc4b7dcb29ac97b3682c48525e038e5d1274a069858e5505dc932c5634e
-fd115e02d0343b75907fe80d7d8d421ce40ca292140e0c0f3d79161c618981cb
-ccc0f9c4545942dfa182bdd45dbc71b8ea1d79f1ef51fa88d64247d4d2d3fb02
-f4d908ffd1a763d1383f7f54606269c4a0a6c8c82a01f8a40951dd141e4833d9
-7142aaa9b0a7e1c28dc578faaf9926cefdafaf084d50573395633ee6097b2c8a
-e70a16f3191405adb7cda9ab344d0872482f6db9969cda14b7e70821b16b0393
-a0431332b925e11f44882286eead545c0854cd41be75391e2a537f12c1826bee
-fb1e13a9e40995e2c20c3e330c993fc40df42e4c8d9f09dbe4f5f4476bc6addd
-0377ff3cd6a5f1fd26b5c23744555720cd7902f34407fc6f57fb83cb095a8703
-c9d70c96c50fb522affda15ac3ed668a70be3e1038125f57edb83c4a8e520747
-370b6131f6446eed8f68177b4d3a06333544969d04bc2ef75b891b943a89e011
-e078d01940caa9e1d4010670dfb80b1847bcf9578a6b6bfad675b65b31f8b075
-08ae31e6d3a26680b9cf228bf61514496fc2c7a2cf0a635be96383466226faf7
-a8c3570b3c55a009aa091fa99f71f8a4e82833428ae5cf0c5a585da9dac86a3e
-faf1c6c31fc7fbe4395a58b193311f67bbe598f88ad884a5381f82498aa3a2f9
-448f50a604d9db2c1f88b47aa783a82d6d0d45b2334b4ff48c8dc810751fe68d
-b2f04324562caa35c19a80ff56911399f5abeb971b982745efbd7b10edce63b5
-e490925781673def91f3329107936028e85f1f633791181217e239a2d4dfca97
-171812d2614131d19115eaac6550184f973d439d723f2c6b80a5678efd9fe5fb
-2526505ae8968700b352599b1bd964ef8391b3380e90e8febad06e4545c01017
-14bb2784abd7bd7ed8fff02a028767a781a57e1ff6543e996da730610fd00026
-3ea263f3c46d9844f4ea67c39701fc39e54b9f7316af609b22171c743e7e2fd2
-aac70ffaf84692b1d25735e95e45699a5e15a86a7ce7bfb7c51468c09d239a51
-45802559023de368135b52f4f299a4a3272c3969de888202bc1e99d1990d2aa3
-96a0e2230c6d2494e02ad04e8697e61e0b9420cc90bc0fb687aa27f85929fbcc
-f6484d047c785284c777bc07f1c7f558fdc170fb0495d1fc65a50a33a06a061d
-718391e14deb33fd37e7d27e47b8f3c9dde4bfe43866450e86105746d10cdfb1
-1e1714a0b78158517aad1eaa5847b37208dff3bf319d87184b82a18ed20d07b0
-ec25a1d278bc3840614953c1219add7c21998a6be45126eb61d87bfd5d1aef28
-7ff4b2724025db64ab552c28f0cddd89a04beb667988cfd5adc8f7b1ee091086
-c2b31a30a9bf56b671c81fe10db4214fe93f3d80bc6b0e90410e123b17fa0d41
-e5cbd5355c41bb9579e1ec93177d3f6ae798df9f70f9dcc6b541d5f4b3c6bd69
-83cc692c4448f91a730bae1f278d700c45a5ac32c6d5bda96aea73c95ba417a5
-5ad76fbb2c2a47c9896efd54cb4f178fda187dffaf47c89d5541c6ec74bb505c
-38c34cfe95faafb26eb9d1bcfcda8fc0617da52939ed4dc5b7616691a7188585
-8de6b6cb6f6f742b4a61836d6ccf60775aa0c5ef3bbf7b007f4e2053b4cab7f2
-23c96418426367fc5a833fd2b1a388f3352c8b390ce596b9caa79b9d77ca2020
-41550303c76625b527b29f0446e1e18b93abd527d537d927b9eb1f403c306b9c
-c3003ce36eca033b7655eac10b1c2ac5fe0774574d3bb4718039e498dfb06e92
-2e3ca571282388bade3e55cbd711c20a93fe24bfb1ebe38f0cf7e1627cf8fd3c
-d0be08d8cb4ad52bdc53587bbdb53362d31e8b0cec96c7f0bada54a0bee96c1c
-40b1d8506913e7edc80983683481e8a3e7b049fd9549f422945ccd41b63953c0
-6702215dd8a1e466ff3e2e9b97f7a96df89d3078d5ad49af9480fc84bafd02d0
-6b61dd88963e9ac75b42dc9b255a1c20594ce1265ad4df4c485b3f73cc59a4ca
-767b5f026acb27a0c71bb2e92e1761744882dc892d4e53297921a27510f23873
-91bbc37710eb2589dd6ca1784043f4e5dc2f08a3e1b9dff5747f69b3a6bc2e14
-2257f3de54ef93c57001539dd6779fb97029e17b9ed9672ccdd7b0286a3339f4
-30b78bd1de5730f6c46faa5b7b4b6213c3bc8671839ba50da8ad0e47890ec3ba
-78d1bc128cfdbfd11d59d3292b277e65ff1bfb343f84becf9130107326e4043e
-514a01e05be59423c44cd4366268650173cf594316bd18f0081f10f72a665f6e
-0020b773a90493b5ddaca8adbfb488d5854d1591170347cb16eb4a426dbb7cac
-8576f074017d3d34d98c5d82e84d52071c910929e417412dc64d0f5ce06535fc
-94c62b61337c5b27f4ca50b4f516775ed8ccada4c3203917af8014d0e01f9f5c
-568fa7668c26ea9e085fbc736b2e7c607db5c0e983107283fcd701d025d4eb2e
-1efef45b9d2cf08827d53568598104724fd6f025c50c97d182218e939b92fbc9
-42fe6460ab63ce07f43189dd38745a93a9179dba460173bb3715b145b74680a9
-aaf104ab04b6b8c8f5803bc03458fbc3ac036bf4f48894248048f6a81dbd403f
-12c31ea4736d0dbca37d0f45a264af161accaa64e645d20fd10856b063f83b8d
-079863f4984840b937efacb021d47bc94b1cfb9dc183247d25397ce41fb861e0
-0c95fc77407d98932d08c42f2393c8b37ef6357fefd4d196c4bd6fbc414e18c4
-aaaf1e54feb3d81f6d5644eb5759ef5440207410464efabf54645132e798dc10
-b068258a3be66fdebf1c1d428d3381aea736336fec6e86b56f5a6143f74e8bdb
-62e0f9dc7b80323b3eabbec05d1bbd6676de2e2543cd37d6055e88074c4bebbe
-53ce30241b46f82f635a1833f41888af3771414bb943353ff865da76e25be7ec
-2bcea61a15f180552f98af07333fc03749598ae8f3d37916c33deb106a2c15f2
-1989350f1dc372c831fdd25d104e82f05b7a102256d9f8008e23942e3f9aabf8
-9d723bb624d0f60cf559cef6379e552911ba014f422801b50b15ab9fdf4b3311
-a2d79df0a820e262ee4140bef47ed964b1dc7fd55b81e00368fffbc63814e3c1
-46cf77833cce07d69c7f1dc7189171484ce5051817ae7bc7b980eae9a2b05022
-60b19176564e2d1ceb79cee1666ee85f29331554d11037c8a79a7d53948a300e
-b7344a824338cfe73480989a0318ff63a0428c8134a2c754e1f5394ec300bc62
-989d2c9fd52e76124ebbaa3576a735ea45a87d8442782a617e765ec3d3b48076
-a97a3127effd10e46accd9947728a362fb83f8718b98331f9b84df8c270f7efd
-f2758c8660c1c0f7c570d86fe15bdec1d91cf8c1a417c9386e09c548bb401ec4
-db99ef40ca62cfd7a0e09fe111c4c72674254b5ae6e778dea51ac7e298ed7072
-7d0b85c0fe154538a90c7ecb7e1bebcae32f2db9016a00a6e3bf5a103efdb3fe
-8b0212049f9d79f95ed645ad3d53658f1e0ad84237d3fef48579cd86a76bae26
-eedc5dfdc3ed94c434903a6aa1706dc18b91e782b0f31dbd64358d6ae7edb7e8
-39dc973ca173c564c92ff13e56dc206415198dea13dcf9cb8a67af542efac923
-369061a76351da95da7e2e95fe0e245ad0671dbda13efca30a654c37320b4d2e
-7cc9699c634d129622df340923b7eca09e7b5961bb33ecb62c85591365a70b93
-ceaed2c7cc0339799783c1047df648349d9c800bae1443589f423ea385798b3c
-7bcc72cebcfd2bf1731a488365e50280ed9603b4c51931f91920df1a96bf62c4
-8282e4046baeced383604f06e310d9cea008ad5765d374f854fb5fc4ba116d73
-2439b37d8e391db3f4cfb4980fd6747d3e86aa425a5b4ede03674f404026a74b
-61940470546d80f7aefa98482cac4d8880aaa329129aae1831c26f91989901f6
-72b414ea6dc7d8468d112521f57ca320dc8cd56c9023c496cfef9588778d66b3
-79c1ae217e9b4706be2c7bc85ce7e98c7c58189f994450ac8ed2d2b153aec4ec
-ef5e8c68866d27e2e77b7760c8911753cbce4994eb7ce82e6b73e3e3567e2ca4
-4fe75a109a4276a6e7abb0dbd00b48318bbbdca6a7d7dea749995868aba5a1fe
-50ba244cd047fab144d67378e0b21a5f39231e7cc4ab9cf010432ac20ee61599
-34fa8142a2166266d0d192a502790ae0af11ecf3c94c17ecd26182d6a2a45bf7
-85e3abc677487bc20d52eaa378ac3088706d9b19d7a52efb495e34e605c00597
-faa503dabff584127c2a479075f89497cd7a2d54d02329b81d01c900d18f80ba
-46d4f7e8a464cbe141ad02a64951a2927c8fe8f155cd6fa4ff3a44412a59db72
-b74499d0b52486f55672f075ca1944073cff76df0ea2bf64f534bd3ea581e956
-e102bca1029ea246b1f08731ec931f1c0737cb931279bd51e31f83094d47ac55
-d969f50def8c9a2bdb3e340710c2c1337986beb1e032fb9bebf692a5a42dec22
-24befc772b8641e0de28e4fd6271decdb95156908b4a53e92f732888ccca9650
-a5496641ba0673f9a10c2e8c544e76d33e84d1d2cdcaa23fd55bcc7e2969ec01
-c009f0f7f834796bccd863b7f1528c13ff1c499e6dd8bb4ba671dec515fc9ec0
-81bdfd97a96311893af9e102a1ae63a96bc22a2e8a2acdcf082bcba6482285e0
-bb744c99a227a18179e661f63be26e242b3e0b0fd2ffa982a1c4e7f051a66204
-c13a59e66833ce590439c9f26356c74765bc0cf209c1d89e2893f017bae39ff7
-f01d79ed9a99a43a3f6259abc9822bb01ba93eaf77d03cbdc5075860ed4bcea4
-378285716de824c71cbf033015522ab3e741aec821747bd635bada9dc243e58c
-f4d8010383774f9f3a8d75bd5b9b8adb3ba2ae89772743fbb4713c46c30168bd
-aecbeff476e0c2e6ba174f9301df9b295bb213d3a733e4b5d82d24fe579dd73d
-87d647aa7cc0bb6ad46e4ff01d1bd6b8a8eaa59855e73a6e6a0a9a800842f7fd
-86748489e1b52a597f23220e6b1da30a92df4eeeed744f56b5ed811292d9c831
-1863ccccd7672ccf160851630b01f805c77893ddd70307d3cadf4e259d25dc37
-5c0f89cb28b082f9ed1b8d61e52f01b7f66e401d318db7a93943c78e47886af2
-56611c91c11e628f9aa71f7553370a97d2766baad7f9e74a1457fba25b6a2ed0
-750694da50f77e4b3dfbf38af5983499046732bce1cb3f435626de6a7b8e46b5
-04a80d1ef0ebd4ed0780b0ebfd8c792cea07d2f1b7e2a63a104088b87da1e620
-29c2741c5de63cfd9d12b4c5212ed7022b5eccb7df7faf85e1d5c4b82ec55795
-de8fa1e4654b594b83069e0692fc4954e6d0d3fe94cb574fac65ce4ed497386b
-16304392ea2defd78c6a96bb53bbac50ef7ac097ac45a902b39cc3be09d98f61
-2897ad7d1325af2ae4cc80716ba062243ac48dd0d90d86de3c88b16b4281d009
-08be72525f69b7b286fe28253c4be746976cec1de175b3aae41f3e56af915a04
-7dd0cdc064623e453db8123d652ceee41b60ee7db30d96ed641ccbdd70570c54
-82a169f1b9eac1e410b693301c0dd765afce2af327825cac271aeb79a9ff4691
-830517e26d4682dc30b60ab2555b39471ccb6f38ae631e7e1ef89fcd1847a242
-06592ff50bfc47c434142997a4b682da77300bd19d65af7d2b83dbda5b95903f
-220d1a2d90a19819607c481fecb5921de9099a60150a1ceb1a7723ce8b182897
-14c1c181343ec220b929336bb2f35056706dc481164f581bfb8b9492b4a93a76
-f4227de34613379b40d8682d58f56419b7b4fcebb75e58d4d17bc1bdcc114b9e
-9aa0ce37136b2d92312a40643559a8c8a2de53af09cf1bf9f978aea6ca80547e
-dc97a08a8677bdb27a599dc6027bcb2060274f5034af37c15d737307bed56099
-8df21be030b0e57c4d03e2cb2e3de42daa26ba760ea7279815e6175a6e98e496
-618cb4bcc6c071dc2cd94774b5dbc0f912a7aa808e8f4e92585d0a1bebf22596
-82257ec17a792283dfaafe2e93bd4bdd75c1bc2190454b2da333a335cdd0dcec
-6561b83cf0ccc9ac09e3b0b1e2e108f14b500358f8fba4a4c3fc05deeffdd4f8
-bf2d0cadd592f37933aeefb253c717ede98b3c870464382f1d97043a039e6202
-4ceb9e25a50834e1134b4c553442b5d4e763b2f833d494ff6f4f5fedd022066a
-c62c41d32bac09cc0faa9f00cea1ad21ffd7b62580d6e4973ef82a0a88a94ba3
-481cfc5541b1ac68e633e53823abe38df4bc11da9e41b6bfa4671082cd0fa20d
-d5aea26151a947f7345c69bdad50c344ebd7d52c13f0abb42669724bd7dcace8
-01a3727f02b2a9c7452c890425f74ec7a473b2f6cddb89fc02063349096616f0
-975b3f1360ffa5162b577d556c21c1465b997795313db5ad01a059d074d5186e
-5a039181aeb9281717d9fc71f2ae7c423303317f66d2c145a432d40ea79b0cb5
-eb426a4dbc2548439630bd49c09c3ac56aa8c857658bbe3c345cdbe60786dc1b
-aaeea1e8134c053bff0239c3b22d9f9811f0f986d34b10ebad0603b099e61a27
-f5da9d88b88c435ed87c4906de206849f5b4427ee0439ce2c99b3e52eb634ab5
-287abb15154d08932c6c360d85030a92bf8dcecad523c123c7d992f742823af4
-95a83c4fb38407e87946bedfc719cc3998d3487589d773ac6da3078b06cd5ecf
-77ffb84a96cd2cca241b84a0d35b0b340dff221b9190c1aa2d6ada767a0cfe14
-7e3428cad1c93da6f3a01f821c6a410cf69fd03a2e46f17a31df33af3fe25492
-c6ee8dfe79ffb29561f92f50c69b6fb2ee2841ff6e3723e18f86fa65ceb3bc0d
-61e2f19e9962320aa05e82ba9ec7fa6dda9edb2eadee478c2da6951a226ebef7
-b2fdfdea854e541a449db75700f057179623c32027ca181b1c8dd6d83ebb8bda
-521d637b32d7bb0900135f61d72bfc97aad5cd3a2aff218547cb96386023d3fb
-9a0b86d9ab93acdae4f4eb855735357b77a24ec5ed31811feaaa2f93d6e4ce51
-2c9fe4830743bd3082f52ba17e2a4cceb5bfd2c31099d852bc1d1d1d4ce92c95
-b1868a8fd559e2950a55a8dd30adb1f0aa7b40c900642e56c958764b81334ad2
-5386c2b94732865805b994b5e9949b7b59fa4e9e27cde175106e944d0466fdb0
-85a73fc4d329efc235f368515bf6a5e9460c9e997ccde7bb4691aa903911e9a4
-14fc8fea294185f8d8d80a2a1359f9707121661201a72e571810f9cdcf792c05
-ab01ae9c0916be2070c264b0baf34f63d78df7cefd0abefca77639bf25c32fbc
-143a000e2cb1fba326deca8b32671af989df004e1f355b4faf7323da6cdedd69
-1c73f44cd381644c8d6987161b3a5ed5a36cb698f94970a472a32da1ebc8074d
-e29a2d9967f7f3e656db600eb06daa0778478ab53b653d19cbc096e39945331e
-0d325d2667226e85f7d5e3442e70ab51c294b8eb95edb631cccf964fb8fdb8f2
-83d6dc2150b8c1c31f7a6b2990cff2dad2cce88d8982c4f01da6f41b271f4d43
-4ecea79d6a7c3408d986dad00d2173d387277e35095513a67dff237c7d92b745
-f0ecf708b72515cb9b695e73b321247a08834d084600b3eb7707b9f42cff1205
-814c1d788e3ba40d49b97f15df97173f17918d3e4da33485081791990389e2ee
-7350ec14e7d2311d7eaa03718035babf963053ec12e427a0e503f8d0aaef29af
-ab22a7ba4410cd40626c21d29eee1b4c5b632d68859d314670891f87f097e293
-80a0a248dd3c0d940f119bab3a42a4d5d62990a03d2dee622e14de8ed1939658
-4db30c49e896782cf4e451269bfcc00f5525b1ad733c068798f41579ca6a6ccd
-3aebe7de7bbc0739b45cd693227933d8f36ffdebb558894780fdd8c2f58dec0a
-d78ed417b05e089bf1c3c9fc389787a1f510b7c8f103b2ff8fcfa06aaa41cb22
-68939a1649976475b1b3c90d2a69d30ef7d1b800c8fe250fb605f04fba577776
-0cdff81066d7a7703574b0407eb78953dc8a21ea0864324e65c75060fc889f0a
-a8d26a6342364972e530cb822ab91393e298075263a6f2f31c2cced33c217aa4
-1b15e0acab0f88706b40b1bc490d9304f588c2df3331b47af241d0136216a1fd
-8869ee2ca67aa0b9f3e0920f815ed5f91bfb5b3701402ccdf990d0111254cd40
-00edc94f1960d511583f82f28f71c30eb44e1366f83f98b8ce38bc0a620b07b4
-9a0776d358f6e3d3ef6f145dff0158fd839583401753fff11cc7752ca1813ce2
-8d9266aa71bc27a6cdb2c3ea9bf486e4ce62a112c65f44649d7bd68d8b1d182b
-1b7d25cbee30bb6c56bf8fe290fb44946c5c7c5561d6c24e97137e915449ca81
-ade634ff781cb95ac4c43ee88c6c8bb0a5fdff6d0bbbfcd5801885b1bb4f4276
-1b6f2c117bb90058466bebc36ba78a4d229352347715965ade47fdc175bdacf3
-1de2d37ea1106e0ef279da2d566e42f98fe6e5fde8e3a292da9b327541b7cfd5
-d60538874042da03b15ce640ee2d940ddfff12ef13580efd2efcac2e779b9eac
-3964ba7e6ca66e05cf3673c49a18e35df6c69f9c4ce16ead461bc5b09e9fc35d
-0d66dd4fb6d33066c8b15d6704a9890435742271ea33fb6ac8e5261c2d3db0d8
-84d4ed885d5d4635a4e4898be0eeffebfc0ba8a90bd92bee924078802ff82ff9
-afee85f3a4676be2300906b95000516056165942ccda64e891325dacd9b73750
-5039d2520897cc43d9d404c299a9ee3884704408417d64512d9a6a2afdabacf5
-6ba334c51a72fc247dc3a079e3133517055b607adc13703fee0dca0f3f8ddd59
-8656337980bf58f3ae667b81458d7d539bbea00ee1f0fbe756a22cf51817e7b0
-8a7e28d2acd83b912365aa69ec031c135a5160fcc55a5f9ef4d023c92c2f4598
-8899b1abbc1c8e957c2a416b1be6eb1bedc273b3cc91b1a220bc40b96463def9
-58bbe5b6e685b472e81a125263816fe2e4165960b7851ea8f65cf61aaaf130c1
-04ab6c86ef0493d806386e889630fbf6ad9614041d92d35b5f788b63ee458ee2
-c6e3c06c60cd1f884ad3b1455043757e32e0a35d910c2fa33ac3abefeab3616c
-3023179fd264c8d3155dc6c73901a109abc353d664fc19a09ba716398118c94b
-5cbdc6c23364cbfeec6410ad2712edaa9932769f4c369877a832359d078559d1
-be39204ad8b6324806ae945e18fe20f6a757a0470a2667bb7284a9fbf1b343e7
-26df689bf6d69574c6e63572e9532fb1e38bd046936d340c55eb8e14fe2e80b3
-a06d4b911c6b3e8333c36b676ae8986469295cde55929a1d1d767476cd47557e
-d438bec525de2d4b3f55ae52a6ff18d00d5a1e1abca167a7d8b6dd2c6bf23fb4
-ca20701c9869cb5e930156da33d3b2fcb70404c0df725d664deb78814e175035
-02639a8935dfe80b8809086195a7cc4c354bfcddf7798edab74522bf447f2d47
-52532fe58da8b5aa1c4484b50ce37678f001a6aa77edbc7f0e2ab2b65e9a4635
-92dddbf932a5141e9ca9f108abd76de7c6f73269fd00eb8211f3ce32b92b788c
-85933381308f912476ab352462ce1e1d98fb6eea4f690e0e036f3deca9cf1435
-1e24a41320b229df0600c764b7e09984e96501c18eeb9d8b9b6636bf3b6e7068
-581bcdd1def63429afb5aed8edd44646a6dfc56b4f82f49d5819cdef9a6f08c0
-6c559f07d3f09c2b5956acc01544800a24d0c22b00cbb1c06b119521b967cb62
-2981313c666afab4c96817c230807850620fe00bf98be25defb29670cbc61440
-90be418d8263c478d879bb5ef72eede7207cc7b2dea21957e9c476608abcbdee
-d50e7d58160952ebd4e840d604d28d68292c556dd79340bae75c318a9f0b2f64
-f3616c680235bd7d4470b7e440bc8b37f351780aac3d311ba51d56cb5267fa2c
-0c45354d73fd084635552bf78898e2be90f5d7daaf9353f58920a0fe0de56eed
-fdea94349d207f4a5fff48c14c6bfe03eb9b051d28bc950574fde10e2e5e7cc7
-b4d9282e005a2174c09c62adda2e15f87360d8c02030de0b16af093feed4c409
-b908426705ddae110aa3ed8b1093702d8a50c08c2358b932e9b98b0b6e7cbd13
-7b6b2aa51ca68df71980ef797fd483f8dea3e44357451e2b834dd0df380ad9eb
-e1a974f1dafde3620fffed6385b1132df572cb35c705614556bd07129c02909c
-2bcc8c5aa450e94eef375efd8f77c0a8750c45f45379af43a12f288ede4a0935
-8c67eccb2733446f2a7cd0adbc989b21d5afb11fccb57bb350a39c13b3970e90
-17ec4f1e0c2ab7fe6310a4345d1934fca54b386305f015ec87cc15910c323450
-e1cb60b5a8e0dab68412dafc511811d7fb2ca08d9338a85bfc050e171dda308d
-4e58c9695cc8cd6ae5b14e1e5c47fc30e2f38d11c6f4964fd16934a8ffea5726
-8e489a334d073fac76196db7b3c8c6d4eb1b21171ba9d711433dfeef3b7bc0a9
-a50751154d77ef7f6c6be0e35fd0d983a5c03bbb35b7afdf952a9a883500a80b
-da5f65cd7aaa71e5abef7260a089bb730a5dbdde0a86c1e1a8acaf76f998eb17
-55a0edfe1207c5692c992741e653480788accb3d8fea8ffafb73650ac8a8c349
-664e92a2a8de84125c75d6155bb6165aee20a0a8ac09ede3a1fb800f6fdf0b4b
-4214fa222a5cc6c41f7f7763891f5d578b6d989ee6fa56d8e0f77fb09acf241a
-88f5a24d4c08f569c4a305162247216455c4bf6e529128081b10f5cb09f748b8
-e264ed4adc3a950c5ffac368799c4c031ca888d31ce9386986222dc3688f1c22
-82dd221f7463ec3cfdde846512774cc9ee1b1a6a2091355b09a33d4ca8538237
-8e5babc5eb20b1883bbb71a6987aa178aa4dc2378a344b5c6c3e214314c9ff3b
-dad4563fbe133fd2faadc70b5e36ec6de0f2d757d49b51c623d42f148f31d730
-a0cf5953840e388b8c6f750e3dae0677a00f78cd81ec1a76dcf0833dab08f3f0
-17b60777617649f85149c20fd9b13dae3efe3e8f1c7b801c5ec0a4e2ece7cc00
-9453c80674657d535bf0dbd60e31a2e9361671ebbd8591034fc5d77951ca9abd
-342d1b3ef381ccd243f083b3ca5cd79053a4b1efe8a668b73e9295cb78a9ca0b
-6e90f22fdf826ed2561f5b4bd0e6d1acb2fccddbde5db08e82d9113eacb6260c
-fbe7af67407eb89e4f29b5669f0172c6e4b1cfb81fd7d28ff5167111b16ee4a3
-49d5ab9408be98a51aa4d17412f0d23f7678238bee914506ae72b470fb581a89
-8969eb6bb0137f9b38873cb5ecb0501e49dd3704719743a5ba4ec9bf5c7d3973
-557888428d30d2fd228127ed32b484096edb0c8adfcf6ffe8cd030f3d5410e62
-2fe54d615272a7bf503ac89d0ef3ace83754978673f9db3e005807e470ea5b55
-3649f61148d42e9e6fd19e4145980c7ecff2bbd8ef84b435e6562a920e88698f
-7d1105af11926cd6180d6179eeb68823d99392dc95a948e48f3533ff1c4b2026
-b5ea505db22a265d56441ab455024f4263c9ad36c3e25ce067a1937303f9f216
-186ac443d0909a4ae76915584bbef1f884c321fb823b724c58757e619ffaf201
-17e5d826afb62d2fb7a1e115429191c80aedecf84cc71ac9e7eceed3aaa33838
-861d5699440962f38db466528bcd883ad8385e5b8b9ae1fc891152ffede5c2b1
-39b1445e0da532a4c9d19662c7b9af3a158ed868f5b11d284d19c850ad79bfdc
-fc4b44ba68537b205420140e803a16eb78111fdbf1d89cd1efd2663e3e306245
-84a5e70d413f73cc1f9392610d0c4a9a0a3e4e32906a058d8bba062c94fcf4e1
-e402024efb1b7ff8379500d16fdd85b556002de62f78c827de10fc2550bf000d
-fe81b29747882b8cab4cd04acbd92f009ae3f79956996cdd6cf5006e200caf32
-e014fa4b4e67ec87f6b76741006fa43e17f11e0aba57592f481bfb8655bc3499
-2e8bc3d57ad02b4744e1cdbfa0a76c543bf214cb6c637eaf4a958b337665baf1
-b286b40fafd6d833d45b4feddf163bea2716d90ddb483f8978b5d92d8f78d13e
-9c24b1044543b289efe180f0dc7fffb90cb99f928458d36dfcaa18145b130d7b
-6b57be3f81244f6064b61f630af5e876c8847ac278dc25aa942b9b90b25916a2
-ce48a2f2546056f7d3c9e0f637b52eac424c3c7b838b279e9cd310a520be41ab
-8c7bde64af685340f44d0d5e4bf793da6d7fa368e9ccec9c933251e56bbecd77
-b0a3a4566dc074e2bd55ec1adead11e4ec91937c8924b7fa593b24ef32db66fe
-8b27d795c12db95404b2c66945a9c3124cacb24311fca2567b10ceec21e22667
-8925a85067442df6e02e21e10d6ac641da354c318ab4f244c1c2dee6af49732d
-3f390fe6ba7c84e415b35e390ee2037026c01e2fa69d1348871b867a37ac2bcb
-df84ebed1024ee8fed087491c8978051c47fc1ab12a4deacfa17797ded28d929
-e212172d3d8efc3b04f5d074ca57271e604ef5d0b9893a6dadf516fd75cb84f1
-237ec510567264b2f20ac77c21e0a623ca2e05f50bdc856d7352bb03dfde6a0d
-b16e1afe6d3b6cee4e695d985b7fba36d64365c231ffcbb8be40948810e8147d
-591bcf096bbf5d2b545c9945612f60869abcafb92fde6616b5f863e55568c7de
-c6b413edc7473bb35c6907607ab5fbc91ad25f4c38707f57d22902f2519f9a76
-338a0c3630d101e49f14089aefb0e8d6c735493560900542402938b467e8437a
-1089d9460027ca5851a788767167589784e55718d98528883657b4fa709f5451
-00d0cb2ea4213a44a337afd552b19c10e3f6dbd866444735570db480f037ef4d
-18edcefd8f6b14cdba58e3fbf75b469364d0e69c92b8ba3895207d8217c72fb2
-6238e3c231451712babcf6e08c08c637d319867554b4426341e315217fb93c65
-bac24552f95e6890b9dbe1bf7530d720e48e1df460eed718b0fadd1960eec4f2
-f72742a1b8fa8846c10f1201b22c0d79b8c77350226476d4ced87e7b67649c9e
-661066879ab9dea79eed6bb0fe1300a73fb3578c0628255273ae4cd379231e9c
-aef0f8b72bf778bf14731c68ee50c2a2f31e848447190c3e42b5889f1623e196
-bffc1d8dd1323067e075fe70b4c762ce5fd8aff0e4013f47c2e2ddfd06ad78f1
-63da5f4065a272d91f296e2665b219d6e88c094523116ac9440ec2f9b25ade7c
-5852659ddb699fd030656733c6d232a49e75d776a235c1a56ee2f8901707a40f
-5b36ac3c98fe021bd1f28dfa10327cdefa5f06b471e8967eac5172dbeff6ef9e
-bfe7d129e8f99830e4a12c100d6c5bef79114757ce26d8f0d67b95d9865c7a5d
-c91c7d542a2a908b2227ef0b78c7a2bd562a8d73f9c20728917082a2c8dcb321
-de1c8f89588908cfe1a5833bf444f8944088e8742635774796d8d4a0040bcd9c
-64ddab4db438402813b59edfa79dfe26afdc6a87093baeabae0c10305f70cea6
-5803702798df945f6f45ed221fc9c2537151d086e2df720b8c689c4df331edc3
-2abf9d322cad08e3c2c06921f3a2c9f7a13a4f51b184cb77a4e7aef35613740b
-2bff9401d1488fc671828fef4ee8ac4fdd247d6b778e5df06179b5bbb462f2a2
-e2976cb8794041897a65bc5a9e1c561dcc34c98db07947a416c302b8f20a8614
-572639459e1ea1e510a8f8432b78bc5d1e294d8f57dfc956ef227584d236d0f0
-70a2aea00d94e48110decd629db3727e5015bb0c99a794106d1145fd9fa8f407
-bf279f7b1762421b1f3a1437018efc9704121176e2185065901df20159eece5b
-808b749e7847b6ae9ea268f561b90f8f47abdb6528a21a714b749377a3350761
-08e9506decc618e42dfa4ee0abe77d1f771cdde50143913f0407023e19fa0cc7
-464e53218da799ffe7a232241f3debfc6f68bcdc45a73e264b675e3af587042e
-1e35b346de4c76875c656aafe366c9097edd12df958335cedf7e25a72755a888
-78fb21bde7a863797c2f0adf73d3dcd928971e1543c594cb1a3a5c364840f0b5
-780b764655fcf831285671b076f7eee0f1c6245e47917124a832ac008ef60825
-0c5220af5e833b6aae1038e9f7dc3c793c7c1aceca66b3c6b0377a4acf9e5aa9
-8fd729ae8ee375e831f507cee9975b130402b78d84a9d685625ad309d078bc2b
-645c48ec8503b02569bccf978689a6ad2e2e06c1978f10bdb20d2f828237df91
-cdce385991a328c94e0b556f4cb8987de3a2698c78eb2f2fef4e047292fe9832
-dfc6252ef732568e87aca6b40f113e45852b213bf6e3d1e822b61a34344b65b9
-c68246f682588eaa0dce7c1d1e6a3d3491c34f7df5b0a55da9a33f4d59b5ee49
-beae9267a4542c4bcf7d650e0b533db67074f7a889568dc8d55da631cfe65d1c
-305c2c49574e2358bbab65e298b46eecac4caf9c79c918ae18626cb6ea3ea5ab
-afd51c88faf8309e2cc5ea3bf72fa7931475882da87a9249cb713bd25ddd0f66
-c98e58dc0eece6bfc1d537f887887e3bf5f52aaa42254ceb85481732f4f22ad0
-c326321139e35d2066b859faf9179d497da1bccc88614d1482cbf349474dd848
-7cfa8ae04a47cc440f9c08b7916727fb9a48325d84de181acd84db1f8450c727
-92f4d2472826883094a0bd330e79d8e79aa7f0fb363d6f6432cf6b191877315f
-13b0bd9c5e0dac052685f04b7314f1578e14042e777ef6c7e49b4b1c4510d8a1
-e97ca72c77a81b757ad555437123f371534851fb922fb8ae6eb861d4cd4f14a0
-7cd933d97c711e58704ed2cc1313f4a899b401d7354709fcb8c5204a5144e100
-fd49513bc03eb616b83fcb488905bcfc751efe672ce1911cd55c48dc34e5922c
-1e300e2be75c97aafb6d2c7d8b2a27dfcbb59a512e6498af827fdcb3a7a3b572
-2ffd35467d2f4e23a1bc2af72efc4ed8d0e86e983e5e822f5d7479203e7032bd
-1ae7a3a7930850325a42b803552a3b00753eb9031c57185c5ee5b8a2c448555a
-91cb4522b8688d2a42c15eb2e1931fd963b2e10d09cbef03e4ebf90ff61976be
-720e07614b853195dee2ededf3f30c750deaeeebdaf86cdc35cf6bc8f05d7e9f
-35eef1e212b9c6ed696bb4673cd837a8fe736c883f042b0dd9f14beca6a1128b
-204c2b57cd58e90f046d8ce6ea694e1b71ba8baf7cf6c3346cf0dd5642676b4f
-f8b45cacdb4975d45edeade19a7d1970ad567e03cd0fa17222f638b873f60c0c
-085b714c18c6ec4ac1213946824452fca1d2e85febb6c071bc80cd3728cbd8b3
-8a85376914273c134b8b8327fd591c5960a0ccf823512e936452df7302d19275
-fd19ee696eac93d10b3bcfec333e1fdb77439eee7f7ba673be0edfa26c52b258
-4f6a61bd87fc89f3cf7b662fa8760e30a800aa7d85e94e57749dc6ed26927ae5
-4e1f84ede593601063711a345afc9ad2daefb924ad66c9cf7ef4d7613cffb79d
-e86fc6b5e378a0eea2c69df8bd80d3b34f5e126dafbc5030bf408fd0963e0949
-a537002f59dbc2180085f46bcf7fca9356dd630328b7eef27b7577ce3c168281
-3c4df17f86a68ca27e8309ecc6e6d580df9d6073704008714381148da19acb91
-ce6fd2afa781a092b881b1e75c4525e668ac8450949eb5b4e49ff38806574657
-d45062a294972c441f8c354413102002790c9d27fcccd3f98503d6cac0f9a41c
-4966a3899636a40dc223f07568ec42822a05afd80e10795b86b05529faca9c05
-f956766457dfaf48992084889d76195cf5e72e3f689a85fadede52d52fde8385
-0ded200b05377ff550e9a26ee3e976d275c25b536bf429efbbe8084c8908ced2
-7091434606e6f8f76b7407bebadb2bfeb03bbac919875c308ea1c32bd56c30a1
-f61bbd705a87d63f4709d39100257c05a0fe66cdfdd0234cfcb67fd999f88f87
-c13dabfe1e7e91db67b83a4a7f5033bcca4d9e3ad4979b1091ba749e595729ae
-ad79ccbe02adef217c049c29e05508a09cc4eefcc004610acd3f45849c631697
-68253242095addad40ec80726101b6d25a4e52e746a9f956906c32f2cb316777
-bfdf3a470df987b5228620332983f68625e7e32a9ca809f61e3c25983fe95987
-a2b032cba145d2a9a31236d26e4bd86d71ea16a0fd85b393f7e3e1ff5b6e418a
-25b54766aee0d8272bb2d3c85401e788cb75bd8d676acb121198afc3179dbcdc
-8281c914295fc4dee61d150bd8623011b495ab2350e0047dcbdf9a9db40a87c1
-fe9464ff6e95562572c61346b1a00f37c3f0333c81753cf4c5911e5e370c70ed
-bbb4626b53f9716a3b83d201957059546ed22831f5ba5ddf5eda421b3167e5c5
-8e4a5ab8437540334a3b3285c1a94a5e2c87fce09d00ef5db6ee78400f1f9c4f
-4cdaf7bb85e56677c02dd2b46281c64522aeb1bb1fc83907b4fedd6678ec11ee
-46dacfa31b048910cc6c9463bbcebf80ae98304ff2ee9d5c05418c667ce54354
-d66d0c61ad5c8825941523ce6800c2fd3cc05a9bab764f79369599d055085e00
-8d36906da59a1fe6d137605dd7707ad144285bcf31a6047978146b61a4dfdd01
-ed38e1888896f8b02f0bd89a57402a92107e626383323a5fb2e943316575bbfe
-b707007cecb0edf4afc52419fa8ac4f6076e1dea9cce97c3f1e60b2212c239de
-b4e71711ce691ad89c42074ad4c9b9917b40119dac1f9fbd5cb3e241e5aaa2cb
-ba248028a4ab8389fecf0ecbbbd9d0ab8450535f2f7c85c02db8c287f24ec8ee
-f67baa4a0eb50a8bbbaf0841f4a24558044a0e41b7fb390b6512aef6d7795222
-5f7bc00e6a6b3e5314fac779a9eb11b38d36facb40ec14e0d875640c90d9e856
-a5a88a273886288f14d44d0d9a8d4144827d587ee2cefed089d6979793051660
-c322890d382117f38e35e643808fd66e48b521a6eacc926b748c7070b6f3cbad
-f2a3dfe4e2706dbca9439ffaebf1522e180bc2876cf7f736698fa955fe1f036d
-145e3216487fb904045d5533e1b2c3be21e1a64e96bb132581bf0180b8e370ff
-a32192305d1075352f404f4e8e338ef2926e71118383a9b328f8e55a5a938c73
-7b7b771d6ef4f4d62d96d5bd1c64190fc6932ac6a91c92f267c502d3c1539b48
-c6e0c511e83b687c80a8d290702c26ed02a355ec420667a8f1ab2e201b814b51
-da7700c5fcbbf06c1de4b4feea2562d1cbaf47c4015b72aa22a9b6490e775d60
-f7b5fe4e7362c765a398b0c39b047cfc5ada1d8abd3efd2894221d1676f04e24
-fd10f66a7a185403caae0a233896a2ae721c0c74798ea526db2a13a419f60883
-d4524d068379bfa6effa715d8907e4729a99acf06d7e2348ec9277c295dcbf30
-879c2a7e7aed3bf984bd8a3b73cd518f8a4f612a179ad16b5c8e6fb0c8f21692
-c764a39fbe7421d2584c7542f9f3e2e76b1a8d81f57df2276e098df6f9a2bcaa
-f783708d5d966883d2bafd88416177a159c304091202f2518f31e512e24f467c
-67bc619bcfd5b889b0d83229b76ccc9db033745ca4aa2b7fa65e12421c95364b
-bec1082d2828ac196ed6340d9c90bb5f102678640d3481397c077ea83cdc3ee0
-927dc768113d2f4deafc9a6a982e129c5000ee2f5051829969719fbe96bb73ea
-c332ac4c81c52ba840c1be9cbe9c735639bd9cde6da5f0cc484b20ab18cd8235
-fd2d8eab0cd5a9fe4c276ad9af585aa519de92be8aaec2c7ba6185d7703c02c8
-2a829b02d2cfa16188f5e3ab80aaa4526dc74bf173abafd7104c6c8351f5f362
-84a3db9c28acd707fca8a97979607f4d6dae5b23e111639271f8ea152a6d56db
-dd6a6c33c962020393e13a23101899e3d2d3b1be77f23dfe1bc8bb2c56fe0f8a
-4ca063369a0efc593be649feeb516b5bfc6994ab38a75beab00afa4c406c2ef9
-a7f2533b5f766bf115a05ae0dd8bd4a0436cf2abb04354d54c82e3e706587cc9
-32f95a254041b036b14d249d49d7390593231facb2c2d80848e94b7700b06527
-4b833e2a22722ff90731aa0f47166fd4fd286d5315e01cbedef249c9b740278d
-2a4e183d1148433cc20cd3479d7ee981b0bde4f7f46470d9ee2b6cedc48b0d15
-81849271ebb8536f55b6712a7bed80f2550298b1f81f3aa70d39261a187d7e6f
-2097660de875cea28e5583f475fa4e26950853bf6fd5e9b9cee59c1371780054
-b2238f9e6c3c9f3b4a1411fbb89fa1fbcd3052d1893332063add912ca1489077
-9b988149bb9d4da1436a18891fc7f229c2f900fb6b272d55ba55e581f8d0630d
-8bb6c022d366dbe8b4238058873514e0df31d73920a720f6dca145fbef4d15c9
-411f5e0322cc61990a48f98a63f23793318c22d178734fbeacc04988901481e1
-ff62d5a8c7aec831ab49c4b5721f68f693e442cbb62d13017ded5011eaa71f41
-7707b7915b92e280d0a7fa0063d90ced947c82ffb0a01b962d2b1aecdfb1839d
-d0e8335124fe352593c9938b4f4ec21a4d04bba3a46826df0972c5d8401f6871
-5c7b4906a37608dbd3f630d8f3bb64247d8e198cdf8ab8f891e00aeddbd48263
-17227225811fe52a9de08976cefdb7d5e76db46941b9576e87dd6b400c64a256
-a134755011e3d4d27cb90eded548f91e1acd8ce08b7adc929c1a02b22d65f10b
-bed695d8fb1337f715c792b04d103632223040eecf2703e597fdf30a8c42d448
-82e73b2a1c0a73919df7a5cddf25b32afb51f2d24dc4dac2a747cba641fc6fe7
-ec4ecfdfe98bca936ec2819ff6016a17bdfb1c91d893ff861a67fb1ba168c5ef
-59f774d859741c6606d680b68b67563b965ef7cb98e162f307504fb77ba9b3c3
-4eba8e45e161f8977fcc6fc2f4c2a677d8caef269e49c9f2f9ff6a309b2c21e5
-c810df536db392cd1b7018dca670f0d484cb7b6ee50ea1bd158af5547dd96166
-da10d10acadeaa04eb9d144a0d13d7a8f80b3e505177b3cf9893396cab022350
-bc705ba65811a2c60fc9f0e6f044206dcf524323b5cbf547d13d54ee0e87f00a
-d5a4f507757cef3b458e792cdfbcc25339d8bf388ca94bfc341d76ab42cad16c
-3f37cb51c85fe91e387f8c1d84a03da897a699fb80b5de32c0573014ea558d71
-a0eb713c0499438120b4702176b39a69bbf930309a555173d8558e7df642a40d
-d506f2498136a5cb19bbdec74d7b436af3ae2fef171244fef9711a9ae983e452
-20f3154be125816f948bb0d93b9853ae68c77ab71a8df0d5df10e4d6b7cdff22
-c3be071f0e5dc4b82293025a27c4ff3cb5209ced6295fa9303b624737e0f3e8c
-b8ef7e39762c82c89627cf2e430aa0c339eee58b684ca7fa818dd90aeda2f85e
-0844963d933da431ff54348d7d9bd3159549650fa956e1395abd116aeed54518
-649290b0b1f54950529f83b0d8d9620176d7a91b803edc637642c83a761cfc82
-1b21787f83920decfb906a5260def040e62e38135944df33f2c4ad7eab631f22
-6afcf035ff68b4b709311d9d713ac6cad9e7fceec73ae0abeb5fbeafce209148
-1a0e537bd666719b41028283cb1658f4aa7f4512fc61c7631fc4eda8d678e7fd
-e9db0fe0f89cf941fe65c32fc88f490226acbcbc93e5ba23dfc83ac4a289870e
-5ed31f2b5cf50a93525f381bd56d01bf11299258dc387694fc0cfd877eae3247
-8d6933340343ae8d2fd1740beb0eee04c44614f9c1d45beea74fd4c2d3f49d62
-4388241c96bb392add3896e74b93f670dd8a5c415631b2834b3b8135b49caaca
-007feaeca5fb75d9c4423f2f04ef576eaa87b69ff1033a70409cd5ecc93155c2
-18d154bb152491f87a8a49a77c1b6b6bd09982a55c33601547db6c8344c0ba64
-007c9487105cfd10a7bc342309d1aeba097d21d9c1da6e1ad1b1f05b2364678c
-e5e496c2e2056dcac7b5c90bc5dd0b0853e30d01800f91597206dc2a1bb5f0fa
-d8735dae0e61eb82138284fc4174b009d8dcb57c96b2897dce69785a571549d6
-67f539640bb0092d7d130ce57428b10a985a48576d7f6ea6c4207a53bb62c485
-5275cc7334b6fcb89bb496f3889377c1b0b5719254c3b9b19d041fad4a399e67
-1ba4b04b4a62b1879dd7b04f3b93fe31a3c544eaf70855d695eb3112a05b0537
-4c2196780e52fb906deab5add98ad9a075a1dc44a5e6b5ba6ca0f8d2a634491d
-eaca8a763311e9544556b65082f93074e5e4457956783c11dd6b1be5749fe952
-d2f642e8bf267e5426a0ec324af7d2e990254de48c505b1fb742652ac86f38bc
-cc59509737401620910489d3a4aae6e84f7b7001bcd617b0f09b5002ad00122f
-b1dc4c7db88585c31e637095d3d0dc7fac2337eb79f02fa62d13af0d4b76d43e
-69179bca2b3685d635c6f2e1e26bf1a9a609853d1510fa03f78f0b7fb384586f
-3e9c1ee38da709fd02ea0ff4d5ce512f8352aa15b232cb91411d1e95965f485d
-7ab5421d700af653b90839773fab6d37538ae3d61d9cdef3bd4ff94ec113e9da
-9a65f75abcdfac298717436af9c1a1667e7fe80339e1383bd3d45b94f76dd91e
-f1ba70a8bc50b51d6b51766722802205c0fc5e8ea0514fdfa5d5b18482694e65
-6ff5d21dc785b278f11b386e5812d42f0b4505f896d7f22b4ba42f4cff11dbe5
-07a53031462b3e29263851e0c91ceaa0573b49a2a6cbcc3c3c1a9c59c556dc2b
-12d1a9f6bcc751151ce62c3f30a0ef50eae7a56ab9eb35f93975fd3ad2e21459
-52d709f052197a64afbee9fa03ea2bb9201506c0b6441c9ef7250d73444e01d8
-7ee3dd07ca8cdd5549f62d1726c8d69833e0c9d2ff5af11b1fee0596853fb75b
-1387bfe18c4c747f83619a6096371fc6f444877ffaaff4a8f412847409be666d
-6f96f3a2a6bdfd20f0bd08afdd3506facd35e4b62c58b4a4645e732a9b1acd6a
-cc71f018c9e0622a1705ca635f96c7315f9d876afb459641315bf4ca0c4f7930
-1c0e30a8eeb441218c91d12647d5bdfe2512f2321bc51968c257fd339a24b1b4
-203ba90691564a9c83aae4ff68664d03b1a95da707bfb90033444ecf3deb43e6
-412fdea0ae772206a398de11c52b652ac04499968e2cdd4345fee97a40b86567
-2ed4711234d27ccae5f151d1825af76e8624c0ebe4a5bec34b6998040c3b8292
-76200fc70a6bff7a15cebb81e8b52221a45196fda4087bb32d5a260d077677b6
-6e070d33ad1868a51f7201924825b04335bc192bfefb74e496dab3d54ac4553c
-f959ec0dbfdee94289a4a2c166909c26c130ac3ad182057644c8c2dca84a3044
-4e86e891fe1b07729531642e7374c9a272cec66bc04a36db2d0b74a622028adc
-d6702773d0c9b6750c28a08902fcdc9f8a290c80c0360ba8019799d33fa42361
-c66575ac108946c97f3aa027ff95d2a6753f9dcf5949df046cbaea6333f19716
-9c0593db17459534deda9863a74b496a837c1d667df9afdaf54320664d0319bb
-3bd41ef9a54b4594e6be5dc416c275a73a26af17e493f77ca7ffbeb2f7abb317
-035c249b4b5a33757bf9601b4def56a6207ebfce6e073fc9427f95e4cc3799e5
-5eee6d0422a26449f713a74f0c114d3ea2e9b2e183dd857cf21bb3a53480b0a6
-9c7d8fde6da71863f2b21eb407345e4d72c5667137f83610cd2c391218478c14
-1f1f34be21dd6fdd444ab1c4b0a59439617cd0d04ed9fc568b0c70ab8222f17e
-e10c0934f9b567dbb26ee612929ef36036727e4b787015c76e78bef4aee02049
-4896893ffa23af70b4c6363f7b20db155f496ed5a8609be1e5173ce968cdff5b
-2fc5a3bc23894ec6f26b71a2ac555a5cac33aa9f71c184b8f9569d286978c586
-0c4d0be59e267ad86edac17b787cbb93dafab3ab4406d83af0fdc7a29b0a0b8b
-478d2717fbbc87b305b3f3020c69c358232b5b052d4376db297eef247ed2dd25
-6437c1139017556f879427b786a15bda065a1c70c6dc959f8e0cf727bd50924a
-b82a8c56c225fb35f49c6937495f2b6c7a80d6ecd28b0088b52558cb45b238a7
-dd65fc5f16ea69febdb60167d4de4785b1ed69c9f40495cf1aca058ae2795fee
-4812b5ae9a88ec6f37f8fc2a964e0170025fc558a7d5e093a498b018390064da
-45f6d3c9abcc3af22fb37946cc10ae42bd651e213d7e26570b1eed493c374260
-6e3861f1fa365824d012b5ba6b6bde3d198e0fe078c7c17b045109f6fa5700f4
-86e7fa8b9c1a5aa9a14955877f9c7ce8997cf709ce97211dae33e406979e83e6
-6ed2386c06b400c36404ac371ec3bf27dea61b15d3db5a2eaf68b5e5366112d6
-a18aeb880bf2df3f4c151cb23ed00afd1f41edb073022ea746336ccc2eeff94b
-0c896643f9d44d67ca2600eaba8db2a75a18edfdbeef3e55aae36d93c115835a
-a41cdcb41d00721efa83cf094a623c356cd01f9f3e61b52336e039f3ecccbcbb
-c3db862117281a50bdecc0057520b748a4beabb24b8a5f2d915eae78b359c012
-43b351570dae60fe822219d20aa73d0d2eebfd64a13fb0f05512f1c25eb8cfdb
-1f85aefe9cdbc6d213db2396580aee22e7f39ce8fcdd343c9a65f86263613ef5
-c8b1d3d2ce31961170db7f3a930aacc827643fddfebbf77d5a402be5d1000db4
-c80c05b38cb971bb260fb31f8a42750519ff7ca45076a75d3490b51cbcf8b47e
-9c43f349db24dedd1c41e013de99f4a02d7afbe73517241dd78d1bb77fb815e0
-23ec47e41c4f1f8cc34b6fa12cfb9837e7428a0eaa9769e786818556955407ba
-5079607225977b9d1329e9837fa6ade7df59a7a5c3c6a9de0791655b3a9c88a4
-b9d643f79acbc20eb60019d7afc63f30c5430f0dfdb0750a899347eb1d9cf604
-7bdb596275613295aea793d76f6c1c012385a29721cca1d4a49c666cd91e578b
-4cb177c7f24bb53b2a096e7abfd475d8fdbd0bad06ac17be32807dbef46afef6
-743bfe9c65d9f41691f698027dade394fb03a862d3c8aadd957f2e3d22af692e
-fa918ace6fce92a690b5481d88638747ebefaa504873781d51bbe392c8de01b5
-ae4efd418cddfb846ae695ca0c4f4bb18da6b54ac6deaf533c552d8dc157a233
-6382159f28a121c9f2f486f9ad00d487fdcee4459470a5f8e3d3ee056b7cf51c
-860ee6e54886aeac337f26d1ffc297b6903ef5756f964318d3aeaf9bab264111
-ef2ad05e4666ca98a320e0c30bdecb5d0bb00447c26e72a74cb5067c4734854e
-f85a9efea96a40705a62b9fe6ce93fdc47df59fde42c957fc276c86696a70d3f
-3503a4ce8c480c2f8abb6b86d4c0b689db26d606dbbfb1ba22960631d355bd6d
-f77ba316866036141960bea735580e6b306b30232485f662b05284775da99aac
-580a53dc696dcc027a4b008c7f55c8224e7c59eb86227bd3ab0f45f4080f2728
-3721ce2c92b117ef4ec8540bf86ab9aac4d142c87c483764691656f7b95d4c49
-69eb8403eb6e52effc8ce15cb9826fa477dabe136c2915d5f9e03b80e83b7158
-013b8ef2817b1020dacd0b8f8c80e00450cdb8e1d794cbf23596d25116a6eb71
-6186870e761f3b024ef87136d248af0077422381ddc0d997c10677e5c51c87c5
-873b5354c2f429661b9adb4b9c7ca76ccc878daa248857ea3746db53b3a5cb7e
-9b239744383e4652d32b75b75a4d678a4adbabe8e640f4e0a80fab602e09c81b
-4c563db440fc714dcd23d3a7e4aafa655d569b7f6e4a3e02233027d740b6950f
-349d0caf99ad47e7b40f3f9b88e1e6b32dce22027029ef7a470678ccb8651509
-bd9278055958c6c8802ace0c1655fe5e52a9840513b7925150d092a1f7ced5cc
-9938244b0bd766dec4954ac6cdd1db1304ae781383d253f65bd24ed05875eb50
-ad99d1bce15be48a6a363ce8f7d1d89b37ca7bc55dd84fb7a925ddacb6134a13
-13ec21412cf11b1182c1e88be892863fb487c57918a111d4857d3a4740603097
-8456c2ad7efd34d949111de4a616362f218528474dacc220f86814f2543f5038
-5f80cb9d39fbc70ae1f66855dcc1ef7982b3488f719683aa5296e955d72a3ed5
-6259fc3f9bc41b0e42514740d750a7c2987ac132eef1f7546a7ee8b073dcb7cb
-3077493e4cc2d0b8313968730bd2b0ab3d94258a840e25a52b96025704462c9f
-93c3cd3c2f3c66fc7e954dbcd5ffcffa622c797544121f91db0cb7793112dc48
-6996c71221bd8318a1439007735826533bdcf1fac581e5b3b8dd3356e4a578c8
-7d73026ef076fcec3124917ccafe0bf56f934dd8b57e2dbda712020b1c4a7b79
-19d9d7bcb7d5f850104e668f597d1c6945aba72f2ac3fdd00fcfd4f3aa871eda
-fa706e53c1fa0d376d1985655cf33ed3dc1791517e9414860e0ea2505d280db0
-864b7b02b80f72f10b5e92a7b79c71c656a14ce57f096ee937fbc8ccae999900
-bf31a9eecf2689584976cc5d9d20f84c3796a4c9c200775c03da8fd51644f372
-0ef4a6354fda3c562a001a95217b009a6b6f1adf1eda0ba99a5ae28faf22594f
-d80d09ea4bc02bd5d63f4e0116ad29ceba0b961f2d0530ddaafe3d3b3df8ffab
-804c7b7855117d0c0cd591b0828539c954e7b6c05bee6e8002f9453caec5cd25
-ab4397c807b2af43c2b2a883d87fddaf6051f8b2bd6d8c9beb43ea821e48de0d
-83ce6e93ac6959d8c7e4088b12240ecfd6a02e0a8a452161f878f024dc8a0786
-35ec88e6a33dc633147b9a2a1ef575e86048b9471713e0c8cc202d56c7ba584b
-9edcbfd980a069a994084180291a695144ca4e0ad3ca947180f6fbe8a709a3e5
-401e96b74f2009344d43723b1215d2a145d0e1e91985375efd8e340f01f825a5
-a0d457eb5c5b7da3551bd7edafedc14c3b6b9bfe7eabcb38bcec9f1f94439145
-a32ffc10032228b5d1154d2e22d2efed471a0651c3b9fb04c1910052d08649c6
-3d5b987ef316a90b2c1bdbcca3cbb12f1f426bdeedc8107c9f2538bb506c7524
-983e3147012dd9dbc0dafc96c65478bcf8eed378fee8a20dc9dcb0f229088a1a
-67336bbbb67e68efa61fc6a5750c7b29b868eb5c050c493b97ad7dfaef8f75c2
-8a8092c5be3c1fe73d519c1625670c78c373765b2803b932dab26c54664699ae
-d14e20aeed56b0a70516517a62473369e6541d759522598a0be737cfc0f4b74b
-17d63a72fa6798b867a1cb133cbe5ea48401fd4646773d5c377628a2560dd870
-283ecba942f65f660a909811a5332596b84ac3e6b583a24c7c5ce30ed978ebd6
-e0ea5b8f534d586b97b3d8f3d9511cf39b0ac45a21cb831c81e8b78b7824b0d9
-211b916b64a0efd2fb710b6777a93874dd625311bbb74a04c734bc3c8298b660
-9cf371f8a04b6e13bb4c5cf308a042e4346959cc5e7209f5d7e2ac25911f4f2b
-b14eb97582f80998b77714e872260ca785293e0f67aba0a232d677515c3e5611
-3bf6cc8c1b0d13219db4ec3d600392cfba7c3c7602d29ee0583baa53c1601433
-76d3f84601e562b73e389ec97a1863bd0063c5b2edbb5dbf35208a9a19291f25
-3913cc05c4ea5fe74c591893b53bd8bebbed59f13bbeada69cb75d3b8fa31afe
-3172b85cc8863f52b594621f80eb005e0d038adb6802e1ad80492867eaf8ea04
-6b391ac713a3fc24c0e036066c8c1143491e8854a4e8d3a6eac1c063bf1cc60c
-3333732f67b43bf55b43631eb2931a9519af5b44127b432871b99b3621236172
-d0ec4edcc0be44702893c0e749d7ffd81ae042be89442ed0d0f45fdfd2a34cff
-d26e692dac3f81ccfb7a7676444b48a5ee7df7b37da76b1c7c50654cf9df7f47
-da61082b64748c038e8b6fb6dcc2d82446064d826fc2406c3398b5d24fc41ef1
-ea4b833f9c9818a78864daafff9bfeac577964ea167734f4a4e4fd85516a68dc
-bc0a64b1d406651c9ec70e97bc15f4d0fc43e96bd31174dd4d0d228897a01bad
-1530f486e86bde3b7fe8203fe79f3904cc70f3fe5b70a52cdc3ac40812974ee4
-3ee335e05a5aad251c22b83bb027f8fd6a695a85eed610205c395f7ebba3a6cf
-27dec1048355636242f23e74b70640c1affa52309879376c911b07074bf35f5d
-d74e2a963209ef85f1902784898da3d4f43af02744afe6679890b7ac96f3176f
-e1cebe8d534617401e5342ecc07e115fa5cd1d77998d30c28da15b763f1e9412
-d314c535a574d0584a257487052c4f088066ed99e434bc8cc0f975436473f9c4
-17588ecc0c37bf0901211aeb658dd4d1b30a8155ec7ce8940f059935cf6ddb00
-e47d4da7428dce12920cdd864ed00fed8a18c39d32556a2a1befece0443beb0f
-690fc9552f851aba3862083d820da90009c546c0f8d974644c3f2033a81bc38e
-9432837e0469329715ad7c6d910a8506a4135fb4fd6951dedc46231de609f65d
-c86d66af10eeff7a899f92ef897410d56ab4193039c558325c7240ffe9172847
-42076b218220db2011c9dc6938f41d08634c9e07a81e91753f595a2fbb72752e
-0e2eb941101c30a26cb976cdd181a4d8fb0187092773e56b47acb7d6bc7c878a
-00bf69eafe8c2fd1665c3fe1b6358e3b6fc761bb19d8fdb16b77272f28c0ddcf
-db4c7afd48f12daf1ccee639e8cce5234f7e60905f7ef178b39cd17a5f5819af
-bd6523b008e1e3fcb7ebf0a85e328b9845788b9743ba205ff3809cdff74c8f83
-ac937ab9b041f32e9ce0209b62d8021c5d05809fe51d277a31f531f8e62d2e0d
-143125b599d06c714b6220981f5e8b20e64bfc4be032393b308cd99d1cda5433
-aee558820c95db7f5ed52e60baf77cd27a60db1d6ff7c907280b024e3c1d6726
-3f3eba29035bb5d70090c199ec5682ef5fd7ce0563c453eca594ab0349fa32a9
-707df207e19461c79c33b3e6ff2dc5700cba1b297d9d215dbc3647f7920b82b3
-1e7d22319352e83376b373197e03c4c42137754961ec274a241c492daafb078d
-8f0b2c1127e57f13de96d2bc9be9b5120e063757fe6b05d4e5bd7566b22d79cb
-78c01deeacd07d86e961d0cb9db376d61d1beada56b1a629a93f83405c7c10c1
-eca67a71aa87d7c0d28e295a01fddf038bad9b0de720718eae09d7edbf128a7d
-da8d786ee0b16d4d21b3564133476ff42ae7d8a5347749ec2a2a4642e87e7b64
-e6166032aacb00247f1ed8f552c94f3506f9939418ea62ff14d3ff98158eee04
-24bd5e3fa77c2562cd5bc6c7f0ffa1838653713e87b1da2e1a4d202f04e60dd2
-66d6d48653caea42cfc43d05894d1173cee0ff773fcf9803c2e5c150385f0c8d
-b67532b4012fd89c5558b045c3026017fa4cb17cece11712ab0d617631b1a509
-6677062be9a1289736fb1abfd9630274e40393cc9988d2589f22612bcba6b339
-c961e5a4e1fbf411a7e719959a322dbb622c8a9cf51d6f405ebebac19e6051ca
-5b750d7506ec8a03cdcc8e62c6d7af9f6a32b0b585f66b26ca61e290e39e341f
-0b2d3784d104f82872ba0e1ed967a064f708aacfe052002972006fe14cd4963e
-1b34ef38b99be8a7a83ede48c85d5c71d69e0e4ae72d7b6b1a46bd26cc636dae
-815786e9e0eee89493bfebb89037f3bac832781c8b1630e31542ef7cd6a483c9
-004ab161038ac6aeb38b48b8293ad11bf441db1fef2a168b77d69c4a79f921d7
-ab9f1cba257605d81928fc46c43a4f93d39b01b07ffd0006d38366393cc64b18
-d8b18fa2899b9178c40f008044fa0d1a41e879573171478c147cf71731075421
-650fbb856eca3b36a741e2077245845e074dbdd2fcfbbc4581a2766f1830fcf3
-3255695d54307eac8196cbb693d536795388233829cb670ea78b793c4c9aeb73
-f7e7de4860712a5fbc17ce5ad07ca98d70eb3c94a79383338199a56951a45a76
-6fee0d58788e22740f2568e515aa495edc80da6a84a2797c198cc1f3d6fbb2eb
-893f79f9f54ac81b39b6dac070a763cc81959bab607569423d423fc8fe5f98e1
-4bcf769ea77c0d11e5dbe2fb539ce15e09b68349a925949afcbe381192be5146
-d28382fed48e03ee3221bec2aa8c7270f43c948320a3cd0b831e529aa585a7c8
-66f2edbc5b569d4d95e3ec52c8a7d35381cafac5c301508672352d9b0f582a73
-9564b6cca37b517019c7633561f33198dd54a886408080671e1e77c0d2e5023f
-489305ca314ef082008d37da60896f6c4094451ccc52f7ac0d72286febd7c852
-5ed8f36974b846d64bdad643db37d8ea837387e100432131b11d5c42e5ec117a
-d17b2bcceb463d68ae7aad5b877b076f34609146884f216716186f4cdf7134c0
-f72d36ef9696d2b53ec3a3149a5b17f45bad371cbd72f2699cd52636151546e3
-d22c085349f42ba0c21d90524a94b37168ff489efe6de3ce97679298b18eca37
-bee071ba1f93d7d2fb811987973864dfad11bb5c645ce0a435f1db7bf20671b3
-caaa89df0478215fb76ea26f00682f4656e63c358f3b0bc84c64c17c3471dee3
-c97400d051617c205d5815ba63ff38bf46f06a8fbac182a4ca27038b0c8ee103
-6a9a449cc5a9ac774dcb04bc9f48503a3f4a085114e2f190e57859724a8f1e36
-cf97cfcc15d196ef82aa6d2964dbd886c39c4e72e15d869df1dbce4169171f27
-68cac43be9c95e344bcf7f0af27b45d386ab6248608416be5f432d582338d3fa
-c77b80e9874d5b65658698e21bd2d4ba153f97d21223e488d4c5c2c8a7520e95
-f6ff8b1a19d4cc920de4621166a4eaea5774219ab3efd4dc9202c5225d4e6505
-91c475337f68a2d870375bb8def9f4319aaec852b76049401c121568f16b9be4
-ed27ff64c810b325bca29b5642438e259135f361419e8b5b23f6aab03ac0b22a
-348478b32e93fc448502b81b0626489f4a358702e7067b1bbde9448c4af59d24
-a72c83e0042ac510c6a91e5a9ae0a69d2be865505238e396006527756734e924
-4e883e05abfe0dc62f9bfd0e8025172704111627916379044c3cfe0bd1d7e2c1
-05adfc871ff2db60351210af676444b37ce21aa14f1879ae06efe7b4338eb55f
-0aa768ac12df6bd8b87feac0f48fdd26f6d2de4ad88e898499608cb770f754d5
-3571822bdb5de28107b378f4b1bc67c0106a24e9d1785336bc80d1da9636a5f6
-d25dc355a88023f7189533e4a2416755821a03a069681f4b0554ab826d2819f2
-a4cc0726412e1d2a0001a3ca49709dc21e7032eccab2f58d80a8163cc8129684
-b4277d3ad896600f610b1883cc973f8a975e328cf4b069b44e4d5207ce889bcc
-49684bb2f1eebd711c8adfd4607abced0fba91b6958bcd5874b01e8370c7264b
-9cfe66d1298374288f3d3f399700fda41a7b193411d1873d321e846b089a2e51
-0426782a79990da94d6182c912fe9752a93d6de0d37eee602f0907b8cd2f46dc
-ed1179536bf9a3b74c0fbfe8974173a2c630c7360bd90f9c697b1d5068478814
-7806f05c70da8a11ef065cea507de043415f855f595aebd10ad001a0b68cd5a2
-ea7858041a9f40f05485b0385bdf08007f4213ab76c70b463e7427b79f826ea7
-ebf94bc420f700a50a2bbf291c867d5b181b8738738bbb76d93503e7c603a7f8
-354772c516443fbd33382b7913840785e5ae794fe571eb3fc65070eac273f00f
-d12bc28451ff8be0dde26dc63bedb66acc6570fb166a583d796fe9493793baf9
-6a13bce0e7952fee6c6700a9180f5ba2d0cfb2963e0cc8606d48b9be7bc99c9b
-efb1a2dea357ba87d790c52f7a90a2db476bdfb93f48910ae8cb5e91d1d146fc
-04736b13a017ee2216f286ed57965d2017adea323978d3fdaecf864b51fc9aff
-cc24902e266b084d518f1f063a2d0bc625ad9b108e322019d1ffe9a26aea6423
-69edd0537d1097bbd66dad8d859e7f02bfb3a77762907f989cb8579a352a0719
-969abd926a2caaeb9db6852b1494277fcfef88795af85f0750856b9a764f94a6
-5a120b04e33aab0d36907b89bee7586021221b27ca23559ae68a208fca16703a
-2fd2f1d8ceff5274e64c441befc0ef7901e5ec1be2faabb271b3801c485713bb
-8846c95c6ac596046cb941fe5a5ef828ead0808f0dbe808e96b5c48253cdc9ec
-a0f946a3877a9a0d61c0ad150f50b186f841125a311d606cde70d36f7c03ae8d
-027f88c6b92fa0f2d2b69f15a1563d5c76a3db13f43eeff40c9da317e8e0c93f
-ead28d0fefb5a253a9e998ae1cff676dfd88f6d005b148948b7407cb24285302
-35313ae2eb809b59813c15ddc621a69cb03e022a71dc1212627141a77c2441c4
-39202c7f4b0937828648544b05288337535cd3d4d2b80a0b3241169c8898e4a5
-db36b8230e8e56e3d0cdb214df9ab611003063037bace671454a70c801aba2af
-35048afeb620dc4fea9975bba58857ce16d2439633989d9306914bb002b376cf
-00be076bead119370763b131621c4daccf9ee58226a014d05c428c70e28bfc1c
-e9fbe10d94828d9510c22a7155bd28d6abdfb16e486322236b678978bc49eb1e
-8572abc47de533c8cb98d80b4a529b7d05fff2302fa2b099efbe64f56186f14d
-56771ff9802f23c1302732931a28bbccf8016aa68241da46b03c352237bf0182
-90f3afae514d05552932233857697a0aa8fe291d8ccfb8d85c5790157afce28c
-a0d50875e4107cdc0179afe2290120c6ef96ee34bebfccfdc2d47de8cc301c14
-959a4f14717e9bd54454f382394d0c9d653357c683d65857be45c662e8468bb4
-8f916c8baf08d028e339e64803d910196d19335a65f83230a9e6c2be9baeb01f
-9776b81d665f0bddd9a1a0ca31a0fb126b1aed8ffcc297786bd29cca18794fb7
-04231664a4cbedb3b41ec2d9066e6ca9d1b694a8d7be8973e9ccb799f79ed2fb
-e63e114daf8c937e361d4b7e0fc4caac2b87f0c9406820e9448ea9ff98d053ce
-9d5a7db9118707bfdda8f701bf6bae1021ca34b924185aab0526b046ea4fa65c
-d4412f43cfcda0628f0f5790976cd501621f5ba7937e6c04dd6700f9b35f3a52
-62640ee4be7db358b971c2aa5df1dd7d090195fb4fe96c8908d24529228e7f7f
-bfbe6138f00143a76b3c09e29f8eda3d5c630aed311c3fc3c9c57b48bd070b18
-b44aa15009176d0ce7ec488c945c51b26950d522bf80226251fde456d1c8399d
-7fb77759130de5e1620a47f6e8eabbc2ad48129f32e97974657c8aa6cb2e7ee0
-959ff4d70bb8b307d2b6fabbc887c04a6e95a986ce189927fc97d8ca7db8febe
-e699d3d193545b1937082373e930af3db6ec7e4eb8c8e1d6e5615b93177b9a2b
-ce0d7616642da91de69b7ddb922a4f47eda748a71eb4662d7476ac5b15184acc
-7bd92e2542f853d72f1259020f66b782f83727224470405099fdd181dd4210f9
-6e8e28b257b8444fc35053a7da19361b01bbc3bfe0f8600e582620d1afbc3803
-56359cf6e9f1964635e0e734d7bb9a1e4c7d704426b8d2a0700411c226e13818
-f739cfc023921809d6b1c8639eae19f014a519d6b71133c3e12451d21aa36cae
-16f002286b5aee0bc46d5dc92ae3779d957212fb276d86cd0c6cec26c2bc2dfd
-cc2c9fac9ebd5b4c7324352806a0d9894a1e809d8c9c2b1a4b56780cdcb7a548
-fbc3faa955088fa50746598b134f64f4d88e8599cc48a5d5f86f05f898f5c270
-18d50d256d761964c12aaab06befc98a84307547b80839f8fb1b7e6553d7e522
-c641db4ebd8faba0f24af058c6de88f1ddf478641c513423513002bfcba37ff8
-2336a6ab4ce3d926ca060a4084f3beb0073bce8b91271a3b2614bc0aa19013ec
-694afdeca7eead2a6527acd348d00458649ac2e475e8349d186ffaa64f2f058f
-a8c94e7202a8141f64ca347dfc8a7ce7ce3c9402072e188c77290563b766223f
-deebc865fd7ffd4507e74a972bdc5ba05f1595c4603627e07871268392522a65
-93d3035b5f05e8cac3d90e3b6a8c8563baa8f13d4d8a878445d230f71c257ca4
-90d72b7697719b66b62055fb8581037905a422baa45aaf39efd0c40fbcc7109f
-dc2eb4bd0f4ac59bedd12f12deb947f2008088321be00902d555e22391a9921d
-eda8691ddaecb8be07ce75f459c1a5e9ce7c57386e8629bcfbbccc796d3b0551
-e207f6e0fa063e926f6c663d576b8d6069c022a51f9f9c21147c7afbaae7f697
-762db69c73cfc80afa498024870e3b7af96203caddb5520bc20db4b7da0f3624
-4b20a8110e753d6129c9dbba86fb5581dd9be7a021fb027f5f0ddb40bb111af0
-a019900edecabaf3d5cdf84981fe2a659cf9f95a7f1d5146a566cff83ec3523e
-919d4a6ae54ac444e1e7f0a56746850186d8461721656b54bb784960b5251702
-33d92e8c89680f0c71ecdcba4b15152f2c933908449052c4b4ce617fea02a74b
-b715828d499d2208d85ef7e45c08858bb344144802c885d102364e217253a739
-2f6442170b29f8e70b4b24bfa97c434038364a0c52084c204a09ea5d48873d0c
-dbdc712312c582f9a8cb516a5aad8e30b591566389be57d444ee22bf80a06f76
-8530bb9cff7cba7b8374f091fa17ff0c1755d6917b073a2e167a82e381793592
-cfebf89561f0fdb63044f7636424bd0e406d622f957c740e6f0d3884702badd1
-2cfbb07a20558193c10e5cf372010a7955adf5d7e16e66c732ba52e3983026f0
-002b39b62b628dbbd44d467904e8726e79d79987812f07ef14465cbedaa19476
-5692fa39d503daf1f3f0a3ae881cfbf7c6a0e4ec54d7d0572d810f8861dcac41
-e4efe176c5219721911c8ad2b3985328d49e4cc4380892a6f108c62d711a8d9a
-c44c46936b90e4d1e6fc9cb7d01a6812d11a5bb0eabf497d0d3b1eb09c2cbe15
-823ed1791d2199481c08c1f284bf72d428650319b881fcf79934c5ee86885b40
-cc6240cb1f8d80b0c8f221d8ca58c228d6da93de005b11c15fecd9450293e3cd
-5005cf191803a161dca15fc2d187f22ecee8335d58f21f69d15fbbe3c1aa3d59
-5a142f8c3dcb7fa934830423f072b0d7d5613c148a28806085bb7c18a8c53c6e
-43821aa5cff8497822b48cb09ab2eca0fff054299726499124f7b25973cb9c80
-936aece707b66985d7bc56f2980444cf3b1ce6a462a5b78ec05a036ba12e479b
-cfad5953786ced3f29d5f6e5b33ed9d46901de314e87b831c376a21ff4c8385d
-175aa0568b1ebc5f890a213483cd218194e15bdc61d51feac0401432859b5dcd
-253395df487a1ffaa708a64ce045ebf6c6dbb4c9acc91db63a3bc1680a697538
-f342ae8b6e022b1a4d77293f596365503d5aa34712345d613e92a3b214cccec2
-a40d0e3a80e85caea6fa0145a6489e65a252ce407fb0a3e1f6ce12d4ff4737ab
-514065a7a791f8d33df8d52849ff5d97bfc8dba6568fb51667cd3f0179ec89c1
-0d656aa50b2ff5305168af18f77a28ac8573d8cbd277f8bc08482cc0f23bbfc3
-c62c400c5f064143fc73b04fe2ea7d48f823dd9631968048820d81e97f2d6046
-992d89770073b795682fe2fa6a9356ef89cddbd94e66c7a61bc6d3a3fc629643
-2d576a90d30cd1fbcf3d511e03374ca758a245fb43ef5dd1dba49072a627e35c
-10f831569b3b1d57f8857aa5c7eb7c0a9767bdc44d734d3f0794716b23f64831
-0af49c83e5aeb12dedf627af214c7c48f325f1102545981025d38fa0bb579388
-cc5c94144f5643dcb8986714082941d358d35d2c8d8b3e5f731a9c7940e81a03
-e3407b740234a2e20f1a7ce7f32b57d5f25b1788bc242f732540f0344950a6bb
-6bd5bfe7d1d62b1596c7ac5796ad727a47864aa730e4fe4b0b36154badca57a8
-3651d37f4344a6520c67b41b3ef31444399933ef13f053627d361d7b3e5bd1d4
-b94fee21034ca389bb4a6cd73c26021b23784bfa0bb621a17a13217d3cda2b68
-284f41b869b70ee24a3acf909a67686eb95805c8e7ef912d0dbd5c3eafd377f6
-7f94b76bd18f35684f9c4fefaef7829534900b301a0eb3557a73fac07a977f81
-b55ac50a1386c7d6a4019a8c3bec9bac1d1d54e68e53e15bc58348207fa58bd9
-89a20e2f3396354723aa3c823a957a133286080fbc124a11a42f416207ae673c
-0773c54007f9420f92c6bce228f5c93248e4bf7bcb85bb79fc6694ed1bb7e43e
-219b996905f6501948d0575358667e52445ee9665035904804d45cf926d91828
-8f1398b668941950ac0bb6fe53bcfc9fda2945245aedcbd07cf07f85a7981b4c
-e9e84139a46ddac48b8421fe99aeb64ea97f954b758175433e584d60cffacafc
-915b856e26dd41e000c1162f76d185f469d3271887505811e12e1558d1ecc456
-2de5bf7aa4c26cab047001afae3c5d3ec9cee9dd0b5edebeacc765924ba00624
-ec49223ca7be92cac4583509aff3016bcc446e14b5dd7d9a39007b5d222f70b0
-a977e0192e6080160412b520a8e72f7bc93737e344f1c99acb3630aeac72d60d
-344d5ca010e962de47cda71d704587d266d0e584e17917cf528623677da03619
-813bcbd6d360d945068e74f8eedb6aebf69c6e2d2158b050dc402d55fddf451a
-d0c1a407154b04a5904b6987662af27231cf49118603a4e5de4d0b5ab40c7ccc
-71847ea1f330b2a54ce9cf1abdd13208a6494d36c3fad5cbedf46d423bb07e72
-8188f9bf937e0db8d8566efd8e056acdc3f5689c8e19a27be166a0edb07bba64
-3ea6b53c4632ae33e0616222a54391b8cca32d7889f95f0039152b8dcce8ffaf
-c0ccd4310fc6dca19b0bb994ee62e8085f3989737619c8c516f7a6a25f9e9887
-fd60a30ccea017e50ebd5a2c32c553d0188cfa26796ab530acbb3eb090f88401
-12f6a52f0ca684d55ca2d414a36228d88a20b2eec02d182392f0924987cf72ac
-92897708af33bdcdb18c7437d103fe4a96dceef7788284878b4876333de5af76
-4617fcdd491c5c8095d19cd920dd3ad8b5b71a375f49520bbb6355eac3a188d4
-fbdcd55619ec3b6305f50d818f6ee5b5ae92dfe5a7f4f209e9f3ccbedcdeb78a
-e0d055c3729429e9ed3787b52545d480b5380e839374983b6224dfc56bc8bed1
-47c1a8e7dfcb285aa1db7716164cb63bdab011797c1a9bc76e73ab86958f325a
-7b7e15e987e90622824f2a12a220893f47737fe5b5496696e7772e50a8cada3b
-8c826724115a236c082389390fbd27b6c3bb10684cc720dcd875595b39a47196
-058b06758e80443175359c3402e4e84ab850e42415516a19f6d10ba52369884b
-e3fa91eb9a38d3aa07b0aa9294b7301faca79b4a601e92428026c70a7c6300d3
-ec7256768b257ffebb593eb497cde45d9acb4b44cfdc6452ac1f9f612af2c5c0
-be0952971025e5919fe3836a145be9e264a8c7c36c658f2ccd1acc9bb96a87f3
-a84acaad0a05f932907451ef8d050bef2f693726396152031b1f796103ee26c7
-0551f75a9334d8fcad954997d05e932c9f1f3a96e74c44e04fd18714a03d486f
-1cf8ba0688599fc8e6524e4d9beb6816a4e2030d8ea06a3fc50183abad196668
-f15bfa80281fdcca6436b04ca4312e7feee8ce08ccbf90b1638b9fb57db07975
-5115f9fbc599449bb101a7709fdfba691318060f52ba610b818a849d50d2b11f
-bb0d8b5f859ec9ed3ece36411d3d58d58f14827b14cd5c2a0ec4dce72a73c452
-0e1dab33aa33ca4cd3dfdb103c5579bdf0506853a7d08821ce69d4614d1a7c67
-9e9e9294526b50cc284adf3eb0cac4f6df491756f1216105e5c25d898c70edac
-dfe0ade3d98daa6c07f6b2f04d3cb19d108d63b432ba6db41e68121250e5ebea
-3d85b413afc8d87b934d14a663a62b4b18841b78f5965eb483631b4232cdf87f
-c3159b354b6f70c2b595f46f43fca2a19667b0f91f5ec7a31972b10462a6e83d
-5affa53f7c8e4b30436f7da31b6c41b831b30f9d98034708f1c5c3e34c451bc3
-9aaff97ae2c477748c7f96afdca8655c9dbd84f30bc1b568c3f9b6f495f17e18
-8ce2286696cce2367abcdb42e4000dbae8bed2d6d187b7e9fd616a17df7bb16d
-ddad03b29d51489c5092e032b6ec2f365774810771e2b03ce94f5b97cec5a896
-086909f0dd481c8028a720977fc8fbf5aa62f6cfd91a798210fdf28b3df8f4f3
-937e7306048dda7c69aa5f4912e7c6192e72b1e9700a3fe380b3c9b63fb3153d
-48787b1da476fd22e986874e123e30e532167bb3f17323094fc84143ccb8d7c8
-b5ef54126bd9d5e3eac00459b3636803a6dd2b3673ee865b1fc2828ae38b74fd
-8c0e3fdac44f7c5111d6ba2661dbc47a0d13e751b10de1e1346633efa2607a7a
-d1db1a062202c4facd05e829e37661014675f2df3775d88fe44e7ddbb3aea3ec
-27d7b4bf413d54ddbe1957cff63a267bcb8ef99c27280879f5aed3b55c288e31
-2d3bf0c631894b30e0c3c8179f277cc63a395d98b66f99a87351550545dfa98c
-ae027ee68d26c098d586537a2b3f0ae3de112aad1ea133adb4bbf5fec1f1472a
-b941aa2db1318cf1dabfa8ee0a184398f9dbb7e6d29229830fe091b487f04d8f
-f7d1daee5253cb84fbe492a4d1e117bbd9107f9ec521d924f115441f3abe6644
-6a1d4ced84caffd29e221c1e42c7379ff700abe131de0f363226a90abfb0401e
-970dd4a2727eadb374f5e933ee1a11e9e85a9740e0b9a850f3eda6e904770f69
-bc3edbd52ffacc16513d4eeaaa948e533a8d693d184660dd89ff3f945ccd2d5f
-602cc243ab739b4d488e2577e58648d78716fad157fbb814e0c7991764a3e0bf
-9d6da3925e634a1fb3d6de50b563d90dc8ae3be33c6369a1a96ba6fb8c16f2a0
-db154373adff4e920c0b32ec6aee55887d4670a2c2340a12556e5b9d688fc299
-283e19469a14a8068efa9b489522e2f44c293278d138c732129aa7d97a8ee41c
-30d2f40e8a7e241ce4d1596e6a1cd065e90167a52aedd2635e7465144df866e9
-9dac70f78425c9e68340ea5d19ad3d0fa0f944d2ad489911eb5abebd7b48bb95
-6e8ac0948aa564552395de41aa2a72646fb369ae9d08958f759afc10185bab4b
-34349c12294abc6802bb1ebe3357f3b0c0ca227067f3768e57dbca68c2d1955f
-5d18a7be0b9805fc2bc4b3287ef1a9d16350e5997f642ed6a9bbf46a68aa0ba0
-80102f020e5a331fdf8217fc1bf0da21ea7f20e9be95c1b59fbb458e4a5cb47d
-b38fb3a3c0ceac39788794e47ecdd42b81c5f8dc6b6e9af7349babc8fa79fc77
-df3b5b303aa5dd5a2949ceac2fd202423a918f8355253f20cd86d49d8ac956b0
-2993c270fe41c6c7c4fba75b10a777191f33618e4158dd046c5ba0b145a0b04e
-18a5f4ca5a7662bf6b913975d6fa9b4d1e6b71f0eca1029ed9440c91edb1d246
-7657d9ecfd8981eacd537757a8baa5318631c688d1d865d9645b4e52ccb9db3d
-6549a792a1f207df608b6278dec2956a2b00aa3783630f6c516d448daccf72c5
-3557436ae09b66e0ef1f1156945afa125eae9ced158b8301f19efb2daa86a71a
-fce1b319f87f0955fb113973adeb7f175590020beaa16db43bb361fec1dcf3c4
-d21a58d9d01f40b86f5059c437ecf83367ea8acb91baf187e03fc51cbf4c07a6
-74c5f63e7c7f8400c171f93ac7d3de26d141938cfbd6163240565995f44a6254
-c840c1b4bd66f05c2c08b55747540d267deeb6673f1ed54ac99ba83d15d6354b
-1df05680bb93b9237883261a3a475b138373c573efef4011f042102289a50dc3
-1eac543df910695b1971d03c256f258ca48878e6c1f3170017e3ee97b9b705ad
-2241ac927a86b4a44f05f37d260f451c0fb10daed031d67872764fa273a95c18
-3e9be8497c3f68236f32027f8c01fd707d2cbdd339b07dfaef35f9efa1d43a24
-5aba59558c3c0b172e30c3a64ed18c9eb7141a00f8862583cc9ab16b9184e099
-10ff30eaf0638988cf54d6e40e2a0ff8e5832cef7dc239ee90fd1eb079d0345d
-cdce0a6d9ec621dc6ea7aec3eee09eaa05cb6505865b90274fa890bb64d19d74
-a618a951e3b6e74ae3c65c84cb5d48ffe4ecb86c859cce068c1665c7aa9d982b
-951b95e10c6ec1dff747ebb981b380056d9ec5125ce14266bf81036a581aa8f2
-3d76432c7e846bc7d737ef0f3b91262e7cbba277966545940c67cf4feb14682b
-f557e45e6f44b120c90862f3f1da74e9b0b35571cca2c2860168821289d2f836
-897569d072774cecefb2ceb1f55460ea5aeb252a2a9f653c8b646dabb7d1dd53
-1e1da1c098cc5e5e41893944ebc6da81ce44d8096813f4323e97badbf6c2a118
-942e44874e63004f7b925d6f5b3a15a42c6808062eed0880a8893c816dedf674
-96f49c25ca5f2bb1f1f49b178490c1ec6aec6bb3590005f40f339c7efaac56a8
-8f132f9943edabb2fd1f3b8b1ca97c90d376f5f62c5ec6b3aa6c88ea7bb28eb8
-687e8d24498ce4c7cc7c2dc4c60beadab36d50f0705606c4777be8f391b78560
-56c87740ed507a3c4aec3c115f837de4a620b2b8a028e9ce52213f3e7c425e0c
-a2756efdfd243e55e094020fc74b820530051c414a32129cea783402238efa46
-b98348ad5cbf27b1137ba5d7ac1ea2d6e8df85908325f75bfc130bbf0b1056f0
-f1815bda877bf922f7f71488cd63f22107ab224da5af9f0bd07526df7b78ea18
-223eea608cb614bd38228782a8f6dd42d559a894b814f08f9120ba314fc85d80
-0b6909c98735b0bea839012811ecda1b5ac66974262a232eb06daf952b70e07b
-b417767fd420961262fc68c7f9c4084fc324d1b7c9550db0c3aa665cccdf684e
-f077cf33dc707a148e325dd3fcefb13b3d531849202f83a7909406c1f2190623
-658c0f9e483b8ec4379f43360f31c1c259f4a8dd369405affa2fd4ff1fc6bf7c
-57be200df6f16d82fe62f9daa00d10bfb79fe0351c7d5044bb6e6ef64914651e
-c046e9a6e9544e7fb5a983007a59dc78efacd8bac06dc49148d0df947b24db81
-551c6e8d05a75dbad023f1c600f6455eb1783aee8e2841b63659c57bc309605f
-e21524b5b59865ec7eaf6df1cac0032b10b9736da197620b86125db8a97f6d7e
-8e305f92b4912641b692bfd1b98193967d2847edf3c7e1efcee96b1239cdd35f
-f4c843564827f9f5adc858ba2b911637205a9fa8312675d021b259f56342e9b3
-95d3ebf837e945c7f08494fc2960b92f7f6bba9bc2f5455b5582fd670e6500dd
-ce38653d5dec5497726c15f3ddf885302a430f9b7946bb9ab2d9efb3c3f81ad0
-2394aa54141e3849b5ed816a717044bab44eac003a8095bc03e6b6b11cdec77e
-979fecf2e780afa121e03278fc99d25c0bd241c657558ad88128f0ba7fa7482e
-e6f643bceee670e0bdd932290624086df2198ca3bcdbb976379edc7204607f8d
-b0f6457b3bcac7eba6513e9b8dcf6a47c075e7418b0cade13c43180970d4ba6e
-fcf574c4f9da83b289a7a6d2a495b6ff32316b905f878579ed5565f7509437fa
-02a28c87083fda09105649beeee44fd1a80b0092f064f7600d3bea4c549e914a
-d8d595d8a278aeb78b5751eb2feb3b8099ae0495eceedbd747361df15659a9c6
-4718304f7780a881472317605a38a9c3f7a39e03fb7169390a5282acdac387d8
-88fa9ac46d3885e65be61519c131016d65f85bd2d1d6b321ed9bdb5f7210c4f3
-62254ceb44ce75e79d8aebb96654a28e96be766c19439e26ffef7f185bf62856
-b0fde276533cc68618b17221426f86406a5b0c999f7468d764dd92a632bc5998
-ce34724e7ddebb53e9c125a2be5b2712d029afdba0ff9826583fd261c85a7951
-7e0c89058d87e2105ddd8ba7e277e9bcb1cea56d64f2ddb3a3e92751d718e18a
-e8eb8d55d1a35edaff938c5f6d95ec089c727953c3ff6de24f7fcdb38cf73ab4
-1ebe06a67ad901ba536ee1d5b208b86e692498215075abc3af597dbf93aa87b5
-84876a167d593c5fc0c487235b6cd349d3edaab4265da66f7c4ee4967768fd89
-c7c28a64c97e20c3a34973b9142314a1511a6fc6deb13dd451ef69710513f18d
-d1c960e712d73b1db1e8e534096c255c63987ab4d32e1a8bfe145777fd1ca548
-762f7b4f7447d03a61e770c12ace3860c6189b3d0e41f0551cf722cb3dc09073
-f0567d0be9f39e8bfb0f338d6efd8e1279cbd43f6c4a063819aca553c54aa234
-6eb9d433c5426bcb9b81ce88b557a2d59bc7863397a9994dd6bfd6c7c7faac38
-0b128642a86241bbf8a4ffe9887758f94a153d6b2c138442c5ae670fb50218d1
-fd57d841af8f328b33173e4b8ac9b6db3006741eb323a502045702eede107dfc
-bd4081770e3d07dcf9cfccb7e56e3f0c7da3767ac373a12f3164f81b493f12d5
-49ac50605430dafcbd4a9f49edca82b594ff829ed3bae596a825a618d49a96a1
-6b61f8e8b0e5b3fa032561747b96fa1935d74d0130ae01accb3da668a887f6d0
-9741836de17dabb950d84738dc5ff722838b507dfa7f4a88de4d9aab12ff9a34
-1db27abb24fb8686161443341a975cc810ad1a7e352037dafc33682a5556e6fe
-46bcd08277461c74caf2ec1ca2db253d82dc72ffcf5cd471900b7c0f2390aaa4
-eb6196020e305edce04643a2faaa4fa9df91d3e21121da099ce25975d4c950df
-f59f5e4ca3f426af7b33b958ed1ff3e1d1970eea0b97da7212e8a42124372638
-cffdb6c5dac17629c3d04ff2344df5cb39f6f156b6b8a4bf38c77d421a26ed40
-eb2e4e1d274ce7b5934c69506c1705ad076c58ccc5e27c580ec2dd978dd1074d
-286163d79baf91e3ff30a507cf1c1691f60e28c780b8f2b2cd7a66e18413094d
-d4381a15cc3a2b8ca189320df07dd3a25580dcdf91a2b33b3d8fc89ce71cc087
-8c0d5d4fd12545bdc7fe4af1b9cba1652dc8c076df6dd029ad8b09d75631b4de
-63b3ee38b3d133d0d3b7d6c991cbae09a8aca77ad4e0351ad54d2a4a1a2c84b6
-2a8dc9646ea4cfd1b66af0707eb5fcffa78223898c0f377ad55e5657661bc1de
-e331cbd9fec4677181d3577978ec08dbda4c684cd0266ce6d1e487cfac64ef84
-62873d034ad7d22518a7e767ba80e8514317710a71a228f76a66ad59b345c4db
-f03e056eb6c9b2c444f2199c8488c037c37934d449f0049e14c588523d9acc78
-50538da9ea98e537418f811afb492818c285bdb80a31987b41a1671a77ab530e
-be57d8b71b6f9c95f7474faec60705c2132010887ad668b1d7d53e26b480590c
-28367553ef4cd87ee973a99346fbd55a2ab67635dbf2df12d4ced638b733a921
-4da2b898cbd41632807b34fafda648b3c1f53d0e5c835b0cd3803ccb34a447b7
-6a5bca240cb0b1db849d40dce5fc8f2e3f711ff47e7b0e1a71cabbcb4c42e265
-1f482c194c301b4ffde9f787f9ac37c620ad634e7d1bee6bf1dc92acb38c1e6f
-fc4f531f5e8959e55c5d6a97daf9b11841ee4b14c4ba58e7f0dc9aff440e2a5e
-61b046b0d47d4ed606b4055077bfc0d7c033b3e4fb817a02be0891fa360b6205
-8cfabfa60198f426bb7ca31877e4273912547e1738446c2816ccc6b796898310
-ce86f1f01654cf02b7e6f647e9a884041655a76d9d646e2e0098b15123de9ece
-8580c5e8b36946f2aecbd1922d21d15092617486d2a7da0419c430ff83a76428
-d183c15d0520b821c22e0aa806eaedd6df9392b6dd93db8f22072044883f7102
-dc2abf3ab094b1cff83bfafdbc0f115d1ca965885356039bd90c76a78bff2b7f
-931ec1a762b750146183f4080b7161d9e313c90a3d0ba031dca89f5155ef2c77
-d1e9949d07a2a318ed5bb9f43ea2df854dd15c45c09595450b0cc355db139f6a
-15792d516ffbf05d2ffde2ccb492bc5f8582c88695eb42ff075f1393d04e19e0
-5bbb51e286f578ee126792068106db3960ca7e7da8838c52381d1853e731f46a
-fc759825cdfd1c50cca5e63e1a24a9d3eb21a032cd4333648ab4b6725ef7ee64
-4bc1c07206312e241ae8c4206f8d211752ac7cb76f2569e2213c113a3d4f2277
-2fb6c2df9461da1b36a0860cf2dd52ceba0cb8fa5134d94438458dc4ef566166
-0931f0a13a88452fabba8805471b38d776fcfc616c602f91ad0072b92a13da58
-08f716287712de4f6acc57630b3c4343c37c5156fb610f2455795cc9e6804de0
-c7b6b16da5b274460bdfaa1a5249a3219caa1dbda045ce35c3b34d628d0a6e04
-3935f09635d6063592dfee4e8713fb04a74e0bbf8bdd6efddd86d6eab693df65
-d7e71b96d3ab69d78763f6c06b6ee1fc2b8bfc274d33e58f7c13e46f884f64cd
-2ff2091d63d8d0d2305704d42a18c353b55956f11057a920dc00a5c78ee5c61e
-0ab73272866a3b5c6a46683cd4f761f267fc8e98a5ee0e55a9d8cba48cde5215
-c96d0fb18f757705697c13055d7f2af893a097b594fc5200a1fff0d231487f94
-c6217ad21609874754afb8de70a84f92eb3999ad348ee6baefb476097ff1cb8b
-dafce224290bfaa04d3184d02ea2c8525232b1f62d8a3ebc5ed8d2aa1f7b009c
-83d427e281551583ff6d1690692648d7e65e7c98b67c8d181ce0736f1518f150
-9c2b13ef0135118fadb78e58fb01f90fd846fd9e7fdea4a8cc481333305b1e95
-4d0037fdfb31d34bdaff1e1c0ad0f30683bfcb8510c30eca21008147a17589e7
-2a8b2971c2c6e8d45259be84e4884fa79791f7bc3abfd138b8b4556bb75e4f68
-bb934676f740e015396c5ddcd224834f53dcc17fb33bc79e15374249c1d06a1b
-f20f3b29858ddb1cfd470449e098195aa1a64c187fbfe6488b89db49851bab87
-c77b617543570e105c27e7ac73583f02d0541afd6139ae5ebd8382464456731b
-6779788412dfc026575e27a197c5295e3a261864c9aa91442ed12d3024db79cd
-1025564f9cbf5686244000bf2caa92df14db97bd2a10535891ff3a84008209d9
-cad7566b8800ee7287ede867d79ecada749aa5e7ad22b01a9f211ab18e5f755e
-6736bb2fdb47e4152aaf887aff350a7a74eb69430287afc58d46e2c171aba4cc
-a01792b0dd4b0a67624d82b71b19c331e355a909eac5bb94802233e6e3310f97
-da3c5d40ea74ed3ce0d283233d1c5907fe29dad678a9c3309402167881d3daa7
-4e3fe4255ac1a73f15f90ddb601d827332115538f1bf93811a35b441e4442327
-d7fa2dd901f3d66b7e79e09f83f9bef5f5fe1c01fee76381ad3394861155cd08
-fdf2ec5778e4cba57acdefe6a35191c613cf12c946ad8b2b40b6026b5bd4b9cd
-909d1779782f4af32d295b2e8f881a18d2cb0570104768449ee2e960f082921b
-e9ad82731065b3c3ef18aba3f9beee050545d766b4bb012cb05e36c98916000b
-22f7dd0d60090fd5812d9c7e0b7f109eeb4c225c9b6260f687a39429e4ee4dcb
-2b1c5f8cfae108e005887b30a949df06bcfc34700b69a5103330e400e4666a1d
-5c758b6d5c2ad8a733882ac3cf1e6a1395534c3a9300371d3992436227635313
-531d453ae6142bc47f086f805faae0543b21d52962343b25f64bd46ca8f63f25
-bec767324d38576447056a6f508efb68e491af661b46f7ba81da215fe797a16e
-f03cfa53db0b51e39a7c71897ac5ba31d902964aaf3b148e7ada10fb7603d4c9
-b1585312db95625d45a286228dbe2217d6bba65c9a7dcbbdb7bacb5beefa3c8a
-43f848f473d9bf37abe92a2ca91d26707ac230f577f7a1618a02d2dca08bb84b
-3343f9175ebb3e89b36a46eb75b83b62df50b0108d6118f790dabbde765d53b2
-7cac6abe7b5440325adee21be51b9367eb9cdf8fed87a081679e7ae6aefbb6e6
-589cc42556fd865f312b54cff53284cdf8b442c4b3326eeb8d39abb1e0d2e95b
-316e87b7615b0c37e908d4391f1ad9d2715e94bf8de57a1c624512c23fba4d51
-9150b26a4f13be2e9ced538d80ef807612d561dc8d3f5b602f4886b8c9f2466c
-5c948ec6dae5b87d00c03caff6c7c241f4b965a6c6368a30013ee2ad5e1e5000
-94308aecc238f659e736965842b290ade6f05b5152a27fbde7a90fd97cd59509
-f5f05fab13461bd7374399bc6da554acd718e4f67d8696718facf56d5ac10468
-cac7833ba92c74bf186ec50fdbb043223974986e2012c1d18df40f5a9c52fd39
-97df5f9e5f3a827d50b6ebd6909e7a0de29fb97920a03e32422cd71d66bf5c52
-357a8d8eb241c6c8be42b67cfac2c3777a0fa43d2838db8250e2b5b8efd3c367
-80b19339332f67d477cd3600b04c05b87b7a41d0def6bf82fada771804a5a756
-bec34265b6fc9e11790f8d1306d36c0514f6bcc76e93b584bdf86384ac22a96e
-31549eec68909fd34bfcc467cc742dfa628b15abb7aa6a181dc3ac0fd08a2097
-9480abc06fcfbd81e7d4ea358839db58c30c3a7eb5d698cca371f7630939149e
-b897b24f6d957c084cf0e2932331fb5c0b501068b4551812a9b9abd4ec27df7c
-e824d672ffe6e5971ecf816f447482130819902d26039390f84fb513d2d89662
-defd5725eb153a074c84dab1d4d666d6e1a4ae2b078ac16f80caa6314a1f63fb
-6d7eb530ccd833ee1f4946790344ca86668cb3de69c3013c73c971d7bf583095
-539dbe02e8f18e2da3bf9fde9cc5a5e859f9e5bac8721e36a1d50192140ed21f
-a6fcc212ed167a50e940b38a0ab78d3053507500d768d1ea9c7bcc7b3100a05d
-1db9350ee33c7a492f4543b45e25740aa99a76a1dc7940b8b52883974b07a407
-df7560cdf1b103c75746fcfc418580816597424c0aa36e0dd38eaf524e593512
-174a0ebcac0488958b01c1199d786f93ccefc14d219b2dbabd5b50c57ac6c195
-fe51a6fac81db1fae5052f21b3af4ce8280bdeb5f27e15f069ece57b0b628858
-947ebcf41c69d0c023d67cd21b9e0db1366ba5abebfb9c98752a6c63cf1c8333
-d7185403199b82e9e5fa15d33e646e63459352f829fc039ef185e004cc63fe21
-bfbeee4c8102cef70f56aab4e35c4a7ad51c85d985f42d54e4cf5678ba7ef4bb
-3c768056fd223fbd6ae0a390e0e7489f5582d4ad805a6ed2e5cc0502be6f58ce
-b1e3de8cd4425a053f84ff85ca7a1b9c679b9b57457f91c441d9289469255452
-34c45d58ae796a7f21b960c8dd3195854ff59e6914dcca262af6e5db7f150976
-b91527a1f0f00caa0953e082f5dfea46c0029bed4eff22be6a32a9bb591334b1
-68da599128f4b31034e20c0efd5e532b9ded85e5633ae8631e83ec1d6069ff76
-aa302b99f88e0e4070e4b93e1cfe528123928ae67733bf6fe6068c22328f16ae
-3fa5b130d9651b531ea4e197ae3d3c16948503f1842d967eb3c5504e13986933
-cc0a3228269139d68aaf3480875149e25acd6aa8e14f5c21fd12096e274a1cb1
-223159ae0b531804c1a8f8dbb9101d3d0e435292f0452990ac4a646058651025
-3ed58cc6fc71eea6ea99c6f96f029b65f1c24cf911a35076564cef64dbbf82f8
-7de0c4f2faf3e56a1659d2b56dda42a3f63e277645b9bcd5c92c05c8b05adf75
-35b3aa4c341358c7c7927b8e9937c087e5e142b14dbe5e5f709634ae97bc9f2a
-a82a2f3c3dc16b1abbd1e3f33559f8670e1dc70a9e3b0b717ea458518357740b
-75a9b2b9cb076e81bb95d786d4720dd59120200dfe860b6e40f2c723dadb84ba
-e83a80a7c874b9d36a1843d3ab1dc330eb986d25d6e036940f89670cd41d7ff2
-0a9e19ee36a1c334c779093950bea2854369f4ef24dde7b17e4581c9c2f5e5d7
-49bfc7a6a9433ef9dc465362bb2b252d7505369b40ab4ed1280c690599765d3f
-6c395d4f3955dc9e7adcacd0f85b34e33c1d5b0da79e54132e115002728fbcc9
-def9ad99c3c72ef5fb77d883f47e417bd26cc8a13824297bbe6102cf7f60013b
-3410e61d06f4d9afe6d9eafc92b97459a0433a8928fd24240f6f3e388373efac
-1bedcb5dad56b55d248dfa546329ce77f4f94c388362e836195638066d636a1e
-9de34a86088831a498a52821e2843d704bc01d386e7f268855af107ab35982b5
-9a474a271c205b19ef717c66cdcfff8e53e207c2c1fbfb8129f045f0c150a053
-33787d5dd2d7322b3ec6f9193a891c3c1b414f27fea3635a1c1d88c21c18cdc9
-1805f3214e8536500b67ac22ee4fc1aaf6a12be4f8fe82e021a734937f0a05eb
-3de81d728121fa862a4993320c1fafb719ef1851929ac2efbe7c1e8d2a3e35b2
-5dbe28dac5ddce834663b196e17be78fef40be1ff3885293dc9b6db2a7973408
-0730556c0b64d66176078983b062cb073d32000e12e8cce47ff23f877078b5a4
-2207a050c62e39733bcdf87f6b71e39758f531cf55a874fe76548ccf8ecd227d
-9c0d76da8f0ea5b1971e71559203f2c731bf31f9563a58d6d110ea507bb7734d
-3baa443805c67207f3337ffe88e0a052eab7b73296e7011fbebc3984abf53382
-1f38a1483b88eed29606b25619acf5e21e6764dfac4559e8ab2e8b987c05cb3f
-23f7a9b18fc54c10e59b1dce3e3bee7299f9e98cb58df0fb48aa79c6b87476e4
-bcb73de1eb9603cef10b6ff191174e23741cfc9711ee68311a8e739dc52a1b69
-b6bd1afd81df4f6b1ae5df916faf6c6fa778f9330059fb88b5e97ba8b864e485
-b2747a1a7cf32e259ab7737530e55b2fe980ccc088c3f5e2815e960beaa9ecad
-530436a2c0b86f3c3aef098a8dd927ad13f9ff34b87a1a9f07f455b913cf1147
-270acc6db471e53dc3715cff25ac42d6786c3e9d90ea77873b301cab084b1472
-71c0cdd6e088bf710114ac00e1d6d215e5445605034b771390d0ff76d2f7dc34
-1a065f905f258d223b
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
diff --git a/lib/fonts/courb.pfa b/lib/fonts/courb.pfa
deleted file mode 100644
index 795ec5cea0..0000000000
--- a/lib/fonts/courb.pfa
+++ /dev/null
@@ -1,1966 +0,0 @@
-%!PS-AdobeFont-1.0: Courier-Bold 001.003
-%%CreationDate: Tue Sep 17 16:48:30 1991
-%%VMusage: 58156 77080
-%% Copyright International Business Machines,Corp. 1991
-%% IBM Courier is a Trademark of the IBM Corporation.
-11 dict begin
-/FontInfo 10 dict dup begin
-/version (001.003) readonly def
-/Notice (Copyright (c) IBM Corporation 1990,1991. IBM Courier is a Trademark of the IBM Corporation.) readonly def
-/Copyright (Copyright (c) IBM Corporation 1990,1991.) readonly def
-/FullName (Courier Bold) readonly def
-/FamilyName (Courier) readonly def
-/Weight (Bold) readonly def
-/ItalicAngle 0 def
-/isFixedPitch true def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /Courier-Bold def
-/Encoding StandardEncoding def
-/PaintType 0 def
-/FontType 1 def
-/FontMatrix [0.001 0 0 0.001 0 0] readonly def
-/UniqueID 263788 def
-/FontBBox{-48 -288 746 847}readonly def
-currentdict end
-currentfile eexec
-f0e992e2abe69f26883d6a2f691cc4ffeaadae4ed96950027b000a0e04f88bf3
-07a055997fc4400b46368da1c0f572a6e1e58371f4770d8e09ba6f39d5948f18
-de1038883553c352f8e6add2a9df060927fcda05454a5bce5badc6153a92a950
-b91e671de818c860c77eb6b93cabe55b175ae8265971df2c78d5dc3bb7a23a3b
-5eb80699e4f540d2aa0774262097e2f171f03b3f8143143f7f192c7c3ea4b3b0
-d0bfe6893744a6ef8f3fe2071efdd77eb2ed6a1f8365d33ea9a2e3baccbf0886
-890dbe8fd6ec2d9db9b8a11d6f0c2a5ee4b84b2ed02498706a8c6fda02e1ac8a
-e43fe22852111c257d9da8a8d69c9fa405341c435bb91cf627e7ced2e96614bc
-ff826d0ceae4942a5c8ca794b11bd2bd48dea7cea631afa4f7c52cc775c70f17
-4c36dd977c5cf62ef80ae874fe87bf798674a7b32d84da7c9557f87c4c8b7b6a
-a061b8d1f83190fb4df552d2742fd99986e3e33a9a4c578d90637f42d84cd9ff
-0e866d419216ac5de7308e8b98bf17ff95383454d45ccf07e90cb1a0ce3b51a9
-dd88c2e2b3dd662cc745bb5b4ec33418a1e4cf6c9a528e6c283c34b24da3eb52
-4431c4da3cb34a43339c606956778e666815be262bd069b1b5103abcb91f1524
-5bf33428d6cc1d3e146f0c711336b471bbfaaddb4e1951c8325801c2898c6dbe
-b5d96418513226315c9c8bcee2f3ebc1117d5e136d8119839aefb2c76d8c8a37
-cea1d23467717a8398f2437f1e61a2dde224f07e835e67950bab0542fa635ca9
-9c457e420ecfd17797a5ac7d63b003e4bf6851400b5a9431d9e4746525107c4e
-4529224ad6f666c7b4e8419a3630ffddc5eabfc0e3f1c089004b79b6ffc45d19
-7087ce92f5691dcaae4223416a9bb4836b5e4d3963dba28445d81ffa93d59c14
-96a8bebb0dd93230a8fe36bd1a4e31d3be4818c99815e7ae26023e5c68fbd21b
-334b178ad4989c333c37de8f821bfbbacabeaaf49a38e875a6fd13ea6fe45235
-c96be719db5725ec6e507e1a64daa56bafd017460730b9befe29bb27115968b7
-241f56bbe5e1c787f3ffb590da9c3965c184cc5f94aeff1ea7b0a013caab3bd1
-c4d41e2f61ab5e2eaf1e9c075ca3dc040f988ffcb815622c7e0c31ed670a9aff
-3833cc7707c2887f0de43a590344a70e014cc67dee79bedee7ae796448e61c74
-02f2f7e72f5db644c2fbc093f5ff5d6a787194de10423849768a48d56103bddc
-598699a43094dabd1934e8ddeb284b9651b9ed215c9e3b5a63ac766e29e7f0cd
-2a4f010df4b1114115ce819af6706107be602a21d002e1c45cfcdb568a1c617a
-68c25f2e3e0781192c7ed85f449b56caee4ba991e1376ab43c1c556708e65797
-ad13dadd61ebfcdc57dbb59771fb0c8f0b4b829b6b4a575f17da658fdc2a261b
-87fa8d8f39540f3b9a0cf46b59341ad320f37d71a8a9811f5f24b307ca32ff6d
-e80b35ac8262334afed2567d691d0ffd933b26b977ab624d2757ef20e9ecc3f6
-8b0bb17594fad3c27fadd8487b441fd520c8feae3b22646d71073bf43ce3597e
-6063e073db9ab0ab98128b97a84482edff091bc809452f0b2a37b26e5f9963f7
-118dd4f78d097efb864a5495f0104674564227145d923fbf39d1e85c78c8f92a
-e316bd6b70231733d39c10590c070d173c7a4d10e08e63303a77206dcf01746b
-1f78cdc44e06a26191024686d64436e519ad103349fa496e4159b3a436bde5e4
-20bcfde3d3cf24f50a1a625ee6274576104a3ec62c0abfbb14bf6dd280559160
-887cda1b88edb9dc2496813cc21e7e26fd42fb6770df364096d34cb66ccf8a40
-af4530facc5dfc5a672f5c893ee33e85a88113f2f19d1a40dfdbd2c1f7e132ed
-3a2607569db81e7558b536d131dbc71f55cfcecb31137b0d807cb90b2df7eea7
-6e7790d59d7ea4fddd66247058ace1d33f6d8cbdff99be2840fca3727307ef96
-3e19cf0f08e953c85c4141bfdd8b6f6d942389ca120969c69f35c10738f5bda9
-b872253532604e5058fecc5ac4b911b3602546ea3a3b5f84dde99316fff9c1d6
-08b59bad54015883cf8cfc01f9828b9ce335aa26dcb5c6f445770d0fde2df51b
-83a128c79d7a1351e6da950c256bf97c69f73e7161692c192778d3d361149c40
-9c27e97562b7e2ca2f0a498818571fc7eb9552542bf56c93862aa9e06839d169
-ad983d0a370b0655d45260568ebd3cc272c344a3d0697e05e27641fffbcb13e1
-aabdd1cf7f24a5d550700c9129b392746103afb0ab72e0f0305ee21eec6d54ca
-bb0e5d92b7493719bce7ec85b3f683ceccee4fcfffc7d127ee6e8f76e7ab578f
-80933ae97405f4e25b793eeac86057448882c70e3497d430f8e6af1246a38a42
-0231a4f8bc095b87ebdbf6b6e5f0e9e824595835e06224fd549b55dab5d72511
-a8829822fbe050dc7b9d952a1a8274eeec665a7cd924718bdc21747e43ae8cd0
-acccb305a78f6c201916d5db4efd23a890826b74b9402f141de37d254d7656e1
-093cdce592272ab46e2c9dee9c100e7fd1f3a558ab7eae233b167b447bfb56d4
-becc14a403850a481eb75b554adddc89e1e2d0c1a5ecca30f7c2183cebae411a
-28ddbe48777e38e16bb02e1f62d1f9a090427f47a5da5bf867c04ae679617439
-b4674e92d80f659734b10d62ac5fcf1d0aec16297c11ba085eeab1c4a7017cb3
-d9653f6e8f77056074e3933e65ffa2b08acfc8b90599ed85f5d91818b80bba55
-6c05cd944be5e6d76e00f6df048992c4b293b83fe275cf4231cf0648f26a0d28
-0593ccb41a92b97c24a39de7886ba7f53924743fb66baa4c01ee21a16c66561d
-4fd8cfd7a7e7f4386cb6d818277efb779b2b219adbebdae898083d26d561e797
-14553ff7b1df6523f5c50c8d7d4bde22a4c220f77d9c3416709dd5c4c6a2baef
-71c8a7f65eec53d15ce0112e745418467e49172fc5cb0d5df2c000b3da184ddc
-9a3b24e4e4c919717c9e348a1a5665d06ee268303c11ddc16078fa8424796663
-eaa26915db69cc77126df2d80dde5beeb879b9c23ff1acea4dd0584f45ddb29f
-bca6f48dcd420b2fa5e81dfb3be958c18bccfe7c6a61016614017745a0f10a03
-ad4f56e670ce0a98a227feb9fb28b1b952c4b86bafbd9210ab745828533741b8
-4efed05f94d0aab602b37d7e9ea944138c541463621ce3ddf0ff99ae36f8b9e0
-c14ee7820eee3a45b8d69e8f65fd2288e6f1b7eec5c2a45822ef46148db12390
-e87c7a2708cf346e04f0bf81cb5623a92d17405cd0430df9d3b7cab3eb6115b1
-d18a1e8f3b56f1b93322cb091f1ad75e1e12b36f052592e6a0def7f5dd9e18fd
-2f52ec209488ca7a954a04eaf4c6c50d2175657755512d43734ffd5a545cfbc6
-f9b1e740cc0d3a171f46d0bfa29a55287aef25886ff435f9921b714c0553f566
-fb8dcf761180c167b014b57ae4428ba4ca642c0a88226aaa4dd86f822e93f19d
-3ddfa9f26b2a1079d87cd7b3c571f989b92ea58fd6661200664b36fdfb4afa4b
-5169c09ff2182a2c973b8fd3db31d1eb306957cfc99b6ffc9c060cc2c77308ba
-7f09373339b2a28eca14f263f91be194705f9b23915e2f6d68ffebdeb9b2da73
-ce80d19411dca457ca50870929f48c8d72badaf27fd8d64cbe2c1ce900cdbc35
-cab95fef9628f6c87fdb6c45e61e3c6b5bc15fb2583dcbce919786278ce3b691
-c0934f10c953d259848784fb9f325ee140f1c421d6d8a63ca4096c9c1ea6a5f8
-0476a9c4505129fde53639673371e803e60e3d337de079b2377d0bc9677734b1
-1188a98bf1d009d0e82d8e3d8817d465d568011a7c59fd2ffaae8d93379d124e
-91b182018b5e50b8b7cb0cf1f914edc6b44b38419caf14bff525a4a5790e85d0
-0b7741cab4dc8711985ae161a253f878e51a453a8c4b0a6c84f533affdd0aac4
-3e6744f1e43904c009f4bf3d8a677d66659108b526ecdc0ad8a51d16de6f8001
-4efb474aaefc49626bf733937c1d25f17f3d30abd35e074527e26056b3b4e0d1
-d1787939b0c8e14edcb4061ea004993463249de82d73912bc435c4d792fae794
-7b99b3e1ab7e5e1018fbbf1003b9fa965d43593fd0aa1b568b593d9dae2f6acc
-4a8b8d6d8b6b5d5fd2aecc392c7cb83588d250050dbed3b32df79de71ec1984c
-e841adc77597be223a79a37ec8f5ac91b45f40943932bf30b77a82a2c62d874a
-da8b86f910f1269ad594d5ff033724d3101098630d3728baf72fc281d13cde34
-fbdb8087c23d86fd0cce3ac530c5ebc086062ec32adc8fc2e5ed66f38d3b5a07
-d1f41fe240b3065bbd5f848d6c97f8b2ae149d07502166425d9285f9b9929100
-cc3b8c824c5ae124157f21d63c17d75990740c8e083540c0fdf55ab6a6128123
-894e6846d8f7098bc76ca1f696ecb31cfe5496ce20ee4859dac102bee4e9285b
-2ee0d97409fe5fd5f7dab76118d8394d3c4e91fbc3a0bbbbf314d91671ea9206
-598129e121977b36e97a9e7cc3949bd6aa7e92e58ffdbecc7bfa8712277d2b8f
-8e0f6e402e5e05b70db4d4d18b82a92dab7e712749b5632e62aaf26988f4ec20
-9755e47826073aa09c410741a8cae9ac19f0695f61db9552db60bd1d8dac78a5
-4a649f77461f7546fd35e33ae5c918d65418aca54cffedab20a86545a7d7970e
-1ab75c12d09714a37fd516613f1e9ad1887aa3566000bf8a7c9751ae22ec3be5
-5f7e8c58229da2944051ad23625ec7b1c26e65d30de52ab5fee7a5d3184cdf0d
-4acb0dd78ad3f79e2d6eecf19d8d45a18848611913336d25267ead7b1fae93a0
-c123c0dbc44f0178a8a1c31b8ca54827b34925b7b1432a029380e9571442a77a
-aed4dd342f6bd1f1b773a4f1ad1c0d4c955a1faa001e2ffdeeadc86282e09c8a
-ac6b9d886ffc443ed05966952482a7ef206e891c90b9dff910884ffee5c78de4
-ca40f6ce31bf465859c27c7b942246c43ca286dffcbb08ce12842f32175bfcb9
-21d324e0746ede76064849874534bdee62e99b2812d07314e76ea833e491b01b
-7dc009f842e10b4876bae3f132f8ae3ac04304dbfdcb2785557e7b48c45d940a
-45db8cdb374097a8c745ec7951e6e12ff3c51f0e0c8e7a82d3f77e90baa09658
-311167e0a688701bd62c3a598772e12c107deab4fc6ae3ce2b81659593e63734
-2bce989299c0cf8b815ec475e6b281e5d93725ab50f2881cd14588ba1cf800c1
-4656537f35711c98bd0d0fffd6fb6a1dbb5b8e3f3047d0ec60b902a64589594c
-904f9e4ba36837f774951fafd3b9c99b0a7e643350fa50fe0d69723493507b57
-6dfb9c9befd7dad68d2a094abb1a7c19d8b89d6b5290af2f774dec10699beb25
-9fa0bfa8d76cffe9ccdd9a56e20dbd043bebcd61b4f8d795d6f273705ef0f664
-02ca640413e2b97f721d16ffcf103a49ca746d4f166b3a241a9d35edeff5fbb0
-19af2ea1e4ac319ed01a39ebfb2623dc69470d2c7bc38e876daecda4888ae494
-28e94d9377c2634402dc988423358bc949db18d55388126c982b5965a9ad5648
-c12f46f6e5e6518e323d685011fbb99c0456c4566ba542929d767c7bd154454d
-75ddfa96c0e5a79c6bad3d0020556bda8b74e6199f327b0e17e5c3706c2adf05
-2007f91040a0f256b4d9748754638ff019afc766b12d937551b1814f28de13b9
-78344ae18668bd5f2792f7f12617043e40603d7474677f0b05967cc58a0ce610
-4c7e806f0646e6a631595384aba225d071848b176eba2a4232a2af75faef21b8
-cde74831d96c4682bc4c285ec5d4e1433b2750de64a9f42d0ee379908bccf699
-6baff1d5e115eb31e88aa4f123f4a9ab2ec71f3458001e53549a5bd512f27d50
-2f75d33db2732674738e98fd5562107aa071edf740e6fe4c3581f7f1a6bdea71
-11878ee1514d2a764770bca4a1db912ff98d26b7540915b03811844bb606fe66
-3d5de9f1b8ac6a46cb328b66151d5a7aafc5dbbef4931a94409ca6fa9b26c970
-f275431fbb91a35622d948fd939e56efb989f007b0d68b012a045ff725cde14f
-9acc5df8b491f21ea3fc8b2b435eaee1ad74572cf52f1e913d44f4aef6df048c
-00375d6734d0e829c0fed80358866c1988e3c09c7ef36f5ecfc0ed411e0b746f
-6b04d7cb5f7134921969a2751074a3e33e9a7e2e68f501e66b71d3f68f7d736f
-7c4cf241a6494045d87f7011a4a67279ac40d5ebd644e9fc56a97d5cdb31dc2f
-f047589909a0a4517d6057e668f3594fef45bcdf30c854eaba5c1baad26e647a
-097b4a0ab8538459ac97d822dda5827d96f29387b40f4b673bf3dff58b6845cd
-3fa300b8cf4acd3e6301f5a47f1370c8bfb8bc8b3a961204e2fd696fda87c16e
-30ac81f9d77634c5e8b19eeeaf9ecf43637aca16051acc7b63cf5b4fc157554d
-e510d2a8f1c65369ce48c3233c445a0e4a81df26d68a2dcbdeee609e81affc6d
-632d584b2d1e5939fb0eb3c6a7880ca593e99bb4d530445bf552e9f7fb0bb25b
-b13a151832acb776c7768ee9bfb2d320c90d746df806bd755cf8604b2b0b8786
-052c5e8d2cb2f96c7876dff63f5ed31634ced7a1098d754895ac6f7e8f5f6a01
-494770c3a22cda0fad4411cd76fbc92b0c76335a9bb5b3818259e62383f6a1e8
-df4b1ce43717a343df9f91a5d2df077af4fade7cb9af6608804c08808ee2ac9e
-dc25407c6e3ca02462b5d16e705f90b8fc64b7d8679f7d0de875b72f7c9c6a3d
-b45e96e0ee3ee6f8cbf4c85f09746745ecbcf39ac3b7d6e52f3c5e79af0962f9
-91935435880d10ff0f00dcd7cf994af8c776700df9a07b6161f44d9d803300c0
-8fc227bad040c6658beb8bc4a51bb0adf41beb908d39a7d60137a43de5f1d97e
-fa530897e71be24647b015cd2c76c0b0d1bd0f941499fe00ea4e09dd82910861
-e671f2f0c56f5d4a7f6f19999b4ed50426ce7085ff5ec9716f7393d604fb7387
-fe09bb5346a8cf2d054a7fd817e075e61961cdfcc9ff71d4651822ddc1fd05d0
-7d8a9d8d76da5391bd75ac047af65a351681baa87c9a6de0f1027cdf5266e68f
-48a290aa2197ba3c66c575082319700a8527fe308c78cbb4d1e3a2543f9796dc
-7105763fe7e57106179e22bf52aa25d472d6bffb0b906d24e788685b93211546
-0b97acf5adade19cd7cb6d9a5e7fe5012a3fa15e6e1b85648da877c1e3eadc9b
-630d2b92f60189c1fc93a8d49b13c1b97714052b1976599f98dd697b9dd91a0a
-06510ff600658fa9979cd633296db2a67a5d2d9c42fc530689167b7dce26ced0
-4d8a509f04a9cf65eba06ceac4c5e3644ca3280038626245666a2e0c19532c8c
-720afd6d43b436a7ba1181ea34b3ac852481809ecebb4ded573b688e896ba021
-8a08eedf873e331fb7d57c2fb132c53f1fe70356eb0e8bc41368f966b3cb9272
-fb1f8e44c76f0b12c3bc79d848fbf93e55cd36eed1c09e800b2b8f53ab92d8d5
-2c6ef3fcdb64195f74eb7b8e7f2052affc111c48818d1e69fbbf38aad47e59e5
-45dbecd57c7c9a42007888fddd7dc740742d3ce06aa6370d8427a3924731ceb0
-6330390afe0853ab4646e48ccb5d49286ded1b38188a881c8af0808db19d39a4
-b3525226b5cdf3aa901217bef8a5392651e4fb4e8c1ef6dcb8faa406d7ba1d77
-4d13f87ff0c0064ff0fe0e3dcca2e79c124ec86ec13762b49208fc35bc0ffb92
-9b8a38465533f260166c6f488eddfa0be4b6d15b8b1b59acb4e8827655eccb02
-559e8b90b384d0f0115f7f44c7a6247f246500aad2fe475a6aba511a10d70650
-7e8035d4f83e33adac6e14fe40ecec89b632c06996f1d68e7a1655d69ac4f6fc
-227aa5966547791a16d4416d785836b5a3724146a34324ec12a09cfd7519c05f
-d395699da7086d56e701539e0363d71fd9b279027252c8ccfa7a3d25a41a9644
-7d4d92b7fad210143afb526389342e18b790671676367c6cb41c3417d75522f7
-2187d83b605bb6db3a695d6cca090cd353e23d0512c06e8810f0fbda1b19ea83
-ebbc1ffc7f90fdfd8ef644874a7468f121564c9b259ebc94ad0b69c83cca6e20
-11f4a698aa690893a2116e502e847f9b9990b5a4d3f533bfe5ee1b5436b2f692
-f6b5f6b779b4e59697ccd5c04e8c0464009c48bd105482773f873902bed5ca6c
-b13a0d90c4ddb6ccc416b349ce7e2c8f91dc5219011ea6df871029ff22c7d10a
-fc890880b9f13669c7a6a60da0f66e5474cc30ff1e12ab765aaed416318a8405
-15ac5c30d883903bc5c04fd20ed977e22482591a46c63ff11ccf18756c080377
-b4f72c4fd3b127700dfe7353adb29431a50ba9d0ccf764a450a9a57668095392
-d9f924832309bf16b8d17c0fe2e147b9afd086c605ed6998f9873b9136575722
-ea03bfe76571ddfe0c86a1b5ee8b3c0712a81b397b5e0e6068810b0ee52bc0cf
-1ff6df62eafaca67e1f553316a7bcfeae787ac7bea86056fad39696b222e887c
-b1aee0acb9e4093068661a6564292808535ca4c7b9271165c73eb89757db9438
-47e609ef5766f00c21cc5696a5872cf39ae59e79ae9b0854dd3b6ea7763f59ab
-b4443fd1998d1c784d815b4c067c844d942f935123a0ccb76532f18572405458
-6eb065f20ca9f301fb04a0f05bbfdb167ed497dd191a06fd43c060fee5be2ffb
-b804236bfcb6c81abfb5ddd864a61dca262b97c5db8332d049287c39e0fc8532
-91bd8e2731532d461bd22f4fe65603efbbd39715f38fd06fce91a0014e80e7dd
-f80fb0f27dc96c6df12881a7c4f1c47b2c7b2cb7224960c44dc616fd8322efdf
-1905121f598b6e0aef30353763662ea6687ba0414cdb45384a729d1e903c51cc
-da599e566012592aa78c55e45808cbd9952c8c3b2f21d098370af67c2270f32e
-1dfbea8d7fc0b88a491b4a0101ce1d74a10e27c2eebe19f361b2fa384fe946b7
-c9720e9ed02b59cbe30062e902fbd01930e66400d69c274ca8ea0ff6f7580cb4
-54d3c3206477f7b0dc20cb80055d470383d137d226be0f9a15374e0a0112b04e
-f25db5ca9ee78fdf7fa7a8b3867f599a61e010d6ed3ec8b13e1439d3a231a099
-2179d4deaa4eefdbe467dd077fa49fc330f9e06a6aee7d102a3b55890e0aaad7
-e2276183ac7cd1259350ac2277e89bf452858d9418ed01a22919c9012daddc3f
-ce9bd052032c7fd79148000277ec903093c227e52f19b959a99c7edf0689f4a1
-9d004980edd98997da23cc1ed63c1cc0f1e46340d3cfac421df31a95f032f297
-0c397915c5dbb92a8596896d1d114a0964926be4dc940e857c5a53cf8fdec3da
-e2958089db083fcfcd3eb090282a7c978f3f58e93544c9173382031797bc2a44
-b5aa61adec96086af8ba5fca90dffc8d0f4d5a8a22013b2ea06675eed2641fc6
-03400edba05abcbf6a8afbd3c6319f23bde069c6721e7679610367ce47d40ff6
-9c018e23a85e2971e7136280bf42064fc33502e6c7375e328c32f03f05e1e3a7
-d35816e5862966a1efeae1eeac4a4c1a24cd89467bea5e9670da181fe333f795
-b6176f94702a496f8c4da01916dd5859f41fdca457ca50870929f49341d06392
-715d71e508f55416a59ebe5ba3c093fdadba2ac413b6238314e8eed5c7b353b8
-b09492a35309b3da82a8af47a2378c2e4ae452b5ba4d706ac27ca5107f98d4e9
-64300bcab484fdc8c9c967aedd2f351b54ae0ba150334ef42fe7d57eafbf1074
-cdafea5358e2239cfbe0abf635778065e433b9f1c17357e67f692f5e98641723
-24aa6a462c0334f2ef7bb30fef10929224ae0578fc49d68f7f48c91655371e99
-751c18e5f4c375a734404e533dff279c9a2692956957b07d11a72ce6c7ca64dc
-8c90eca4cd037dbad39a5e6393ed0ff2855711dc7bd1f33f122eaac8fb2cd4af
-ab6a00132c1300f152554b81a5e33e864f7baf93c2ae5d9feb5e2bca4f4b48f8
-c813c42accb8a9b1eea5a14f5f9795257d70d0910cb738a9d8d47146cdb5c837
-a74c0402493a3b3a849306cd997659088c8efeb0050758e1c2d8742f34350304
-8f80ca8cc9a9aedf8008579dd936b29e3f8495b61f0e416f7111124e95e9b0b4
-9c69063f46a9ef1f2ae58c57392ef498b1e0b9980f274d5d4504b47f03261e57
-2ce746715dd521d6d2d9ba1b570ec8de309778955e06f065a3d82ca42d0b8ccd
-5e635b1165478acb9ba24f02e429731c315ef0a2cdaf185a142654aa9dcb56c5
-c82e44a81a57ba271000597a99f7111e25f7a4247d40287bb78478b07f2c220b
-a4c43a1f1a87cefdd179447e9ea9cfa41aff4ad8d03eccda89819f0039637e64
-2a8f3de1b7182f4237c27429114ce1dd195f546b57ac964d59cb821b2261552b
-c8498cdc5a76879dc4de1dfaf3dc15505c0d3b4cda3ccfdc1049a9a5c48fbcd8
-8b74208e6c99826053abf4c2b0973277ddfe6505bb9f77e8a84957e144516600
-73a0e3fcad8c597bde3faa249d2511f545c051ce6461e3c01411ce7945ea829f
-d7f4ffd30ccdf757e7039df7deee4ef47a38b6f6f9f7af190b038e464ad3863d
-20c2a06954a7f29a61cb9b7daa437bf06f8b6a34426e85c94c93b037098b9aec
-5ffa37fbc51d19ecca38b26adce6704cffe57973a0090951da23385cbfcfee4e
-4c1f040273247c1f9ef76d20381ef92c9f7bfe723e90e176a34990c19df2ba53
-b2d0a21f64d48d0f2198444c945084f568a04155292361de380eb864f8e5e452
-b37db08686546417a3b87dfd34686c1dba5aeb055d5841c30b1c8c1a182eccdb
-876ec9c6a49e02e7b249d3da4061fb63a0342729a26838be79d6939fd0460f37
-fbf36c6a6a76c6a99478551b095c34df7d754a414ed5f0dd28a99519226be1b0
-da01e883e0d5b34e0f2a1a0d23ecac458f135173b7ab3f3c1d9441f8dcfb2c8a
-bffbe97cca66b4a1a3924333ab8c79151393a21fa0a215577b808f76b31f5065
-43af482160fa036f80f8ac65fe25d9cd2963ca14ab51718caf8ae7d636fb442e
-2e414ac7193fd67e408e86a034036f4a7d1a61557c11ecb9466a403e5b744427
-cf75d3be6081ad827b6db779da50626390603ca0f3adc54afac1febbdb78d6db
-776a4fc4bf7e1d0edc29b39fd107dc5974d03fb34a84403ce3b2f603fd30703f
-4d0e6c4fe5607dc36c530c88f6424c5ad080ed6b949e968be2b3d3cd9e719e62
-cce1dd547d54e39521e1028ee429689ea3bbab05e117fecdcb93ad8dcd04eddf
-f5de8dbecdfbbba43a6f66cdbf3c81f572bb1d4568311224685e691cf31d5961
-768dd919a400b000e74bbefddbc6c9b83ea18c82839f55a3bd3d8b6b900460cb
-b62526b4980837609d173a5870465d334de87bd11eedbc2f400c687e2003d74e
-605733410e790c0fb5a28c57325916a11f92ee2b9c4124001af738fcb6e6c588
-d75fd336e5b30da46d805767468fcec686284c953049f3d83dfc986fab43eb93
-bccb55c9c0304300f81602a9b9d8c2233baf519c7d72d11a55a2b7260f763437
-cdccdea198ca7cecfd9b5eb79da4772e711c74138a778d6a120fc530fa5ad085
-387a944223ad6cf9a621052e33fa3b64f60871dab95423565d806a64c00b6ed7
-375ef1aeaa10ba8f0843020e3fccdd5a830d79039544981d55b59fc6f2a799ee
-124640d4195d9db251984dcd0a0343c52f78904b9c688d2dad4260e7d4967517
-194c29b9313ee2c54939c329da64d5920d26a0c9718de120e577d92af78b8a71
-32180c1acb34d07b0846a34fd494078c06f3911a0bb4348825c3b5a0ea559449
-7ca555e36caea15dd36f778d8bace7f154f8a73535a845a9b3c97ab136eb96fc
-276bcb17ee7f191e8441dc025b272c59d4f454278a75f64925e441e40ff9435d
-a012b8f2a7686f6128346a5dda941dc2c5b7e8792ea8379aa91c38babc76bab7
-397661c8bc3162de6290736ba23fce40cb1c3827d0c65b19a9a23ce1b5b9cdfa
-60a7f0742a4ed69ee7e8d2dc8857cea1af870f7998e6fabedd3cf197130cad2e
-7c6d6bd75c1d24aede7d6e0160c67e138770e8ad4ee8822a8782cdf9e5e45424
-7ba28985a01dce99818c05f187e431d62e107b61543a83ee1f040d6e46b36a5f
-223a0a35418c9d328c5ce67bfdde69edc88c13995d52c93483abea8c80e083d5
-a384b35c8d2f87deef4048290b34bf3dec299d16f37e1baf0b620a72acaa04d5
-fe4731f88411c7bb53c4768f85ddfdfed7e7696ab17922606163852d79e8bcea
-e6c9d902108c24b4d83b5f325eef14c818bab38587b75532b9d38edee82204e8
-20f956e4f87cc7d033d68cb0017a79638e2360c4ff07a81706109beca9258c7c
-a60d52f07d102fdaf3cffb1ad14b999234d302fbbe7d3af784bd5fd9d1dacf05
-5b192654b7febf7f71d88277b3990af63a98520f27f65758bd9b2e5c1fb4f940
-b87ad3da4c96f4e1d38e5a7ace307c73e82d7b17c878fc55c33a3699fad5f841
-f9e9d17d92a4216543db45e9f92ac8f36cf01f220e295e1dae16cb50986ab0df
-cf7c6785742bc5e04086de192efe19fbb871932c8d992b763b226bf4f054ea42
-8ed3f6a580bb12a1a93e367a505ebad742ed63d4a9ef7c4da3a8f6eb55eb8cbe
-dd59afaad1e24a8b87c17f3a9c245dc4a30dfd8b0eb424d94266d61e2f47addc
-0a52fa4db7bdb7431e5f80604e95e4091aacc7bcea215e75a7eea59642ac0495
-6c08128c27c59089db3fd75f1fc8043d9636f4c0e3a29e2aa5f726d37876e6e9
-de7e578926359f3cb67ebc2e678267799cfd41f29de2cacca067715e79415fb5
-a5c06eaec36e4cd8d5c818312ffac88ccccad7fe46dafc3270ffcdd78c52f205
-04368ac9f622c1cb7ba8fc968378cf54cb42ebc9330062a9e9dcc466b674a9f7
-c455f575c1840535782c9f4106a47d5695a13f6fce147dae42e1b05784d0b66a
-a0c3a36afb3b58469be79bf5887c606490c7f9bc66aa9eb06aae67bc3f6b2c6e
-b1abafb3e128ddbd0985505adf6fdb4f85c84c6a2177e9871488885682125b3f
-d7ec6d50dc6886a867e87122502d7a5ec8101d81150b7a7c7836ebedde05b5e3
-a2b6afec021c3edbe2911bc8ec445638bae593b0443e3407e3218d59eb85a34a
-aa02d5b860324f28b7e8461cbb576fa71515af67c0f061ea0426f9b055f87066
-cfc94c2594cc55caf2be5dde04c6f36cf3261a6f9ab826134c9c56e6c9f76a9a
-c88734a060a0ea4463ac6ceb6a1c782dcc199be95860539cbb7b2ce5fc5503d7
-51f0a495337b94fc7118f7101b837651776ec0d40f1c61b57d7e7e16a0e410cf
-da4b0dff5728fee5922640e5faeed1e0d6b1e8b87c87e72feb3bd2a7ab8beef2
-c6ede873609fac5274bc1620fef65c7a9b52f8ed233fcea62d37f606d79699d5
-81bd29d2401feb3a9c32a34f15d0ff1ab299abeb05fd27cd6d26d8dbfd91fe3d
-dc8dfb290df7a58b72dacb7c24b4067dca4197f298c43ee8f9cea520c2055cd6
-0bcc95e3feabe7e6aa0abbd41dbf4a26c69bfd5c7926c5d4ce1e3c30b3165514
-5258db44055b68401326873a05ab30f645417706cc3fa6522098cf253a851e93
-92574758249035e3ec5e7b3a03f81532d871cbdf738e66261f51b094c5e3e8f9
-480f68e8f26f68348ab9afbd19a49653cce7ffffe8911ad8eb2761696a0c4eab
-39e268e261003e4cd0cb15fb36375ff4b2c39bd45710ed4396c1d89563ef8b6a
-4e86a73b8d36465b37cd5a50af5f8cf613e7c5fb9db895c6c9827a6e2b1e681f
-461dd52b5719b4d048dc63e47fa3aca8c8441376318be1358250f676bb9c4f8a
-982d971649a6e687c43b3861050bf5d846c24ce2fdda4917077b1cc4109bd764
-c650199f51dbd309877c268e750230d507e1140caeb2cdfbe1a03ee1d0f4906a
-645c9a378691eadadf8b1f291e32448f930e74133183379208b442988ae5da75
-22cfd3cc728a5dfa50dc4a708f25cb851fc94f5d82ebb37b08ea28b43a882d85
-b4d454ed11ab74d0ed50536577807e736fc6cb07a890537ca45e15b3beaf1c98
-07941b3a172e85c4fd7dc90195200036d413cd408eaaa640659e9826d9ba553e
-215ecaf8680b04cefe02fb8c0642c028f530815b2d2e4dfbc600852a7412b963
-bcfa31432a96e066ed29ff731b75dbbc801442f521ea3f4306cfe0333b4efb06
-840a81f213bc075b113050e6ecf2c18163f3329898e167e36729340f0cf89d20
-b34019ad3e8183ea5f666cb5387ec8ca8a6ad62b93f3554fd43b6b1a21dac8c1
-75299570f4aeb3c51b6bc7cc3cb80d0d2789e99625a37396aeef59bb3c661761
-47e02c3fb22c4199da98552807fc8ab9457ce81ff4ea010a36b0e319f1e98bbe
-a63056668a65b1822cb57a82551b1ab33fce67bc20cbd56e559bce3c2bdbdde3
-ef5d1f232eca045018b639b7378fa773c7486db53e1947bbd02f827a7e19883c
-078778e5bc7697a9e474804eb33c2af722dcaed37cd14e8ce92d093b83335eb1
-a25a6d99c7e286941d682ab64f098e93a252f959ba4e9c3ae26dfe3ff8a1a3e9
-b78e85efab7f67e5eb32d1f517d62d35563092598b0748b26c9567801223e93f
-adad3cc790b8029939db16ced7889de68a1767f700be22433b7494a079d6c85d
-b3816641d6ff42b5a99e575161254ce929120b78f489a76ca4f3b2f1ff4eae62
-16c08518955fe8e4e8efa4cf3dcbdbf512fc6be7329bc046d61acbc6b19540b2
-52ad79177053337ec4fc094c977cfc6eb036b5059e14b7f92782299a40c88209
-f7021f3d155b2fc306e7edcc98f9e93a6593caf8b4e5561af4088ac9c2ece955
-1b15f8b538d7f41731dc09acc707f08bd8a59d92d7d7eaf5764bdb7c5e85547a
-32743157dfeeaf3f7df8192a0da2cef45e1ff911d66cbfe005170cfb933d8bb5
-85d93708c87e51efb522944e2df9fcfac13ec7079e1af32d03e233af8ea6604d
-4d906af71dfd8abee459fdeef767a385b15d0e677b5034c1bc91f047b46f300b
-db6092c34dbff505b0897ca086377772ecb27b9ac70019cac5333d10b67b5b71
-482f241a91fda05af2a4abdb351c42672b580a25f01b79b8fede4c01051eb115
-c64485e3ba4fd9478f9172d6cd73198c318c9db59f71ad709b9d567b4e31e2c2
-8d0b93a1d24c82b50f01a070a952a079e1e7f9c2eb4bac979388d99a25577f93
-57d9179078aa0d2f7a8a65d58b8741244e3684285dda86cf3808e68b48accaa9
-5b3a91fa39542cd3c80bc5fb5d636ca5ecf506fe1e4e645705bdb10f9fc67a56
-7597dc5c9a1adc7b47c404c06ef16daa37d8fe6c952e06d056dd15008ad2e796
-15858275270c5804432e91c7adb467102e1e7ed962f04f3f6d39c6fbfcd93f21
-d11016f5e65e9945c1442ac63b535196d65cd3990d94128f3701fc32d1079668
-12749bfd5c15d965c3174221882914a1fab5495b5fd0d7a7fe3b11935c3aa6fc
-470ab52a32c9a9fd1ddbe800b60f3f24d9d9147fa86d0a0925d7140b5a04a493
-f3ad02d6c352a1f6ebf7ae326f6ee88d7701ee907c88728150e0a2c214b13f12
-e7d5d83efd62cfaabe68f02fc23332703c02daf224cab53c624dba61b5ebf164
-0205dec482b3a52443d207a11d4b4ecbef3dbcf17d48759e7e1d69108b4cd456
-d263d15d719f5230cdcabe96dc49df253b44aa047fcef75ddf931cbd6f3a2a52
-c23eeef852c1729e23e3bee93b0a5085913f64b7c3dc650432ef005301062a5c
-90c400852a7412b963bcd035e6942cc8ebba9a1e3d3353b26769ada213428979
-78a9f549a86210d53598cc1da57b8a7490ed6b8368cfff93578f979d16c8819c
-80dd050fc4aa8ccb4f7b2681245451d0d13403841da091442013a6c5609c7d68
-da409a41e4d90f36d0acd74368bdaa75e618883eac528cd6cafd20754cea601b
-33b0a58b33669ef561745830793f5a06e72c0c8718d24de9f64af17c50beb1f8
-cde6ed0ddc136eac0fa98d9f0ab9bab94d18d86a7907c2bbc50d69d07e3fa905
-68145b3c0acf303db053c8a0cf1d7619a215f6753f804c6739ca8c1017f553f6
-48d857f926d74d15812215b7fd87333b8f00e65c81fdbc856f1323a342bd0507
-be91b5c365d7f895e9c374a9b8e0d1413220403e4b5bcbfe5a5977640249a233
-fea8f1d22ac9f6e506801c4a68e9f8108af7ec2aec0ebefda8d1ea7851c0b226
-b3b8a76d93736c746a351ac265d9de903de0028a2013af8aafeafbaa8c2d1d54
-523925d4d606b13bd04f0e41fbeffae0f00d89c83366a1ee1e5bc0c18ddd134a
-ad7c32a0a25b921b33d91846fe945d785888091c558e3cbdeb761922386ca63a
-3ad37a2fae3f575e40d1223b416c798bc3732c6dff964b29a02714911858f156
-9c87d427f5087455da19f24eb75712692f3693f1d2ea5b3f40e9f9eeb0f0f8a3
-d00a0959ca4e3bfe8c4804a429ddee8d842c8de8312610e2cca9cd33c51a5145
-e7f8c8b97df06a0a023a43db46268c5bb2247df3993dd4536837eabd9c0d381d
-da84bc4ee58e730442cbd7966e070d8be71a0b24b871027bb3d586d8cc2d6fdc
-917ffb3e85d5f32acebd3093e53c83bfe41242307d774cb3ebad79ceacefd887
-57a0ed1ec8adf7cf1952411601ed59f4c4be8ddec78dd26a10c083f6f04fd83c
-705ed42a0891a5398169c528f7911cfc467cc6df8bd5c835494aa1a7c5bcb836
-40e6c78e60c19dfce997ed6e0dfc88fc01b0349e0455d4f22c06c16f7b9ed61d
-9ab3d5a4f6e2fa2ef4628431cedf579db02dcc30a54d6c10392ee4480af0998a
-b823cd0f9484c3579e90dc412967faecfa026bf654602f3bf6b7a6ec54350be1
-c836493fc0ded9384aa53b770cc0f008329765ab5bbb896c3bc12d21f37733e8
-7c7258778a68ae72133f40defc3a817a72c8cdfb2c2614bb84fdd568d51066b5
-5d9b4dfaeab9dc73b2d489cc1cd29461be050cc6e72b15bc7fdabae2b7792d34
-427ac97a386e31161bed431328c0ff34725192b95bf911814a98e09faa5620a4
-0af40530e9aa937d32facab765ab6efbded9066b7c6a031db5b0f34826719622
-ce9203e7396fea2e7d5cb567236ba11607ec8579e01d0741a5dafc86a49a3ff2
-c1898d961bedbabc3bfec4a4dc1ff565ab27805c0f27dbd4db1184ac8d13a66a
-03f3477e9303aabbe2e8f009506fa8e03e14c9cddac07b991db50356f7fb7a09
-86fa0dba919eecb006dbf46b9770c52bf38c992c1cfdf487bee675464fb41020
-70cbcd98348f290bc9f8064271899314f5d53cef33351b85a9b2782d891f4fe4
-f0dae67dd58fd46c7d2e3451ef0e7ff93c38e92685ef30660a8140aed73a239f
-1adb9547e33369457d849e1417363508961ff097241ceeb0bea7a1b8e350f680
-f5194175b51793efe0ae38a9b930473ec836c99e8c9fc220700f0f6577b77fc4
-5d69bcf32455d506629cf1b15af57f244eef2bb5b824957ced172fd621618fe4
-394a3b3f1a72836c4dceabae9190c3de48bcc34945bf21c468308590e4912896
-4f331cf48a1764a4f828cdb11fd36fbd2cf546afd8cb3ecedd7c0b9ea5bb0d82
-8bf269ecc868a9dbae49cd5173b30d568ded26e6c229b09868ccca377bb5878a
-390e48cb3d4d596e167fb5af544d01a429280fbce6caeed0df852406611e3f67
-b1e07a92c58e9887f39aa3b65df90f27a2f9ad203ef4923009a69cca234dd41a
-abaf30cca6b13d77e38626a228b59dee4c20279ddd3fb7e47f3630c69ce918eb
-0af51da83358654b2b28c0bef8ddd7a22261f873010e35adb40f63bd5f6febd3
-50e44cea34928aab9cbae1e6ef35e713eef769ea2e06f1005235b567cff130d0
-8b6dc201eb476bad95426e3c9a7df4a803ae01b5ba4a764dac131bd273f17e48
-c1b0bb228d5c9ad4c39262c4ff6d98547fecafdae4ec0cfb0c04dfe7982490ee
-82ebe0e712cac8b2ad4161c88602e87c68c7254fc019cbd98d1deeb991962910
-d44a6e8d11c2afdf94f140f4a94958b0189dec2fb7dfd7ce510210cd76a88254
-b832de6879983ebbdad0220c8c4d5f7c37a55a125ee681abae550575100e3cff
-f5ffb4e64a8d0b2e7bcd2d6d016c598c6baed2951e4e5110be8b5f4c95ec5583
-44cdbfe4d78f21b0bbf5562a9325fc8c75dda43d30c33c3902821b9a6041483d
-3f4346ab4b036e583674418db32c71d2a511103c105490b6fa774b61b7e03216
-a466960ac2db48d0826034e4eb74f2a95e735d9a2a048e4eb159e7d6702c28dd
-3a1d5a390e4d69e0da121673719173ffb31fbca5b59b86f9d65edaacd36d5e30
-bf872cb7977a3894802498d20d656d9d9ba7c997450b2a3f0ea6017ffb5c2a9e
-dd4a6a415c6c6bea9497313478da8630a9417a3a77ef6d1df9aa2ca014eaef96
-8ee377fc0b90c42a64486c4145044c72082e76fd9620d2335c27f87e169f7f9f
-b4962e06d98165ab1017436ccc68830ef42c904ff8d738ee2793526d476dcf19
-b51db620fafb84cc7b2188a293f0f7669f48e1d6ae0d12997432f67580c4e36e
-5ebd336638c50ec777965083dd485be6f550f9392441e53a78068e7057a8495f
-25406380eec1548fdbcc215d2417ed3a1a2db029f9ced3c0497c042921c72b8c
-566fb204a2f3adc54a88957260553c33301bdcec98b8797e1ed36d21a22686de
-2bde225886c16ec5d132ac0e543093e66568332aef3bb15f85cd442a8245bab7
-681458364ebeac7758c2c4b1e0f6c9e10e5c1149cbe99651944c29f042483440
-af0f3c88e181722940dc1a8a772d99f2dc495c97367126b14053de51a03a7907
-a725b1dec299588f81bb1992ebd9db972aac396c47fd229fac4becd1707ddf8e
-8733e447b03c1a671dc33557daef6c83be6fab0cccdc1eea095e9996131eae50
-cc9831922dec49ceac282b5e1c0542a01a71bfc28e91bbfbb3198d33901162d0
-4285a62e07f82b95d0e0db1cd8bd664f1a6603687705936a87269ed00616b505
-dfaa558c8be45f0425469904d42239b24d4ecba5efe9b29998a30ffa6722fa47
-5c5c63027d3349ff581f3cd71c9e948b419489485639c46ee6a62eecd082d89d
-639ca2a26d58fb3789e2dc853c4b6adaee2a45eda123a1620204ea143d2926e7
-049dfe2de7e1b4d14dcd6ad90dcf1fe26413ecda2008dea0d7b7409b5aab672c
-40c71aaf8536602406bbdf5ba17970341c90e60db0f8239f5190f0a46ba0993f
-f0ba8eaf9c45f1ceda81d521fd353072b694334473fcf3982b147d22911a76a1
-162fee53f301906e20938bf6f38e0886b9d340fd23497c52edd2b9319e9b40ce
-1e87a94353d01be656952db686e4fd9d22c0583d7c6569e46445c01d06ea3cc2
-6a564f0abaad453d006cf3e868e2bb4e23aa6a93542b0c4e06d839bccbb64470
-e689f85aae9034fe57c583a30090535a89c22fa8336ce9cae3855b6f3c80f1ca
-67db3c3d9193747dd24fe745496c12d951180e7a24bec0cf5a5ffba06b925895
-e2463e2046eafa6986b7299507002ce55df328059434a08817f76e1c0c6fe864
-c5d39048e042b01e35a86b322ccb2656474f2a0afbc1aae14543e72548dc927b
-d1fb32f689da15497868e14ab927ee6efbf2c1c16bfcf698b77b190b57ad5f48
-8734baad1e836f0348458139a4fffc8f9334552de099ee80c11e84697389c795
-93177a0e179949738c19d83b36986a769ce821736a3f2f69ec82b7e19c2f25db
-aa99e888592bd478b2cda54403af0786702badd1cb8e7af2cf44d98d142fa824
-9364b1e82c0bdfe255739c7aa1486de001ff336bd84d58d845dc77e573092b54
-9b2eb4d4309d113be1cc36c3e3a1a8fe6ba813e147c0ff6be1358865383a3b4e
-e242bdcdd2c4916d1eb595b6a6ffcc1532a60463f8e0670b96dedb7540a0233f
-a05467deac20d5544fc026e83c80fcd3b4a227598a2b320418cb2b37f132f68c
-048cc26f58904d1f6d0bcc4c668843a86e81fee25383a35514c6b18a0ecb0b81
-514d937fd90e3b70f3cb83a8d06a9bdeadad9763a34098a306a7d38da2e2a32f
-fc202db1b3cecd7a99d4d778287d34a1e5ddd3f6aeca5ddd730facc26899f838
-06dec4d2a4db94abdbdf46b10b4f2d11b3c94a8686d210c350759d479d995a9d
-33fd660b16c4ab555dbc247cb559d6072f44491b32423ae4eeb761e271f304b4
-dfcbaa03cbb1833c822085dc6d6aeeb436e24bc0639e5cd4de306a7301f3c077
-2dbd3289cc3fb7822f52b450641a345750ebbad08437bf23331bbd6ea4e210bf
-b81fefd3d410330fa1d2ce93a534b3772f4bce4bf5335881371940a8bb302e89
-6d5043f5c69babca785c3984ce2ae8128d861ad78270ff78b7dd3678f4a9ddb4
-c6d4442d0780dabd78e652c2f30bb993f28c669fe05b9eae576c44d9a17ddec5
-6f49682da228f917c955fd75194d0361a30549f677c8d4df6c215281218227dd
-b5893844ded6a908dfefa52d3c80a46f92701b8e41ccf0ce82195cb1584dfe0f
-ae4f282c2f0702f93f9f73bad96b899ab06604d48fecb0f4c7436dabd184d62f
-f3f35cea68bbaebaa8473f6278321982e1bccca10dc064c463e02a4529d9047d
-da5b65ad3fc13009db932c0ccabf8318e4309516c19375ba41440c70028f1773
-f4aec7ccfa41b60db4a624a735d27977642fd8a9061195104d8ec81f0c2a5534
-45b3775e1fe556db12e0b2785f3e55ca8b8f8bf47bbfb555d0cc2c4d2ed879f5
-4f4efff486b3f21a12f89228b2254c937a7f6b4cf97452063194ff23485bd3f4
-c106a3bcba156b42e806e6238c39a0ae0d06557ef260df0dd1bd149caa76fc4f
-b12b7f2188e627afe0890f16d8a5685d5feb9ae8f0031f165f63b5df63f65aeb
-2ef56f80362ca765f6e24056b6f0f93491f6d8dd1d90d7d4237158ce11fa3102
-b40fe936dd641afc1d60891acc80967b02ed9d83a464be8e07b2f80d65e3926b
-ed7a2075d5140f321b8dfebcc4d808d09f80311996e7822483ad59a870bf8f17
-9b376d66cb785fb5135dc1351432370fa4060345ad5b69c7ffda0f2497c8c12c
-e10396ac141575a04a9a409d4903cf36cbf6602e09d0823f9498d19fea36330e
-bfa209fb096c09b1e2fc8491c0124246be6e1d4ad452e43e91b30d938b6e7e49
-9439ae5c62f36ebae128821bb90753000bc9db92ea04ff6c7e34343348a57af7
-90fcdb72efb25a14a687df7dc3b76eef16f96c649611b79d640516a2f9e81874
-c539df496f9a9c14c1ee4012f41c37c3a3f2189d91ff8570899c8c2e07017bef
-8d2ee37c6588f896914bcfb8d551bb15fda56c856e08b830956a01a444a8d2f6
-72b6f8ebee46542bf7a9f5a6c9c84418f840a01acc612c65231ae2f4794ff8d3
-c97c4cf224c3d0c26355a424cac0f2d17a056d203b523e03c60c4ef8a715a3f9
-5d879a4f344e371af8c675ccf394957fac75e2c039ce7708a6c7f5b46ce6e34f
-4df11daafa6491a63a46b495805896acfe5034d037152c41d9997a02ba58010d
-c338b23f185b3e4e3ba1fd1c8284f904a112475a08d3b23a92213e7ce51efec6
-297850850c99b5aa0bb31c15c7fdc4aaa7564c0dd664d334a17fad333927a616
-21bd7ba42819171e14abe2410455ae42b2a0fe9db7693ed36ebdb6305da51a5c
-7cab74a7d6669bbb23da061c5d641997b3d0e55d06ac1a41d17ac326b874b450
-88881784220f0829ac2077e09bfe9579b078f08c250f94931824ad8157402a49
-45847593275ff352dbe59296c2b0fc96a2ed97dc6f79b23e3796dbb309145e1a
-aadcbe232de323bc2a55b7af043c39dd4113d560558677e8a202229b3ced466d
-e37abdb7473b21261cf96e2a2affbf7c6dbb3622de6661a90bad85825009ef2c
-ca808bddceda30a3ca8aec87f960fa7c85f215b393e11e09b48db55f01cd0a9a
-aa33a40ec2dcd70df052bba543d2c22c9e93b384bff9055b426b1cecd5f90ac9
-574dbef0f9f43d7005b2a9be95113db7b12520811d99df5e4e979a5adf762bfc
-5d0d4c3c8150715b7f319d35875a7adeb182c37521ee80d994054e902cad0489
-9176a8953d4b6e28f541d608ce5e3bde32099520fe617e9bc9496df113a43d90
-7e1b212d24535290ef66c9833a23fa7a66e7fa11462bd210456b6edbc16ccfc1
-70c322b65330f4251d6bdeea11a8a0e58b2d438d7f844b2216aa53354464eeb0
-77a06fbfb0b72f8ee1f0bab6d0c6b27f94965bbd6260c70dff6c08d4edbbc4cd
-5a8adc974b690fdb53b51ce295e6b2b40c784651c0e78ea6b33c567568d1ab87
-193d2feb76ec18f4f6394fa5508ec4d6f871101e26c122b7fe132cff7f115e1e
-22b3eabff49bd9deec3fe09317e00639fcf82f835e6ce7ca9a65e294e869e700
-1c85a71e1b3cc1a4b9716a4a2dfab2986cac085e176dcb45091a01ce61dac2ca
-b5306da956147fac8a3bc131f0d8f31953813f52748e70b4c8d94a82c17d83d1
-a8046f80956defe12693eda56512d6d29095bb1d42e36466f6fd2b7ba7c70bbf
-123d753593f2b6373bd74d40e00d59b2be8ea60438e42818821515c417e69bbe
-c457abc9204f0a8ddebb88c44be364b358e2dfd117072f125c71bee9801801e8
-ff5ba5b44b0115ffa676f3bb99aaec050641fd9f5b6bb095a682b52c64ce6a75
-bca3587e2ee13f2ee022fc905b3babe03f154684ff226990c2ca27ec57100cb7
-dfed37c5f5d52882eeaa64357be3c9ed5605380445bdf2bbe0dc4fd5af17a3ed
-784a20539621e6e1b889e75aaedcec08db740396cb01aa753130f4b0118e50a9
-dc10da6a1059f331df49a25e98103e09473304e099d8578f2387098e380ae9fc
-f91f9ea36c0d900aacf7fa9dc3ce29b984e1fab13532aa4cf1e19a37c6b4f78e
-da75b81069ba80e1ed4ef2b9b5084e5e1dcb8f01e7da8ebf491ec5924a51294b
-81019480bafb622cfe2e500739bf8f4754e7e3e85e04d4932a71cfddb8d3b6cd
-0bc90bb7b839be6d8c052d1f0d93c833811b452403874b2a5ee226631207b6e6
-6492248559db1ce609e516e659d6107378a2e6d51021473fca2f1b87dab66d98
-39f607dc5eb0c03df892baaed0345514570988eb4895e7765c5bc42d1e76fee6
-b05bf0c77abaa0d7c5d6dbf2f7e039f04f9bf3b9a71ec0ed91e3a00f725bb1f0
-c74deed454f903d2c96cf70a92a048b05bbb624c091e3181c607ddc2477ea47f
-e76824c0af0092a62aa367448a10fbb6355354c5ac0737c69a4d641fb3f2d80f
-11f64eb4366df7060b4e849261faec37ff325e7f583ba04ad4fb37d6cdfa99b3
-0d73c662d1ebb1af64a2ed168dfaf80fdc284dde297efef48134cd6483dc1bc8
-e46b1c3c45fd5d4bcef85d9772000144ec49dedb9cf161792333104e50a27b2f
-1add3398c121814015c92096fd6d3b1352cd41d2eda7f3729d45c1d288b0f560
-17059816840217f1ffeef482ae49ca6b376a5548b0edc9018cae5eb6b1c33c41
-03642f744cffbce7898e525b1e8ebdf8cdc7645516fdb1eba4cef73d18fbf4af
-3517a140b206119a0d1dcac28577aa115ac29be7de2f9ed1f679034929c48870
-a6d50c8fa1779560b1f5b760450db3b8b350ca3b2890d04d3b33f19aecedf0d1
-ac01c613d992b423891f9ed878c8840937ede7d8a1d62fee5f92826620d801ec
-3c3edfba8445cc52e5f83e01ad27abf5c205eb022ae6833c2aae6dd550da4a97
-f10a7e363afc6d53a274c0fe41b83c171785880b637434b2c8c4348615bc9259
-8d8508c412d17099971aab2bf372b96b0b14ad90670ad976714d000373380258
-4b6462644a34bfa6f5b746fc0db76690d52b2229f7c79172184fadf2b5a9983c
-573dc0f5c11aa85ba845f6e4f5836e95636c8cadafa8671b2632c84e3d94ef2b
-ac6565267518e2f747127c6f7b13b4aa888a5ee3869119ece0b2b447a5343edb
-f0996b80d9437e62546b137e22735347a684af93cfe80ec102a50516092cbc03
-b0e52d5e10b06e447c118fe2bcafd3ba6babed083ab7d423e7bc5c862cc06dde
-56801534f09260d1f246d070f094f57219407e92769952925bbd0cfa29a523b8
-fd3ab5b278b2a2f12c89e6ed1dc2bcc4ba69e6452869b246596f71a310af0867
-c9aafc6af2c88f1edea2ac2dea51e8fbd72eeb0893a18706e16ce17a8ac44545
-ac68951c0f284b0149b71d924330201362ebbf72dd8e5a8a986fbeed97e5ad11
-cc913858ede949d8f732f742b0d73ce9c8239c077ac9d24a80c03c0a7daae558
-f17d2310822d33918f75aa835b5b4f9fb61730fba8c55441218fec3c4d1f54ef
-708a05f6fcd38a51d287cfbc58d92e5f3793da39c0f55eb9fc03b658567e7474
-557de727bde7afeacb94c90d0b38b5e9f9b19a14d7c73e066eb556eb6ce393d8
-fa956f4b75f6aa4701d03360f1f354e1bcee9b167cace1605718f337dccf8cb4
-57c3ac8e3b5b730c60aee2e685a80ff8ecffbc005dfc5f11c5e338fa20ca3a43
-9154621626157e9efbc0b390b143ae736dba62723c99f5efaaa02a090b8aba16
-1b712e55d50a2a6bfc06b5eb32ddee1ddea7bda2f176f0f1c533810137262a59
-f8b14ec3b0349ec36bd0b8bae99368d21c4dc0c902e92dd73231b03a91275edd
-9250f14fff4457350c747938f2cd6170e6b8713f439ac4e116e70f00bdf5555a
-99a7162b703b45e92f8e77b50e85373f073b6907f95839c6f6dd306aede407d8
-642113e1bf2be60a5ec8a64431cb46f882d2df7eaed39c326c26327513b3a647
-9ce800635106cd90cd7f0083d2de423a5b9e5d63c49643d3e220aefb899f491d
-28a30c49abdd19ec4bf66677e8bde6e43e222a097398ed2a9e9933a1d5ca87e9
-cc6cffda1deb6d13806c2fc82c4b32dca80dda4e3945c6589e9110ac91681603
-c4bf11c9d5510fb8d4de96ce3177297b692464776d9c07a1116b6369204df7ec
-4592550563d3212b50bafad065887b3c369a7810f98bd521be06a3b4b997a6d5
-e0c5ad7ad8aae5275f400d86a6f09f1bff38d9d7220fcf688212eeebb8712f1d
-74ce4985615a59c89354c1fc0975caaff671151a561edcc2017b0de504974190
-49c53f1f17162afacce065f1300cc2571a0f9dba7d21d8488372d386c41a9fec
-bd1c7def33329827cc99c7eeb7e5b91607849173f68ce09a2aff09c94145aaa2
-76cce38832aed1a437e8206426ca41f49c9e45b6f581faa8afc3b47869d5762b
-793b8d5fb6f0ac9c391d49424528ea39f635185bb7192f87b72acad339471ebb
-decd039457a71837c2f543652284f1f40f82c38740c2ee36b45d620f004246e6
-d73f8777ba26c7a7e3a2413fae9b7dd37553169c7209790f14cc03c08d0bfa05
-6e72e0184d32cf070f685ee4507b79b21b353c6f228aa087ff469b69b1171567
-88fc37c39977e09d1c46456f1568628844a542736eb0ddf3fe3d134b7e78e87d
-b126702e8ec60839b53c363090f698c5c11643a1bb63ef2d2f159872efc68ae9
-a96666fc8ce25cc0e2b47fc82f5f25f7b6a732901cc6d4295bec66132cb3f175
-42cbb4d4ffed7156beef36446452cf2992e8d9ba3735269ed51ff32f8c915b8a
-f0050d9a1136e352d4eca8ef9ea6c1978fe689c8c563b8faaa1128625d9e91fa
-d173c8e2b7f94f520098dddf4483b12abad73e2303098ec46b603b08f34f2bc0
-8ad44e897c2ab11148728f4de8f0390ffd947bc424f0f0f1ba80a107ad2e00d0
-ff4e76ed5b305b72b72a07e43f98093e032088c52c07e3f77d4a2d417f141512
-43d996cb0867a056befb66f052e1b65b37d2eec54a802e570c8b32554b794392
-3280107fb91a91d5adb4adeaac86a422717603de317a563251073bc740f10928
-1df7669744f5fb89e3f460bf820cf006c75231e979fe162fee64786c144a19fa
-7ceb1da2096076fa0dadc7bd1522014288aa2fc96baab5078db3de94807f3af7
-854cc320e9f70da4efa02d38fa65c15801475207a09d254a1bba489b78a8214d
-cfd4da769a8ae060fb4eda4b51d780928bd6315bd293f6c6b0f3e4a593464f0c
-55ce0c1120b2099da0250d04f792b2270db2d7c606bf80e7a56062181f7da864
-a42e97863ec70187b6620559b29207c549366172c55d7f665952c8057a4f2152
-a69f772b065d414e65f57719a99cdbb57872a86de9fcca4dc7aa32b666d474e3
-d20508d06f0cf028521ad7d46e9c25a40d1390ee271d2ba5ddbaf7bf64585c3b
-a859a2f3ab88e58f72a1485a33c419187fde432b697809da526477341d7433ed
-f38e1ff4fe51920404138ec6403df7562e4443ea091c620a13603ed0388b88e3
-671f7436193eaad4cf55ace6d04b79f0389ce28a1eb223b24a9f8c92b4f5ca3c
-0bea3ec00a555756676d77de2a38e35375b82c5192001446c8517818f18be439
-6c900f7e1587969d9bf8a9fb5595bf055222951c2b0392fc387c258c8cef50be
-7696d9360b0f2d4095e52388b395a10096769586c03fc96a69615b92b9e4d3bc
-275229ea8df5c72ba0fcc67bf8c1b2708bbe298cf75d1a97d452d51743d457ad
-7d25ea5484500f4b086bdd81351f71885845fdf5e9129e8b0833259146dcd34a
-3547c21e093a4fae7469620a88a126e0d025d3e50103f66357e2e05985feeb5d
-4a9adb2db82460076845e54c083a2874aa56c5b95253a1e8cf8f1e35448577fb
-8147f62f33c968151352488feb6fa978676c9f274d6b11f7fb65fd39bcd7dcce
-7846008370dbc907341269f7d1c355d087fb176fe06836511cd9b01addccf580
-f68010958b8196f50277dd16f3039a9aa70411fd94d1b145b3ae34d5304e6c4b
-02fa4b80f3693cb6b16a70dfe06c132438e0e56c4fe504e1923196a58e04034d
-6cb67335f4218b857cdcdc928f3cc436c63f10ae872b93788b9a84b546c3f504
-7bbb0d419d7882dd1f7bfa5fe8a1d1c671ff3f56b50160cf4c23e8bd55111d03
-eaa7ff86ce5762687b6136f5728db1b9a1b914c7e2fce70c2da513594a989437
-ca8eb6792445ff806e502d238984d278a81d89b22864ddb0da2e49658657cfdc
-6214a570113a00e55812ccba870feb01f397f010a0377a34fbc8b052084e3d75
-5e0bdcffcb26045c428d8de34af04aa8b7a5031892935c16918f0ab2db811533
-545d35799195310e5b109688830bda180f096fc5dd2f2cd98801466cd44a2b50
-68e54fc80d1d80c9f875b7e75860cb406e83132f5cd0813757d75b5bca06c62a
-fdb7f0d55e94cc9a223c0f9eaa30c0a5c13ea0fb857fa703f2844d829418ae2b
-968dee2aa785c07ddf773e30bd42ee89df6618796171c58ef11f6570d21b89ad
-55e4ba58fffd7f112dbde6afb5c5cbe7d73b69b5a25003394ab6e0d5302ba575
-51ec63112e038b79f6b9632012ab775ae978f4d94ffa70e5d095a8fa0fcaae76
-18fa4fa41df5e34e7483c278d4470abafca5c110f1cbdc1e9e10fe169342a2e3
-6ea635ecf0f5ba7ac1fe1d11f661e825191ada43218eee5f5aadc42436c98789
-e7692be875ce211a94409ca6fa9b2bc1d67ee0e375b83b62feb2671b75566620
-47c9ba88ebd7f795c9c02e63cbfef0515a62db218f4e5a0c81b00bfd6ef12e8b
-7bbb8e9ab5a1be0c2773c7b5244d7a815d95644a188ce66280637dc8cbe5fb16
-f2ac4a45a8a8a3e13bce53c345f35b3ff85373a8733aa6777008ae9329c7e54b
-9fb18b1e137e253c72128820e04c7bf47189c1d1836f6df447ff9efc0adf7b0f
-09c1032853c67fe92d961a91e70add002c0b8f56a07c3423cefa2e5f65b028fa
-ddf99e24090b56e5be0173e8778b5c45fed11fc0c0ae64a824bbf77f1150b9b6
-cb4f96ba0413fc37f7590955d075120862015df7171ea3b49fe6b0f261db75e8
-5bb33fe6043a19688ce286573be42c114a0495cb2cf6f642e83674b5ab17c7a6
-191c140c1ffcc54d70e2b4d1b82fd0aa1e61583564753cd6c5c0d6d7743cfca1
-f6fecc0f51f247b081cd7fcdd498da22d5a2c8dec0b7a9f92e252f63644c50d0
-874617703ecdebf7ba8933041793391f67ef138fe0e4efdbad4fa6d7b01c1f01
-b9eb2868632c20ec8f3e34055f6793054bbc31c111686ebade4b4d44a9b69021
-54cc2fba1fcebfc1943433fb56b10b60f5edb160df0e33e7e98ff752060140c7
-8511c870920c2369a0d6d4dfb687c30541e014bf4443f665a24a5f05d5a21acf
-f99d9131495b773e42e3f1333866f45dc35ef9231a00129564d194006c447bb1
-5f341631210376632d90120ccfdaf8eb6df5e2cb1b9046cad64e34bf4e524c3a
-f786121f9136672b6bdc99baa00d412db7d5155c94796da2f490cb441786569e
-769561942b30cd8b72d01c11434b9a64a82f73be48821291df689324a361fb54
-c1760ba86b250c9a6a2c855eaf318703d4b6c23f67931b376f48dd3d87250ce5
-7614efcabb4a6b8fb9d332f121aa8e83edb6897987ee25bbf692d1c243e6b592
-1954fa91ab728b5844f0501a63abfb7f6c8a018e0f5cd409139ecda8b427754b
-089e9f71a74c55b8a0c7d3dc7ffc478e693ca78280c9b33193e82383627bdf30
-771103c535dcc00c7d9ca352f135de010a9dc95780046bf75b36e0a284d8c2a7
-f3b6096d905dac2abb33764249b1bd61e3994e96d0f3c1e8cc9959a404dce763
-31b01ba083a82d6d0d9cf9b163bbe2e84e01a9eb07bfa80ac69babca7e725fda
-43b67bedd3a23fa3926300349021c2337a5dbffa2021e05d26207958bef87ba7
-eba130cdbf56be5516c5ae4441390e999822089200aafecdccadd69169a27414
-1c0bf4ff1be4221b4e6465da6e5ed755568f79762a660653e10ae8d098471457
-9c6a90dde454ca311947f0d48749b14e04aa65a9d8c62097998b4d78e171f166
-40bfe92170c33de5ce03dee2bb50a656c2748ee8eaa15951da01771acb0a7c97
-25eb74788e6c283c6cde569ce52beaefcdb29f91dd345ec41b585f1e2dda5b29
-1e85d3a50e93ca8caa6fec04df003df18120152d0540efdc4020dd6475233f7a
-1bb0cd65e6e389a3d714455aa5341872a48c01f9f3451f0a41051340a9276afa
-50473824ebc231402f4ad6e35ee9d50cd89d2dde31cb5cb47c72cf47ad6e8538
-e1d41960475db823b56c20845107d5f2ebd3515ba63c00b73f9f069a7b2d8cd1
-862b61a9481a437aa4efa394315eff55fbd6ffcb26ed9010daf763a3806da8a7
-14a1e943547d733eaff9b1c8ff5d7ede9573851877756c99adac534773a87ba7
-e3e320ed16d4c383bb75fae51a0bdc694cf4b945a389878d38662a3d3b6287ed
-d505ff4d7947250e56c501f630ba5066f343e550de87b42ad8eeba15ac21de34
-ca8b18eed081283179a71ddd916c4efaac62f0603685530d08d499918b726311
-ebb642eae0db7fc91554fe6e77580244e6f3dc871f6bde18a80d732fa6f2f04e
-108029179f799d54c7eebbbcf6c013641657c98fc17d652a9b48d15204936752
-89f4312216dcd0605be6fac8c1994dfc7488f89fb2e777297b16c95c66e4b7c8
-5b30681029156954c59c7f4009e6e51e5a218de4722daac7b24176c9184f8da8
-150df8d26760dea0757344050a36ee320d1e71dafe9fef9bee08c93a2ec25d86
-310ccaa2c2b42c87298b238b449b8e9abbc89b9751cb1b2d86051baf9d84ed66
-e4123cc33e02b6c95f60d72dff4ec2e59c0e85370ee21c6ce7d2f2633c69f037
-00608a7d4c67e14d6eb9782762c193ce09d9700ed2207df978ac96d967f64d7c
-d1890a7992c7b1f0a6240d53bdc279a1e9809963532108114482b30325585466
-050647c568823771ea8e227bcf931321bdc7699707ce84721f3a8d9247ab7428
-2eed6d1f734244c0006db24d909c39575f3c31d67c4b06100dd37c12637e23be
-103d0fc36c3db59bdbe5c86474269c394b0d910ea9bfb4f321724e0b73ef96e7
-542bdd57d34c91b319d8ba7c692608a0c0db47d5c8164782c5f5d9a438c15afb
-80c7545832948717eeb7f6b646c59cd2d44be1fb792e9edf4a938f887304314e
-b064e64acee79563271364ccd68552bb354d1b868bb91aa38345a1f712bb191a
-44267a300c19d3ecb9c756879351f430eabfc5b596f63a6860dfc94cc6ad909f
-9815bf7d7d885b62d3aafd9624ed5eabe77acc50b5c8aeeadd4ad79e01f4fcf0
-c0bf6c0124da07e12348419aa115c90fad1d3a6b8d12a9d65cf3c7e8059eea56
-29a9a09e7d2df23e180c19734acc46356455886bd9e1981ad86ab2be96eeda66
-87654f6ea6e20c95aa61c9a50117db0a647ebc8c34c55f158ac2085ca23de1ca
-02b4ded478ca08c4686527cff76d641e0097f3cda433911682b399604ef61c89
-901c7da40dfc094df7025b1a692c159ba0a743b1550f3c548b2c5f7b33016a29
-a370407acf516e13a466e03a8a71ae6ccfa498d6ee19f53e258c3644a6e86852
-7f76d2d673ac3b07e3e23554886243d94d7712d778839a0c754a8a1217162b8d
-a3ec1006d9d36dee27d54e4c6e256f9a06db8a5a752a1f56766f0c6982df002e
-4201c9988b769c64aad5446a8190a5b5b3c1f9bc8cb6ad24c9beaab17c17441c
-4a9a8391950fcaba005782678466b3659c7eef7ade032612a9a2e238f59278da
-1deaa6dbc1a007c6fdd494eaa997ee56bbed5f797df482213f03b75da3a05a0b
-30b3d63c75b125b8ba5129e298c45d958a3c69067af3313cad7db36d928d8ec3
-dceec61f0f7ee22622434248cdd8696c5b54c8911b9d90714347f7f6b11c0bfd
-908e7f9cd6f98b97a3b8fccef61e6234332a1094b3c968eea224574947de42d7
-f8d5de799f40caeba36b4fc4bf430bb380dd217366446482f94d207c58a25e76
-2cda6f2af982916b182b477772674283254ae75a8d8d4cf121a73b3a2592ba76
-1d6d914992090c438c4a68018d474b7147beb38ae35b8d8e9229490655900c3d
-e615951797650c229683c3def25be277af6385b4f0ed240f86547a1a3742aaac
-a0d28fd8de4fbdeaaffc37a669bf709f0dcc13fe003c96e44a9d33ad16217675
-04e1f237dec054223a0a35a4ada96b0a683ea1e016c6fdde948e0a7a20f8e8a4
-a6d3bb3c09636e0373dca7746eb163f43810e2eebe8a50adb76468b8a779c371
-6c61b780626c027be20eddcaf408dcfe07cb044aa03f7805290d252ed3f30016
-9ddaac33d863e1ebcde7b8f3e0be3f906c3375e4242f64c7ea6f0f662bd9b776
-6702737841953a725113b45ab4eb8548a1c1479695ff4ff9eb8d474ff66c869b
-196aaff62849081a98ee963bd74da69ffa1dd8519b106ab22b4778cf97f1aec2
-d9b68354aab2fc0a8fd3516e2d2cf08c22ab093ba89434c57874f4f87831062f
-213a7fd7a5572d8088eea1cbf77b21ab4de8f4c7a1fa8312484dbaab9ab2a923
-d87b1fe0ba3183ab27d00fc13c624efe6ee45e62d2d328aaf9f501e64765b946
-f21d5f77d5b5436a6ccaeea7002b0fb24bae81ac550a731505287f37dc04af2d
-a4cfee3b3a1ab21781afb9222da39f72f2dcace99dab50d82bc73e73125279ff
-431a5a2bef0b78abf0bfb1b3140698456beb47261801937d55e1dcbe40403dcf
-2495b10dfa47211d9342f7676cbb498ecc5316b1dd64a74fa22cc977176d03c3
-f3b0760ec63393d846ea11b9c2aea75c5b7224dfa193a2534f0436cc90d9fe88
-1f56441906e4d5644fc33b472c28646ddbace7d8ee8fd8c78e5879e638b41b14
-eabb5715c81ab6cd2fb872370888be6f6aced19820394a42bb286adf8dc2a82b
-18b166efcf0c5c7626aebdd3abd5fda35cfd70887f695fdf82337b821c510005
-90c6f06a4e88ed6d4d0e5f2c3ae5e4865d67e144bba6f6f3ddf309c049772e56
-0d865223cd88963c6fdb573d56b8fbf67255f94c1c4e264a8a13810162f1ad7e
-b141f69b353c7a9737aa9d919d1bfdda75910dc5e841f4d52a5f58a3ebaf305a
-9075edc50f9fe0cce188ff64e09cf1769949589b221b451c0e7f2b6176f6ca5d
-680b1b4bfae4b7ae87c03049fcedfc09a33a680f96d96c1d09fb0921f3d4bbe1
-9655fd72398d8b66287357626d90d44b9f0e2973942dc06de660f7278cd0749d
-27abe4645698676a1ec645169bbf1134a573ed63fbddcf8e690fd66f943eb675
-2552768f52cdd9b8c4938e1d583cd6576611b1495b4339c86021ce6661175e68
-873991ac3c93a55d9430d510bb2d6c91dde275732c87275d2dfa3a0124b3da1e
-1fd7bed9edf509a3afe352813a8726522244d32c8bc31d01cba0e1248ae5c75d
-d25bcc26826fc61c172b5ed70c869894bf1a37369bf1b98f353caae79bc05fb9
-8c9d59c91e67e9040642e7b4c54912f603bc8f8696ac9d667c557c0e0b90679d
-9c809c82701fd2725752ffe02d243baa5d340a59d26935d520b3f0a7eed8fc8e
-fc352542627f167062b1d2657f36e518ac54d03df9a51e857a3ad589f7986513
-914d6b735e08c0f0e9925a49e08921da73050d323ef835f24565fe5b34aa55ec
-b8c41e873d766d66230b8156f06580034d61e5060f2b6c8b7bbacc2875c26c07
-ddadc43a8d13860888dd97accc083e597c99cd92180582ba9fbd03d6339efb43
-27af006d0784c3f661ba85086486f91df5dff5985c111dbd19c17b357bbee805
-6ee8afe1802988c49999f36a176aa339676f67b3a99638d6a9db1c8219636720
-a64fe07e8968c0e2d013aa3583095c15b4f6cd716dc4cf833d4595a5db580082
-66c95090df00addd1a266558da09328570fd3ebaed85e853b0c38fa90ce59417
-da533b879bba9813544f8768cd27b91275d44b3876c187c7b1866b943d01cf14
-3dc10332256dd9d603641390e9c4a5d69a2e3a5a64cf5f25f3c97fd69673cd04
-af830aac66c8c58c7d6ca5c9491776b6e0ff293a7340f55702448d1c13ced978
-a5925f0aa260461ee1c304caaf92b12f5e268ebfa0ded8cc0262bfaf51f5edca
-c304414a151d57c00c8d81018ba41f72e9f6b0ede165a4902be08de6796520f4
-84e03e723fc8fbdd5c708283d410bff715bcbb78184c9825bb93b13ff067b8b3
-8f13ee2781128cbace25fd8dc9b6cdf0094639797eedaf5cb118a2de7d53d66b
-aff54b243047c35c1fcd4adc5942757cc55792f3370059fffeb95ffa99f10e98
-adb201b57efc5ede4e03dafed763d81cd47b4c575435eb7bec1193ff84329a23
-8cf67d8414e8d1a57e41f3ed0ed3b46f1dd2edf8ef198cd857c05dbc65350dba
-a939e74d0394effef3780ac622549b301ae4539534ce23da4757a7205ca6dee2
-fdfc6608444093c046976b919204c92d985f4ee2db74678725c56348c40cc447
-8770ad251b6442630dfe076de75dd57da6a453e8ba58d0016aae4dbe05591e80
-fa2c2df3aca1de4f21d86c560a9d25280fee16d5844a5308d7922d9bc40201c1
-c648e37d929853249e572f88b21ec024bd07a8cf3dc4fce45df469c94192563e
-a695b6fed264c72b66256a3e9b0ebbba06d36a9dc18dadb4ac7bb9c33918a106
-ae23bdc5326af0b6ef663b6ed2894bdd80d334a084bd692ccc42fccc033ccb29
-5c7bd33199403d488c61a9e0c619a8e501a4f5c8034df1d2782d8286ef950513
-be7391b1543e36fc886672a4556c66c4a92c40ff9abde49024eba8e041236d3c
-f68125512f1803b8cadbdaa0926906c6a33ed1a52c75e5589dda5537ed70572b
-6f94756f25eb171372f4513377760fab4bda57d5badf1c2f81cc68f4189cf499
-bfc5002e5791bfd84a40a69983dac1b26cff33475913e7d410d65d228c695ed7
-6e896482179611844eb586a8023e6e03af4c787d991d361be5aec58fd67222bd
-a3a63f3785abfff3e90eda8f151bce01026a425587da9d8001e532fefb75db48
-ef723bb5ff12398ad736c4f329fa941b1951e171732ce74b2f569570ef9c11fe
-8e15a4746bd8c4dc3828e431329fe205584b946ac06beb7efdcc77d5bb6f299b
-265a56ea29b78903c605c1ef909dd25abe6562103084f9eccc550698ee2ba7c1
-ce69e49a7a3dafb88a155d7b6922c9efb5e1f8364728cad0b8b4761a1370f06a
-aad0d9467fe10f58cafeebeb187be257859be4d730f33c8d4dd5e1b0dffceca3
-b23434c2a25bb9cdd8c553ae92093b594ac139fe70fe9f4a607ed7d4f44fbfe7
-0abd31a1d27f550acbb627ed100b06b0a90af2c1aa9e334b54b23863693bcce4
-bc517db889fc3d8d179d670b1e282c6479d4f278a620bc61a5e3977458da98b6
-dc4ef9062ce128fc59a595f9741a7ab354a086bd1b0cfbc8830f19a0a5b7a278
-1ba1afac9e8f805f5563a954cbc48e85565b0acd3930dac4f1f4d0c0eb8b833e
-4ef339d3f5ad304e59f0958aef225767f1f992dca2d9279ed920e6b1f1d6ca66
-3814264a4455e999bde37475f3bc5ecff3622581ea9145dab6acdf95c22fe293
-272d2875a939ec35af73933e9acb08e419dde1c8296e1a5ac1006dad3bd4ff51
-f278103d486128712f55c34f4e1da744350965f2692d8d6690b67445b8d0a2d2
-6b1a18c1cac898071b9371cf39ce17153fa963d83e646486d9449d434200b912
-5bef39637f3e298c5dd1f0e817f523d68a994b3b05c8d4dab4700632f39f6410
-3417a3c7562cd8c399ab5d9b9efe99688b832d5a2dbcacb4ad5d4024ddb302f3
-38a6eb2e23e47702660dfb5327bb33347c833ac8c9ac158d2e676589def43d5d
-9bd741ff2d68859e6974891121a14afa2c9a0b591db56404b19f08adc039a6da
-0f5477677ba691e27d680068f832603cfaa10b27315e4ca8d8fb63b6a3c755a0
-aed3f49af639ca8735928670f37018e48bf3d9ccd8203017f5c52d4dcaaaeaf6
-d91371e52550e6e0bc72995965cc5a9f987e2099bb915bfa28fc0f57cbd740b2
-6630b3c1fe2f7314f66c36f3014d8940a6b99e20c2bbf66147ca17cd9d52e2dd
-3edb04670d745d9a2b33ab65cc16a68fcaf84e360ae1477d357afa62df1374f6
-1219e7ff000117ebe8dc15d58a4d2d44102d235d9788d897667cb686a61e9519
-8ffe8a7958659c0ee5e1289c8c1676ebbe71b61b20e4eb930d14927e2647ee60
-92b3a7fe0c8c02b760f75b85bbe0a429d98f021d0f4d9ae2219efd4dc06f3a44
-a1718101659bba461a904c2560f5d3e14a0b14992b489b2b524cace637aae881
-030ca980db54d8f1dd988ed0fe2da5f799c393d8d12582dd218710e0a171da2c
-25f637290d2296bcd20c593c0f4c3b05635d04b4504725442a5c038d3c3d4ca1
-9e121199a4517edfd81f9e50b9cc6a88c8c49e048a7de4dde8c77c9eb4aa36e5
-5b26a061ed03eec44693b9f5a7ef0bb70a26a147bda86981e93ded72f12a918f
-133e63ad8507daad920be5531d03b75b491f95b76e874180b434ac0795f961b0
-aed9e078966edf01ecd449afb7944080f6f09260e767f3a388c481df67d4d6a6
-3d5949ea21d07bafd52c2bb664295bacee81ad5a2b16e4e560be69e9f19fc9f0
-d5e0772784a6917d2bba7ccc8455f1572a716f1e032f5f244dd26e5e77bd6894
-829620277dee975d609c3a8d13c5dee7d05bc9842af7a84e9753420591d0f6e0
-e457111aad08fd5818b23baecaef43d6c42c423f37cde8ed09cadde44ee7e8b5
-c5699e82dd3b7d5f268907d978b58fa774dfaf90ebcc85ff390c78056806f6c8
-9ae7aae8295bfe14c499513fd2438fec5f13a9299500b0abbc17df9c39a44098
-1784299d7229e0f36748d957e5cfea65d8d2c940720ef6adafb4b40ea38bef22
-a997657aac9473469b33f7b35cf12f92a8906149fc17fd56febb5e8d728671e0
-0df089cb79e80e41de415f9e7d1b5b93a7355d9eb79bc74026afcfd0e82b53ed
-20715a06fad8a586bd1961b0cdaf91af18045107311f73f8f9fa185271ca70a9
-6242825133c68e6e480a9d96ced60694cb24a3127357b9ddbaaacb314bc76870
-8cc7dff7c1d96ec22e39930613b154a2d52f6d0ea5eaadd5429c2738b27bea90
-d05e15b53c2481406e56bd2fbcfd9c73b9bbf9ff905fa83f6359ccd92f2f6494
-69927e744de743f579b7d3c0221c8f1e644a49d33e86208d9f3940e313abf42f
-7820c38957f38908db156a4820cee64ffe0ed3637a26ae347df177abd9ea683e
-91b15018fed6071ac92cf31ed64e5152636a01ad869b09afc76a753620901110
-f317eae8a99e5bc888bfad1e435302146323d0b752d0347c9b5c40fca5393ee5
-ad16201bc6aa52b4700d790af61387f16f0ab6977291dfb25ba200ba5248bd25
-4850cd1197e0a7b289439b0442fba60a1896d5d8eccdad1f16e5824e665a249a
-2982bc9cbea19dc6a0429e192f005474e775d5dff231d5b3855a2da7040c1058
-5490126dc9c2e409bc8f4eab60b75db09b08c94c8a675efc22a0a8931c790cad
-ff09b39407c33cee4253e5c5f9e806b5bc5fa785fbfc6db334a484e8e0f023c9
-9094b1cff83bfb775af6751a4d1010416b4886b3a40213297340212604d556a6
-2c56be99d04ee8c1c0772783df3bfd97a9600c3336302155a019579b1c753b81
-93b5712637288c4c657d66aa21aad4ad0660f160c5c61c2ad73a1e1ce7518c31
-2df63067457a38a37f27e3e4224ae637c2a977a5ccae87292abb73a29b019bab
-91c4ad20b02dcb57774225183f9d386136ad0547e86b64cf5337d42efaca336c
-7bbc10cf8163aa44fee56370a74d47b6620c9c70f822b69d292e3a2379fd776c
-7540c44c8ba1f0f072336630d77e45a96b232897d32f726bc579fee33e2548f6
-3ea6c07e6b7c8a39d82905ec789c2ed837a380d354e93064a516605bcbe587e9
-99f69b562805b54604a6ed75d84f7cf08bf33bfde2cdef33efaa1a4e417d2640
-a05bb5f57cb7f96dec69cd6bd3cb909cfbd3088f60d4caea3373f31a684797cf
-0b1cdeafb76cace154d45bf7775f6441acddaceb8332ebbbf148395e08073da3
-f54f6d1a525217d554f294d9665fd12766de19fc11e23a1483cb0abc75b21bba
-9f7c2f5e21a0eb5b79585b9935b7d7f2254c4f7311d6367a6cf51fae5b228648
-8173d553701cccce508b5623bf23bb59a66356800f2513725046f115d10f3a68
-4d5aad7551797c563a6a5934cfac1c95216db928d08a8adcc4d12d855c142f41
-b663ab4755813cc4bc432147c5b9e4949d56a07c084be5bb14b74ff3a9ca0fa1
-708e861d3133c5caaa90213ac1042dca3febdc4431fe092c35cc2d60fe92eebd
-c96157af469b6e3bd124a183947cf960aa29504dd4eb9fc9c10d1bc77363644b
-6c452a8824b48ea64a3084f6219c65cdf36a1f8a4d7da515ead6f0e03d0bc2c1
-69ad00aaf8a2b1782c990f7ff40fb9bf2c00aee85eea074f4568760d8c78529f
-835e6ace945521a39af3bfe33b73b62a9c755921b29c0167190c6fc2133645d7
-6cd319525acaa82fd7727b055e212c7db32b5efda34de81160378efae97fcb51
-8fc021af9ec77692c0bff6e8ac0de9f938ad65c48d56322c5719767da14789a6
-06dd5ae421aeda6de57c968c883ae17712aade14da281fd823c99561b2c7895c
-c0ae4cd1a94e689bb579d3978ea9b2bd70bcd167f15508d1d820c8f54683cb3d
-8b302e2af9fc2474245fa9c3fcd50f57699ddbfe78c83b417f2ab301cf335284
-c7cca7e8d5225e036591bebcabec13262d1a7782f1e53e2a1d75c152c0ea6d18
-04cd294417f9cd90912181518915e6d81def1ac5957a7d59b62c5766e8ef3554
-43938d39498456ba87c424013135609c6437aa6346e59b385992b196e5bd7f8a
-0b44804854f29e194b6c2959ad55c5bc94cbc0f41f837d72c1e91e795e4d98af
-976eb1b55e01ab71a0a786032fb6a62fc6201db7c67f2340a5c504b9a9a9abb7
-3df1694ef6c098769477cefdd3b4b77ab716d240ff9fc0a1ac737877658df26a
-b6e7688c7382d170e1218cfc3be31a193f26e9a029c74da3ba2661014b58f58b
-2cc7719be663206c3cb3f8993a3400c149326651751e8e9d7902346660c4f845
-c7b0bb144ffee8e1187efc1a5e9e44fb277876d17221287c87ee6351a5c887b2
-72e0c04d45d060190dbe5b1bd8afb1de6c6d984b65362bfb0f9a4aec15979b4e
-e94307f351f30f02d8656f24a4885a5fe3bab465b7a0421f240edd8dbfd8f4a1
-fb2af2f4fdcd000d0aff4b5ad85b54b98a83c59654705ca2df9ef54b742bb3c0
-577f7f422cc7cc380e5dbdf0d4b1fcbcd418a219b88279fbbc8b5397744ff5df
-1d795570adffdf79a38a6ce62456c2601b8f09bbf18287bbc7ffec9d1b164856
-77b6f176286998b7e76698945e70510ee09966817854263354a751cb09afe9a0
-76b86ed14a837dc7c4c15ffe7a448056908deb055a02558aacbb6465481b81d1
-f42fac1b857a516852b3e7db8425d23dd0e2e80c423abcb3a5b95f1d34f28e76
-74c3e3a77431cf1f75ffc9f61efd8c9a09fe9d74681e541e4435d8443fbdd7b5
-4975b26b3c69d2e2283b0ffd5e934a480c4ee656e068aed4fd180fe5f6ef4af5
-1fc86e6f9271d0b07bc9805cfb43f06add9ec5e410a7bffaa925d84a26965fb7
-6942fec6318bc03627e112f16fa00f56ef464096aa0fb4298a98b3010c404009
-d16c2c133878b6f2988107a01cce2c7a3db4cbbaa7adc2d45083903a357d4911
-3775dbcaef8f814be6d600cb277b9af93d8ab005fef834ad50d8ce9d1dc09f95
-5b7fb930cce65c43d9cceaaf4517b8f1ad764b1c256280f19cb69373805ac79e
-a4cdefaaf9064efa1247ba74bacb09fd16122646d36980eee215f83dc9293193
-02789698f6fe0c5a0539fd7ff2b8a28746d92354bcff6d6c056171bda61e9ad1
-bad7f68caa7c81dd31d3effcd9074caa07943ccc3fa68438e9712002d7b7d5a5
-2ed1fb85a70e55a15ffd0fc5bbb64265a048ba668f0e8513f733ce257473c517
-0315715e26e0676819f8a16c22d8eb39d07846efeb177c488957a5237fd3d592
-3d10c2e5e1e6b50992649bc18fcc70c396312b350b9cad02e0af2146d9894f50
-20eb54df3eac30225deed70dfc42784e3da822f380f46b4b3036261b2e19e933
-675dc99e5bcb66381136877f0e9cb2ddf01522a66b33d559160d2f184a7ab052
-e5129afd8225900893ebd39e92830ed4da59e777ff5b0a298a2e3bcb2897a6ce
-8bec15a6522071afa21cc13ef47179c8877e6b3722180f9ce4ea63302640798b
-af1d2fc6e0132b3505d3b0e949d6fc4d9f744436c619fb0611b13a6b0a4e2372
-a21d4b034d9b4e0fcdf5f25c41e8ce94c8e417088db74d2d82a618c18111d385
-c4c66d1f37f6e64b8dfde45ad805c374cb8030fd3db32e8489ee7243c78ee4b4
-3f58f68c2f77d0917aa51ea69481d98cad76a2e6a2833f2b1cde6d15be2188e2
-40f304e95494f838630665b8c8330ea641683eb4aedef08ad22b5870e8508f4a
-098fb39f4dc7ec87bc0eb35ae1e97c29026d6c800deba720641445df76d42a8e
-6470dad8a60aebac364f773ab9e7f2a8b31af927190c4baf7f7b3d2da3becaec
-06162e878fa179de59cf84e37f0e56764963eabaf87b1fbe061917749ea18ac2
-1794eedf33f62c32de4f3db287d51373384a2cfe30bb5daf59aedf26fb1fab59
-5e8897f2328f9233d396e692cca1ba9cc4e6246968ae05fee297a5cbe1dec18c
-59d1618cce3b4bf40d4e07de3cff3b20f7bb88e7f1323f64bb8ea416700c3703
-52a06a717e69ceed80be16007079ee6d7ad3a87012eb2929312c2b68aa785214
-6a5760590785548490ee4b55bd78f179671e74268c670dc71971773683014080
-b742cdfa5f5c58173cac5dd60832c9b6ef16b85c4280472c96e264b54f158989
-386bb30d4336cc099887921049db56a41d2a6f57028a7cde2ea150e9bdc16d8e
-e0f42177a9fb423f2245a34dc8808ecad15ed373a368dce05930e4ad627da6ec
-30c03a2b9f4368ce8bea2a19405a5dfe6745c90ad99baec67cef778651e4ddcc
-e469d3978733fab41a687f7edb977653d119a9c8d33f299836f12759bd4f5abf
-ab5b1679c61b46854d8c9345a33d3338c813f5f8d0947abe01fb4846afee616b
-84f713090a8b665320c9b3be3baa1c7d1923804bb5ac590dd2f7d1cca105e7ae
-a1b880890497bdc0c965e6c355463f8a5c481fa144dedeba2b5d6e1c805096d9
-f343738b9bf2571b3675a19a2f919ad7da95cc16bfb4d7e83bbff08c5bfd5b51
-b3ac712724e9d031ec14e05979f79e2db6d1b85755c327ffe124bbfb62c93f0a
-28e5a60ca370948a3a2fbe3224849120cd74ae75aad8e4d110ea8cd3f7983cae
-e269bab03078c3ec14d9169b2ccd4c5a3173d63c7332b2ed58b622c8bdae6c31
-bbb347a18271f610c1192085b933051bf4dc83f627002b9654092bbb48a0c6d0
-e280db40562724e3284aa644e399062787a2b58e850adb5c1c3300c2731b53f0
-ea5e3d8c37ca795bfc171259877c8c3735a46beecb8e8cf9bf7a3ebf60d90a5a
-b228dea11f5b847663d97e8d43416cdab60be9641282027a152f39e953cc263a
-34e070785904b1cdc78998d53ea6a44b2edae5be3a22aef96970ced5b1a8fff7
-20e39b7214ade784dfb059d1b9ff5e8a0a1c910e0d6dd399055d7f91bd13d9ae
-2b6a651d1ac110d1bf8e2e43f1b4d98b3bf62b7aff5e7744eaa994d96d6a05c3
-cc66b18ef140d07551f83bfc4fb770f8674a6f9e844879f3f8b7bc956cfce62b
-c658bade1f84701103df87cf8ee9e5d33690839e8fb6e3fa7ede4fa9e093da77
-81d379d9b12bf2a56f968d0849311e81a72c96a421b6cbd58ebbe138ae58623f
-2208930037c3cf001134035d7e47cdf849004522de61c27263c515655618d1f8
-69784ab3f742689ee655228e1672ac9ca1806b76232fc9eb85f69b110ad6caf4
-2a054adf4e2767a95f5534c5525a5a6ac6008a10a59cb28bb70e1a41fab590b7
-3fcf80f3a989e905d344ce643aff41a74275905e9235cd33818c5bcee1994c33
-77938f2c4fd08fd052f6f59a9460d7897c139729e768cfa384df59bec67dc82f
-5cf8e2638bbd8dc769ce87857ff6e7c4580ed80e630815057a0e381a91321af2
-aaf3710f92d3bea496587cc1baf8e76a90d8406716ad85e8bb3067ee410e32cf
-9dbf16a6ba4a6993a1454a393aa1c6a4f5b85bd71dea9d09e16a82a2e64b5c98
-8d2f05107b11cce59735219b104815e38219b1dcc2a8fac862cdaed85b4e7f3a
-3f8de686cbe956d7b11ca62dd89c68754e56caa56ce6f523579e725213913d16
-987674baf3e75b9e1176845eb69121707b6d061fbf86a28ed7e3cde2c0ad5fff
-3200813651016bd240ea190b9240e682df8104baaea088c868e83924bfab865a
-99831038e67d113489df5abf11f7cf0c1ea9c24ff19a56faeeedb1b2e103e0ae
-b28b73d58224f590be7c0a7548caba79e8a312f758e48c9eeef76a012383e31c
-4f457d451bb1c3d9bbfa9dc84c016f6a34a40a5a7f61d5312abcf985a5b56bd1
-de2bfb6427053f4f73b04f545d2e7941d6aa8a465719bc818b14f388161419d6
-9a965691fb68b9a8a0d78f89ced539556ed137321ef6c35884e9485070d884da
-b5875d08200a593ae7f9398f4684d19a3a0b621496f032fb8d17a5735dd5a288
-0058b60770ef1136d78fc9dec10e5d78a7dcb4e804d199b659030aab2eff0a07
-c64aeb7b5bb2181d8a80f3c9c5bc1eaacccdef478777567c2f03d9706b4dce68
-2ee5f872e112f7a952101d859246bddac59acf9339b546fe213cfb6230bf2862
-3f0a53b0439839fdac6950f1d1ec14121a8762c94a928473e76e767931fdad0e
-c399a7b27203d2198ea577f2a518fa57c75188fbab9de2e7fae055afe6f3c7be
-80ae91ee04de86ed38fbd90fe76160e9eb222cc28c11ba39c3ec6155233f4313
-5478ddc2fcf853822921c9a5dacc1bd8a11858ce9af112e05ea6923d4f3af379
-26359d6f9fcad59dd887a7c302e868cf806c3804a997810b16d66ec54bd8993e
-ded40daf9c1326d48d649390652bc12f8df57db93013a53a340d060f8f0ea208
-51ba4eac5c3d3afce0dbdecf1b6284c3c16c5529bca906a4cbc295fbaa9b2588
-7d5c2c70f6d7e0e0b52c4c4f8fb406e03ab88787ed35f9c5d95f6abc995be12e
-9e51fd4f7771512064a1b2ecd96e89151cd5e135ed5f5ba07a16bcd4e51a1622
-75d9009dfdc4ece7a5bd9561a46099f05a8dc8f350069aad74aed48f7ccb4b96
-4cd0366b94ee152fbd623983a5fc38b9a68cc3d08914d2822e78da693b850b07
-b85a17793750802f661978504694e3eb4b5b2fea34b48eca0a8c24ef81d29ba7
-f6622d6be3305d90cb2af2d67a665c9acb1159a5b34353b0bdb0626a71efd2f2
-56188f41f6c85800ffd51866fa082561b6f19153b8afe445f88b4b7f15f8eb6f
-757743d88a687e44ede5135356e211c8b155f12ee7aab0f9abb94dbc3c4a5367
-737468e6a095481a76d16bbbf8ecf6ba56f710b1d18af7ffb4eeb8275e095d76
-743da78c7e97bb5531a71f00ae8e8f5dabe1bbfb651b076aa72fda2d8bd0a645
-b4862be4c0d789d645234b46286cfb807982101600186720180ccbf34d64b0d6
-232be45545cf2f4bf0d23dee4548208296064165c34a52e734155f56cde02134
-60c4aad2e5d9ed3b44a42dc897482d4a1f0780210decaa5fb38ee0cd00a8254d
-239b98ee8d82091f45afd8b2c825af54d78e1dafa382275da5fc8d345f643df4
-e4822123f04d053b026bbb686066674630165f5f0ac094d184cef0152242fed2
-fa7b4bde415c3f9ed71d34f37f59a132f8255706a3a4777d7af1fbd4321c86d5
-bc0fc80f4ab662c0f1e59689b6ffc36d81e9349ed7b762e10d85d7294e7d394c
-616f67dc9624951164f310307ef5c69db573794a6c0c67dfa180a6bf62df1194
-63029907d339f69af39663e8346d43ceb7433770a42c00c7ac49ae623f4773b4
-20205ef154d2bf9053a159c374021a8202b246e434164c4353e96c3055a70a08
-b890bb0bbdc381da324c1f443157880753f7dbe688640f35d012d011fdc3b84b
-530ed296eed8c3ba88ac312a5e94d23c4a6bf5639fd103c14db6fd71b6751d57
-92069f67cc142c1533e54fcd76109046f1acb94d66d3ead2ad35fb9e3e8e349e
-dea50fc8fc4506446a8ee556f8c6f3bda2bd502518bf237a7623bca8e81655a2
-22aaa7d829acdd789664f32ba972b6dda0b6d69340ac6a4840352ce04049b134
-e34187426220067f15168f593bad76800e3687a9ea99d5d79a544adf232bd90f
-205865688bcc84739eeb804f99f354dc932bedda4a54b0ccea94d3f129bb5978
-60a8d881a7b017c3ffae7c8b5ee76d09c8ab8572c81b994d49c2efaa80a5f2af
-299945e831d2335d669c596b4af8e9f5083f90d7846b9be991430e7d396efc33
-c232634fe93d5bde557879b106ac4c7a124d5cfa47250a666c2cc9ce0a158d37
-63dec10be1648ffe60b51e94e8317c71c0553ec74889f87b71c7920fd676e09f
-5f21a1fb909ac44dba922b62597681f9e9323e3599473f39e52b1348bf585cf4
-2029944d229073babc0536e8f4d73c8cb49264e660f0df5f606af0543a1137cb
-5c5d008b019d542bdfcdbb3761d8dc373a20b76ae2b4885189edfe5bfa1e0599
-8fc793a9804ec309b0024a04a3c24a1efa61b87d1bd95dfb688a6cba47fbfb94
-5ec8770e1ab19a879891ec6318981d6bb73234675a44966630f34efbea0fe1b5
-a585e5ffe8f6d58ffd7abb3a7a13b0d532fcd8cf878e57cc0dcb761f291c5536
-dd8222e8777f112bd7c5d9d16e7ea46b00bebba2fd8870fd94282339f7298c1a
-cf2f3c0eb7c203181b55043be782b79c1e33a178c53a7d09dc2ebbc3b338e5c0
-2dd813e2a456d88f4b658bb35c6ccfb1d51f83073cc5643fc3f98a6b712dab8a
-a41ee7183668913669d13c9b0cd981f1b6fae03f47961a49e349bbb0bd62f47d
-5a0d4c35a9bd80945177b33bb07ec5c92d03364649fc8683d1fc202c5ef8ffc0
-d7cf9ccb7589ebcb56f2ecbfe6a46a028b65889014748d56968746e37e9b4310
-7eaf668a9a949c851870dd5564e29be355b75f93496d997929888f451f4ff7b8
-3ec717df9865ac5769e8078669da3063645a9ae0576b5576bcfa3c1cecd8e82b
-6a6727448ab8e6d5f8a06b08c885f59fcb66e918521c32d006aac974c10323e7
-a1f97b9cf30c825c35483db7b5196744be5f286fb9814c7789ad4b1b397e00dd
-366b5b80a7e5aa28cad3856fba593cfefcbfb19bc6227b79c252936fb8f2d49a
-2315ac036c6e08766aa2b287b6e0a5d851cc66afddf1e577793209d2dc75f2b5
-d8050b0cc54efc673ee8e42a0d305812a5f89979478de4c24896489ee3df4328
-a585536232e065fde26e460fc9435bc02445058d56ba2bee0a7b54e359867ea0
-5955aabdfdac296c39ba589f11b3d2d9c5e3b7508fe43bf63fccddb5ba21bbee
-4269b218d978b5818751b2ac06871753c511d36f82557f561eb95c3b70f712dd
-fd84fb5230b503222cf3a17fe8fe2666d1485419f4ad7bcb32ff66396d929d3b
-207df2d811ee6fb1b4392f8b1a993dff3c254ac865a5217a459b24158269a889
-2a868c6c4fa9811e356371695713123d01a261af4eea0a72061137a17a93fbb2
-151979e29a11ca6914e3c6ba7990bd0ce58cac96c2e84927d1de1754a9d56ddd
-a0984576475946f63c2c454bace266de5a6f4487a03ebcd1fb0df6fb22af5434
-6938dc41bf1517b3fa99fdc97a8d09c320388fe718a843fc3d7ea5b5ecd27985
-74b38fd9f1d21f2d4a25d0688b7d311ac747b12066a7866204b91c648d51a9d1
-b67e7cdcbe4e4489948f9f70f6866be1a92b4f7931a12d134cc82fdc4782e8b0
-d42822d2fa5df15b349f8f8bb4f56125e5a578b7afa2f409565afb59cecb9952
-aa42a7bd56fc954052fd6706caa5fe3ecd54035f2dd9e10336543f4eb99e3177
-c0d3b65b64252b132e23df390875a3a612823d62959128b25e688fefd781df4c
-11a205fb7337c83b3191d7e38bcce10ccfa3c411bf6384c456e7d78bded31f8b
-eee65bf5dd748fbe4f70fea9a542f894616252d9d809deb49a9775542e613919
-fb07e86d16b3f51736e82d27dfbfed036782ee3739871239e34dd7fba8deccdc
-78aba8245f945c5b2dc53e2cd2f1354a5495d4a002878dbc7ab9ff6384d9d9e9
-131b73814ea9e5fd0b57889496763d073fdc1c5433be30acc62f3fca83326384
-5bf724e35bd947a611a7bcae04648298dc434e415b8c1236aa8bcca1be497a05
-8a0bbf35d224c77ebd7ce63a69b21163534c00499f312de6cd1d63112fad9c4b
-86d437a975b0854e35c68a0259e0f9aaff4ccaf3938a2e7711d6545d75f264d9
-a1a00d8407b8d2107183c2cade139485cc681b1127304fa3c40d377dcad69884
-86593525bab6ecb33e02c7203e75255b7e778583cad2c2bf8d5da414b37d87ce
-2c230c28ba4761ffe92ce3219d5168e54fc89ae3f1ad70cbc9b956b09ba6e3ee
-58e57de7b56d02a9cf7cb8da0d6ca2c3076cb9130165a2b65bdbcbd47c31ac3c
-382e0227ea54e52070ac8f126867360726e1124415c83ff1e64eefcdcefc0ce9
-54ff72e9a015e02e4bb8b9ca0e04592c833cb2cffa03eb0447c1cde397b2ef92
-2c95430ed3e54046921ba40bccde14d4ce5a0fbfacf25b2c7d7024545c4b51b7
-d03f662a87740abfe9248449753a9007deebb387d7e7ab76631aa062f79a434b
-35e38c577bac6a5efc56772255ac92326adf9023aebb17d8e073ed683a029ca7
-8da3d55197392554af500283b0e47611a3e2b68c852c349996113e47742ac3fa
-20e61b641e29eaadb4c90076d2734ecb674e64d25e859f6a085bccdc22d35885
-ba0960eb7bf1072bbe291f9b1d1ecd7935cb7656ec6bc15d64975b1c506180eb
-0dbb33dbb74551622ea37f0d813c71416051d0ca33dfbbd0d552863afb7061da
-a359160a493ef304656fba57239ab154af8727eebdca342b288bc07ebed351bc
-f276f5e6c1dc9cbdaa91451106df45822393a8eafaf03c3f024b20dc0bd5e4df
-43f3c6687f2019d642fa79e8ff88a42506d1d7d6b9be7feeda8e21315efe471d
-59bffa506786dbdbcace04a8fe8ae423a27b4b9c0c1b8dad3600f5bad7bf1780
-759d7cec3cba13cbf618a53df36c5c2702a38c3af55bff63829ad7f7ee534144
-13f4d5614c05b140de29a9db8135aa108757505841f855c24761c2ed71f89642
-041c855fe532013d0febf7a861bd8b019980fdebea9b245fc3059a8112559970
-a62fa095a55c638bd7a2f28fa2da186d62f130791e8c34e8d7dddd1e9cb6319b
-cf6ec3e238f5c1312e92b5dee3dac520eecf315610fc65f458f9f48b0dbc9e93
-b1343008995ac25955fbb881b051114ea5ec4a45a729fcbccee8da29c4798237
-5db572fb7eccb0ba2b41371686c237234a8866be9f1017ff5d151b931248b9a9
-d279e6faad1cee0e2c94b424be49aed7288311ea1ae5f9612bccce83e65ee68d
-00b3aa5358cd9fc62688a7694a0e4de3135cecd48721bbc4a686bde074832dce
-0f0c31099b35cfdbae50071d2f4c26b55ae51b919c4c1100a02927ca59cef516
-ab603d631abb6ac0a5bc4788bf8e53f22f83dc621cb82372ed4329f60e180c17
-e27e822de8a5ea5d3fb9e0ea0b2b96f1fa398392ac2e001721ddd7423f19b967
-4053cc18287e2ba5a3e2d0a0e80d93ab99b0b3ecb3afe71f6a384f62b938c818
-17462294d1c9b17ab3988e7ae73f3efac6ae24b3ff82df6eaa285f3ffb3248d4
-fadaa73b7217b0c1faf8f4dde2c53fe9ece617950bca9b3d66f0251536963e58
-15c6dff60754eda6427e43b0285643c0a619b14acf45da5dccf94a2332f99752
-dab07d1417ee757010e091cce4143b2053fbb276f5e1675006f3198d865b483f
-f4f9225dc95b47690742826aa2c0798e8adb97bcf983cacb4c3037d82a0afc4f
-5596547ffee1dc83e7fb94d3d14aa19e70c4d9bbe9f0cd519cfa91ab345f0e6f
-ef54525efc326d87993e8e51c9472be3b346b06d6a05b93b07e04c45779914c5
-66ae97cc9286e7218b9dcae206c48f73de2df368912f7a45602cc3071170b502
-93d8a6adc85da881ac3eca963b02849ae9889eacd3129678dba7d032d465fcf1
-bb50627f25cc2f290e35ae4897cbc9ee040e66db1cbd80025ca4188fc2d22d30
-38f7cc8e488b0a769599372fd924ae386c18bb6313b6dd7841302b8bf688ee31
-4477d11eb74b2402dd2a4dc51a6e795c141eb38a0920d6fb582abb07aba1efa7
-d28c7e6a7b0952e1ae2ed26de402f712c27a96c1c51abfb1f5d56c0b67e65cfb
-08adbb2c7f725dfc14c054c84e875746a704ef41122f0e9d496dc36d38c80861
-17341595c9c1097bd547bb1f25a5a64627def63820479beb5780cce34dc7dccd
-1d5bb7718177f49c6858c94178ab5dfe5a973f4fd9b621220c13f78aa5d2258d
-25cd8deafad8fd1dbc6778ff902e36a3c190d60547fa62f0341250ccbefe8647
-5e4b22828804d03f17f54549a66514f6458694b884a8a733ae55975249810acc
-354cc875ec55260386693c8ae60160d7af456e43e8b7a3cea517dc502a42803a
-73da983f7a78d086652d3e0add8fbdc7c9c2cea754a8305b9b79e103e65b1832
-a6a024a5b8fa8c77edcddccb5beefa3c9d1d01c37a74a08953642083851fcbe9
-4d8bce1f34b7c71b68f3247eb463e7a2fed1bda308c877e91a86d6052ef9d55d
-06d6b83b9af7600d61c36a6c460cb43af1cd5bf65113115de83bfc6081d1c0bd
-d88f19949680caaa9f48a608fc67deb98ce9577f24f1c2184530f78f788e19a1
-5f17836d2522fc9859b80d7a3c032f533bba7210e9fc43740dabd27fca4c0a84
-fb0b1849a93c4a09c58c553d0e910df0b2c5ba53e8290a3fe05680cd7c611bac
-2a82297a1d42e400df434b476be5a2f92aff2db009d26dc81043bbff997ba7be
-eebe8ebd761d56ec4e45328dc273f86f13bfc0f5139d908145acf933632b4f78
-aaf3d1917ff63904f2ec971b5b2f4ee6251c0e6500fadc45fd9aaca127967082
-a61ca2891a40763f1fa17f5c6ad3cd1643be1c088eaf4d91e328ebd670768dec
-dc895dfc6a554f7428b5423a86858aacadbc8819c0caf25ce204f98976c7f18b
-071b79f03d9be136d36b51fbab43d7b7e4a6b3792e3a0c39794c46eb4f4e27f5
-e805923bd6c4c5ea9612fac86f7ffd3b8ad343d2492b8d9f052baf864747fcb1
-b6465f1b1b7e020684c863ea38668c55ce6958eb6bdf0509834ee6fe50864116
-e3160227aa042e26fbd6629cae19d0435b19dfbc92058f319de60913fa956fd3
-26e76b5635b9f4d6adeaa45f31a32c99be06343571e5176e8a89c544f6ea4572
-964f1787df93981b88f68b4999768d382128d5316e83e74643d70a2ae288291e
-806d19b180582e19eebf8d295ed214d966b5282e93c32452d58805829d69add2
-4d9ea97d33da81df65a4fe30ebb6b5b8c9b5102ba616bc2da448eeb0f0a93762
-a40521b52f7387c535e17069ffbaf80f0dbf57b296043367237fa4229ffe30ca
-938265084c735ceb1fcaee87ee82a2aadf9efbbb4cd80168a0f975b913a236f7
-22fc543668e57e0b0cd201b099834b660b49673d12ecba4f123be5545bdd0df8
-4f1f0e00c46c679b915684b51995d80629cd4485a67fc28a18416a3639b11e34
-b40f292a620fafff9e21b31c85779e885f07fd8a400f84235b585634d233834c
-d20801ed4b4973f1e91379e451cd8d29cff2b9989ced4fc976536446fe2bbe7f
-f446c5f791ee401cc5dc916d94a2631396634be1a2bbc944da4017ebc4e3965c
-e780b758000c9928962f667300812363c761d33f868b1b8753adfc3e77666e04
-c1e468c04da304f2876d1afde4441719c3687c19e75dfaa44bfaa64bfae835cf
-501d71ff247d1dd18953e980c8c3701e1215c588ab78b27c41c35c265063c5de
-6fed78259cff1d0c848272b4991c414e94fb052043e0a7fd59df65fa27941e06
-9f1ffa2c5f0c32d0ce639ee9c4a5ffb288b749094c464c679ba3e39a11a19cad
-1f5192376ecdc9a9afabba7f4b036edcc94e472ae1d1aa64197eff0c87dc4d97
-5fc283cf7dc4944ebc13bd1e937c97e59f053633c52afdfe1495953740578168
-5d137087920373603688a3dc4ad18137b7dc38d8f94bccd6419d9d356d7596f2
-e027ff487fe91e74139ed748df7de8c3db5fbbe0e724bded756113bab6047ab1
-574e67413fd8aa1aa851d1841d7188685f0413ce23140d869c822e22ea13aced
-4ba4acbf0d9b65be4227d95e84944ff8de263775659eb52615d6ab62319d75bf
-805a6abd316794954d029491f9fb47110ed48760f7b39a8ac5b24841536c2a02
-2555eb6dc69324f9d735e5f2421c2271e6b2619d2515e035203778cf0233bf7f
-e98f23bd109cfc4ec0d01e3db3620b1b9846670bf1a8b2cbafdf7731f50601a0
-214619f59f389d6b1e0e0f5660292dbdc7f2a31a3370d54ad4b02d13f81a2f4d
-18b6487425ac00228266f1027a26e4903147213a7a5c29ba1bc748da6385d919
-dce09b00fc655251eae84d6f56ffdcadc25d8c22d5171f8c00ba8b61f151b985
-6d55137cb7008061645e8e4f2315c1553381147cbf7901c4207acf851ee2d34f
-ac0bbd28528525aa65c6321cbd68bc64694838fd81b20845de3088ec9e13a886
-801a40c656766860361e04ca6483aba7fb9ce30339df27fdfc44b34fc3db554b
-4e4ef91c3b7ba7484cdc036fbae749376229a608d1e00913c03018e247cd6346
-9769dfdf3012c2f562905d9da397bd007b2c81c47b8dd3ae61362fc8661dc620
-bcf9ef2561e3c342ad2f3962ccffe8e98e6d62c65fd9ab872783dcfa035ef347
-a2d0d61bc2ab27e4f96f609b91ca099895354ea9aa11881944c99ae187fb591c
-01cccfaae4247c6143689dc9da0224a43c2ce43b97d49c0caaa14b838bebc579
-37fe3a2aea774f1b1cb928d69b3cb31f937ce83097b12d6f76eba9be803c0a31
-b0bd8de2b22489e3da1b833bbf7524252d51ccf76088fc4125e1d0e6d6815468
-547b248d16317095d732d1e9276d063ab7665d2e684ba272af6351a737cb8751
-9c74e5c624c79a852a39bc22446a87c09bf4ca365b1d134c7d6ab23fb5069d83
-be00745f0672fee615dd8071b8ccb31a4866853d7805ba92c618d2b849ffc498
-6fdf4abc9711617d498fe7013936a85d12da318bd0b4d2a2dd715749747cad04
-ed570e583b2f33855af8a8d1437d389d6e9b3e47f9de9de4481c492a05ac49a3
-457307dde03b8a30ef2edebd60a5c556db43bff4854b255c716cce2eb9559a95
-5dfb185e18a341b0776d6c782c98675aff75d2fca752e915f58e5c9d0f192914
-88e46db6a51bae30403328930f5639ed29396895778431543578109c917e5730
-9c5cccdb2b6de16a8cbccd1bcc97556e666701659a43c5af8848fa4318cedb25
-67050ee249eb8a7fb5c210eef38be485c82d69ff77d68982222387a04b2d08e4
-48aa0d2dd0201a1d06b8bfc14169ba52d34bbe65a03715df03259656760f90d1
-043474c465b5c900b86461c5e33a5f93210871d0979fdb5b26ca1b2409c8b5a2
-9ac23b4a69053f7c63efd9c9d904472e1c387f97669a830f482bf3658403d095
-9795695185c1a677fd24f146a4c01821377e35373c2f29252f2d33bdb4c2e65b
-54f6fb2a74f4f69c8099cae259e3dda70f680d76027e951c523b33adfbae41bc
-33940df06666a88153f983ffcf016ad439a84cdbcb32117e5e597c541e7192b2
-11177afe54f0ccacd3b67c10d44ddad93e604585a513831c8ba986971b189295
-843caa12d4c3066951a9f5cb6fcaa07444e4be618b3d6de06fb7754823e62fc8
-a87aef5f867e80fd2bd0c699240cd59203136efc3a94eb3259f68a81e923a78c
-8c30c38150bc808b7a0aec0e254e623474456084331837bc16ef060780df87f2
-f74fcf280ff478a04add5a41aac7dd136afb9a4721cb04f1a54e8ad7c886cef7
-33d14d742c292a307b8c50ed8c16756a336c45e6843342a15ab362170975b429
-3986013ca616f6728ec65e0b4ef1f4b648db8f12c74e38b2164ff0a056b53aba
-a218e7ec36425b4e8dff37e420ca3e1ba16c5bf6adea301e6039b596f3ea7b29
-df568fe8c742d0bcafb24e7f561c73aeca87ae7cdf7ba2c4173a5fd76f941586
-48144781457282078513542a6ab75d2dc6976f185604e4ffc7480015d9feb000
-46bf9f6650d702058dda7e4f410de647e3ab2ac42561e4c73f96a22fea4a31d8
-f36da788f42ccd7ad66668fddac36c37b800b19bbb32721c40fdf1a523a06750
-86de6580a675fc5e254d782daf7c903bf2640aed85198ffd17f19d91ae85b526
-448d14aed5cc66dbef9b510c9edae9210dee8f44670b4ba2945dd98a92d49fdf
-b884118efc1263ba6fd2712047df194e12e107b793287007b57145b54056cde2
-e8310ccb234ea73ed35cd7a060b6088fddea99c4d93827a0adbce5d927faf657
-d3a7f8a49626f9ed40e1e3aaae8650268c4aa85e8b51f63ebe592e773306deb7
-c78f80d5c96968264d0001bda325f560e664f9be197ebc3bbcffcd0ae6fba5d2
-fa83b6da0f8a6278c84530e657e59ecdd591660a6607eae2191a0fcee0e8b8f7
-de61cc07fa55dc1b9bbb98930f93b1d9419b84e6e7b8ef2595442dc264c65746
-1bc7a160af243059e0030a31740a012b783247420967746903bbf44ff2b33aae
-487fce9e1b54b1e67fa272e64463a796201b20b6f123bdacc9f04ef881b16ff0
-b60c151419f090edc5d95ccae9773dd1909a37fee6bf39f2fa658c1da7a3ec5b
-290f183b4ea95fc6edeabb46b5f518a63d7b8a1e2e0b8c1eb35c95963ab65e55
-9720282fa5e4989ad605ddf5543f50382f539642340c26e379b5325a1262fc57
-532fc4e6a315aff2d4159a0eac7fd498e09ba2e64dde029f33402a21f54efc92
-609fbb36907d798a34c86644264e0ca3da53639e262b49be5f3d212d36086fd1
-5b68624476c0ab1f715d35907fb19dc62625f59b5e9e63cf8fcf3c3c68a6e480
-2d927018240a8fe4230922bd0a431d67664753d51d4f5ee894b5ecf678f342b8
-05b201c2d4540e452a1be93da7c0137a3852709a8362355935494b1401ab73d6
-0c4fe07b2314e63db3005a40f4b36dabd0db3eff936b0a1cc643227ca4fb7e0f
-a29ec03ab4610337bbcb63d72f42716fab0a3058dd961b2f291293beb9126000
-a8009a5ab98b0c7529c0e2c4ae27acb684bc3c07817a2d13c672dfc6cd448f2d
-9c8cd5a1f597039ff2601d88f2b3dee5980956fada5599c5c968c5cd2db83a9a
-e24e2a9eff9d3a0a488f3d7a68cd056a6f8502d6e5a61c305fb99416001a691e
-fa95afc08246bf070268f62f8ee9e4ac8b2d812a728db372c62209fb6b5f6789
-7bb1443ad5241a004b3cee1b9e1671d5de56ad5491e42ea7325cd718578a44ff
-fc73f544a6b0b1df27c39e213379a1017d60c11a5f8769022bc8fbec7405f4e2
-bef06c1962e4b4c45a1e080ae095ce911736f220831a2bc4c958a607b9c88a05
-96beb76fffcf4e469e2dcc09857bc9ea5687be77e1e392f416f681dbbd8da68b
-f378547ecf9648c1b95005bcfa1872dd1e72c5510bec48b0e411ca163c8214dc
-0efdfc1f08e925a5bfda8e6ad2f9ee106ab0a053fab30677c6ed7992899d3d1c
-30f11e59bccb1e0b329dbe5415fad4b7e420cf9c2caa8f7a032d5e9f9558c2b6
-80f5e6af2158a8ef1fb1e36554ffcff934bda7039ad926ab6e12555d30f76f0b
-e98e2e19f12d4f4e8e5ce72e4b2928c396b2e9debd44b9bf80e1df5acb4b9097
-f6fcb00e1ccedcc72e494e68d55151764795949847b513c4cf8694a759f1c5d3
-c6884ed10626bc8eef3097934426e7d45b919ec141b9ab389746b6c277469d33
-b82da2ef40123707646ca62adfeb5828706b571e160efc63d98e8e30af9a7c6a
-4046777b2a7c17d08e0cd5e1b79c261b60cd86fee6668f6a3812c6d1bbe85d1b
-53a79f0ff4e19c0bb6b2b07c3bc145727d25f9adf2f6ffa14e74e33f21827092
-1ff9d9227d08e044cc750d532bebf0962b6f65aa2d50fb238ad84646d16fa466
-3e592b1e3c21b07daa5e8978793436c50b30f31b17f3b8c3a8a9c98bebecd6b9
-2ad5f9a99cb4649d799dfcaf8860759ac26182ed3eb6a82a980232a426fb7934
-7869b8b24c966de308f669ee47f623b95abbd9f7d81e5d0e81714b6f328599f7
-5e7f9a85f92f76e3df446a7130fbd7652d17abdc021fcdc761f300cde20bb116
-e36484ea2f2ff9032bee64fffe992b4c437845edfa194bfa3388a22ce241fbd8
-fe8d0549d2bf43f0ddc6b0606e976dc36ec055c3722d7fe96a7339d15f93befc
-74b063908a089d9684f93364476f9694a9a4a4e46100a6d5d2f3ad34702ec2cb
-e64cf76d70e70fe725eb25780a3dcc619c3d3d1fab7d93ffdf695c9d2d86a007
-ac11eb3d551592ae551cda8f78ce2f4a06c798b6bce573d35f9c01a775fd3e6b
-9d6f2eca089b11c38b812b9fc497c58d96797744d9a433f0f0f545bd7b4b6ca8
-ba8011c1ecbf6ef91b1ff7d016865871a12eb9ff3f55e4052c152de96bef6d1d
-698b9918a8a68202378374097d8ee27f153aa3eff3c6d49b67d8e09cb51b9bb8
-d18eb43dfbd8647e4d2b3992810e46ac719cbff5a28be6532b39c2b462620109
-f42cf1cde4aed3b9f78ba888824dd0d32778be34ef4a7a84a785ad7920621a25
-74376e0faaa0fec39bdc769f5526fbb3f620b3926f6bc749df679115610bd29a
-fbefa357d082db7719a75b6396a01b775bfde12394c4ec0a0f75ccd92de8803f
-ec9f408861ab730860e0309b3f799eb7d99fae4989c83e46639d08a662e71ede
-60aceb5280b19a7ded32438cc1ce140487e52db031e53ffdf299d552b7f9556d
-438171ee4787bc6b445dd2bc23da420747f6e81046e715dd6f5cbd9a97f08deb
-a742feadcf5d93c7c2557e69b45a505b91ac6799e37f40a2a70f3d0c0885f85e
-cad7f5d5498c18d496f84010cc0da7fc91c4d1eca61ce021b3f204ccac60423c
-269631a05d330c8b4574754aa6019885866e0245eb7efcbd747dda328525cf9a
-3b13b29b8752df2c8c30c0bc3207b37948c30a2d037a29d1ce075b778db6ce18
-551facc66a4032c9479e5122ef759d8c58601a572b0a02d8c606e0f4df80f411
-ff5c60c06c5f263375fa7fb67b6f670a453bbda2f41e71c7da09770162f636b0
-108680424e1d6ed498acf2b997dfec6d8079b2d26103c67543fd0bfeabeb027f
-dea56c640827bcf1d5c9e353e30b46ee9d3495c9af5a6cac79703aedfce3a0c1
-d4ce1b20275ed9de111473494bec7da5d579ac5260aebe9a0cfb7c6730bd51ef
-c8b8343166a6ea72e0c25fc745b2c425d852b6cd9e8e2c0cfb16be2257bf6933
-86693e380a7eb1c9c24f193620d886921945e5043fd6b8798c1105ec40d4fb82
-56cc8ed9699a1f84d7438eb7447ff6112686403c97385442c3d34a9187eacd1d
-dcb4b5fcf4a11e90baaa10fbd457053f5270e4cab233f41f56cea906103c5b3b
-0e7e5f9b8abaf1d66572ff8b15e0979926dadd51de964dbbac8abc813c28ad71
-4b14bcc1690838b6a2a33a4045e7ae481d679178ff87b65d5e7bdab7bd59b536
-331c132115020fd681ae7705d805023ef790e163ec92f41035e28c6edebd276c
-d4de63de8141cdb8d77b6a657713bd1c38f02ef1d97dc791883e15d96b7b701a
-2f124ebb9aa3a2d90dc825470852ae8a959e10375ee5abfe70aa5a1cc6cb58cc
-df3ccec83216907b8b80ff54f35d53a2d9c679e61c2cc9d8b3271c597d1cf153
-f5dda0a71eb2d2ed289a5b0d8eba301e7a4fe05e649d53cf3c6275c802b88fd6
-5508933966a5f261c898f755a60d7d3c95223e470b0af6ca4b2a57615c3e2465
-f535753c0c3d21f6cbefc29036d3e925a4b6216290abf8ddc86ec955157ae441
-6772fb59eb3b6280a78f9183bfdca096d5b46f938058c03b38adeb1b4f4fe848
-ff24ffbbab3077bf50b1fc474688bcb05d9e07294f3871bb2c0dbd266866cda9
-a22b2f3638e7b93d6eece65df65835d6c8396e5a109bb65d9f23619ba85ca9a4
-34564b9f706f2b0b7b68518f6e0962e101d6a2a83565cb1bc4342fcedb6e7394
-4d303d4ed4f792238531bd105fff9aa61c29bccd5d6c6ee399b48ebbb5bf3932
-63de8e873dd0775fda5861d1a9c547c01fc3cbdb7f9574f14bdb1e97280c024a
-63a922657125be2d5f975e86c0e4b9b6174157126a9a06839530543f1fefb261
-143c666c42615933aace075512a988c9f2a46a449ec3b13fd118b4626e2a047e
-fc90a20772c4ebe9b23eb733fd45dcd20289ab7d801aaaf5fce13807ebc84420
-fcf927bc88e48903f17bad04fdeccb76c7e2ab93e008321fd5a83a39b8325343
-59d4cba664629d807b624ec727850bcb92043788a855a28e86aeed0fddc4f6f1
-fd11b6f00224dc2d88248abb9245112914e92c933800336c75e10550610c7569
-e09c8a3389f88d25cb30f7be1a6accc5dd17b02f141f729f1b36d32fe93b4ce9
-75865054e448fcf1ca846bf004c1c67fb3c48a4ad2bd9f1d594e4646eac106b6
-7e747f2e64fddd88d076c03b8d7fae26b53dcb1027f92fe769a8385e7cbdfff2
-e569a107b76e592fa59f8d92e9f009ebbd872a09f3fd3d9746e8a8955634858b
-4d4d967be07f8999d7fdc0ffed37e83f865469901ea075fc27e9a759a50dbf02
-a7a1d7031c78c9cd66e359459469e2896d6d4fff36b7b2b510d66761fe133053
-b2d64c8199558288054b842da2816588a898e05f2db1a5e11813ad89f1660910
-410c531faf42f728cc1b34188084de2578dd0f5458bab3c17da610b7d6afb635
-8ee66f8094436d0c4896550753f4a06cb566188ef59b536ba03ec04ee8650a3e
-3f3a932b61c940bb0eeef0ef7c1301ba52e59a904542ca2a9bb82e1e03500a04
-f818f8f747d3c431686d543e47b14b37cd1e44f021a5da657aab08bd56cbdd7f
-453c331b7041958d618d4b007f5798cb49260ab59801977df6eb49d3f1e609a9
-c862cb2a297a2acab8d2ff5263f40fffc73078e777863f7947b0419b6026b7a9
-f1c14bd344902c8837f5a5c6a7002984f40607f8dbf01e9caa04aacab39ee10c
-0509c706a04db09e08ecff57cce67da05ac8dc14f700b2ff731d0799236646ba
-68f305cf7f79020dee5c99511a37b63a693339706560635dcc6bc14d5d12ab98
-4ec26e657619d2c6d8f6490e55d3219ea28c69cc92c3f67bdc437a77fb9b320b
-ac18393b3fb793c308e92a336b174f7355710966c2cd8f1f8ee6f081f0c3031c
-58149c41849c763fc6395658dc43c86f5488404778235d7f066b3654b9e04d36
-786c1a766e2a2e10f870246bdc94e9241267d7b71c0f4acf0365d8f8dd3c1c1b
-178734bf1ccb8d202929f2e956b4f27809fb2e2677162c978fc098584f510765
-415d6254734a525d73c92050c3a2dac12e1c037eb2c1f1ea479cdb9a2da0e899
-05b9eb18eda7a314654f7ecf608531be3cc30bb8abfa03102a670b87b61eaac4
-5af4d898243ac70207fd1d5803138a78744528a47e9e371817674f2ca6b97a59
-f19fe641e8e121340daf52a2ed995658806777619a6b6dee640a04b63ea9f446
-f4dbfb071cb6f6b4d82e85b4be34c39a4d2dd417aa93e07fe3b3ee3b53644510
-4ecfef4e1caf7b89c0ec5c3ae61ba1e958f114aace905f7cafe7a2fb2cd17e91
-20275a058ac69193c471ef47490d21770792563a63d87e23d8e1e6158fee9510
-eea1d2bbccd5f8e28d63c04bcdb78b3a49d640825559634dc9e5625db3b72011
-85de810c60eea94efd5e25a04de8cef3566c0f4b6a92ed6e58700b5598fcd65d
-42c4ea8efeaed8168f36893aa2465f7f6d5d3087763b4f2a53b38ec3a61173e0
-48a4864ae6a6f6ecbfa1e92f15de678eea897b0776c7fd7ba192c7da0277699c
-a1ba6c9516f89ad044c418c24f8af15fdd129f2db45cefe186a20c6abc895c94
-241a19145c7f8652439fc92f8ee142abd14bdb4f80bd43c3a3aae6cc8c77b759
-21b42047c0e374c123d3f631e25bbf1ab42115927ff52af0c3c8a31cca288d72
-126fa5bfc2d54aec8d05488348b72e80b08cdbf483d994cee779296b9357fd9b
-addd288dc5a8ae95467e485a92409afbf3497aad25a097ef8165c40d802bf74e
-79f08b2320aa4b110076d4ebe15d073d0ee1107ed6e9d58c05286c62f4136b40
-4a89129c66c1d1726c99b8cb4ba8bbcb6b3b4e73a11cbf11354284f23a76e0f8
-aee94bbf4d661739b81e3b47d5b4ace66f695001fa09a18a9960d741a8cdcd4c
-4dc1c68c0fcc38416fa6f7877befef5aba8968621ff6653653b3c21c8bdd0c3f
-07b8eede44036cf8a0aaba353e2eb14cdc1341687bbf0ed1d1f910c6ee563179
-95bd02430a3eda60eee5d36abea5ec10e2de1dbd9e3cf96c0366b602ff976873
-3a49d5019640163949e41eb4073fee6681d61698932a4d8c613b686bee37bad6
-ee7f19ad012634c3b6aea6a4d44d1bcc018f57a72cd1b078ed3fefea13f991ae
-e6619bb1136bb64b271c96ac8b4290a34040c3d56638227676d75655abed1eb6
-d709082d70698cbd5940cde861d6dae8a7656d6772b89202d376076e6d530a2c
-c1ffca88e2aefd6c4ba2f3dea6881d835bba8d433e18a067bdb7dde867edce0e
-48d9854f21126726dfcf64cc97831883e35fc429be7c8ed512b3049b40af8114
-35477c782c676d374dd41673af8e4d3d929054f1cb3aae92a20469fcf2b0ebf3
-55e18aa050c89b1f35c8dd7ce1f26dd542d6c70af4501c7486a72cbaacf5624d
-66dda7607fe961681476fd54154705c0b0a2fb1f8adb4d50dcef80ea10b341ff
-d276e9e12bf4a41aaf9efff1b98a4223221a58eeb2c094972c4c61aa9d6b16f9
-a36fc6af6f121158c9e3d3fc47b8b716c785c0699703c91b80a0478a391ecd41
-ae7d56b313ecf34774933493d949346ed190a7a4ccb7e7fddc8da3c77324e9ae
-70af63b469cc3e8838d61784dabede694c35cfa46f1396296424ce3ad1dc7d05
-e6e94624065717493ed3dcf92620e88472118ed0981ffbaabef21fa5c708e3c0
-349c89b88fc10cba39a1807c8c74aa70829126ce906a351203e1542d43a45779
-59e9e65bfb567e9bb7929077a0a1dd08b089ab35fcccc96d3a6d5ebbe4860fd4
-3c936648b92b2d455f979d985bb1af8dca29859224b2f1e411c2cf9489d41dfb
-75dbc22658a45c16da828652dece832db5dd454783bac82eb4a33a4d3b82f62e
-a36ef09beb6683689077c8fd089efb46549515ffc875cc48aaf4152fc484782a
-4bfb4b2f38ed7ab8600d0066e27b03b7c4c21643f3e977d1a9a830e714d54b05
-04e2b7f883e9ff51f49621e53edac289052e44dc1099aba1717391973f827b08
-8b2c076e40abbc61fb9ed2582ef2484e7e07a7341defd54da7e21f16c071fa3a
-51aae26760029cb64ee948c4a54725890907e94804fd221be309b33ec2901dcb
-95be395576cee7f702a03901044054423e3aa0c508cba6f545d1faa5eeced999
-f0f9d4bfc5495c8fa65a1f18aa190bc11ea45ab16140f8ec88d309648c64eaa6
-57210b86df19d8d9ae5b98a2b74ea37b88cea4e11c44f879cab4e7510ce79079
-bf63192ad4904b92b6f622e535b538f246d802e089ef1c8b78666ac83d20f864
-681183aeeb6b4043afef1ad4cb4d5ed2d0bf8fcc4f1ee159c1291050da9a52ea
-fdbeef2e5d5b2579967b4f33aa310f8c726aab7b9a0a07523a3c17174ed67a37
-bea1fa202f75ef9dfd3c597f3d983bfb53ec3d5c0170cf5405ad3be2634315b7
-f823b857f8854bd67da9ff0a01e9950bb0699bc2a4c0fc0387f336ba33d7ed71
-84d531f2b0bf886b562c2ed2dd6fae78762d409ce0cddc96a7161b5b597fc154
-1a1abeb0954146fcd3e44c93295c709e30cfd0b7ed5eac7cc4eeb0e99dc8fb07
-9649645b8c590850ad20bc44eb2c4025a0a568ddeb503ac1c21da965ecf9fc0c
-5631cc74b3b0ef2b9826e2b4103ba3e0011ebfc2f0430afeff63ada1a3bb5568
-55bccd1ebab67ea9a04bc971ec6a055563a71e362ad3cb79d4c1ee5337ce5f87
-098a0ddada02c19cacb1002146bb3631beb166500d1fc9ae7b88949e36183f9d
-86a17a36b0acf3421162cf120180d3a436ee5f6bc937ae7cf18ffeb652c48633
-20ec0d42bf09c22daeafcc2bd681f19bae1f8ef7e15f5e09c4beb446d7578b0f
-49f2042482b785e8543acf5159a40e847b078629e632c5620b86e0e539b6b4cc
-f78da4d96f465ffe472fac5ebf8ea6e68b2310a558b9ce3ae2d16f0bd1a1caec
-e3e7ff8ef1ae81ec8fe81c6c5bb7315165e89d753987eed98ae9f2d89e3336a3
-0fc24c0f8c3f2ea135f6c306816470fdce5d48a229783f3d1f332b6f4ac565a4
-0b1ed85630e64a1ff78ca6b92d47d317064c88124331b78cd6caa7c93f5272a5
-123db565c6b798967e149307118178b1d4a0417c95b2df7d2867e15e7d5574a1
-4f2146a5377247336c09f3e4e5b45db385d7cc90a17543b86d7c1f77bf1c5182
-ef3d26e6e95b7365d12d5845301ee48f90391a8075a80306348637b56f25fb0b
-5ca4f6b8c2041a5697a182773b30208c5afcf5c9acb8902dfeadff795d998cf9
-b3a8abb77f90c91542ba110ef727c7d9a13696d858bcd567ef5d64ac43d26c20
-a9aa27606e9f5770c3cad5f8a9a527de7403ea118c8e43ea064e6a1da9af3382
-38591437dda2a87e80a9028459eb1ec3411b3f24f27630eb7e356ae3548570a5
-8bb9463d1abf3b3608ceb02aacc7c9c06ce283355e5073b2b445bd815d27708b
-4020e90cdef6bf39de645736d0730278dcb3fafd44ce088ab70287d9c767d49c
-8ad8117251fb55718cce2cbaa17d8494369b3ab37ccc50484fe7bf2d305210d7
-e011d36728405d1ef1a73f9e53e33ddc8fd38569ab2bf28cc07d0799772ab6c9
-6b8e28f396e0938dc86b896bd668768493ac290cca566e84a0aa432832df3b10
-8525cb08ca50ea7d71eb8d64e5ceff15da8a9c89849e85269cfce2e09fbcc42c
-28a3d675d9f75d7d63778deb63893b1e7676ab4408719ed6e3410b4e2b783013
-de27eaa26e7318c372ec61282404e7cb9f7b79d2a65f8077f0a7a1733538fa78
-66b32437cb5fc67eae875dd77374d3f2c3c082f2eccbb5d7887e49ae1adc0d84
-0f5171d843ea609516da88bbd906a8dbfa77cf4e68e76aeaf960cef82d8e8f9f
-7d03eea0c16aabe9501fb6c1993fe240b8b4804d92bbab0bfd58b8497e45d410
-033735eabeb4c92d17af8b9c5dd7bbf93ca4ef8010407d69c35a2b5897ca56ec
-920980a1c8f159520e6dc28f3a62d6e7d995df93447fc8e9c19215cef25dcd62
-c9a19e12862f8e3bf347561addfa34c9e85598b68490553cadff9ebebe1ebf9d
-954bb6d27608acf46322ef67b6537ee8ebf6c16b97b694641e9f2858fb9dcac6
-311e198ed43c34aa0a023c1008449186f2659beb9bf7085cf7a7ff5dd048c910
-66e704075bc9d5da90c2d26b14d7ef8e3d54fc72703186a8453b83a7bb4fb5ba
-d3f796de88910b843c9be15ef354d26bd39e1d1503385a169f3f92b16f3f20f3
-1ea9cf4642d5977fd23aa0e13ca82377ec95fa4b908eb0524e2c573e42ecf2bc
-90c51054a9a2e0cc8e93924a3f71edf177cbc656ae838f0542833b6deff1f990
-7d34eecb257585fea135ec1081a97818479c80215e8d5c4fc9ee6e9f68781682
-85e8873da0a1d6e44b3187df9a0e9cf69372d9fabbb11c9cb68b4bfeda609682
-dac5b5e18f004096c42ed39016ccbf4008fbbbb32ffbd970888247bd7d57b1d7
-11d4b5d76fd339fb769254a0833157eacf95703abbaa0936bb10a59e9149f070
-f82daa134f97f0e48f8cf9d508523e98d1e331e159a0c422866620aa859a30c3
-ea9ba48d4553ba65dd3f316bf64c103ca11839f2ace974e4e26221ad9f6741a4
-5004d4e3cd24bb296f1c58061f245792a5999a8053b246568c8c0dce7a030d95
-77824a46638ab0e07dd74ba20e76e28ddbfcfc27240998d418e9ec12cafb7dc1
-7e5916bdc46a59f31b3dca99263bc1c785aad33ac1aa0c57dbfe09d7757867a5
-67b47395f5d148c9ffdf1bb401e216c79f5ea233cd2a5a82c94e24f778c25353
-145ea4fc505c32c168cec430b3fae9e69a921daf0d5b2afbed1575fa115aaf2a
-61f1be743ecd301e63db4996958698cd1f27aaf66adfc853cbba31e0f98d8e15
-d2d643c8a3cae4d421a52adc0cd80d2ec4ec9e9de7bdb1315b52ec72d437746c
-5c91204e96e3bc839aab8833a766a7b05a223436e3a3cfb5c689425360fb7fd6
-508f6993fd4fa79dc4612ff9faaac79eddf47e0da29d6426508ec4271f1b87ac
-446f79d28e672c5c04c6b46e0d1b102cff6b9700ba8fb08b3139d9ff06fdbaf6
-a55128ea0ce3adb73fa00fbfe0450156e9183f6b91889d8e4ad6415f8438952b
-de7ebb125e4ff9c2e357a32d3707cad278b9aacc542aa83898e6a26e7f8719d2
-6088f6be110f7000a3a4b48ab264f84d1d7778629c41e0a2fc2d34e22382e1ef
-e688ca04d31119c4c120da10b9dba2708bf54e3ac3eb183d7f3b5cb8087249d5
-d4fcdfa9c4b71b036f46f720ebc0563f45199eea4cca13a5b95963a677a5b6f3
-3be08c9275fa8e66823fc04c151ae6793919c89185f65140d8d1f6772927b88c
-42c0d16d08d563f5b93e05689e7bb8ea958f90d4e5eff9bfdc7a5acbc29a4672
-f532776c79f34339983ccbaecd33a9daf6fc1672229c0022fbb13ae37f6fc27f
-1107593d8d88aa67c1a76495f5f2e08fe8d1013bad99b694c1762ee5e1bc100e
-9bb119a159392c286fc689dfc0693fb911d42d47a0e3ac59b516115b12884ce6
-6473c70272420338d03d2ccbe9f96e4fd12416939e92e52e3eddfbad15206bc7
-9fd633cff17ef63826879fd701f275b5fa06c48f462f4f5f9ff98046827c37fd
-91e254f95a14b354a0b5759d90a75eed92f126191d6437a81d538c7b55986e2e
-18523bf547845d77a3ded6c69ec5bf558094ddc40a6505c938ef395d008ef1de
-1296388919a9ce63ff38f476d01bc30445338735c7fda0359d03d58f748f4a28
-ccac2ba01879bc05a44fc21835e4aab1204b1c6b05ecf32c8247a63fb685a523
-35505e2be2b0000c7fdcb1604a6d480a1a5827919bbeb66faae78ed7d27fa8a6
-436af96fbefec3ee6e8f80cdc4ba28a65138b6b18671839bd96138795bf389bf
-2298b851db853c7906178a994223f533cf3b00680dde84aba13ef69f8191b7ca
-02f5de337081df829efd5f3f6a435d6d805272afd5b2af3eff829b14cdaacb31
-c179bbf59a3b10454d0b81e0382fdee3cd5c941a2c6e6b446cc7b08358ef4409
-c2a4e6ca109c9b3dfedae8728f60b560ed3ea8252d150e11db2b7fe19c8d5233
-1e8385afa0f792ead4c2ed5d3b0044dae4e732801724de12d360f0f47bf6d7fa
-aeddd62fc5b21f4dbea6ef739d1a005b141d4ba3ad34b9c34257ba5eed4b2e85
-4f5d8d07e0ebb4bc6b70d5a5260c7c0b4cc7bc1044c77e8703d0d59c9408f103
-6737c15b3ad668dc22066a6198967fd8653ba004737f5394445da06fb344a4b7
-43a1debd846c52687e9eefe5e06ddbe8c8126a87971a80d67f4600f442220b6f
-4c41f388645a6fc978c6dea9b31e09732f050e19ffa4b112771741c025d610b0
-6e1f8543890cd4cd2125d9238d008091ffc2e78ed57b9a6ec5113cc8044c9372
-f305f5ec1a992907464e22188c13ea10b1ac76196336222c0e052ef963a1c6ae
-df38e2fc92abc00d5a8b6d8cc608d670636a15cd41da8161e03d8361c09fe713
-dd60041cfe0c82f9df04625f3a8c01f1ff3f9f2d571e406a5775626e3dbb7d8c
-1e4aaf46df0b42e8b8f9c2abcdc7ccd0b6b6eda2fcc1602f0b777a8e494a892f
-d3cb1521199cadb66fcf60e6d9163a2ab0c2cfdb20e897a1f16555d97c2c91eb
-946d05f5905982ba85b77ff081d1c69f73d9014423795c4001af6f9bd2e484d6
-91fdc2a911be3c9185b28f89fae11ed94de19cab9b52e0f52493707e73de0e31
-f9d558e75bea05a5b02f5918e7139ab065affe31956ad54865d0097c9582514d
-99ad462d1a4de2ab2bac081e92ccead8c03318b8ea7f6d6077a779f74173794a
-59982dfb57998a0e64cb6413d774120fa51c165210b3c63678b0204d326db945
-678869868bf4abbc060d9961c03586e3603d01bcb12ecbeee7ef95e89429a2e9
-980c4c2d6165cb22670efdeeab861b9bbea1b10ab948c9e99eaaa7f0c6603c29
-c67bf2d42ea6e029bbe2ee4f48634d7c60cfac1cdab4daec98705fc8397fc656
-af7cfa465ed1f7ea9c0d1c5a86c5a33601d75c0293f9ec0b448fec40e348bfee
-4aa7a6d1293650c7773562b31cb8181535b3e5462b6b9acf3f74fbe01944512c
-feba186065cf34877600426abccae5ce76bff790dc03bf0758b64e5c95010a10
-ac1197e84514cd9df7ca150d0585a09bdbd3dfa86b6c8d328f4dc8ceae0122ea
-d7833cc21d6628c16003f7fa5e28b392d80a246483856c63dd35233cc7308ace
-0bea9a4f2c4e06e544bb2d5e412bfac62ec648f9fbbc488d65ccdb2fb7a6a3f5
-c682b805a16c6be9d03f4551387d3b19ec6f2ad0d2969041b18c0ed96ba90d74
-cf0c9e4c0812f2d98e761afc63a71e58e0eb5f4097bd7e72e7d650dc3a2b012c
-9329124c1ba2f4816275aab0d145103887770bfc9e488ab635245a5c8ac03cb7
-90aeb5eafc4e99e70e37190bb5012a6987ecc403b2b54b0a3a0bb30587e99fe7
-dd6beb3a3c8df7a50b4d5c350d7182e4497354eb5538061458af62d5a111ce95
-08a94bae4a4b9abb53f2d4395bd6fa4c1da13e97e4db15c598468d238b81a78b
-2a24530b43d81dba1f265581be36f4a19b5c51d7aeb0b4e017608656c6ce7cb4
-adcb33a8ff7cc76f7ce54354aa76fafd4958b9e1ec9936e587ecd4fa75e3dc0c
-d25ea85d744d52c8a6228bc4c9718ec43d056412b513e141a139f5c118a44060
-9827bc275c901b5ae9b6179a04513b6c4d039edf8cdb3f2c95b43316ada44146
-f9e7fa093fb2acf38891492cf93e407ca813da0ba34a3da595c346d3354c1f81
-2972d78b5fb3d09e413adcceea264a12da69451a786db4c4ee8f7ee2ebdf0854
-70f04388848dc5c782f7a91e070e1b79776b9254e27f0a0b3110c431f8fb3848
-294e724802de1e27ff3cadb8fcbeb920e7967be152c10e299eb30d632f54fe57
-823245fd26dfca5036c4cbebe443e8a4a21d1e6ef3f1dc6860613d908187ba56
-dd64f85dad9db1504e7f858cb388bdbe829e067c8dec2125c764b79607cc822c
-fabb2b2cc93b4d5dca0568057febf7cd86c72762955f2c9d7e1d734da77b0862
-60915afd088ac2b113aaf06be481ca2174fb224746e26b93175da43dbb72f4d9
-68a85dbfaa81b6802c130ae529ffdaf3dbafb39b4c55317825b3c687738f4370
-621a2e720ca0d5710f3a1d963c424a73eb88af68c3dc7ec0996a11babf14c823
-a3d52369c42e84301b47c9ebf16e33cf02d1cb1c872b0ac7ae59361d330f5fc6
-31f104cf221a3c6d23b9314dbf3190edf21331787a0ca1d55507eb76fcfcb8d6
-da4e2ba9d793d158998c06733cb34dc891a8e296a48bd0c0c4dcdf4fa27dcbc9
-0d7d1ead5f56a22336bdf4818f4f8ee4df9b82223389507725837abbb193854f
-fb0ae2c55d8259aebbabd35a4dbd3433430618462e9f23f91885d0f3ac99bcd4
-9d1424f9aeaa09887c06c6f62e07339b3e4424fc920b11bd0dd53b200c896ae0
-ede4931f85766645f04c94877b0364e6e7e2a0ace71347b8ab0323fdecf82003
-ad75a9390ae1d10ab82363ba83bbedfaf24225141a6033bca3f59d065926de8c
-efcb260f5e394ffab5e182473154b81ea98e5cbec099eff84d53b9348f4b081b
-9f120e5275d4e9490044fbc2a9d275b84a9a40b8451522e79c2fd383d5866c96
-84db0c0552cbb14e67ff321ca84793e8ab95cac35e71ae4e20958a5b274be4a3
-641cf01e9b50487a9263f4e60a7ecf6a80d4e2269303bcf8589bbc7d9306411d
-1f95e0b59d232b303dc030863cd6a5f25c769dbd49e150f56c4b0efee4c096e2
-130321e1dceac61b3f45a808fed8ea47e0354eae9578991d88c58526ba635f93
-591b3f8debb90e2c5a73050766868ab418e6bc1246f9a200c9010de827147f47
-4a9a35b39947767a2cf12774083708e7e7d1f25f75f1c27806a7e40c5f4f8456
-8bd43aefc069d7d862b78bdc488717928c0a283cbd5e57ca76efbadac172a6e6
-28009c10d8047648c549de7f26070eadecffad1e954185ccf9acf02ea2ba7bb6
-0730a1a46969fe637617e9283cf68ba3400fbc0bd9e24dd4ae4f33241451c4e4
-0f8b996eb76d3b47f0dd0ad64ac75b6e12c516f843578290079aefa03c6ab66b
-8063bfac6b2b07d8a94f636626b7803ff277e963222d738a6c4cca04592c9687
-8a9c74a4c528baafa16a2d87e6182b7a6836e901b558d4b9ac7c4258c2ef1dd4
-e70dc0e985661cae6535af3fa04de9be151d75502a65b9ce9ca88351728cddfe
-25bcd365d219ef27b7986cbef39cb7450ae28826530e0413108d08ce5c624dae
-b1906f7fcf4d83c91dc89a1165a1ea5470ea14a91634540d7e37379d358ffdb9
-38d3c40cb195be0259757ad84e0bff7271d666c62bc9d07dbdc2f463f0cdba3f
-fd33bc0b7b566934159b77ce59a431e837c913cb8a3159b4b665e0f0cf237dcd
-69c056d03b39db46d40ad75d31a1f27e28af37c0a3d95a6bb89844cdc60939a8
-a2827f7e9d64fad39befbea536b519ee61d1db59cccd0c1c62975c34fbdc4fdf
-a2c85d3122b83d27a81ee97c81d8c1e280d67fda2c89bb8ad5f9e34c4408278a
-20ce29f25391b4aebaca2bfa94855b58e53180cacd548d084cccdfe203399397
-3b34eb9758acf3335999069b05ca7784fbb467619bd48008c129ce80598cf595
-2d2263a36ba5a5b61d4ce7faf05e651d26d9a96ddf4d6e164a76caaffc7b7439
-37c2c332e496cbbe3a15e3f07c8211c9cb6f745c0b95a5bf36c55b37056f5159
-56a87691c070a5bc22adcb697165b17de566c6ae87473faa4329f9d34b84a448
-a93b1ae3c3b05dbafc8f0a9b246ab12fb5c5f21544d790a03b0772c6c07fe41e
-561c04d25290ad18bd24674c5d557dd73a1c022c4a0c3345c4e97ab872cfcd23
-93926ce1f80402e6f1e32a069e26388f85f58a6c2f8d37185f51325fbbcce7c0
-0ea9ce821951358816a3c35d9a3ae47c15a429feeb24ee9c6e91e7e4f4e4bd5e
-8e9020451b587aff54a9733beb5ddc14d478ec52011d172e308149f6f68ef4a3
-af9f56f2734989eaebb7b1bb96153429d9bcbf3ee0a6c2acca62f586b506368e
-21494002e1c972624da592c5e0e9a316482ef500dcdbded7f4d7331f7bfbcb0e
-1ecfe5e9991d59301b062abf6cd8e3543c24e948bfc730d8344e0a323efc5e4d
-b1c037b366de5ee1eaa0a0e74f39c7b1af40de37b4327e620df1bf7eed4dd9aa
-fd15a96128d8f37f1ae60b6aaffd96e806e2c0b29dd43c7c3ccd00d936f76924
-54e3234ec6529a77332b11a25c2242c53aee5e5d128f5805fa007d972eea2d9e
-fa55bb624acd378707405ab37a49e129d003fc9d561ba621eb71f2d1f0342f68
-fa3fc028a7f3ece1d94acf6c4e91eab1656cdedb6ecf4925207b9e547cab62e4
-af9cc1bb900b02d55a89ef5bfce1a8f121d0c80276d61e41bfca88674c65b4ad
-2d66dadb8223e8386d40b775d1195b6bc6207b439b2c5615bac548dcc041b7f2
-2f84d9c3d57bd7d58d95c455d74cdba0dafdf5333988d94aea34d01d93a6fa1a
-a034f7cdc3a486f0eb051a55a39379b78ea908a450c286b6f7902c1542b7054a
-be2449ecf445f56a5a4c2ef2f0994fb3b3adaa35987cbbc0c64ebccd1aa110fe
-379f36b8e590195f4409426ddc515ac37be56a6314537d839e77dca4190dcadb
-e423cc230dc717b9e7ca35647c3113fa2e27270079736680b0abd1905125275d
-18a3ca6ec043b23ba6d9f90b88a6cf51bf8aefe90c25b5c211940058962ec96a
-c03c144f18a1e1b13d5c871c8c5c7ad18b0c3045c7db5e77d6f5ed211bea4b00
-0b8bffd69c668c98bb08f4207a80247a80483fc8fe2484483177d6547bf66595
-4d7afc64a6bdefa6d8c12d8ca7a3acf95d56e6f6098345d3772369955e3ce2f0
-affea8a2475757361e2001976de029bf745d701cf0433997ca78c8cc1d6d130c
-692474ea0a9114359f645f722da96dedfb0bf6d94529326493b6b18d6abc70d0
-c7ab6f8b68a9ce6538a1d9ff6e41a151f37e96f6735d0fb76cee4d502d13e4bf
-4db0ad2c84d44596a66ab1fde477bf14cc7e673d598cffa89e8e8fcb1575890b
-4969a53570793d3cbbcb693b09bce2ea64c33f446f3f6b71a976ec1f960060d5
-b80631526110b7aa266b23eb27b1e565b8f0d9b44f4a90c57cfda6fc917f6efb
-f05630b00eda90f568c583cbe506b9b91314e31b1738cfafce12f8a17a7bb096
-631effaed2543a732fcb2e5d81689982399e1048ff6199ee677e859f36cb6070
-10ea3ab6faeb30973dfbd8b405134c96a6d40d5e278d76916ef4b66d3bfdb15b
-f0dc3f8cc169ca142ae73e778ac690e1038e8b5898f6101ce4d57faac936de06
-890b32c3768394e0d94829f51ff9bd315fc44e33a58394bd5a996ab52b1dad68
-d010935f5a0e7f118aaf9fb42dbac4e642d5b7ef61e43ec2a5b68a3584965c23
-f842dc4cab186b39650edc77dbf52068153c875bd28e4bc30f554b88436b40f3
-1500199d497958c28391846a00f83287fb4e14e508f8954b6ac61c572e634f09
-fde116d3cfb40b73573a969774883c5501d738fc67e3f31cece099996950efc8
-e431c63ff4eed98ab8caa0ed1996ac8530f315b2b62b882a6dae49e46c834b09
-c3c0d35f27be4aaf09e0abd445844c40754ad0c29dc4fc8a3569b182003b24b9
-cd79db88db16272238f9ae5f0a5f0823bd0b174bc25448d9ab253654781a2e4a
-51a23e73e22d714e45ae27dd5e8cfdd9dfbe032530765c0751ea3395fb0c1380
-414ef2cce4944f56a2a14a564e41d9409e1929956625b87a17f64ab0131e55b9
-cc1822d73b578854e8c26ae0d560d405dc8a72ff40b240ce00d52c3d8e74e30b
-57dd3f7686f6ce18805b2b7757853e49f956abce93dce1d2700915c5b2250ab3
-7ee35b1606aad163d121c4eafc2ff9d7648494db513af8aad8a3fd1ad32291eb
-901f9afbe0494a64a99230731841c455d82db72b9e577e17676f53d5f1f3a98d
-ef88460a898d5b5184e9e1f65ad43c108f679945bd7d6c777e131fb79d99c74b
-e3cafba83814d984752e99e7f86d1dce93d00615d064427f28148b37a2c49668
-974f6a2f5de659b42d04e73d0e5137204b5e68288029327ba9ad8d9124ed4560
-1344da203d7cc8a26af36454a392193657cde0fcac0ba0fd379b74481fc56c39
-63abbe29416be7ced922f0ff6ee6c2bcb032d83bc4fc0002578dc1943549ef81
-4b26f5938980e2b607ab290de624b06c31ca4eaef275212faeda9bd87aaa1b27
-3e8fc6882f298c8e503f59279f66b7b6ea576458b979ae92f3b6172a8f6b9f31
-a7fcb1a241891f044e20a29cd948ca8be18059e01381f445b75316f8fbc77b07
-cd8558b13dedf690eac3715afe7b45421f857d7df4df4229e9a5d5f81ee905e9
-6c63a6b1ea510d0a5fc7223ca5e14bc2475952beec5de9542c692f720e33b41f
-d7d1a649d788964430b605a6092fd5653edd47967fd72f8251bd9ba5b5347d25
-3f4b2329fabd0082b71b517d69afa5ae4c6a02983d07b905d4bccb1c0a249fdf
-8c6a8b12a7728270b4e90c05c1f6ff3a962ee8f67fde611fc39d95a2ca550290
-8157f91dd7a967b7b7068d1570885f763ff2ab8d57221e4780c5e8e981ea1d8d
-b703653412e13b2e99b9c6fa232077894aae6afe819068a141b876b20534d7f8
-d7e2b169dd5720f0170d3b801741797b7c775838b4b36842de3e3fe231ff2a5a
-57421433ed3bef75a860343dd31092f0bdebe47cd6a9881a63b55e675db769fe
-182a8967fc6829a1fe49d1b25bab86c04befca59b7fb9458863d779ad8df7b42
-835ac1c5a6d16c4479ca09eadc16742be17c1e59ef1ca1fb725db9e871b64db7
-8ef30f0e954be11aff43b674a527f5de267f2b52fee2e51a6681d5ad10e1d822
-c15ab0ca73f25e228f390c450621340f99c4870829a7e223b5bea167c7f6b968
-e2f7f7d3a5c3cb9bcbc45795e98aa6013bf142e2410107a410c3072b96d24e15
-4270a10457d03e9ee7425a416958e991806b139f36d2bc9971efd6bf29e06e92
-713344c9b1a6bd6ba6bd28b6404a4c4649589cc6bc917ba6af0ac4e3ee359cd4
-48a9f74b9601dabec713b8e795e942f0fb90f15f27a8491689c14a5e71e56e14
-022233bd3591a1c7aa417b22f0fa2a7b02e30fdfd56011c508513c8b4385f210
-9b0f01a69b45ad5c701436fdd05d780672ef30122e6b33aea4164664667cf0c7
-3d3bea1a4778b3d35db869c12cba4fb99c066159bb50518bfa211096ec448228
-039f96dadc9b9600ec5e60b70c475bfb024f6d7687c156aeadde8e48b0625c3c
-0aeca4fe017d4a18cfd1bbdc370ef6b1c7fe7c6463a961dd06b4329210eec8f6
-a172284470b0d933a2bf0fe7e54ae607f5fd17bf7e62be47db76210295e70f48
-3ee8d4c7f4350cac22004b68af0a1b0105efd86c72c1e6615c3d36e182cffe87
-6d4b4b2fc066d8b6de0283e1b64964cb0cf06a2bf9115d4a0451557602e9ed87
-fde4351940b3dca78d5d66db800efa7b9f0d6f4862323e541cbe078d9404696c
-42c62de5fd2fde68deaaab671313f371c2aff793fe6caf4d3529450a9310d4b2
-df00029c115ff3ac4969f454c8dd4cde13ac7f8da419fc22e985063ff6429211
-9a751f54f6402b43d01fcfb86d7ce8c18a69993d40313b419e75a419f88ab41a
-40a0052509401fb48777817a764192e55e2df39ea866b150339681a2c894106d
-daca983773e1a280a661663f5d192674d0288a303da868f93aee92743504f6e0
-271430d963093ff7172d748b14c917a99896e0b71866050aa97e8d969d111de9
-02874fa90cdee0dee39bb6fc0cce58558bbbab4a4d024157546a57eba7c1315c
-9a1c051c287b6e43b0b4195c1cfb7845df3ddac7005e22a861e82b1bdd1dcfe3
-ac9519c77e2a88b302beca597ca0cd3bcad5afd4080d38fa1155080570dab5f9
-f7f8ce9eebe14ab702d19ef0137c615f72b1b3509d3108bf7d6d0f5c7fa5a301
-42a45c30ebfd452e67b294d8ff9388aaaf3ec0572c26034b60ae088ff19e72c3
-ba186180d6f93c64202bc9591b441e303d5550c251d75ab94305979c9942b82e
-3bc053641641077a0d203d5d6036f1c918173309f04d27845249d2b92911affa
-84dcbec3baf6c61623f8a73002f9afd287dc162762a91f6698aac67bfcae3404
-db70f32c9d81e76f4145d8aae76c8a2b42557e79a3c658cb5ca8eb844cb780bb
-dec028775a380862b6d5ee1d5195dc507ce3ced0aeb8938660b4c727d40c6e89
-e60ab163b14cc1f713999906fa5fc58b8b1d10044c17c4e32fca78d99d33cd3b
-af638d37c1f396b898bd47776cebbd71fae4162012767362f833dd3f620cf5e2
-49d584ebe4eb183a253d5d4a85a65acc7ee764589234fa74a25849584bc6f9e7
-6da6323675bb14334c7d23db9f8da42d689c14691875712ac8f4263662ba9953
-76a972fa405c90a574ff35afb29038c4048085d6a61ebde090381207ee9dbb1c
-f2dccf97635796111a8886662d39d7e3b2b79c9ce048f6d769f36fc80348eed3
-f4d5999faed84c8f4e37271b29d0adeb25c980a8c388afd6fc015b7c5d182f57
-78e9317db58e2efe61a6c3a63a2a0ef9a3c6152b2dfcb81e3c0d00c6520d1a14
-2dd8d314384fa63fb33c47b3bb3e2624fb1ffeb31f673df5105e024ac697fa70
-051aacb07e671787f6f76741c69ea9204ee1216f75491e1e1011512656f48b40
-2272666adcb4fe07be5b79e39ba3aa85774dd992589aacfa7b080fc4b94d855e
-e9fa0afc3273d1ae161563c33740c5e2519ef806b6f3a4c7d832c46fa8f86f35
-8aa32b9b0c6e464e41797312d93fd25264b85fb996cce679586077df7e5fceea
-9852d4012959de6a9002b4e67317b4f87e2229c9bf89096c32b8ddb3c14855ad
-f5fffddbb24a63da28ad2b6028184a4c083f090976bda8fb60bc51d4c590dc97
-b80cce59290aff40472ee22afce117737dd804fbd43de024399081076cb701df
-bae537473ab542a08b6a5964ad5a5026f68dded04855c34144cedcf8380d4a89
-a744823b4ecec5f225d26f128912c3f3822e51b37b7e5b6b29e9f1f43fa7ce48
-9ccb6b309bbb9f879527660a6fbef9d7f11fa0104f6d27e32292ff2247668b1b
-352a4c244b53141263bf6f6842ae64f198266388aff922adf272ca3b360d8f89
-27f2aa449a42ad993382efa008c700fc74bc6c61a5348c052f247df465f63060
-49531b80c92753ae16a817af2e28182ed43f8a050ff90fd45cdd314b568b61ac
-45f575948f2da79a035ada12e83c50c24f09cfb5ce9bcc15bd9c34479ed4ea59
-21960243fa433442b345cf568d78e314b2054e2c146c7c9a8e938b9ce3c7ab4a
-2a2aba81a72caed7874134d4126ee3a3096282aa87b29949fbfdcc173e1df4d6
-a5957cec97a798e61ff9ed2d620f4e229041ddb5e9c0a787916374bdeb03d0ad
-1dbe01778b2b86c36818e89839e761b0098a7d8db58ccb0e4d67ceb9cbc04e6d
-c232c9fab1b2a63a24886b060a78e221fc964eba7f190f5c8d02e0e4711c4a46
-f6611940a8782fd1606a5975dc787fac23f15ca5bc3529af7695abd9b259484e
-90512c6667d85d78862e548984e8443511abe283b7714abf122110eb21747422
-c4fde0949df2811451d4bdafce1846156ea531a15a7f8f54b7a117f28885ef86
-5209ac012c0ec7641444fc4032e48c16d2dfbfa3bc12961d5d1ecf95cef74456
-df2efb574e4c42c80a65bb008defdea2e732b101ad7bbb9646874d2e799130b7
-208e1e174cb552d9fca89794f010525898a096c97f0cd41eb911c313efbaf01f
-8bf26d7d2820ae5937abc3994e0129d15838bb65a43203901fb3f2375231d818
-08c5ca211909db4cbeaccc21107181a5a3fd93ad6398734f86eab4bbbb5e929e
-b4062eee1cd6e18ef5a94b088cf6740b60b08ac496c6781e35d4be3c9c6c6150
-e25ffc859a51489798fa3037d7e2cd96399f663a9c3537649a88297effda3e77
-d98941953f41ee2973e7d80be32ee2d48d5c7d183f4608067c4a72f5067160ae
-aecc4b68596b7f80222771698584b1e34ca77c54a0426fa5d3e009350f0e71f1
-bcc6eccaf7001e7fa8b23c321b0335c87397d1a375d467f1783d9488dec2f269
-89590d3a23b21539cfe64752e51ad95c351033a1fa807fffeec3589efc1e8b76
-f81de863071160931055a01d94dc2b8fad30d5bccb926a1d4a9ff858d98d9178
-8c60932d50307b5993fbdd530a5e25fe381959b01e5ce66f8ba694c95b4d578f
-3c56d5cd9be8553cefe694b396407f46531c333f1dee44e8d1679133ae7163b9
-c9dcdb20ae4d2c87c7f37087e78570ff608effd4202caf7c2c64887e47617892
-de8f0b4006972fc32628aa340c05e7aba10d892a1d2523fd216534a0dfdd11d9
-db9157bf1febc5877179bd4d8c272a598b016468bb31908e1fdea32906963927
-18a303429a7e1b4240c382f2a02bc8ac9d28bd2181b576c09097c1a76866b5bc
-2af2ba8a15427f9827036d5d85d76e0a9fcffbc331d769378b610264c5a4d953
-7b44cff644c1dc209da02b6134622f26014e847e3efc68c1403447e7b3f59271
-2dfd293e0d4b86007a8d9071958d979bd36a47c9e709a0252d61a1e7ecb119f5
-5302f9ce3accafe7dfd8bb2e1708c775143f373ca805a442bef5523e82ffa034
-9f2530b9aed89a8e5c81e013a7edcab6a906173cb0cd48434ad711e89d970762
-3afe152cb282db3fe2e105575ab5b75c00c3b1ecded579cfa23e97c964bb3e9d
-48ec0ef42e4761f01ec5c12cd1411c9eba7ed00e85fd770a82266c71c841392e
-8c8f2724203b9a44f09005b3173d95a5de83f54bddf23fec70058564161da59d
-02121c675380fb0f0f7e0bdce96f656e46f15e2382f316c039826f091cc03e6b
-ac9969207117681e0f472ca8b5885355020e1848d66fd99b378542c811f63f5a
-bc79477067649055735f2d5a46a35c4133ca4191e6a75f798d6ddd8f72cdbd4e
-75de4762d2bae425796b19a65647a3971abbfb29132f35e9accae847962c218b
-4973888e3ac04631a358b57d1347e2a74544a70e219b2e6c4c0e4b9f3af2b872
-22f27ab269f3248935cc65135699eed4c1b85769da13cd156108a7d1cd894b46
-fa7e2884d180bf6962240b20812a6b89a49ea08ec6b5a5e8766adceb78cca7b5
-8b89a9c7299801939004db901e195ad16199998c821bdbfb7dabcf1a80081de4
-aa30d5653740803ec63c0f377eff0377d44e8aac6aa289b144acdd5207996dce
-96359a17dd3f6ca398b91e86af024f0533ac70b186a940f96d7464fffe38e22d
-f8e83d34c8011351ce7dac20a9e35c2460701eb62ed3c815d43dbef99828c025
-21dd0f3680e4505a5a166696d16187d6e85363023823e70f41e4fa7b796e8608
-493a3b3a53d575880f09fa117117d6c946fd8782637bf122d9a8421807105b35
-792dbe884b02a344bd235328c139bc91aa524a107197539fdb2abdc99a7113f6
-176ea649a61e4968187bc7a97475b063d4a52d085ecd3191137c4ea1579691b3
-8fe05a2d3d223c7e5a23526699054f254236b96bb3f799ae176fa86859acc325
-44e0adf45ade76a9d635ed8739c55defd14aa6b3aa86f3504e71176ca2fb51e4
-08f7a7b97ddbd73cd848390757f830abbd1e5437ccbdfe9117d73875c7241f52
-c4d8854a3ae81ac2646700268c5fbbcd03a9e6772dcb7d5b7f2e925a944f89c9
-0e7ad30925a1737a44bf80a83b5a68733ca7f30bc6f47150d337d13f8a9a33d4
-b94fe1cfd05cf1714d6e0496e21b4e6aa498cf59f4dfcb30625cba83a53f524e
-e90455af7c17310107b2abb1a287fd1c8489a6ba6195a0f4a18378392e860976
-cef9a48f00b7fbb6c04afbe796a3af0b3a7ff9ad53c448011709d4239ac523d4
-7286b3440f7f9abdf19e4062c415b5cf1e5b1c2ec79eff451643517a7cee43c5
-56f2d68440f64a2eb7f5861dd3de1175ea67b022a137bbe8d3ea80775898100b
-f29cb8e25c2f816bac1cef6d3ce5c15cbc3f449f6b5db7c901a4e0953b38f1ed
-ceedab0acb10df42e2cd6b4d231ccd752b69fe0627098a3f1bc3b547488bb1fc
-03e0e97103cec3d60635a27b41826283796db8bc2d72e0b3b8ec3285f3ef5a75
-5f69a2be9f0e0733bc32ca037df0af3c5f29af5772cf1bce273cb1dbc2143d0e
-0a0598cff5d570ed5f1821811e6c7aa8d9ca18593d178d55e45ebc2cb32a2adb
-c29f52bf976c98491a5d0a6300922a3031095820cab7baf7344541e08740df1c
-a6e661ff99a9011e6fecf6ffcdd8235824ed8f86e02be31440d93f7b65ced2d6
-d2381e370df510ed09b424193dd4202b8277c586e7398ce8e43dd2016f7e550e
-644dea807151d35e8d3b3fb66949c92191a86bb236aacb255ff8fd410ec4d884
-e41d54d1eeb2e724ce43d96aa249aee87a9c2637c8fa4b8c4f9e28c23c4af501
-f93d7120ed9b1167983c3c87c44823697113d6614ed80eeced54e2d0f3fb44f3
-4974e6135949b26f352acd7cfb4ec79e30dff73b8d75a6ee74a55e427980f946
-87aebd0edfef0769e12d199b2dbef64565a30a698c30ab05ffd06d68310e55ea
-93ccac06a08a530a7440d36f2a736af590a682a13b5a73689b8d8c00c5fb635a
-71bea3db8b8a1e5006f1f72e38ecc48e40f73c39d473b92048419be4e5825bfc
-2eb3a3130d47e541b5c714d5971497cd23d8a5abb6a93e2da1087bd4b2b0d841
-fdfdf7c17b92e47c9093ebafbaf1b9429958f74e79deef860b65c287370b4502
-26d5fdabc24c04b34f07a048db884927ed1dfbd19f5b45276b2f56ad0a5a51bd
-9578d53562766255256c985891b2fb3d1150fe772faa9537315b199788b4a596
-39572838b9deead32f579f9ec94da84971c35149fcd7780a34497879a5422546
-74172a429a6b85da115f966c34de2c00cb11a1fffa16d8cc84b86b9ea31d9af7
-9cc851fd0bb6e2397db8ef7d0f1e98edc5f302f0c9a5b33950990d4019293801
-1e06cfad4653e1a4f5ee4be3a959cffc2231be88055c6d724b9d83f5f8f5ed01
-f4863e329d3c757cac3ed3d9aa3bcfc812407c8b10a78f629d8f660b42423754
-ed23a022797e478f8b25f6a3346374b8e285986aa1e19a19c3af7a81f14e6b0e
-a595ec48a0c6a6e016c629c3f1a91043c0eab6ce5401267d5091dcc0c8e14b4a
-7062627a065c66fe9fe068267b8c434410774a97d28b76024e171deb2306eb01
-84854194c373ef3659b489e337134e5763d16d00d6a4e66afe3dbd30e0b808c2
-cf044b277485fb807d66b6d0033d0157c5aa1dca6ee774406a7d4acdbb06104d
-e582402782f0d19920b7c4c66a65a10703f07d30e5663b37688a090e7db49783
-b5b31e9478e1491c5b40325d6eaa41e35bafd45bc85c8f1be10463cd5534f110
-8369f8ea5a4895428c1dca59bde35cfead2dabb44bcabe96b27156abe4dd9a18
-cbb4dc7b5908715faf5db93a206a4f40a19060ad1c33474226482e8fa3cadd37
-197f9f8bbcf204e76e6e411e56c7b33664ffa0125cb0e8f7ff3a55647a841a28
-9589124c91519db94723a77ae008a7657949e8bf80388b5cc51585fad67bf242
-f5a081ff56ca0870dc9799fd03b5291474c63b83b771b8bee604a11a70e21d55
-3709247b92f5d26049cb3d2963ec785b68455bb485f30af7426cfd02faf10934
-d32c8d7b0909f993724bb7da23b7bc690754384fbdd366b14417e6bb59c8362b
-11b7aa76af2a21b0dba56d8c04f14cc768220acb8dc4d7c60646c85cf11eac9b
-710e60d1e02c4b9a078ee52c154abc7bbb5ed801087eaa68298014023f93af89
-bb257e37bb4ee55bdcc563b5f28959187135aeb95ee333196f6c0ad8e2fa493b
-c819e39856397cd076f6ec77c2de08517b15cd6404306bc45963aaaa8adcd1ad
-0c78bc5a53c2370870ccb3d5b781b811ddeed772b2b21d6cc2b8aefa894a8350
-48dba6afdef72f44d779dd9dc6ca91da09a9a825a12322a2bebc69cab203954d
-1fa1cd86adbc7810620475e8dd1ce2210cbc056d586e4d203ede41398ef9f106
-b58e657f3ea69f719e7ae006cc1347a31b573857446cb3fdf83afd5991993c94
-95e8fd62929149e5d83b852423a0a92d3799484464bfaddda2e3182c087cd330
-e7c077f7b37b1938e3ab954edb0b98b8f25ab428b313047b6e66e6f6ec940d2a
-8f9989ef2553993877bac51edf043efd752a82ea0a21a80f514b1ec69265d777
-e0e6f7b71bc23f53681ef43809a277799c930a1189ae11a7d30fe14c5df3dc8f
-86cf3e329c494ed6cf0f08b5ac828d16f522985effbbba364440e78c27535b77
-517b9bcf39f6a038593c6b5fa7a7df8144df223272188c8e5b672f55d3f862c5
-6747225c9f48b995c9f416d519ce7e302c22a8c568e53fca67692d0485d9c34b
-936b69c65919e2a1ebac36520c3dacd0fd0a837a8ab82964cca79590fa568eec
-936b0df2123977d9b0f4604ac160ece39eb624d285e930cd59b30e26dab47ddc
-bf1e601b39d3081be32eb3cf521ba730fbb52298732f17752d36758c331ddac9
-66478be91854a54e9b101a52f94b13f94a80e3dd73a077684192f88927224bfd
-35339070cbbcfe6e51bc583b1d6d1179edc0409c56190e3f08a67e4c59fddf24
-9f0a430f6a2093bb7a9e32eaff050ea21201febcad5514f5ea4e1c790437a3ff
-1722fbc4a51f4fd4e48653e6764bdb83195233206c6db692056e93eaad28fa16
-332517c4e2259bb6cf36fc5d9c923ccc69047f10e8bfe2f088b3e95077f4a312
-508ab431048bc2344a31a4583718c0b9e0ad8ab0ca97dd51debe6c3dde8a51ab
-01b9ed04a58e7a2e73f34f7e2e8e9ddd7b99949b5f0eda2cb61ddab64fd0dd5a
-344a20f03b6f9b3fed433329b8372eef9612608380f4916acc5292b7f5fda274
-e1b296f142ac27ac06a3bc96d5f4cd9d317a5318e69dbfba646074f2304849ea
-3c813981fc03fea55a109aa1e174556401bf37aa870778a73eca9d2c60eec4cd
-b88662527f7dde83a248475b5476dd935833d6ea8ce5cc912ca5897168bfed0b
-177d4fe4c328f55625f35d11f85ae70e360c68b5601dd64681d557ce51e724ed
-6e5cb05523f3860698b38910ef6348c9abeb14c645b34d08e42d84928a36e91e
-999d15841c9ace2276b65dd78ee6e4253c27376ff691a11e640fea8573509b70
-9b0fcf1fd6c4acbada4957ddc2e9b4bd7444cf0a658f56878da729cd2e6c340a
-3a3bf51132ceacf89a3bfbda4be6a18b0c5be6021076fbf6d2c5ffd4d35b8855
-d69f62c22621414d6dba9140f9fc62919d1f0c4b2d725cbb895bf04b874b8e42
-2619d4653d065b77f02148cf29931f52f94f0f21320e541cfa9b03612d76eaad
-48d1c2ed840c390363994f75fcbfeddb48dea5af3d5e869206f42cd37428844b
-e69d57813618c3cc6e4dfc270bad5a74023f38a379d101adc41f62173a19156c
-580d2c9870014a090bbdca4ea89aa7c0406e8f73bbfb90808956903b4908fd9f
-e439a4a7dfa4bf0cc31d89bd88c5470940a1a4dbd871b9c23518e5694950eb07
-79afe884b71caccb2f350154fd6b1f90482e2d9268fe383666365fc41c5b0c04
-6fcdaa0cc65e320103ef976f4aca093a5b41d47bb55bf58fab366d3c9088297d
-49c88fdf7eff4920faeae791887cde9a1c9b2f2fbc2e23f7bb5438f9a5c91790
-5d9666ed9a3a780a02dce5386f1af23bbed00c476cafc4734015e367cf600916
-4654d10bfc6d06af5316c45c8cc0a5f92cb4016a2b351d6484705e9f1f9056ee
-c530943ca1c9fc321a838fb02857f0709aac2009eb3cc38f81145d6ce6d44524
-da3e21e5701f972cb836afe077e6376875a953ba427b2b2483330dcfba0783df
-c371f9cc79cbde94fc5e6f968b14c56f0f7690965058f6ac266a8baf2f545336
-1b99a92db5f63cb16cf850f13e0c18a779679b03ab74f886b2357c612c0e2f38
-2c72cf7e4b979f888d772eeb5d5dd2b1d837f03f7f9ebd613663fcb8b2f7fdf8
-c761a958b41cffc4b2e2a48fb62ce80b10261b96a23b00f6084819d088cfb019
-84fbae235b2cf56b391a1973bb09fdaf180f6ba062bac913bfe0762f196d1680
-f7de26c276ecc19f6f8c84c580b8a007319ee045a04aa6e492b347004a26dd27
-fcb2590c4ac89041c481f8cce7043c2e84033e9ca3810a63e5b272e1b716993c
-48da6bd8aab1c70e28f2da5636a7757448608a7d36be50ac184c3e4a58d108aa
-e1aabad61f8773a698546f22f22df892a2ed287cdadf8858c86eece0bb566af9
-a0e48c19ae49dd2389fd38f2937ad3e02c8a8b281088affa0e1c7f7829d1b191
-9c5ef6f3ced2dd0c51f6e18de1602df35f588503b25039b79c371d4ef75e6ce6
-7514d977dec3af3de9f7dc7ab9064cb21d8b35b4a7efe21b6f4681c090c55aea
-1fd129f665053887abb1b5fcb09296c6226ceb394dee57664ca483e9d7496dbf
-10a480d97ff4af0ce136c51d90c3d8c3734536e69d0bb4c066d1bb05184fd7a2
-374328b352f4cbc93c613309d0f83387e565c8114e38677ec5972a64f701a1ae
-8ea54f1293f413123df659adc7d8e9eb0aad32ace9f2ab0f69a989b3bc58d13e
-8dae3890c928697a353da54311cf1e98719a82ff91754ca207409b6c10428228
-f78907e8e9e21f1cce47eedf402444344751d49afbfcb460b6d233ac8bc7a569
-32a3362bb06a575f686c1b68716ff9c8c93020fb6e5ac189834021d09d12d136
-529c6b5e28390a877a3daf3392e50dc60c4653f33abf9cd550371d6af3bc340c
-b5c34ef3d2ed6bda5e8e2b4e97a865525d21d43ccb1412f545e3f1a84168afb3
-378248f719bf8dee72e408caf3eee889129d389cbbd62fa285ec9eefefcdfe44
-5fc87a84d103b3fc8c349f162ed5d830b5e7ab99cb2f82cfc2a83ed146999a56
-11873298b1c8e983c539ab6acffb13be2dcde7816a7015c72ff2097de9334e76
-4fe9359d3b3f1b5dd5ae02ccb7b1175e5e5b2a5d4414af3376fb605d805446e7
-e131cfee56d1c41dfe690113b891a4950d57975b1d608a19cbd10d4d53ebd4db
-c6d78c9cf7c06be5fd47433aa18250fb896f3db663deff28f1976e93e7a36b4f
-50830f7b0b5b47e2c0ca4a08482290aaa77582887fbbd330ad0c0c412ecd3fc6
-534baf96f8739a4df7860f73b8abf2e97d3567c09c616b432235e0ea8505cefc
-26c4d7dc44f7789c338c8561a9742cf177620bdf68209254c1b6c83f26ff44e2
-74d98f45a913751919506bc3720cac860c01ced3f825d357afb098a5ae5db776
-63911f63a83b586e839d08a94715de06dc3765bcc949539394d75b0c6930eae1
-9c8772443ef8f8f1403c2a803100acd0305359b7544681097dadf07259fd7c09
-e80b28c4e0e75ed038feae6e0b3ba5d311d21f716d90fbd1aef28a60f84f8e87
-0a4d395cdc956ad485934ca58f11cf9ed829c4ecdd984dec9525a736cabd684d
-db24ab8b679218c355faa975d48e837066f017fe39cd135199616461b9c7c77a
-f3a986c56243594ab113115385bd8de3e560eaa3e468ee419f9b97d3b20dcbe8
-1a64942075d88d48a2b28c39328ad74e2b02b011331f655066b7790d1e2e68d0
-ed7298fc1040fdd407acb03e6dbf680651a9068082db7d43d1c85b56bbdf299c
-5a9b88b8608d2a21d7a9267d952d71b786f7cdcd4f63c13fce13c6dfd88f20cc
-874e1a42fe2430c0c0da698b021a7e82eb668371d7a8559ae906d7d6a0a60502
-c146f7e838822f22e4d0e1404cc853aa913087dc959b2fe1fea7131a4435938b
-2ceec71b3101fca9c4db903372b2cb6a6a0e88748dd8479cf0625a7d5159913e
-69ea97f5153b3fa681e940b0c59c1c4193fc979049b88cb38ea53e64ce6da9e9
-d77abf19140f3abd0c1b89f3690b59603abc202d4e0437431c8da5b6a2b1231f
-89723b569fcceef6a78c38843df658eef93f6414ab589c77ff88c25a1829cae3
-ea663f93db354455d10f4d40a4c075650a4e84a2468fe985ffec14548e2896e3
-b1dd0616c0a6b17681e24fabd35501bb0e446244dd55cc6a632dc018688d2b05
-18e7c16ad731096807c8c7984d9a90df59d2ca0649e1f7111f105fa3808df731
-10de360b039985e643fabe223c2836e1a992a5eb2ccd396ba1fc1be39c148e3b
-2f1414d762e9c95f1ab131aaa17d5632f6b3c3e566a1f1bc9be2ec3a89b595bf
-bf99ac8fd3963d7ab464059c643bc6de1e806d5361b55731281d2556878d1087
-10f4f9f79598e4f37a2bf74aa4a94e563cd226e50d1244f38978bc3994b1b082
-586e5fe3723cb33dfa0c48ca249ffc20283e7e3a84cdb0d8df92e540ed428fd2
-0943e502f763f7fc0c879d6a18ac22c7b9fb410761ffb5e60e2698828666450e
-aaa8e0c8d5541036badb9c7c92885462a9e7421c8923f82d978074d51483e594
-b0d24b3ab7306234079f4f52186a341a8cf7eec6485a491f558c50f86aef7c10
-6fdadeee7dbc16438b213746425c80bf19ee1ef22ab8952a6a91cf1629d027c1
-b4ec94221468a107eeae9b727e1463c690c41053c6ed0d27adec33586212cf52
-c4aa47cefa30fc2f22d1b36cd731f8818ecec6d3bcec641fcdfeb74f37f561b4
-f716913c74df2893324861227e362084ea3efa36414906bbe0ab92b8dc7360f8
-ab2dcdfca4bbc7f23ae6a6ec7eab609a6d04fc0eb78d95d63a7be15db384a098
-477c2d5b367996fe969f6b26be3d09a2ab3c3deda2f2ec4c9bb2f0646bf6124b
-23c91547ba42f72c6d4ff83478769924a09ea982092deaed2445530f7e62a64a
-6c6944f5c8a8272c7611fc494fd7c2a9f371bdd05607ba865fbf5cf8627922ed
-46d67ad28c4e8a01700634db291a8c900c37d8f7cda706184bde8dfbfda3cc1e
-e6071783a69c4fce21a094fdc2d7542d005b33850772f73a0e7ae2c6e4624ff8
-d77fb1e978e9b013c2c2810394675b76c7ec45e39f8f3dbbee1a92e43422ac76
-d9dc26e9b4163fd449f1d2442f9a17ac6034ef3cd200d50875b89843ea4ac7ad
-10c8a2cc4df2c690e68c6f1070abd2bf25d6a62dac0da009d9b949cc257b4941
-8ec05287561ab344e71aca7cb870e71fef718dd65a69c99cd4173cbfcfc8155f
-f8e67003b086437f488af5497fc9416b15fa81d22709730f32ccb984ff67e291
-355503d6d6253fcb17f072f324b3259bcb47f2ce27ef9708fe4b09449e99d575
-030ea81d86622fbaa1bd1e347105a283f2b394e5a541aeac32151b376464ed0c
-96a2282ae7812383e1434e766f240e1379dd7440b4901a124607c4463b6328f8
-25fd34dff1bc61dfc6c3fb2ffcafe3b67068711e1635becebf8c890c62f342de
-baabd191fd7f17369f6456cd3f69921466bedc81966b1055c49fb4d139f234c2
-8cd8eb0d15ceb048def05831b3e940627b2f98ed44a0cb193284c616cb77390f
-01cf62e583c01909a36b83e9dc1097f7d946b30edb637f431ae85871f33f24b0
-0f3d42e09bb3cf5b9fbeec56c2762d4c7e2571c3300058af94ed8a09ccae9e60
-420e3b78dbe9b76d2e661eeb84162d2514564d3bd76e59ec2385ea5ca8e77480
-cbac4e07de6aadf16a183fc172d5c5bf7f979a77660706f2df8fc7c49cc77f09
-e3232aea4172e2a10cea4a9753724ab2b5a31e40febcaeb284436daa7328bc3d
-48b2f8ba50495e566df032f44d23a1ea6d86557d48a71c7456c415562464c4ae
-0ea04fdc6b07680daa44a90f34b59dd67802ad85ab62ddf3790b8f8a8b8660ef
-815cfd50cb8607affc2e4fa152157101c957a422f4368aa35f9faa8b6735c27e
-7c6ad626bea86f8b66398dcf40080a2ff60fdf8431d0285ab80668d39590351c
-588cdbcb8245e5b9d5259ceb2e95f6238f0dc40b5406a15ea059751ca482b345
-10d6f256ba50792b8adbb790bcb9b52cb37cde2ba2029afa435bb4fc541735e4
-f76aaa503353a8370ef5a83bba65cae93b3bb20d727b24ac58635746de379ba9
-04bd03403cd2dd8cdbbb96282ff967bb11c89392c5510c1889dee5d2126d1e22
-c2815a7c54b10aaa07d797e0337c992bcfd5e023a0dd2603913df6fd060e40de
-ea1905d3c9da64ffebdc539bbb00792a098e0aba893cee2b2222f62f7bc33b9c
-0fe107b99feb52d76b600648b32dfad7f7edb025b143b445c2182c8278da240f
-8909e3de7456428deac22c0fc88c3ed99ef0444e762edac64c4a4afa0b97a609
-58c607172daf23b09bbebbf040b5dd5b55cba5f2bb1e765e359d1a80c6df7f76
-c703baa94076ab528d326cfd0a31156698b9c9c3ffe0f13b7711ee58276b8422
-80fa784133d0e5f5b07dee16f7fa0dbb95f7e1f5c8ba8b45ff72d64586fa334e
-0db8c968d3628ca508f945dd9189d1f7d3462897c141d080dbe946a66de8b2fc
-2f2c89df29e8ee18681c8f01a43213159b9cb09c121eb73a080047b9706d4b25
-de8b147972ae87932835a6f4f12389542de405192f0023ef363327dc02af7ab5
-f3eda2970f67ed2e5435c50c522dd8dafbe0dafcfcc58daf945657045b3bb9eb
-a9b9f8894400f2c1030c752e4ea6bb093fd5a09fb95bfd484cb326afa941e2d9
-6936453764c5828552529668257f87fee07977cc6d217b5b923808f93000a451
-d7c26a81dc47a1e7fffbae8016303157ceb3f64af87f5a2fd8c8dddd04b8ed7a
-809140824d1349bf77e19ae91f8e42d7550f4163570d87c349ed3dbf427625c4
-f18245abc4ead1ec09110a30f4fedaeee971a2fd5c4bedd0bd1c80576da035a3
-a2527d163b2198e6c483ed7b14e9882f0a4ebcc2b55b204fde963da8e5358371
-dbe833aa2c41f60e98abeaa394bcf0212743fc5a3efaebb77d3206362db106a4
-2c57562c547826a558bd82bd5dbf7d853edf511135538d554c25e94c40b3f73b
-5c79f9cfd585cc5cd1f0aecd196c019adf970563fe58627bcdeb9e2e03471e05
-d90d43ee6a20a468ab4ae304d8ac4049cbbbceb0cdce45d38975bd8f1ce5d1cb
-b20fb81cd0507a3699c888bd8127aadeafb330151049b09b3932bf301489cbf2
-b09f7c42502e6ea82041403ede92b34f1bfef5fb5f5d920d5533eb4d65445c06
-7899f0e07e081795c9ee931a34ee6a9c65e63744db3f97815ad946f41dff97cf
-7099378fbc99ce8e7f0c7f4f4e7ffb5089e970085b74988304ac99c229df5291
-9be0d25d890b071bea811aaa588d28f78e6331385c5e12d03682567e5abcd599
-1b51b54a680759f13683eeea378081c76234cdf5e3d3e5faa8363c2e74a7adc3
-92e744d370d8d466a7e1461907ebfa43f44376a7323847ac162c24ebe8ffcd9a
-3ef3f05e197604898f9dd3c737c7da17c8242b8f7a261774d48b822831ce02c4
-f9249b22cd805ac81a0b9fd24ca446594cc50137223b67b97507d18409586cdc
-aab9f58cadeb6e5a1f9a843b7cdb58adc014d4f2f7bee89cc3d207a82e6b9e7e
-65485bca7253c6668629c44632120edb18b3e4bd170b5f431c35b2b945f55f1f
-e0181e92aa60f35ee61bda2a2f25dd60afcab8962077b38db99c12efaa3e62f8
-024bf9e864953cabc76f42827360f39ca838b7b603b83f2c8acb52b4bbccb905
-953612745b0a8ee64753f5db78bf77762bbd7e48b370ae59f59a3609737ba1bd
-d08e30fff8ec11a92050a7733539758889fbb3ec25d7c287e74697f80a485653
-1453d337173bc751eb122095af020c6acd57451e9d492d87130f898073705b05
-d044c77d42bd91116dce3774460fdfdfb7942c45f3053f13e71cdc7e5ff368b6
-02adffaf5eb51099c87806cd481d923548e4a1b153f3518445c2734a5b852ef0
-7028968378a565dd0245685ed23165d93450a2fceca590410aef8ffec0747afe
-a184ac2c6ffd4252421a3fa67165c48e1c0bba8b039bf3c5f42bc031d8bde0bd
-075a3594ec943f67ea4dbe5d5ec1bedeb833af6bb8c6ae6a3974ba1241113597
-4eb0a6e3107654d209fc0f43416c71645605a70ca1f9537eb49e2b901ec67028
-63c6a6b6a142dcb22182e2cb05a6572ede50e2391943b3a589f496af92bc2053
-3f68d7ecb40d1cdacf114090014dad9b9c00f34c47263d626016bf57ee1735b8
-5944bee9cee9d46a7a78bdffce9015ba5120b062076ab7968384404bfc7912ce
-0025ae48ff3d663aa3b312ee77b669ec2b4052794e90e85a7769b500c709833c
-607a352a4e69b4fa6cf41908453d07394740bbe9cf4501c5a64c0603c6f24812
-85cc4f4d1b22fa1281084b24f73b3436d0db59f2da5a100cc70f57c033c04dea
-cc78a56999fffdc14c143e965bae844d87c7f7cd59aa05d352434cd3a70feb77
-3e878d1bb0bb9681622449483923de84737149dfc0566962808602790de465dc
-86051f569beae85236ecb0b6a8de7d2e5c62cde8c13830ba5d3a5943affce66b
-29f771f8edc3bae0df9629dcc9761b2caa07d29b92aa72564e700ec9bda0340e
-71281448fc01a5eb62516d5d921d22e69b54bd74e30f85fc52647ca24fa8d273
-4ace1a25faa68a654bb60827585a9b5dc901dccebf5bb02437b6456cdb93ee83
-3e226b7822f375d60a1b75cdcea40dc0acd32f9aaa39808d24043098d76e7367
-26e24d0602eabbc35d28509c64a4d66df7c008d32e5964de8aa2c50134a00177
-81d085806a2b2783911c89f6876c1a4964aff3e59644e05aa6fba05e970ee558
-614ced908bb4838b5fb24c1a3458ca50a1d7e51af615549d340cc334b96aeb9a
-4aa99e74f3939a4b640c653b03181a4c54d45604da621d4fae1aa04d4237b7cf
-9674a72b50e6f26c07aa85343b43e1cc4436e0b326b890440dbc6ff36202f144
-e118eee07c880f3d5121834366d6b174b9d67886b62ed002e78e592a42668cc6
-31e500ee27ab1beb2c87a7fd3b1f2274efcabc70dc189b942e55d6f3779d6bec
-67701f5aa3efea75615cae8bc8ae937cd29b9a6811f9ee11585e39b69b09176e
-e5b0e4a8cf0c6fc393fea31f0164ba03ccc6af688df68f4228868cd63a84c480
-1ae93da9c45f79f384fe3a54fe463d4c7853031870c9e14687dd9dd76b9db209
-9c21790b1523d2ff913552ffe62b3b371fdfb87919a2d961847bfcb4131a901e
-9a8cf933b2e2693a688e435ec50b1c0800ff31c63d1f5c7101fceabc9211860c
-d043f5a575ea71977c7a5065d927a4de2c7752c02a857b884910df8511eca9f3
-b81d36526a9083de5c32603649e944961781c3966fc6c8b9a7c1aefa7e08e5da
-782a9d694b8ca6d5c3887617e2bd3b5ddcfa2f965b78ed018a217ab5c4a4e538
-85ffb9485db87327232541ca112dec18d9f6d4e66256c929d8c38eb634cffe5b
-b4b3aecdd3ce66b85d9df1f87b3cabc609ca8d1c5bff49215f8c324bfc42dead
-64c43bcea81619ee6948ca0dcaa9c7e2a19f8b9e830b9febe1a59ed5cb8d650d
-51ec17b2844c9d67184557654add27c135aec9c6a6bb2068cbc4edfeb82133ef
-a5f46f0dbcb5996702b4b1b67b3cff6992ef64fcbacb316e901765a87d76b0d8
-17d389d165efd517aa40f6c75a91cf060968467c82b1294f2abbf54a35227b61
-3b3bb9d32eb143393796fca19b4812402f221c7859ab4cee3777a52f847ad8a1
-3c637ff08c83a58e5389960e44cbea061bf444fcb64e613f8f47bfb1990c5d6c
-5da42c20b4199b633f3675d91f301fd3fddb875093d565e01f45e3c22250358d
-1a7af5ce476b44245788eca65c4db73bde810290d8a63e59f30b3c83d16c5c62
-de36b6dbab5d10659924f32a5b876c1583cd8bf728afa797b33a6c3c0d85b40c
-536b2c7d1ec7ef7ee7a9df19bdb5fac451001bd1e8964a320209372646202954
-0eed46fb166faf15f8b10b8515724b409c7461a738248f60429976bf7ace5a7b
-bac4452ac45b5cd4caeaa310f154d78f101667fd22b0e69bde93ee67c68913a0
-67231e0b73377f31d3bbcb61d8819e32f0aa013fdc543ad95ea5f48cf95deb9a
-70c31b233f591549701daebb81dce7c3f6241d0a4c562bd9e267f55f017a20ca
-d232044a680e59425b8c072682dbe71e21c7ea603056d9ddc41f16f26ee5e74a
-523462e49d58fca01dc10d1ad6b6629cfdd36c556f8fb347af37886140a145fe
-4fe9e34d22e5d7804db730cc076ce074762f3849c62ac49a2d66c707455106f1
-ab854054aa54222ef6d5e628c8065228723805076993d356f0349243d9e43abb
-968eb1c9998ec26447bce6aadcd84f0b6993d4ffa5f536fec6e12943747aac99
-c253f9b24caa7db44311cba889b53ddc5664475c22526fc9e1e700b3d38b3568
-85ea0e60d4146811e80386c11b2ae0e2eb94afe92dbe3b5a82fc3b7ea5b39847
-475b707b4058e717d5ec2d599db0f27c04a3de4f85bab108f6d1463183291cc4
-75edb7b62e0c1d6e6f0c5f03e5b9862c6e5b1fdf755610ba188ca32f5994ba24
-8c6a0f6e1a6cbb2378b3f29c4543511dbff9345a6992fb19d67500372997478c
-5618920ea5a62eac4aa661291c8a3e46a26260c8658178e17605b413bb89cc6b
-fe10c7572049fd36357290dbbb19a670e1244281b4b2a3ba60e1b322182183f3
-96d486b97fa3d435987879c3ed1a4c4a5e1794f7594f05ba6a1d75138dbc76bc
-5994ccd69499f4fc7c01f0b0b04a7e2b8c2c3eb6cc39a6e61d8610d0db8bbf88
-074959d4efb3f4e638208c7935e08d34379884930d8e99c3465ea4d4213a8f41
-67e091345d5ead21e5d9cb489f2666c02a25c938cf7686a943d645feeeea7028
-7e1885a3a2b2cb9d3b3e75896058ea924009f40c8bc017c82495de1f8ff0c62d
-3245610b0e5d54908eb3d96091cb87df26ad8133c46040e168f82547a32346b5
-0175b7c37b6bde3f345b4322f9a57c25363d32d1988941be4a84403c0e4d3440
-c840be8d4697fcb6678cc2db85fc9d6ba2f59814f257f18bf17e57b436581d95
-d391e318081d75a1a9d8c1fac834819a82100b47b78424c28871ded159b5e5ba
-49a2ba27f1a0fe358661ef98a937baf3722a1b471f269e3f8cfed8f4b44ec694
-b38f4106570c9ba31a30d56a594fe4bd91178389667c3d15b54cf7590c46b9b9
-a1ce513f45ae78bdbfc81a820b2ea832f390ab3d389511add1f30d1d07f97e7d
-fef1e1f796826561873c6321e0915eceb5d141d5e8d9e664802f39be458850f1
-69990f176dc24f0b3148cada39a20c3afcbd82ce6fbbe0cec2f3cd6dfe390b96
-f9c450e3fb31fa357930ca4a2911b3441e4813db96daa79cbb6b6da2ee464055
-374194ff4d779d0ed6baf67e7c06d711fe1b5e868c1a4e6c7f3ed529fd3d3492
-ad079fdb6faa5dc0924400149ce79a9ab729283669917b2b538f05bab7596b8b
-bc9c86cb74481d0181c8fc2b0c333619b96c63b6fcd352f0564862205f685eed
-ff81f069dcb2bd3d0ea80b86952f7efd67ea8b60f3e90ca23cd176c76d73cb1d
-7c7de170a4196875e99ba42f5e53a5c3a7740bee37d08900d68e1a5836ad4c45
-2f325a1fd0d49f74e9437f2d28062ef5d2934d063f0521ef792638fbc96af2a8
-8bf23e8a33c7079d2abe21a018521acc0e14c5508e629fd83773c9f59cd37fa6
-4a121bdb1db13d1c598589b00da37e78bd59d0e9f3e6d3c99054626e9e0cfef3
-35d2dd25c138f96a3f7f62e2ff2ff12010049edb86f3645f0272f36eeae0a60e
-532cebda1c0c0f39c454e251aa6ee1ff82536c1fc1c9b7c9679fb2deae693a02
-9eb57eba3882901d2dd7d0c24d5f0ef6b799080e98ef048eeb4429ce058e05d7
-6a296e34c80467c71fee0d41a366ca38b6fa3c5eb7abcf854fa7adc4d6ec565d
-7d8c39d192fb3b06bb93518623a1b1c56cfe095354ef43fe73c1de5541a7af68
-c51ba01019d7685596d730bee70268
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
diff --git a/lib/fonts/courbi.pfa b/lib/fonts/courbi.pfa
deleted file mode 100644
index 5162aa6d0d..0000000000
--- a/lib/fonts/courbi.pfa
+++ /dev/null
@@ -1,1940 +0,0 @@
-%!PS-AdobeFont-1.0: Courier-BoldItalic 001.003
-%%CreationDate: Tue Sep 17 17:04:09 1991
-%%VMusage: 57715 76639
-%% Copyright International Business Machines,Corp. 1991
-%% IBM Courier is a Trademark of the IBM Corporation.
-11 dict begin
-/FontInfo 10 dict dup begin
-/version (001.003) readonly def
-/Notice (Copyright (c) IBM Corporation 1990,1991. IBM Courier is a Trademark of the IBM Corporation.) readonly def
-/Copyright (Copyright (c) IBM Corporation 1990,1991.) readonly def
-/FullName (Courier Bold Italic) readonly def
-/FamilyName (Courier) readonly def
-/Weight (Bold) readonly def
-/ItalicAngle -16 def
-/isFixedPitch true def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /Courier-BoldItalic def
-/Encoding StandardEncoding def
-/PaintType 0 def
-/FontType 1 def
-/FontMatrix [0.001 0 0 0.001 0 0] readonly def
-/UniqueID 263789 def
-/FontBBox{-48 -288 860 839}readonly def
-currentdict end
-currentfile eexec
-5c03f98a9ef1056084234938772b65b659a297a60831474f7f06192b155c7867
-6e337a4b7c45b34a88552e942ea1b7667df4b71b67df89e141537fb4b1d26675
-7b98b6502e4b2246f50fcdf717d3a5cbf57a5bf92df803946d950138fb0acd1a
-c81f3f66f82ef04256e333e070972e17b42d661f50b27463cec7ab9995060f63
-ad76b5de2ee0546d9a2e43488699c40c150f6d60a9fc1dd3b5367a87d081de8b
-a232ff2c4e9e7ab38f13f20d747cec9f5cb36fb8ad1b9228a42216d93925b91e
-3643f1c2f86f0ed4286847196391768d58895b7dcd757d9f656af1125a11f291
-42e28ccf91a17be1a89d3214be746c4fb82da439d6ab53f4bb12358b2f8c6b17
-32fe22465ba0dfc22a955139b55389d1904f3f742faee44c1af9c3c9f588ac13
-3635df24815df9c92f7ee93e79555f834f18f20eabf3b2b7a815770715bd2e16
-4b1fcb206e2fa3aacaddc54d5d61dce9a8795d8f346bc180a550aeec53154733
-bba47e38c6be925bb166c8b776c4350935f15e3c6123f8a91c65506f2ff63ac5
-d79c7a7519f9d09301a6de5052913938ed21c0194306c8ae995bb8f5ab991343
-5def56faa796248a10f995ff7d6ae352111eed560620bb6ac41103ab077d7cc2
-d97a20aa0a9dfabf6063f3a600f2c12fe79d30f9967788f90f5285da7c197d4e
-58a9ed99659dc24269914e0c0582e37840b0f6ef456b0f6b445b18e6b5073f41
-8ae4fc99f4998da4fd8820393e41aa4f953ceba2edcd901d5b7ef2fd026fc8a5
-26610bde74dc20173add2c71dd98cd1b6445ea20f88684638f269801cfea8dab
-e4cae300090a10211e08e37e65b79433989f2a3d888982631301a76e4c68a604
-b9ffbd0b7bf26b12cec3ef5c6af999e72243e396f5eaf36d7a02fd686268bd85
-d66d617e51c2c7a5033d160b8ebe9b7d3c0595cd0ec31cf4b88cacb3e74e2870
-ed7e20f88905075cb6821889e85fca3fcd5a397d44e9150750b16260177280fc
-92a20e8b891abff9492a07144e9ba614d069d8afe28441d03d34eece34f89640
-1ae1c190991de2ccd321ac65b9b575661dbb7dd5336f1af355062446fe088c45
-05d9eb7fd3f0740528564f945ce3e13e5697b23e1acdafb8322f77b455e983ab
-dadbc73bb4c8b593eb357226060c4f723311d7c48435ed02bece6c61523c3c75
-5be81484919dde97279579df674527ae2844220a490187e9350e34ddcac7c82e
-e1fe5cd11259688a987d6127565904904dc3d4ab7c41035c5258a9841dd2120e
-de49dc1ae7f4c308e169098267db701bb94b4862ec87e13c4176a3b362f7ac17
-39b75de7bd9fa615fed494334254229a30da7357f1015f7d2983fecfd2cd2444
-6e697b50f2b8e409e73e46194c89844ee5e5ae5a4d646587ed37a0255b86fd7f
-9c287a61cdbebb354185d2724464a70461a29dfd3c3a98291654bd13a64598f5
-4e23fac9ad312e05d6c689e529ce5ce92e97ddc924bb5c7ca024bfaff8e2021a
-dcb6f07bc45ae0f8c80b693fbab5c1c66d5655e7de5151f48fb0d5972e2f523f
-790c7c46663b5032f62a9a510d75f7809f3c7774d2f7378a8de57a912058247e
-30e29f65e7ab0a93ca198e6dcb287d7e44f01755f849cb46ee4e8a5668f5fe25
-a4a579201bb36e45d4208fc0309d5b763cf6f5903f4c59b3527e11a1d594f9fd
-d3f6e55a9ef313faf9ee6d0f05c3948fb186cc981ae63de15e4aee46d7e3b623
-736066975cb20d00149fa393a35d8aa21637c73c396aa1706d4486bc38ccc199
-573e5c564947739431f445a8620383c17350a9f818acaa67ef7aa609afc1cdb9
-44a8a2c76f2e298b1de868a5c379f8f7fd05af8e66b55858d579e09c84100b7d
-9aed565c5b3491b2fec23390ff21231bc4d231a75576cb7382619f0480126a31
-ea8bc6b2b1535c7bf260351756ee37f53ebe18c7115a594001dc5b6d3415b88d
-8a2bd9167a5ad2949af32718aa189645a94fa2f5ee1c07b8c2a6733fcd44b21e
-8adf515da9d623d02a7a0f4d34d7969454c68fae43681a970841a4fea9da5a94
-445d4fbcf36ca7f185e8f7d085fd869203a8f3f9bb87d31c46f459c1c3ab4854
-2def58e42fbdbf28cd14d3a1bd1f7d8f4bd136ca919263dbb3c52ca2db0fca55
-110940cddc11095c5562e4338cc7b74b0ff0c6370c1cb155154f0360220c82a9
-9fdb9eae6e988e28d7fb0d44869ca4c92667ae358dc1db7601ab42668ec40f50
-14fa64b966506873d63ba425d899ce827cb7532eaa44cb8ca1e5763399387a8e
-6dafa8b3b5852f23301c441366956805ab69dfc15cb156ac11ef709c651ff3b2
-064a491521cb0ba8abb66b99119d220a197516a7ed8d4d5d223bd6c2afabbc9a
-be1daf6a4b9d6064bef32971984fa314e9f3a8eddde83b39075b3b6f9f9f0b52
-793655e96efc0cf833fafc4460565056522b189870ab1493638d6cdca563e6b1
-793516c25d149caeafa2bde531b397c4beb75b09ac16430b4219ddce0c4c6400
-1a32fdd1385372158ee82b837becd6af14ebd1cf92ba934154232cf3f5b4200c
-41e65762b0dc5120e7034e1fd4774a0da978e6395e855c8cb369e677adc49ef9
-f4dce344953fe9da428bd35a79b6d6155263c0fb306f4195a5a181c38ba432a8
-1f7039f3221d3700d584e4018469dfe590a22c3bfcbeb02c56fe0f0f5b93e6c4
-0cd8225b071022e08372ef5c5de6de6d24e22640002597d92051197a2b88a27e
-071cb9c6580212f6dddcb80185ca39a774a905b447b5b836d72ed90faee84a51
-d9f5fe37de26e4a3e5209cbcf989644acad73eedd16f028a304e0eeff26655ca
-890a74c6ce61b49b81a191e158b6f3161d6ac5def3f084d1c0e48022f111bdf6
-091916d4adb5284d062c8d71d487dfed925c4f26fb6796d36eeb818b9ef5c503
-3d4fb3bc7b4aab1f562b563bfab9a79ebf49777f6b8c0dd77af6e4dcacf81688
-caf05981536b4e91ce965abe966acde3d304d9d0f3b6433078a8ebcb02ffdc7e
-c210a35c7dab3ebf015fa81b6dba86e683fcf8962117f44d68f562b4f7c68c0b
-5df0193ae2283f35c421c6da43dba3419c63438ae46eb65fec9d8902ac784015
-398706463e99a1cf1554ecc16494477fdf68d40ca992dbb01816d410662b743d
-f0255e6c891b1482ee1353a5cc268a264e300b94d15aab2fb2f80bc1f0b714cd
-7e1546bb733ee3db28611f58fe80bc6b4bf8b637b00fee2997cbd2d2f8808944
-f428727190675e1dbe9e4ea29869af8729248ba59abc84861be3814e003ac8e7
-f8f7d7ad667df77d6b9619d5776bd048c7399f01b3688730fc94af5fea41e905
-43faeb064b8a7e8c9ed0f04631f4223730e2bd7357d6c4c114419a2d4aead49c
-d2ed2b619a15204c8fbecaa51802f3fcd8f201ca100c36281294f2cf2981d59c
-ad0d9e2ed7ebf964dfb3a5f2b1bee1b3f361806b0a5f7a74b32791644d5184e0
-2515f2122ca3e24295e4aaa1165bfcba0ebe9718243db1f4587f24cf6a52f92b
-c2229b9fdae40d1c97b6bc6eea4e16231fbd92592ef326227fad7ca81701af4f
-f47a2be563bff9d42ac841df2914b89f372283b77d62faeb611eeb870cf9b052
-dccae0c500d9ba5c86f984fca0fbd37e813fce5339e177da499e68b74965fe03
-6a4e030386eb28c668c18b04bde229c53c86941d682ab64f0ef33c47cda25acf
-91ea2c53beb3a7552d69b092a76ff6c496d84608ead8080518943a6fc57fcbcc
-15da6f2c62a6326ce45f19b403c65ccc613991bb5e493d1cdd913269816341dd
-c484abade62ee0eb0f2aadc0fb4ca2b04cebfb9989611ef65b6697fc6f0fbaac
-6745ed1a21dea33907385730bdb0cdc2fc37376ab389267ee40056eee0e6467d
-8181a77d6478b78d4c140ba7427eca7357e0f7d5f72324aa1d5e6bda674c5743
-4fceef4a522731a5092cde4ed87211ddfc4267b93655789469d47cbe3d1cfd35
-2a98cc4896b7920887378174447ae1c501c55aec394822cd4beec7ee8b9b042e
-d6255479d8e1aa7a5efe0f486417e5a5e6f6ebd019aedb0992e033a8436f4da1
-44db254c8990b3d25a7786c1250d71fbfbf6f0e45faa7661399f12089822697e
-62e4081d586ea80ae533b192cac92f9f59ad445f7ddd088b66b307041b737ab8
-cfea19ed2a9d2d35bcbe1cc4fe4487f09288e7e85b98ddcac4b097038b8a7905
-c0293c2d66739bd457cbdd9892044dff52106839c707b2e02fc433bd1d1197bd
-3cdbe6b1e55298253b09f7ce80b94cf7715f2947cfab6dfb389e045294424fdb
-6f90ec45fbcdea39cb05c6d0a4614c33769d135ed0d6a6a5a4cb25ae1d1dd408
-51aadb3b4eec2651c290a62d95a9ecf17430db06a42593ce2d06d3590e76b929
-39a2f87c2614d353d109717fcd46a7f9b6795cc840ba6b4ec37502d3271d5ff8
-09c61aee0b67bc4b8629d9ea756fdb3724b1f67ddd7b0f47b3c47c4c067885eb
-d3cfd3b7fd4f949bf87994709f5f278a699b3addcdde90196b5fce894a44f3af
-82034d0b4ad4ac692f54b6bc07b849bcef0b651d2a1b1f69460bcb62985cc661
-4da60cb063586207661c758ec6bfec68b1f03a32e9b41e8742fe7ee126411cdd
-f327812a36818f8a88f4945202863de81671c01c608f2387d1de2d7e686b5f20
-b7dae705d654112576d937efb9cb33ee65b5435ec9ea9eba518b3f9f1d30b9ba
-7f7162e86ea5082e983295e074a854f1be92f637be4e7d99a75b582ca29f968d
-3585e2f6481ef968c08ce36976ee7dc1c1577fcf9cb546130352f80e880ff81e
-3458808bad09930300f85833c920c47d61f6be8ca5a5655eb4290fea4d4847c4
-bfe69e08c0a5cb8f58455f27d360da7950118eb86df84f490efcc4969827a14d
-884551b1185831850fe284b53b661098d1b145b3f2a16ea5c7ae601756da6aca
-c141e3ce0b4079accf03fd2376db53832bf0d41b49da9063e79d63bdfd37bf7c
-94906c6cd82ee31e2184bc695f2746a01cff0373b369bff632f3753058cba0cc
-2e7339a4c85170dbd24fbf89d917aa24de7583dbb8feda459081af95940e35dc
-58c7d363511b82b95d983b6679f11bea2675775a1390bd8b1f66afbbc1295bf1
-05bf399faf1665bf04d975b31d031c6c74e3ea1489c57e4826263fe56de76639
-2698ded8780494b338640fc42a58c354a49ed70301b128f18e1c33c45ceb89eb
-39ee8c97e200dc39325571494b49851ce1b8d1d0bcf79a3120411a8b168a7758
-15c0eb119ca69ba8fb227ce5747785e4a096f4b35eb15abf3a8f45bfb50246ed
-2a3b2be2d639fc263765a00fa0047972552466f8dd6d596bb6812fe530d78ad9
-5a6c1f0c70f003d4f5d6d255e747c99c7bad63f97b51de299f7788ee41f08ebe
-f60f52904502200fc62d912560792ef032433366860a3154a16bde3204401e00
-3bd3663669d15a79596abf25c6770bcf93012334db1f1383d80e18f783b5088c
-8e03e5537396852caff77cf3a15899d21f6cfd57ca4e73aa5a6db1d7f3e7dba7
-6a31baa5d770072c9a29c06010bffb0a0e1141c7d9ccf6193cdbe7da527f4cf3
-e63298fe54b6e82d64bebb75fdba752968910cf13b2320eef043de5a140ec54c
-01942dfbc94375e12a9612cb20d117f9d3e0878ea790088bfdd237ebb2caeef1
-6e13217f0f83f508777f9df0e37843fc9216a06eb096f7d6276df5ae8cd9db39
-25a9bd2966b7c3b58214efcd2f9af2636d9e9f73b09b4da344a81f7a47dceab2
-b23238f002540d017bf200bdc87bba433c7d7ec3b55da5af20c37cbff34701c4
-35f091ab701cc51c9f0191d5028668bd6a871e4d08ba19170f8c1430f1b542b1
-7bb65c5a95924a1093c04c9af060e456ae7695ff5f6bceb846976bbe437a780a
-e7cf5650496c859eb598942e3700e7d1825e0af3bbe764369a7ee75f14dcacb5
-24be8cca7f80985d42570543532aa5302964f5d50fcbfd1e094833464c361d94
-de5ae694e605271102112615143f68365c9a626218b923b2a2ca76c4e8707810
-f1cc16d0da031df23e71591b1cba436bbd25829c3d0f0eb60e8b85d2f47e30bc
-b0abb659bca53b96cc968db4d82f0adeb1467b54315451bc89e953e1e2f47141
-174fe9a4850b451ad468afb338539e2faa9320edff3118c60a5c4a7e32a072fb
-59bce786196cf4fecadfe62c4f3a000a230169397f73388f06d9c6ab33fefeb5
-b0c93ec5c4fd02ebd912fe85eca4668d8723d9a755ec2501ae74abac9ff03238
-d8f82e1b48071f527443f2a94a1f90b6f2260ccbf51b9bc2de684a2a8563beba
-3b05379fae11d6ec2214953decdeeb994dfa50847ab7357b121abea5672498b6
-9a52b029e8c77151bff878f7f30fd0f9a40b8e1579a8b672b7c755b68e28376e
-4b5becc11fce9480bcd2c10099447b4e6b3bbcd3b7e84ed51c633290ec084571
-ba4665bc26ef665621495045e18e2be0ee391f764d94f7e631d02c3c9191637f
-e49b03f893589e3ad60281ecea2160e8171783693e04355722ba6f7c8da1db86
-b1ea3004f486f94e9ccf37749e8a0e927d15e84523402684c1fc4c514e7baf20
-d77d00506cef1e9b81fb8244f0d6095ea861c446948fdbd822d10df5d6a82c3b
-0af0caed6d1fe7521c6515665be4a5e10c8703c8e4d7db3a735119fda2bfd79f
-8f3dd3accd038fe9158e33cac57890e6fb22b41f82fa854e1b6a75cea187d2b6
-18d4bf9117bea6261aaa838ead2e50c115c997dfc996c8d00b587791c5285df6
-b5cd27b12e338a650f53a0ec9cad5bcb0f2053dc77aa57a766e2f8e290586e27
-924cd5a5c1cf0c08c48d0e7f9990e84644e9a6f5c9b49be9e3d7322b9b66de57
-2e5b0ab001a2c9e2d9782796a4a7475ae1bf45d9389a99371ea684ae896f3985
-8d17a6c734ec6fd734a64c6747a207ee39f1c9f896b6f6ccead910d8bdb9b642
-b141d1a57dc06f9f303947c61fe1d97699fc3ce4c66bf9953b6ec5ef743717cd
-831c22f49a68446b3b8a966b8659fda893a67fda0cb566c0eaf31bf88f7b480e
-1f05a59cdbc561b6c7d532252aa464fda44727d80b6581c7f8fd89caedfc3b57
-802e694b74dc15b889c838571cb6ce197439ed966d5624ba7567e60e4dc52c48
-c74e5f2c2e0282e54cb82a5214b3a97fa82e779957265a4acf064bec17700158
-8036c7b52c4c2233cb0e8b5b244de31afa11afecdf26a916cf1ac85847a51eac
-6cb46b3b35d7fff18d2041a63d853535fd09213116b0b62a115623b471aa4849
-6d4112ed9ec7351894cb36e9f9a0bc1c015cb3110201390643b2925dea3a3dc0
-7fc8d62b62ebcdc38c2d3316b8ec0055c34acdbde86473e4dfb1d5e33266943e
-9f777ceb99c757b6c6fb5c69cdebf31336d418f0698622f2a0e46bbd0094cadd
-deedd149e7ebb57664649e550a850dc994df665b57d81b571e4bc6c0d25a470f
-bb9d78ac9d2fa47c41675a11f3e5b88b567813256f4a544fcb21238a91e2e30e
-c3fe52ff997ea81e1b0d9ba23e0815ea78f46003a8463158f6077024b33de798
-ed9c1b02aa6428d1dab23df5c5b055537b44c47b4cdea9c7783ae5d534e65b2b
-4dcbc46156e6353307e0e510e4d63c2b438737671c024f29b80513335be3b4d9
-8dd586131c242b34686881b7d38deee1ea765c86e7cedee45e8f184987ef2e19
-15e668f56d7864d1a8ffee2446c74c34163d2f3b7a9c130ffe08ed50f82ef23e
-de6b14e54da94c19bf1e845d52cfe4bb5799572993d3115c4e8026d233eeea4a
-2e9aded6f4f13059a77a291a68899f823c1dc8cb477b8a63e613dc9aba760219
-e59dd6207ca3a22da2934773001d735472c921f2c2edb778c8cf892295482ba7
-6253c77b38ceab6254eda38eda2ade861ecaee566ffb7228dbbaf41cac2cecce
-53631734fc3240ac314f0c027bbfcb5706cefe4f1f975a8e2ee0956b23fee700
-92ef2de443b84ce88d513ba4def345f5804f6b88752921e636e9f3805ad16575
-88415aa0e0de5696f58ee1f5bef9053265fbd2fb59b1ae56b57976169aca1856
-e577d8ac3f8682ac5ae380031077961b4f5109f32cf14844d5bf33c230bdfa36
-7849549ec66ace781a6872b0997b3ae724ecdbcdfe1e3bea3985c4c49a301c61
-d420275f26fcd495a44e006fb0dc4466adcadc04ed4e7d5327430b63da5fcbc6
-15df77ee82f16d884b82ae2ca29fa3ed9bef89c39636c60d9b3fa3b0979daa47
-247a16e7c85d3a2eff262f02693468edcbab854de2450ad5b57549cd210aa038
-66b7ce681a264c8fe84d1e9db444dc9384613dcdc5eba9b416e45957d6781b68
-2b91c3f421c8ab3cc4c34770d92c17154e67c70dcf432c75b9eb5ba31fc1db9a
-deac4609c8cabcddebf16af760647e84cea4ca275a0172367ad1267fc4b53a93
-bda2df9bcf433ae4a97e97d2216fc97fc6471b30d717c89c070f8907a7606c63
-2d584eb26c0def8166b20e33e5801f41937240794c42b9a89cbba3d69edd7983
-702788b068646d730615f77cab05aff0d0d3d6aa954aad02b927fd16ad2e0fc6
-e867725194465abc056a13368c8ddad965d1fc158d8b2860ecf62f91254f5d22
-642493aabeddcd7936ee057c74b65c3209f97d139b4ee97d071ca97ded70b3dc
-135b4f6bb4b614b9b873d8861803e52b5c1c244041ac55002271c638d59fe5e9
-81869703cd7a6c4bf77ee3c1e874d01e42e5971584c4fe6793c9bac4ce1e4241
-22267304ee3494db762355ad4ff4f4adab137c86b075c9b8f9d550f7c064c50a
-f47e512f1249167dc28d02f21f46de36139b14c872cf9bc0c42cb876b9381cc7
-c193a46d0e7e4445af03a2b80f21c03c1bdb4c8e73a45786b4e3bbb461765baa
-57b956e0cd966d1e6df77d4a4fb5ac914cdd7c6619ba317f7c33c453ebf567e4
-e4ec75816c790bd658350a0fae0eb699c708559b4b5df253895491ae9c77da38
-8ddd56129988ff4d6fdbe7c01d890ee2689f235590f0b80de4a591e33e8196c2
-0105969df7fe558f8e2f97372ffe67adda409f12c17c979739510da4b5314ca8
-e4e64281658b232b0e3edfade545fd3c7e7fbee52adff818010270b0855df99a
-acff5c77eb34159fbbe8c6d355da82eee52b7e153c354cf3f18baf88d4cffdb3
-00c8b1cc7f30219b26efc8abc8edd998eef793c7f4cbbf8a7d8f702271740335
-ba6e596c0876e5b3437218693508f5b59a5e24e754adb4fc549faac222b31402
-a8b754b37c2cc69a69abf86cc89123c9cf654d2d37a08251bc1f119ba6b72ad1
-55d2d0155edd88f76eb739280b74e364505548ecd95887229aab96271e461c54
-32aacb7fcccfd3616ceafbc4932eedcc145aa25e9ca13fa8d9ccbc9147418793
-b86718c5fcf833e4ee24fb58fddf71a53fc5203e1fd3f8132425d9a9bf216a79
-e769958a89ff7104dee938179b316361207cbb3aedb8422ddd16a10cab1edb0d
-0077f1d83716f824236037c83a759f323cd24d057a3057e5b5cb8364528b3676
-c9bdd5eb9c47412c1a65d04a72f4fb24aeff98ac6383398760f2d593f1462aed
-705e4ff227ac6805f91d12486a7658a9015ca7fe8badd6f449a97e4a4d3912a7
-3942c9ad0eeb2d732fb5243700cf95e18712cdefa2406b5c230a495e57b46274
-e064104b8b1ade3f2e62762a9528b850e4ef45440713626eb81df73b470c2f7e
-e1df0501871f216a39cf671ecd4a289dba51123997309113785b7b73a5bfac2b
-26532b86124942c3018c02f3d904c17596d451486f488593aaf66b73490eeaeb
-f28eb3eac5f2a7659015f205fadb5c833f10375b029c1e3046a957036bf27c18
-1ac81761cd177fedf126833b3dcf3e5caf296b7b910caf9f6ea742b6a8b7503b
-3772ab82feeadcbe041fc4b959586e06aa7185ced2095c33fe11564e857bc596
-2cee40d18e59317f21efe1f27a10b32ce40d3b4a60692d5346cdef10fc6ccebd
-2a7ce79bbce9c4ff44b2f06b9a28ee1328e043cc12b42ab03317cf9bae3e84d7
-bd52b0761c1c0fb049e7aabe8b2a6bae03b2a8ee4a6543cd1f2c89d4b906997d
-5530f949c403ebc40342e9d8816a39061aab7ff76c0080185afa3153500dfc70
-587481dc9db515fbd77c0b08d86f944f71745a0a29517136c9b679a5b0bedca7
-f623fba6b954f39e14e1fa04f01b6e377ebbe90e24d069908456762c42b35010
-677308247b6343061bc0d785d78a786b1a04bec9f9dabeb86e30e64fb4ada8f1
-b9fd75c9b0d64676c4c78d635b3386e362ec7cb06bf2c85b8a22292a58f7c038
-827a1a964af9b7b9f3fbcf8472d120c5d9c0bdbbe9c13ef14d2bab51a183e3ce
-487c2c463b5b74f4b770ef9e0c60ed08a7eb54bffc1c0ab00c51163af9a1d428
-c30a5f2abb783c39e1891b93b27ba533aea8aa8b3bde4d9bdbebd0cb63554705
-5e2dbc482dfd2f70e88f9d7785b37492e6068532149a9e8fd5607911993e9dee
-e1dfff50620ab8d327e51ecbc1d9f57045cad11228d13f073b197ed7bcf23bba
-338890c5e4c89a831d3d6ec6f4938658b12656546498a6c7ea94f50c04bfee0e
-96b00e1f90bbeef51162d5122d00a62d6fa8bcc6ba2609af9ef96f2af7341ef1
-ff453232622e760c66c04a5ad7005288a1963291a82ad061105283d9c1b6054c
-5ac6087102fa0840a71d8ca55225f5ee5d9d8c5f4233f6e27992351df89150e2
-0e4c5b3707c15bcbfc0a2eef1babd8bdc8ce88410b5d21b2ad07f6a6a752346a
-9392ac16bd36af87384b3959c8ad6092acfe0bcb4b1ecd45227fb53969512f34
-a99c43d16849f0282592f199a87cdcaa47af35b93c37b341d4f9df8aa99de0d3
-9dc3ee52a87141cb9dc54ee197d01063340f0d8c34abdfdc6132bc39e0d10e4b
-094ef37bc33398c0c2eca7b7fd26205816798ccdacde7f235a70433df45909da
-178e6ba670d4ee36c0894e42fba7c6e563dc44b64c253780c586a355963c153a
-d25126232fb9a930e7e46f68289d1d1ff10cf89c2b81a82872b725d74a0067cb
-76f0c8d490a3347c1e8c514dd118ffd233fcf22eebf361b73cf6d3a2fb137276
-4adf6e62d8787f9988416118607c6128f7210327017bcd6db915b88c7233b2d6
-25840ca2473d6a9b86442963466334f743263c0d9df232d42b7b35df16d80cbd
-a08e17732d864bbc1e3f244c54f22f8fc198355440f8790aa50af33aa967eddf
-d61cd3272c0e9bc63598c50c3af58a18c649ee88c38e4404af24867e43a0fabf
-8a709eb5ba11696a044c4d287dca9328d768fc04a14c382d55dd54500cd5e601
-bf64480cc4f247a4b0c2bcea1a0c648e7e8e661f69dc09e789e12581d99464b8
-549ad6a29c2874744c42b434eaea2d2943fca61c27bdeed1a52be6e6808383e6
-a7c204ab964e78295355e2c53f021a809475ac21375c55e0e7491f4b1289b3f7
-5a2e607195f602687628ae541fa96ff05d01dfcd6c04a2ac5b6236a7b9324fff
-00b71e095442bf04ad5b8e428b18dea2e6dbbd77a9c096cf4fd591f6a563bc3b
-734b45ef6bfa0e83ccb996b9f8981e55627f790eb93947b2f01c46b7b4ccd788
-d870da4d3242541fce9968ddd6e438be5d36359d09ffdfaf2bf1ee47d9633132
-f41001b946b4879400ccae1c8a934a808fd1fa6db83cbe3d8dcf2af0d577fe8d
-f6fe30b1e0ff0a68c7c8fcf950bd9aa17c8d8a19296670eea02cd17bece759ab
-abb6a93ed4a6af531b7f8ba2e9ddc5c438eee125506816025795683f27d4df22
-d811c2646ce8830860a5d8992ea6a8c0ae01280b8fc4f27b1b31d32f826caaa9
-635a1ef2cfef6ba6c9ca9c0fe970d6e601a88ce06719578c27f33ff9f6f2d672
-dabd6f0be0235e3ed61c90bb0f304188784a018ff90156d8d04c7071f0de22f7
-d2cf7ed96707a83461ec99fa40f6d894286308858bf6f616f6c1105e7e84060d
-1e20502bbb968b61eee38f151fef5af57e92f1d0196b8eaac2bcd8ce523529d3
-e8771aad8265b7e5e9846f28c2a83512fc056de6a20f8c4b0711231304b5050f
-9510c17801de0c8e2dc22934ebd24a6167ff15e9a06c023d025f05d1f960312a
-bbfbc9eae21c4da1a6cb51ced11db6669da3e2d8530fb9c9287a4dbeca43c0ca
-936364d960f7611ab03fb143557d9545ab4fa4d407f125b8ec4e5c366c4d2a7a
-0bb9a135eb9fee265dbb5955ace3bf374a0d321c82e99329166806ec8d198adc
-af85bf2ef282c3ad477224d4a028584b6a2b5e4677690874194bc2ca665ff590
-da247aee67eec7772dca11a4897b12cd08532dadd9a217055b4840f26a8e2103
-e1563952d46a596e511ef81d1fb0d502fba1c6f5c0ea17c3e75e2b69e54eec6e
-0bbb9278f565823dd1ba4e5e850cd6f5aae2672bae4a07bf015ff08a013bebf5
-810fa3969991aaf53ce458d35a44afbb39d4c3bd166ab4cdd2389f3cb67ebc2e
-6782677b79fa51bb557c49687bf1b11f2082665b151e757e94259ad6659502f9
-0dea0e4588b706f5b9dd7e75bbd371539949a4f203b1402e5b35c06a7061f048
-8ce78957c95f4d0db1897d624e8f6f60e4f604973a89445221191f8c06f5519a
-ec6be0a1c2be7cc6e5ba73c619f2badbaef9e54fa9ff4189246fb333f4dc1f9d
-deb1120971d08567d890c29571327fed1651b073a357d71cb48a852afcfd9a32
-3e1b540aafab71f6a61e05addb80a225b4b88c4c0f484197951e3972df4b9560
-33d831653a2ff15e7083adbea09b33a35575678e145030c94b0c6e0927c9d4f9
-866b72e6b2c203508848ee893c13ab752bce6fd4f9fc6ffd91d28d14db80db61
-733849442b4979ec6dc0d37c1467a2d5381c8d33663995ce613728d6ae739370
-2f9d266a3e09aee52ae15fec98a8abb59ac09dfd740c0eef4e11b78cad38208e
-5f60d396e41cc30828df87b3e50bdab69b39af0fec8c02c324d086eb42e097ae
-4ce80ad0d2dafdc139e67391347e116bf1520ec8772b4b74e9272b4bd1d4cf18
-e808908988ab4bb2cec3db5565393461ca5af862e6a0f2183fff5d81d6508247
-05d5036599fcca825a74d487a8db33e6bee831d324f78af5910919d966ea57fb
-830f6b782d3dbb8d5f7bad8aff2ffa541b16e78e2d23180b4c21aec877254afb
-34076c578e4c40058375ac7e7cbbb7793488d7544bde5a6d29cffae9eaf0bd69
-b717eb353a7151bb06bd5ef2a38259798a5a6c9a684b377c0d72c932d52db0d2
-c9e86fd712ab9efd0eede6c36f24f2209605c401a3ca9bd28ff0959ffa480ff4
-a0eba22ff723e4fb4699beb0eb10c3f8e52022bb2ba2541941582667a784f397
-3cff0191832b3eb363c6977661032b8728ac754db575f3504749f70c8b021518
-90c8010c0da0503726f4aff60c240e8fd733fe37c74ce40a236e8c088c083dec
-dd187a2c95515e54ea4ded8226dd9e8b217e936d4b41c767eed5d20da9615b32
-2193abab5fdf0a2c3ac1b35743e5dc9df9048557982b1d87296c2f82dccaa4c2
-3293ebfff03fb7f8f252ec7052793b3e01fb17cb526814d7b73ec1abf03d9769
-a18e3fd9d4ac55bfb534481780790b76fd92d947f3adabdc10d7ca73e59406ad
-65481ce38557f64c5a23d1841b896923011af9d7c3b999772085d8da26122059
-ccd4972c484f9fb3e6319414b393d39b813ca2b603fa2f18926178f1fd33d22a
-bcb5d561159b0bf186e52cadd6114791a9cb211c285118cf6550ba24a931dcf0
-d5c7bf30dc413918ab2f6404e51d612b50094de3dd281db363d254e17fb7b889
-cb5b906db3b604789ab7c7cd9922e879b1d7a5292990a7667fc1332d71e01be8
-95be5d17f05d662243c7e3088fab828dff19c60b61f1b413e38891b5c0125648
-59db561729c92db0aaca99d8309b18f0789a09429059c57f4aaf4d39c60e4866
-a01944c0adee288eedc7a3a3abdca9275720d1b3da4233c91a4ff6f1ad4b8eb4
-ef4954da9bc9e0c48f049baa0fb35815c66d644d3bb340872928802611b73c24
-397f3fe32125811c8891a8a4c454aa2ef649d12d9c285310e0177e0400d6cead
-27bb940f9ec37b7717c3668683ea1de7e6fa950a5df69c6acc537864062cb948
-435d769f1673dfefffa71d9fc33c063c12f77ffe7a9ae14198a6623488ef0721
-93b48be6c45bfe6a1eb11d5cdf6ca9dd4bf4a2f0585365c690e57f83f7c0a80f
-2e24520d10819e81809116c0948278b9a9de9bcf87b2cd06723c0d95480e5747
-f437531f4bd6fb9ed73f5072812f66dba6fbe10eed9b19ca8d16fc023ba44cfa
-d17841f9bfd586f914e0d2b3336b4cdfe63c602fc06ff2d8dee6705955bb5b40
-7ae736aea9e77d00f679ed23049980872f1ca425b6ba0f35703f5d3d28cd7bfd
-8ed8818703308374a6a0bf0411b8de186a8b9ae2c67a37e4d2a4048dab5228dc
-53dd2bb2b269b1d220975d7ae8db6f17eefcba79d8b8d21100e528110bc6c3dc
-147e8e2ae9a38c54dd105ba79b57816991c435f412e6deafa71724f00a1d0b68
-faf771589d6de7b07f48e0cfc509726d1015233a6d79ff1d290d40d3f1ad1dd9
-19a8b41646c625c840ccd98fa5856ebb7a36f778d9b920d7ad0357c13fb3235f
-52e7e9eb1316c4fd0d692c6ef630edb722568d9eafc20ee3103ec21ec8ecc46c
-c6cae184b121be328883aa1c0ef56ebe2eb0e4b7cf40cff3d0fd5cd2ca339dff
-5560ce823f29fb7e3cd0cb47b16ed8bd72a2126f3276cf178bb0f1a2017dc12c
-8a64aac7c26bc7f940e29410d516f4543a21b07f28625bbcbde727901f157a8f
-7ee6d875847151cc685c1474012f5c92f25e8117c16b816bf3d99f3fbf844e71
-51e2f5d2b487a03399b3e263ffc722f6d4652ff11eb158327a2c94ebe007f9bd
-fa6365221e676c846423d48cf1c945612bdddbafa91e7f76cb71174a48bcbcd7
-3330040298c4b93ad3dc7f7ab689d3c68daae2693482c746f3d16ab5fb291fcd
-16c7dfc8b36b5105c35d65e23b7ae1f46fe78204f0e48dca991d94bd4cd0ff6f
-b587386211746e1814daf38866e9293a890b47cbe47d6d0241d1a05db32f3947
-dcd22aae8d26a2c92aad8041372f86ad9a518b2b40d8f9a35e5afe82770ab8b7
-b1b2a2e2e456a7895fe9b3144ecc6f3dcb4804d21a6cf11e5f48c8f7d6e69e23
-cfed3dcbc7cade5410701d7dbb19297616419fee5ed72f6c4c302d4b6928e551
-7a810b9c7cbb33096cc68d509201879f24646bb6027b541be7013fae97ec91a2
-1161e2c49a2ab5f6ecc731da083842edab4d7a029cbace3af24dab6ef566228e
-892062ec9ac9420ad0cf098f89bcd0e46f385fa52943c352c62341d5a1054e5c
-5c8976d6085a43da60468e301e19f2c10dd0084143e377fb8f53b3a4ceeb0c83
-6f88ff44e180d46bb136fe75b2b2ebccc364260bd72ce07e935d65d2beea401e
-2a3a12b6b1a9399b76b66fb16f57431e0a84813db0672d84c405bff5c06dfb1a
-7cda4ab6974e13d88c631208a06ed15794469491547056e7929d543d05ef7f14
-a51f64728e444b0c6fcc06ff89a8289620160d82e36a477342b70ca1254e4792
-b3b0b5fd349c38dfaa19a3c306124d50079295bb7224ec8b8568c9a60f8063fb
-4d49cb80175ed24bff8260e3361ac5227cf87a0d9d49f56366756991112e567e
-a80ae3e6451f90184ec37082aed7eb7ffabaf3ea4cc8e9262a4c893da2e6531a
-4fd9e46d3c448031f043b0fcb636084bd0284a20c57333c11a150ab595049323
-d0b9c535bc57dfbc7f32247a374412328f5119098c9e2a5182a47e8ea456a42a
-bd3e53b3166a525cf6722aa07efff48901d63d851666ab149439f0a53fb5a45b
-f816564244c03ff44292183533ba2251bc0b2b1048a02b270dc0d20fc731104e
-176cdbd1dc8be38245cdc422ac0f96d8cf78f43343a3be655aa8b1fecbfc67e7
-aba66493f877b7437c84aadce69d46ad9d61a9b2cc484e0f0dc9376a857a8709
-39b695d5afcdb77049cde5a4ec726022d0f92d309cdbc7f6ac5e6b5630169dab
-c70fe75da2048a6c5c6b75fa2017e8892c8cd4aa408452e0054c2a9e73d43e91
-67104adaff3f149a43da3deb46045f507b08768dad3587cb00a1ce8c185f874b
-d66f45316bf9ba7cb47ee1a1a055a91c03c3d94128a82b5a7bad7e304f7baac6
-5d3ecca28b6624e745d728af83006891bfd39cc56e28af59ae3317501b450592
-bc6bdb032e8d5f319552bf281412e033b73644912eb30cec6010c152f36462f2
-5bca347b9ff899a593a7e9b96d6ad4b3ccb20e6a972a192428d4c5bdf79cc717
-97cc5d48a22981afa791078445b7873ba9f36a47d4e9124fb063506536bcf433
-d4f898d334548332e655f1430c5fd56161e78a98f8584de372f5036b7e02d712
-c0422bd413b89b831f41ef23d94dcec5db71061cffceb7c3f920a1a63d28cddc
-fa742f11028226b3c6c9987ecbeb75e343c61837bed4597f4b2e8e130537bd60
-7eb0016b5c48efd3282e758fce1868ff5b302074cbd62af9856de3fb54996a3a
-ecd8f0c6f0b20ac3b511321dce8f97d5e67643a9a63f7af293c863bfa4ec2c0f
-a2c76aaffa828aa6643eee7f6408b6ea09e91037f30cf2c391f4c9d9cb5fc01a
-5a012008b64c7e19ab795e24ec662cd3a931a98bfbb545be4489d7d5fe732cfd
-c903cbcf2f600bcfaf858b0123a31c12f2abb98c17833876b152ee9efe354873
-b9c144acfdefcb99273276050fe43a140247a35b0994927aa2a1d7463ed69e08
-8881a303b6131e3183893e3d001f241809a990efd1c1ad7c3b419cc1644bcdb9
-a47e3a8d8fcf1f52865c4efee0079b840b82a95223193515b85b9102c7e3f0e8
-65f44580845f0fb5fbc16e339b66aa51779eb714a056e56afaf0ff6be5bce7e4
-754a553912486a7658a9015e1cd381969ffb9c6bc4aaf54ebb6b0051fc7eb362
-39941c8e0fbd44bb2fdba5dc229e9d659db1b44bf2688cc7b29eb0bc96f03f79
-fa0b953aa215ece923ef8a4030ce185073c30ed1dc8f6d6c005eace2a3642060
-b95a54b0a0b1980b1f4608b63f245b8ed7e640a9c3bffa3fc42449d9d5cad579
-e86a050e5c9aa8696c5e7c4521daf837f3213249848ad7f26da04aed56f8c543
-61b910f4e1c0e56e336894db76da6031e445f889c946e4c79c79b21c5c64cf8b
-c88d06cce7614817e26c5d522a2c3d26048b964f93008d482af4f25638e190f5
-0d2775dbb1c4a4c077e3721df3e49bed7f8f642a6016963b6f58b8efd5ca7ff1
-1367b20a7019cd66c43738f84203abdc5b12ac2c0e9c8fdd15d1eefa86b464ea
-d60127e71e62feb7394d5b99d465cca9022a4942f9e8f6bee849d655f6e52dbf
-26188ced3107e70480cdc5e7eb3766fd734dc86f86f823c3e5c0bc0afc0707a1
-33663995ce61372981903adb5cef4df34a3b891cfb8c30ec92c4627b30078643
-14b9ef98e4acfbb87a6912b3559d58dfe7288402bfe33064f126a2da07b981ee
-0dfe84cf8b2c72a67ec9c94039cba069c3ef2a24847a72d01a86145d0a97be64
-700effa830feccf46541278fdd3d35d082ce150c39d946362f3e5d23096d97a4
-76367bcccdb04e7ef9c608416adbae868f8800e645a80793bc0ce0e648a398b9
-268f697af3372197c8b33bd2760b0e75f7f38a6d94c4a52ce711c3ea21292bf3
-d48ccf0088c5781979bac62f072e2702529e43ff4bd63d94048a825882d6311d
-dcdb6f2de1c3de60cab153c6f48f5b993ddae60211b154a5ef0fc2a0c3d18c90
-eca4e35b8796fe6d99734fff908735ee111af75af45b6665b82189dd3c835ffe
-b13290cc59b25161908d29f385b517e85401222a94e1e5f139c5c00b72d5d4a0
-f4b1fc8dd6af78b00442b19ff2b9e8d87b0c33565ee49eda9a5e3d26b7c7c82a
-ed94f162930ef2bd23fe4628085a3e7c41153fdd1a335b994b9bb10f6cfe6ef4
-2cb7dc8f3ce9d8458f560fdd41c6c189acc63a0c38e38cca94560924b4de1e59
-873896edc1b8d0170c7da1af5908497d4a48158498d8c23e49bc813eea34a1e7
-3aa06342b6f1c7914d73c1618d856a995cb51c407b2f6ab72f76ee037547279e
-336fc3d223ede5cefd69b5c15d3972b2f06ffcba1dfb9a0c9f23c47f369de28b
-662cdf284d112ce70934d22e2e00b5448905591d813e0ecba462d5edcebfac9d
-415539241ac5e4f2ba785515a78b7b009b4cd20cccdfe4f5d8390f9765749f5f
-d6e529814fb9d54e906bc323b160a29c65c60bdb47083a378727009feee85acd
-ae66a691a76f7d58d031692215c3a82bfdb44cf3c52697006e8a5899a78aebea
-ddd3b4c4c8139a0fe0ed2aafd845adaff7b26ef4c318a568dfd89b5060b20c4b
-3c000b7cf8562fe82185dcbb58298decd616f6d9a0e879f1887c1605bc921f72
-d6b7eab7a44a883ba9f1687432c498eba28a7e650eb7b1d97ecc72c9fec17047
-7c62e050da13dcf5f62f26e62f4025ffeec90ea5ec51a2326f5c08bd1f7ebf97
-483279163ac37bf0795ae19865fbc560658c512240d5771ae5b8da18ebd3ef91
-e83fdf9d32e40ec1e633733ecff3ba66190f94f2b5338fb7d0be162ae41dcd46
-388bac55ae53b56e308c714a91ff676ae87f1e6a478075e259e9148d1b60774a
-a1bee100372a7e29379ab244c8c4ba555f5d77c3d98f22e80f8a255a36f1faf0
-b2fa0ae59c61d33cd9e70d0259da5d93f19bfaf6b19df1dc35fc783b3939dc8e
-d93572299348201b4549a05f316cad76edfa35467c4328df10e362b91aaa50a2
-ea7b859a5b11a9c5e9dd49a2968913619b57b8a2d6319ea4f102d8a9813d6c8c
-3dc6de3091f3a4034078f15dbee8514a59e6eefbd5559192d86c7b55761afd5a
-6e97279028aecc6d391feae0deac7cfe033e9e64339b0e581f5284bc81cf79b3
-eaf122baeee10655aca357383fd83d481291f37c90b8737d16d3416af742ba1e
-db69f6a73f16aa2f7c122a2ba21c499818774d11141e740d8848ac15d0acd7d3
-f0acebb718fef48afec1dad102e364a5f4624ba04bc3d87fad0798bd45a99923
-abed715884d93590752b7f86a3c77b14543590eacf229f8f223b8e9a22eddc3f
-a2907482fb537652ac3f6df21fa57cf44ed6b8ab79495771acbf4e99c1451507
-e949dba77ffca3820c50570d56e1d49fc4e9d89aac4824c370ce8833441f8b02
-d19753daa907205d4a7fdaa0fa130c296cb7b345916ffe0cdd15d92b7521e46c
-93d5b6ad6c39e66d5d6a254bde88dfde11fc1e0a15ab05899434396d95dbd7aa
-fbb7e1335de4a13915d33bac3f4da705d9ae891eda4d9ac185a9fe58c1ef7ebf
-bd73a418c1e43ebb42938182c0d905e79506f642ec70961d096d6fb73be25805
-4064c56284f06ceca2a7afdbecb611a0f67e2e3ea52c186384f7713691c8174f
-0bf24103dbab5900253a5f424e485c7c27723fb555d0e2c8af7660a5b914e044
-51d41fa45b17eae3f7815926098fb5346d527a7d7db1cbdba966bea36e6b963c
-2cd8a9f509319cc9ba41eb6ac29832c8be17776779f8c2d6cedeac81005b91ba
-fc8e4cba19744a4433c91319ecf73ac1a013554ca0ddb4eee09ea087fc9b2596
-5a9cade9dc4c9888ad0c9cb468b33bb95231646f016fe42b2b2749f77f6cfbb2
-d4b131c98712e2df5d1b024f9f22944fdaca133567d66fe5a87e734b958bd292
-4d97cfd2c3a13dbcac7a09abf9b153549d9b9c078813f407b9a9d8afe99711db
-00edcbfbcfbb273d767e4c4334d9a91ae12522eaa15f54f84e2f9468b8e74bf5
-e74a1fbcba022550c63a64d85c5eb33d02ca6c0fd1f5a9aa46348a953aeb3396
-86a46ce0a13686927c03fdcb24ab3d98f1a4dbd8e6b991bcac96bde4603a9f1f
-7859375319a6a850dd327d7d745fcfdbe437255a3566e9edd14af6c2e3444b1d
-d9dbbcf70cbd7fc5b947266938c04c9f63938e88ca30e4d636aa9cfb2daa861c
-3874cf2fdbc490e32bd6598ec696cd7d58da40bfcb6199d24f07b283b4a9a9cb
-9b5426be43b4d0d67dfd8d88152fa14b531d522a9fac6cc79d2617993d95dca7
-d89b8d7efddf4c29e58cb0feb70ba74400b8be82c0499833253934c7edfe9e7a
-90a004c4ee1c7e3dc31c24ad166cb1320da8e3bdd05afcda1492bc34bca43b5d
-32d540f77fcf45d879a5646d4a4604397e37fcc732001d0af721d7aaf69952dd
-ed912594fa9428a20fe0ae76e8401a9535f38e448f69d48bbd770f23ec075d69
-10bfd3604a1dc79f2a5159e8fb26b4a3eba3b50cc46e84e4ad657fdb0d254f0f
-64e37824ed4c1efea12231df670dbc1847880cb64f7f3c382b88e183de261485
-f7e917e67ea381a568ce37212f8849df5cdd75575ebbcd7522e1dc3400a1d8e3
-8e09555799cbd6d3f488633a9e3bd4a2f6f180e1d27e0aa3949590cee53cfcb3
-3a14fe287e8021ab0777baa8859de5c21ed2fd8c3b818968bc26f5f9fd712eb9
-424c83d0ad28b76d1f5ba1678ca31925d49e2786356867ecca08a150a4591523
-964ce4589563210507493b74148ad80cb3c171e22f38e73a0aa59f13c839882a
-536c00ba899d409a98480a1c7f82a44c36698d8ba5d0fb8d50771c0e91cea55b
-836a946ae06e2f0c2275db32833265402264e2f6a1c8b896d5ebfc7c1872f2c0
-b4fcaa97210160403ae0ff1380d7e68251ef7c25e0a66a312fbad992aa1311b3
-61cc5afdc82f982d7343b8b7909c6c7171f568eeac8bbf8b43dde0d928e81c86
-ba3bf4549e255adf55d6e5909a01ce0b270f53169f9807cb9c7c70f3d3a569ba
-8675d0f345f8e3a00a1c6ec27d5f83d275358830afdfd12cf23a0500e2512fb2
-faa9d333566da5a65dfae8ee515ae450ec5aaef7374ae1d598d5cbf677b85dc2
-e0394ae746b8c9554581c737d79b31048f4471d72972fd34bc2662a83bebbb32
-7d3e2c2bd7c65e68672dbd3ddc32bcc31b27812a1841c3edcecb723bbae371c6
-70f5dec75dbc9dc90e557280a836ce401105aafb64deb25e6ef6396da68183aa
-a39e207a4ed29a41d9be11cfd888c1e7c1c5f869ec0272c7be8c85703721101b
-0d41921b6ce168b781b1c745dedc1b8fb3f8fa027b0c2f63aaef59bb3c485c1b
-c773e6c0672bd48bcec83042cad9b3058b14f14051906960602293261be27514
-bbfc3b41fcfaccf05d7eaed0f50b3f9d85d8bc79288b474094ae92dbec3b7870
-d16c92d667fb2074d176928ec7bcf3939f665b774762ea69b989ee8c8334f20e
-3451189600c26df2e3a2453057dcf2562cd28a8d04b101ef004990d09afbf7bb
-f0bc3b20218d3270e0a3e3446ed7ddfbac2c37c5bf8eddc74c008b170d912bf6
-b1da8b9377005a6b6fcfbff04d0250a74b93a1437ca0a7cf497637106c239017
-160bc50eeefc55e12d6c3d65261c238e00b0bdd7a7c0cab8d1e3902ac8d22a11
-a7ed80dc0dd04ac63ccb08399b92abe56b4cb2b29b2bf5bcc4e7ed008bb99881
-c74036842e45e41debec5cd4c652d37ddfea9049fa439747e6b700f7baba635a
-ed47282e91ce7eb743571d533b7eb9d09f0c70081dfe408e503f14a0e117196e
-c1e7960f5bd60a1f5f076e31c6ca28c9ce51061d4bdcf5e35beb3622e3424529
-ddead48eebdafef6d30c02dbdd5f1b5c00bb52266a8ac0819fd60371053ba1bb
-80a8954a4eb7464618ff70369083068f1b60f059ba217291b6585d12f9046aa5
-e66dd926f9d802e694ce1dcd909ecfc14b5f3f44c4f73a0efd3e1422a747a308
-06ead9d72deb9fcc1a33617fd94ce9cf6e31b027b86937d0dc58b350a3230d24
-2596131192677c84137f034d015613e65e04fce2fad699826a666ec8e1f758c0
-f6fea6d199c6b3fdb6b81ebf80fba48ee1192e0731eb1b6f439f654fe7f419f7
-618e1e00dbcc0dfbbd1897678a9e4a6078273233229035c98b0e1fb4f4ba5102
-91d44e807c37ba07dbfac535c9714fde3de3114776dc82e28f7906c342ed5688
-44c2f06a45de22c2704f3b8c6293626fb9a018026a9bf7f688dd2c25a6f35845
-fc3bf34ada6e71c93249a8575cb6753fa9d7d8a2b10f4b0979aa234326185387
-63a8a532543e427ac650c67aec94fd5f67a697d93baeb2c8d1fcd83f04de01be
-37e4b8d966f5d91818b80bba52c34e80897521bbf46172c89247c257c77be91a
-39c8e4b4eeb5d54215def158219b0111b7f9a6c3c5b32945a5da895ce74fecd1
-c89c2a3933fdc1183edfc2042594fb11d3f2ffdae852be0443f5c37765b3aa75
-2e94fb1a0ae436a38a5178023601e903851f015d1a74d1d132366af6ab2e78ff
-5493e19ad35553ca6fe7dc51b6f5dd62f22058c35f2b0ec5755aea9722491f8e
-6a7f5d3e855f56533fb9e5775fce5aeb0ed6af76c3e7b24eabc352548bfa2550
-c66dc44b2795ac40d1223b416c798cf1c3aa90a8b404bc4926b3bbdfc2c8a995
-823857a98bc528813437a0b892530fdcd05f1fd496340f528b8bd245a7cbb8e4
-a77482da0f6c2a00e492d878a13efdc2f280015a6864657ae3226ca00477cb3d
-c5ba741aa7e4bd3a876c6d7100564be6f6a2de0613ead5f9926c2e4cf5acf5d6
-5035e2a79e286ad6fb4289ec577bec28f51a8bff37423f9f0751a79b91bee5ef
-1e18ece169ed2723c9d2103b675e335641cfe424360ce2503ef49dd8d158b8fa
-7c3d6bb8d1d0bdc607a08630a67be00625786626f6ffe698c3dd414215b56ef6
-756720a12c1c32fc363db28ae0e206181ea32fe554972e6bae5fa7bf89ea3c5f
-85f8b274b9fde63c7251e43102fcf4aa7180ec3829c55040bbe511c619de5ca6
-95765172d5c832691f6c432be0397bc401e2e54ea1b847bd63c85c5c9f62cc5b
-e1ddb4ed907938472ce6a6a3cab60495ad8d5967150732915fbb5ba40a8130f0
-5df637309f37d4249298cd57619452601dcbdb1ac7f022f6a024d7ef53c0eab2
-b00ec3212764ae73ab88d18806c1252d0ab508951bdfa2afb67b9d5a1460c11f
-c24eb5ffe80440260d212923432ad3f3f9b67b58462a66e7313e5c886a046e34
-80a23e08048ff3c918f26194066e29c36841b547aa3e374c1bdea8c9802509e0
-e787ef0aa8a9955e1824d0ff95e294dddcb644a292e91e8f00109994cdf9681d
-c84725604b266b8ad4b196791f2752662189ec0e9fd076ecd5233b3a436f39a0
-388be1ffb33d075e55a4683b9cbe917b06c1d18de8f08bc06df4a8946869355b
-dff8bc9a240ed22bde34f932d90ad2994c7b001b55957b9dc7a7931d1a87e215
-367e5b424cb74545623d8aa9539b66803581c1746e463079f3b52fdad364eb68
-58d70b9835b140cd6db9ec95e50a64e4b88e88d2a79fc3cf7ffd469801bfac17
-1373ebfb52e32486416c387c27f0a455ae5023cf1259e691cf5b5b339a2ceba0
-9a2c556ad65734baef23d18acb009564a661f59e1e93fc163dbd1c0f2fe231a5
-8aa558be68f033d219b0736b42a0611fb15916f3058b3acb9f9fd35d81d6e1ac
-665a358233c0aa23367ec3adbc777539cbd7bee88e68849bc91037670e8d9df2
-5402768f04b5fcf34fa8f2153c37ba7ef356b669b5cf4615b745d8b9968b6009
-bfa5ada490637faaa554106d24d4e755e4f9f3a9f52a1b15a61c35b8ecb983b8
-083af04f9fd3511fd8d36f2d822dbdf884c61627d81020a0acc19f5e36099daa
-53b0d6d98d0394569fcc93833b89f87e115f5cc26317196ed78210afa8a5f0b4
-9abdf7ffd38a892bffcbf30064176ff3c7fb3030da4afeb5af90610abc321319
-020412a91fb03811741e1b0ba8a8c93e59161eb5b41f82bf41a5c21694c8373f
-58e3d1dfba33a6c5665d8b73ed95c9566d67df8456b2f61c559b2e8d60c6e2d2
-f1c85d4eb1ee33dc4718a4f37e6a5b965ad32f8d16cad21d98ad189721a79aa5
-454249076a91c684fdda1a1eeff70dd07274b8c402b6a37012b89c0c6870537d
-056fcea0c6fd79efd834fb29f8ca28c25c57de5123c540750972b2bb08311835
-c11e6a5bfa0c31b18ca3f44899a8e160d97715676ae211ae8ca83cecbc6bd654
-e1422aee98c12ed1fbfc834edb3229c7a693ae4e6c759bbf3cb496672469d856
-cf7da97eab3042ebc9bd3b645c1d314d3e7b38087a2b0e7f5aad5e880a4adb50
-e2819b638eb42a2cc2c3b84a27eee2959e51811af80b3abb38900e48a8bda718
-078a5402c724cb4080bad3657b1bab969e2f0a2a088fec1ad16c2f7100370b95
-62753c659fe32401787f51e1649274294d3886e7fdeed53adfc66efa195a546b
-05bf288823b178a968a20f8af64667d75e3e8b1c492b571aef01e55623e33e9a
-f88bef36a34d620fcc742244482747708491a1c56611abd75cd8964155f602bc
-60b24f38121bf53748455bd660f17ad52eef19ef0d16eadaba48d5b4e0cb0422
-7229961f8c1d14cf17a7e88abcaefc3eb54fb656c105b2babbd90dd6ff7d44bf
-9d29c6ccb09b5c8ef13515e6184d15939fc90aeb78b4e064e21e2d376dae6dd7
-3f4fb1442ba15e9161c62cc93acafcd55aa333ca496803927d4e40371cd7b5ea
-665113de3b56993e991c966b7777e80c8e0b82dac778254d6d9b3b4c661db3d9
-f2cf96fbdc16a936912a0781cd61af375f314fd8933642fa12b970a75cb813b2
-7a2e900a742de7d1d762f780fa3d29637c1b7dbd66b7d4f7aea7a3f51a6510bd
-8dcf5c4dc4b5ef5139a7f3f0f654588a4848e9d642676ea145d5df301ee491bd
-4784e01170c4a5a4a0787f83db24931b5d9b761b1ef47302944b8e689d56316f
-80cdfe37424c484c83c02ae707803169d1547cbebac170ef5779911878988333
-1577c0f514131c9f94914d942d0b4cc6d72a9d06c250e0454810862a0973ba63
-8ab9d4b424ed51d5abe3e39f0befae042437bf1acdd364d20d76e3737956a0c7
-e666ba52a889a52385496273bdce52e307440c4db4a70e7a6da7c655469d060d
-4353f090bd41f70dbe4b30f33c00d8964f64029c41ccae18243551afdee211b8
-9744d966c63913a6714ee2b4d1b82fd0aa1e6d2b296da04b3377f9b621f2fa39
-0b23bfa275b1342f62e6dfc4e3ba85dac525ace7cc2c170157b32dd13ef9ab65
-63c62e6c44c45affa457d12f0a8fc23e1e0cabb5927e7584fc714d310d3a5c30
-71d204f98979405a0edb83f468d58f0cd82ce3d84857f928124b5d4d592c2dc9
-196a7b32a7b8ca9f3877a9d6463f1a4eebd736d02e543d2ca7675702e06a5c54
-08f5fa709feda49a9b7e202610ac9dda957eb65d5615d91c2fd66c35b88ebd5b
-ed398fade31d7ab65cff138e211f9014ac86a994e58d20183908ffdb55f64da0
-39d1a1f86f28d18f9ecbdbe7f6abebb2ac41ac88e385c64eda6fb9f73c47c6fd
-b29f0b4dd0595e5c7f76da3ec7b81da2a516031bb54ac9678eaf2c16999e5181
-1af80b3abb07354a786e339e812ab142a59004733178d3922de9a23ade1bb2d9
-23234fd2a2836d3c99f582778cb069c46ee8c14999748c93f7b5d0b607abd3ba
-cc79739ba4bc945b8cc535ec56511c8b184569c7428ec82f5ee9766acd217037
-2b72cf351729da098cb6323a724db4561045f239731661d2ec26fd014f57bd27
-07948c03ede03875bff01c4972530cbb129359826e1081c9f2fccc0d9e6098c4
-4dd980b1988c77bb4e04962c501fd7f8c5d8cbf00e97b2020d75d1d73e4d19a4
-929f282565a130474ca0777cacbcf429f995873f54031469e3095e39976a6877
-92e3db78cde4e930213f64d8ada47874900a2fb611e18c45dbb8e219d44620e3
-151fd42a61da68301334c7c8883c800e7a851ef4072aae38076c4f11418443af
-7e22c10fb99f32b8ef835156173e00f37a1457bec7c74fdf0af7f75fb1cd15ab
-a72c0eea8ff66233b2bccb79ca66860a3154a16bd31283d0ebdac5fd5f54df28
-190388468f1a102a99b733781b7674dbcd9faa280416923e7331b6f407d8ae09
-5a380d8ca81de6dc066ebbbd1341553fdebfae0e60aaa229d6a80a419991e8ac
-7585cd947f6e026f6d1abdc3ebf4280d3292948b1ad434f26b98a05fd19646d6
-88894412749bfd5c15d963696fb5b8490eb5d0eb4a72d15be972d115db0be268
-724bbc432e470a467971c3f18feddca78ec38e60c79fe265959e82fd986918c7
-ef5b7a72361ab3249272ffb6e55b5608dd6c0a4fb1b72b50430f230b2383d8ff
-bef2b686cec585676616033e1a0c66287d6803376e5d8e689980c3a5bd5a7bc1
-ce993e47ffdeea6f94d8c562d4804034a3b9a910c4d567ba82af21e4fd778bde
-ca490b1c5e4982fdebbe4ca4592da9e70d5fa99fc17ee11963b866f7f62efebf
-e30cd690813542f4fd8a14b43ca849c323c8d67569d279406b31bc066e8a99b6
-284586fd6e7f5368bfca05466560952fabe47658cf67b93207b004a9e7995a8e
-49c81472e2bbf23fdc86466a6151e797bf086f32282a9e55749f94f8977fac75
-e2aa9e4af7784c533f50c8f1eabb82f5c325f8b89604d635c05878ffd17e45c6
-5f71425cbd6df1354f76a48ccd20d009e6d7a866bfb654fa0b1f4c1003f96419
-b49b5fd675698911d745106d7bc1d14db6d182fc82602ce2ed91deed5a07e683
-36c1768e8e0a87e1e112fa37aca99b4d37768120930c71cbacf45b58f70f767b
-3db154fd31061251ab484ce619129b2d5c13a76bd15cc92d68aff8773c65e212
-399c6d54cc6a5fc0b48ebb33b23b916421dfdf26d4e8afb814619dbb9dc67a07
-951192e58ffdbecc7bf82bfa10d37cff66f5b211da9b7424fdf504139e6e733a
-b1179cb9b56cf570f63aba413cb12872ae76eeed4ae160f83c977282f7c9a692
-cafaa72a6d89a9adfbc498625cdcd53fe9fe591ee00a625b157321839eb85784
-775665453d8187cfe0aea8a671194ae185ca9db23537356c9061d934de5249f0
-2ac01055fb32f110ffba4560ba8bc94cbf657ba57ac8f524a2d01a8323326777
-b6ff3413220187834e45da6076051cd695b1d51ede7348cdf8e51b675ca293df
-dd1101fc53db5d7f8de55ece38a55e5528cfb4e8266df99d41ae7db821903111
-bedd329b1237bf7468ffcb8f8ced0d4416b36f7b2bc0231aaa331bf2474f11f1
-3657a008f9279855854ebe123ef3918acf58530ff76553394ef3e72741e9fef6
-ef6aad2e58d4ec10614f041698e78bbef2456260e6842dab488d96d609f4c77a
-02e18dd13549d77925abe02fa098e923baaa3c0565028522fd8e7c0cd85e15ab
-18f37d4ef871b91a11b2b5de8f5faa21bd9d1d312d923964c2f608708aeb6301
-e31d028eeb41c46369ea39e99d0ace2a3739e5f8db16e86615c56eec5ca95f6f
-4195b39efe02a7ea9a6e7941baf8332f224bb9ab9ecb4b0dcbfba8e084ec7279
-24a004938789150a479da66cac3b054d108019b4745b3ad8b87aba19b39d00a6
-104e04eee9b26af64e338bf34d109b12b79fe268ea224a827311479b3a3b527e
-40e7e864ae56cec78bc5a487590e0178a8b6fc25654c60404661e09c1f82003e
-eaff3a58c0c3730cb34415c85a5a1f18d71b96cbcefe4685609aad50c106edf0
-9cc002ebd9fedff5e401affb0047bad90130e144fbe267234390b70f21d8dd18
-c43340c360bbbac5e15a745ec971d3fc7a07d78d9414e37ab6a1f547d7630c8b
-a657883d45e788c499157b37410934f73002f10e6183b696b1034248e449ba93
-9178ce2ae5249d4a4db91adf295fbf3bd72d201e90750a60d9224da50e2644dd
-6904b958fee6400b27cef19671c51bdea071c494acfcd1cf8d85bafbe9b2c3a3
-f39d120303ecd5636e6ea61ebc8af0037be2789d8d885953687df1c7207589fc
-62441bcb3e7b5fb34092d8f062aaaec579a29d0ee2eec0530eacab19356a0587
-d143aa46fd5f7748859fb088646edc3778ac9f8cde1da8684d62feede0ed12ba
-3e4efd2f1f3702edbba6f881e40b91ffe0a10ffe7f52f14bf975509bb43b2516
-e05ec913fbd145e7a6efe70d770fcc43700e9585432f78e3cf0c98a8c68d738a
-dec7a4b809014ed76cfb8fd1b12eb02ee8617f94d0f3a3bd273f0675c2371410
-42201b05d1d131af293d460105f728afba25e65d4f8aa3d1959fb4e6166b6ad8
-fc2d6d41f5b1d11143a7fead000e9f46c3a6c2610f013f39205e4dfaacbe7bc9
-dc534ca456f44f95ec4e573ddc053cc124499e20ef2ea5c4989a9fc053b48a87
-aa4618e403cebc2c398af7ecd2d4aadf65363842e27bc5d20f24ea8ed8bfb829
-506d5a1d0739cc7e5716d0581618a1125b87da79e086d52d030603da88493d4c
-14d99bfe5a30e955c233d3aa98f4b447aab941f069dff47374825d012b053733
-922c16fcda14aba584899d2766f4b0dfb3b2bc505149aebbe63a9ff68df22cab
-1beb9476ec1b69d1f036f3abf79799e6fab6a7fb7fe7f61878642b5a8fcd62d9
-1218e6e52585dfc3321798d4d27b147be6dcffc1bab7c372570c5608e0236f26
-2d9e81d2c11c06e453f40f8453e3a4df34fc0dc124108a9cf176d41f7e2675aa
-030d9c9a0c3eee010e2e6b53416b07a07addc43e22aac8a78c89f687fcf10924
-2b8e323b666063e23de1fb405d213567807edc2edf7955f4ce43938afd21eba7
-0239d81517b14c34a320e62ce46f48b10e3b8f0d443cda27717a5a416dcf968e
-93ccea00568c42b31dcc857ed537d1c32d4583ccacc21efbc9efd7cfcd22a88d
-4594dc9c9cce5c6dbb68a6b6a86568712a79321a3ef48335fdfc2a3937447b89
-d43a2fb9e0ec41085c249c571af59b4822519aa496da159326458b5168d9312c
-13ff0b9879a8c96dea99cdd10966071b12f2a3f75ae6b150bbd0e032f7a2393c
-6afbc4ffc9acc38afe90606c4f9afb95b5c2aa160539126dbdb2ae9d61e5c4e0
-ce260ba60a5c289eca44c0898637888e1bbaff38a4ce83a342fb92c64ce086a8
-5e6b0048c4282631bf1d6a42dbebc647f77e63429b18cdc8e89b2d0ba8040ba2
-7fc47879bc4eec51e5ea8f4b5628929a0859483cfb2089660cc15ec5d9dc577d
-6d69a076ed24e02e80b83f1444a1aaade36129cdd98f91697f0b28d53a56418e
-ca65cd49ca8c49863a8f066ddc4ad208dedaf2e54da80f294cb0211a90340771
-aedef1185653f5a2f7925894404a9c12a50b6e8615c2e5f48de9f9270d79c70f
-61599223c0a8e822d8c60c56fa46100f85e5ab43fd7dc58b8330563495317ef5
-8219cecbea2f11d8f24ce226b52fe0ac472069eba02e29655c20c272eadcc1c8
-18ca5a0e46eae3a5fe1f050fecaa2485899f8a53f4234baec7c38343552c1577
-10c72838c76b82bc6a323f1d8dc68ac54f8d468da99c828ded907e6f7c1e38cc
-bfe55c46ed3c2676335891a0e3f0f3e660435607a996030008f28fdc34ec67da
-c93e7062c6b46c6149ebdab9d8378aa7443fad6fa5fa52d76834aa04de524148
-e5db4023e4de3ca44d245b94d6d96b503c14abb03d7c2207f28439cb338120a4
-da8d30c55cc8976c25dc4affa410e8aa3749a6a08b7d37da55d8fe73f95d0b0d
-3c6b302a09738b28b703c31c3912646b2b64bb6124ed529748dcd032b4832174
-38c51c3dd591f4651a22f9fb00c91124c84d8717c4313437c014da2e72b62f56
-22ead7a96d0daefe66dddf7cd9d4f77eb17845958bd97249a5896cfdd57c4d8f
-24e3ce5dda5629409f881ab5e8498bbd473e61dd7160a5eb6e6b5f47c2e3de09
-3bc622e2d1aa235d4eb341ad4277c1d6261c77bdd27d14e8d0f5a226957906b5
-f6e86f1a72fef7d88a90bd711cec812ef92f08cef71eed903d8924f5493aabdd
-94cce69e2d4b04f111c63557f460cff4702b46f2e49195eb4f749dd4fc67070c
-e2770be237fc41a300600e8e4363dd2d57da17ebf287fff4b3247673b662c7e1
-eb74033ddbaef52f8a00c406e7b01875a54e2e41b9149cdcf919356aacb0d2b5
-88cbf5fd0088a65b789e51d2a0ac37f1c833d62f022eb47d0580e04932cf332b
-b7c6220ef8791981944439bbdd9934007dd5fdac813cefffd522164d16727705
-7078e41788ae6450dde5753f39edc4bc21861024aef6145aafc70d0d3c7c509d
-5662ea004699eba1876f6fcfaf1757ee7f580ad9c071ccd3d02bd445a8d2155e
-8a1bf1b8663af3102b1fe47a14bf454b789ac0c5dfa3afd8a47c55a7f1590c2c
-2f520cc3046555f35bf8a847041d54ef6babd4c91fc786336ead55c3e83bd9b2
-fb4b4a0e84184f0bd7130800760ea587157e08d5a2390f84359dae2b7ff1561d
-94d8dbcb34c98db6b45d0a593e2b0cd398e1a96dfa93a7ae8e7774ad57cf2ca8
-1028349f8a5feb9652f811221368bdb34eaae8d5e2e7e16cdb6f64ce04c37ba2
-4589e43481d723051f163789334a5bc087f2796b96d58cef21d82d0372a919b7
-93d782bee7cd8e91e26166f2041e371464ed4cb6a73e08048ff3a596f4689f6a
-7b09546d8984ff5931a5ad2c772eb59ba1386af0281de907561423ebbf7fae48
-225a4261359bb445959a50a34d4f6550a582d152a83066f90cd6d99029513b9b
-ef7f182b22afc41fdc2824bbee4fe2c53afa59ed68c9c2873aceb7e4354dc0a4
-75c03dc0bfa5697b7327661cd4f1e61471c439365707afa1b73377bca188774d
-a8135ce7279ee809f94a5de196b97dd70e89a152c11c57b88ef540ea1c083bfb
-3c99faa22248c786e216dbfe8fc6d60b3f7a5e291ff0870c61485a051264e213
-58fc910521db6766bc77721fa8ee503e40efc848be05822ec37f4aef6486cebd
-e693d839b7bb902efa75ada15cff2040d1ef45feb81f6f69010ecdcac215f5e5
-f11186cf3dbf369c11275a1874d4d8cda1e17565bf6b7a4f22e5f7452071b3d4
-14a1f17bb32ad088a7751101606c6881e9d2c1d72d88e05410df086d62936262
-5bdb1fc4d48bae24abe9a8c49238a194b009bd7049914897ef28879f14366e1a
-9ddf1f3bf2d55eaee7676cdd6fb111eeed0b67dec4ab583f53030cdfaa800a71
-cdcfc5fd361dbca0ae02c754ce8de1a2dd4d19d8d91f338b4f4dade9a5f10f6e
-6a0201c2a7a11ffa5bf843881b5fed41f778111cfbaf373806c1fe279a686b32
-a8ea253b2dd83d6af13c5111e1bf990300fb337672df16d47f9b988471775229
-337151a88011d68faa093c4439185ac1d4ab96c945a363cc9b599f1ea0b9a4c6
-6a53a7e5c49cd875f0565a693a5b99b4d70046545549e32e32173d1a33660de7
-a9104dc3cbaac08b6cd22095e7492aeb5ac369cdf9a5fca87d343af87d625d46
-b465d0fde1a5e425f6e6509808a775bf65510d64ba9f1fd4cf83dc244f637c05
-e108512d9ddc088f6fd41a4f4185e664cd906fb33fa0ccc4c3c0ce1d546fde4c
-c06919304f2fdb24500aa01a61ba0c365f6ca1b57bec0795850c6bbd3eb63218
-9fd7c118689b7a17793ed9d2165a51d563a96bdd2ac062d0c25e055e13965af5
-c140014d039ee059075a208035a5e9acdaeabc61b08ea51802be6cb592cf1e8b
-c276d2ce5f4ac5d914e8f8dbae3799372d0bb33ed94f8077bae807ef69a07758
-d442ffe74d01f6f960b8938140e83f1adffdf4f0f0393e73ed41bb2bf11bab8c
-aeabd4f54fca2aa26bd5bc52dd3e4d5c598e3af226deb96c3efc96c479e0db19
-6bf1debfcc4bd8bf05cb0e3dc04be5b445881266b74eac4595198addeb53dc46
-16781a275a481f4768f607346db394fd23eefc63e946a4357e8da64ff14813af
-0a06b51e6f9180a48cfe90f3c9b9eaf82823213d605e56359ccd898414fb088f
-6a7c483928d5ecb72fd544a8cb46e832b97653efa1629c4890b90e02b9e54ab1
-ae990473adc54d7b687a9c559734574248005dc2f125d7ebe7040eb23f4927b4
-d376768793b666f7acf187b985fa099b8890cb17e211b67ebd09742f06b224ed
-96a0c969d8bddf909afb02bb05cc66ac0a5bbc9b80cf09fd19611da7af1ca69b
-87179d1def40bbce64ae68a52e41978fff34f91a2b4369f0edfcbb7749b042b0
-d9ac767cd80d57438fe5108b4536b72e6e5e504a6e5b4cf70ffadb19d502bcdb
-e7e3e566d1269d0a9631776c4f5c52ec3c98d63f41fa32ef489b5b697e2e4998
-3da756a7791a3a036c258f59bb22ac004c821ade383830f0277cf580fb1e8972
-7c75a27af24910a338df6a4fb373c6622fbf818cd71a5e891d19aa95a0255968
-619f356d84f6b430bfda80012396a2ab3bf91ace171a6b3f6295fcb701f3573c
-684f445ee96b38ca3b53db61954b4de9250c487181f548bf9b2a20d62bf61c23
-02769834fc84af37612595d6e57be1c80c38e5b757b99c3c073a490356ce8099
-ed09b5fdb9c9e1d9f9219033d200c9e5b31846f4c14ccaa679b3d7fe2fa688b3
-7229c69c984c5982933f0ef41765b1c1656e4fc98a2086ff68b910391aae365c
-1d88447411145f885044a11f3e11110296d9a81793ad31310c1041fc79c337f0
-9d2f073d28ce537934b841c41bf677b24ba9826b6db142f36886f45162ec3679
-fd46d7a7c219182cc2e2760d8d2de2c975ba4d29ef94b65ecdb2bf1a75a8459d
-5facd5dae80fef1ffa72b0824165f25e7a47b100e1aaa34192d3f017fe5f11a0
-a9bedea570c9ccf6f8d18f5ab47ec271e5dfe1d4280d24f76b471e2d1dda8313
-4e0d760ff6f5673ae87466ec2e66e7ee5aed7bbdc5ebe9c723ef0e0bb20159c0
-d41ab0a2f609a0066f627fdb132fabdc28d067a4fa8f313421d5096071b17e33
-3311d9e905a42d49d9c6c2e3a09e7afe91fecf4e1ad5e6acc6ad0c91a79d3046
-c9ce741f9b2796f2d021f8494804eccd7e256fab1a8623a014060f0b19b7154d
-2aa1e772c9ca5c68b6247987d190cb0043a9d2ca7572bcb43a69503570b2a374
-3930210d268fa1b528ba3a2260e6363df7012857c411dd5e6dadf4286ce805a3
-f03295e3c3db0f81c6e4db5faaac574ee227f7b3c98f4b738c45c9bb39eaa1bd
-17812d2cb45fcc54ac785af72420ba310e3267d97bef54c29315eff146b2867c
-d300d8f6c0b943e2f206a3d14c9d8a9ab4358cfbcc9cdcfdbb9b2bde4aa8155b
-69c929f12179006235dd1af1a906d9769978fd90e21b9e3d2369f21f4b9e78ec
-41a67909a2de30cb2bd2c10d2b9a6020acad882d6ff778c4a6223899f1832b52
-a23ed654236c8e09543e2c6afbf03f4c1a150c0ec1563db17931b1304a8248f7
-76fa88792ec90a34d39f885c95af9ea39ee8e93f84a9e66785431a7a99a52bef
-d1cfe2b871cbd391e6b3cee6461e42d6837aa46d632dc3c302f07bbf934244f9
-77ce851023a129fed5b480b3bf8321488939288de6d054a55ed01a97a9f6364f
-7fec9ef87b9b49b1edbc3fc5e192c6d9aad582d2fb1ef161bc2ca9c421ad5bbe
-33bd0828d5228cc9b4caa49632781511789186c3212437e72e4914d5fb17698c
-74978dcb5f89b066b8804efad90b3bb8b7246d4943c71d54122c2a36d9f71f87
-c3c898cf272e017ee9e2cfa8a0c224da23a460a96133b13f7821119627b325b9
-bd2fa8f30977d85c690723bcfce51694bfe89439f2c39222bca6dd0c9215cd1d
-6b9bdf9f912c470d204d2b7b5717e018e03417181fb10685d9eebe592ce5dd6b
-626094a06dec5a89b7795d789519ae31f43763828d6075eb023983ff6fce4e21
-25d516de3b380f04c1f498b846d945a32664b61bab4c28e68ba4037a8e462be6
-8e5622372c5f8d56c2b6c0cac890918ba6995e1b03a4340c9ced6ebc875be611
-1f445f705f78cb117f3396f707d2736be5d32c58d98ba4d4f72a2bf05bd45271
-5f1da83969880e4b580539a3c06d4415e89ab8f17729bec04b961929834c9c2f
-05967038a7100bb5812f618a084a8d137d8fba8c414a5a0fca217e8f4fc0e3f7
-0da232421dbe0a2fb47a0d078ee4b3b484356ad7889a942fe6b29b4dda5734c9
-70f668a614cba321a71810550a84678e71f43f845cc47b0f4b82418fdbe34234
-0a28f53cae7f2ac0bffc4a9b4a4448cbc7403594b9c1570d475837bcd6277aa7
-8983daeb3f31442d4a0cec8a41b362402b7ec3afe2cc8c4372db07cab32b44a6
-3a00389f097006b1b1f7187b745a628f60f64124e845e16a8114b1d6402d3898
-158ed0573ca935bfd23bad60da9c6fbc0b10117dd56304cb58f81de3fa0feace
-1957bacedced8e8f626752cd755f067bcabfd234d4f551c684524a711a691fa5
-3be61de5319436e86688ef0f0b23fb1a8ade3a78a1348acdb47ca5c327305555
-156c24acc760602f133116649bcc5a413bf919a083c2dba88306dafa66f73382
-50ab5e70ffd8e298883c620d3a37a1dd532c193f7976051e8e2da980d5603ef4
-8bc2518775ff39b5390cb7994be69973e3fceea2a99046cca5d72a5a2e9fce56
-d1f5f31f9d05f4e95de8349a6645e936ce02825f55785d110c3843399c726129
-d7ef56bc39b65f4fe6bdadab905206bd305f034e6e64489b7d97da2d9831c988
-8a94cfa8ad0c0130154033bf82287160ad0340938a78cfa27aa291bf4c0a4b09
-1db4f3322e3f76e556fb16afafb55d9f90c0749636e71511102d3d2cc091e8a9
-bb0ab55707cd2fedca6151d279ca75d90940b3f8ccbff65982143af38d17090f
-02f8d5b6b25e1c49ba918cb6f3f2b9befeb404f150e593162ab14e277ee0ccc8
-3fde67c7778195b795519556db688e4f76a9045e029886f60db89fecca97fc9c
-23fa3c0ca5fefb0de6a923c715e90b8360b85a51dde11776fbc01323b578ef6d
-86b76123e3c41a2e9e8470034c64783072e549ce2949d5c2bf6b0d42836a60ab
-2b51621b608b2e22c16e6fd23a3288c8f721430b22043cf3b48a1c8a74e84aa3
-7a06514ad9f9a697328571e506d49ed1a7e1cdad6e1e9f3f41a99f84ed060d85
-41f56e88cbca3267e0d496857c103fca42fa3d4118396d494c82250c0273e939
-94a09f812dafa45efaaaa6194a234ee39eee66882798bfc41d24cc303f58a445
-5733943c10c0c10f6776b663d0f59286e2a127a906e8d7b2d55654b15bf58016
-0af11f67c20968d2b13139456385cf84430a425dfc6a48066a59f6a91ef3cf15
-b3c8e068b91892ac2218add4ddd8d201579d6ccf3664294bee67d3bbd0b2804c
-5165e37d567a70de26860b8c13e90d280b0a79776ee6fe064343b1350094cf41
-a5dd65ae40fa25a4a579bd9fb74f47114cce0c04e6c7f6b044fba8509f456b57
-81142522088226d82a95cc38a8823092bd3d113a61f6439fd78f70d781b0193c
-773a4c5810cd352d2febf25ec138f5af2e5ac51b4adb09fdbe4ea683922032ce
-1b202d30876a59a3c0009139b87b6cf0c37ca07e0d585435986fe85a9bdf2743
-da27b85d5d1a37de840d7fc2e5d92609d65bab8192f88b758a6c631df196980c
-2fdd706a2d8c28011699e7498aa1c14e47a7a2cbd54312a6c5943ac0a9a3f163
-47eb0d6a10f5ad603c080d9faf3571cd2335fe4d1c92c7315adc25f639a4f0ea
-609e73035bc24bb5d44371f19a7fe7c497be059904606007ad153b59c64bcdba
-e3a613c2787010cdc081df84ad9a44495d78f6440c9a7bc7395d04d776169c7f
-1ef0b7621e2b440a8c533ee3660d35acc3b482d20b3515457173bbe7faa9751d
-f1ab67fe48753834da25917b746ee6d2e30ec6062221241283d8c34787455db4
-541a04752313bf45c844a9ad0a29ae66356f4bef8fdec5741c19c0d2d7bdc699
-ccda2af082f28202f443a789e9b40bd6491e777a49a4be285d5f985583c502b1
-b2d9568e493bcc1498a90589e5981323234426e5769180d74a5bbe4358492875
-337845eea1381ac1be58745711667874a65ef86e367bf298a27b60319179294b
-d2138bab5125b6171150ea426a6158164fd3390cb51f1fbdc930a2c1ff6dc802
-cfbfe3c6b6e34f8138a0880a098992b2824ffeb149d5b136543b326d30520063
-42f2a60e79e576769de0e65da6f65c88ce9fe8d7869b1687d0912c518d1da5e0
-5d4aae80fe32d8f25aeaaf53865e022590056983221fb8966bcf4ecabcc6df19
-8f03ef373007e80e224e1a45e03b957d39fdcbdefe916b32f9afc8a48c91b647
-6ef437aa7768588068977c97892eb1d4b5d1c9c9d49b6ed7e0573345ef971304
-119f725e0f88fc8794b0c9cc35c925e4db50726d82d4788bbf8bca83ec533f2e
-7c19d7b153bf2d4cef8d5c7f46ed2f1b1a6ebc7f547a7ca5289a1fb0c7ea14a7
-34dfffd1543702cbb4b2b67e8cca16e54f971d115aae21019cae5e9b24defff9
-a7d4b50a44aa37015d68f3064f9c3185ec444cfa3af32aaaac7f4e6b2f71f7df
-02ba34a4d51e2886a2517ce0b21ee84b1f877852b3d5932840c14d523576777a
-114d80f83c8b730eb41447bf168c3a2d259851f545fdc15c5812c58c79c8cdd3
-f8e9eca6e2a41b53557beda8f889df48884d521add83e65e7ce4025c5187419f
-cce51c7ee43dd66baf2409b4bcae3a94ad2d99227be325ab135c9b38a8a0bca6
-3bbd58e7f7b0d438e8b01e441786d8a5faa23f6b957dee7c01e2172b09c7fcdb
-cebeb62ede3a36b13a3932a81f512c6ca6f69413a83ee30efb5513d2b5a6d15a
-ed4eb95338d01879109e113515553402c994f32ec590e11f4c0845a6729bbb71
-de7d4893839da80f1d1200a2ea5ded805b3f8b8e4209fc74a16733993e910e8c
-08c3aafa543c04d9ca3947cdba12a285466ae3cfeadb0cef83286da68a806e56
-62ec73ce7913223adf0c88deabfc3c5852ebec0b67c72a00650314724cf38bf1
-eb463820e829bce660104921f069bfadfe4e3454e9d6342abd2b8c5bef56f385
-f63c2e0d095687f04a2bde230fbc1beb95a19bc3ccb0e454967260b13313ac23
-048e48979aa0e379903fc3307a97aaa6933519318a68dde5bec8370956b11b07
-46a09198235e6a5d3a21ff337be92d5f291606cd3505ff41dfecef31c4d5804d
-3f361277028148653bfe090a8a9322d797c2f7c094b7e302a7cb7d0a6aef8533
-4db7dc06c846cef50a24d5a463f461c23b24b171f964f4733c1c249401e791f5
-088b0eae5cf16bfb79d5dac5532a7814aea77e35c072e6b69e50fb18445a6130
-2b19b60969afdec3edbb0b66b914c3973d1836faf2ea01c65d75401a57bef394
-8de682b7edd50be4b7a946ade2f5221d6cfc4b00e94ac2b390067f2dc92161c1
-d73f7e580de3063d112fa8f27cd5d6d37ade4149ec5f8b8c3c9d88d13c235a7e
-bd04cf1a2fafe65da20b949322b50dc78a485119775de3e5ee70ef714d598c27
-0b82d4e73697111d0fecc9552d8f5caa3439b7a52f5f445b27bba45c3606ac01
-0666c4bc2a39af44107750ac6bf3a8005dfa3248413d98b000bf5e55c3188ade
-5287349a01041067cce0f841d6c2f828248fb96e6ffd770789c72369cf05a9dc
-831e7b1b2c01bad69d465e83af7b3c291cc74fc5ca2e69c2060eac386abac347
-5d56028547656815f50f46a251020ff63ca64dc1fbeda490493a55b285d1407f
-3cd803fb15906baf8bff8aef2eec3a738fa9c011ceb51805ec77ca1a4e8434f0
-9fb36b45e8d95afa830e6ce6ab350a4ca06c463444d4184b681df11e04e733d2
-9dffa1a3a68c502a29e05be5206c5d31c3f260f56b5f88901fb0aa8d7dfaa992
-4045686222cece6a868b664a533571b19fc3e1e69397f3d9d0a8bfa4b3df5a6d
-40a52946b8bed057167e3c3ad3ee2305d7af4a16696b00bf5463e8fb76892a34
-8618ec3d153b3878c8bd72c21ab2c90ec88993b855e19bb7ca23e454415e9977
-3def574125029a9cf24540c6f61ae73ca96739ba838f1938627499014708f2e4
-1a00d397e7c67c74436dfbab39869975b9ad748b90abdbaaef6744b796696c19
-5b8b2d0651b163bca5a1a5b6188a29024ca97449dfc87a99ffa00f05c68c3906
-b2588be6003f1f35d16d2e4f52185b87a0195f64cce629f9ae188c4f21936b48
-01a34c69b570b67b4ab176b30f23e28f40b25da9d5f8b30d147c19dfdb1c5f3d
-a8ab8fdd2c22d629fbea477afdb3c230f8488b6d24791f76a53ff2c21daf7ea9
-08ff9fccf55f0712fe16bf836032f104eb2c454cb4e2a3bc93493f40f9dc0c02
-c121cc50ec16ae11128b8f43202622a4eba117753eb656fec0e702fd1f680ce9
-1865b792896d48aef87f5bdfe71429e5963c74a77b24a036cade70ed655b4271
-2b5ba33ef9166444840df7a1e3b0f6c5675994239840ffa04dd8f4cc8b47d694
-e6d6d601d775c19bf504ee8ebacbee258841aee1dbdadb64cce7c026897a3ffd
-e77b3e0043af31eb442ef7ed53dfcc969b726eff1f8a43c13c13131c6532ae0d
-9e8703618ed8af07ca8468aefd047658ed08d6f647fa2809cbfd58519adfd791
-3f970d65a3f97f63152d9dbe9af502a2b6f012d2a81e32f8d8cffbd56e63a9b9
-e49a301b2c3699706088f94e7a3f11c7fbd215cfa8fcf44892fbe4f50062bf95
-38fbcacca34099f0370de74576d768f1f199c1457bda68473729f390543aeead
-c9be3985cb5cb4e01febbfba7021d69b9d038a326a76fbd1aa2becd26f7979e5
-bfac785b8dbcd84cdc90993b553b694449c98ae3aaa0d1fc59953dd57598fc9e
-2062cfe07d482e20f23e1b6b8f397b797656f38116853178b7b1fd8a78fb7071
-c433fbbd9ebe90897f52651aefeda189f61069f96d195ecc93692c417c9778f4
-0b23525ce5a0f6d29bdadd0abd029089b9c255201d7d829d12e138538dad4108
-1826ce5a43d78ec57f641000d191c9631106268f64ac7f4946fb8ca5599aa3a5
-017d03a837ed1c765bdfa4780f3375d95041526cb137250a0af36b9f9d055fb1
-98fa33d374baf553aa3bdccb1f4eff10f972228355144c7709a6cb45052ce6e2
-bc667623b47c220498a25caceb28dcabaee4ccfced7aa6c14b586a2e1c60a9d5
-4f4313885970d4f824c9807375d8a1b70c7b5fbc36eae7affc902c89e394a2c8
-39dc7e4d0c7faad918c768214e16a3e3b38e3a3bb382bce607968c8c970a7bd5
-91c6d5bf50341ea777a3d64538875fd65a714c881e73818c61a567d1ff2e4d78
-0b2851ec0a9abe877f26dc9b7269cea5585ee3997eb314a370724caca582830c
-f1e1cb6e517528360930a1b81735adcf20d43511249f520bbacc0d94f7449d60
-b62c90d220e1b2f9afc749b9178829b5140c5471074b074b42ec5c28e600e8c3
-b596461665b2fa699f33ab8eefbb7932d383814a402748183cc59289b27f19bc
-ac8b64cedee4bb5bdca401e1714cdfcc9c0329d35939a76229b77f629fea9551
-ce87384ab083011c4bfc8d5e3a1367b48ae5a964785b34827aa72c7b6bb4e8b0
-3c6990b6fa4060dd7bd1eca5e2b6efe3c8d9915940525d6d70ff2b2c8fe45128
-22d4cbd4490ea070ba7b8688aca9ad168394170b7169979d7c223fd1c67c02b8
-df0aca0cc03331885c384c8a573770e5ac87b01bbbb8ced847f7a4d68e5e655f
-ea4920b32bdb79d3d7099d942f07c18b7829b1ec7d68d187c550081a4831ea95
-c3333e213aea8f45dc8aa8a5b7d925e05979cd2b0da0560be2367b9d1fc368e1
-837cfd77bece8538b26b9306e054fd86cddb668e58e487a772f89138c00cf8a8
-62b913e9ef8be9fb90cec90bd6a74c4e96f55b3a73be8f223eec41958313dd0c
-b0094305eb85730ba87f6827d6a5238727030123fdf6566581105d0645454553
-0cdcb5069c9f1ced3cebb1f5944e44979f17bca52400c98932e6391d5cdfccfc
-da6df93f86b6da1832f83683fbd0ff6b47ad7f2734fa4243520ed9da9521e922
-9fd4d1961d36f1fe1f0fff958d4a12caadb6de73b54ffc64d72c089090af3fd6
-24a712e60c9d7c95c030827d1da39227d5e6537f01e149f084451c7b1799dfdd
-ec0fb4d8b3655240ee03ae14b08c1947da7a66465d5accc205e0d4c3a25ae300
-2a1f991a5efb7f592260e6576a26d168c568deb32919a5f47325044e7ea0959c
-bc65907b731957685aae01d3fef2d9f87b3ab44cbdf72f161ce92240734b3018
-ca6c963aa5b29402b5f12d539672c4ea7bc1c66ab6104625d97f41e65abbedc7
-5d3df3802f9c2101b4cd6fc7e559873b88e8dd54309c8f53dd2d6cedf292b366
-2fffd38681bdc5936dfec644cf6b7a7e415bfd7fb9de469266927e5b82ef3e7f
-011aa4d70ca53c6e71e460a7be3fa42d9307ffa701ebe91baa7875816e1901a8
-15e3ba35c3b4cb00a6c87b98eed8d8095740ec71d3c00f8b578daa88b3f33dcf
-5bb6635f1b2ea62eb9abe181dff47374824dfefcafeab400020191e74671a097
-91a6757c880d4dd5a7e3da51241876415d9f70c689c804b6e9ab5b2b87f332b7
-c0e2c3bf5b2246ef438ed81ff8f7808859632ee8fa4458eae295eeeb9cfc7b03
-0c0b906d4805f9d33a39a3dea89ff2eb56db4c254579c92ee37286385a5c67e2
-0a1399a73ad6921b46082428bd84de18cf92fc9f8058b7bb3c193a4a50b34403
-358600d3d3251a543a6bd9ad3c5db4138dc043876387bc1f55d919fb8c35cc11
-cd707aa89a7618ff67f427c74998a6e75a84f261a2030710ce94325020dd8814
-91384f4c83ea17fbb58f73630613552a6e9a905a98206c8adc56b67419f996d4
-1da159cf2d8695507ee04fb958ef554e30d482cd8f214478062d4fa026f86b13
-3dbeb81c957e43ae99142d2b9eee13712878f5ade9912228bea38b1d42a835f6
-45f056ab9b40681d736ba72a9b4b5ce2743e92931676d8556000d32d259e163f
-ac90b30944a2cf1c52a236b4d71a1b2c0c8d45fcbfe447c732b9efa9d3e103c0
-381211c00da6df127d5f57aae449b9699466cb369b996898306722d85f8c24de
-e5ec2018a7a4042b07178fd55632305cd5bcc0467dfbcd5ecdbfc9e494dd5a65
-8327ef45f0ee3d232622646f56d7764398dd5d01e92f5aa4fbb11d95cfa277d8
-1c0d5a15007cde0aebd5436103be6833beac9fca1eba100724eff0924dbf1569
-97f7c080f05ba7eb68e201f6bbea8541a94973855b800cdb7ef6079de238b758
-e465e27c2efa56dc98ed8e4c2861e2ec8df3f2e919678ba369890d15b8002fc3
-546a3ff1def38e2694941a702ae77e16fa2e55442de9248110a8739e58cf4b76
-664897bbbe30c2b6d172b2604da84c60746a7339c7971a83d516ea4302785c02
-e508a35efeec0b61a42caba94b28bec74f53e66a9a54bbef4ea1171472e34bd1
-dd2072f460b24283c8217d6bdf8ab34210c08cba89a7d761df442ca147effc4b
-4c041cac1774eca35d106b2026d71615b4279207039ecc03b0404dcaaa7d61e9
-d18ef74eb9bdc614225238ec4ba8ae417be9a6386ad0327dcefeb5a25412bf36
-e6ece299be240192d182508a51c1c1ec7ff65096f0f6219f25b8d07d67aaa3ef
-d4bb00475135483905e87aadb826a889cfe5fd3af57466b0cbcb91c397cfb9ac
-f17bf93c4bd1547c6b196cee7741726321a55aadd02e6677872f6685af9d0030
-f1c331a926b9c42ea8b6832bca8ac9c607a73b527da6c9a2fbd289d781dfb35d
-7c5a053f8f91248f1c3ffd96a1a5813ceade13599db1b3ce32f5bc57f0335693
-c8d4c405b6f9a956e704e6e99163ef2f0b6787f0bff18623dbc1158e34006608
-70434bcc19164b41d499feb2b26fbbbe4020728e4882a6a123a8d78bd1f298d0
-5249ad33d6111b4a9c6f3ed2fc7b5a552b79af79a0ff935775823729936d3083
-b7b93a0b15ddcd84581e28b75451682eb6bf9d3c8ace9b275a510cd6561058a8
-8406173d4128c3cc60170d911246294f6c6f8e71a8de8c587e84d44b78e8ee6d
-b68a4e4dcb14d73b6d3b35f2d8c3aaddcd0967e570516ed9387382f78e741c05
-1093aa322dd6b0a42cdaa10e510ae3905d0542513d348ed98c4c9e01e0505f52
-2ee0b4658e51a433252f9d10cc18232783d58f88997634ecbf89a2124a89754a
-56a4b88de81815b3a17fa42e5b229f80aae7b8559459a773d408141928619cf0
-f56cee08f05f8748a201573013e41c6f6bfbfd740759e512a1e48cc4da24da1f
-aa24672d4164234b31c631da10260e2e9e788bc2289501b083e926d63152b46e
-6821383d6065e28d61d7a6b57b7d9859289dd3a2327d3251ff65c72ba121d0bc
-81b726e38ec1a2e9f2abd4827a6ff5d19f3b58ab955a609a97f221fbf793aead
-e245e3164f2824210a5b97912b0a71694c3cafbf60e0af983b31ae30b4b9a41a
-aae396d6433db119aaa6a174e02941a4209e3a7ec58581701021c3af19b12925
-4e16cfcbc2977089ec85258501494eeee8e21a4729fdab90efb334fd2ae0300f
-ee893650e27238444c5a8c0511712d6c00afaa55b83a258a691177384a7f2d7e
-17da838132d47c18a528098888bb160762d1d93660de8de402282c4df7492ce8
-920d1ac9e9886e4d9a1302739890fe2c95eb37f9dfe73ac4fc51c4b0dcb1ef45
-d1dba50df66f32c1b2e03e2bbdf0b151424eb2a5479dc085a84ff7940ecd5651
-7480a4e7653edccf6a147d8af6da9977aa7871708f6dbc0125ed0e4eb6a2aba3
-656018e05f90831ec7d00a9fded05da231c00b95779b0cb9780d9fe96b1dbbd2
-291d7eed562204c11393602fd2d90ddc31d438b420720b5e19a7a760773107b7
-8e2c1aa72e2e1fc16ea9474e7167ae6be661e6d0f37f3beab24d3f9ccace3dad
-be68fe29e086a62b2882eed800451f432db02614da4d1b7440d2c8aead012aac
-e32f90080f444b368755d49dc24b05e0c48ef3fdf57fd112166685773c138ee2
-36cee78ae6d93130e97e8e633688ceada23fe3aef575af02d5bd3c2c5bdbfae0
-7c83cb2710fab57f4fbbf57a8be81415c1abe8b6318db53dcb71e8850511af89
-4d43b842cae1e9b4f3db6304d45d99fdb452ebf0ca76c1d7592f1c9eac61f785
-c775c0cd72c883b0088cc2cea72367337a0af42b233da8324b02b660cebe5970
-ca1858217a3d140556d5894be895249f04a2fe9a03cd39eea05ddcfa0c757fe5
-0122410c80274e6fabeeec6c0f8181718ee6e673229a0a0ac2cb4414da14c4d8
-757e44d32207fa9f01cb6a4f04a6a67c38b219d1425dede228ba157b4d1ef96b
-e16bdb889e8c9527a0fc4cdb2fd6aca296d7c06daf3f259f0ad74fd806c047ff
-0250339e1c1d650d8867ef37c6c42cf7f930fa6027445692ed00f0be90a79ada
-9de99a986f81117165404bc82cd33a64c1778eefaa123c3581454a8334ec0529
-4cee91dc0226be0dd6e8a229199a069ed36d5b76ec66fcf363d749ce886fcfad
-d6cb008f76f0298be337c8eef13a24ef7c3d774010e2e4a7acc429d8c0da7a32
-f8bb44aa9389d4f594be75a2f764f9cdab9011a3c65a3555a9509f81c27dd091
-221ea30ec6ed8449368a5d4ffd302fe809f3ce67f4738e96ad29d93e265921ce
-45622608522273b64bc36454a7a2d3ebd334aa8acf9e4d4ffa863ec25819e7ab
-2ed613933fc57a4afbd0811d4829d2bd9802885735ccfb251ef38766b436deb5
-359278fc0067aa17cb27310c52cb5ac59802aab49029ecda9dd1e02696d4fd20
-75becc63dca6908d1ff00efce86d5ee281baa70f62e3738ae4f054bc027829f0
-5a57e15b9326df9fc56ff8c040daa752a0399db4d265f221103192fca2b3c88b
-a6d90659c0d85556e58c473dcf3a1f851b4a1c96cbb48971e1cbcadbde7b6799
-ed6b2d77eac67a7776eb7c571f6dc43ce0697f4392e75978b289965920cf17a0
-d78aeec7c733c885ee89ab9061094d0d01022bef4839951faf991876c26e5e42
-9eb7e5a57de0da10b61ce825a06d33df1989ef3a93b83130219f933ce36e4b0d
-1f626265306898140b6d6f4e4a253cc3c6e27304b975767a38127a0b8d906f60
-53d097e7a588648e71fff1fd9415ac7d7141abfb33086171868fde663f6a0aec
-ac7c8f8e8cadf5827ce72fd49d319ca5985cbd50341c30967084b5428cb488c4
-859b000c3f0cd1019267d9ac317e02cfd4f7d4480309e7f6850bce35c850155e
-7cb5f93160d33fafb4383ad3924d0d665647865b5b9835519ce1ae14cd4d26a9
-c46f889407d0d984d2a3e63cf6aca920262df305ed31d3d1a965c20422fa870c
-d860c3ec7d3b5966678c238c0e4f69daaca76fc006201072facd2873aa30db95
-626cf97cd33eb47950b2b831040be0691f451765f57824ff493c3d06133744c2
-9fbea2172f3097881cf406da9cccef1b6be9ada1909886ad58edb99228972dd4
-240898cd356432c333673b8902ae243686912f45ee6bde468bd3e8b09448ec5f
-00d7a9213628fd6743f0cb028707ffe5e5b8a8a24e83c3750d68c0e465b820b6
-30d209d39da1f548eb22aa88609136aabfd98026bdc4582bcbe7cbc50deabf90
-49d4737e44f1f899062386edfecd5dded3a743db71a61ebd8a81ffda6470612f
-7cdf827924bb4e7e75e6c91dde90e698b319d6fe6fd982955eb99424e0f26aa9
-3acf642ee1c9ffcebbdcb6102f9ba206238cfc64d68036129817a65a175327fc
-f34c379fa002c5a2b9112d5b9064ecd77912987e28883259a6ec9f2c2741a84a
-03830b31693492ea5286ee18a52af05b41a6c379b6c850b5cb4d31f60a6e519e
-981c22680db193fb72d365f0260abf3389832ab1d78759c1482eb1ffae6d8c4f
-20676bac1407720c6d3cb33d0b19106c6f3059afa85f3c782918708dbf809228
-81552754d6fa2c7ab482e703d664aa495805292274adcd64e7696a5d096ee928
-9e350c8294d7a1645354674e66213f18553a72fbeb7fca3647ebb5828f5a452e
-03941d4cb822ef0839254516c2e6fa668006bee04122ab89d1e958b57b98f0e8
-ef8839dda01dd884e0bca9cecd0a9d6a037f5731c7048b488f8e972884904692
-c0a558358d736a25b7eeaf608f9c85ce45bfb13fdb0011164c50f82513f8fa5f
-0a53330cfa24ca4c59c50813974c2307480a47c25044b2bd1360df7c82f2f482
-9fdcd0581ae31fdae1e36d59ed2a6b8cdc97f005d32333e27d1dd49444176a4c
-71887d2757d1034f27dc74793ddcdb0d97806e9e16328509c760801174dced00
-316084e04d488626ca71a824c2e1f36c7b325a3f1446b21d465b8870f7a6b05c
-ec4c2a996db293a754d49a6ec448b31cbcafe353209ead320bc8d963432888ef
-1ccfc29e46c0c7c8e2849ffb6bb680f5016670b639bb411a399c63371fd36c6b
-079077160bd539d0f253eb437d3c3f8bd522a05632db51872cc2b74cf505da34
-eda8b3039e636f2b8e9dd82951380a5e5e8bc776e996e50938b8f9c5a470f366
-e26e719646a3cf2e362a95f8ff6776cf5edbda555846f284c75874399d211240
-33cc43062237e479d024a7c34c6310b81f3a299a148c0510b78ef9d01a2c0db6
-151c80d7978a93409e2c7e01417bd898fc2d091a4f258e777f5c18dfc432cff3
-7a13005c10deba3b25411d93b6426cf9c1e25d3eaed39f8f7d1c17f8ff23bc9f
-47dd0674ce0ffd60e12c1d406587cf6ecc678220fcba0ed870e0be75768362c1
-2b8158c19cc70560a058e53b83b19560ecf18d0acb4316b7061a9d9dac63fa9d
-ee3a0da5f7cbc2addf7ae5310aa833ea1f45b97e7698558f73f952baf03ec25c
-ae370256a1f81578d360814dcf29b12764f88ceb7ec3358e923f781bfa4f632f
-de9414f7b98ea0b063536770f3fb4ecec21a68caed7fc7c85b9abf613b94ea8b
-94f49a2c22e23233d65d4d16e4e6cf2c317da20e8f2307d4b4c654ca9d215479
-9cb625b53cb49947961f81ed2ca5fdb4d64f97edec759265788cfc48333de518
-fa274828bdc27394e4a0888925d2d9270716c89f82c2bc569be497f7ce930924
-b4f16ceca99254efc0965a3eabd78da5a16cd9f8d581cb7106ec2e9058b2c9b6
-7550555c837e57fcb453174208c072f26c717b88ef55bc13bc3188e8f768aa6d
-11026d3b69f0628cdca2c2155df354f24d2af4c9941b0172acd73cf9c7f973a5
-394aebd41728178dbcd55e73a998df39cfb66a287c0288e8e0e0816ce5ec98a6
-804b2d1ce83f2e31a17d32d47033ed9549b0b0119df7e2736bc89a21ff725695
-018ff19d096d87e8b310b9c0884d4f8fedfb889538c9911d4e3fd53aa570492c
-98a5f5a822886c60b8b2a72e775d33d0509a4b63e016cff3b2c767a6d39143ba
-995cdd4aa4a8c4de041c27343cd57715fbb6d48a46238c18d79ecbb2548c0374
-b9af808dcdbab805c520b63b30aa66a4cdae35e4b71b45c3a2db55c34c2aa879
-29218f60b74af83e44b1ab43906a3a54a34d85891573c594d3ae52fcb548d177
-296b52fe2253195f97c568894e8678583165010db416012acfe3083431175563
-6d1dc919105faa02f9ca5878a719aa7f0719a4ea81ce7bbc5c2af1ce73a5b403
-c12ddffcb317a401a4e12e3a3168a04ed036f04b973093605d8d4a9be6bd4cf8
-6a8b57b37633a1fe2791b281f40c018bb53ca08a467735377ddecdcedb939d8a
-38f757b77970cbf6f174b6a6c60da653e3e3366ad55890e78f61d293c4f96e4f
-f03dd48b2b23f06b3dcedce3c624eae1497e5d65eaf1723447d2f0ece09c8f60
-df0976b17c95dd43edb503237218d7a36346d08b285ed0f288fffe09ddb03cb8
-d2d76449dd1d40db1d11992055f5494f9b8137e4c918a33446a616f12f5e0683
-a4979daa9b97d3acb1fdac75242e1c3f2bad66e3dc8a9203333e48376a6ee721
-a86b34087389370ce971a7057d608e93eb4d7989f487c874418fe9a58bedad1b
-622192bd5f8e012b1d1942a6d65bff9cf5af14cd6e4cced7379a77cad8221dd4
-06adf2beaf7b32155da0b6b22a92adaa95d206ecf5a7704c4760d14d70b7c268
-4812a0ea07f20c02a797cecd44bc22e147df1c10d51c221e0c2161633616da82
-53ab9a727305515f5e287f7ec56f540f1e7e7d9142811123b84df2cfe7124789
-447d50bfafffde6ee2d7f206996b2fc896978a06628c983f5e33335b20a20fe1
-a71f01634e917ebd7996da19287755e9f9eaa0efdd7a12934da4849121e0f52b
-da07c25468a7cc24e792f5d8b37443a72e2e50c655bd80a7badd47e4fffabc67
-7d7c4190824f88b63c0606e93ec889184c70e88f92dc556e7e71239bbd733af3
-0d781cd85b03ff796bfcc24e7ace070db05149982338665b57ada0e7c2b80d27
-a64bbf46940f28865292f05f249a1b0d3891efcd184f32f85bd96a2623c5329c
-c59686103b6593dcf33a6b77e263167dca4a067874724d57efe3786f97349854
-809d3c8ddfd04d3942877f5def5aa3fb5d8be234abe999704cc133dcb3fdaf1e
-889f6d43cd4fc7fb570460f7ae4c3b2de650b6d9e8caf3c6a338394a68bae1b8
-ab46be4452b9709240803db075bcaf0a5c36008ca4d8080cbae6adf1de652b8a
-72d6f9b1bd1628eddab2c1b1f28bb144f9cf7fa7f86613b5b0e13d3f870954d7
-6e358c7841733c90d28f8ca3b045bb494392d36a1b2c9da9fa354c0909fabe20
-b9335158f0258d231301e9ae5a2217e566b520bc87583a5d67d5b1b9b0a999d3
-dbb824d88fc6510e065329ebdeeb33e7e7ee38ab4c9afcf46b089f6489287a22
-59a1137f6f31978958e1c425c2b8aa54e8808d12fda962c912c44092646d2fc3
-cee8190baaa232d539f9b453aa07d1e0527e6493d97b970017bec1413409110d
-3709d1a7faa79f1f07757be5d05718b09cf1fd0fab0a442ca9d14483d95767d8
-d8538f13c198e4072c332b3e0002a3a77c014a1682a5b113eeb65155e5a0b464
-1fb6d589313a2e56709e1be53e8acff66fb138e8f18bcc6b684457c16aca8a02
-d063a19b8b2849205dc873ff1febbccd7778f5948e8f974d85f74ee9845716b7
-d431708eb918eff9ab80be8ccae06fa58caa0c57f6c3b0c4f24fb07aaf81da87
-e12ddb61435e564ecb3b74759374e8e08d98c011bfccfc824f1a7d9df9d83fb2
-cb3a4136415297410035b6c824bcfd9b01f7d6f19f065bfba1eee8d560045dd2
-c552badbfd6b03ba6293d12b01985eb156c61033bbfd2553c4f96a77559061c5
-8e9e0d7737316fc1a1b4fadfc662ef1caf4aec6c2231d50cd7583f94af423b18
-ab4b9dbff979c200181921d84a63e4e722bcba97e42f78170f9441d0001dc280
-451cdc1104dcbb65df237553e3baeee3c69153ced25001e6fb970e6072ac27c0
-fb99138c0c63a107c9ee8e9fe1de42e534180dd9ab1a5c2d4f4a5cfd47711c73
-f55ca3cbd2e074c1ba4700ba73d237113e9f1908836c5a334c157b903113a9d3
-5ddb5608d0efcd863b973fc55017d106e68bc4fba6eb3129259854d59da2b47f
-e82b837e5c9b44ef7f279c0f6c0ffaceb7f48a72245216e5ce316a09983455a5
-089114d310a111a4b11da77a68c5e965265504cffefded03b1dcde16d3c3f940
-ebee6cea1616cf132b0658baf0bae5d3cd6043a8bb2f071df65f1e5f16eb0e7f
-84411556a2a7e5fcdf6b692c3dbb9d9fb6c063a2ff8eadde118501b4edb0e647
-324860b5a4402ebee015b663eb8ea6fcc0ea91b97eea89545ae93c5e3cd5548f
-c83f754e3ce0ca0703c2a0f35e0343d137a499aba617f83d46c7b7c0597fa84e
-1e544dd77afd9cc36558449edd033fd4e7dbeb57071cf624c109ed1ebaad04c3
-15eef5bb0b004895834dbf6b867198688c9b4117909aef484930e8a31602452f
-c799fbebacbe7b75d1ac37f6afc8c32313db3c8e4d64ee504632c76654e984a3
-882762b78b8791e6e46e974ddbf7ab4d048076aded03b6071f373aab006e89d3
-87dc28db2580559d957e2a1626b1b936a869da79be30d451f42e583f0d9feb53
-14a59195da976d1b6f42472a9cd34834e3cc6656cfed7a4f56a00f721967c384
-d664d6a48781058652094ebd87350c6a3a4692526053edc59963e0c5623d1df4
-0a0579224fccfc98730df4e1e0ba9b258bbbbe9d2b4c1db9c33e2a4311080da6
-bab0e4044ace3f56fb92c99e3cd0229c4cd9c1cc03c1f1ee32e772ba7cddeb6f
-4057a68a458414611bc2eb218d824189818cb4a95cde2fb9a6700d412b3503f9
-8ddba098f014da81df3344748d1229fbf801c1e2316d95ed9559ea16c898ce9f
-64f4e41fc35748e1efc299c26dc3b42c26123c330b9c8cb7e001da5de642e6fa
-c44c19f97b20e47ecaa5263bee98690f122326556c5cb69e9a21286c3e462332
-e10721f7747d3425cc204d4b4f514501e14840aae43fb523b89e8b2abebea979
-c6762a89e4546531afff98c36cd30a38d13fc19116873917684fd3043c3446f3
-7c6c5a36ed36eb3900bcda089778c671d6711ccb2f7a7373aa6f519b27e7ac73
-581ea404ef17adf8c92a1f8e9edeb0201b3a48866584806e667d7eabc955e19c
-2abfd1bff1f71289b2d8f694937e965bcfd6de56844f0e5fc980efc777f50f18
-9cf4b2d7c0fed84513f215845aff1bf3e4250aec7d7c19158978110a81d73f44
-92da75ed640441da004cce30d28826514e409baf6d41f7661c4668016d9fa019
-380a21444e969a6aeb6ad3cb2341d0287e2782a409675295227fa2ade601e1ee
-33dadbbaed9ea5f0715a88f5390868706ae6b5ec4473c15e65ff58e9c8117106
-c83ca1b91001e741eca076cf0cda6d9e44de4f8dc762175f422e12382dec63df
-164388ffb614abd40924ff4f6ed0e57cb451b320136c34ad9e3462ad884e4472
-7fe5f7d5c6e55997355cfcdf375f3ceb4913f23d7873731d77435e78deb10d07
-d0afc29c261ab66f2b5d1ebebf36e96b536218e85de4211b5be3bfbbf0c359ff
-3207f6d35ee4738be6233e4fab21002039fe208f10fdde73d0ed01e117a69c8e
-056a048757242b698bc4567f0684c8437d5d391fe2d95ca241f09d573654fe1c
-cf138ac60ffbdbeb15f975f8b1fa3dff83f552e27844ae3f44c4a874feb1ba98
-5237293ef7cd143d83dd6ba9cd08cd0dfd63d3cf8b5536dc9d65ea582b2b5a1e
-852778730e3a0ef6853d3126dd7ab94bc3cb8c41f60c82aac4d82223296fecfa
-e01714eee59cc4f75ca5bc0eb875f8a4c9a6d499c9a7e1cc470987404dc820bb
-c610db9470c0153995c2ac7cfdd334174b91923efcf4de1f3543d1e9971dac29
-a6a67169daf36b910780d691201638783401bd49010122d7456c7d8c1d301fc3
-243103d48e9fda5982b07f7300315a1abd3c84d7aa3088f00214f8c2b4ade1dc
-d82061a23adb2d2112efdfc648dfb995ea7da854793df6cd6b3d6ed7a1120832
-220c9e43f05ba4af43913c5bf74c1d3340d4e11ab7d68f6e4b9f785034b64321
-1a1ff2fa676fd0cc367605ee99f1c7f4e618bdb26746cd879a8670c3506707b2
-b774104efb3596ce07ee5966c7a7bd06563f7856742b284bfbda52a2664e264a
-5f781c5fd79ba767a19936fb3a0ef2072c998e1b916a2f2f663b4343afb8f168
-f2f00d3f5e1f583d20ba03f6f41a980d777c7c5fa5300d457830c48faf007548
-b642a7da2ce598799b042d03f4a1979cd0130662cd81511a5ac2866097352329
-a93cf79be94055616a889151b66b0054053822de0248141d4d3c0471f3ec95da
-cc00eafbcf9010ff26f90c186fed7adcf4383297311c3dc317c5bde2da60ced0
-e6dfcce2f0b25d00b1f16f5884981a210483a1a4d7dbabe00baa1e2ddf541a8c
-cddc9e051a54be5f4c2d0ffec3b83e931fb42456d49b12f4488627d3d3214c4f
-876ac4ca7e3a4e09a13d09c0741c7511361ee2726a8973650c7af8175fb81882
-245d94df87618d1c17632cba8bf34c37f91681670dc816afef4ed278f63a9140
-9cdcda8ca64904523eda55908972827693cf36089dc580743a9eff42e3f793f3
-100bce00a6bfb089e595c736eac8444815aafae9654d9da0accfaddddf283629
-be4a00a9f6b464bd3b84bfe069761777f71c6fd398cef5b915b7729dc2ec8cae
-b4ef063d47ec4ad9a0d8d8316a0deb5fe7982824c9f20ba43f907b56b124a2f1
-b3fe3d644e9a6f1c1979130b56a08e9a91d71de0458777c461a93fa416246373
-81d8a7b70639422ecc3841958dda5cc2ff32fb018f7127b24fc1f8b2a97f4eb8
-a5ace935d51e1f55c5ac8f2f3627efd76f052bb517560359f6e139080b19f328
-46f0bf11f1a5485f055151b5a802d3c9b042ce62e367446f59519a37dabeaf46
-9c7951ae6216be980b97c3106e1bc77516555ce6a82a25a2c348eb0078cf5a49
-ae48b25df34867cbe4318b2180a68f0d283ead9448f3a93cf5006c9fb4105c38
-e3ee2a6a0c2c68516379781abcf30bcdd3e29353c08cbfc7c71cc33080a37fdb
-5eb3054341ff059d1b0adfd213644085ec8f1ec8e0ed033db2e69e5c0c479925
-1e7996a730640b1e16ac49341478ff1b73bfeab8dfcff54c4f10dd7f10d00db0
-16d2e673fe75ca7cdf656de1aece63bc018ce97c53335c140cf8b98927b869ca
-cb5b1f6667d9df1d62544dcfcf12a15432e31efda2d8f4d96b73f6128e73d9dc
-932d2babfc3220aa8c6319c9fb435470625f259104bac932b7cf05c222dee3d1
-70ac1627567417f41f4db1c7fc7b892d18b2c53f12995344466d44be856cd953
-49f4b959b4749d390f66bdc6ba0983b377af879fabbd02f1311b6d87b3a45075
-516e347a9bf9c30f0c22573d03294fe0bf1d86490dd5e0f1800e97aa4cd34328
-325d62c753ae10fbd5098d1659687f930da4f195b9e4b8616bec2fbd0b6c941b
-09b03eaf23bba7544838473f2b5aede4a712d754a117591bf98f2a534057d7ea
-4a99ce86c87ec2b12619223c8046f9e9947fc8ec69018cbe93dec5ea5ded8ec8
-56b1d03f7b57b6ca0d8894e7a26c721956a66df5d582c397beb57c6c120ea224
-a7d5acfbc6acd556f5a08d60e5c1a725fcf062c8755df1d6f22381564656446b
-19bf6518fff2bb1e04aca06aa90cad4333f10b16f9585e5d19ee150da3931c8d
-a05618f6e4e188b44059ac3758c930c3ae763267ceb422e1b4595802b374ecf3
-2576af6afccf151af304747e2405f609f04509f38f17dfadc6383ac24d18f5ae
-f8eb5125446d4d9b0c67001c84edb4032df4bf86e8eef2c113617f3771c333fa
-c9b4e8d10be191b4f0b62a21c839a52f75ab070ad8d7b6fa6fe538be4844841a
-d1da0cf4948c018259ff3065dee62ea4a2a586fb09550b1e32ee006768065f6c
-a62e69542a84ac74349e4682988f106f944da6132c49facfe3a71e78f15fc928
-ba3a391a2599b16fbd0624504f340a0854332c12215bc1a8638275f6bf3fc328
-8c9cbe92a0196afe73ce3ffe76b146842cffb10446e80edbc2675458f3143366
-803d716bc0254178f6a3412f9978dce95ef93dbbdce9dbb2e8495780a784dcae
-7e01eb627febe7ba97e715d3439d55e3d86ed0764b2ebb4e09a1a44a4f187fb4
-dcf7edb3bdd615cf4d8a2ec78483f2c5f1480cb520f50c370ea1adaac5d105e3
-1299ddf4c84b810164d9bd90500b956ca1e9cc387ec7b697a220d124696fe475
-b963bed158dd5e6a466e0674ab8fe21413d2bfa7b890a2f75447bd75e18f582c
-7b94f812009f9e8c842e68e3f4d8545ddcbd12b522adf6bef2db3d9c9e417d19
-ead754d89c81cc8355f3e74d9e83df3a5502027be852275d5a292e84fe0f3330
-f0430353f25f954b08c7798719e59d889814d0f3da68006c3866e1ce7d4e4c6d
-1637a36b81c57f076c2a534139a3fbd06e814308f41d534a0b8efa70dd0a3334
-28b39be5842b7ba882ebcb7cf6e4e39a8ef9049304661a35067d684d4338def5
-0651c76971c635cc67118e8fc3e14b1f4593e855bdf58cab00bd96c4b9fa3fae
-06e5f2f0453b9785067720fad4fa2bce85e75f4c7627ba4c9ff60264b7e3203c
-b7ffebc5a030ddb3e9f73e43476cb14db814f6582ae10880bc2e05d2b45d6703
-fe5ff8fac1811faced4a873bce848c67f21dec481e5bfa16273b317ad724471d
-d6c000d0567054afcaa249b29fe4868d3de14f3aec71a9a516534d7bcd5f520f
-4b692be725813ad0686818ecff6583db9caca9217d917ef8e95b4f0f65b359a7
-bfad81b047489b5a27f25e9d0083f3857155bafde723af49d89d12d0ace5fc57
-55ecf06556351af4cbbfb31ced64e43741e00effd88c100126f6a9ea7059a29e
-e676d797f763662be90baf5888d003a90e1b3d2972ce2d2692905474fc3ca302
-45dab5e679b2649139d087da1c52b573f720136584590951849ff1acf3fc3a8f
-3598951f265080079accc4792c81607e426c7c94c49235defbf99c2ce7cd6f83
-f6500ba6df15e5db02a83f6fc92a707f46763f7cc3e061ed52833ea1d5e2c3a5
-e792d30003fc4442c2b2da5a7b6265ff74c554b66cd79bb3f8fe8f925be0b8b7
-5539a85ec4d8fdec57744f34ff9046971df2cb948efe784244567ba3ca7585c2
-d30e9227fc65efda488c6258472b8078e4d53cfbc75a54b2ae83ca83d25eae24
-62925ec4c6a8a71f1659c30a40c27a8002d5af1f808e305584a987659eaf20c9
-bb9149bc90071f272e1668f28d01cf753dee6184f401dedd303e41270d956b3e
-e8b162458a0b5b36f1b44730faadb167a76a906e4d515640db77355c10ce489b
-f531944e2af613ddf4e8bf63744073505c11b7a2391f3bbea1eca42415e72784
-67ac2104f88c79ef1adcdd9708241b6c666a0d9376fb23ba488b16ba96a4ac15
-828e8d286635b79c99bf768f8fce273e569f2f1c6c34be942b833a1fe05de68d
-ef04afae2e78ad7d500d16d417b517459820a3056be375cdc94d51b97bbc360e
-918e36d526c1bff1242103d6aee802457fe39deed5f80f274a4a76930ed84c41
-08eb6d4ebadad5d97f9e5226af8bffc0366b13cd443863ed1f3ac1a43656997a
-1562b520c57ba0ce60b0470c6200fbb418b567b575b76cca63a371e05b44bacb
-8fd22384616378260738256cb80100fff9d04375e79f8740923c4f87d02eb586
-40b9af5147a7f15a8278252473c6a757900ecffb061aae3ef8437bed0f443f99
-7e1d41fbd1ae69e08a4b72f3d82c0c9aa74558f2000cd23feab368fb9fe8adff
-b1edec68788c845dca9093d157db4aff2385d94b615d680dd2463cae985d94c0
-bb1e898d1ba8a26e8fd4dd75fa1ff158032b42ece876dc01ef0af5e59889c9d3
-3867a41fbfbbacb9f2b182a9e88fb57f4abf2b4af4b76b262f8b04e60f41e64b
-9b54b05972a8c8377db85c8c057c7770ef3859ba3e6d4317246b4d82efec05b1
-b06749c85bc5a915b8da1d3ebdcf13ce8f09427bd6687eacc75ea0a196d22616
-6dc5dd288539be39b3fc157e957c1ae0c61f682ffdfbecb384796e603b33e5bc
-43a3ee16f854455cc1825a2fd49931dfbc0b76acd783b8d6cf57ffd909e44e0f
-65f51296a1be58b28ab759390ffefd476cdd169ede92dfd5362137f2412f76e9
-ab8d3d7c0829a910aa7866ef6d7712fbda2223ee1c672aa42584d3e5dceb6ccb
-e16755b381dd61e83c43ef2636c33c5e1a453bdb8f30f51074ffa5ff9b427639
-4bc83edb449f5dad51984e25e77062f4ef7981b0cbcb6b8f97e938aa6e8ebb92
-2d7f2c599d714d3732caaabe65994e20e56795579f7feaf5ccb5b1448b7cf3e4
-c59366d5e5af71390116e2d7c545523fd2ffecdb8e2a59766cd2a8720b3bb898
-063b54de265f82d6cc34e88bfd5707b1ad047686dbe9d434414b73ee4cb2bf32
-8882565e93a6434d7d5e40faefffd695ce65bcf0014232760e63389558ac39fc
-23a295ed68fa43957428c359b5256c6b7cdf7f4bf4de03d6e24dab79d709a27a
-0ca54d84fd365f67d85a0c641073971e12260b03c0d9f88bc45cdffa45bcf544
-77e564efee2b7d8b8fa4af0745b8f4eefb970e6072ac27c0fbcfff9444ea7126
-c7befb2dd02476f58123cbc23da0ab4c91c8839af709a516df1db6acbfa7874f
-50f41b707e2edc5cc705a64f3d9b1cf30231d422b97acf6a37b9c5d6c0f6ba6b
-0768ae1b907aa7e986fc583178c251b36bd3bb424c13bcb9cde19644bb8b40c7
-63d2c192798218322f63e82bd1176158ed074b7293e4178e9953766f19aa08b6
-1765dda1ec557de4d4841f98e10f53985d111edbf0e132dcfe12d8118ce78632
-b67ea99982fd3cf289ec0cc186ee5993acfa41113eb12f9457c01cf3a13714f0
-f3523eaf4229da65ef3bac70e6518dc954570033bec5bb9c49f2bdd52db14a0b
-9b1dca8b489d0e9992d9c44720f9e9039b920a69b36e31a27f33f105bc700e1a
-dbf42412f827b364c91bd06a57e22097806f615ff8cf20ddfab163f32351b638
-c39bd7b05d0fb10df6ae8bbbef8a47870af4198ffa6f35859a308513bb3cd6e2
-32e50206aaae2f5e14d5bc6b8ff3f64a9497ebf7566ef04ff1394d1997ccf7b8
-31629e685294fc9cb7468a919ccecd64048c60a44e217e775fec9d31711d2ed4
-839a68a91e099d16e24b813817aac1c10e6aef41b6c616dafc4f6965eb4641ea
-db27f46ac00e4aca80488665771724dac1fe2206506f09ec75885d5fa3129bbe
-4e15f47090e9310c0d47835c5e697a634bea062a60c4dfc2d4e67bb8591149ee
-30ee8c5d284d332f4d7058b1e21826ec6df07a1b12ced9b109af752cb4aca0d3
-b2f64eed115d963fc4356953a62dca58d03c6a1574eb46c2a902ef65c2d41e15
-677eedf8e0f92d99fe465d596ce0154785f623a6f21d0b293e211402870271b0
-a7669015f8fa46740fc7f171f42b1450e001190e0dec67a83f96e24ebd79d9cd
-f8767571b35a891f9a7da04ecb6d0b0ef28bf4be1e1e6ecb634a3bcf8d48f797
-89fef27a51d3da06742a93f5367ba9dd87932d6f41fdcdebc7313673a427f172
-b142a59879ec5a115ba6e50da31c0c65cc88b2c012f14e7acdcd39aa96f58b3d
-8feef0df2d568a41874b0ba77aa07ceb12fb6113698279479d15b5798d065431
-22d252e11d1a8ad35a267b8f9699f36c87e5f9e84f931f1fea9d9226de70a6e7
-e8503681d81dfc236d06bb2599f896cfb97ed5d287f452c7bfdc04b6c25bcd40
-5624a580f4e3ceab7d7e13768cb014bf82e1988b458a1d98f1e28ca698e5e108
-7be4a8f26c3a25035c6ca7c176215877b2ba1e812d79a37eb3914f2eb5ea4414
-7c3f38cac536f3a8d5f7f9a17e6008373c54669e00c937771e8d6ba2bd833648
-8f5b9b61fca0099ab4d8acc4b5df4a5dc685fdbc90a6cbe881cd4fb561e8ec6a
-c76c3a42146a5dc2ce7f6dc221d0717138f03e7c5a93ed07cf7620975f4fc4dc
-5ae665540f85b795e42b15df5b82644f6e817c831087e2f7b1a49eedec62a9ab
-6b6fef18ff94e1e1f9f60c445ae93afbcbccf496255b1b64433e445b8eee247a
-18d7e43f90e084b0728f70744f87313ff6fb2c7ac61f207abe55d9bf4f0551fb
-12ab7d62e77d0eccee2ffae62392d6cd7f1b70d29046933384cea2e2c1428d33
-4a33ddac649ec5d4b7a65bcb483096a6ac1dd6408f48102e378cf71dd4c872cb
-772c1eb0ca9c8535a757478b30fae38098b92d38a2972e3f765b8b302b74ead0
-b41dfd21601497bd746ebf9392bc35c358ff0debb36b6800d254a10214e0196b
-eb8150a66c59e0926813c5189a777e924cb6ba0ff1c593c6405d5709e70af9aa
-e553034680e3af6afca2327983165790a6be4850b378556b29f213a78ef91560
-82201faaf9cd64884a12b176e5941f4783bdd9c4ac23cd7b33aadc49d2f2ac11
-ed6b4196e3a1546f2723fa0cf4e74d51227237e5be8dbe5b61e2860100c8a212
-ae75d5fa0f3cf636ce9db565ae8503d426f7eabe413920d7a98c3fa47414ba75
-af6580df563f70c08422873e6ce8e1282a6058f87dcd2defb30e25bb3bea88ca
-c4365dff510d9ea8e3c85967d70d39c035f3083c3624d7617bc5dac707f5b993
-78ccd3e91f5a94a67413515a21233f1b09a18acee0602287bd3a1031e169098c
-6dda3771867c4b6035ee839a1547ac0532ddca75a8b778ae07ec9c917cfab4b0
-ff9298e54fff5c54b4ddf6e5c3c44c1cdf1acd48f7b70bf36fe1a8c675f957d8
-005836caf879933b4290dc7cae52900dd58897aee9f8d6d91270aacc08065815
-3753a34da04548780f70ba1ce29c1019f16d1193d94366b0dd071c323b4b65e8
-e0f8580ab8b9c1818fdf7b2a92a5dd7d4cdd005d5b902135f0410fee82cfe1d2
-44bcd29e599d6d5f95643bc960779083159e00905cd2fb3ac66d4bc2565c4aff
-6b0ad51d1a051bf9212363f5508a98035af3c89748249af4b08253891fa1c26c
-e2e47cc4c3585450162b3e94eae6efbf5314d1567e240179d642c50096fff099
-bfea2ed1d2a1aad5164ee7554deef672219fefc240f979ab9e97e746b65927d6
-ab034d96066e955a3c53b8e3f2f2271e977e6ab006293b2b3c1fd7f615eb76ee
-faa64f082f68bbd8bd690d154cf62d48a7aac61f37d325295724dc0aad8edf92
-d24eac64a11d372d132434dbd70f34a67ecb0fb97dbdebae6d738446949de8a5
-de1f039f4b49c7d637acfeb002b56b1b97dc504ba5f00f18881454aae16f0793
-baf18badd0dfb6b218aacd7d1d878cd9c637729924184c546de16aa550e81741
-3218f217fd6fb7ea6145dc73ee00b0c0bc6a93123706333ff6bd82cc38aa848e
-b014ed145236d5b8ef7905f9be3a98fafb89e811574779f482bb9b0cd4c8fbb3
-0f12457defd87f6576c0c37f542d5ed7dc35f09b1f382718c535893fb1c2c5d1
-989a1245e44738cf6a9c49d80158796a90e98b706b03ae10da2d58a3cb79890c
-0d45d554667aaf0b110deab7535656ee3995dc28b34af6796c52dd0fd682b048
-7dc06a27282d141cc02bb880a0a87756faf56972e53257af8ae9c362121b0d93
-0b8321683cf50c57a463600936c43bfb65396235837910fcc1a0bcb79c57f721
-c3cfbfc40643583d680b3162e12794979c6c593f9c9525060cbc2b77505977c2
-a88b40bd2e25d8aba89801a09ba7aa50c401647e65c89ac200f072231039f7d1
-962b7fd0104e04636114cb84e7317310b590245703e54b37781e473265d5db82
-a19fc83b9725f1aee25ef915815b3d3399de9ece699d2c54c2a39fe2408e3f2b
-84010a6ce7dc04d192ac308a3209dc0ddaee51a502f198b2f74913c2fb6cfdf1
-b39c7051b7a2b2c374cd33463d784da35f96e0298cfd1950c4f2fd7a64050e10
-98c07c3f8d4f6631b7aa1a0456825db870ccd2b8187a48dc6aca0cc86d5c1cd9
-1c062ae412283578268bb9241946644186bb61a71cb80fec8ecdbc2c1254d4f7
-cc02660552a8c46871b574714d9bfe53e7ad6315bf022fc769eee9988e7b8a06
-64d6c44e3642b9d06632ee37449b26d733f6201d862d7a4137142d7fafe95f3c
-1f63107ef0d183f69922c2927c9b244ef4efb28c9b1648423d03039806ce157e
-ae5bd445ca51f3eecb05f104ec9eefd3bf76a37bd23494768306f143f1170177
-2ecb2abbc0ff27ee68face57b720c0724e1afb2ad4405d35ce79fa406102cb93
-d110fe7c707781904e41a48fc4ecd9819cd5cbee4e606a88932172cbc37e1d66
-2f0f2ca2379f5c5a7f554c59ab6c151209972825a4b5fd4a20c77696427ea5ec
-1d30765e4ba579742ee3c719a9d93c77908ad70394669d66321f1200679efce9
-7257b2f7c5b2a68c7d097c8fb900b415b490f386d9f6c439b3067893eaccb2a3
-c376da7e13b14bf196bc9940d0aec3d560c63b8497381bb16625ef73b1f4e71f
-30fce3196c7643c0eb9683c4f311cb41f6825d736911b294117ecd759386db0b
-97def1aa3a7e433b89a8d8c7d1ee8b89e6e6c8082d80e71bacab06ab48b188d8
-f27811d13c04c03967bee4322dde4b2eb76e58249a74397fcb632a3c69ca5021
-10aea31c1f57cc1c9ab15cc2c8e66ab3b9c59e23b06e08782c9217cf8f2c6459
-3b0cc08e7f6c75ee74701a47c9504d6bbf5d2b5468f7270783139ebc2c14de22
-661522d175e3a847aa72db59a991f005bc86622168bf57a3d28c2ae1cbc06ac1
-319c4b8195bb715501fbd26cae0827ff92058d7a228eec31fa0c6eb70554a256
-1fd9b21773a3f765255b6eb4d4379ab3f599c11479f5085cefd19bddbce533bb
-9465f89e493a7ea66cdb039c2e85a0fd0aff5d7dd8f4fa0f618e248c837567a0
-9b72aadb2bf3ff6b9d4307e88c206ba9b75e0ac844848b5fd2a08d5f7c1848b6
-6e49bf533c94346902eae08ac41aba2836bec511d8bcac30986a18a8405c72cd
-0f189c2ccbfce5dbbd09070f0f916ef76683855fed5982bf9b1760420eb45765
-994e8da3f7033a5963c244439a7ac157219fe0a7ccee82804f641591e6b66fe0
-2b0d55bf5f704a04dabc1d5bf63739e6cdff39415a5fc216a55479fa8e7e2647
-643e302eb4205dfed647b3b8b47ef2616df65784347d5677b52e9abc82c18666
-0b786335ac635e573aeffcf8224205d947b0ea67b353640237a63bd73510f828
-3816c87d8f12be5f998b727ae398e1fb4e46e7cabe627d8f6ed455edaff7d8e1
-05dc0203e7c407dc05aaf9b9df596313630f683d408400c6b41ea1b7e05c8471
-a22d583135a9df1ae41b0a2ccb4a739c2844730893585ea7586c580a0f66eb87
-7066491a6835c2b3141fc1dc23e1bb1d5427860a996ebf4efd3c092edc54710a
-ec4da96ba61f0eaf6f0d5d9680bdeba2b6c5fe6d71c3ca7a425622135634cc68
-7aab3e9ca2bbe997e074d251c1e8daa885aad2c9322e6cc85031f9e205baf648
-d257f38b320a958e202ccad9dddeda59a8c0e4939aee0ee7fe1daa0acbeed8ee
-111214437e6695f25b52f1386ed2b5904b2cfa095a8ee8f0ac2707239091fdf5
-ddada518e04bb44580ee924a8c38d681aa160378fc3c76290b21a9cc03f1850a
-6a277de7ff51614e67043cbeebfbc2a473993b91bc7b31150ac22fecdc99dccf
-eba2d8ecdf38f46dead509b780ebe45bd0879b68d9052fcd50e431f299412272
-79afa25fde7a63961c924ff02b0990b938e96683f82537c0073e42e58a49690f
-369813992dc8049111536a76e1d1db712fbe9a9d353793e4b1e31b4e6c836a96
-e542d207c6987dea794d9fb2c23ce8d1cd9d1dc6b13222963320c0f3c5053323
-37744b297e3c1eadcee45dd8a0b62bafb7f6bf33c628e20f40c4aad75f19cc91
-c5832cc45aa9978c087ee415be15681e3abba579d8bf1f33c1208068a8150bd0
-deb3ce69a7cf00852a436a71f9c5065a3b262238910bb60fe4d08a6c74873628
-697c148fe67f1a59cc1e4f9d18d862fdd6bbffe395d9ac79686ecaf001cd9068
-2f6a838feed75ebcf706f01577fee2a437cf11cb392881cd9108223d71a95edf
-ae83dea1f6bd87dd0240edeae67c7ee6ca99b569d15deb7cb52a2c768882fcd9
-846359dc48a34f9c93cf5058d60342b01feac20aaa60ec0973dc5e3af0198a84
-052c2beb9c53e6ac865ba4567e42dbdc69e888f6c1ab4eb7b547a41141578c9e
-75647ad89fdc7c31b34a9ca6aeb332b3e6942b3c41775307a59a86275289dc84
-9430fc23784b0cac2a581e4389b16d17d83d685822d09e47113c3c03c45b90a8
-5de29e346636f864801b043d1a1bedbcc0c610144a6900d28ddeafd5533b5ffa
-79058fa4ff48ce1c7c7ff32024f4e7aad75032ebf0b125466356f95158194a5f
-5750c3022797f5d91e6ba6648c62b7e754fbd6a74b82f9671234020b78689f47
-638850f2e1a57bd3441c51716b6cea8d53a422ad81d7f35014709d2c960a6697
-0d7d8c00b63d97bf188004d78ba34a6f60309bea91c077335e09f72bfb662340
-156cee8710af1551e940719cf9f22d9a0ff51a0981301c4f1435450a0c9c16e0
-de8d669b759bf6796e6653a07b305df4c93e62dfb869c5c4439c79e1011f3676
-c8b71f6c0900ec9f5acaa83b12163a912b0448ac5adb76e29dee0ba832938f52
-895f878fce7bf9d3bdb7b16e41504dc90df6abbc31f2b9f50cf7edb363998de7
-3d77e142281b2d02067bef95da5e7429d4d16f41cfd94f76b139baa0b96576dc
-08e6e8d6bef850f2c530003efa2a12fc493f1432ca635512bee93893be90dce9
-6c65ba7c3472585bf1d37e6c3eba0b9bc34a438fad5ea0799c1bdc674951fcbf
-b5635d169110a70d9034cd19be6d7ee95a06e542968c21cd5427c8ace58f52cd
-8769ad774a2e46c8e0d8ea342fc39c683072bb821fda38c1e3fe34bbb209eb21
-e4d9f44ff3b252dc0df3361cfd671749023b1504e167a3e72c2f38bf20ff58ee
-ecc0bf2ffce73d51cc8ee71a43afaa6b5b91c8b27218f3287595ef75eb8c184d
-5386918ac83903ff8eac18e55ef730abf6262f36b7e3a58a25ba0219cff270cf
-eba11d973e4ac3b3f76a1cb0f6a3cbb03a8c17c92b89087347ec273db0035838
-7398603c291847da22ea02cd85cc438a9bf69cad8e6e1d44898d927d9e10eec4
-209c642383c700e644c9240259ca6ef8eef9c9a33337ca0f866850851e3e62be
-aea1357ced843cca5d5494d30917b78454c78387b15185748a852a91f6f9a981
-c7de39732653ae16f28b7cc2d8feac6da414de43621608e2fd7b2855de0975ed
-3e7ac410e6eedf48165310e4fb817a02800b9ce0be655e035174abfc073064af
-0b999221ab0e169b1afca5642e139f482771e4fd1fca9c2c197c0262094e6a71
-a37ac0c0970d89e7220a1ef66bef84c959f444a0a7bd666935970748c0bd4670
-604614d617e8c54edcd7c0ed73912cc074629d0fdbef9fb6529b82385adc3cde
-b0107b8b2ce9ac4c8b482ad14853f78be96e7b99c8c70ad7a0ebe802bdeeff5d
-b2ed7e836651db037f2c345f63285157ddf3238fa19130790e7a603afdc693e6
-ef58cb564a063050abf1d44ab800d754d354256802068f0062ee06952e95904c
-f3e456831a6c58214f9f48c507777e847a5408e7f1a4eb890dc97503718267b1
-45125ba0e28636d20caf4baaecc17c5545f1b11c73dcf7d1627b3abf6933ca21
-8db138a9dbd295818cce7b4931751c8eacffdf7110d9a37241b12b8906b6bd69
-6a8841a83b3ee2b85752e4cf927751c6cfdf7a7138a4aa5811a1c858e4b555c4
-05833d5ec60d25920de78fb347af37b50f1c3b2f7e087d059406f81ebce8746b
-8ac13758aaac6ec1cedbac0477927a5bce0564c1517f6a20f140a868f1624e2b
-20332bbb61fa5dca68c18a20bf9d1397cc0e991747ebecf1f6305c33aed5055b
-bd1bfcf15007ecb49b61334d1e2d38e5ef24339fe6d66948846a55a88296d2cb
-12f47df17c72af4370565e1f73a449a9b0d26c39eea04125fb9192141265a122
-449ff568a1f3654585dce47622ca0bac147715cb7a1275d02c1d083aad411878
-be64dc4da6ef276ea20697436faa00de144b11d2145a0a0280041e0618ceac52
-5039839261ee468bd1ab9a22a098f195d3853155740005473b0ed526751ad4d0
-d671313593340b36dac33b54bf78cc87256c6930a765f2fd927a3582343bc8f5
-8ec18900b67abd359ce7ef7eca1f1f9411943e057872f3386357300957e9e75a
-314835045839468e1e5d41b890f7f83255c3584ecd26e2971367aeaa1d3cd22f
-22121826d56aff35e356dab010747c2f46d46629a951159b6b69117fd548614f
-ec9e7d0a917402628829460cdb6bc8ce3f93f96837c594eb29c63500866d9ddb
-fe78d09876d3d2f8327c3318f96a1327691195afe12065448493411832ca1a1f
-3b0d4a9593625d8da1b359398827da68a7824255446e6342364db03dff29c917
-e44486cef063382245d06d9fd5a36a5ef79a08f36a66409a2f63e9235a12fe2c
-bc9bca58381b4d9cc7a6d79caad7d1b00cc6520836cf3794901295935bec1975
-8f473e0147da152eb2127f1d9da2500fc70be6811dad855d3a00ec44496a4338
-f89664ef47b5ae81fd8ac944448d1908345f3f0b448a028cae01e0e6c7c12e18
-30299a40196e5de461d5184efe63a568faffcf7c4272a37b8af0fd106dc94e7a
-9a55c62a4ef9b8d29b5d85fd0e596bbb228fc20a84641700ab85b33fd420163a
-deacc45055ffae165c50473f13119d6ce2d5ee143c52ce41260a22059b106529
-b87a8cc28917a38d5aa18029a96b3e095ef78730f4332c4f59eb02e686be85e0
-ddb57200449614b8209fdadf7ca82f4e8051a7baa6501270a3d1f00d99d552b6
-316010b7a51c23709b23849156adedc38379fe4be0ee796986674e2a73e34c7b
-195eb533fd924a2cdf6e73c1a02de2b3e0ce5ff89ab08383fe39d880d4dee544
-3dbddad4fd25d3881d8d5fb4422635e72a9c237249ccca7f926e728de0d293f8
-f5fff6b9f13ff9343df8a1bc3663d7786cb6d520b2a81874a17ea112e5b8dc0a
-b3b81ad49837767e7879ee03a82e7822c57e265be60d0f6b2789a3059b673da7
-5da7157f777cfdcd9f5c004ada55d8852952d8364c696e762dd8f449783f9290
-6b8f1c9817f5b3564c1fbd5f2ce6bdba25bad8a38b29dcc26938a7285577c391
-7b972d3fa1738737089433fedc6b6c11f2d9eac832727abff83342cd4f99e14d
-25e7463585c1be15989a0a0bb377ac009fd8ca8a5172903fa64566b06e2003da
-dafdd852a6937f9522a23711964b30d4fdbcff209d824491c0d0d46e22bde4b9
-4e33758ba1c3df8429ff69142e39d447d54caedd9e65ccd5a92015e979871f0b
-9d88029dfb4c74f286d7711a1dfb1c40fc3b697f3fc8feb4ca281b0027d8988e
-841a4a6ae8660c7c54d335322587693ba4fca91e55df91006a7626cfe30d331e
-5b518d2110e317d71461d12d8a908028c0030dea4fe6ab488f213fbcb97dc979
-4a844abe241435ca55616ae41715df1eb11558fdf3a39e7b854ca99d1535bc87
-98ffe95ff41816bf1d903fd839badcc7ef963f825c7c18079fb521c2c0f2405d
-397972e2038be57a51af173480e23b8b0959573029c386fbef6c0bf83a8ecf1c
-f3d6e1f174fecc45ca6caab7c90211013b552c6f7aaf3e837a02a2c2be6b4cae
-fd267fdc0c24da26d5ce30388a69280465886121614b029130325aefb656f38f
-5b56a08c2c379a8dbaccfebdd2d3e5217f75db4d7b0cfb8952aa192248e4bad2
-545fd3cec2c0cabb48f25817a4dbb1b9a0733f0a220ce533665abddd39a39eee
-9f4784cb26411c7862c644191fe63fa81dd9c69fb2c2f32d519ff145e5ff4ab6
-88a996b4e43c5289274aa0ce8b67bb95b9bd6ca6ba4e86505dea9dfa153e58fb
-ce3acb84b1d5b156ffc84eb9ed8d86f5dd8db7ea1a44a70feff4d03541199760
-0246a0071be64ead64a82f6f370a4f9d39555622e8bc09f4360aac8442c64959
-544189deeea7d78b62953fc6c1813c23f77c72761e56ee70ecc3f07bf4b5ee44
-ed0a6a7dcd4dcebca9925d39d190cf815b0585c1dda5897842e7dbd44b9a93ca
-9afb0344416c7e12f6a69bb9ec3a0a5ccd176839b24cf375c7b5aa63fb020ef3
-86d1a5467f5be498dd3dfc7041627ffc4b9ec0ae397c001a3f7703ca4ec8d27e
-ea5c798083c4756cd0d4dbfae4eb389026f97ba04094c0ed317efca15ada576e
-5315be4d6b84e91b8fc41b4ca765c508db57265a76dfed2ba23f2005ee3e1666
-f0f0ac085e4151f698661c4a69bea8061ea0d86db942164e18f51802ba4a4cc6
-2646865602d3d5bfab3dfd4a13d9127075dada545d9254dd39cad08661ee1891
-40da958aa1d7f9ffbc5d2bc6f8c13a54a4137bee3472955875df9643c71aaf89
-cc4d0b34313ad78fb100347e9a6ba236bffda2c9120f728f7f9dc24475885a7c
-6d647b40e380ff8772532f649a0a8af8d5d577a75548cc53bd93b2d94975bd82
-6058f644a247ddb8af1bf9169b39afa10d810842992d9503e869439b08958f75
-f255cf86e4943cca9ff8190955c4bbe52a22db1d33b38a8ceb231f25fe67d7d7
-1451d378083f32232c5f1f46a654d87705fe42be37f24130ddffc294ffa72d63
-3bf863e3668310562dcf82853af99ab19d16e015a5c52f718dbf998e20316811
-988fbd4e96bb4532e180f9f76e7089f7d15ad1530ab7e3b6a833c4ff4ac9a86d
-41c91a98c6f20c27d816b5cd07924e3dc3528f7cb3922500189f429ca8568af1
-fe89130ebd9c11860be49ad45643ec0d18993fdc9b0e50a166ff04b409a9bc3d
-99215881c09d26949749cf7ca37b0b89457d3b392cb44aab689fd25ba7b5bad7
-06257de81cb1c50d2b283726b050d1ae03fa491189c8b9fc1b22b373dd70e86b
-1d40de563ed4a3a80579255ef9dcddd6853c8a757957ce2907a0cec4e94fc5a5
-9641afbd3cde23d6a31dc99bf9180c35393e8e6fa092f5e0a5e215c618a6eb9d
-421d9eb8087fc539daf2b707856d59c049b650c264105d2eaf3c5c383b8c9665
-7a53e3aca0f93395f70a078369facc3cfcc8b17367e6d88887b4297644309b12
-8f4116185b756509d9df731553beb42e51e78953a7d9fb81f5dc3a149de0adde
-c7f7f517410f474c218cda7880bb53eb0b27d0e3903e1d50d641aaf4c510e03a
-4a0862d2205572130f86502a4fac7ba66e5ded860eb07cfc0d90e908eb7c74b1
-334d1783a3111f249055e620b622a4600224a38ef5ce99fa6689aa9fdd5fa97a
-f90e3c3d0b44a0090b840404686ad0825117bf9fa688c989597039238cb3bbec
-a709d680b9277d87eeffffbc5c21e8b667f1c3830c6feec3046e70b3f46431e8
-0fd084aa78463ecb7e4dcc7b73c046236372f8701397244950dfded1274ef63a
-74b45676af1f34b40a82def94255003583bb3845e92f656d0c553155016ad73c
-21c9b41d25876b01e1592384222e6c8af08f3bce00c1785aaeaff39fac59771f
-858c044ba0a298866bcd42fa82d6e2b1d947d922597892eb38dc8bf3cea0b556
-80d643f58644c80d55b64ed144a03f6a9b2b5471c685c8656f3c19756adbe22b
-be33a8f9b37e9b3bcb84c13171abc2acfd73fe7f20a8f6ece9ad9de3c8a08e75
-670425356ddca1f26aa9afc9f31de830373c71213d2b84c29fe667ab899df5fb
-9f0b5102556158112a095ba239a299b20056c981c17f2c06614a1a0862f084bb
-f420bd958d1d458169124d68c5299d9b35464588e192386347aece5e2a48ba84
-43213219c87812647a9410d34cca55a0a62bbab770ca79b6959dead30f6b5451
-8a20a077406e39d2d126b7e13375104a1ed7239b95a9443b95dc24079d0f149b
-08123838d5c21cb3e8d9fe656c5736306bdd4bb5c88393610947253ad725952e
-7d9b776ebcb6617e74de8e9c62dae3e081078a04c492c4a35f303e0f600d7d34
-eb629dee4f5531f86916dfbbdd1fb9f6b1e385afd3dae0cb6c15f45ee49911ef
-2a8e2ddc4c5e1570f512303d94907fd941bd7f7a053a42f990e7f25fb6f8d1ed
-e7d401ea0e4d3405ef89d47416aa7d24dee907fcdd88cb2ab09ef07261f45f78
-733903e89215d7acd1df74ba26056f5c7d3d0ac61d2718d984c022179c98c658
-4405af27a3c9863f1c8278dbde150addbdd057d5e11587ca2ba42c1e6b422932
-6bd7314e190103af64a33794b3ed12d8023483e8d17ee4f8c0bbef5c9b78e2e4
-f350c487df51e966f985b5ee5da43991da55362f6326324c77ae53d320326ff6
-202a089c8d8aa68c588ad9c82768c1f889615ec5b6ac79f75d95641a500a499f
-1b57a6758c9da836b7124af1d37ee04cf01478edecc008521831381f6225f593
-f371fd87ec832bc3bd853d579a20244c3030b0eb0db3191d900b654f1067b0e2
-d2a07232d032b264aeab347be9abd0d2a07b6caf85ecd57ec87ee34ea40733e0
-94dc88246eb7fe89c751326de8c008fd1b55e2cb07f3b6a08f7a0041540c7d68
-fbc4ece7a2d0184629adc0cfa77ac198901aa5a1479f1dc97a0b3ab87458e1fa
-4704290fc5a744412454a2d3677d9d7565a97eee239a5c5f7eb94793899cfcd7
-2566835d9998e772fb3afd9673b3c74f4bbd339095f2f71c93458484bafe9741
-a1a65b3e15ca5045fbdfabec1723ebbd4e7ab85cdac37df2141af2095e0e16ec
-bad6fe620d2e1b874c4e3bdc34f656e9604c6e33cfab4438324b8958c8a7528a
-4404b2b8aec31bb0420887f4a6f3c3866e370b1466526937851f6851865b23f0
-0245a38682f68990351c12f34e63aa96d729828bab71327b29eb1a96f30c36f7
-65d4cfbe0769864f4a46f037d2798279f914b8b2ae86acf94385c79db5095b86
-d684a976dc1e662c6e02ce94e69fd20a9960c304626aba2a113766c5923dd7fd
-fccbb999567520ff855248bf8377f01ef9dbd6ed1511581b3468d11e73ec622f
-6dfc289cc17026fb10143d870b68e32e6f84d19567e177fd4a48a6f003591c1a
-83fcd03148ba9f32e6ea26fb33e2b7626620acdca5b302caf98dc6cbe8f93d09
-a877d7cca4d52d75f4f39ce9a17aba04fea7707c097f5a8c50657ade42c5adc0
-76d6ecd980b068651e8d4c630827e0226343c57b39d782faa3f9004585cba68c
-ece0430f332e4501d2ca668145020181263aec4a988db312995df391c9638619
-6ee6d1810a9731cdba8632772f844feb41e34e7d046c13f3346b1b4af62f6f8e
-da0026e5b306830c0aaea5f3b91eadc7ff9108008fc1081e0371b08fea45ad38
-ea17df8a9d1b7194f1ae2819a2c1fc1b46fd054f5b98b84e4b221a7c50ccf1ba
-c995d85664cf8646e2e5880d847f532736d4de8c9fdc2f91be71d89b062d2246
-ceeab03bfa0f8e5e3ca581e958a8ccea868216178925614309f2ccb1616c44b1
-bf772125753fae57762c8a617e6da4d716aa20a762316bd91bdd080a30cd8751
-7462a59f7a90200980e620811ae9cdb8903887effe20061f3558ab479f365a06
-2a8cb74720631f690dea945f6149a4e010e73ec5937c180fd71e68fdd9f4b101
-0ef804407a9b2a375a5d742ca4126b102496c02a6f0630a4ee91089a2beef12b
-97f7a7ccf7c2c751aee789ea80cb91291eb2dfc2855fd792bc858a9a0df22e09
-19f5158f584771d9446bfd864fba50582ed52644eb80cbc73b37fe9f8e4f8ca8
-de234351e56df85ea853fc6bd27f5b4f0c1d45cab7dc0aaba49585f3d2e1086c
-1f002a8a6585816270be2953a6e6bbe0accd129e201423582909b00d7bb2c73f
-c2296a4769da723f979915a82363a457b814d97a2315dc448d3017681175b6d9
-2184936f9784d753644575d5ce4f499047871e30c84263722460ade708d0c2ba
-e7998af8194e6d041ceccf6c7ed6d937322b860081a165bf69be1b47490453ff
-0e2aa9f0c08c1856c53015152850b8cba83cb82ac6d21730ac9e00919e78f994
-0a14c2be0065b65351a4d130612afe42c09567c277dafd4e74bfef17c252ba7a
-e0e8480f0e184c93e34552d4fffa5e427fde368d6b1583581858081613e9074b
-a2d0ebc6965254a4d5dce59ca92a857873bda1575899839af87f456faba850e9
-16d06d3df6931f04330fb719a8cc91ecd28821bed1e993863cf9ea95d9e03c7c
-b67490ae6a05e0ca47da8d6d7777ff553477a949fb16864ed0ced4613dcd5e73
-5517d0eeb3b86b5892efd3f91b7a1d9eb11ab7bb7feb32f54a1e63788f3a4854
-a4e16f8e81459838f341e5d288d25ec470c18c29f8e5d449bdd29e40244332a0
-4ad3233d92beb334520f1285aa1b11d8f844d33ffb74edeb98de1923c0ac07f1
-92b887d19a423ffdb409def765678047b774d040f771a6b7b675814b63011cf5
-0584368a865b6cfcb4b124d79d7283df63d601795bf5ef80b747d3dc23276610
-46cc26d90ecb0f3261d1750958bf19925e4962cd95d10824a47cf1406e8881ed
-1bc5dee966ebb033a5af7a74d7183117b380fb848d4d5890faf6691e9bc3d0b8
-ee3edef892a29942544e1cc7bc2017ce7642c6eef265c916a011c4dc8fe47b45
-3e338d4655572c220bb50a1a05df970834ac6d0b91a86cc416eec40de3cf50c7
-0caa0b554698fae5fc76e5073a9ef47b6d739a8ee52758b82811811e32aff60d
-d474cfeb8ddaf5cd242c7a8e7747602aaad0de7f1124194eb3e30c060d3476fb
-43d520389df0b15c44007dc97245ca41f3e5b8fe0b283a1e238b57774472b73a
-da0ad5b739c912e42864f1ca568e7f8b3c7525ab752db196b35937a509e24596
-73ebd59d66a82daefc60b87f8e21a2bc4e85a5bb2f858a5cba43eb83f54bbcf8
-d85731024babb818063e68ebb3a7e0978b45fd02b7f3734777683cda727312ac
-b54f2606bebfe66499dbd8738fcad5b26e749a8806b7116ba138442bb85f55fd
-49049434878537165f2c573241b1c1a56a0f961cfb5a269556f3eabcb41b09bf
-0966d4cb4a0f3682c212e251310347a2b6bbb258f346d71dc4de399a4bc5529a
-dabbe008d511ede8a302a407c7a4095739c505f1fa1f7a51de21b542f23d5287
-2e8ed319d7e867282a407ab35b5ebbc72d96a4cc6d6cf8322d92a82c5ce488e6
-f7a90ca6f5f9b9972e29526031f9d5ff881bf951e0aa40c6b05d8651385c7eea
-48ca375b3f06732322f3259a5f92206755336a2579040d6768c85c4ca0afc4e1
-d28eab5d5f1ddb7d5d4f1a3b3b2b01cae132f4c0731e44f103abd7cdcd0d61d0
-8fccabb2471b66249c4ffc31711013cda5de95918cc50daec85398288439c7e1
-9a2196bc68ad745adc5fd398c3189c574380df2c2e4486a40817c23a81f3f316
-26825bef951991a1208cdb551d300ed38886ae677713f4b9d4092c9e9c76e5ea
-22f1ec6be10e62200f4f9f591fa0255f249739dc710de9addaa9d34ee904641c
-9bcbe6e79a6e4484fc6d0086ec2afa5b8b1926df580af637e73bf126680f9e49
-6e5bb8c21d6a428e77521156f78430ed51dc2e33284f88d78ce909fb940ceaae
-0a07dda0d9739b8a3d2a304c2d9f8cb443d4d4d6fc3047842cda21c0b0073e0b
-b52f5e1b7ddc2048fa9f67486e2496e0fd2d09ce80730d5f7d0f7e0ed91b6bf1
-87683b6f62f263c10b36b01ffe6fb601327450cd5a4cd8ef322277f942bb2567
-0b358456c29fe2f529d334d5db6245c1e8336b29af092689764cb1a19276d9e3
-2b4b77f0a1c3313421c89801f2c2ef5f75169fc2b3a98b69519c9a7c46b40148
-d474e7a98f7fa7cdb85c471fb1171da6de14027baf64315142b75f677ce7a413
-6466f817519848f9b9aad66b34e3be10e7fafc53571da25ea3b449d7929ec079
-bb4c3f6d513b9174a49bf5500a5272fba2d95362a562339eef996944951e61b7
-38beece89882bbc5580b7622f84adcd3b460828aada98e5cf6789dae52a41ecd
-7ab5fcd2dfe6aa11cfe66d6366672c46ef3140f2e0657da447a4dc2f855895ac
-b5a79d11a9e45aa7a457c11b4df4ad291f25a925e4a01dc7a64f848c64f2a739
-bffb51c2531e6717dea38da478ce0c932a3f9f856cbd2aaa1e148a0692a92642
-9d77254e7adf8aecd46a8626b7a31442e2046b9532817d285469f59d971bd398
-b6971a38e6d44f31cc46e3f48f10722641905d7ce093f5ae90fc6a56e53ac90f
-7f1cdf1ddcac29bc60d3202de837fc9d659e30cfd707ceb5453028d1199a8a6d
-87af5bab407c0a78c571e01020560bf1c77936521405c28cf79514579b017733
-70470f68de4e7667237065ece8e2e9bfe2b5d3df69a0bfd8b17ffb8254aac5f1
-d7a8c51d3f93947f7779f368c71c343159eac60c5a671f81cbf2ba05626f91d2
-aa7887e41804f5961b341a5d06b849cb52676311c81739a96d5da0d480cab2a8
-ecdfe115dab597f553767e59cf392a536dcc9d52ce25c424a9b840fbe6413361
-ef591c196e6fd7954ddfa457e7cbb9d5fc00c45d1ea21184f29291c54c353ffe
-59d19239224f9de9f6595d5fb5279fd19278e93b366cefa22b41750cbf2e03bd
-7b8bec58170e6d3c276f8dd4ccc99885a5582ba4ed5253a17910580a7195d775
-6e10c5608e2499df08572d1fcc0ea139beb4f0bffa5e18f7c1c17ecd20a9e400
-95e2d469da5d9403dbf146aab0a04ced94b508bed89375c6253424f6fcb2afc2
-a8019b6fc866646c1b54c32858992abf31da24399f89ead105a4056526d52965
-289830fb4bac1b0cb6a629104dfccae1a688563a271da0927cf2a644274d2a3f
-f90e5c1845205ff935fce3a7633cb8f14e01167b6a0368d2a2e8f072c1bbc6a7
-d6f441ab6d23cb3111d8ca1634cd58dfb4d704c5aac7dc2df32ef43c0fc490bf
-86592326f415cb9c543563e6c2204aa0e58eb42163bd9d7209899abe51946f7e
-7505e6491711e10d5d125fad62e34fd2e08a0ed0028fb0234768f7948ba2626e
-d037619703b922ef43225732aa509b580e92bf5adb3979bd8489d5a50a132b7a
-685b271c2facb092739061b8ff4f49b2253db3e10839827fc99498d5a44a5806
-8d9962908f92343b87f44a8bb92fe1830c362d29f990e861461210113ff1ab0a
-55436ddc38db4bf16131d9d96784f3165fcd0058401dbec514749dad00b6af4f
-73afb28ba5b5ff1a023cb318fce617f5f55eeb0bab7c5bf819edf6a7f81d38a5
-d75355916dcce33cf2b8e771f9730b385c646555b1137e9416c70d5f860a6138
-7d131a9d8acdbe4663772c07722c4e4bc85451fefd08dfccaba1c8f3c251cd09
-3fa5a333877d32ff4d2ce359e6aa47dac276bce065cbb7b50c0e3add00f41c6d
-be9778dc241411d1f9e934be7934c6506686ce7c8d619490f2a3f065ca6f213d
-9b173efd5541375438e9c6e58d664e8a61aa1f646be623688b1934fbad34b627
-2e1e5614345e8e42ef1456785fd526f21078798a49b61c106e23678f1f593c0e
-1ee8c5561147fa5bf38847b982228952ca06cf4549e210ddb6e37cc2921f98dc
-162b175bcddbd5b8ad6c58d59ec66c5e118d919ea48e81cde2c17149ab133d78
-e1f45f4c5d931f09526310f2bd8f0233fed3a6a64be805d626115b35b0b5b39e
-9cda7b197fec956504ccd72b71a29e9526a544957068c9b7ed6fe04255444d01
-2ecb4f59707fb4cc4a1636c37f9b94d0eec7fc12b70a3e88c7325c5524a5fdae
-bc4307a8ee518fb10801bb3ba4e17a2931b5596155171765fcca938fffb35693
-82e0b69a88235c65631e4072e3fff4b3f00a06624db945db691e97986357a509
-5410d64bac2774999f960f332c9050bee455f229061ed099eae00dfc3fb9724d
-ac85ac49b79a19410649f06099df677b8d0b39c4c7dc52e0aeb1d35baab7319c
-f16795131e2a6d83b4f30fa42d7057ff9030c348327c91f1a780209ae58ebbe4
-188d8ef5e354491d38bfaa4626736cce69132d6b1e71f0962644dc09ad793dbb
-368a8e4cffc7a8cb1697ea1b85f5eb9a831458c968ed6b860c344b928d182afb
-677a88a431acf29e76053bd900e3fcafe19cf96146b492cb0b046fc4388c326e
-1f5ba7f4f9b738c11af96f86cab033b8212716766c1d64675a52c304be62b163
-fa483e426fa8a8066bf82180f77909029eb1063b861ff73dffe14fbf7a25cd7d
-73a33d520f6349b76459f83ba004fb60e3dc4e50b4306fdb870f29cd7044d6cb
-20d345621ec5ea26ae9ea8e66dd198087e51e8ee972f6435b82f635c83fb4d95
-585e1f88829beeca19a6ea42157c10f703ae52b0c0df309a4634314327ee3ece
-2ce41c7dd423345ee25bb7f64f5b300002e11463baf80547ecadebca51b18156
-09c7e479883cd404756e73cc8411dff1dad55e88757314f155bf1eedfa94d1c8
-7806e41cbc3d89eec743c50aee90d6b69bea9de11684c85ea5d0a64cff534085
-f180ce75bd623afe1e08ff4fc4902d88f769e1b3221831f7559867e35137fba3
-773f7bf4977cc27997b9da44e1799353cdd563c88d067b13279752179752ad5a
-68f300640de27cf42c42c5e235f5d7d8b345ccd63bee391206499bee8304ea0a
-591ff1b118171c51ba62ececf66006f78d1c56415178b9c144ac2e83457126c0
-cc7266234abbc4c1ff4ee17fc352e9bc830aba16351a937cf1304173f0aa12a9
-f79575ba5e45e6c14b93d7a34001b29df1ceb73cae7fca7f34078f99a72357a5
-c7b040f377b8dbe90bdcced28f5363526bf14f0ecf89c919d53f4c3653528b79
-8dfc4b4244f2d9747e09ce16fba69911dad746356ab3f2db59e871b21b10939e
-ec4fe4d11b49055c5cdf81f37a0484978dd312eccd5e95d5ef7ba378196396b6
-cc3b51de1e27035f62fab5d507b5a95493e2ae54a6b600d1727db436933ec9f1
-1f01d50b0c645e8dfa94f43b15c47b2348c3c387010989bc4d0f7401a024d351
-0914708a6015b66af6f255efc2b86a535806de1fa9520889f566d000bd185ee0
-9dc171fe42079ac3c342ba13607bced1ecb521827c465f83ffd8d45d50a69a34
-8b1f0d3a524776641483ece863bc262f470c3e603b380c92dc8e5e4319428fa0
-a5a8cad19c001868977d6c36c49eec7a4e3068507b075b8071ac787db8a6d3a4
-3b290f01b24b0fce5c77ada9b89704a5fd3de6f5e8eabbc2c51daf3727b9474b
-8e2f4aecd0433e0ffd20671d68f64254db38847ecaa7b118bdf0ba25de5c45c5
-1815d08c82c6ba3dee113d34a1fde725ba8aa8fc05c607487b703c1ef2ab05e5
-575602cc6558f7620e43450f7f508e029693498e2728e4b62571e36e02360964
-62a9579264eb4baf12402284f0bf498d116da62e81d6d3b11c5fd8b0231d3c5d
-009a3b0a5506f2c5ff195923a8dbf04768655e63b48d22ebeb97f8e416925e76
-3bda061a1593c0233ac9c058b5ff5b6f483cbbaa4bac15d89f3093909a4d50e8
-a1f61bb76007205d4abd546628cb3d17202cad80f851ee95567cb313e3155258
-23459f6c8b3f02f7e1cdd1499eb58c0128b83c9086eef4e1479a915e75e06905
-f08ba8678f8ba2dda7a15a5461568c2a44e100e078fb41b49bf2e34a35774c59
-cbc642f03830c29c73c8c8334f7f0b8ae263235dd2acf4325973ae353194c10b
-a4d017e0d61602715e8a7a3fc90adb659da741a39b2dedb707d5446cf0a12997
-f5df3044fffb50bc9b40c0f551ca4f7b012bfb033e6324dd071372e93cef41b3
-8e29dc94fb145e8c080ca7e606dbca4b292ae98bdee61041e733140c638de3d5
-2e49482c182b75d5d1ea2a27cd8c40926b7aec98d97d80547fe840d1ce753797
-e8f903f0c59f5390823e6a15941a55af60a6b0f82423ca76acb3b0e27bf4998c
-2d35e08c4bd4534f0b43facc2b994775ab7c84903605358015445ab8649c8213
-8b1ef913b3c9a3d46d4d9c863c07ea43ef77f04fa4c91f238a5ddbed49629e62
-a4c84190f9ff58575dcf46392c0db97a225d99dc1e7ace1376ac9f20ceae14c1
-8372673772db403747b6067992238fcd257cdc9961f30cea0bc096c77936bc96
-51e8529f52175ddbfce202f38ef4bad1e437fa76c8801b7569c347cc9497bdfb
-d693d6f46e66aeeeee2f2b0d4d1784234064ff0f63a730d0c0c80669ec5b7ad2
-3e68a361a69b4de9663426606cecfd2b13171f3e1f8d278240803a0f9aa067e7
-24170d8ad2f4850e1cbf01f0460561a2d06b32c891f15727fb139ed20fe35875
-b04b174e9292b2be4f30f2fb783c2e35f6a47e5626ec3539c0ca7c78a8c65fad
-8255c95360855297e5baa060b4d0821ba56c95db62f42d5aafe040ab927d6e6b
-a50de0a1fe6c404bc445cd13d1ef1f6f9ac1591d174687f4d5e4b80f8c57f1ee
-e2ca56e6b71ee222fc3b75d9c8275b5ae804c530bcbaf814543b53b3cc333184
-f259717a387c6517e31cdff3742506dd3fdfac9e86a00d15ab09c2f381029609
-d34f14fd5a799f1460472115d8452882d250b72325f273261ee8cbd06dccd1e9
-88aa035ba584ef6062046704f0ce3b19eebb71ec933a174be1087f7e763e13c4
-fcd95a51745025643ba2ec4ebf6e7d08cc2661b38bdd189b68d4f5057cc1afec
-bd5920178b7ec3bf3073716bbefbc0fb0fff6dd56b32995245eaab7d686d61ce
-cf8d35d7ced60e1d8583a27803cc31eac0dba9dd35ac730304c057bc81ecd5b9
-9a7eba791852d17300c6253de776cc756614eea68c940d787656887930b9c38b
-74ebcd963254a3a116f15fd5e0568deb54dd076760fefc82e43ab8caf157f2a1
-0934ab492ba04b727b4a12380d8620ecb36b234ec23ea06e1c01b0ba6172c505
-b5fdfc5e1808c9050c8a9835859d97e4c626d48a3a26e077b86970a4a4f1f924
-2e056404c1c3c750c7e6de295c6b9eee36f1ebf4b7813d335144884068f1d8e8
-adb020e3f5971f627fe12b6c4d39e56be8cfc9855ac76493ed4994e9be17c9cc
-3464585754dddb9e577dcda000fee128090977165fb6bec6e90827bf7902a887
-ae02126496ffb08eb85095cdb4e5cf63afde1a5a5948793b163feffd60cfb9f8
-428ecf3bb84679c18356122b74ae5efd381d63e496750bbd3f294c55c4306df8
-4c4c5bc4d7e7aadd52704b1cc066bdff579ad4aa3dda718db17819884ff48c16
-18a6fc03cf9954436d24005f7d0975d8aa864660aa30d3bb3ca001ace7b6a0b8
-f115b6fe459915616304ec5fbdfccb656da02cae21b5802a9dcf20ae0e06c5cd
-fe92aa4bf2be74a17f7f8f2b338d3a53600248bd394982f97239089f5b7c6c8e
-de8339b8d17adf2ce3cbefccd4e6a6daf5d4881131330c1eb4c0ade5276dd50f
-2b0b4fc97ff5b6c887fe7bf378f58e5dce3d85b98a4a9fa335438158ee3cf58a
-f17b2a4553afa66043e146652c23a69e6f6f747ea368637d4e1003b4251a43ff
-71c4b12f7e2dd6848cb84316b9ccdb4fb282615f89384717a5016a0660adfca4
-7e9545b2182f553d14660f38ea41d327250ee94d9d1a23d0b395303295a6de00
-312ff97e49ccdde1359cf3d098e7ec51df6e7487b4f9b94a69330ec7885a90a7
-b294a8e5ef7e99aaca70ef8531bb8951fa70d28f8e94216ae8c54d03d5fb5766
-b08a89c1786affcc5b771581ba4ca4040bdcb201262985482c346fb3a00b5a38
-332ba95e627431fbcd2811018044d8fd34192c775a0025868c41c34619cdc4c3
-e07c62ff21e9b53ad927b473643185eff0e0af5dbba7a79cf8b2cce506c0f18e
-a3f8e23a4eff5c581bcbc6dddf0442780c00346859988f464557207c2f3d79ae
-830f86148daa52cad0fd0e768fdfddb665f046960da31f389460790c645fc65f
-ae80feb3ac5e96c07267175b41d80b79f8bf05eb5905aa917dd65a95b3b90b62
-5e692400b6bcba9c60df3de780ea6c3d39c3702a4d0fc899e26d5466c3ce7924
-60529634d54e61a992d907923ea6a831f94b1be0a311abc904dab3e0d71e9d9e
-4d87d50e6d99e03b54501fc78c3f57de92f6c336cbdee2f4c03728cdedaae12b
-1e28a0160cc0bbe6b332e5e0442763dda2701556c351c4f81ef3059b06804a1a
-da267bd5e1e0846e23f8472740f0260c9d5c82daacdc931190e7f10011a6f718
-80218742749e3493db5f64b500e53dbb333a87926b413444c0db7b39cfeb12a2
-8d4a45e223e651ea6e6c65f5b1c89d4debbc133c226c27f7d8638a4af9803b72
-e29c308e2c4bffd6285910b9968dd1eaaedaa84f335173fdfb51593384a9d128
-3e2e49c3d722e825f67c77b9bbf2ca5e19e64bd7dc212b7f512ac8835fabe249
-89a19f724e474456b6aaf6b0cfb951d3a522510b5556fe6ac1d993f1ad0ab9ef
-1d29ab40b6bbf4b8c1eb90db2220f3944f6a70f7dab210e0d2bdda392b85522c
-079843ab8d38903c54f2354520cea0a4c1f4d60d2b6d6bf97b9b657982d5d3c8
-4a60ac668bc365240bbe4b5c17ce2c64a1f2afdb01997851f7c405139b3e4c55
-eb2d2a9aee9d4ca05b3d11066167f4bbb75ad5bf8f35813c1692fc2338f70a78
-efd212989488b031ff8239c56ab9c65f96940e45422ec9f721cee7bb73be2a08
-5921862a0a039d658534931865e17607e35372e501562f074a8d7c2366faf616
-0e47317e3667b2abbec7be0a3dc640b0bbc7336db58de5ba26f1f1e910adb1e8
-5172e182308e9fac6a50cbee3e5e22c21026bc31a8ea05577a5aaae1ca049f43
-a9f930ff5994abde44ed4c5cdc4139d1687f30f2b414e106dda8c246a54497c5
-1e9aaaa4d3e2c35a13a3350514544c4096e4ef17510d59eec945a7825f560b98
-c96f5a51e05bcb8878a6187b607f135c69f1dcd1fdf7a88c60da3116c5e46ded
-2238210eee6bf3872c8b95e0e70ba4d7194d4aa51b356e060e2ec150cc9a666f
-4942009188b80f3ed33481d8b754a3e7f69b1913ad6c7a1807bf05c5c7f06f84
-5ea967d0cfdb1ccd8cf14a02183f1e8ee7c20aec2ad2d4882028df0e165fdfa9
-c06159026bcde2f858d7358819795d5460a464cfd3fe23bda12f4096b62d2039
-4be06a2b4b08f94aed653608dd59684cc9d5585a9ed606e2aa9cfa7191badfa1
-fe20e83d01f42f06e8431ed876381326e2a31c230aa834169a18e92a9ef20b98
-0c96bf695b7771aae13d335733c96dd8541b5a6e3c7777093955f598246d135e
-ee64474ada3f017cfed068c9f3115921276f1a95a1a2162f2eefffbcef0c3aa8
-e36f8c45889f3757b51af242c64fbc3d2c04574822487e014daa342ffbb8e1c5
-f0b7c0ad1eaea5bb5dd6b9b36f661e029001b40845d011dce1a9188718384933
-c0d3ec74eb27768cb5dc08f86b7914e2fb3f2b717a1f330c29d91e89888d83d2
-2f1d6d4531109a10f3b869377422cac3d2f89c0390b940321a8d0dc7f343b56f
-a417206882526ea43ffd467c2aa969cd80a09a9eafa0a103c8f8206178749c1f
-549a3393c1deda03623924281f806d8ed881ab7135903e993baad767de650fb5
-17615ef40209ce1ac15201fe094b32dc870208c0dd032ab639d4ce4b8b1e2a76
-ff3eb9f0472ad1bac009e3e9ccad32eeadc5047c8c80aeda16a946b558a4fc83
-6f8b9a897b415920a946bf2c81e2d9421ee21cefcbcc7f9ca6a8242d47d495c2
-158531ce2831f5da195954f10fa375d24d7e4e6a92af21972e02696780333cc1
-ae4b6c6bd8f43fbf196b2f7bf2f2f277e628e959dd51bbfec1d654fe7220f252
-cee9a500071f202a8567b6137551de985d5b0beb267d044c091a2e5066a0039b
-bfb96bb94cbf04dd2fbf7700f42b68c9be0eeac34915c212d5cc6c781c89af77
-9e5acd11d425c13239fa07f0e28f2447d63109d16f909515389fdeb76c930791
-9c4d10959b0b63b39f49af938f109e45e62d2e46abb44a873f291eb4d078dcbd
-c852cbb032ab7533ac8d651cba2f1429532122ff08967da9fbab8eb8e927d718
-136da194ce2a6433d6b92b441a4a9d06577c7c8cb4cd740f5cd83ebe74fde770
-229f7f090351a048893d43330247ac80afc9b28f7729287d54ed1fec1731a198
-a0642b50adcbfc5f9fc5dc00ceac0b4ef68f16cf5c5cdfc5c047ac5cdc26c357
-d8d9a6340846bbb4dc81966b4e54a550ed425b260da1b45a4905e6cd1014f197
-495ccb262aeb75b56377dac775b5ecfdc123eaebb617c48224c1e3276e453867
-65102b0313aa262d358566c9d518ba3c67692881747954e9e87e7900629fb73f
-56537924923a4aec74cffaa5f32b4fb2fc0eb5c599d80991c02f1369721cef28
-dbb86f5c67f9ee5bd42ce86dca1872a382038926277a1b7d690ad7ff52945536
-32db74e9a632a5554221871082e4c33d36f5b0d225f0f75286d8b117e7d2d3b5
-7c334aaefca81df6d585b767004b6bc0fcdfd7296e8225b3af501a5e6ca4b3cc
-3363da4c203513fc473bcf178c48a71e9fb1feb2d86d815d0c684daa1b2cef8b
-7a17ac40531b319250803d658ee867e7beb632307701626d55460946c478ec2d
-55e7f3f71c059816372a7ac7110bb97f6e86a782ea114b0adae033b89455d3e8
-19fe495b155971f926b139f8d003b9fc9c1e612d61508ec2fd4832740b47c14f
-b1f194c3e440e9fa435494135b6af2d9aa706b7516ff853dc3f13c57862d7406
-63efe646cf15a3a54823e9302d870204e8694857f5ab8b8152f6c5332997975d
-2bbc57e321c4f328ba2158850cd40a6227a64195817575c017f5fa090ae0556b
-a7665849a46ff51b36263392d22734551a6c2a4faf5159ab2ad481825fb666d5
-653006265ee72e32c8230e733788428c7a8bbf821a8c8ec41b2b7ab77142b626
-1951cb548c93955bd2b0bbac1b460b1f490a2b6711471bc33e10d412ef004577
-49760ee95cd989440f59f188458fbadc10780dcd6b76633f3f60689ccff06f4a
-ac24d19a052d25bb5247624e1251329b9f6e9200785faf56efc7955ba7dadfc3
-4bccb712a5ec29503cc890f16f14be12c9a98d27c4ad4ae7fe0feb05aba081ba
-004391f5cd198e418654fd240d523ef4df055eec36029723b311bf07c3388116
-bf4da3aa56d5b9e3330aab618736d2a5029387a472b437947e2b9029e05b0218
-912afd8d21d5aaabb3135ab311778262455f2a559e166f48506dab27e0ca87a5
-315d30aff6499bdee67e4137347133a9edbee671d6dfa01ab4959858b2c1fac4
-5aca951a3a87f45fb859d7c7921deaf989a56f12c09a899d5e2c20746d44c380
-a88c5b06697083996c3d7690fe1c268e772a68651fc36936a36ea4ce8dc9057c
-05f0a51898a7bb4b5045e2a58cea600491f21a09161ba7866e8d7f2d59d502b8
-ee2bb74404d02a92962d3c04a05659daba8ed04d8d92f2951863d67ba045f217
-bbb3f09bdcd2676bc970c34337695d053c6bbcbed78315ae82270b4aabf8f3f5
-8826a965b7ee29e3e6c13bb4213b28b0877a91145153f09ef866dfa1831481cd
-87df5322e6464ddf257908a35d2b49a3f41a5767f14f5ca17c0be3ff13a8bedf
-d59283abf933f33d7b0db0bc4d95c903fb422fd3b82c6ae88591d6fb3eddb7ab
-3966850a8bed62c957170fb89607fe22aaefddb22414ff7a55ab50d5f151d86e
-600889da55834432fe74afccc7be5f16a6c63262d5a788b3fdcd7ae98fe4f3e0
-a3ec297ffbb9d0875ffaa52ceb8894ddfa269df08d786a0e29102bf5a8d58d90
-293ea4e6f9d50bf4e7f19c10d805dd5de75770129639be680e06f25be7d07b40
-4001eb64a6b74e701782b42eb03c689d9b9327fd7fcbd0925f95630d3336cb5b
-789388b17aee7e3616e43f935f30608c02acdfba2487664865f998c5fbbe6a2d
-ed471586c5e68d4beeb65597c9ce368b494983548ec6fa4b15c556415bc15b27
-8186864315427c9aef3c102193c013b424e6ed789dbb0d21d75ce2afd3d9d8f6
-52f158edffb99e4e38b6df1ce9421e7eb130dfd305b5f9d88a94fd645a7a5669
-a5a2f447f3f1ed95ba822bbe972e4ab9b75e03094c3f23163385fc551050b982
-9b059a5a530f4ccd5eb0d4ba98f003f95c8f90210012830b76c89792d1898b9a
-76c0308878786c3fd23199701f383b986c8f5cdd99fc86223b3d4cfb39587800
-35d33a7e56428ba3cae9283aab4d5280d952d5d028299d958dac4a23fce6ffb7
-7cca4d88a720d5d47fb2cdcd69a1829235fffc728d6a4b98dd2aae73bc163263
-ec6356d0d9a909a512735263a1ab810296026a7b0141ca44afde4632c5e31f87
-116869aeef9626d5786ed2d25ab3a1cb3adad4beb38bb5e3197f18b678e3f5b3
-8923c5405121f0433167b3f8651877974ccc784d92d9bfdef8205f6cabb2da97
-5e2871b2a0acd7c5d4998f942af4d67d84233aa6ea1d54c8570c3eedb76b0907
-e50d67404fee83fd79623f0599eccfde0fb9c7e8dbd87baecf9cf68aa07992e0
-8ca55e5acb1948f6478102ede178577b1ecf8eb4851742c25a20c39a12774513
-dac23ac5b53be148a4bb4c80d55b273b58a7279220c377b25920c4d89a6544f5
-f73204ab88bf1ed0f9fb756d28696ba1b3ca2ddb292115cefbeb71feb75b1427
-12c238c978bebbb9584c63fc9afde0b2ce3a6ec8e8818b040588187e3f03f1f7
-d01da8632a8b74347ac40b419da45c6cbb9d76c66a97caa79e44dd5803d898f4
-a3f22409aa49c0a837b47004ca324a59ab3ca4d4b8c23f8cbf99fd72ddc1ec46
-205826b8ae3313675fb819e3d62a7a356e68f5b65dca8fc54e98982d9528a279
-7fce2ccf3eed85944bf571173c63b0911f1a34a2badcd67fb385468cc9d243ee
-f66aac6e15ed9add917ec73497ab853675c7721a1a767bc75ddd2a959e95b06c
-81d92ef8773b221334525fa10ce0829551bc0713d1cf062908c439448b56cb3b
-526742103abaa9e254d573728e902bd053a9c3cf044a99e509cb73b8d14a8dba
-05492c2dd922b7f30c120fc1159e6f442cab60ae23895d0318254e5b07381e5b
-1a2eac1bd664a9cb018a0c68b407dd84b17c21457e0c2501662f434ee592c6de
-8bbe5fb8aa2b88f398b2ab790bf10431abe91de30452704ebfb4450b90a99664
-1924960ae32615374b33dfb3669569b69cc60cef0178c38151c17887e3b7708c
-e0a473b3edc9aca81506cc0962786ecfb6333d51cf3c3d01a4f4ea20cfab0b75
-408887aa9cfc740ca661a7edd6af8e0b17ab5713165286d2ce1882ba9302e5e5
-9f02527ded5011eabd72ce5ff1f12350d4e5130a990857e9676ac998dfbc4351
-800e309e314cf6dcf3750f3bb5467fb72de0b3afab584e4915ba93233c5e513f
-d2f63bee7721881aa14a331c979028d7c20889115d626772b465ea0d9fc0c775
-b5edbc3f3e27edd6b46ab8c3a76b0245e14b755a308ef25a8dad6d9cdd64b890
-e169114fb7e06afe3b91ed8071c91235b25d4969ec9f03c1452d22b1ff2137ef
-bd3d7b465154a1966f9b203e94c3f136a92faec041f74af4470cb54208ea6ab6
-c92560f542b85dd9f9b31e8ee2b5ccbe4ce674dd9be8492a161d646b77cbeb49
-aa5244cc402524caabf499c8f2192cc1a9fd5517105999a0338a3648ca03f9b1
-1b486352b68ab7a4816929d4d2706b5561e3e7c91eb5b116fd10f9ec9ea529a2
-e1ed87699193a44c174900fbf685f5cfa2639ded75b2e40fe9b0fced8da05161
-51fc5db43926292602db810b3a412c6f1ead6428aa7f45b4599e611289b31648
-8e9304e1da4d49d67d6217564a1bf74c887a2b595ed2f7a43426e1a7f1851c5e
-97f591fc95625614cd115c03d8a3e2497b99c6b48510cb1e7f556e2d56babb27
-0ce9af4d3c3a37801e1fc28cf9457368737bd90d2bdffc8aa9e03ecc0f8c4eb4
-666936e527dc0efedc81a8acbb0f925de56566dbe14d187a862b43f7c56a438a
-97331856ba272c57653a90a4276186d9f16350ea0f59def08ad5cd2d67316254
-efd0b990048bf4b88af600ec5faf2aa5369ac7c81c6caa59f8dd5c7dd29f0a03
-369037756c72ed98032589a86d9f31267c4932fd5ea2929992035781ef53788e
-f64ba08a3573ce1f4eedf19744737486475480b4afe3cbf2ed608fa651d77047
-e6b016185db1503cdd5f17c8b515f40120f4a676ce153f8bcede25e0e998f7b4
-c9091b98d0364f599a783fb5ee99c24ccddc7bf77eef513b06753e26e2ba763c
-fc67abc3f845719cad166be74e582eb74884345ccf6c265f4ff6623671358624
-5ea33fb16a4a4c4443c3d3c217b167e97c9c0eab334cf6f4f02a61a4d9c6f41b
-5695fbff38e8d4d91733ceee4b1d93b642f974b510b1407d7992f02666d26ec7
-aba5eb40cc4cd100cd964df5dab0a31d07b36fa48efa64cf8c591c04381b3a92
-31c8f11150b820871fa64be805d62634c38a7ddd0855c315e32621fb962f7baa
-44c9f56de9b712119335863b8e08652c9ec3cbf07279950b11b2eaa12ff17909
-40abccfd12674887866c008f06976d3d3aa9bfb4bf064e50bdcf3823b7ce5d6a
-66732655620ea67c93ce77cfe64cd3e121c5ce207b6cb583fb317c1704034dfa
-8d7d5ce9bc776e2e3f7cd965d3e5bcc453842f07fc539dceaddb5d2625078735
-ac550c310d989a98b4eb17ddcbab25e709cfb854880a51109be883d0703b8f33
-c64a47fbcfb7c1a336831f666b18a7ea57ab7b090e54eff27ef90c1795920917
-18ce8255e72339bc4accf7c4a0a832b3ad6d326218954b6ef1eb2b1c6e283fdd
-1a84af455f2b88feb1e445278219265e36560e12262640f0b8c39d5823ec44f8
-f7fb0b0b1396706533621e3d3f1504f526224b9234c3cdcd1623c2025675be08
-89796843913c5bf74ad911974728626e2ea150b990e11027fa99ef57c7599702
-c0c8a8f3bd0a4453abcf0ee43b9d2f8bc691c5bf000c8d39a57e3a6061c7da19
-0332b98c25b3a5eb14181baf64d1ba6e846e962a5a3ea875ede2412419533f00
-0927ae15814e4fe907e6c002aefe845e32ce23a785965f87a4433e3d9cb40146
-fcfcf5dbd1cdf4cc5b00fcdec032af3383ee52d1bb019178b5d64ffc4735f4c6
-2350cea2f0c6c844fa492a097dd45af2692aded617e8a061d2734e40dd12cfac
-51565a595b10c4c6eab692c7d1898bc887f0664ca953a4220d49585b6910d048
-bbdfcf28540d9a418881877dbba6cb7214e3adab8da4c2fbe47e395900428f6d
-4b4b2f318199e3b60476b81d65ba33486d6581a95532ef5a8c4a6182756d1a5f
-19a35a156896d16eb1cbdc3c71c34cbdb15b27fa08744257f7ab4df53312cc59
-5899050b9a1a484c6e7d7d2b8156c1adc9e65fd3a0afffbf77880e596dd4fe88
-70160f117e7f994f1d44d82b290b3412c05094227d953cd8d936253e70bcc45b
-e679f3c37cd829e2210262691d4b4fd2715d235ed932fa7a4f3d6a51cd2c1c2d
-98bfdcab79d94ae5a0c763b5ecf82beaa0346c55591333a2fe74ddde412b5113
-4ecf85c4f33f16870585929ff3a43ca183880c3b342de71d0b50e0caec8ac96f
-84d6c65126ec6e15b475536b0cc310ac9f4b2e878f82c989f85aefb499cf31e7
-617300e920b4fc4c08a75760000fd68dcf357301c58a7d85d259456c19822a33
-33df916e8dab10ed7533e4a5cac1b999c30fa597da3fb3634b8c2d3f911ffa10
-c77152e36ddc54eb66be93aec9d38b41040fbcad8582789037c2752b45b95d89
-748fef565f2a0db42b2a5811388302fd3f66854ee861d3941f833051563adbc2
-ca1447923350863fbcd08df7b2014a1fc656bcc14549abff4345a697e7971457
-2fe7f47f74f6fb110ec6c19a820b9b8b250629ba3e1c5875e05b4f3337fb4964
-a4a4ccb5e2b3022070fbc8d443415baef77dc51cd2fc0e563a60ff115872eda2
-386b73b755eb353d84589804462783d6f2e47c88ac22149f64e5cbf873c41174
-7da691f652905e230e04457643f56a0693083c3ab6cd488d25b2ae3d4d093744
-4e7434e673578a3bf51005f94abbf2e2cec0c49bb157d6230c1166f890e7d888
-af0eefbdeb7a8c8e2c329736fb1abfd1c28a236f48bf45ad3f9800208e2c8941
-d7c2646791a2c6a9f77ff6b14d7a4cb1561ef7d5a1a4cddfa41490ef06be0dfa
-4dddb8323a2ea2db2acf4abf56bf4f0cc6f667d1ffe303fbea1022063007e244
-03bb1e90bb071aad2256fa48458390f293b11cd33588cc1360df26cf9d91d9c1
-f5b300a063059ee65641c58fe08b5ed6fccb1f67e54cfe0076b02ca362a45f97
-245ed407e9f1931206addd15ef3784dad8d867746dbbe36bb2ce156744a87b3b
-a15af3e3cb363c364563a81cdfcde7cf4161ac8896427d02328b951359a912d8
-1875b42c28813384ec0c949a6bc976f6742593e3c9a99448636568639dac3c53
-9a21cdc09cd7bfbc86cb8eda122ab9d6eda9fc0e4eb323431d002c6a8cb29983
-be023d9d52f147d73773c1f1380900e0072662ddde03b7c9d2e4db6368372608
-e0496a71c64ef37b03aaa37b039bb034e6a62ab9847c99bf3f9099a6ac828649
-32a248d723f9382cc93c76dcb0ec3db065bd6ffde538058914c02439a92aec80
-a66aed7b67ba8d5b75eb76e277c198f1f1c2f71565bc0c23d25d6437a7c69017
-c72c73f0fba4bfa80a5a046dfd0ca7a783d708a338ae2eae71790312ecf250ce
-a7fb1b69c6c52f955bf1b7333972d48f6f479e96f8fcbf0ab105b92ea72d0613
-7505068b025f00b576831cd180cdfc27494245d75802ed8220d1dab513e5927b
-083eaaae23ecc085b27d6ef444ec9fd98782e35f45b0347b55499af1e7a55526
-9ecd6b6b0b0aa2b711e5d3032ace6fee06d5542c686215133cb7f158c65184be
-e20041a7d55c838e396b3e50030d4ac5c5831dd6cf3be395aff8d416a1cf29c5
-88149b83c31cb8bc45a3f900ba4daef0564564dc006c44009a8c5967f87ee50e
-3fb7b500da32f03ab2abc380fddde8c875c19701d1b9ed54777f2a33030f1aa8
-def1ca0b3720e9859c189fa70462a3eb074bc25c2b97c2be9813f9dd887cf118
-6126db00de2b454417852b5ae707422cd60b337c63ba1acbdd549c79f0e16fbb
-ac549022ccbb79a62e2fff0bcf1d99a016304e8349fe6c7782f868c7ecc3c27b
-b81fa8c522d9cd26268c3606d529d8cbf039020630e084b6385ffe35d911bf6b
-138a9afa6174affd18a6204e0b67c8ca76c229c30a13ee2de45e35631fc03f4f
-9b1645ada82e4aaa2504df003f8c6f7ea621a0d2bb693feac0e68544e07acd39
-ad72aa50b3b9518e87763a52f92f7d2bfb84ebc5c6c7fd83ebf6ab660b5d39ef
-3b8ad3d47743809397e04c52fb109ff9a99a3dc2f462db485b70068b80546b58
-a77bd668c96f83fecd4947ea612638502aa06285885913c3d0a55ed59fcb5717
-4d6cc24d070d554074890f9a30bc5f749220def451ed203fa509e245d0022dec
-80185e5130ba4c2d55f2ea3b518cb97cbdb99c94b7c71de53416cf63db5662c9
-314bfe5972e405f56d9c64fed47f2403d9a369d9762d045c51a81f49f2dcf7f2
-9b4b2c95386371755169be5ac5c77bcd5781b0024707f89703390a57417224c2
-f3c071030c29c5362d86fe7b0d6fbdd4ae0d5f9d88b0b6b3f3ee624a06d12a3f
-cce2f10522acd3b1627264a10d27bf4e4228daab35976226415e2b5580801957
-580b9b57d264ae556bb8c19aa894a68cc203a4f1c61b8f736c0056a6396816e4
-b325c498cb8ff2163bef8775f0374edee0975c0e12664f28c91122b2ec426e3c
-bc4040b96af0a0e1f1f08181a125ff32f1deb1541e765d3f6c395d4dd72cf70a
-0c8786e78251339ca115ee3f5ad2f2833b3299b88dd51dd6e106312b6d2863a5
-d5be8dcdfd3aa0c23442f5d9f2c52e26b7bcd93f651531083cbdcc8a1983cd9f
-7dc0de8fe4a2e226196bb179f8b06c12041c55b3e8e8919980bc4dc1b7c40ff8
-37370003395291883fe84981a3890f0c7dbe8e528cb2a81ebc8af0faf17a9069
-a7a7c9ed225f696a36115daa94dfd10dd270ae15fe601a9987bab5c9f66b69fe
-893345a4f78534651e6a1c3c3569ddb6f9a055e1bfc7dd93b698d98797ec1328
-a49c6af1fd7955f566b8ec99300711cea2d99dc4bb2c6aaeba79af44bbc2debd
-d43bd144d1d53b6232dec21840790213b586fc630685c69e438ef6d245019c93
-9b506df33da438b20df1aea4a4e5c246a8e6e5d3bd22fcfee85566287ec4f7e8
-8e33762e9475279fba8c2a21b334d6f21f189dacad1f5df0e6de190418609ef5
-9dae7a86830607c5eff55bfa5dee90f611d04f634b19b68f3ad16320ab5df8c4
-ebe6a153b8aa346060bff0f079c765f5b007d5a480acd201cf21205f3999697d
-23868cbea55866d79f3f44bda0140212f0790f51dd9c8d6c1b6eaff7443241d7
-7ae286049962a7a2df2f86d77817eae276876498128bbf9d0bd0d8afd6b7df05
-640a58631d71a56095d048d54e43b95e2f63a09e36286bf5fc9caccc3b353eaf
-3215a65f0bd46782fa6eff4efbb0a35edfdf715e7a0cdfba50c6ecb72808f1cf
-e2fe93a936c821c4fef275c04c4ce10e503216d92f41dde7132b70e78ee27753
-5eb60b276faa9b10b2c485b6522741889e4d80ab8adcd269e598ac4fb359a4a1
-ca313b71d5c448d32f7828b9c0854adb69d25caf61a7fc418e524167ba324abf
-78995886c0a6edfde425d5e2171de85b609152f30305138418f76f9c3d15753b
-0b2716cf8f9c412e553a0b7dd4a3b1aad4c6d5ea4f18f55ea03b91305e2d23b4
-96b5746b9060aec17db39fdef6466e99c99dbaaf458d19a5290969bbd1241fee
-6f8d49448d81521655b7e24f5c4d4f60f8d136d4c62af41ec98611a04a0323fe
-51671e40ce6a0ebc879ca0823b42ef74758648a09bb7b6491ab3c87860dbfa5e
-1c55f515d43d55074764dc43d7fa8c9f
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
diff --git a/lib/fonts/couri.pfa b/lib/fonts/couri.pfa
deleted file mode 100644
index 2822ec2a75..0000000000
--- a/lib/fonts/couri.pfa
+++ /dev/null
@@ -1,1893 +0,0 @@
-%!PS-AdobeFont-1.0: Courier-Italic 001.003
-%%CreationDate: Tue Sep 17 16:31:02 1991
-%%VMusage: 56675 75599
-%% Copyright International Business Machines,Corp. 1991
-%% IBM Courier is a Trademark of the IBM Corporation.
-11 dict begin
-/FontInfo 10 dict dup begin
-/version (001.003) readonly def
-/Notice (Copyright (c) IBM Corporation 1990,1991. IBM Courier is a Trademark of the IBM Corporation.) readonly def
-/Copyright (Copyright (c) IBM Corporation 1990,1991.) readonly def
-/FullName (Courier Italic) readonly def
-/FamilyName (Courier) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle -16 def
-/isFixedPitch true def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /Courier-Italic def
-/Encoding StandardEncoding def
-/PaintType 0 def
-/FontType 1 def
-/FontMatrix [0.001 0 0 0.001 0 0] readonly def
-/UniqueID 263787 def
-/FontBBox{-48 -288 800 841}readonly def
-currentdict end
-currentfile eexec
-9451d7e7a4929782edaf756a2645851dbcddfea354f61d8628b8cff733b549d1
-03a6c4f5bff18e7f42cc7ab902ffc194c26f5e122df5e4153316cf8bdd34f70f
-7f4ac63c058fb15bed425f41d00b0fc3ce2bc7aaf11938e1e62955f527022fa9
-101fa95110e14387d94d5f312dbfea32c17f8467e82d9c3c014699e7ceefd421
-346e8b03a0eeff980f4119e6862a5e4c2acf990756a4c25f41289ed051a09703
-966cddf3bb9f59d54985d5473684443849535c5c052a1a9fd7bd55f5f76f6e3f
-f7eaf762c3144175458d38e0c1cfad096c5f759c52459a0bceee202940109f4b
-7e589678aeaedb32e62789199f908ae2c370138de2b7d42d9fd5f24a1a39526a
-16f99ff43def7d9cc15cab7bd4984a978c5004eec4dec999af4f79cfd01ef149
-746140fcbe1dd3efd7bea7c6ad6b84229d3836f4d7f5714424c21a13a941181d
-cef9ea1d136feb92b96b3e3126d9529878cd620a1fa3e4cde95853533f067ac3
-39f288527ebc6ba9eac0e767731a02705d581144986ea6ac8eb055b550ca00ac
-d031813c1ae301f907efde4be3eecfcb4a5928013475debe556f045ee0df78cb
-cc080be9c5628a6254b28b146328f10163a09a83267de2cad5115f778a369cbc
-84fad9d59d6eee9785bb43e2c96d13476cdcecb6560ebfffa7de0cf4662b3490
-36859bde1974b21efb897c498691cfa294b724a58138e92e4a32b138302362d6
-784aee399bddfe6a40ac7a1e473d9eb34e949ea7fc42e7276591218e4237b50f
-b02bf78be202b0972447920155dbcb8fde70e74df1167fc2ce02a96fac4fba92
-4aecf5f4f94ced70e010eff9147c40fa6ee88c7e5b06e5f761f2c222d414cff8
-12999db0535504f922a533c7538d77239c45f04c9c31a48bded20106cf6d885f
-1f428e2144d399a8e589c3790d572985a9b26876960e31eef7b8ef5430d391da
-9618103b8d95452d9ad4fb2df2fe324500e205f5830649bb6688ce7b599dc96c
-884d0564a73d7a3bb2e2aa12102079ea29ed01340ea9c2e6cbdab1b2ab6301c1
-815b16b46aa4cd714d2454c81a5c65fe62bc038c62f3db91431361a832fa801b
-001999d79ed82fc813e004b875f8f0b69764d55966952482a015cf67587f3624
-f0e94e983980c9ada89df75eea4b6f3c0fec7288b07a51bcaf9b50b7316c4c22
-65da826d30372d94e3e01067b305907a6784fbd29b427dd950a27a4569c9a93e
-b94d553d5698f8f312e015cfbb4e411a521ce2f0216f900eff711d60a21e0487
-1191cd8a870bde5c7d90ef2c52ab892db301513264ae73b2213c6eadb474d7b6
-03e6fba747bd5532515b9385eb4da75f6acdeb8d5225f01745158ee38c574b4b
-842962be90df91632ab92fe2af21f8699e670bb3ace0f4b1e5f252f8a9e836e8
-baffed5e34f70561ffc24a440bb45129d3197476d9446d4d15929d957664c3cf
-a3f238ba39dd636376e86414e7b1efcb42a6079e1570d987916d1c0e3abe739d
-bd70ee831509b8bd6276adadee7fde2a39b015884f5a8dde60fb6422a00dddf2
-84839f70f58cd9674d2a5b3e6608dd892a76425f4a719d999846d53ee1a2ba19
-fd0a7144af29d774ed2d707e6f5c409dd262ef6a1a76ebb0f326165e41578203
-492fd1817cbfe7c20e4e71ad1e708f72aec944f42e097cd71e75e530b853eefe
-3930ee67d4765fa79b2922884a4f54f5ead4f149b3d7397affd32da788d33c0c
-34c7b6b747685680cf8de88352869e58aa05405f2100033aef8e07e465421ce6
-1906499e3a9219bf545a2fc6dab9363c51d28778cedfc72a14124bc174868a5a
-6b077a5bc3fab24ddcdb66ce8f1228f2e8795ca00d158dd85b6ce80bfa2c5b33
-54582dee7138beb45b0b795205263cb3922fdfdff57a077395eff212f13dbea7
-595159bf5fa6ef014b84484bd27d8cc405dca16b6aa3ed6ea9b0b69ff2b160ae
-c0af127322c7f3bed8b8089f9bed60aac6877faf30db93b59e3f99f751c03174
-37135c58c3c43e95681e4254ed00531a086de8fa24f68483db6a97fdfd3dac5a
-6e0296b4f2207e2c301e3e424e49c7c5e98f48bc1a545b3a1b7e4bd5b6829f20
-0e5663995deb31543a56990850f6614abb032a91994f9bf380a8d0a22f6e19d7
-006edb7e5dfcad6e01b9e3d791fc9326862e72aa717fa3b68c537202cd6ae9c5
-d81773186a4c30c5a95d86e6614e30eb630690c78a40eb87c08e6f679ff4f862
-25dce99ad158f978b63c037b51dc5267c11d2d46d5823f429ece0d1b1e5225ab
-092cadb0c5ac32d54404b1dc2b6b340e7b2d0b478ab13a3e53d1f365a50c515e
-8d4bec663f52a818faddde2cb9f05aef238b5cd55a29382faafa3089d6f69379
-ef72942826fc4742e7beb16a452d0319b6b3a3e08bafc4f69bcbe9dbb938e768
-b392c9755bc00415744c0f850c855a1ba009b1e2b3a8c48ae92e4b4d95bdfa30
-aa0b6e310854ce3137885f88f687ba590220d27378d0ea52145b84429071ca41
-fbc3d285a49c55f32cd0d31676e36a2bd406f33a0ad837af2cf35602f9c6921c
-9167ef568466c90308107b918419e3245dbfba44178559abc36fc6c1818aed6d
-91c79d4fda4b4b2a47c068a11bbb899ae064327238fe5b4816dd820fc81a8871
-40025ede257cb64429dd34f9a1632c60eb44f3b24799a8d271b5059b45092b23
-a4ada866e017c76c8f7f701a37169fe6404a9c2f3987f81b9d13fcbadcd2505d
-2793770da0f40850a837fa1ca9b6aff2004b92c5ee6fab82895f7b7b584d704c
-94345ffb2f055d296f79fd2adcb5b1c1604290913b8df0f49df05e637266c882
-c0aab6855aca04b6bcc488a4b4cfdd8314b932f50e5d2c72fe4551390098da93
-060d3b350082b6950e7c9ace10f3063f9c24956cc7312ee1453defd2618392ac
-b8c970cac9a2caa289639c4a3540fde6851e0801f5fe97b278e42280dce79568
-a4d459defe3682ee830c395e0949f8b0e90b43c5c1081b02d28ada072e63a5ed
-6bd693ab68093e99730bad8499a55fb9b50c8a1b7ff3e01735077552b1f14466
-d86462a79e3b965a9183c0539d827686ac0c0c828448bbc999cee7545e6ff564
-24d47780bc2ccb4031214818681f6c1aadf6fc05ef40feccae7a672c83487458
-694df4bb1aca47b5d7922e55fe29c7df4e80d6e4bd4b79402e299e98a89d22e5
-d39073fcd45c50d08224481a9da4ec0648f002e0e9ae733d56823c9504a467c6
-325b8c959e79a08504417dc181116ef4c082394ac90814e97cd63c2b591eb78b
-f78c30368cfd3ade41f83b89dd6ebc2db9bdc9e62c40db51eeeaae3c0e36ea1d
-153f80beba54c411b75852627f45de38e320e3fa7870134e7cd41e355fc90aba
-3adc77b781ef03e67e49a0a94c8fb24f7b01c6eb37fb38cd409d000438b39296
-dbe1edf020ee046411bd70a3100aa113c4be50f47371119570c7b5a74fa60b62
-ae02a8488a26ba8b057ebd29c3dd1d813f29c85049c86d339f32f0ed83b41f7e
-92da22abf963abf1afa56f424c127a23e39a5a2213388827660e1c6a1b016b9f
-834e6eb705a69f7ed8cc981c651014fb12c6de4894bf36a317db98b870d07409
-43144994a4be0cdc78c8b14acb0583b9c6ae0286cfc355c2652e3ce38e4b57d5
-da616ade47fb63fc9ca2d00e118de2f9a43a18d5065c91ee3b57cd05d5ab7dc2
-3cf8c1de80d30a857edf235da528370b006209854fb381fd693bbc060936639f
-3a90ffbfa38d497c5e04bc92ac2282064ded4f8b48a1f0684650e8ec7aa8729e
-cbd4f167f3d6fe90a095ba8f75f03a60cdd5bc4d83afe96faf8e8199c4211e57
-4f7f843cd927b2581aa05b07ebd916989d980e3dabd8140e200de167e0c81f93
-bfa47a97844c1a663bbf1975483989d9357229ab5c774d4222acf58c8da0e891
-a6068bebebc3baf1ccd312a45ac40706486735db1fb8eb68f75de2ba3b640fce
-39934712779c7a27ab2ad4c3467b0d00f48bd23c32b3a2c3fa9b60a26047d7e1
-052d1d8c316caf1be1bac044be3564604892b7d33202142e1ce3d5952fcf0fd2
-faea492b74cdc5112ab8af4dc17997831d98b641d39592a9e84b1d7981c413c7
-63c3ae7b07ee80199900c204b54ce8e28ea28a7efbf7f7a13cb9122ad020115c
-ad375a74983094c289061e23d54b8ca38e8a1567a4a44ba1c1f3489647faff31
-45ba870af754402bc3ef934ecbee92735e8d88f0ed1097247e40257c1fe188b7
-b100222b745d457d8ed2aab04206dd62391fa2dc7b3d728e10405c9b5cd93bc6
-afe10b476451d3edb361a090a6c32b8180bc02494e01ee684313c171b4cd96f6
-4dfa467b45577b795deeccc0701c29fb665e8a20d04683592f7b3ec507cc8d74
-4072115649b573b99cee72393f788ccfc8b6739ccafd4ece7f0fae20ded802cc
-ce4442beaec97cf0b5489707eb9779e9f72b5f55b314e26422a8019c44fed234
-a21f96b1b69f99e0a265c6435bc18edcf6cff798bdb0b9bca878776b925423d6
-0c9941fbfe4e374a51b4f4ab6bdfe767d3aca462d727a364ee60360248c54769
-7b3cdf8913a78f4ee0ac72369545b36a8a74ee785c1013f04ba3a482815af951
-703f3f3359ae963f49d1df66cdc5d47010cd3765e29b73702f9e0b687207b8ea
-28ddb6a47c9aac53b65fb50d86cf716c68572a6e9223ffa141a05856de949f61
-12bfc258cb674114f7a5afed4ac2d75e5ee8e5475ed070342c724be8a8e14474
-b044416541284b470ca3360ad99898dae8194581749b1d7626eb0ced901beb7e
-33b3672d74ca975b910e81f14569c725b9fd9bccea96bc61dfc6c3fb2f490e64
-97c6a20d8ad2e065a697ac178f99b174d65c8d082d9a9fc937bb669c9a93daf7
-c32d165b09e1b9a0824a3072990cf9ad7103ebcc6cb30c552ff984600560d2a6
-ab1270bed37af4b8b7863ed2d10fcf15a88fcac28c61f1e9f97dce05200a9a0f
-291b4d0420a6512e6614c28457bab7007fee6591241943deacbaa5be0edd15f2
-6bdb59adeaccf91b843bad3ad2066865c7736cc8b4eae5a1ebd3009802955717
-0dfe24c72ae5da4261ea8f9070ef1da48ed288e22ddb060220f6822595ff0208
-448c931d2c6ad2e132fefb7528de2b6afd1c6453d798ddafb3eeaf906f972080
-d9dd4539de39dbc3654ace2fbc914ffea6bdb35aedaed3f5e0717c0fbf60f167
-5c9755485c254b6106faa14c995b6043d073a009572dd50f5054879b2c75cf3d
-08048ff3f1957355bafa70ebdb1aed4a7c0ba38648d193b18cb83f90b2610cf2
-df3f4c96a25dc64a341e253cf2d09dbfafd95f562826cea8a85c38d76d0add80
-cabd96927cbee4a1c16d89aadebbff0a7e2632e25e1b5d82132527e4f47106f1
-0416aaf3766916ce6d4ed930fb45cbb2ff6d606323ea3557fc29e0403ae664b4
-434cf42973abbb2db64dabaaecbbebf16547396e751138a24ad9d5c3475304b7
-99e85b57b37ca1060378c8211a99078f8b8e8e43e3d191ef85f4b7a7e7f11898
-b3eeca83053cbb2e5cc421429361867d6631d5eb3c2dfd890f74b504cfdd2042
-6ff193765ccf5ae1c820bdcad46bd1097386d02a59360da1e30b0167e01557fe
-4360050e15ef77f236c833bb7589b6e335d3c7aba5f90baa924d725a7335712b
-4549bbbd20c12398b8c8e8f7abe3104c068ba6db673b81d9532ba41b8be616f0
-3350f14644713b17482bed129bd1c5c2c4c5c3924e90918ce9e7262701e314f3
-cc8956a36219aa6b3c6782b7fe6c91af6b272f9936ba0c819ec1b0fa0a8616d7
-2d4a63f758128e2c348c083050f06a0b6feeb189ef7a000f4ec552377671b0b0
-393c66047a5756d7e9ac38c955d3ce583f94e50b41a0a153961ee049cab60d85
-97cccbe0686d23140adc2fadbecaf085d96d31a8358912989dea8787c292cae1
-7d4df00e359d791cbc932a31626662e0552f79b396a22adaaff556326d508275
-a2bd744f4583dbd8c91c8e89bb70104d88e2faa619020412a91fb03d1b511c78
-ac048f87ae0ce52eee8161a84bd9994d8c4de132a71d06278e80d3fb341ce4b8
-49a4856f5d0bd770baad7bb1338449aba330590a9784447b363872c1a2c7a390
-101e4ac42b1331daacd27aaf670b13b29da7601e05bd49cd62787644ef6f6ce4
-c1e67e3fd2a3923281faff11ad358e756d285642be31a8b36fa372b6b826ab34
-af6a9dcbd37aad998a881b8910552cfd53a03b2ccf128fd5634b30279b854a7e
-c3d87c27da01113b2e134fbf0283f00e6bee34291027ebaaa310a6728b98a2f2
-40fd33a44caf62306a706b5ead4f7e16ade438be5d36359d0aad5da320d98657
-9fe6af830b8bf4bb32ccc46d56f48e769b49cb6ce9606bb0f32309333e87ac82
-91f85441a72bd6f6adc4922908aa822dfc4ec0e95123e35b40f72be615eeef40
-58ac7c03070bf65c5fcbf8b7751a4955985fc42ad26c6b87433bc98f03ce0f8f
-51c1e63c253d32f7383d02c5b8d7c57aaaeea850f13881972fb594fd74b57d63
-de373261225149e899d60daf10c7707a6572e5b61d0cebf985b1fafae29db8d4
-e2e0969bc8351d482d270d93c6741eacc85b53b3fcdf04a931776933e36f8009
-0d15d03f4c51f27e41e1b09a233e78b95d50bb59f80f025e497494a35168628c
-b69da174cd860bf66879831bba9cb20df1fe8a005929b8657ac38e5518b94ca8
-ddfa11cee6f424446593c9ab1061bc6d7d285b4d2ba61dc734f23c68165796eb
-48bb353d874ee8b354ea4ba245f249cededb1a45eff353d3b24e6ae36b4bf29b
-f2f0d4958e8652c90c8607ee99d364525ff45ed28b2cdb035f4a921ff09f7fa5
-a0fe308f9322bee5db6e8fa9c1b928c093c9e3cc21d7f914209ae12fa687fcf9
-b143b60d1b6eddbabe07324398a4dd3b96b38637b979ffdc844712bf1457e73a
-aa66b914a46707ea94d87bdbf964c736a72d1f173b5ca8eeff1aaec036756e86
-2ae63b2a05ce9bfe44dc59c91046127522b37dc99e1a0a40f9189f2041e6d3af
-64adf60b14ccab5b3e0f19075f44f0b24bfe305db1a8cc97fc268136462fe36b
-c18c54f419fab7c9e6cc41ec5fb01970cc761cc5439d32f2d05d7753934bbf7f
-9ae1abc694d25e864601aeea52cf0393a8d99c1e278915970019298f21fb1eeb
-253ad932b9ca86ece282690e7cd815ef823dfe706e31499b3200983d7b2e1e03
-ee85904457f4b67ecfc10b2911be7935059375b5e1f4a59aae648dfdadd37d9f
-92aa32dfd4ad6aa52709ba37237b9ec1c15f089d80306f4a2f86ee4e53d43177
-72139d975aca988ce9fb925d4e8869d9bc3807114c8cff3b89aabaaae6c004f0
-b47d29a951688e253d4b9edeec90537929563e134863a5bc5b14b10c7003b172
-af367f7109a0026ccd1b21b70d768bab9ca649052944b5713df04fa2c491ced6
-42abb041b7dc3afa5fa54a1bd682f2f4fc11028e2742e4620bb7f7d2b6b3cb04
-2cca29b6e140da488a6c015a5405f6a9e87597934bd2eb54ff7cb60b457e3125
-75d1c1fb0e2b263cfc8a36be85418bc089c7ff09808906fcf9b2fa33c37926b4
-2ab5548fa99a68ac72ebed94f9e196ab78661d1603829f1077ed9667f1153b5f
-30527f64b47ead21c8971e649c6f08930b334c052ef16bd8e08ed918b551ff1d
-5b06e6a02c22c325a36a628ffcb7cda2e204a09e6c029dc837a1220e728f3a26
-370f833b16d3a24510de53f83f6295853ecc202053748399b8ababc574b17fe7
-d543ca4269466ac9b2f96a5322b1b2bda825c483f632dca511240c9ed233b5f1
-ecd258867fa35d43126995a505ccd4bee92964493d633dedac48bb516eea368b
-6dd30c92ca794affcf72cf93efe15a5d5bb730dc2ff190b35e7805a6a448d8cb
-91095447ce11dff34debfbd18e88940a93d2b35ff12108b89733a4fef8a8aa09
-4a569660e66793ac5fafc00dd26b07bd1e8a5db3de4599153864cc9c9b5b978c
-939272c070947643f999070239fc0489e4248aa1ace1111fa45a02ace8924393
-d8781113740c2666a2a9338023a4f0c0ffa4c304bd96f04a93edb7b6f04526cd
-6dd6125edfff5a3e252aa049a974e00f62c449c68a6f636fc56abcc3ea957011
-d2ed2932c11f93a299f9c8f76a99c166a8f0b3ab07723601a5360fed33dd9af1
-f9de7d2e5c62cde83a485f7b701a1de173c6480bc2354328736d3012ff4026be
-5f4405e71a1f3c6589bbf93ec9b44e9172c872a23190da0eb8783d864a55b073
-c606eccf6e032aa395a025593c00c1ede21490d590f75e07a0ace72030a03103
-aa6452a75de120ee0e87dbc5100924a354d9bd59b45eae1ac3522f1560db9d4b
-cea57007a8e2efd9eeb415fba88c17b6a262608e03661f78d84d10d2e3ffa3b1
-a6e22f64c77c96606897483c283a61b6eac19867f8ea6d30e7ab1c8426bc521a
-9c6d95285ef146c3f26306048c0faab3ce8903141ac00d34188adbb2943bea3c
-24ada2b77c2fb234ba81b18319141d0f66ed8f030b9488b42a8b77a9ea818568
-33e52373e4af68063a20983f7ef9650b36d756a9914e19459ca5f73de2aaf099
-6b7a4feff0cb044b5efdbe79c0f92be56c034f0837407936c61cbfc5c246aebd
-bbd6d10151ff96e6c9a70c83c252caad6ccb7dce8f8daf0fd9369fb7ca917318
-305553c4065a128d48e72c15e73d342b60fa5cd5cddb4ccd312909f3aa74c6e8
-93e4d03dd5f14ffe7620fa57fcf052edf14b24946c3298ad90495d4ffb1a3efa
-fa2a7fe539da1eb9a1caae17db4d791f82a6f7549f1bc9c8511c67fa7f9a0c4d
-0e1f6b499c20ca4bddb2d01331235306174ddaa89fbba3940fe3f0d90ea99ca1
-7b6068cc3a067fadc54ca07971fc760dff6c379e0da34213efb3e31b8bce103c
-b213d370e9d56a7d45d717ec95c147a5587d8fdc2dc5a473c55682d8e6ddf0ff
-99b84ff7708d0861ba2e173cc1bc5bea35c9167f434af0892b36df9185858494
-9a8c30aa60f56427bc62605639c1fbbbe8b3abe849cf9811dd91e51c7cbaf230
-2de453d71129891f573111286f2e1e3409d655a5aab5b711c827727a1c2b3a12
-3c6e267745c9151e4f68fdc8408cbd61e2415af33491dbcb6213f7f863a885d0
-a0e22a64c414738fdde20b991e8535188c7fdfa2c4c2f7464996d39ee7a6e2a4
-edeb319993ca59cfab71ea429df70d7c13003a14195491f38bfe9ca0e847d5ac
-5b4cead59f46f9a96e9d2da356764c8f9ba7f28ddc44da1e71aa78a1f37f4d65
-67d089bfbfc5905d0d9f8bf91d59fb36368ebe6dc98d2dc30bd4dcfd95f8a7d4
-5e5fcb994cdf902dd0d1e1c6811da7035265c2500fc841b593581a685348cef3
-e7194022c27ce9b6e6b145c00673ec1b5e3b44c591b624be9b98af5a2047f91c
-ecde59fe67573c7ed7059abfaee47366095ec644982546b7ade8fab0405df825
-77a1e716f6c5ac53f6399471af444ab647d20d73b56bd4f691a1af23668676c8
-7fbdd5f36ccd0b511a3ddca6749aade0226839bf535c49aa48c8f77b93a92502
-ba49d66c339eb423849595aab668a0fddf1f05ceab7aeb0b07df1f074f5379a0
-716aef2d1ce011c7f446af69375061b61ee2a5d53070c700cd61d65a19699654
-5749531ead8bab91300d32155699a97ebac94fbb074c047f0891dabbf4efb01d
-183cecd9cd90e4276a8b706f851a9545e24b979db7a160171a647ce1dec9cbe1
-48c67575c9225276534d4954f5bb7980f8ff64d841441c358c2fa6745dd63377
-fba23fddfedd38a275d953dbae7f499e16fd528bd167e35895d92ac4a43f1390
-d18c8df01a18da71936f4f21274a19fc16ac14676e9204874dbd4c5375d1761c
-26a48edba84acea46018cc75c5d394f5a512ee51296607e8dd91cfb635cd52b8
-f789fa9efafb8ae5bb03f7dbd997a9c935a55cefd104f0f9668ea3682beac7ff
-68fbd047a47b2f31e775bb7c014aadf38448734b5077843ca1b0c170f212110e
-0cddfd06af06c11ddd5d77f705354f6bb10c132cc3009c229360799254319322
-09b3f4cd6527dd7843483bb59cfccde571e7f0c3eb1097227206846f4ad2e0ef
-20ccfa79a259dce46351f57e6e593ebad5bab102f379b3d092b4562a3ef7410d
-c31c4e65b0bc5db4a9e62744f222f389b8367ec3b98445d18ded8ff88473ddb0
-bad0e15f159e29f4498a68f566e7f9cb93b8d49f4b896323a364bad3260fd5b2
-18de9ef59b9d86cb2cc3d909ce04da0711a6e609ef5766f00c21c1b0866df62c
-1ab78933e58c6579b1db3f75f59063ac680a2c71eebf9eed664d261926a448f0
-597eb74549a6fdd03986f8c131436cb4d1c0c1c2700a8be389ce3b1599710199
-5f24a9b2a41c0a3d2cd603b0295d93b8353bd96266da252e13917a0559b1b17a
-14f7d6bc5337a70f25f14a530d10a10eb00f9e3cabd9957394fac9e6d7af4f42
-c87de4804b581186ca91a8be760d4b95e605168f28009c8ac52e043cee9076ac
-fe0454370fd4ed08294327d321f6f9269c31702c9e22ad65b7f1d1e5d88ed353
-a5c22be5a8bcc628d35532eb0be85229e66efbe32940d6a0deef0af4a712f9bf
-bc42144f489e4f55d128f3c190c0580cb73e1f8126bd9af51007d29c5ba37bf4
-193e55c40fec90ead412ed8e67ae1706487b8b99a0053287a67f9394924fba0e
-66befd41f5984d869e86ecaa2abe3bdcc88f0a293d4f8d6fededada3c95c63ca
-f315bc533cf7684d70a535397e0a365e51b0ddcdc44695d64fca2f88dc830caa
-520385dd0189477673c12dff1a8a933fcdd35ff44b378054a388659bc7d34b18
-747e91e762106878133ca087ba8745055fa56b7d55be79e87d1b5393a1e354b9
-37ca1ccfed929827205fd7f4c488c9771c4ffebd7ad282e35781db53a4980232
-36afa1c8285393b8babefdb39279cd7e81f552b60789d4b3e75db380e5f5e146
-bf710018254463c6fd3afe5d36e031d8aef7466003a59e02b9a33d47a984e10f
-1467571b66c861dad8df92ca1fa8258b2e050905f754428289f2fa21903569dd
-4f41d32008714e3274eb89df20e990e1f5f8e374d9a02c1d6bc259292c589a84
-b1627573ba844ce758650e4b06609876a3358b42dbab955c6be52033a353992e
-e992e1508ad495437176290ed1cfeafc4f810d1127ca707e632aa22a2adc7ce3
-fd75385bc5b0b0599d9177f2a73228dd510bb6136d02bd456f8a4a7fdd7b61b6
-5beeb68fa6d07ebb2f326a9604a45dd1281f2fda33a2e392f61c0b2d358539db
-8abded8ac63f5bee429ecfbb646482bf5233c568d9808d2d6d1223262d97cb67
-cad55177ffe979dd3d75f23885195d30e1052932f9b0f0b69f56d20a6afa3e7b
-716383a3af055c83d81350c49f3cba01202ae59fc4917435fe2d60141c4c9b4a
-10a737b86504c8218ce86564063ddba7e1f79d348247fc9a0e66ae45977943b4
-33314c4d62945b734ee2cff74e2251e57bafe2d7df36aacc16c4e7e8317a99f0
-cdb643fd9bb8baae7554a3ce36f46203bf90ad04d4308182fbe1443e5d9b06d6
-0f690e546f14a3b59e88c73f8cee9e14e933870e726e57b24ab26a42d208eba7
-6bb854b2616ea206249684c7deca7a2039cd56a8b61516f4b804a8e7cef8f7d4
-64d43dd5addb534af596e512989402c18e23ce24d71084f38ab320c95cb9e812
-d1b1e0a5985229ebee8c939a4e520e7a6a9509328969fcfa8068ff6d7d0b2554
-2a1692872457f852a723db78280fa52f7169b8a781429bb077359249e35a456d
-70e023cdcba49da955831be885c3cf2cc5f70645c66d22ba02896edf191f6b39
-6a475fa8ce12caedb99f36fa1a152bcf0ef1ed857bda26d8fd95a8f47cec70e2
-7bc1c1e6b526ab9f65b0dfef215e559f8e83b2fab3bcd7a84805bf30d6302b12
-3f04d1df11fa76fb79a173c3698b9c77a7696c96965cc63647dd5517ebc07c65
-2bd13ef9ab6b4c85f1138add1aca375e3d59bf5f706951a378801bc3aca40f34
-b3803a4ff311d461c636c05572e86af42078ba9e791887eba8e2a5794a39e119
-1eabbc368e55362f6d07a4785469815210cb386fe46f837187c2934158c4ab17
-977a1a7c901ae294523c2876955387f47a44eb4eb669e05fd34a07eea12fd6c1
-18e86e83837a76ff03f38f3ac579489f2ff340b0c3ec3bb0f2e57c226dcac005
-fefc63ec5047983995465ff27efc036e879267677a8ec92b6ab89c5cf347d25e
-68ae8eea58c00884e4061b05b22e8cf4eaa7754046cde1ff34ba093712179848
-04b598e20ece471f32f99b8dd2cded970c6aaf98250cd2a93ef2b539fa7ab354
-27c69e31bfcd9e7a5003735d4a477051fc41261e2fd14cacaaed091a2928cd90
-3808bf6f43f1c9c68bd3722eae14fb308786562abef6bb2cdf044cd8b0b26518
-45a0292d3f11cd9deea8197b2d5a33cc78d2c9e14a3289c98eefa1b1ea91eb94
-fe8b9e0c132a0a3cbdb70c9ded02a644b31cd766bcdb7508ea1f1ffb8a9f9a04
-f72a3dceb6b16673d20a6b7acd566a955247ba287cc74e6007362553bdb98102
-bd5a1a1f8df9e1c1adb8f290f659357b592e8a325ad1f9cf74136b576ff926f1
-f37c044961104de93de26a01a2d98b8aead9e113c47e9179e7ec06aa5148d1bd
-d00f415d4aa5a94293f8b0266587f463ef0db2d7f10749d072faa586b674abb6
-56849caefe4f8d74710aa97549103a526b89bc9d286f0f0b400cddf827afc178
-3ce120cbd1e6bd83bdaae22dbfe752158801c42460b64518f8c7a374cb23617a
-3ec662a90c324985c4693b6e80b88aa2e96f7d35323c0999f56f1f8db37f9448
-d6214fd1099b4a73065987a236a4353cb11051c1ef75950c2c03647abaa98615
-55907189bf0147ff0c5a2e1db0627cb316fd2e6dea8f8c9b34fd5a58ee6a4aa1
-7191e2b5a08818b72919af8173fce5863cbeed9b500c924a55e58252e710c648
-d41fe4c020c0fd607b08a4969f3fc7bfeda3e20897669f2ef32511e08e9207b7
-305e9723c52a16224e8d0f1bb7cf6f7b687aa5bfa61582d1d07e980f91fae736
-8b5ccd687da89c884c5d199518d0fc9b0e424e740aa04cdb52510b668c09a3b7
-ea5a527074cace5b2c4aee3c846c383a1c9acdec4a0bcba9e0b3d05aa81b573b
-14794a9961ba4d80b4f308cc38f89005120bc284c67e670e35238a3a72498be5
-b84a88daef4ab123258918a4bd292bcfca94049ed9b7310834a0c6d1d1b4258f
-e410beac79f5d5e2bcbec6206421358fd7ee8d5090539dd3565ac9cafc9c2768
-9d84a692b06601008390986d834cc44e0bac0c773b099501c02800247a1c81cb
-85f8502e773fb41256c84725fefc59c6f39b3696ab0bf812c3ad445193b9dd02
-1efc04c8a1e13b0c6161134fd0679c029780537d6e9dfc33f8b30b2549e8ee6d
-360d5bfcfcfad3083805e8ee6a54c4802c8e6629feb6a291ec26c9c393fa6049
-aedc546db31ab6377913737976822d44ed7d41325146f691604bffe6da0ca977
-821d9f2dc65e7099ad3a07b3cb2943b9d8e5380d8287a787de997ce19d37ca09
-2594b973b56e58b0d14977b4180f9753c6ba97e5de6f268bd0d9c6a81009d3c8
-1a0bcfb206e17104f491ab5a736429afa5954c1a65bb7df664b7922c4bd041aa
-4a2a0bedb4fecc36c0589e22d20f961c43e19aaa3f372bf4536644c19e0b4922
-baf7b50b04b6f7e0a6702cb7972b82fdc443ffbd22144dd9a5747801c587ca08
-815578b8cb6580c773d297f4fd1c087564a90bdefa63ed2eea4d44a728c84d89
-102537f5fac46638aecdc4e07ee9bfe2981f5add3d96f49976bad8fedec4bd19
-b352cc3f804a5109f058aaf9bd6fe1808166155c89c73cda60287c9f00e234db
-b787860ba0e02ed0ef5cd7eacbffcae54064cbf5f0ac568800689bf02341cfbe
-aa1902087ced298dd82db84866ed704b83fdb7e28b43154084ccb8beb437703d
-b3a3215417039df5532da395a2d5ba64f2c19354b5541390d58c9ad230675e8f
-0ae43962fc1a40aee6906e05a517c949eb03ac9763a33c232b3fc0b728111698
-685cbc993a0868b467bf7df14645d70739bad8dd0e3b10317ea9df08ca9208d9
-b7491ab3732fc730bbb33f062662db76df5622999109e566e7470d2d3cfeaac3
-f7de6b3d715ee3055126843b4a3d0d2f7f4e671da66a2bf4eba18fb4ce3abd5f
-2fec20771e3647980766da5a9e5618a36e0c1c1b37f0e2732c7e0db107cdd357
-005a12ee4449f8b57573ff8b1dca68ee16875845ac77e89b8d3ff57d046acc8d
-6e8930a8484ad26389fb6dbf0df6ae8b1ed9e689b6dbf205e3cb24f89f54f6c1
-240c693a1289a36bd5d286aeb94452c7d1238db5e904470bcf411db0db9b1a9e
-97684013ad8e8377147869490ff59cd008c5a5104d08ba192f96cf9752e3754f
-3e7850bcea027eea59aef4b18023f4b364423087b56b4c22e3942d6aa6a16300
-08703e93bf8a55509284cd1776b0c8c40777096ce1dc9aa6b5fa28e8a0030d39
-a9b64b72bee43f829b544172668b358b3cf3432f6d838ceb488f144e4b500ff1
-45a0edae69c61b7e457809392cde962540f36077803aec3e5e637b9ec513b623
-830204a7f532d6ea27ee2c4a2969eddc749c0dfb0d8e059a9e18347e094076a1
-15bc162c4979ad89aaf5ef22a715eeef6aa356e39f53e122259f21ddfd91fac3
-b8b6df3c3e91644b30102a9e656e6542926c13cc8401418f1c6b84953e527c3f
-dbe3e76e2edf034b63f68c1905409b5f03a2d5b1bdeb97dcb8987c06f877603d
-0c8bc8621836c082310de2fac8584fe5e453c3cdd1963093585942eedbb099c1
-1b659943eeec493efcfc13a1628b63e101a0a40ffac0dc492f03062dc18c3665
-d0b7b37cb756fe6102bd8590705b9de712f169514b8b6aa528e42e36012e0e57
-1de7c4cbd8a2097f0b3e4d6b240983657044e7184144db4d790d552e9d7198fe
-b3131ab841d51d2bae989ccd6525c6f8f52f536e9a8388a760402af7572a42b4
-f49f652dad74c2e3296aaf7b6005b5e3a8d95507c145744f071c6f9e71c43cb5
-7760b0413ef195db30aa604b362de810c56d438311cbd193e540c68dd86b296d
-2b75aa450134ce06d0084c2b52e7afe6e061935084759ed8b7bca87e58985741
-53255144a2c75fe57209787204a562a2d5a8ab5e14816075be42e56a062a695d
-13553f37570985410f780f849926da1470240ee9246d36cdc06082425e381abf
-7707eca0ea73e1ebb268494b190b020cbfc46d54e14bd0ef6595d49ad50fb1c4
-13b1bdc640a3a249102f3057855bbef5f17f1ecee2323fcfc5f85ef23a75e114
-8ff0538bf1cee2bdd9535aba93abd484d837a88c36f6270241205a1e1b0f50f9
-acf34b5175d5c41d93d406a606ba5a9fa4ad177d73b2d8e830fec7280100b0ee
-65329c638ca69430f227ffdab6d8535ea52cfc4b31d6edd1c888049499cafa73
-51d205e533ee0a11e531aa5b7cc7daef28341e15b6c868535afa65529ec1fb00
-ba680a5f9aa6f90db191db3c0a19bf54291beda8f02f73e692075e1fbd287bb7
-1ee34421d52715b3a1bef464d0af2d367dd6be9ea9dbd2926688c09ca1a0e1b4
-3261a0008201f1663d471a3d758b28f1c5a8be1e904502e34eda86d92b8d420c
-09febfe3f294e01915a8feb99feceec3c3a910c53b475eb5330b2541b41c701a
-d17c810a269767abd65426b3e95b33ef098ca20606c000a8e906332e25e6471e
-0e7d662bdadadd4ec64b301b415b8b7adbed32fef6b484809c8e8bbb98d058d1
-e68fae1442178c9a357ef1239b8ee076c7a04381f92aad974589dc543a4513b1
-ff178b50671ba14780cd777efd5bf09ccd81c2ed6e3bc723596ecba121403fa7
-e832bc13e5a549c311001a113e6c35786a65e654f83527e319233ed4130d20d8
-c2bfd29ee477e639eb1493d09078266056bfe3cbdf1e3181c607ddc24140ccee
-fa9c2774246f2c93e7e18822f967b2d67035476dff57f0d9fabad245c3f7e287
-351affa20a22dcac4e8709ecca97ce660172a5a896ec58bea7f2d45ced2b4885
-d27b124367b65de5397e773c2829755972821c8fc029d91ed777532a6404266d
-c3e40c32358049c6fbcb6b6e0827514d8064d0787bc4e232465908ed25db2cae
-e66d3160836f0ce4a9fe4c06895772f31fb6a0a7db32f965845a6b12d3c018b7
-321e63aed1d54fc0429ad1a022c44f7ba340a3d584cd587cddcff7fb299513b9
-3d4dce430e28af6a12515359866ccd441c912c8f4f1bccbc00a651688a909516
-567a8b6264da305812330d6a3482b2869d3e108ce3d7884d5a53d20a84f08fcc
-359dbf9869295eb94e154dd58c6097a8feca591e0039cdee5415c768facc86ff
-1784aa20e914f1bdb3938a137d09359d65d5351d5aa30c46d57444254fa97fc5
-2aaa91b4c5a350b5546a1c645d28d60c9e2e1c172810c3f522a6a982c442d262
-0215def70617b5facd0ff4813365e817c207163d58af491169d5170871c4e353
-2cf911c2393cd627c73d591b500206f420e7ed5128539ff74faa798ae990df72
-d72b7c724070b67e0c032b086b11760f7abc6ca32788fc0f382282fbbb30c453
-9a8f3c793cab5762afc63b996421411e25bcb2466f1a2eb451f20d49e204a006
-51bb615f14c511c57108d08139afe3b1caf4d5e26af909ccef2c4da1df7cbac6
-445c366d5ae5c8c3085411ab5c27a9a105501581c57a26270f809b6d6396bf89
-025115d2e8731d378815abbbb637d13ddb8e871374a58fef87c6586a47dd99b5
-bd8c4749ba5f1f340a8d3d4f237c9c5a57dde560443e1ac655667ad624fc9462
-c18a75317bd8b0e953dfa96871d6a00004fe1823264e04966227cd079564bc50
-13ba790cb1856b33e3b857a5e9fabf0dea0cfb18fe337d6a0566a72484631396
-e5b5ad7cbc0dea22cd13a8a4f077ba1872b602160a9adcaa68aafc759a78363d
-35aac022ef55bf2c760fff76c16678bb74f3a9206a85a4adbf6b0e3bb4d3e4ee
-b3558f6bee823a48f62071eda0c220023cdb400a28251a2677daf9ab2831bccb
-32143cb4cb8ec6a7c437cace06240b09f6a8fdc7786f02af0ad7c27747495c09
-45d09871028c14ad33d661bfd0ef987570b10838af72315ab79c7e4186ceab72
-322b65635b9c2e839a610505a43b82f6e84a43b2b501e5f9727baaac91224f2b
-b268351a72fd17d87e951d1014ca44199f828df4efb0beda1906f858374239ae
-1f8b1f957b8ae1244119f72f035bb6d65385ca0ba155bfa9c97d176aa1f66b3a
-ff9190159758d211c45ed2f1d6aa919409e7c89ab1eb46285fa3f062b4069319
-515e88cb84306a498a4f7251619a7b8c6a8ef6430a65da49563d82e908785b70
-bdc12a18d08f7edfe7dd8dfda3c2a13596e15af4570bcec1eeb14d29d5ff662a
-2958be2cd3333c3aea2f91b20972246d9a61a7732b238ff9e233cf311c49bea9
-a83d354966d8e964b0518f0f5f16cc003b589a9da8627101e51cd2ff759157a4
-8a9d9de94c6d47f1579d021482b8eff62393b1285ea5e521ba09751b9b722d77
-1690529076e745164716242b6dd41ef4fc5e95f15924b43f75a8c689f143ae87
-f5e7887a9873697a8c4131352911a8e50004468c72482b7a38149e7abf8534b7
-2388ed5b8cf474b3a3b78ac89e840697205b569eba2e85e2f6416d41149aae6a
-9434f7e8e95e2eda2c8eb78925345e59728da3310e9d5da06b3b88569cb7677f
-f348e8ed02296d1c2d4523a0843936592058e916dfc0524a8f240dc760867dc3
-0eb44ceda8f3d98733378ad7b24795574cba77f641a4498102296c985f9e8098
-719c0992a5b77292db052593bd5b8020c8fe583a46e804c00c715f1004e627e8
-bc976f9208c6b3c19cecf6158f27a80cae345ee464b2eb14ef033be31ca9b0b1
-a1dd40d025d2fc0ec2e40900a596bfd205803b1f4341933e0a998100e343fa04
-9de20c2534a06deb43f8f3d0a2a65dc9dcfcdc052282ae177f478048b0c1916e
-e599a29d36fa69075254e29ca1d158d8c7dcd2f7aa643a3a391380dbb5258d6e
-75ac53529abbc2bd29c803285d2a6be5089fb84704291d4a6219c040efb8f439
-07261d057541ccecc7846a3b8710c47f35a490a5078a6b4271e429e77782f315
-90dec87f91023bb8c9d9626b8dec28f4f15a88ad2378abb01c8ed262075f6f96
-6684c0b0c987daf6f52751c00c45c390e3929e7364b1959d5860f693b2e2385d
-5dbaf080163e6922b88824f632ca07585d8607d9e5af14980558e6fde1008972
-fb77980aea10e2fd441a0186461a802572a6fc72e64925d7acf6f60f3e5b2a93
-fa3c76bf1963936286f496bedc875a1c6b51b4edaef334193de9f0a4cb00e0aa
-19de0a3ee0b1658deb23de3912ce82982f7666df1167794e707a5dce52c620a0
-7a8d93ec150f53f2ec22528ea4514f5e8b47159cb7eaeaf5ba779fa274e34245
-1f0969e3315af81bd0fe268ceccd1f20d7ea709a3af61ec7726863ff1e5c2b44
-5d6c1da0ae53a2e62dee5f7f1a518eaddd3a9905f4cdbb74f62a16ad2e9a3ca2
-16a2eeb7da59521b43d9b358fe7fe5b252850a292a0112d22be0377b6be31696
-e342592437c19cf0e5fbce729c395fe046bf9412a3fb11e6182f53ad1124e129
-244b19c5dde1adba250bf9a82daea88ca70fef20f81bcc21bb7547c65c89ccc4
-8a62a161a541a984e6284cbf2e1158f053561ba3c6da02cf176afb494d1e020c
-dee46d50a8dc700e6b71742dd929207846dd02ad2e5eb5d0db70d6267305fe4f
-d99c1f9f8c260cc8e521d2ab0aaf5baee24e2b7a168aeb971aaaf2bf207593bd
-466fa0a2dc24f2951557d02af2de5a05ab226b2fdf7d95259814db46e9e3f069
-12ae5b7b5c93a3b024922803ef16112acb0a383af5142ac274010d4ffa4ee7a4
-b5460fc628b6e8ed5f449a4e879c8af7550e7ece8c63fc00b1f31a7905251a6d
-477e0b9dd1b42eba39041a54db3ec7349280eb9471f09b507e2c878a5e9aa8d1
-3f6a0d3e127ada508e3685a272ca56afba11347addf873b229fac5b047e2c950
-258f7d280a9cb608639702ae9e78ab11dec0bd348a7b9b43a53e30afe18ba463
-36cd658c82171f41750ea125f7bdcde7837c36b8309f8c7ef757a08dd3eeaf4b
-4c28d8308556afaadcfca572e9cba9ea6bf5ac682eb798bcd62f5e4d97a8c6b8
-71d0de906248b1b103f461aae6eb1ee2ee0283cbcbd662c94468128d61eef30e
-838075f383b3b4606c160bb9e702c2839224342685ba8673d284f80858530460
-5b82b2d44ac5ab01b426bf49a38647870889fd8c62fc5c34d3565aa0ce8d74ef
-1fb14c1cd8d6f4f1306166698b0fc3c0446cfa14c6bb2d9f6ed7d7361f8fd573
-d4e032772529fe2248699a10b305132e0b0e03f8c709ae75034468f3252be6de
-c005ddd79a854116edcfd4e17a04e5f737df69e0a6347930dd7dd8cf460563b0
-e85af9fff730731f3778faf6a95d696075fa932491fee95b206b652de5e35a82
-0217f13e9b0cd0f7156859f1484f3ccefbfeefa8ac8f006299f7ee663a1da3a5
-142999b6b0520696a17faf2eb7134e8e2b37664686a6bedf2cdc70fc66f7e970
-a0476a91340719ac17958179770cc2c0e38a6eb46922af669a531aa0e927fcec
-309a7b121fcfa2cef327c4e71ce6a7fdaa611a0db34ddf0ab5250b8dc6770384
-c49ae556dc1a613e98f20a3792699275ed4d187c87d412a15908b6832d95ab4c
-865b2af89c0e471c46fbc6d0686b36af4b12c3684a7f45d7c2d9d9817361df14
-7c5e95c3a813daa7048c0028afd43bdafcba03c5c74309501d0494ec31671d29
-b30cb884d9748f0e2b7a8d4e3ec11bccf9a491905628d2c4b6b40f8bb5d0b9c0
-b0acddfc846d84487e9c2e7f0d82b991ab2ff2140770f2492e3908b6df2d86eb
-b23af04389a27cb3ad0dce5528059a519a6092a18f3a2b035cefd46d885d4654
-24029359070136db35c346acb8b288d36dc85aa13231fce659d4391a8f5935cc
-c8e47200f97c15b8ebb5b8abc023d027bb5e8211d0595548e0c95ea47bebf498
-76ef585ad3b76331c75fc41bdd44d82671ac32fd665bfdecffd4b8fc61255e34
-58476113b59bec5aa15b03d623912276f1ac560c0cf18bd9043aca2c28e805d9
-d03de88dbcf10aa9d7d0b1cedeb5270871f632f7b703fc8eb5020e76a638bc75
-40cadbab7cfedceda58d0254ee7e8e48920b21a7cd38cc350cc6b67bacf468a8
-a246fabc596a2675c1fdba8cce35c28655d0e82755fda8a8b5bbbdee98c30d91
-c81f08cd0f809e1d55a046158365e04f224656a6c46a43a3f79fa2d55cc6e420
-fba22da808c4afbb03f6f7b0d33be67f9883b30a1c1fff85f78badad279de4c9
-77f1d9f16a5b9b7dc8abfc85488f117a5cb317fd5c84fc1e59ccf695892e6ef9
-26dd71c9a6c342a877406f0258adf45810746c1454627eee0b7ccf94ceba76c6
-7f1ce137f97ee6025a23ad42a4cfc2ded9bfe7e206f31a63e65bbc3e304ba088
-4f0e0738675e2a4535283045a69ff637ad95c9e0b86d834726e2ad29ab3a03fe
-71ec91f8c8564ccd0069b552ea28867440145f767db71486d2e38e5a0a3c6099
-b6d3b57ab4513a0c25897b46410c783297a9b280f138bf91bb17f4f5d5bad5e3
-f858fa265cb1c1b0d0d9b84426f0ee6e4f5ff5deb2e50ba82d3405de51fd265d
-3fa7396ab39ddeebf8bd2b61af0090e349863e88c9a5a280c4693b6e80b88aa2
-e9609721b4747b18008df3517ed1331f1dbfa46b00155288b7783862ea9e6498
-52ca1ddcab6c190aec0e25927e8526cdf32030cca61f071325cda7e0dafacf8b
-c3cadc3ddee55640a7c627beb2ac0cb38e3bfa38f9c3a49cd7a400be740d5f67
-e59582031ac46c467fb35622ccc7b627718f858abe34a43e5734a74681ef229f
-757dcbdb302475577d18d5cea044dcf3a8026ffdbde20a2585fc84bf53d6504b
-ad3dd458ea271e5bfb498f9289849349a0c8935843db2382069eef873895c978
-341bf3c1c9535d13ae4ef05f135588edd96bec9066045199a8e76582dd9c957c
-2fdd24cb36b53692448ee0db7b1689118fa13ad5f73107bf0a59fdb32a958438
-6d9ee99dbe469d3831f43773dacf2a228276d076b9144d6b70b315658dde76d5
-8b949e998c0f4e0c2f5e2e888bd316001cf0c981e9c89f69ab39c6892f658eaf
-5c754c0fcaea82eeb8a443cce68fe5cbc857d99df78215f00b222f799130b7e1
-8d985455482cdbf5b9f8eb096fb0966aecb5bd5394f4224d85fecf80632fd858
-ea3aa8bcb7834df7746ac013d8b980eedc405df342604a8f87d92ae38e5f758d
-4ace6d05c933347a85e08e6b796e6bb59ed8c7fb72d1ac04dbf57acab8875e08
-a5c4d4092166ea473dfa9c3da7e61c53b2249515365cc89ff4e5b6f4ab5d2514
-9b2f24ede7e8adceafbd8ef9d01a89500bc0ed3ba5d691dcd4719f70527ccf01
-ad15912e288dc397de28a0ca73837d54ab4f67e36dfcde2d75bba41fb152b312
-0eadd98894d332b20ad05436a75d0874a18fecaff6077db4ced96a6e91c2e4f4
-65cdc8e73b23299317a7ff4b4304c34ba43afd9768200e141a7309eb837223cb
-be451fc43db69dd2cd3b1cb6b5e879ddeb6990f19027ca2d15a90d11d999e519
-d7ae9f87b009ffd95c5d3b5f8d0ac22629797ce6374451ce62d659ed1da0a826
-26ad8021bfb2db4f00f81b8e524b217e3347c2f93d9140e817c7b49ee457b9f8
-1f5b49c665ab2468ae83b087f3b6454913f8498db5d8f2ce02af56f307042c8a
-290bdbf72c24ad3678e0c527129817dfa5240c03ed78153e0cfe712f301372c8
-bf4b82df2ceaddf1b819b828af9bd9e595009c1d96700a14a2ba9117a04dd425
-bfa4672d7f1d70df323fe6efbccd582ab3154358212cb5e4d1938b097185f53b
-8da80ba35ef2bc26b88b8b0df9eecbfaeb6fe80893eb48da291b5b6674c009d4
-b9a473c4e191b673d693f865946ea5c448109eed42b054cbb3a8b9bfc1b30b3b
-d021e90f56634c81ebfdfe6d00c97824729979b3e58481a0f6186093e4c74807
-04ad223b1a696fb51777c5695bc106ce57811c8ee455006f60bab6b6c43f1fc8
-c524674a638ed65aa0597ac1ed7052ab3f3caac9e62d806ea31ebdb359b005f6
-75c57cc36147841fcfac56baac914cd697fa2052eab5bf27d035f65cd0fea717
-ab06306d5901ee083f929cf13afb5a54d000f61524707cdc090cba1c46868502
-9b2469b0a29ce0178d61b66ce2f6b56d8a3d725687ee03611ea42f31f29c281e
-8c4dc1a783171441278cbe383473f7f6eb4ded8513c5e14edb793bf0c98fdaf1
-1e939330122543d2725d3e700e0dd8205e8c1d16bea0314f5a1e993e0bd1892d
-cd04efc67b855d03208086dee33d0297a853a1b913e71c7dc495984f7da86818
-7db70ab6e86c974a4983ae863927b0456534abdcf265133c00c42115455dc665
-6c1c683a43b373a1602efa87f4b3a1be04da20f7f51dbad3af313a5658093b25
-5156bf9693ab3ba5ab071cc5415e1eaa29160f8090968fd9dc458cc8830b500d
-14682c560683dd5c3e2745bd9935886053181ab7d323e4b993587605ada1d9f0
-42473496e8e09f9af27f287c29fd4607a7e246fa3e77666ef78c0a0ce9c3c10c
-5e75ef7385aa2078d8c98453449869d40d39a720e345779b5e20a3565eb47f78
-48bca3ca0e04daecc57db1a18ca96ec60b6ef42deea17246509dd81542f667fc
-6d3b808075d84cbd3ae5821ea71310369f5b31c13eb0d122400dcc9cc52ba85d
-6a7d2290af5e21268eb0e837e4830bdfe930ea91d4dff36ea26b2c4547437336
-4f5d8fbbb4ced10bfb1f3afa9e804c31c08057140e178d37408ee6f10b1f2054
-07839a09bee7931628b0720cc62160b3f541b2658cef64da994bf8adddd663e9
-668bf56e93e92edac17b9468bb02b1d90bc4dca43a508cb33e6d1f0ba5ef0f3e
-cf43109894b73cfa7484484cf3f18451db8c0993b339362183d42edbe0c1bc76
-9adaa253eaecb81286a4c9ee0a89ebf9b85c5ea0198dffa514a192fb872d15cc
-f70f773dc58a8f1f05d710f1de541327eb795bd5b3e5bd01dbdebbb33696242a
-dc92a04dca1323151227dba59dfb17835f5da70889940e3fb886ee4453bddc3f
-f02944799dfeba4b46272ae29aa6748e5408b90935a481be47303e5227f2e230
-5082fbff2bf084a05546d32b918ff8ef71ec86132f28a52777189ba8d05b1d00
-b08f9a78e37bea0b42ea7f48f53be4d72cef03c72ec948a4c23b16e7d3b54ca2
-6cc77493f5f2a767c0f348a0c85c85c544b0c24709e52272ec14fe72c719ea24
-61a1a842c599d4e6b8f175eea17429415bbc70b71433047e73c2ba5c4998cfff
-30172a45e39f7fe86ad780ec28b9cabf4429b55ae8aeb38d6027922e985e725e
-0a4aee85139bc1d3532e00b80b389e9d4c8197d0083323a495aa6ff75b613bea
-94ba02977f79fa5752418ba6b1f4def3e66440985c525a581e6b75bf81997f9e
-7d49bb437b500aaefc8423c1ea3aab735f87f7a17958a20e2de998148f6d777c
-54ab5a128ea1c37e65d14f360c671745a2911313d174f12214818ca417e38670
-699371a1f7ddfc5c1634bfd34ba99cfcdb86daeb368e5c46d79b974b609448d0
-90b832c1f958142754571fc98c9cd0270fabfb5e8466ccd7f34e56c52d086161
-d6def2b38cb28a5126a8c0f233cbb7e5b4bff2e0eb4c8474d7e0515b14fb7702
-5fb5c21ccf4827952e2e20757ca37afcba30f4dc2b7e9a66aa9ff34a1ba94156
-da92b255835e8c8dcf8c054393537ed4b9fe616b1fcac41724a19abb7a1541b5
-d3e5208363e42adbacffd409b8ed46e410bfbde876c1b77fdff235bcfdcff0df
-65998b975a24e2614a2a8ba89c2ab9f41469b409ec9e0a5c4234de73c630f870
-36060c9f9f3111586739972b638da804ea935ef2e74adcce254c9efe1bc00667
-9ac610b00a9c00a1e3ff36f5e982504f2fadd1d6c3d458819bb0359daf480777
-4d7e2cbe16f16afa47155c1cde36125d5e89432a508832c13fb8c7fd5ebc6440
-49814c8fa01838117f6d298baed8cc1158ff99d0a3a6c8e5231fb6aa4db98baa
-216a556c04bf0e6f39c8c30f39ad1ec64f4a0db2827652e8d354a821cffd4dca
-d23876224ed57795ea129d045e387a45bb88372e47757a16115b9ac149ccbe30
-982ad2a9207b175d2fbb72752e8d3dafbf4ba5c02c2dd6a15fc0490dd0f6324a
-ecc2523ed53e2d5fde36b3acdb5609d70809347bea983fc6db80888420d82722
-7d1d237567be0c9c24a585c52fe3cbec727823fe2ec67152944ee35a65e7a005
-37e096939e42099a3cf73e4633cdc85aa3b4a2511e27223e0053fdb65eb85df3
-54009e474bda07b6a07da75957e621bcbe7a1e9d1caef92565c5a6c73664abf5
-fde175a64314f6b166351af7acb166b6a0bf596288a5ab613b80db91ff50f7ca
-17e99d41d493031d1a5b5038303f091153cd08300ac6c3cc15860e33fbb3394d
-e4b383b97b77d8ff0c2707fca55a838e0a2b5089fff480af5a50e6f07b29945f
-789aa9333211be2ea8e425e00255f5a3725cfece8d262202a73db785b39e3188
-55abbba63de9c53c24bf11125f6f0d3b412f777795ab86c0cf9d9d43a2076fe8
-828085480e7adbc77fb137f8bd8cc8d26ee6435e7e3b2511e7a7d7a19d330d17
-e7d797061428bab2e7c290fedd6c0de9bdc2c5b6b2496b8356593c570bf8eca9
-c5aabe89434de698fa17ff0c08ec3cc13b60b4c3d3712df8ee02ab92a71cadac
-3f4cc5e69aaad92774edfafd88d95ff90c9781d9f771c143b9918f554e3b3497
-4f822ccc3e473d345c7c598271e59456d2b1f75560fa36b02d75d040c23fc511
-506955ca16901774f7b4b9d2ff9f4e0afd79fd66175c0dc634e932566d067fda
-e40a710edc1c893e919da8baeedb4ae0f4ecf0ede9f08e43dbeac3e62c97fceb
-c434c60ba5c80d15f79823e25563e2d746baa0ef31ff6826c120ccd9c2323844
-9a48a624790b757f9f8c03e1c447c16de51104688d79c87461f610af5daed900
-748acd52bb3eb9d975d128adbbe794421c434cf21d0b07c33427b81a6d8a4c97
-49e24142d669e8eecef30f35a96390b81ecaedf8bf65edaf9fa12adbb895d631
-986008fc95aeb2df5dd57a4e09582d9ebe82c685c856769186f36433400f1be0
-1daf022f7c217099e520d05ade233feaaac372f2e7f2067119925b801698ca24
-12976934dcd628be992734365ac6b522b098c7f3d788eb86f045c6c9fa7ee89d
-2d84a923ec1a6de6dda87bd949867b2a6d6f910ec58519088ed577531c624d32
-bc7c62116630a4ed7af8927fb6c4f4e65f000c69910841fb600e1de1c6a23f5a
-a2a5d199d79005294c66dc160c38a880a11ec92942c01ff8ad5e5693f132b238
-12c90045fa8d0b60c6b868f0c7d2a27815e196438c884d2d82222125d2219356
-555f8a67d48a13b3662e988d03a2dd3b648162884b715c89d7021be05917ea43
-d1be90113ed3b3af434ceec723ac4cd314527f560bcd83e7cb3a764fdd8f09dc
-f1f1f45fa4a47afa6401420b1a2a6cc0f28cdeaa0c83c6cb35fec7ff2e432270
-78d283f79547d6689b5450d02fd13ba6096e37b08ca096d942cb94ed324cb63a
-55c9f171cc29eda44d10545dfd8bcdc4afcb26191f92d0c61fea1b106769e9d5
-234112650aa8346eff624a259f3f6833997038e24fe4b74c459b14841e2189e6
-2842ea4cd2693bd162a9e90ad5ad3ff82bc6ed2e7978093b9bf4caa1012e6843
-5c34f01c470eb39483e22a1e67faf26fa74ab7434a682072ade050e72cc73123
-1505db7a7b2512ee6f8cedbe6caa06b939a440c9e5f0d5497611c291fadb0948
-1b19186861938233bc62228b15171612f026b677601715bb4c5b1f2ba72db37f
-d15c629cab69bcd96ad1a6ed6533b09cd3f6049e6d214caee58d4ed72e9f502f
-9a9f5682398dfaaae732b6306076deb3921685b419f41593a46e3cf4f7de9352
-950d1f0a6843175138e8589d22efa6c4996098ec3946aa1fcb1245625d7c4e1e
-d18abc806cd490f103da453ccbd52db6c97ebc5df69a3f94229994bbcab8805c
-975b57fcb6ab0221a1c1c553cb64ab882cd3ece7da6b13b0505950c5d58ace09
-fa7a0e4ad20be0733d9d540918922c588bec42902f9f8278dc0d6729a31c01fe
-7f90292b8c5c006035ff40f28498f88ce4d9981abb7c9c80b915f8c12062fc89
-2d49b55e06e3d1220d1d29c7844e96c259bd806ba601a6e6a1d9f34f15f8e10e
-945679f99ba204fd1b7cf84adacd615e858dff1365aa779b241c58ca6d07ded8
-81dc8c5cefc435b9ebd7139879674385c860251ad25d08745165e0aac6b46c61
-49fc0da7baac61ba658ee976689ae42c13d2b36f2fd0b526585b6098a6df1f11
-a3943366fab8eb81c4fc2f1e510b4452d23c41e47849b1f15f992e9428e8926b
-8a28f15206802507f5dce36de4cf257e56dfb6edea19c9078658c32212005db8
-5eb640885757fa5fa468f7267fd0d89dc2814828c5b1113b7b276093854b5fc6
-88a01863a861c535e227e98949aa3db4062f52a88a0dc7ec40d7c8a92e972982
-a0f7f6b0eff29154b5d0297ed270948f05fdefdae6126ee87a8baa0469512ab9
-c2ea9ac48d5a01d9160a3e38eaef6550cb05dfeaa33ade4de76f4ca4649c69df
-2ea79a0f787768b7300bae785977076d4777bd0c76e7bc23f90fceb533dba7d0
-b9ce8ee3de306315527bc84ae9a14dbae631881f485b88412a5d56f4e69438af
-33ef583f8e6516b1bb7414318cf785444cfe87ccf1a31af08f89c574b8394a0c
-7d260ef39f50feb4df3121ccae4ee370cb6a769b40292d559de8cf00700cde64
-439eb7ab50b0547252b14ea1c88fe9c6f3b5ef5ecf8ccc010d488fc3c91c5159
-e0baa7afdf4af77778331e7ece03d8aeb6de3bcb9ef6370b9fb01855bc68ac19
-476a442d3c5aa77f9280e04ef51960b53492665b3a6d0e5d95bf545ba3b1d2f0
-b80cea9b814ca19fa6399e2e93280ca1f93a9ff39cf7ac04badc4adbe383fc59
-e81c19fa691c829cc5fc63fc56341b724209becea74960adac6e033e07838b65
-20ef9a40db38442544133888acefa9a6fe282e745af83c5e9d9acbfd2c73df57
-7245f691e3012c8ab3d9aae16adf1791f2de33765d2697a3c9cc01955d138831
-87b46d44db880c7bbfb5f9839b4800c592ba0e96484350221080f457c2ff80c5
-4794387ebd07cdbe2dbb0099c078d7ce26c89cf4d47f52b5796a6a861c2c3bbb
-c28fc7321993e18295721898a059af827be695a1466572488fff3b00aeb24306
-743bef6b9616e0e69c6c123a86049d2038c9d58b13d43da51f4a31b2ebd6f84c
-c72ff201ddba0047d6bba501edc889ba84bdbe82845df10f6af17e8d32cf3c39
-a8e9cdb6fee684b9053ac5bf867867745c661b4244a6e9d416b96c9e7acf7c7e
-bf3e65a396917f5f3362091e221f30194efe419b15b01c2c172dda86af46b1b2
-fc5632820d48e1292694a3869d0550c7256eea172fd2c2c51b52b6a9204bb040
-6aff5c3ade4d44e7ea6b259aee7a2a196f96d8df445f6ba0439787a2f9d56dd0
-b7e1a48bb48c564f83397e299bb6e4de0a3ba3ae171095e1f29b30dadf456031
-237754be8fc42ecd1a5c2c47ba0a4dd454f9ad43b772a43f10b93b9f21456aa1
-0a6fdcb3dd43c9e9fe0029a3d78ebd534f1f1373caae0e69cb63551c80bcecd6
-ddd726fe1b8a10d46e0daf9b028f13cf4f2e248915eacdeebd403397077143d7
-982fa3be9b3690f299de482d9d9d30d1a3c73fc0f77a5642ea70a5a738c4a203
-a0ee361178d65dd9697f0ebbe7c03945e9797c2b4fde79d251088b54dc011dac
-2461d15a29f76fdc80e3ed21625a1ce5ee5848b32fae9fe6db0ae668d5fab8d4
-65dcfd42cfbebfaf42b5a2a604c429c29031dc86fd90161e9d25f7426e485171
-d6db1381147bf66d92fa199377109b05723c5b2dabd5dbc157b89b7965b07dfc
-bc1271ce306d95d2c75988978114e451e07dc5ea5a0a7ee2c4b5b560d8e63661
-52b8175c258dbfcbe57fc8f1369238118ec7c1ea2c8183a6bddae0def782d71a
-9f0e4cffdea4ad89fbbb351c139133936b7d8331f17a14faea91b0fdc69f7b28
-c63c13383f1bd915c08a74801a12342b690288c0be035bd5001de092b0b0e04b
-60d56735d50b99f9810588aa4231fc6c7ceeeeda1f5e420c6e8d01a0db4b1b09
-51057283a92739d75e494c69ee7fdcea905eba07480addd991fd2b7f066f84a7
-bd6c7a24a3f7632c0fa1965b0491dfc426e9efa2dd53c6cfe9c00bc1ade9b3f1
-54943704d3ef3d40cd97ff5c28cc2ac0709d9e765a06ebc729f16b442bb7eaf9
-6b8382db843cb5ac8c3e404b765ec45dd2b4ed24ba321d019592a37b2ac208cd
-450dc7107b57a74e9b7381dab65d48548c665f7c9aad56dbf5d8bc64074b186f
-abfd2d574801fa6ead0e1d00908456f361f17ba2c74c99ef7e26b7e8032b65f8
-ef19777bb992383f1f10d363fe7bb8ab7ce8dc304aacd1b6ef1b6b65d2d41d83
-0910a514c3059bef3f677b92fd2601917842f9836eadf6cd62a1100855bab14d
-225c974eb123849a23514d1f50c622b258e59cc367d6cfcaddf27630eaabffdb
-5394b86e724d634868ccc7e7991bb2997631f8fb35ef850076128d65ead586a9
-95cbeacb7e6de8edc0b369742cefcaa38775275a17a6c83d0a81e323fdb8bed7
-05f6261f7976f6f505f6c97c12f80eec0cd381a048ee9c7a8a05595af297dde8
-79803975697c31da784c5ca16c668d3b7503b3aae5494a4d631929870f9e603a
-38e311ec4480e366c79d4d03c533277c4aa585f99a32475fc691c2241b00ccbb
-c55c1e9b14851f815b162cd057f1bf85984a3393aee38c0b9ed3e9722495bfb0
-b13eac7d28d2aadaee2b280e48e5179743528efd7042ab6b7ed6dc2f4efbbce6
-ad43c35a3a0372814b1d64a342ca614d5e601827c1c18f8a347de9573b1f55f2
-2a3a3d709e17f7727477a45a4fce29efae3e16b80b6df52a4abb265577fc4178
-0ea7a98238174222eec322104e04dac53af8867b5bc0334b02f634602191d4b4
-960b4f482c46862a86e02f4c0b496d1a8108cac762022ce6644b4e6092353146
-c9c42942a74869c9351b3101bf15421a95a7ca34158a56e7de3a7d45d4fd2bdd
-f1f5b4e5b3bc9f7320eac4f94655e8a42c7799314376d6fbfa29fa8f836a83c4
-c1fc3dec65d28c408d8f4460b12d6c63a323c0533110c6b6809d1867110f166a
-3b41da821e59fb8c8b75068dcc4c8f8db77fef2e5d5cc965cf091b9f47369fa6
-1c1f5f5d501b11ccb9f43c3235f94cd287b944ff7203034f0985bb163054afec
-484e0e6046aeeb50ee74ac84186027cac9891b1871980bb94de61a47c7379204
-cd8662b17cf066567c9bba779f76edeb13d2ee996655def66a0cf0cc59659cfa
-e416a40ce4b7ef774185e79c76545ece7c498db03fa717a591f9aab08c167ec5
-f2b4d9bc25478aa6697d0edde31041f185c965b263acfb2399c5695e42901822
-543f8830ea58e49ec7189ea0b6bdbce349ec55346fc238a7a6c4cd6652c6c30a
-b5c8bcfd382e6a1fcb1344323db38fb9829e4ef506b21fa5b6d58a92657c05b2
-09adc73d93897867cd867c915cb7ccac7f1170f9a6c555ccd4a097574501b6b2
-565a57e5c1df5adf39c5740ae63016da9a566d7a830ca624b5b4c75685c95000
-5de2d662500107686eb62b3a8f7f9f72bd6071c85518741da3b455249d84152d
-a165aca84daebf9395d469146bd4e35452d00f742905c9a47ae2040e136e8e62
-38dd0e9c0901ba3a9c3216226c44b1f80e41c212daaadbdddadeae082b016305
-54798bd555a251d380ef952d085457041fc51dffb6eacd582ce2e7cd1df623cf
-9237da7c39b2167c7463bb427a7199588a6cab503aed16238c68c250ad9f1293
-b4904d843ee27e2c1010ec9f4d1190a11d986e8ab56ebc5615134d52764a3ebc
-a9aaa1b7d5bdd1ca23bcd8fef9048c4ec2fc1b60853930fe82c133bdf9021102
-15ec5dca1d137a14e519bbc2e35f93508753fbead6543c66d40b28d828be75cf
-2f2d3e116b42ea71772e07fe42f298945232934fb85f9b046e8fc56d843f0d5b
-ce1594c5bccf37117111cb497c1532afb3ab347e3f555ba63bd47525407004bd
-8ac2f37f632f253ed4bed95afebe62f2316c225f32f1ed41fba0f84d49cb80b3
-cb5503ff106053ea70540e3732b4474e5b6e1d53aba1b8ba36b1116d2516d883
-aa55e8401226b175450b8b4f1ef18d55e377f7b40f305a6df691d316a0ef17f3
-8cb4506398258e75cf230bb26523d391fbdfc331a74c64fd06b14441fe966641
-4469ab2f3ee113716cdf0415fa646bee2afe4dd3449dd1a38f4135ee5c4c83a2
-4faf571b0385d2a2a0b61fe9bd5a047999028fef216f2ba0dbd678572790f66c
-c575cc82c4825aff3b542499519f82f4d1833c2899b5a46e7a64793c291c7238
-da8d2c0c7ec69978d3848957062ca371c8808f6d3244844d54a49ae57e92adcc
-a97bc421d8cf01e3e2fef019fc2d9c3ff6edffa264e55a24fd1b7c32f4a86285
-3f9353aaa19e6918a3fe84c798e019eda844a5168397bc875368dfaf42514a20
-f8123edc760c20356bf81d8230ceb04730d5d7ab947ed143b6c3c772350eafdd
-9636db454174c0de1a047f0e30370cdd4cab9a1f9d8d7f99abd8494ee82836cf
-c73cf595a2a72807f133a8704172c069cc63cd317dc20d28e45d6690c25949d6
-6bd3293aa87b0a93d5675c42636a8837b71fae1945023db866ea01a774b5c2f4
-6ec4b86a3055327f28b179a6a93087b15e7c6169b7053d76026207c41dabd8fb
-bb17dd3d49e63686638b4611b43896d1c7697e352c976c26fc58b4e1e08df30f
-bd25f93e05f58892bc7f07c4f739d16de447d8eb84537e847926e39461dc385e
-f79c2ba9327ca12e7033e6df84d8f044b57881e71f32d52afb2b0e61975e730d
-a21fc31cce5aad86c09c82b7d0b4557fb79feb7e1ce6d98d26a49e8160159023
-4c5da702c3feef7041b5dc43ecbc8b2d66b7c33e5008a4d171ef828bd96da0e7
-4d8389f04fb4eeaf1f38865a912142c0eb9934dda5c4576fe18251eafd7608d3
-f35319aa2335e2df4a0aba8a246aa93324dfc19ea353fe27c47628f377259a19
-f9f89c599d11fc306e7181d35792401f9304662f56a2f3e44a1281ba24f4efdb
-35876d8bc31f5e19dbc58ee35b98282167d21a1069dc64ae87240384309c42ed
-ef9dbbd68dbfffd34c57a001aea0c91c36c2c8f422cb09f9456379f450edb717
-e7ab9b36b451c27f5bf10f018e25c57b1cdf4d2124f284b3f0c396ab3c806506
-ac6cab227e74d19a593671ade70455869614b5296d8768eb4d390a2e644b4ee0
-46a8d64d40633575087b3bafeea233f8e7f22ce22d2c190a0c4301647ce67668
-dbaab051719d516cd4e6e7f8c2b9557e8167c78ca6ca1cec05b79ab1ef61975d
-c2511aaaf3f20e393099ccd20ab4b022d2b206d9cbae6dbdaf96296df88f0092
-aa318348201f37a5738f17b440b35e47d17f0acb0d0d255d2871dd5dc43081dd
-4b0f9390af189582d2d9b39fba9644537ec6e1725de83991f190b5fdfef310b5
-e8483a7a91720758e329efc146c95771b2439bf2607a3f10ee247fcb1b7d5578
-a05775df4bc4ce1b59084f5e625e26e11243185d730fb8931455c3342fdaa91f
-7093b21bb911fdb04469469404dd387ab3a61fa4a1347be3c5d69324ff67c6c4
-b6de7d8ad88b287265a9609a6266b0d9146c3a3dbb0a3c9dcdc0d6f04d48a247
-df9ea9ac5daebacb06628fd7c9feaca1d71c058fec7eea5ba7b14bba8c5ceafa
-3b81037a197dd21919d6028849539f2be815d65057d23018049f2201c33608f0
-54f358433c3df8bd7c72f81d775f2a86ed7edb494db813e6dbaf76e405f64a4f
-cb3240348612e2940b7531ef8a93a5978faf36e37cbc1a02f2b5e3337fa2fa22
-91a9d6e9f9969604869b954ced43fb53ea1badcd0435817d1fda2e66552dfcff
-8acb5b5a5c819906a8fb02cc97f613f8400a9ab950e12d71f076807caaff259a
-e63f0de2c096a63eb4451e64a4f904162252f398496c8670b92923b8f7bc4f40
-a53e324f50a66920b4f9f9239dc0a3da083791fb4e524d2c599229aefd8f64d8
-34ed26ac3f7af54ffee427e4d9ec3f8d7d91d4978d974be305028d3a32954d4d
-79f64fd4b9bb74596c6f6d17043e104c664f42c70a3f526069cc369abb2608ae
-ec16a11b0a8ca8095e30cccd7df1c4543f9e53c3ef8ee191b3213c4e641e0772
-d85601019f3c9b6f94692e729b87c5de209a92dfd47a478e7580399d635ac5ed
-0bab11cd5b969e9af5bf1fa7d0865a518f177c77a8631784028fec51ee1ac336
-fd2d1d9c8c2fb4341187042ef872aa168b87054fd265885f2bc0a1332b3e406f
-259103dcb242f40a07a5de136a06b03d3ee31d6a5f385ff1dcf76d1a996cdeff
-76ad2f1dabe5e2d2ceb334ed78a9aae6c6ee8f17483a8e7c61f7ca4ba03794b7
-3582a8334cd5545eee22aea82e0b31b0981161abf1611c2e350f4dfbb77807f3
-3d3536c51f2a2b83e3a0f9b7ed72de16fc6503e9d8967d83a557d662062036a2
-7778fe6c9f521b3163a2692d16c4eff90d5fc06c69e98a4d2466a77d28c80c96
-5287008eb275a93713a78e8d542d4917abea24d60a0c90d1921a5880aa521fdd
-65a16bae6b72b82f2b2eb2e46ead1ba9b9710b4847a0ed217bf98dafd5759478
-cd3e8ad681703c00eb13feb3e5ff2761455a70e0bd9181ea6ee4850b281aba92
-0d8192418492352b2c7ca6a168915de1951f774de37d63ebb033d774606c5d4d
-b6bc72a68859237c5aa77421305ac6fcfb6e555ed3f52c41fa177ba49aa31bfa
-fbd4cb3f5df1d87df5f7dd810d8bb6ece0a8db60385f6aad7d9248ae8eb799c0
-9e4bd4d2e06ae9adcbe4f5d4b5c8232aee85ce60357a75886f3ed6f6e0082879
-c36c45d57707f76f8bcd1f472271a56095d05f4ced5ddb6a72bf6b410c7cf0e5
-c6cd21d8deca9f8ab7dc08efc69e5ed7925a0e531eff73aa537704db9779e83e
-097b9974b9d697521ea6b0f3a76820494608dd21ddf0aa164bd9830db40efc9e
-2c07c02b4c7236688d8fc135757aafa153e75b8bc3636485112b5bb57f01648e
-1e69d5e9e6ae84c2a58cce8011e71a7ccea36b8efac02f75cd506b402365b467
-ec1f9e60eb81169f8d7b676ed8fc4d5704b8d06eab192939cb570e0e0c2bebde
-3671b64dbfbcc5376e1464964d6e05eee27abdd36e52824d80c74cd20795f3e3
-647f70416d394c89bdb150ba20bec76b2be5f157d1a9dafed474c521a214769b
-4dcba56bac771999b3d3e172be1133d91755234a8d277b1d63942f0cc3933acd
-641e40287e5340f8efaf9d06715eb2abfa57a7ec2791b3fe2bfbd3f939cfff50
-ee4062c9fccef2f3296143190ab4f34cbf11ab5fff417a6ccf01f7a1d7b47b8a
-4ba4dd923b0621b26944b513e530352c92e0f783be39286ab144ee76c1e57088
-fe62f9c417eae4770fb7e27959fb74e3b6b3efcc36f96a5342d6ee780db6397b
-cb0478b4f1f8245bd8465850e3a83816697eb16163b7d78d9e0eafb40372b999
-e173293dfa6efc2516703d13836e11f407113c49676b16f43b4165731a4c0f21
-01aa6f3a89d7f5fb743c1ceb44f97857555774a63b59f96bcf03c87b5057032e
-4c8d1d6b768b7b0db5e444116be731e287ac0a13bb25e8143f15c493c417f20e
-be5217df4041413f59e33f6dc1737f9006bc221c6458b1a5c6d42da46e84e3fe
-4db8b35dfcf7c0933d4c1c977c5edc7d89185fde71534e2addbf635b819bd48a
-595b29cdf59e590f2eec097e3241d78fb27edb9f2274fcaa3246d0ca18e4cd05
-81e45dbd0783362463adb5177ed036e6f17f1edfabeceaa16d20a176968039cc
-89fd7902947fd931a080e2105f50ae2c865c1fb3629f22fdfc4f5c0f21dbf758
-56cb817833d0f510da858fd4bb64e91b30705114a2add3f3e8541a89825c9d3a
-0bada8a21626aa329875c9f90dc92e4af23a7d83ddcf140888e3098196ddfe30
-8014fed9451558c2f74b1f13aae39a1a0a50db19609b237bc96fe275806f2e13
-6c8049f38fef87d5d0dbcd10f232476ca4153bf2bb3cede4102dc388cb05caef
-723b21b6f6f2d6731f4c72cfed94f77bd76efdd37bca46c9f7dae18c05617a3c
-1941d5bf77a25169e19f0fb50c5335539680ddd39e018600021856ab815e8bc9
-cbe764e4e06c8f7b20f4f84d404423e6ab37271d564c8f3eb1b1ebec03de7c3e
-3a68be5edf58414076716cc454bb971c4d7e09af1c897ab8a5091024ababcfb2
-43b89e13ba6d3af800736f9ab077641c8be2849125ff20f3d760cd52d5bb6518
-afa9eb41b98094cc129c790094c6ac076e758ed6d1dae764ae66a7fba70d2671
-92afd13be3200f95432af7618203c6a28df7453198b8e426b82514648f8fd0e8
-79424287eafa66e276341064bc42dd35f670a2dd82d2c41021531532e4333463
-c95b0aad5247ad3b6f1582f2016e94bf1f9dfdee6a28d74e05dfaa5f41d1bac2
-fe4f355ad90c24361ca11c24d9a92203be1fced536bb855777a0065964cfc86c
-d3a27f3ad545fff70ce4921e4479b61281f728d334093f90ff6f33b0135d91bc
-684be649b6db580b1d34f38a491ffed9285ae4ab412b2e1623c8b6679422cdb1
-2263bba72cf82416e151f47fe4bde170ccbb8523459d36ef415903fbf38c4834
-86ec72ba6c9a02b4827433d39c27d3c7741d8a9dffed007cac8157d6e3145788
-45b0a5dc6a5c627d2a1e24b351d93e2dde958d206e434379cc20e4f7eab470d4
-e1159aa0e714d3d4191cd08dd45457319e2c41198923c8cc360532ae4f640b60
-7244c08e546c85f9d077e2a249ff2ea24a989abb69e861f8e71bf788fb81946e
-bef9d0b05804417e75589e89d2b8186dfcc79b2511c810a4581334d6d215effd
-0e8ebe5425d92eb19022582ad7dac770c36c3d6f86cc2ee279cf432196ea8eac
-d3514db0d7f6c59e1a68401358a2d5aa8b80259afd002e6975d86a1b8b2bafc4
-5cc0983e4deda769c0fce889e049c00673ec87ae17f1930af5a5e2423709c2da
-49f44db4dfec3e00507d4779d904384b801a43a15770a40f10752d29e14c253c
-f4e2a01f25b70386667e7e5b2877425502df89a4c25b9412b8a1abc432256a98
-1e50c2e2c7527b6219d0413dd104b80e9d045a4f6e8507f0bfb37339f864988c
-b1f62e3f68697b2cfbcf63178ef0d7cd564577d7a4d0517eaf8baeb8b81b5c42
-8273229f9013e77df1bedc6f04f380e3e90f5edd9c81c416fc78a02edac32ccf
-a01c5d8b6664fa08dca3d10b9fcc59fcdba45cd41c44a2e0f606dc1c7f2e618f
-ee8f9bcb4685f26fa93d73be1d97bb431fe198b04884eb2d75f604f7326e3064
-aabfc389b7230d325f32beebb2d0c339ca51feef98de442792c0b5b7bb4d9234
-b7f82ccd14bdd609816215a9921d67c4b891aebdade0677297e2b9fee67c60c1
-6bca445b3fa9924c81f46a0c88b0bf880477bba09b471da11dcb8e7c42714011
-70c4216ab739cc7e998aa1e54240f9913e0162333a49306ad5973c8f650200d0
-2123a5726c9e939db85cb8978184338adc1eaee4c892eec474731e567ed56618
-32bc375af73840f81530d8a2679d25b532495263eeec8a438b7a9569b01309c7
-e263f451e593689f209806808edef5a896c1632dfd9a823c9ec5d266702db77f
-b145dbf4d34a371344437074c6d9954253da577be60e4c2f3e303e382890e688
-112c07d9e4b2b6e5e710e51e1de8399eb0e01c618cbf2d0c02a71f3986575ce3
-f2afda7f40e9da546ffd5f61fa12ba786a27498ba5a60e568e09a7c0f0b1341c
-7bbc5552d10a3c23de3a76ede29825d50ae9c509bda892e6b3bbebff58dec41c
-c126f433c9f7a8f417585e026468565f5b2f823388e8d5a36807cd6b53294c6c
-bebce4329ae476c02d3e3e64dbc40b05c9d1eacc9321179491a4c760c0c14ea2
-a0b6fe66832957f908eaa6f18310690938a38a606f73132b44fab38884d169f9
-5826312ab82666de60297f057e98e26f0914a32f7b4ccd1c9640294909b17e5c
-1b6d206c57221a5a17e9eddc8e51cc9ba343eed45493fdb9aa37e477da35a4fc
-fbefb497d3eb070784ef08239303afc0f15b4a9d6d1e7ffe49783c3c4bdbb5f4
-7012884e1cef1996d2de2362492d8065009c863d0bcf4867463fd5befe4af3a3
-9730e869b632375b1696dd1b2479d21d98554ac1853fca848241b911b96988df
-db0713c481cff11118f5f0e99479a79b5e59eb0031f083721a37de51758fda74
-5332f9ab1215884c1476aee17267c91d5b354314804d1f56678a168ec756b61c
-d57d4a4476b7f3d280557586b0c0f88be44350338c1b43eae03d0f8f21232123
-6732997b3dc602628f23619a081af22185e1f0671d807f682885d9d7832ac477
-667dd8d99cdb3683cbb4758ec38c2982d4710ee31ef2b9427b9f0278b5a36b12
-8c1511fcfd79cd8bdd95f845e164202caa314bfe1dbfede5ef71016e61d47c89
-b880f63dc0a79122118304ccec4e3f5a7e9dd6a8d988664fe2165910a65b14b8
-27e34155b2857ed8af38eb81670657cef86b8151b5068ea992902fb55bd4468e
-617216c9e4f11a193c5e8d5444700caceb3bb49365e2dc4771a58cedda7d6640
-fa370a4aa115a45d78e61e1bef9b1f47eba3ad1d690aeb1cc1fbd14c003ddf04
-fa374f156be114144cd4a124063aea75f383bc81759535bac7accdf27adf05ed
-bc184fd63f064e97dc2b650f04ea22fba2c9765c9a90f00cd987a0bd5bf12f70
-54a870dd7e615b3ab5dc0f16879c7020ec4a60b7eb94dd23bae021d06454f6d3
-985e49bec7c5e01c8be251b4368d1f77b28f8c8aecf5a41b959bf43bab9f0ee3
-5a057d2671d5a408f48ec62be987e8df582f40931d1f3ffae7e9515df5452f73
-0aad038f607c30140ef336261a310fea7e13c18d44de07968367188b77930bbe
-d3be4cb2bf84392256b8a180397af2ff0ad22c0107c333b0c690ec01aedb574c
-9ecb935dab18a853b5de2fd79d63eb688bbfb55f8982a9f6d19cabc1d2f27999
-8185e5ff169c01ee9d41723c8762087b4e7fb05b7544972350438825df0343d8
-29005417158a5cb24e6df53d767c0d82f3d72c53bc5cc7de22d0c346efc28af8
-ceb4ee03194d7b9ccb465c0e6f9d015e1e2daea4a43d9b04d7473e1aad92e478
-d8f083b1b4cfae16b3aee3cddff25d6bac9e05289952044599c25143b6d58059
-9ffb92a171b10fac1c3f22cd64b9601894165b76f9da6021c90e1713ec69ec06
-5b3d3048ef04fc0f4da8fad276fef2a36f79488a5a00e61b3ccfe7b237dbaac0
-5e0a90e10eacbaf9bc7f47fcd09befc4e6f502bfcbf988327ff5ff8e4b85cd63
-f6f253e601c5b267488aaa1a0bc8b590e647455ebfced9a84e4126b0c67c5974
-8d85e0ad234d93ad38bf9d320b7349d5fd1b9ecddc1cec055903c9aa96584a4d
-03330eb0e95fe7ae0ab895828a9512989cdedfd1e66403bf4122e293582baa57
-60b961afcfd1e529240b44f5943fe38629fecee1446d6a20863b603634dc0605
-3985d82a111445f7006ff79a4bde99b758c18d3cef4c6c281269ddc43f6b3758
-0c58462b47b12d4f79f1c8745d9a197851e00329bcffaa2e312f45b9a909a7e3
-353fc343413647fdaddde0836faea6a7a0740623bf43fcc3beed6a99b9803a06
-a02ce672574d41898e330f18f3fdb0c3493e377dfb002728be112e6625023724
-a89da99cd67caf7c1f3b395677169559b06d748a331e2818f27f50efcf76d881
-c09c7c237e3c00304b0d6f59dd7a12caff0b1af769255bedb43de8d4a0fe7803
-62d04729ecde386d5e85e3476dafafbd4f41f24d9941f441cbc92b73a3c9817f
-ab397183e9a64ec258fd965707337408c4601049bd8c38d8b6f769ab08008f5a
-badf01bc94d801e9561a9ff414d7d2b9401ecbace8a8b80ba5abeb5d701d02bb
-6ddea8841621c977ef5d680b1d22b4ec83c1a749455c1aa9c5087035b832ad5a
-c364bd1f18bb7b20f6c735ae149fead92d2c3a5403c46e0d55d1ad0fa0d4f1d7
-f9d670e5f0426e865c8733825102b6b92dde23679b74cbb5ca4eee791b93ce27
-e8abb062e3eb82f38018dfb9f144cc640543fe7d8ed16493848b5f1f31fa86e6
-caff6c5fbd54555940d3f1bd376f454caf69f002b91c2fd77848c3353a3cf208
-414155a9fabf34047f1d6ac10e3967f434218357ac6c5159698f21e53075122c
-fa05ed1392431c4d2638965864baf262fb8d7fae487c4f755a782855aa157de0
-15dcba11a1c649cf5c926ffec3dc264386491f298d52071ea5b9bb50d82e1701
-fb5463461de9e98e029cc3b7d4621b16f29c598c10750f61ad95c1f096c3a3fd
-d4a327adda358bbbbb0dcfd9ad6331e6a28bee5c58506eeba7db703a9524bff6
-2abbce7362e3f0dd61052504cef97f1725a5beb35edb5e08de8cdb3b72c2aabe
-ba2c9f6340f95487edeed33d8fb9006b2b105a71dde5f440a0543af51b9d13a6
-70f0438884b84220229e992f3c18d0193267b133f8234cd5be9625c712913e2b
-14697b6042de352f6f1afacfc6a225a4faba63826675f83290965a536ea3f31b
-88ff1ca2774aab2d636ab6de2f1f87fb54a5380d3a8b5f9a303649a4f7c0de26
-626b97599b0a935da6a62d4dcf88b7f603bac672f6575bbcff1784271bf18bac
-4e33df2ae95221bc09d7a58b670df76bd96d1303f66ebf40c3712eaa384252bc
-b63d409a8f280ddea937f73388ab0acbe7f37145bed320d3efcbd94bfb6e6c29
-9ddd6925174f858497804ab4688db812cca27262e7b5713979f5d5fe167294c3
-5f10878e60950d1b9d1bd4f7f10c0c0e1fbbc095c4fc1856f4c04d85649b8011
-5fb0dfdf37f9604f4a9aa6061b5029ef157b757cf3064a9aac5aac24648a9c15
-f0a2a74dfb655e65341c03139de98db3dfc2dcbb39bffafdff9e67d734516e0a
-eb7c111c39b6ee987f99a7064f98c4f974a24466f60dcdd9f8e526033bfc238b
-35a5d78df28a114456211b5d26a164ac45bfe67bfa3b39c4622d67fb8a305d03
-e5b8548d0c01150d18ab5de5aba0aebc35b456c42933ce0370f8e8413b13bc6f
-db80d558ae7b5a32077897e3ef1eb98b93db5c00f34f33133d08a6a8e7665e3f
-eed2e1bb318afb48b73ed72bf9b6234c40f028e76a5a0f902f8702ea234a92b7
-b8dd516336336c31f9baf355450fbe924c44560f32510e183a976a1f98e0ee77
-e99e26faa72e5e7bb50248c336e6481c1e7b00596b1f511db2dbef7a288edf8e
-5653620ab52f7e3d10921ae2e194c6a842ff1829ccb8aaa542a53c04f8c23cd4
-08b414afdacc34931bbb91187dfd8c1f3bef02652e042adeac4b9bb5ff5ef7de
-60926e02d49e3d55cc1ecdd555c1f4c1a1083dd19c6d58972d86558198314511
-4cdcee4aadf3799bf6d81ec7d4347225eee6e67126fd91937c7711072047ed3c
-4bcaad89c800e05a3304b95dadaf9c7333f0bc8aa1d711122176f3db92d0a4b3
-30939d1b554d47893be691dfe0e5c47d32928fd984daf6c03f32c1b99efda210
-faae4a783ef7d6eed603d5db1828c274061c1fdf78c40ce76a7949af802bce9d
-d84a726212e23d97b0ec1e975245826f3c49c995c08940c680c39a598553dfef
-1b3c7232f0b698fdce76a0dbc3a2fdf0a53c6a0a48233a322d1701bf43c82bca
-12ca3393662fc5c4d38a693c30b9d3c987e872b91a0bed138bc6a671573d4840
-46c9adf2cb62df79585011d6d61e2159ba67b4e7cb35caa2de2ec53452dd6d82
-f488fed31ebb907cee7f61773290dd0e0cf4969f2f123670d59d24f909b8156b
-9af55056199c5a1a4d4d3f72eafcae937765a6e041f626fa9ef67ad918d9e10f
-328b3ee0aac1fe1d3a0231ee926659f238c60c772fdb1d13ca48217e43a54b03
-56cf7084cd9bcc3e0e482c18a1d5e01cfc1ccf0cf196af73f676b915e5efb9ef
-5427d032e8d4f9cfa5fed93f85707a1cc136b7bd35b52a7a4cadcbe3f3a6911c
-dc5b7fe0607861e73d5c36bda58e125d20c30ebe336dfcbc4232524a179d763f
-6e23915fa34eca1e4050027a2b8b7f54ebf0b95a68960c676a0927242a436cbe
-64f7fcbecf8dc5c850858725a1e3b701915f9be0a41214e42fe2b850dc7de4e5
-edff5f9c6eb1be2faf002a6c3347f5895a6b39f8a4ca5aa65261b03d7a17b58c
-b04fcff305a35b1afce3bc9465770b512604209efa3052c2a455ffa83b870d21
-15bccef823883d2a92d725123912a9e89b4abc02185621a728a447a5957d78ea
-36a3e8640e9169a850b4a2cab7ecf9ac05f2e0b30c6f626a1f59316e29081c07
-5b22a491b8cc89d149eaf7216cd9d55de0214ca1e70a5cedeb9824894dcccbd8
-dad1e22d7954a8434773ddfcc0474ff722a521462bc78d20369fb9383a6530cf
-e8ed7e26bf47e61f7d16c44631edc1bd494c461aedd67ab56aee434c442927e8
-1acdb71ad196938935646560a0cb98677a64431ff44f2e50552fb2706f206a1b
-39b95c94b82c148e1a3618b666c555a258908f96bffdf1e6c34f65919440e8a6
-4c10982dcb24cb5ae5ee34981c9c340065bb0a6d68b1735ca808bf5593d86440
-6bc88f81d3c9f0575216f2f2e5d7e12df7459bcfd90d217f4eda8a8d6855e960
-e7427f6f3630ccca0d72994f168eb9e0b7d401e797a1b3b250cb11d3873fa3a0
-4521d64a5c71b3bb2ed62c762184a15fcfd4290761f54e5c2dbac8a9e196bdfc
-0fb03afdfe8c441933c35296063e4a15699c82b83142ca7ba239b6c65e3fc1c4
-e287be933346e534d611c38b85b298c51dacd20fa15f91a7c84dce62e3f9ca70
-000b6d0e62ef647b47f8550ab0b3e0e0575509f08d73b522653610f2cdaa60aa
-a62677a35d57d06e9f15d99c7fdfa77fda7625fb3f418bcf4cbe480d748b99a1
-2e332920f119423c75e8d3b18de4284155230945da1e26b73cf56aadd9e20fc7
-b94a75b55e3e5ae6b51a831d087e6e5b1606757ebeed58b5895d47546620313d
-80c230bc01b17f0e11b70e1a9b17bd878e2d5ab31e3436c92e5366c5b92f2392
-08e2c6994fb869586c4095ab7c559bf8c70ba0ad8cc13ece387c57a6f79dc107
-ce6f7821f77c6e8e493f756453512038b01f872e90dc1d9cd0b82026446a9dde
-fcceb653599aa3b063fcec2f7e9c80665b65ea21e69b82ee4a99ea51d9441ffc
-0f2f7dbe9d4dd204cd4066874b85ba361fd0aff5bc11b8852625701c7f174302
-e60cc1e257e6511bb7c819a8838501b1432710df25b653e1e3804e4749cb9abe
-f08ee2a0b28ffd07b9742fbe2d67d568618a593945959a706fb055abef058a45
-c07d62ad9f63c2349ab441e2d72b8be49d1af258e365bbfea63da2449a87aded
-b306753dd10c806c0c9361cc27ca6f837723cb538ced898caffa815e12bf5e9c
-819b16a449f8e9bc06a8f8ad631ee0e8e23b42dc7eabf8dccb0f9dd14f129d23
-49dd04e23f1e033c95d11fac2e2809416055546a93c9d1bf3c95fe8cb4cd8cfc
-f0f7b21632bec14a136a9b694e40e36049c6f233e01df150a946bb28fb0f000a
-4d99dd94b292f45acd9bf8cb8269061bbecc062b64b38c526cc7a55e2aba039f
-c3bf691978904c0152d90c85f5c33779af5101a6ab0eac7577624649c9ea8604
-b942b0b966c3c6e670601cf3ade97a20fb5a7a79e5c3c0d5a7569d615120e89b
-1c33397696744512a60789193d699802ee1f37ab3a13f8c007da56db937f80d0
-b9a23b066971241f34004597effea6d0625fcd9f18258aa378c8fc4a41b7d1d3
-931d1a7d17edb0d36568955e81787f4f2ff2858855f60b3061a85e6cdebc42e3
-44559734780c07989a41642720daf7cb97bf3be7acbc590d57f1791238ac096c
-b373165488fec94045578f0a69fa4ed0366b94f000045ecf486b0bd54d89bbd2
-33d1d814886fff091d6bf567417120895056372ce8d490c02ee8c0b40634becb
-3f13ca1305f352e96df55e9467e16ff92d2a2be8b1d65eac380e41db62be9d4b
-341f4bd6aa69349791c98fa61490bfe18286bdcd936b27b18b6675733d447eb3
-79d07b8cdd7bcb3f1297d4c142798d6871bbac3752de9b23ff6853d5438dbda7
-6b33d3fe159a064ad2d2901d5b31ed8a3987ade8fe06cbbe7d69716b4a35c489
-841220a5365f0a000206619b081bf55dbf6abe9adbb9aead2dd25b66896f81f0
-9c1c9cc4332972ce1ff07930421dcf83428e6fb32fb86c6089495bf91273d7df
-681070765ffc1eb22f5a31a00d424f99e11bef8067980e3d9f0e66ca266bfca1
-61413cfe419bf03ebffe788882aa52b4ac2b1928800008394e18fc88a55f1db3
-788c6882da7e4a1eaf14fb1dbe6ebdefa5cef0d686245c1dc794298511d38006
-2fae24096f728f0aa080ecc9d85e5bb0d989c5ea82fcaef430cfeb7aa9f6369c
-74cead4731d892a49458cf89dbba50d7f6ec38140852169dc4ab886d92a91a61
-40fa81b25b8c93393837d64b8c390389205b36d444731b3ec745a944b6cd2d4c
-b75a668f49b01b6689ee9d3bf88be3ee24d39b00e20b4764513e0b2813c5d4ab
-2d067d468ee2a805e3ab73c05ae11e55b1205af42fb851bc69c54e8f3f1083e4
-4b4f781cfa7f44ef6b1ddf3163567d125e052870995761b2a9c5753e867339fb
-781f0f80452d6350d4cc6dea0c7c6dc7ebc3f1d99653ab1374b26091e7247364
-b9ef32721378fa994ee464b5d653438bb181e2d5af0d52f6f25955fe91825f2f
-504ed079a87da169ef93971413c2f31fe10ac677b7d533207be18b95360d9aaa
-ba427161e12af468b4d05e929406396ab010aa775b3746098a044328ff0e98a7
-e53240a0a3a87e955b3e7c5dbacd9a0cfd7575ad4cd9cc22652c7cbb43a29764
-01ae4868bd7f4530775f0a6bb230567ee11d542cb993b2aba34f0bc38a36204b
-85ba53df1d746b211b1bd22ba85d6a7dcf9c039527b26d950afdf4892d186b65
-c7ce1c2de59c03a520af9d013878e989d6d5762824733cba8a37b01fd7e3c169
-90bb8b8b469767dc749663904285bd4fb4de7d363efa8fe2e058c641744f7678
-99f9b384fafaed93e9dea5615f13957c8080388b70c478eeeeaeff2f0d3d123a
-04ba45066d402c6d1afcb4920bd0a07a386bc5876c73cc5e89cf3f2fda80a47a
-63c7d8a2403c2c767625f25f2407931ca9f11d3f3f1236a77c38aa35811dce4a
-ce4f9fc2ec53e0d87262fac254827144e92eca37c09e73445060ff736a334f2c
-c1d6789ddc6f426024e6765fd9815f3f2636fef179784f7b47ea92a3f6b66382
-5fe65c4e219a2c43af91e40ac28c2b7a02e7afc1751b2b24eb838ca55bd7f66a
-9500ff4ad31cb1a627839334ffee506f87b0c44b50c4214318aa8c41551a606f
-e3addcc30fe261c4859fe204feb3471d9d5356c6508e2c37616d529aecafef05
-25b67c8f7cd1c26cac2d990ea57f3f48b221d288a034768646ed29db82f0b471
-fbfe3a70debbaf9736df89e7b054bfb1bb6c6ccb6a1a71f9e11937f156a75291
-5b717c9a40c8902740e1e5eb8eebe94183d9ec18ec857bda2635e0eeb26d7ff6
-3edd21c1cb4be925f049878ef687007a67636effe6deceecc73e8871441c842a
-117b9dd817ed80d0920ce1743ed6b8d9cb15c93725a4140995411d75a0f1bd2a
-a10bb96893a7d439d3110bba9ee156d8b18627c7c2b8217969e3f6328b53b4ac
-62dcfcfd498581b59b6d018733a3a5ed55eb759b83fa3b1c0793a247bbc6362b
-2a8837413d0edad8ae649f3e06214a316fd23c5d0306f0ed9f8f5b896026da63
-d2a18c58352a04c540a3f90de5d56a4843e3d1fb90f5e712da7897680a7a1d25
-4d32308f7e1b8de9e8cf4535d9c525325a1ad6f543eb0b1fb5552dfe957e59d1
-e66da60051d6687fbd7231324380c9eb9fc8b6cf4510b043fa48019fef1c094b
-84b7f5e3816df7c138f2e6ab1303b368687d1e3c7dbce4754337a3de11f57252
-4d2a143826e406e082c3d7a69ba88e2871a1cae22d6a7bf1ad1de45fcaaab235
-038cbbb623719dc5533d36af35f712e9f8ac826ffb49b4fedcc96c4f30913c69
-ad0533b02a4684bfddb065c32b54652402869d8d6141f90608201397f3f0bea7
-f41670b138c6339230df305a07d31b5aad40ec48277df06092358bcdb3961bea
-d551c94cd039fb97f46115d234965aed70aced9be3305de77c7f1a33f3292bfc
-f965c53292a7f31a8926e038147a827589579842df86b16e840b836c23fe23cd
-059ab92be7d7037843661fe65ef0dd48d31b07782b542f0b0852071baf3b2809
-8b95618ede124c9545b31323d1e454ada5a03e1a33ee34f6e1901d54fb90ab12
-ac146fa7bf5aaf50f0de423e8e47d45cc01867674ffd404060eedb137115f352
-c07f7251835a8ae2bdfb70d022c2700b79fcb83c3c312e7dec4001ac20919443
-acc723f7269d60f3d626dde9d961805ae77acec4d40419a51baaccda682de591
-9df8ac6875b9fdf1f1281988bd94cf1f5f06ccba48cdb6039787d63295fff9b8
-c2b84b30383dadf7ed216b830a38caef32a3279e86ff7e92865bb6b421166e93
-923b68a473de95dd52c986a5a4f73473560ca69e8ce5f7005e9aed1f2ebf81ac
-397c9d6efd6067cd741739f7ba770b7724336429685d486ced5a122aa4d78647
-81fb6611c6fbfa68e7aceb2a757992b249cfbeba51bed32b7cba777fa78f6db3
-95641dcefd1a61263e2ecfa95938e2c3380a8617d4a775dacdd824cd2c2cfc67
-8a5727ada2b1da97f157e543f252f8d3d2bfba555cbfe089e8bf708ab253a4c6
-3f6ad9bf11b96988aec8a66984ea4952ffa81aeee213ab59184f8be355db5010
-17bf130f7d492b9bcc4b67f2cdee249f9b00bb405e3c580bc56dd1639ff81771
-8d57d1ca96b5e8df212bc86b709355d1551b4167b4e35b14a32a708d7df1847d
-f80904addbffa67dc2098848c24b6154410df3c6ca0559a1855803ff6426aa69
-ccc262dc8a2636c17ab65c23004d5a33c7b6c801596f0089a033afd69006ad4a
-f21c0cb08238c0051345e0f1b780e914b80b1d74eb45facb77b1c043a55616c2
-8ba8ad3983fdcfa07a3ed19ba69b97c234f89a296f581e4a380fc58056e72096
-7781f036f7c3691ca713ca9d886ed1b4a742295c29c1ef093f93d6fd507af0fc
-80c5a01ca38c17b8ecf33b38fe224c67cb551e43db191968311c38779aab6c4d
-0efcc2a0781f4e0758a99b13b520b75808cc555736424a4333029c5b95edf387
-7e6d17b114cb2821286dc34dfffc1e89eec9519c44bb5c928fa4ec44bf5b75d9
-e13aab1a73abeca008d75e73d72839653af898db554ce339a867d7cde546c249
-d0ac179997861a121cf2e1a1001154ddd1f337ade69263c021bc78724884f470
-4cc8b2ee48a1e91eae27a905d0e73a98b00c4353c4da0aa4abb75794b5617080
-a4a610ee9270af4393efae916b8c4f5af945d453e9ad0159deffdc96e5c6fcfb
-95d9546275d8d7e4608cf4add77202df1894ba8bd0394d7ab8a066bdca5c649c
-a78544a7b54b7c6745321da400d74a0c67b7c1f412901aa0c8c73d075918b4c5
-a5462d30577d848479987a4a6110b1748884576a374b488ed5d06e017880cd29
-70eddedbc04a39bf3cd2eb3f0a48dcb3b7679bdf0686e77c63b2fd085eeedc2e
-bf04a42bfaae73afe9012890b088f75244b6efbdc2f37774da13dd60c89eb077
-3018a2d9707daaf64a1efe40cfe46a5ca252def56e9ea2abbea02e4c86eceaa3
-85b194025491448e9317efd74f3e323683c036805c158e6c420c54a9717b4c7e
-7343b48e2e9cb16d98efb347dd42f9f2ebeca64bfca0d15c5f8209d35c0e6328
-f19be8be0c967c2f577d7ff09a9d1b4c6dee3d744d6912977e597be47e4023dc
-3979dd6280d66382782466112ae09f2c8048c93df7c38176560a87e679a681df
-708ee6ee2e3270bf6c8b07c15a0839b0b4c4a9beb898d523216f2a9384fd767d
-07256afd80a51a2782907e34d1694b1aabffc98f5dec33af246e5fc759c452c6
-6b34ec94bc9d66fb80898322701ba188fe5ab3dda0cac7230f6deb980006b0c0
-786f1586d58bf75fba6f52697c8cbde27b8525a27c0b8bcbbc43faf42b419156
-eaaf3475a96cbf399605bbed9fe577155c920eb4a4851669ffb1083ef45ee35a
-83eeb96f3d0586402baaeeb1b71c448639a1ee577c42a327cc78484f4dd38fb4
-44162bd3b5e6eee672e6100a818657759b899030a0b1105be1e629a391aa397b
-888f0175e74c210ee7d5a8a817d4725785d2cd565059c8f08a6ad227a2645918
-5de5cb6bbf78143177a4aad766d2fa844dc7399ab1f800b5671777d074b8398f
-dfac8803cf6cb19ebdc486db2f55b8d0249382dfea1732ff0ee0d8fb4638c316
-458c6263e9aa416105806a4eff7ad6abd753009c243c3b1fe505e6200a7fbfb2
-0e5595292589d13e73286122f291dcd71b708414936143008bf4e42da33043c4
-c4fb7fc1cd40fc685c923439419a441200d118c497892ca1c492c52dc1408771
-c428cbfda340bee7f84d0c2ca16c4e35a0962da289e76a728683bc6baf252f8d
-a0bb4e3514f5127c513ed939ad1a585d7d3303e13af4f5c35db672658269feda
-b0d139750a4b4a26253f6402460117d541e55c7b899f544078e7a435d78d474d
-71f7bd24e01a395265cc80e525eb2185f137b26dfaec31f616e7deb0f6018edb
-a959bcf2d04999d1bb21e39e43739c995101557de20e32e0b25674d17c12ce93
-f0dbddaac156767ed03f2e081c63ef94828ab30d4a11ab5091e632b6efc0d740
-30004eccfdb55c3a50ff091afca5acf052cdbacc49f4a20edde87dc6dc2e9d61
-7d0a40cfadde02ac8e7ea1f375267c7322dcc2d3e9633895d1f897969c3091cc
-7a0a7a7c84a4bd15ef83a16690d9dc380f07189403ef0d9113c7ef0da0f1a66b
-61d7f9593f82f849743647d8c2ac15b7e0c87b9f7ec8d7adf890c754cc29c38c
-02982e19d542ce713462c3f5e22feb2cdd4cdb6627d419c5b499c9442c58e4f7
-f0c0ba8ced3cd519473145238abd923930d31f369d3e067b6dabd69c740586b7
-93acd9e69ae61baf1a063f062f22025bc3fa2e0ddfd7d75454dc1b8ad9629167
-656edfee69a41240a08f6fd792e5cf510a3254970429cc76f8c2f95a86d75d2d
-c98d8c7bb4418561d37f478ee00e9ec8f52f8c745fa570d42eebff048d60a6d3
-e16d9a9bfd1722aeffaaff77ec82cf4fa593353a1bc6d96790dfc9c6484d22be
-72ef63932b363c6b3057969624cc63d177f5b103b77b8a560bb0595da7416e29
-a8e43480858201306e31a72b3a7e01b367a8917c19293e57e4535d734fff4e17
-f50fc475ad13a5203501cf2c29a3d135860788507413ae93be0598f21a51f317
-e9da8415f5e00a4dcf49f640ca26c8623ba9c5e80e8fba310c8f06570a629a50
-758318dc48c876b126850118b8134ac65333f17d67ffb7f3c7bce5c07655665c
-4a09e6fed0bcec0364386fba63f4cd34431d2e5fc44e3821abe5033d77c1a901
-183a127f32b003add501dc875c453762446a87bcaa50bac3b75a453caeaaaa30
-12261d6c08c95eff1df3ece254e9f41d7ae85efe476e244fc9d9e0853017eba8
-7ff6241cb9d11b7213d2ce679cb1c071daa5317c7e3624df30854049ac46a995
-97422a2dbe9814d92e829744db3d600fb8509f9537a101862f9dc84d17f84b82
-b819ce71e40c2e397259459f55ab6af355a6c4f359ebb831fecbec1dcc4ee2c2
-503dbe52d26b3a72833d36a67a73c9de2705769d8ea05c92bfabf4d3ddced23e
-a37214587f6b58df7de6318187d2272ef039a8955de18eb7069d08fcd6f9bea5
-87a2a6d3db572662f278146b51f771189e46a044ef16b7def53b9746d888f2d7
-ff871658dcd3487ab266197e7e34c177f877b07ec4dfffe71a0120fea56282de
-97de3d547ea5b97b5f2fe7f14f7adc84f461e5fcf9aa866bfbc84c9797c68749
-03b1a017186b2a386dfa8246c584461bc07194eeffb18f8127cf521e7756b715
-7f6f7c7358d2e5d9255feeb70eb771514d052035d27a86378a22d82378d99911
-f8e667e1d2df9611eb6c369826eba29ed9dde39dbaea38c9fbf05ceb5910d484
-453c9c282e5d418163b4adbdd92c091758e1432e8e75e151872e1dbdd5e813d1
-1a86cd3a230bdbeefd67c02448594bb5e8ea2fb6d07b098131a73a28f9cd9063
-59e8cd66c000894ed7ab70240e06602d7c4e5c2847095c961f88f2b02f2ff063
-ccb5f34f7e0696af4e43023cb3b0474af145dfa09dcf90835b766358e2ede785
-c63e9bdbbc208fed261c5bdf4d10a769112b62b086bbbcc8d25486310f6a919a
-35383ca27e13724504c63667f79103fda47692d2713923a5b982a2633b3f86a3
-46b4d7159a68ccfcadcde10084b91150fd86e1e185753a663fa82eaa428541e1
-40edd7a75007ba37fcd7bab998a401a37348f58bc42d809ac2d0d38c7f49c350
-2bc84208804d6550bb732dddc1f760684f0f2bd1d8fcc61b29b5fc6b357f3832
-54a0f238a00f9dbc38f063827fcf36ab943c9f61ce4add29be32889b32dd1584
-c54d3900de0b0acfc1345b1bec5ad097f75adf92655a12542af7b8c618f07bc5
-cd4d69b206bce599e1e6a8485849a7f2dca770618e877b44150cd34101e4a8ea
-e8d3bbfde9dc4a862af61f8fb4db683a81e614545d38927875cf8c027c3e28cc
-152d7299854b95eb16df2443c7ec9fd40ec579b52f9ea5a6ec56e3b662171b3a
-bf35565869988ab1684d47b801ae6eb23a6bf085c41e3c3f2b040aec9bc6cd82
-58ed64d6ecd8332f966da918d44af30897e54085050a0cac70f459a72f5af683
-3264a26d0cb7fef77574f10d4fa8ecfea0aa397d5bdf3a62d8897723de545ae3
-bbf38ef76b76e3e72d1c3a35b29966acb40e13928de55cdc20e691daf5dede05
-b71e8713e67ffed407f926be5b69aafab337d2f04992abffd60364a8549835e9
-299df33af8212c75c0819000536b89127613c763df066d184f718e1f10fb8e08
-f5fe7b8abe9f72743d0db04afd1d528780a097598a67a9da8172247c6d638318
-9885e4fc9231537ad9bea8c3028c7cf26c3ec6b7adb82b1481ca1b149a9d2316
-2ef5477fe27363a3b2ce1dbed38128d16b869eb8f21807f6d5430aec30cec535
-d0f4458efb8c19834474719b6791b30edb637f54639396a7dd581a4ab5e97fba
-284e1b756f2e2e3b54d6e136b237bbd042c69b21244248674dbb4973ec7ecdd3
-9f1ef47545ff01b39b09d06aea5b412e81fa46ab0d048b6803a5992de0fe2f63
-6d6d29b316a9bd4608131cc7b4c0dd1db4a249647ef8dbc5a2f9b9524284df3f
-1e70a74c8aedcfde0f6c556713ca8b13cfd5094cfe64f1f482c29e72adc2024f
-a2846a10ff5344cfcf8113d0d1da07927c53b9aa76094106061eeff3c7e5bf25
-d875ac8c07c4ef7a0bd5d4af2644e6ff82c8aa6e4506975ac9625fcdd47fc085
-4ff26d3dc3f8843c1d97948374170812c223ca163451e0fe4ad73ac7089e4fc6
-c24836cb8413a3185224724c5b302fa8d9ede4bf88a0109d98be35ad56b45045
-3422785c4f579a9307a860be505f5d880fa5ae66c82b293205e738e910ebefaa
-af82bd9d493ee18eeb12e40a69b9ad40d5aa6839d58a7894b5cee115a2c42465
-860139d35c0f2640041679283c476a3fcee985a53ea863414b206dfaf72c7d10
-851ab12466eaf532d90be235d9beeef7e389e88a9319c536954f081f511dc717
-16f16c21eef839669bfd0d8b505498b0bcc83eb41889e6380d8104fb732e982c
-ddfe4d508c45e8741e21d6e5934e678f38dbf17c98196dfeee7f9e205a52ebb1
-b9e2fe333d6b1c1b1b3386e079fb941c7ce482f2ed5c9426a224309edae06e3e
-9e8f5819ba4248d82c7e9cf44f7d1eb97b2110f9ce9acc313579840154427df7
-b2e57e2c50c38b25f593092f20350e27f67a1000f86fe87e2acc031235de5aee
-f246f75d4f4bf7d8852267941cc50de864e0ea34e02efbbfa72587ce257ef2de
-b249377e0df834e89060680b54c38d036895e4e2f8d55b9e4a5fec6da7b99966
-9b4ad9b695d6cffc349bcd34ed2abab20e289417eab1916574e583258817a100
-5173bdb345810dbbe2c600c25fbcc73727698446a2c4d1f71732208a70cf557a
-30e67fea48eb40f288ce4f576366b0079195507f25bc9852f6fab94827a79d9d
-16fad40c0fb0733ca838a148f1c2050590eda6cdd3a87283911efd861c7183bf
-10462d87eb0c7131c18346611088c5a8deb6e200ae86977736f2d15d818a444f
-5c435bbb043c7bca3d5f65152508a0234c6043d7e67da24f0b4d8b3e7367afe6
-c50870216ce2e4048589188cf361412cd5cf8baa691fb7dc66677822263ef3e2
-338a4064fbacdd0f7460139c508bb21b65f3f433c90fdabd0170268b7ca7003f
-d72ab116cc3207ea8aefe60b715e426cadd96d4dde5cd91068214c92a1307237
-951e92f30e07878b695bb519d60512ec7124d4df28fd5ace12a9cbc8c4ff6c16
-f697ade3613e22880897bdb1a3aa680ccea6085e234ae3d62d270afe5d4254bd
-6c4d0fe6b7c281919e6d422431e1be80d47a51628e3edffbb685a7aacaa27dce
-73938aded090460b036236e6cbaeefdd26c1e5caf99efc45cda9b3fde97bd072
-9efcaa80ef173375e99894d12c609bbb57fbf0bdec7b2150970889d08f992382
-23cdeb12483e3fb57705d03eb900f648618cf5822b57480e2fb420a5022b4e22
-138ec9b68d4088a833d50b2da7a26b4cb07ce56aaee2a1fbe00dace02a1de81d
-143f3b20f87b6a394ebd896b3a6e8ff548ccd70bfe95eeecf9bf9367d543f75f
-575333b7426d644dd94d675e17dd5694b3a1535aeae056900a9bf30d6a7e39f9
-62dff42d57b9c7d469446bea7dc3248e2093d47c3afc995e7be86438cecd902e
-13b1686c5ac4a58ee9a272f0ad18599b8495306d146ac0f6b958b86b72e66121
-3279ed284087ccbd1e8c865df2fc26702cf399b46afb744a3e99af6079fdd596
-5d1b59ef92713a40d56917270a40fc029583989c94caac0ea6aedb0310ceeac0
-96c62a045f3e6b5de1963ced45c566d7b10ce5ac76a81ff38737104595667628
-b51a1ba8172022d9c06f5ed6ee8e429be415fea9c8f648a27f8529090c6bce5b
-69abe90177b1274d5bcc64d29db949132223c7eb9473d5af376a81d94826f141
-9bddd79521481b06adc451ef5ce33ecc43a69be43916509779b4c8a5dcb4a2cb
-c12bb54f3956a97eff63d26de59faee85d6d3ed74e2f897fe852de6831deab85
-10e2790367840dae069eec64a77abff4e09225cbfe9f4fbc99a1cff38e2fe632
-792db6c32e444e85b2e09dff8f66dd638c2b0b5ce375980a894bdd6a1635c793
-33da9068aa329714e0ab8066ccb7eb15d1ff96414de80b5b791b34a62b25a249
-21cfe87d128a4cb6b93d0e51ececc9deb841e3a3d63e78c053f1c580bfae7d6d
-7482bc54705022d1f48bbd33d9a2ac7e0f6ad5efcb172aa4e49f356b993bdd6b
-8667e358e612b24ea9994a30f80a4db180c801b740a3234c0c95a8ad6d823791
-0ffd5806fbb8e86165fe6f343c72e655b57b2102f41a42d0220ab13a53feb105
-4836b876148c29b5d2532869882f7b54c92bdb7794c13c737d8a44bff734def1
-69786d9dc57dc55d385209061f38a411b5d49c66f191af793ed37432d2001a7c
-0fa0f23b32e80ef519fba48264eaa841427b4fb6311995d63ad919ad034f2313
-d6f504d4eb0369678afb331cfe7f4ea1b69175d72ec4df93d4fcc4d91b880009
-6c371d04c12f033541b6e1e7a010689a1614c157d5191c69edc290a907349459
-b6ae2a0eca1e8e871cba19bafa4b861a29172153afe7b9b7764a6c3ff87677d8
-8f8db936d12c33ae05e93ec31944ab240099e39ea3e9de81217996c91a4b5685
-e5d9f7be2727d5f3fa41079bd37760568f2f4b4ca19226949b0723985e98e7c0
-9c1be3b1d19514e8236f8da7655c016cc7a79e7d19c0415c74ba1dc510536799
-5c08f9e243b1d3065b601af52a1fc72a24cc36b3a283adc49dec4d33fbdfaa37
-055f9ec1846911e326cecdcdfd4ab522d2b2871c03219bb991567cceeae2959c
-96f068e117770adff52a3be04d935141c20a9d1c56252003f8bd51aa1d22ccea
-15fb359f308ff2d6979ba1d0da54d9927f723b505b86de8325bf3978230924b7
-97234835b6b946c5239c196be506bccc1e9a4f2c339bbbf7b4291f1e830352b0
-2ba637fba6dccb5930638db302bb61621a534c7993a0096265271ec3ed86fa81
-b6c7888114a33b3346a27931ea6b0b2eff65f94ea692addafde2579482a28609
-bb20c6f343c8fa777cfa9bd9436cb47cd0dadf4d16754e7da03aafab0edfe819
-3d5afd59b5b96b329bb4955a9af589c6881d81ace8c97dd92be95623d94b7825
-4cec015c59bf4ce98de9081328e7cf5d085803212054da028016350005aea631
-bfcc435114a426c5d4367c86311e6437e0a59137e29db512efcf312e1fa13624
-ee6f728904e0ea5def5e842f8f07f2627d077320e90927a81fc6162586f9ba73
-d061839ee5dfb7c4c66a530d1a0647a87ac4ffe48c956fb619c01feb95baf99b
-56b0799c8bff1d670ba5530cf7cceb6b4aa1de7119958d3ecaedd5dcf835e7ea
-f16dfc6c671e6b861297e675ba9bde08d0654c4d9add46a288b15268df4a6572
-62f9b12765b59b338c718651ba92329c9510655da59347336f8be78b9508b267
-3e366a409db85adf04edf07d75111d2fe6fd24a29e5072a876ccfc4290b0f868
-fb9fcff47575a376c594196d8463f4b2defa8434bd1e769553eea3e817fce981
-dec52191e10a7c9e2a7328df0d568c9149bcd8476913e4cd385176184e029343
-3ad94901ce4b5c2cbb88c785553db92464284fbb1cc3c456d8211848dce535ba
-697134df3371ed34bd6b0fe30ad22356c0dba8ccb32055f01c0fd9a931191bfb
-a1af29f383a66ae3a810de7da2b79241e0bb376e4405bc7980cc17ab240b9820
-202c4cc9ffba362c8a547a7c9f3fbd37b55062a294870721db5f063e05b48d9b
-567728f7b844f85701174fc98aef1e583a022b7207a834dfbd9705a16ceb4dc8
-c5dc9305ac98f5f41be6d317e20cf2d7166934586bc63a4cad29b1715bbc8d0c
-0fa882e364ecd976e7406899f12bbcd6145dcb5f314195cd4ab865ae475a0c20
-644747ed8f79ab9f4fb736fd7f7361d4885bb41cbbfd59b0b7620cb17659be6f
-986fccd526e9756bdf412c6000dbb9ae766101ec23f8036d1afafd45f106ab14
-a3ef3553cdc80411e766399bcef62e77e67ad7568812d3b150c29a961dbd4e47
-ccf7ea533d1bc8c16ed25bf5a330731ccd02139b72f63234d49d5c33a995abac
-40cd06c867a08cb3c19b7a0f9df091d51a1d387773ae8dce4147533e41f929ca
-cbe198e61b81380306dc2c99e99abdd0b6f2f84056ea25d549bd1f88be1dbf4a
-6fc994783d4475d4018f48ed18f1bb851a221da3d9624e3a7faaacbc5e9b8424
-797e5646d08404f2feb868d59714e4ff77d6aa968749e1507dbd7b3ff19218bb
-fab82906e56136cdb9e3ff1db470a20298b16f08f48a6937761a593e5d98243a
-c842bd5c3acfd41791ab02f991374cc14e1cd0de834d5a13343d70d739c746ea
-626310b0f7678b8e7b767265f343ec770cb789e8dded6c56889ccb0528ecd747
-0668da632b3f399ef2e28e3d8731708d630be0df2a1becd0e95d031aeddd74cf
-6a2e2bfcc5024033e2828bd043dc7271d1863937c71650e5510418e9b9c35b7c
-8bf9037305bf2c78a63460dbf914e867c16ff5dfcf05c44912c4083cfcf6e498
-e7af6072d7052e882b188c696fe69d1cefc7baa001f095ed80299c9290c31dc8
-3042ef7d9d3be6ea2f97f667a77918eb207e459958b60feaa7ae8d0fa14f00b3
-37a1b40055b720048a3b67c2250f3d94b10133c1e473e5f9bca3b4f72da29c5f
-d4c09b6520ec5c54792dc37f10d75c0d4302844f7d193cba7ca088838ce44a82
-f1d3161489ad1b9a2cd319840c0f347131f94296f856d935661f691d737a7e94
-51872d4c49e71e9fab6ca34a96f682da48c50ea79dd68e199a2a1d49f81a132b
-9a990f99ddacd43888069c37571834ae8dc60a69851f7a80d65f5e1a688930da
-8784aee9a5d6ebe96e62e4cdc8b34740acd63f50e208b43a38c6bd0808d356ab
-5ea11fccd7ab3bcd6aae709995b45e03bddfe1052a1c8417f1d8a794a66a0e72
-9db494db21a36118bf7c031c1e0a47c35682e1f0a183e1289a438c799273543d
-99a3840d7549891458f6a3ba49b9f556920193dd86ef7d457293c17ce9cc76b0
-6eca47da729b0c9d0c3181b59f993e773f0279ac90a5ab526aacd6d8293e67ed
-ca0eacdbf1b9aba40e5979a2f20810e6590decebb53bb32414b81aecfe304407
-c42af75e03a6c1016c381a378afb7b943392c081af0680726c0ce4c984856999
-2b7995735bfd871bcb6228d87d3634b3ae50d766a3237361a9478adf6a32b12a
-b435014eebcc53c44c63c7ae474b4f6b0e4fa1b40731d0a3aa530f9a1626e700
-12b5a51fc6473e3bba2e0eb274b747273ca382902511948174fa78de5c7ab5d8
-7ba99000052d5c0a4c3ede1da7927b214b893d61fb11ebd6dd1af012ad26c065
-fa64581182cc1ca3b86150e63e5e3b892c49fe4f6ae6c34ca1900d5fdbf72c87
-6728d86b87fd0db490dbaf34c1c10b4d123ccbddc9887b3818f4335baa4991cf
-812bbefdf1f3a3c4ac56fb633d75d04c17b5256a8216537c928f9d48b0fee946
-fa5d23ce42a4bcef5075e9b4b144ebcaf4887180c733e8e3ecc1ffda9459588e
-a4c2f6af2ef3a06a8edb613ac2d5dae127e50077c4377ece47b7239b15b2d27b
-d08df1870d8f78fc6e82a08441ff64b83ebf556db056fa7847f572fb4c2b2a71
-e5ce66c223e92040e104257c916587c439e8ef8cf32e65b737395999c7a435a0
-2abacb6129f95513d1d89d7cc1a0c8aeae5b5aac1d78dc42a37c435c641972cc
-b3c92858756559f411b808ba10a55ee5296fcea9f4574550ef07156b66807b45
-2735cbbd8fe3c607b2e683ccc8f7932e4d5ed4d87c672fe56fbe8fb644f40ac6
-9b88d91bbc73fe3b94420e4aa3e493800934a40e519e492806fc34d134989a5d
-1c002d51790b15793c3dca232a38c0ed32ced20ea5bcc8da027a7144434be835
-9689e94ac5e8b38da131015f4d34dd8ccded41cb86fa14946ca03f3ca776821f
-83f875a2660a64c4a3788038d7ca62d041e24ae86c327af49cea43f81f9494db
-935a8b065639c789911a46b3737d9e5db2bd918982f172a76cec867a086cbdee
-a030c8ec695dec82fe0a6ae7dc013df64abbde862456b4d525517185015efb3c
-f997ca8904e985f2fa2ba8f72acf1b6704ae358e7d7c2868010831ece2c87739
-17c92b6b425ed85f3f21a7bc4daa9620eb6a224cfd08fbeccd11652427fc904f
-f589c45547a3a33146b80dc930fc515655593d24d259d925e4fb46996bb35db7
-fea309a4e4162646a85d3776bb44f20621d4193b38a28d1472535ec01d1b442b
-b681c799ced74655fa5b5652a8bb99012035a5f66b2729cbf45a998130d619af
-77301e13e23fde352a367343b8ed274a70ea92670eedf6f61a34b18db9cadfe8
-f45bf4933b81c8d98a370e5d9afef4a7bce1681627e3cdb633708efa623a3751
-7cefcc75635dd85ad3ea10ecb575789247b9d0257c40f97209447341deb604d8
-6abfb08a5120fb0fe71ec2e337928a4e4f6ee3113064e488270af5425c9ae51b
-17e9dd6892f9ea2f98480ca299275c88bccbe584a4a192c966b9dad344753efe
-efdb52013c642581e44d1b1c866439648fe1389963039b0a9352b68d7f3dc41f
-fd3cf32c49c062d964fd6cba0fd1100beaeebe0fdf55112132d5e51fcb0c079e
-f644dfa99d580e0cab548258aa864149d4a4c0e618566fe4ca9ebcb9324bc63c
-5ac232512d086830d18d0f6657e9694bb9b3c4f4915a511a45b3c56460dfd523
-30da25d236b0356aed6ea76117885adcf2bd57222199bb5fb586e97d1c89ab8d
-08ffff75137d2c0446a81c32bb336562088bea8702fea749c21147defdd87024
-d159b2bf1692244ade86b3a9f63beefd1b030a29b6ccb2904cee95b737180520
-59f4426d40c7ca7920d06fe5cdecd29e70983f787607055b277030105fa2d9d5
-adb7029c7a3a799494c6faa9ecc9bdcf91ec35cf0defc2b95d6bd447904851a0
-ab0e39fbecb080046246ff21e2328ce12bf355ed414334be01ec175299c7b82f
-3e85ff80347a20c6d46a596b85e842c185b8e7a9bb8a54fa272edd1d46d7466d
-d668d145ac815c5b051536a2a393724dbf52a3412409f40b92f857337f1e0adb
-23d2f0cd6fc33564a3c1e9010f6e0350c966a7a003cae4da4767ab839f032bed
-9ed1e90d128cd8b1396cef03c25bdc76ab04e6bef073bca02d83684e11731c47
-6937e5b7c02b5214ede19fb749eb7b33a4212701ec325a343a7694dfd6be76a1
-98890826f825f18ad39ebad76e2d9cdd294a79398d431215dd95bf1a663ba9e9
-b130f8e80d2260cddb9344b644ce84974ec8787ab84ab4b9517e44fb09d77a36
-102df99690bdafe89b4edda58c693b7f8619039a3ab676f10d37d0be02b29bd7
-da19c67fa4d07c1d562a65247932762895fa5e9002c45e59350ffb811cc5181f
-e8eb49a988ba3342d129e03e86ab9b16d5a92b4e872e973be41da232878cd14d
-f9d2db75d4d5285232ce5e4480fbd0c035dcc427e35a9773edc39d4b17f1eb09
-e842a7348246f1d69e3a15f40443471fac10aa392adb71e66b61308508ba380d
-64374b66e8d234fc62e392347dfdbd4301cef800aa88f29414f8d5d625ed4971
-f49a4473ec350715c296c71cc7947091b49b62feba902f3d68a29e67522b0db1
-3524416b434fed422da4563d3349d19d187f7f8fce150d746b4a038224e123f4
-8e27c8b26a83d039225b551c489d1309dcdf05eeabc4c1594a0ec8596c2c8a05
-081c9df97b8675259256b8531fbf5b684e7ac076425ec9e4082530763c9142c9
-808c3da66c0cba1f5f704a4d4d25183d243c01d33feef4119606356be453474c
-bec5283151aac2b18f231c6542ecd340f07cd7728db3b345aeb977f14962d72b
-e54f4db3e5596d6da03985689d8e6929a2aa8cacbe9e14b539cef80b2edda603
-34b90ee98455008b4768dca85003895ee04613075287741fd8ca8d579dadfa69
-2a5ccb49a6c5257296f9fb71028a6cbd52f4daaa7f089b8a65f1baed85c35313
-29afc857a7b9bc8ce5905ff58730033c8d49a45f9f098c39a08c2d537ed00b01
-a6605633e2eae0971506f3df8248ec06a343a4aa93dcc57bcb9afa200efbdb0e
-543f964e8b9b524f460ac8a72cacdf807b7dd6efb9f768aefb928876e40820a8
-31686dcc538e5cfd348ac3b6547add583322b3dd982e34ba161ebb0a9737af1d
-580bb24095d2629a6db07413050f653e8700156bf5bc85ba077c244a55316841
-aaa3c6bac859ccb7cb9a79a7c9a3704431c2caccfc35cca5f3851a560f5720d3
-34497b4a425b539cb74d462463a8ac183c924a8e53726325cedc4913b1ffd640
-466ac24da3595c7f67993f9b6c22ed186412831a0724a352c9670f6b5df44513
-2f271fb623984cc1f8d268565f5def71ae23e6b5ee14e33c7b3a247763ca2a4f
-9ca8f339add4056629787ec74e0bf54b8102e4b22c577f9bf3b151dc8aeda087
-bf05c29721f2e7bcd3433ceff31fb65cd6fd530ee077f4f0939ba37cb38411fa
-fd11e1dc3e910c2a7ca28eba1cc381e3e43c3a78cc1087a25631238c894dd752
-46cba9a8df26d9d44a830a3501fd65a324d63a969665477cbc0306aca018eead
-533c7685ecd289573423ea384eb629db976f9230d6a1fa6cff299aa98de3ea79
-f29b4c274eebc64bf619fbf552d6ae9c60e7c9de74036e434a4a6dd6e671fa41
-b8cc4c56b811f6ad0cc459fcfcc2bb3654928fa015fe4c6b1177d7c39c747fbf
-5aaf612f30b889ba576d87dd4208a9e99becc44753aed1480bd1187ec5172632
-25d00b69d034e040971aad2beb20710f726a696ac48efb960d05a0f6f6f47962
-2c5a5690275e47c173ea000d392e8c20789cdaaae0637e01b321cab63858b0fd
-901209b323dbe6c61c10d9bc8ee9acbd2a3cfc357f33ba4d5003a337df07d9cb
-32b7b7360148291c45a4d34d4d850ceec2ff978a5f0c90a0420b2bbdb4b6c778
-fe9b5a41833940a0ef9fc0015e0d3e6c80a9bba970c57e1218e10c0c8b8c8808
-2f444af6ceb012b2d9ce6a96eaad590070424ef286225d972be1fb2ec18e713e
-59497bb9917a173fd07507a422e35431fcf4fbc6ca86086f289c9680be087a55
-873c75e7998ddcde7b71c54b3ed2f6b3571f0fb3d4c103cbd1ba2eb006596829
-cdca02d166fea0f63fa0c044ddf4e3d941413b900f8550740e6115a86818dfac
-9dc935f8842e0b011d2746e198ae3a4fedebd8245b8285b7dbec0ad0a6d1e277
-23ce1da5867caef28cd21cf6378e43858e596f5ac514cbec60d57a6c4c6a2820
-b541f4d6fd50a03eeaddba07e236417341ce99fe674079a48725c6fee9b3293e
-7e2b593a573681155c344b0626ccc477840e49e6d7b76738dde7b340341f4edb
-30155156049a4600f1d8c17c3dc2496776425fd23287127d5a2f0d9fb785db1d
-9be6f1b410830df7f19f4c432c7c7766253c67eac8ea7ed19bb0df2ceb178adb
-5437c8d85b7b27fbd2c23d2148305ad2d44ec69fc26880705d4efc5daa7a1a6b
-3c5790e1d691a9975ca37d585c845cf15fc3c7b152e29137ca4168d42f8a7d98
-876564c9ad163eca51a2cc404ddafdf61f9139021d7dd275da494fa167267841
-b7903394140a7544ce4cf8b582bc8b0de916890a560ff490db22dd7b27b34ef8
-b8ac86149645f63306cd298b803ce40abda69ce13dacabeb0fd3c44248b49232
-2daa161603ddabb2498b9ccc84fec903b6b5cfff8e9ff5dfde25a69457d5a206
-c0eef48227281bb1866f2d3f13d96c4f26c6f6c2c8aca1359674430747c5fede
-93ecc169a5855f12b362da58fa513ecbf15dc22e9ee46665507151590ab60444
-89ee1f1986af4e82c8502880381b246a905c5358e8d23e62c210c455b579ffa3
-d8b3e4d993e6c446f3fa77b1cf68c1ebeb463e9e78bd53b68f918e05091b6b9d
-453ec9511b8bc1fea1025875fc38ccb3d8d4deaacb959b1d08a226b4c830b733
-6bfb8ad627152314212da50aaf2c2b5185e2429d46ad31cc6f9db819934e1af7
-b1f7e75aad6653b03c2b6415c11ff5c6918ee1c03e4cfd08de00c2240194df84
-328d780e49d3d616432272c26711cc0e05d88068bd009e5085d172c31c97a64e
-f8070719ad1dd72d66ab78e8201cf1f67b84456e3766544471fd7aa45e706cb1
-37a9c256a0d9b2607d15392f7060a47409e4d6a5cfc310045ee7ada6d0105fea
-fafed036a5cb444478ae11d920d9541877f8c1c3740afb763c4ccaf77f6d1dbd
-40e40ddc6a430e8e99962ad32820055ee55cedc516b17831062d308916502d40
-255f786238453677e19b51c44d8f0be9ef19cd747d5836b65af6dd5c41ea6901
-b6fc9c5c7dbd04d3fb9f7f08a2beeb9d0c13aeb2bc1d5419ffbe2349dccf91c5
-3cb956df77eb73ab811ca30633e6d61d5534551d45ae24fe967cd29f8e19c8b0
-305283df0fb776e5d84c3edd20bc2c4df715285926e95f2f4c3b963726d2a7d9
-4fdc743bb2b82bf4855cc0ab701876827457aecd2a69bf58ffb363b7fdaa2ca2
-8b7b7824ffb535b9a74b00e90ad3f23cb7daae9aaeaedf7d2b97807fa3329cc7
-63689a645f515c11d4e50dcde110015d5599859ca67f59da7f93ab98b75edcbb
-f382f878b9b045b9a114b2b4bb6404c0391c8ddda8d9d635a9e3c74d7ebc604a
-d07f0d4025e39a369cdbc672ebfee5a287e07d94f161e11d0e18bf764af79a08
-f15543796e4daa5c3497c4a3986084e7a9ba0789a2ed2e1432623b03c210ab9c
-e59dfc017ffc59039df164157fe74dbfb00087d3f4026f4d625c41250fd4c09b
-b71495a7e2889044e87bda9d1c514734c3d14f4123af5dfb6d618765845f9730
-c66751d613770679c554cd03d99f4653db05440e2bd1202006a05e044e501381
-5f51c02148a91edc8af6143aecbad2804038d2381f7436db6d46b0e9364a893f
-5531e49e42a740a40a87614d10f9e22d336711ff79a6b7b9f8248456691f864b
-4ee2261a13ea203f282e36d6001cba9fa218c220e447313420be2a66e76c4c38
-2d0cc85cccb5d4640fb8f923e1c55c9dd5cb80918976b5e898f03263177b0832
-2b1917869cbbcfc7789f3d799cb53183bf85b89d9850c1a0c60fd6a0047b5f97
-592f3dd46718e25395b6f13c20d121bb1b8c4778980d05499ca442b3d4363491
-19a968f8a0ebedff2b95cac72a617172cbcef5c6e706b9bb1d9de6431beffbf3
-715116cd1d9207402ed3453f6d343b92cfa09c4c23f8835919e183d14526322c
-1722e4eb7e8172b1c8c86eaf3a2187bf9674f482e1623163d2178351ac35028a
-89aa2668c0e10315ad5b5f65081e768bf4b02fe2cfa1e636266c4f632d1c57d4
-bbb4470f51d06eb3b26a5e02aed0d6f00d27fc4118b8a0b8b9ccae2c307fa7c1
-83b45122390c52d5de9bba735546c29d40027ca6c00ef6a5bdb99e7d9dcd721e
-cf6f3760d25ebd62174aa9c563a31da6a1225e3b4ed652db5b8fcf013954c077
-ed730241f4c26e0d2cbd1c246c855e8aeed5c8059e70d5bb8a1b7ff37e2d9ffe
-681f6fef2788e4a603be2b272a41946f63da44978d2b03033e5b44d098998d03
-05fcd73ebd820e5f93a9e9f79573a60b805ed0375c32cc65a1ef4569a893baf5
-45befee450304d67cb3460a10d620e929f44e352157e6d12d353fb3a5bff0a90
-4bab7dfbb4fa6c398877c79fdea6bea230d2b6df6b46cae2dcafecd544b56936
-40a00323ed5c9e30cbd14b40f93f37fc56011bf329ab6fb5d96ec229edd0c541
-ed4f661fb4167ef9c705b1d293dd432bf89b33e97a0dfc1ef10fe8d4c863da2e
-b16a3fb06680812c50cd83ae377c94fe26deae946687df5601e56a46496e2e09
-bb38c3414580cc1c327853235c483cf4600d1de1dc59223b4bb641cd4f256092
-9e0f3df061b19e8515fc9163d4f16fb3ee44a7a8cb1df1dda0ab32adb9252005
-34b21ae2d23b5d39399a7dee2866d2962445501d298390bc870d2d9ddb3586aa
-1ea3ea0fd2ad4458cc3b80c65364b893640c1c450505346a4f22d17bd44e7ba0
-09368203f133338077bb806db218d3aa4c187fbf7c440d48cd18ec75fb218210
-ce3081e0a56a7b44536910cfe0340c3f48033c9eca88560d8207c31474b42446
-6be9d5caf07a46a7892c24ca1792b5b3efc4dcdad2fef5da25e1b0cf22f2ece4
-0dd8715df95a808a223e3715a4a534bd276b6fb114f8493f72521f15e2f7c194
-77e0072d1c8f2f5a6038f3a91d5970656d7f3f740eecec42daa6615ebc893a6f
-cd030de96086b39cee1ef7e9207f1bf228c1fba43c53ea2b34732cf63bea3ff7
-60d3abcd75551d0b8e8d5cb80646ede7706674a63358bcce4059341471a7df8d
-f0bf5fb04baf4d41719f505923085f9c48388ce354b4bcdcf4fcdf7846a565cc
-38385d0892a856ddbf7f712c156cc114a67cadab7d472be7890b298ce436206a
-a31e770c38ec997a397f5af152af3df7e350bea9054df0fc53cec2f4a0ced3f1
-5c59a8436e4f14ff49b66bc6f9e1f1d97d4a0bdaef25cbaef33a0f7e951410f4
-ed5aa38b2da8ee932ba0a414ccf256c5d68271c75d51fb4fa4a7b66d8b4307fa
-82d5eb2e0b4681edfef789033b08b70c2e35b66c5f5b868a9825247719d2e14e
-7c1be51b5cb7b69fcf20f8435207e803bae6bd01fa949bd59d6e20c3ccf180e7
-e383fc79038a439dd256a4782906723448bedc672c980196562830632f809645
-872deaf72534ad4d42848ce497ff12d28ef0fbc728a7f60d60810db5884d77e3
-bd259d298dfe0e4de7695fe2ab4a43ce1100a5f766fca8ac44a9c470369a151a
-728d06bda6ac3a64905a9e7cbe1462bfaaa9a4d57a317682a221554fee457aaa
-485729cad67fbb139d4d7d4645457cc28575160493cf84ed6b4cf733052bbc95
-1b80a186e49dea1eb7f4e7aa45fa5c3666ae749676bca70674be4bfe6e196bcc
-9a294d3af5424dc1e994e0f0e8a89fe667ab89bcd11353b441e0b24993b0c1d9
-cd7558d2c89419aa18c2e85ca74c013e53b8d5f0ae4c53f29f7ae09e51c2d057
-95423b75ef20a44ab100c45755764a8d0eec7d8f013f30264a648a75bd5b88d4
-1c92ef78305f6403da9a971625be0b9503ba6a28e440af5dbe1954d785a93f9a
-7dd2904214940630ab80f88382486c437754bb541c946dfbbdcc28ea0bed96ee
-517b2f4de993cced9a5b503a8ef1561b74aed495fd64a44fd89a0adf96442db1
-cd2eb39bc85a1ed8bbcc60063998d49f02d3dc2edbfebdc022b8ce3ead29196b
-9c07622728bb9ce2bd992876c2e783b1dca5f33e8ff322f63209d94eba4ac6bf
-108ee86f250a9a5a6ae5b06ebdd0fd2751199d99513609864b434dafeddd7d47
-713b3da2b4b12ec7b779003e7df7d4f2bc33c9cc41ef41f0d9529dd0d3678957
-4d66283f10091c41bd2387cc771c4499001ef2c86d0eccdaa904e44c3fb818d6
-703fc8e425088b3753472b6c94a946ddb7ae390b2a2a86e67302cfbc5a3ab520
-728bc8c399655998fa6c4eaa3385df60d379173deadcb5e7543f8c6a8ada3c16
-744ce62c12e0f312ecbe114fce1473bf1a9affb8df1a118878066047c1a1ec5f
-ff9b8455ac309d720607eef62d2c0146fb73c256e90a722c5fe42aa19dba818b
-17fa00fb024793c03613650640ad749c039550e418b563f2c522eb7a40543dce
-7cda1b1322834ab1bd1ce555a5c284c9a92f666910af211aa6b258eb2bf7a28c
-ba47b4f8cfefe17985470306a85bda0aee57de81220a5f3c265096ac21da57c6
-60bffea3d98f2358dba450b29e832b09e764b4e41f9952e2935e09e76941a850
-d25fa4f4f916552b7ee31144c78776337c67795e135e26cb5e4e80484fcef1d0
-fb6c8a86911f7358d5077f41b31ebf9886430964bd316f75710d83c7dd696fca
-7b6490801cee0387b0fd42342322121f43163f512ffde8f284ff3aa1f211319f
-5556d08adc1880b1cdd4acf7592d4ea358d2f34e69a73ea9891498cd3d59a74c
-7a7c48629be752b60e795a12c1fb5f6d29ea48b1d32253e7cda453357d769774
-af1728837104aba991ab43309b2f298290dbdb32066b59b360fdd2f0e32b77d1
-797406014fbbe7c9fed681f4efa445ef694b26716a9d7b5ffb1375628d61d800
-70262b3011625594c8eb5dfd7147cd224d15aeeb9d443c88359236da5514d32c
-2308414414c22f47b85d88cb6954eb5a7bf4283754b6129ff9ba6fcd78e558e3
-281d4201679a411ad5613e38f5542549325d6fa0c15225eb1c13917b8d33fdc8
-30b2eec374994f6b6a19701f9b3a7ddcc8b2478a8601750da43565c7acb34114
-cd24f87d601f995fe17f94a33ca9005c53a5b760e6bdd4256f716c8d59d81128
-1e72c01629c2242295791e664f490d2808fa695986534146942c7cada8efcce2
-bc3ededf886ef8f4d0ebe0839c90496481b324dd7de90e2713c985d0dc196f79
-059f964352a2c72d2df0b13a4eeca5282091beab8bce8f1d305464a8cc69515f
-99c720e6e2221be1047c938a112f3e31930ad86bef1b90fa747238bbcdfe5a52
-92fb9cb8b9a4165c7b0156b550b536a7680f217f0e7130785644e1421a57c9b3
-e94d27d62d2835530785126d553640f88f4e5d05dc288743817504d48fedda6c
-637c53296d2703c986abadfb74f6f830a57c0c4915ea7758f2dc0881ce5a1426
-3f298c8ddf55dbab0a8f22e8fea76f63a565059c72e693d7e29a104f7f550d0c
-3d871d6c7e3c2dded288500f8925fcd72cc838545f2c7c05086cb8c19a3c88bc
-dc738a47505ed1e76616fdeb9421861d5f88b0904deb9ec637c997495ba85d93
-7a491a2b125e3a7a97046bb2cfc7187071067e6382a8da1ae760f513803404dc
-47a7f93b8f3a0b2ed5f033d65db9a5d5fd11db4f10152b19f4f5b2f48b8a95b5
-50145156dbd721997233961621f5a64f1e6513472e083c2a5357b08537c53b9f
-07b90663adf19c5028d53d26c4dc1c540c86e8f744c8e1d02dc76f137bfa6a06
-1792d82752b522e8911953e0f58906d47bf089ebc14dd0d9948bfd6ef2e0c892
-c8ceb39d382ebb830b9e6ae7cb522d189b34827f45c962b0da89ce3ff3e9f6b3
-967f59a7076733d65ccd8526a3b3db8ff45ed6c16392152b5593c94a1842741c
-2bb710e4b331fbd7bfffbfd77f81ef4d9c83b10eb58a2f51c4655f6bf062783d
-18c3c06ea4e922e60cef329de28fd55232aa8dd4224937a79723519b3b60504e
-5994fa207bf4e2908fa81ac69a2841d21cadabbb92498416a04630520b391c68
-30687dde665acc525e86fb783a3870ff43e0f0b55e50798dcb788ae93666564f
-ba7a6fc3742c86ef7e500d2ad2b77ee29348145b0738579189cc36d8fe15c5df
-dc4b66450947f168347afd5238e153b9f2b1d7f64373c0a90da71eeb18f72b9c
-f3e48ffff7c202ff5a7c2cd53a1c967f7d71e7cbb4e4159e5cb5f475ba0fef4c
-0713a2923adc04968030dff07fe9489eaafb0095e542aa9497544d47dee12c4f
-160ab99511673a43cc89c8629bba5f3863636b9ef246078815b283d9b7e91399
-e74cee17e147ed7caca02f203ebc977618ab18590e217ebd57e41ca020290d84
-f02a4fdb4f2b97df16b6cf7e3519eb810b654d0c50c4df1e68cd54bf05e52e94
-7fb47f105e02d1a4b7b78c0ec9f3bfd54b5cafd746322614ea56afa4d613d5ee
-6baa19c573bfd4640f9428f23988fd9f0ff4a49457e7bf1f25392d0d68eb89ac
-68f43c2c2e02bc83bb45d9f541bb2a6ad28b8c70516ca2476a52edb1ad4b467d
-63b970e2e40af4c59d46070352162eed10bf2662217b32ddcaa42b5c9ca7c486
-f3810c51a5c9f25af078ba635ed08620bb7b91818797cfbf47e7d9e22ddc1d47
-de4a7765c4566b479a1c66ae9362bd4bb7dc3db16daa5d27e79918bcc11e995e
-3055d826b489f527c5061f4d46606c7a4375ba317b35e43ddcc5811448489273
-c8e114b48d9e4e32fef51ae8e4440ba35f4c7ed307fc81cedaab0264ad7187f5
-0bdda954f5eff597f65759e538916efe1ceccdcf33c363a5879e78f1f47dd1d8
-2fa4a4cd61fa4d32de859714ccee93b1b64a3c7d9d6bec30aea2b10c896bb60e
-c8336dbcb047e66998ddb368e1f83b94bf3df73639560f568a5aafdc810cfa37
-f2c53a0f3a5d54fa0cc59a769f862b22d654472d9846099f5b5841d5f30982c6
-ac2feefef527613aaa3005607cd82cd56073dbf37d446f53c9509d9540d4b10f
-ba4198cee56d6c2448112ce7431a382fea84c92577de8ec194e3227b378ecf02
-a8443b9f395ba5bf18899d37b2cdca0df725fc0d3f2d2d010ef35d1d11009c9e
-23e611de999294c5b3854ac2cd44c6a3b5d93a2e3c0979f2aad87ad368478739
-94f0d9d78334a8cb0a9ae03cea4a9a211fabdb4cc1c50b325754e9c615facb09
-6e5bb94dc9b4ea3fa0470831cd8eb273753710a9d0e1122e0390c763c07b7296
-9b1ee534c46a82e62dd6d85eb1242f577a444cecd5caace05ead443675715ae4
-b2e89c8a3f861aaedfb882b2217c8a59f074ff7666d9dc0e77760e8ac0131580
-b4674ee1483cf7952d5f2614af279fe375d9e80947af930dbce773f89e2d1942
-55cffa5a25fec611208a5347d8da41d06b265537590ed2a18dd61244561f6a28
-6aa7b7d003fbfc182bf399ca86fe4f3b0f9916b4be9494dff4dde43d543b4475
-2dd8d8921b631588a792ea159aadc9a05b07bcb5ccbd39776eb733a2340300ca
-d08bec731a9d17bdfa35ba445f38db9efaa3f8bbb550cea8b742c00ed6237599
-9b9292275df9aae57f782a7ab34a92782a0b1be183913061201faa4340b54d8a
-0ae2acfb004ea2366aef056ce8a0a0e17cde94723223eec759e7abf285a133d3
-ce981716d305690e627509df3701119306b8e8adbc9cb7891bb5faf9a6b81e6f
-8b25275bee86edb442518ff110aadf7cb120bcfbd380af3c91e62f1cd51333b5
-6b25de8112c6d47e77bdd08e3bdf3bca8f20e6b96b687450b23fee7ded8099af
-31a25c939402b197b2356cf9d4d882a02b01a82bc7091775941e0c883f9ac2a1
-30ccf1d51440f8aaa64a2d0eae3c5ee5378b3ec57a27a6be73e3aa6676cdf3aa
-c6ad5603f20a30f032386d1293ffd63b98e751c6d937509bb27a0dbdd677ed62
-dd628e490b5a3852d2841774d6a3c16912b76314cbfd630bb48b958824aca788
-36dabb0ecdab2a2da7722c9e3b7f511a56a2498b329f11eb454b34b185704e3d
-8c244f54c36945370aad2050fe034726f739edea05b164662094962904f8474d
-263b43008f4ef5de0cc69c9dc7faa91c6beeb28d2bb977fdf96bdf27c4a49fa6
-bc7b802373517aa1e4d43342d90acb99f8db854b41bb95fc333e3fe0ccbef3d3
-de3abb46991ea91baa44fc52b96d5c5d683675fc6498d85daecc9f467dc76b4a
-f039a69902c5c677e998367aac1d3a765f52d55cc48ecefb30d709056d22c8cb
-b21a422419e6b9b9b50b3b5ea417e6b079d6fce2447322a960b74c33e4f7420f
-0ebefc2f36471c6f9997afdad5632ed7c0913a76b7314948696846b793aac81a
-491c8640a04a0867eb16d497ce0f26bbde677f840b87dc743122a144ba858a80
-1ce58bf6b3e5fc0fadec743ecbfb6f8fc19f778a3062cb14cf9556289e7484e8
-73e950c71c46b940d60a6a718fa72927e770e7a917987ac5f0afbf0c5b3c5ef0
-591455ae1aee69f4768d690148d8e2c831febd5b60203914c960015edd0a8e0d
-e3a47cb4e0093193dbd2b925bc3921f88b58d856b384b1f0158e44bee3e17306
-6c86c5a9673521f0c6dffd8413201a17e59a8235ec8bd63e60176ee65fd81832
-7782aed7eb7442d55164a7b35bbbb6413a36de24dc127cde8eeb9bcb1cdaee56
-7463bcccf86e738d7b5436d1079fc6aef850369c04139e93933ce920465fb403
-a1354553eaf1f8171fe79e61fe157bb8c9cdc80467859599354b73d983190ce1
-60171ad887b1d46bf64dcfe3c092a49e3b9447e1d2cecbc440a03a9ecea40105
-a7bd0e0a4dbbd18030887df3dc8271fad0a92b57da8202e425cb672cac0c36a8
-095330aba0cbf4635969d6f35d2626fe382ca7890b5743df92963de76e7eb4bd
-bb8a9a950ca59a553aaa6a94ee66b9bb154b86dae32ea20ce79de441228c47a4
-aa40949db9fe13d761781807d8e7adf991a26081427cf719ae656d40f3358000
-37330a4464860a41a0653fe5fd69adb6a733f84c2617420527ed720b944f022d
-890b2cdc2d7dcd26419127ad47a747c9d3e0f973ed50e9a83329294a7ef63b38
-bc297930be33e68046c466b7f44c3d374138e8ccfaa477db9ab5d83a77df8f31
-d330555acc08f04cc5e2126d4a163313183e0aaaa8645e545aa59c37efaa3663
-3c92a17a53afb715a6c8500dc1e2c7d454611ff5d7a60aa8859b8c3fec060f02
-c9576bda4ab3b101424b99e07096bb5cb7625bec43ffe2180635994158aa8b03
-2c82a993c6c7233d971d6c8306a2cfd45c787cbb5a1dd9fc01c9803689b4b281
-c82a7469992dbd60e611e37f0ed8133feb5ccfa57d9f091758622772fbc94e6c
-54e3b3d94983d914b3fdee77954be3252497392db6b3bd290c85e0a295f98c44
-5f87998274dbd62d5c724c3cfdc2385c6b54c8f073f9104086d618ff37bb4e1d
-5d571a0d41df55629c5c226317b77ec2c2441b5af0166517aacca31193143e96
-51ea351b6b17eb764be26591cf205855ff03022af47782095a3d03c805dccc44
-20fcc40f5a3aa7639853ccde5badc2a85248161a9266a60f17869ee89191524c
-f286cb9cef6a48d9fe8256fdc6f53d608f99b8cfbc5190402cbfaa58e16a0e87
-9f4cac054676b5f591f831c07a32533665bfc07dec0c8439bb4b51d54e35dadf
-5d81dcafc0bed1a21f0ef2fd67547f6f74815d8951b7cea076f26f5d19468e78
-4433f450bcd1f3b29bcdc72ec68385d908e773b6f9b1c137ca2b69b115d3bbc3
-05ce0e8217a1f42305c77b2bf244d298b53937579f5d54c94ee6f8607eee44ac
-06a657673402aa59402107aba64d49f1cf28aa48ef73d5d0ea01218c7b06100a
-9501fc2c15e5b67ad8f65eed9e42cf8a53cab1545dbf8c82803ec71a1bcda4a6
-0fa271fb315cbed111384051ddd396b8902ec7976fb48e216e3505a16a30e96a
-8d2da699b6160c8b3b5af59a00e705479d78dda5e08870cbd81da9868000bff2
-5a3311cdd21326a47a665c81bc450ebb14884ca84b2a7a1996a558330a7f17e0
-99eb457dcccd90a9d303afa279b45af41693612953c0f086d9ad81804d09759f
-c91df65a83c83edd31e652ae98f3759ccb963f40e83f532a98528911bde3d7cf
-041c6f8da633368d1bb63494e8ceeade4b2a50e6f3f4203d2ab275b751cdec18
-2509d76661094660cf22e58264dbea4738f5b2f05a4b6fe97509626f79561386
-3e78b156fbcd6ba9df4a2edb9d56251593feba7c510bce2768252c66ee7a096a
-0f350a5ae6fbb6c59f5369b3a94c7b4026f7f0670d7d7c01c9f4b58209a16b0c
-210167490ae40b4eda10dfcbb455c1068bb91d28634da73dc05830a33e0f2542
-848afe96acc2bcd8a138eae0baa5d1b31436751c649998f3aea75e95f5248abd
-d62f6425fd91506fd25f925097d6d67c6ca523f72e6a5b70164e0bc5c5781f5c
-04bedd5a784b3ebaa00c5ec187b9f30b36a0e3f6e4b249fc4fd085d7fdd36446
-70c740d4dde28e44a1210323dc4b1d6319328970acd5102cf9a049bff4e99cfd
-28ec810b2575aac8efdd65e7a9e6d929734ee4927efb0e25f843f9d4649d847e
-5917b6e18e440f23166d04e721696f18bbdfab79cf291684b3f0e8847007df8d
-114f4b3e7b7933859b0e27d019c0841f7ad680e54b25e7b52f8e729f9a62fd6f
-68757a9a650f6fc3cfb39f7ae9f03566b7d5fc87d765bd97e08e87e021a0369a
-34306fee74a2fdfb11f3b5f75499159e5c97a4f1558e78cae37ce871af94c108
-6b1cef84418ae4408897f5920443585f5029c8d70ed575c19eb1714e2aa53748
-f03c05bb82a355df1e181c1f3aec05cd63370e10136a3d912da64a717f66d511
-ff5edc9e42e15070b54455b95a52ceadfd2fcab3b3c338e6edd087123d2ed361
-ddcf924f61fcae961c6b8cda5089b4492f47db89088d80a994ed9551b977fe94
-8f2d92dc83f93067b38c91e873babd2ec1c32864f521770b3709c4ba93eacfd3
-74143d8159260afb59f774f70fc8a892f765e474b5e870d7a210ce552d1aa077
-10cb44f43b9c3e1bb6b0767f3de1d18a485316e80cff3a163b8e44970bfccb2b
-ea9f75157b99184cd1313d47dbbb21fca18ad708dc914eda5ad4122f7476fb73
-2c3a405c091a211756647e53a010822ebb8cfd4d331a97a1484d239986732179
-4ddaf15ec99812ed7f55cee6f8f015ef62ddc931378470c5c1ab335f5958439e
-f3f21f81e2993afb8f512783959134886b73df730f351e2135be658b38e005d9
-2be5950daae49a5db747e46f8376c1aa09c178b2d4d08674daacf05880852147
-6aec9a46230df3f4bdcd14081f0fd21801f7d26a0b0c5090a3e144f5f486d5c2
-85170c17145fa317903e7ad4a97315a8c4d0a9f845cb2d5fa818894f8647e94b
-feac033768c71dbcfc7e4b2ee4afe82fa0f63a2e88d191e579df6be30dabfb4c
-39116e045c791739845b789d2e5a4f4e138394c57ea1bdf03277fe1df2372e57
-824b4cac8751bf0d96c27c691b71ee19eaef51842d9a621a180af064aa774e59
-6d17c8f39b5095b8412fa0996136b523aa7e2d34a15ef1aa3860d1bc693fb986
-df92179b5c2c283ec1739a31c39df37e02570b2068fed8a7865d530b6b83e6d8
-c90755bebf25f806731eb5afe12c69b7b200595c5b9488511ce0b6d3e50eb78b
-b87384aff6319f53fe82a57e39a9758b4c2baa7dd9d237fcff940c7dd4e2dae9
-fd6f9814b52ae3952ae507d890e8ef4e46f47644d15663e50bef06e4c6e8f4c3
-c9bcdf6ce9c12e59442aab2209222e8e9c38e8d836e47401d8912b5944783d04
-2185e0b5d202456311fc41e3c9aba816d79444213f17d96b673bc819a5afde1b
-9fd118916aa3f976b67d40444085ce1295b2cf635a58d881b58e9d6da3cd47fd
-c385915a260cf460cd51d103aba3b9b7b718a6cfdf6e31ff90aa8abd8149720e
-7dec2fdc1f9ba1970dc589375737d50861ae4ea98b54f134d7870b435943e4fb
-50896149e3f419de19027f01feaaaccf1578410450cfb575957959a3e7f2b3a5
-295a1e03e47d2cc044af13c7f8d2e28f7bc6d498aca27d9503e19c7993795444
-50a6820f38c24b1415aa1322f2d3dc5d7e7802067fb426beb22fd9da5d3d7f77
-f7df61f59f5228d99e930652925a12436362de55a25f190fa33c3300997dc628
-ac5524bf2954d119407635b2f866e52bd1a44d764df26b66590696abcac99637
-6dc90dce6b68da6d630587aa9cd14fd4d9c2f27d8355179cd1bef7eb8f7b3ccb
-adaf1a938478ac5f858e712f0e908b394702a6e1129d6262b299a00e8767827f
-dd0f7d3bfb425b667717be47f8792fc7f852e2f3119a179c7d156e5e020926f0
-1a92a05ef6346a64fbc0a1b09ccd2a7e09d6e848570aceff71cd34ed28ac95c4
-03a468a2439ee50928e555086a6d40caab8d40dd847cd13e67f5acc91a12ef37
-85967f08fee498e5d9b562fa2cd3473995a0f76b860fd08393d4e59c38c86634
-f9d044b6d6184ff952b377691f3970e155f07412a640d49b696e3ea58cf60630
-ed965503ce7a6c0c145b6431fe0a5dc244173a089a49e0907fd2f8fa080f38ac
-ff70eee1ce6089611df1f488858c74b81518bd028d55b437878dd4d14e8d5362
-10fddd8c4cc9a8ee14e961481d0c0b00606084ca496a88edb25d984c34f6c1d5
-a85683fc244cce71b54eda970b9111a6ed2ab33c63fda50b49d343ad5eb6562c
-01748041fa0f964183d14239a0292d06ac831129fe7d7d34d0c82f1eb011f207
-c63fa085625feb4b87349abc9a065027ec25db3534c91ec2843c2ec4ff4d1b27
-1b1488dc1907ceca2d4eacf2d0c4d4c7ce6c42ac81ec78e853baf03d3941ccfb
-03a5dfdf040fbe9e61613d9147ce6f9c10e4f96797d15362467058bbe68804d7
-eb7113b166df726b040f2cf4aba8bbd3ed943c0715e09bd676cfd457a3c1113f
-eec29889c0e8286c314b74e4b39e2497c3c5dfda95278958c0995faa6dd4d9b6
-8dc6c934b1463734ad0c71e641298ae0aca519168bc667ecc7239cbefe78f34e
-465b10de38f54923be640a55ffb991a0164a6f8ccc09c5b041809e6ace280343
-0f447b22a97a8a7a340078fe1b765bb6f55d340f757ef8162162883ed66c029c
-f7ad3264829ac8c8c26f9d76d121167a912e1bc1e2869308499a1f8dc9eea626
-fa3f9d1ca80b45c3ade3621a3d4ba9ad3482a0e13bc7382af7157633adc45822
-d9a5c8a481775c8a69765c8956968affba3c77c115532c7680859c41500c13f6
-6f5b445374a79bc199d11930b2fa1cc1f8c76848b7a34c65f24a86acee4f02be
-4eda4c7da149723748b748c0adb67c01eda2a9c0db4e527f289281a70c32d574
-5486d18a49144a2d6f2d4488f61f0803805105b307e0ab0f4d795a0139acf396
-9c3cd6092cf0fe955653943dc38f9220981efe8d162caadd1f3587a5f434dd9d
-0a5efddb38477d669b1f2ddb90781c790ccf341d0a348112b559746dbcafc4d2
-e9c81839e66de708f12e907552c99140c428b13920f459a455832917abc1dc21
-aed809121dd4a9df4133b84378e413e62a0fbda75ff4e86fb8fd405dd3f252c7
-bed26aa06b485eb423c2aa83e0a478235240b19ef7f7ff1875c21831c7d50eaf
-ab4e0fcb929725dc92823eaf498c806a1b0102be38e754e3dc87754d1f480c64
-30d95da626a1c08434ad5edfd4e6be96a5c593b96f062d7c60e56a4a07152c23
-7fe4e29b99a23cb4a93ddec151cdc68fdb8428791987935574e53b8ff6c2a4e6
-4c6b85c47607618740797ff21b34f6a4a534523c649fb18798b55ed04d9080b3
-67bac8232a2be46e4d973f3cb860f1058ff46f7af441049855085e9ab8de8e1d
-cf035c13d86c62a1e7e39bf4cda92898a21e9d1a878f8cfc0c485d40c35d2443
-87a3a20eaa6cdb4920f6779fe9fc3832a61ceefda3d6b45b5b8c27845c2e9e2f
-c572e80423fe40d6d695d11853d03ead0e46974105333111101dd791c7b03f6e
-11a7f39a2d2232c9452df2e7831261a365e3e79599b69fa0b787844d05c538ef
-3274761f16f644fc94a7fb6ca0919fe5ee78539b59fd0232fd6bdf8e9e4b1c11
-485de6c6c1dc27f59fbdcad2790d1f9b9dfb1f88ff3330ca215e36636dcef81d
-167456983820580af7ba55c1f1c6b217f8a11e487fee442235768eb7b95fdf29
-d44ab8c385236c3947925137e26fd1278d4d3fe710527d9b017692b357aef874
-ffa8c09d59b78f3175f8fff85cb4d3e07c21dfe08db6c2036e98dccb11461fa9
-ef986be98232c893e25d76cca348df852963d1fadbc217658e33c49bacaf43d7
-1ba692b8e65feec21749e489c90ea26fae3540cb3a2af56b391569fbe2e6e1f0
-4e5a83c374455e1fcb6dd1adc2ed96007258416817bc4d1585625bba98ca3ed7
-f49f6439bfb0fe67ee1752ce1a678cdef7d9b02422858cc2fda1b58d0a62f598
-4f78daddc56c29c9c5d8d1fa7567cd69f58b3f6407f925fcadf6a1111978e51b
-1730a24ad9f5bd83e7a367c8e258c2d45f2dd5f7c3034690e968ec4eb4746a74
-d7d3316a6dac948d3db0b8d069bd2e833120668dd794d89f99166b04fed9cf0d
-b224d6985605512acb08fa6e27a8772e5e968fb66495cc618aa42862174f174b
-b400f59621a17bbb22087385ba839562281503632921c176c9e6c27bc2aaabec
-ef388fe9cb262e9305e78ec22a52f0bc54e0c4f167930de0558d3a3f228ac651
-932828895747c28573d3fb5e12bd7dac2ea2e00606f1e34ec36443822cfc8258
-fdb3b8f3a8d80fe17c6ffd932d63da28b50183071b30b198b078430f8c25109f
-710ccb6687fd2c3bcee778a5c80efb9edaf2609d275741575601b52f9b7fd6fd
-f99c10d28f4576c29530ba7d40ae384be27d88770b0ec8d870dd3e4a20a64476
-a30282b0e816c58080b09eb651c046ee91f52ac08f6c264a36099659d1e50e75
-ea75dd82238a36e7ca1c40cfd44ffc12051b06f24c2c4a4bf4bcd4aac42814cb
-ff434dc7c0a4356f4f9395913fa1df17e1ef2caf2f4afdc87189276b09988c55
-6b6bf8f4698d33e6acfc89e1bc25f0614cfcd94e575f0b881c1a8ea294996482
-ec2b1b0a6e4645d68aae01131692336fb74bacc9d91194054c76b21c2b01a8e1
-973e402e8915cab5c0b11da03ae8dc4bd570cf65746f0636a30c8cfb92752bde
-277aff02df8402201779f4b675c09817faac3b384f6b334524b08ae52b7995fa
-4e3c0a61f58fda7416db15558e1a6772a2349d2e1b1c669e4ba39a01b7b18c98
-aac82b5cddfde1daf47aad0dcb6ae96593904555ed04ec06a4595238a3508d4b
-4374bd37d3e8380f49c01f39c0071655e8b0808e9be5dcb715faa15c7875871b
-b9c75c2e0fccac1c5a597ed1d84a7f570b9fc582c6e54455551fbdeaa8796f01
-5800bd5e2530399b6be18f4e406e42ea671406ea691c732ab92182cfd599bba2
-5abbc1f25965c5696dcf2f2e9c64e138dc10bff55caa9a58a8c34519f8f50d52
-894e1d616938225abc73a28cb2f9216e8b7f1928a82194463a6092356aad8fc8
-35af7da897e58ceb6897ff6930e2712ba97e6c53c470d177c91300dbd04566be
-233833750c2e79b320c33fb7413c856a37eecf0b89c9079cc7d70f8c62e16437
-3b8f43e28aeb470b8865aa04be19307d3ed6ce12940a24d8d43ebc16ecaa905f
-2d7183d425035db5d77b518c34b2f002f199d27788664aa94551a7a5fd574368
-6d7a10851ab124640d58e0f67f0ad64bbe8c7a2654a29391485e571d5542f87d
-4d1b016cfd97584f18f57f6bf9e2fc514cdedbcf3ebb1518e9b53e8b64752eff
-909c7cd0a34a2cd3a945ab3c7049e255ebe0e40a84e2dd81d67e543ecc5a6443
-34450a5cccd34edd52dfc43fc420ef298103431ed1e49e8c2b4df26fd0727bff
-7f3ba05b16232f4c795f93a5912f6002c43aa243cf3dc7e4fa5c8d9e40e96985
-da2e3ead98770fb7c07cf8e71ecff35d2c255d6a3ab730ae6c2ceb3510752f0e
-2d8aeafad5a4ecb4c4d81dab5336d764e8b7df68b5088d6dffb9aea0db0f7384
-7593dce3f68c793ec780cce00e92e28a342d05f2d0b0d48fc23336c7e0dcd610
-a37eee3cd6863fd4b74eee6afd6f2235f92a1d32d32fefdfba511c8837d6eade
-7a27e375ff1235557486ef07d80a2cbcb0645ce7d1d2fd06247e2b52d47a25e9
-cad734659b9bead551871b85a2aad1340a9649467a791d89c9e40c6ccbed4f1d
-317b63eb10fc5b913c72e9457f0ba3aef5c50bc83248782c220ba4e1540f7192
-002c183e861eb1dc7f4f74a44088fee28b03979eb8e94e9392dbc24aee6ce563
-f4953106b2d7f71e2d38639965fa09d69d7c5569b416068612b32fe5faf650ab
-8ff820bb496ed9a4b025874f7477feb37157df5a35dda9a19a7bc3fd604e4050
-5a5c5ec5e9799cbaf4a8d525d2db9084f07395d03ed7a95e2adb4865cb36f3ee
-7a8cbfd35faaf669c4fde98ba282e5d2fdf8ca495ca7f1a054149d15a6138f69
-9a320b1a30f1faba3ab29ce4c5e4490aab404893afa88a1b7ae6731251e15db9
-b00e5f82f5f1e03145ae703849120f65fa475e1810a0bc636cf540ad441631a4
-52ab9767b4bc16efbfdb5c197501b0a8344fe008afae144c126eae037fdf9364
-f743c060bc4d17116e3a59ed0dc0e3218949c3d9259a6a4e0be391e8c8455600
-7871c3e0db8e7939346fe37f14d7a980cbd945bd85a78f84eb1809826c6d15d2
-628f170976117ed59290231459cdd6dc863cdad13504bf2da4c38ae32259ffdd
-f9325ce161a472c192dff26a10bbb74f2209dcea75a92fddaa50bfbfd12f6683
-3054ac58aa385b4e00bda8c962261fa4edafa0e85ef7fe908662b9f1c26cc471
-f28853b5c50652538f1b984db2197805deaadc12fb9cadbb68399bec0f707bac
-dd165f865a0e9a455e0a8e317b3b4c75182a5f4001c5c4dd68bdaab9896090e4
-f7e92f51bc147280b33249fc8785acbf402441e769f70b4d61991c51f6ae12c7
-6a26eee6986509400ffdf62268092c7e1ff78ae963673b60d874d2a57c2a1822
-d24822a1d8fefb88ce18b20d446f560f86e9238ef3e78d54ac04697c4ffcbc40
-09b9c1c2acbba6e17ee5fd9da57fa7e0b6aa720103862c9e5ff1567506b5e09c
-47fdef0cf04e4c10374eaaa0c47957ffb4fec3a9ff0cb465a10a5b6a09fdd474
-204ae694ed6e2b31cbe9333a6be0dcd9cc1a17672fc2be032386351c4ffa4684
-42810dd1c372e10a5343b97d6f623968691417bd32fbda32b1db60deaefa4df0
-c804d1c1926f6abd1e8d8fd4087a28ad05cd7b13080490b1bd03121270adada5
-e94a72be1e1c7c975d95690d4c2147026e373d2f464dfee782b5d074cf3ba1ea
-f669ccdd1ff040728bb9bbd3f27c2c63f0d381042a5e3d5ed43c397513a5aaf7
-62b4e17f1687eb9bcee0430b766ea8e1ecd137035a7c90b29e0e26b76ad542f7
-26fc0017903351fa32c9e9242aa77ced9f71623ca744ada6bf0ad855875ae6cb
-90d72dcff52084c7969ea06a49db1c0a2f11a82b5f524d1efbc7a48640944d28
-2c92da4d78aa8d13dc57a2aeb3f39e788e3563b5e6a36d78ac1df07dfc527938
-a12a129064b6e581d90308e2982fbc3d5eb92d7ab8b2e34cd0b2b9d7979def02
-e9a9559cfb15221889619ce00ba62c09dd6fb51e6acee8bada9573614a0ad0f4
-411d35ddb1c1d801a8970071bc5b7b5d1c41e14e96ee54208f17ba69ce95977e
-de58beab72e4c6bf484a8325a96153ed4672010717157034e02e78ab861f118c
-5ed3409b1db8f05f6ebe0ad2ced8008a73b3cd355da36c721aa40bd1df3f5af3
-41389a9b965dc43002ca70a828a849e41425c85cd827fe6e5416d5bf18347726
-241d22d665332ea27392009e81b3a24442fcc1b62832e7b81b02480dc6df345a
-ebd859cbe6a4d439b8400f4813cb9001f4c2fc67d86350d2004f7075a8264ec1
-e29eb0b255c6bb530206e96f39611d5446ec2c468acd603423137643e26fa702
-942d436bba71856e248c89000a6021e8bd2106861ed20c5b02ca4da733102b97
-7ac7e43e8099febda83003b6a4610a9fd0dc723d506dde420cb36e188c56bde1
-0a433a8a85589d9ca5fad1533da73075afbedbeb5358edd0e57492414a09dfc9
-418b0910b3e32efe87c0fa8702480aef1b281a5acf6d577e49f801626b9d5532
-d85ce8bab30b27c9053f740d9b1ab84812071dc7294fe5a79dccfb8ea3d33e6d
-514e303c806cc8d27852acb180e2cfe39c72181ff35c8799371fb5c0c0c002a8
-b1b63207ea72646785a35c4b1d6b7db906f1a1a814c102587a4640eb8db15ad0
-4d99460c843109555b33859b1aacb2e527d5aa120dedd7e7ff078de5782ff5b3
-3aa960e29b51b867c111a439bbae20cdb9cf3312288ad9eb549a989d863225bd
-a7991839644cee9cb7b2544b41e4777dd3f0dccf0337977e32c6e9791781b091
-2e568744cbb4a2c3b431f62385def0ac69ee221d4e339b407fc5641b1d67026e
-76e7c4425c5c6b8f56a1640c0b78c3c514138300fa971c220fee8ea1924802c2
-f58176075ad39d4c3f336a758956c1502539a23d67ca167eb119af5a95cbe134
-5989a25786ecb9b34abd0b5814468cc339bf0df3f63fd5032f0708bf0cfe1876
-91430a5ea81e649ff57f6a2a89e97532d7b58ab4d9be95e234885b39a73a7fa3
-d0ad9eba42dd20ebe1c4805641341b7a06ba786fa8c95d055de5b1b35ad51ac7
-d3a98d7e9ead882c5a0911fa45692e6dbe34f7fd318c17ed7094b38bf7113f02
-053f3b8a8c74eff956bb5c15f6cbf212059a2edb25528f60f67d6204b08ed8de
-b3f591ab5fe471ea4f602ffd6903afd034eea6b4fc7ed858c20d1e4a1c343ea7
-bf6283d3f3d8764f3b89282188941876679b48448645aabe8a04b8ec12e8d76c
-75a5500659e3cc3109962fe5c945979c8f56a997fd806f3838337de82cefb25d
-986a4e39416a170cd2c2bc223838d24b15330cb2352ba753bfc0d084886e7221
-2d275a4cc0faec6af2cb8591db187da7503e479c83d2cd78745c939088650573
-e9e60b3aa954044b347a63eef25daecc3aeff608cee0c3c3a7864081f7b237e5
-6806e57f68012877e0d4210e85d8c0f917c3172ca19c6fb9198ac8456dd9607c
-aeeca44bb0984130da6830522697fb5d8408430217ff9496275f0ccc323a9bb0
-52ffc86a010d14478ac6ed38eb6d4f5095bfb738ef0d88efbb5d26558f3691f4
-59f62b6f3d8f3c2bf2a87634d6b65b5c7c0dd9fea60fa51822b8e185999b4c60
-73730e89c0b8e48bce1abc500c1929571afce0ad11147bb0fb682c976e67947e
-6e02b7cd6aa88a3d578bbe3ea88a458629dc8799d34df525fb56b5618fb025eb
-c50f0659d9e9922f0dfe78d0d9c8ade1beae1cad423b5d63d43b0e50b8a9707c
-6322600d467750cfd7a4603bbdbe9e7c01899a3447ee96c66a464859cb0a886c
-baa46fce0373d84f6ff705e177497315d48a1b569ccfb7ff6802c2ffda806e11
-8cc119e9401e0ac7745971d33f21622cd806ef4d761d23388d632470f4c04ff6
-ae7a008f343d80bf70a7d02a9aec04ec3953501594ab91fdad11d6119e6e5ff7
-5055af6868e9ee262c36763b29813f6a6660b18635ca76c9ca7da158f9cbc823
-c234598ef5e858eb25cb422a0a30a7bbddae046b63b2e18832d73b7d2c2c8562
-31f88e8d3ec0f6a3a319b06cd5ca75a8b78b060de77d6108f14182836f2ba937
-914b433c8718dc06dbf52c11f6db1026d2e03418bbfbd297158e18583101bbfa
-7d932e2ed1a3d4bcb4671e9c35ad24732a296640cfe62adf680f66175fa8bfb1
-078b4f8a36b6a04c0534fd0037e9be040eab494fe8181ca7e99911f339d49a24
-8f084ff5bcfa9073e541c2b6cd2ea98e9818ab8594a1952a9a4a46ff5ad29692
-5a2043cb4ee3d9ffcf04ab6847b73b870350c32648193193b2de0a087262d213
-b270353988ee6dad64e54fa69ce113ba122c659ddab50525a5c5fff3855dd0f4
-5f8d1e6f4c8790ab73c2637a89af0adc86521390ca628b87a0b28b73d527dc77
-366d2bd2bbd51d881a0cf439aa85e19315923793aba81cb43ab8af1081a43f03
-8a8b6c6cf72b5f5d5761c279d23bab4cfe0db2c08b557201c583f401ffd20e7e
-a459c408130a1cf7edd311410d6fc05c7cddc6b57cd75ad08fb7bce952e0e378
-f6265ce9669177c624184dfd2a8bb7318acb4709e52224e44322a68e23728410
-e7ee378db5286996320a84ee9b00bb98cc9e6a1939ecbc6983827be07a8d2f4a
-7f16bfb7cca00c158e584965d7899a0a627163298030b8ffbefe9678289f4bea
-f835f749d878ad6cf3791e86f18021c795038f7dd00f180b9990006b9c8cfdd3
-630a37c8ea6ca98e5fad3d4a7cc68ed9aaf043b6a2e2974e1e0b77aa9e6edc4f
-491a7186ac562875a59abcdcf5b92abb49bb976a0dcdaf652ad02d70a93dddf5
-d2b2dae72861afc83bcaba60e08f5e149e5ad3e133b2edba17c77ec4bbdabaed
-57b9993fe76f41b0b5677892ac3520a04cd900070e589cdcabd105294c201186
-81f1d8b6d424c8f3d4a3311d1ba1fdbde82b1181fe27559e989364d34ce45f59
-54b49210cc735bde2d530d84de0825bdbbd3a43ad45e0b2c2369d7201797a873
-d13a15e97dc4011328682a38ba18dfb2720e1ab6060d666166ac3fff441df908
-0ebb1e3a8b039e80fc5c19638501988467a55a5a72aaf62e6f79ccce8a3095c3
-37a8454de4d221a3eb4c27c77bfdc4c1eb13c82987963ca769bace0f1306f3de
-5feb716b12542517ac79f5b21008654a9db7f46e2ae284c466f0474c92e4b13c
-286801a27516f2e33593188700950da279f55166c260b647033d6788518fb8ab
-8365fac94ecf28bae7951c0646c841c7374288cda7130b22189a0a9f54620c12
-3611842e62e411419974775609633d7b77bc5be483e13d4b34851f67f3395580
-b47781aad518df810601e7d7d297abfc761a2b86624db2efe2f11402a203ae52
-d8626d2d9830ca9e19cc6991cc818461a5a4b8bbc478de1699ebdf8a29f57436
-8503b18b699c98f0002f04018ed1f9f0b3ac9ce0f87e212b23774f8ace72cc63
-1e99c6ff814ab41433ea2ece6021ca93e5fa451e3772ad243090e0937b7484a0
-5dc02321d6c055a60436ebd4d778754f3e7e4605f4250e22b9cd1a12ccd814f1
-eddeb081c03244951cd43ef802e3aa5d1176417eef2d1c33643787f5528a61df
-90aabc2fc28a06d051cb52080a55783a91d9daf657518e5cbe6a7f6b91a82f86
-0dcacc75436c1e97e2273391802ac27b13af9bf2ef23277f2d45005ffceb0318
-45baa5a0f219ef6bb7ab7e4b393eb7ab602a802cc711acd271cfb6e886b582a5
-645924862d791d9305f4c3e72969bec72708b08ddd1e784bfd93e75b2eb90754
-0787c096a117759fb3375751750589bafb889d7c3e0d72fe8177d7c29f16b0ce
-96d65201519884c6a6255b50aadbfade3dece3fd1d37610bee5a31a614d65bd6
-980b7b2b12ebf02feb7482ce7fdeefc401fde075957b527bb07de743d7f8fc11
-4ad7e0d01bfeef9d19d4fb1d36151bc866b85489af274d4d58996b33d107e9ed
-b62b0517d4b1bdeab330f0281ee051ac74811995d148e0b0059986ecb5d17c28
-5fbc4d7ced7bbefe9f877fc303a0b0da0988e564a28e06a09127c34477cd37e7
-3b6a367e155fb2883cfd9f05f2df64d9feb9b379dccad9d1f3a123c3fd1d4ca5
-f8993ee3f62b19015fd51860bb3294625a6f936135d0b4c76acdb41b543d3de7
-c501192ae23f20f5f03cb3a2d463e3392ad6c5ffd4d33ed382bc3068be221667
-4f2f73a3e82c12b65e6a6339dadf3494a32e7f438629b7619a807d78ca6e802f
-52b450a4a60ab82ffb8345a3a83b1061320f9d4a67467f4bc46e9e86b88103e7
-f1c218b0881f7525eef46cd61719c018874681e6564294d37874fba063ffdabc
-24d57e553799da32f7fd498fbf053e626834e07390aecf277af8ded94146cc0d
-a01dc0e8ee4a1558a38571ae3a23ae16f6ba5069bef357692dcc6090bd2a5a03
-72acac2f7fdf52898bd539cde242d5ce0985339060e30a7b8ab2816eae920141
-47e70223801fcb31d23aaa237f9a46c386f2000681f17c9c2dbdc41e60e66b99
-ef318f557f62f9f375ffdfb97a439dea9143f0849b579fa4949be1066e28463f
-f2eed4f309c8aadc0ddf04be3f08edb096bfd656d8f567b48f157b0e24084899
-03b64fcec581ddb9d5548fd0f52331cc9746a7dc0a506bb37772f1c1c98d9ee4
-1dec9b9e3bf96fc73d40f5b4220ac1f3d2db769eb6267d985d3ba2fcd451a87f
-74321e8b1967d344f666a64fc939514b985ab808512861527253e0203387183d
-26e3f001bffc2fc25670a0edccb7e0bb1ae77acb8099be4e65d3df6f490ec116
-fa8b1ce80884b53b22547111d314680c72ea849d66430ca595053997e9669894
-12bf8a94d3efb24cdcc547f4993ca291653f31b16d64a0b15561bae47489681e
-e56df9f2ea964d6bc27ec9c33fed273e2c91ddafc0e994c61621adbfcef7e6bc
-29da8d114c35c48d87633072fff31627a095119ecf2014443b9b3d180a3c1848
-1fd0a079f11c60c046487904c73e20cb0c8558e63f1a1f03810430df48044b46
-2d7dc135e3dc7df8f8f86dab887e9f3e59e07348311276bc4451745bb0038f6a
-a03101638329ea3719c573a74f638540e0c6a9e26b638fc9e21aec2bbc9c12ef
-dca71884caae97a648e19c2d0d1d89364c47e7f8cdb68db910bf75cf31989929
-9f73d0416b472698c88b49ea6501ef95d72fd70702709f19e01457a70f9e9590
-e546dfea29d2ae0f97ff65c6b7fae6874e230465e5dfc37e929199cff89611af
-ddf0ccace45de017828aa0f60c12b4816634820fb31278ab8afcc4d231a8652b
-ed7ca3f05794958caf5ce60afa102a17df3ff4022531009c4fffb57a87b8a64d
-afb003137508e574a1674bb6a0a6e56c65916eaf7a280235673d4afcba05ec33
-b4924aa9a54d9dd4773a51b5f00e60baf0c950982db184ad0c96ac402a12259f
-22d1337b3c5321b7c8692943fc5655e0746a3ddce98ff33b9d13f884e9029347
-2aabe2275bced7ce59373a650d11cafd1a2f74394567c6491b2c0c1546f3f284
-6e783fcd8757d2b8570f8616d60e97b3830606d04f130ec22bb950efcef6652a
-01f8e358c822d788557c41d1066695db66f60440aeb80351610f7efdc2aea014
-4a682d7dd13851f6d187e9d30c44f3377c9cf7356361cc64e4ee2adff163121a
-9ac78e13aa4fb1112b31153c19b0d28f007848c1bed88a10ade265a8b606b9a3
-662683a775f94bae38e065681f7e00b0afa9364e56cae809771e53b826deef22
-4f6cd881c6b7ca7dcbc33806606c987f0071925edde39d68392a137aa17561d0
-8f14c811e8b51bdfe34c0aabb9f31013879b3f8a348e5e03f7c661822834e6c9
-2f6f64c36177c579706ae06e73c3756efd98b26a9cea78362bca4cd8437dfd98
-ded00bf0129da7508680158a213888fc8165aeeddc216f77f05e635d4a6c8515
-3f953a8039f9cd162e2778f30644ef6c13889080cd8a05b6fede9770834edc5e
-04fdf83bdb9422d18ed88b6f614569d63864c399942b1c9aef68272309e6bc7e
-52ebb157dec5104c1f9e0c1e3d9886403ca2a2515e0bdcf60e66edba0f340d56
-c1ad2b8d5518cc178bc4a8135121c45b8afb23de5d84f4a123172f9a71f721c6
-e4847c2f5c6d30cc2a966cd5526b6f98d85d3a8255c6a9776335bf2fa1e9d5df
-a154702bf15025b8cecf5bf1c66f0abc9ba99e54da9390dd5c04bb984e1c406e
-1e1c964e99a2f164ce3a6aced4af3ae77954e900d5508cb7ec7b83e5ea9ca73e
-e832ba8544107820e053627f8624e89e14301e18d80706ceabf0d1860d8a088e
-89e491b38c6428555684e9572c82f292d59bc8d23ec39cae1ca2e152805df3a1
-9b4d96ae8debbd4faba3dc79960ebf56fb18caff0c0111543d66f3d530c502dc
-cba972803afa6ea4f8149ba1708ff8748b115c523367244e9e2e9fa31c830d09
-f422f8cc49e5300de95eb6d6c07e7c7a29eb14c0ac30c5eef24219586b3ae56d
-3160839a2252f464860c32b3e74b23bd6d2deb50e23f547c6d8d60415f123f24
-e3bb62ce14d851c7d103e667373d6cd61c66513c79b0ebc72adfd40b7acb6c1a
-7086061551d74085fa458d212c8873e49658fae2c8c6c28d89a7f7c9deb4e1cd
-270082ce880954b8aa36eef316f8409e4835d4677ea5e35e1c093fe1d544388a
-e0b559b1245fbeba4eec94cf4a14be7c83bc8806151a071070cde9f13a8b8c36
-3d02b83d6f0c24c5e85a36b0fc2f907200d4e45fc4f5de13855ec20f5f9d65b9
-11b1d6f9544da2d5a5e2cd173db447995b351a722ba9122f4ba214465328eb59
-998296c9bf8d3ce6a95c458b9e0acc925cf33c35d99df1677240962cfa6e14e8
-2a0b7442b75223821213383e3785a3e3998e96d6305c61beff921606cf1cde1b
-d45be689ef1edcb04cbe2c7c317ea93fbce61db1e76f8ba6e5dd3fb265f52762
-59142336e4d375337a5545f944f6f8c8e50b4f524c3421b0316a401358a2d5aa
-8be973fe695518d61393ed4c7903a816535b7cc28ee379782dceb1ec955c2184
-8b9fb4aaeb7e19447f47f46ace999c7fc458129f215e4533a45e49bec7c5eb7b
-9474691c5dbfde3f56a63930188596e8264c3f5157fc896d1afc5f3a2e190f92
-33e8ccad3e8aa7f94b1068370f19075fb16efe9ce48ad789e905d0218bdcb325
-c7632a6d5220ff2b05d5401b06b5b9f3e2c2fe09af3f18e8a17eb6d0c51959db
-cbc76651bf2953b9590b7ec08b952ecbb1f8f8c86d08d217f04520cffef1318c
-56ed7eb2abbd6040a04032f62f59603bbbfcb48b578cc8a8c332e2d8e2322415
-a443a92afb8bb38026160f679bebe4638a81b259488f73b4301e36f052ea618c
-52dc0216c924e2b418fe3805eff335e6f2dc4517cd2ecf8fce49baa53c44b80c
-4809bbdced1f8cc72e35f362d567b5bec58f6e9bb8bb9e134fef4a8850a11c6d
-743ea1d516aa3f00f559e7432e3521c094f9312ea7613ee8a6b900fffa99b26e
-896fce4ef775717c982a136978884f8aef17d96b253e80064577dbecd1747c93
-75c16902367a19d0b5a8c6f14ef55214aeab3e4983d5d00b4114a07f74ae3250
-58c54d6903f26e3283eab708d672725549105992fd14eabe5ffa167f850de4be
-e473c356eb540e8bff1acba6ccae793f162ba95e8589505138460fecf8bb9c47
-0ef6f107ffff8f8a3c6e5f856c8be2f2c57c5487c9829f72a74b897258eca965
-58dc303c1c0a28503e9863564a07ea6ff620eda460a224dd5af73c806e72fa2f
-ab3f702a99e763b4ec585da2783d049a58b4aeaad5f4c799e3d2d3b1bf9f101e
-5b041db82f366084f692e914adbdd1240ed5d2afa22e7fc432f1bc194bbe2150
-b4521875c441a20b3d71ae58a63decd8cf47672fa04ae0e816902926c6481641
-2f139c8b605c1d065591bbda536ff18f93449ab8106994581811da593661da49
-6f964eee801f05bdcb631ed1d79e373ca07722e424a20e3dc2be63e6a0dfb028
-4234312463799b57c90aa43cb725ff51509ebd9852a37f9d643a81b0a4c9e304
-203512e475f467171805484bd5f6e38016aad5090e5d1e5f6cd4dbe6907c532b
-c5ad198ddd056dff2f7f32b75dbbbabb1dc24e971cc6768e388a612408a8577d
-dd6b5b8a03bd7cd432e59d34aabba7bee276bbba245000d5cd9be7f5d6a332cb
-6d73fa04674da67b8582b036d93ba3014eb336ca4c03119169ca8aa5c5ccdd6e
-297d651a6cbc07b8b8fffc95f56eda32bc6e748f33d07feba741a9255a8813e5
-6a788869ffeb0accb15e982debb0e81cda9733ccc8f79a48063d216691b72111
-1a871ff5754e21a7788e
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
diff --git a/lib/fonts/cursor.pfa b/lib/fonts/cursor.pfa
deleted file mode 100644
index ef1724ca34..0000000000
--- a/lib/fonts/cursor.pfa
+++ /dev/null
@@ -1,954 +0,0 @@
-%!PS-AdobeFont-1.0: Cursor 001.001
-% $XFree86: xc/fonts/scaled/Type1/cursor.pfa,v 1.1 2000/02/08 17:18:22 dawes Exp $
-11 dict begin
-/FontInfo 10 dict dup begin
-/version (001.001) readonly def
-/Notice (Copyright (c) 2000 XFree86, Inc.) readonly def
-/FullName (Cursor) readonly def
-/FamilyName (Cursor) readonly def
-/Weight (Medium) readonly def
-/ItalicAngle 0 def
-/isFixedPitch false def
-end readonly def
-/FontName /Cursor def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 0 /X_cursor put
-dup 1 /X_cursor_mask put
-dup 2 /arrow put
-dup 3 /arrow_mask put
-dup 4 /based_arrow_down put
-dup 5 /based_arrow_down_mask put
-dup 6 /based_arrow_up put
-dup 7 /based_arrow_up_mask put
-dup 8 /boat put
-dup 9 /boat_mask put
-dup 10 /bogosity put
-dup 11 /bogosity_mask put
-dup 12 /bottom_left_corner put
-dup 13 /bottom_left_corner_mask put
-dup 14 /bottom_right_corner put
-dup 15 /bottom_right_corner_mask put
-dup 16 /bottom_side put
-dup 17 /bottom_side_mask put
-dup 18 /bottom_tee put
-dup 19 /bottom_tee_mask put
-dup 20 /box_spiral put
-dup 21 /box_spiral_mask put
-dup 22 /center_ptr put
-dup 23 /center_ptr_mask put
-dup 24 /circle put
-dup 25 /circle_mask put
-dup 26 /clock put
-dup 27 /clock_mask put
-dup 28 /coffee_mug put
-dup 29 /coffee_mug_mask put
-dup 30 /cross put
-dup 31 /cross_mask put
-dup 32 /cross_reverse put
-dup 33 /cross_reverse_mask put
-dup 34 /crosshair put
-dup 35 /crosshair_mask put
-dup 36 /diamond_cross put
-dup 37 /diamond_cross_mask put
-dup 38 /dot put
-dup 39 /dot_mask put
-dup 40 /dotbox put
-dup 41 /dotbox_mask put
-dup 42 /double_arrow put
-dup 43 /double_arrow_mask put
-dup 44 /draft_large put
-dup 45 /draft_large_mask put
-dup 46 /draft_small put
-dup 47 /draft_small_mask put
-dup 48 /draped_box put
-dup 49 /draped_box_mask put
-dup 50 /exchange put
-dup 51 /exchange_mask put
-dup 52 /fleur put
-dup 53 /fleur_mask put
-dup 54 /gobbler put
-dup 55 /gobbler_mask put
-dup 56 /gumby put
-dup 57 /gumby_mask put
-dup 58 /hand1 put
-dup 59 /hand1_mask put
-dup 60 /hand2 put
-dup 61 /hand2_mask put
-dup 62 /heart put
-dup 63 /heart_mask put
-dup 64 /icon put
-dup 65 /icon_mask put
-dup 66 /iron_cross put
-dup 67 /iron_cross_mask put
-dup 68 /left_ptr put
-dup 69 /left_ptr_mask put
-dup 70 /left_side put
-dup 71 /left_side_mask put
-dup 72 /left_tee put
-dup 73 /left_tee_mask put
-dup 74 /leftbutton put
-dup 75 /leftbutton_mask put
-dup 76 /ll_angle put
-dup 77 /ll_angle_mask put
-dup 78 /lr_angle put
-dup 79 /lr_angle_mask put
-dup 80 /man put
-dup 81 /man_mask put
-dup 82 /middlebutton put
-dup 83 /middlebutton_mask put
-dup 84 /mouse put
-dup 85 /mouse_mask put
-dup 86 /pencil put
-dup 87 /pencil_mask put
-dup 88 /pirate put
-dup 89 /pirate_mask put
-dup 90 /plus put
-dup 91 /plus_mask put
-dup 92 /question_arrow put
-dup 93 /question_arrow_mask put
-dup 94 /right_ptr put
-dup 95 /right_ptr_mask put
-dup 96 /right_side put
-dup 97 /right_side_mask put
-dup 98 /right_tee put
-dup 99 /right_tee_mask put
-dup 100 /rightbutton put
-dup 101 /rightbutton_mask put
-dup 102 /rtl_logo put
-dup 103 /rtl_logo_mask put
-dup 104 /sailboat put
-dup 105 /sailboat_mask put
-dup 106 /sb_down_arrow put
-dup 107 /sb_down_arrow_mask put
-dup 108 /sb_h_double_arrow put
-dup 109 /sb_h_double_arrow_mask put
-dup 110 /sb_left_arrow put
-dup 111 /sb_left_arrow_mask put
-dup 112 /sb_right_arrow put
-dup 113 /sb_right_arrow_mask put
-dup 114 /sb_up_arrow put
-dup 115 /sb_up_arrow_mask put
-dup 116 /sb_v_double_arrow put
-dup 117 /sb_v_double_arrow_mask put
-dup 118 /shuttle put
-dup 119 /shuttle_mask put
-dup 120 /sizing put
-dup 121 /sizing_mask put
-dup 122 /spider put
-dup 123 /spider_mask put
-dup 124 /spraycan put
-dup 125 /spraycan_mask put
-dup 126 /star put
-dup 127 /star_mask put
-dup 128 /target put
-dup 129 /target_mask put
-dup 130 /tcross put
-dup 131 /tcross_mask put
-dup 132 /top_left_arrow put
-dup 133 /top_left_arrow_mask put
-dup 134 /top_left_corner put
-dup 135 /top_left_corner_mask put
-dup 136 /top_right_corner put
-dup 137 /top_right_corner_mask put
-dup 138 /top_side put
-dup 139 /top_side_mask put
-dup 140 /top_tee put
-dup 141 /top_tee_mask put
-dup 142 /trek put
-dup 143 /trek_mask put
-dup 144 /ul_angle put
-dup 145 /ul_angle_mask put
-dup 146 /umbrella put
-dup 147 /umbrella_mask put
-dup 148 /ur_angle put
-dup 149 /ur_angle_mask put
-dup 150 /watch put
-dup 151 /watch_mask put
-dup 152 /xterm put
-dup 153 /xterm_mask put
-readonly def
-/PaintType 0 def
-/FontType 1 def
-/FontMatrix [0.001 0 0 0.001 0 0] readonly def
-/FontBBox {-484 -517 517 484} readonly def
-currentdict end
-currentfile eexec
-d9d66f633b846a989b9974b0179fc6cc445bc7c8a959a39a32e9dce7faef17ee
-3bec9f509ea0bb8adf2cfac3626f0443046fbcbb211c518d48ebccdd3cf3d833
-4877f4ef1dab34759b6d38f757cf015a5ccf12d00a3239084905ecae5ec9d399
-ff3b917ce3cd4e85a1c49a750549d42f00f90f5110c822aa441ea813981685af
-17a0e41240e5c924b9c12d51f92ed0f3ef4fbc72c8b3eaef402c3befd6a52631
-47ff2e91ace4fcc6f381161f004dcd1db73271726d2ad25185a9b1ad0097955e
-b319d5f6d40a9f7163a0e106a361ebf256f5d931e06b8d9fe4e84e785bd29b7d
-fb70d68d41d66196ab5099bc38e613d11db08b2e9194806b651615dbdad9c797
-4bf4ad35bd0ce5d087baaee81b670d70d72475c0236751e9f2ba029abcb75682
-ffd70e77bbc2fa605cd824d77659de79f11275b5d6185386f0f39988ae683aff
-876ab78964fff6118dcb35b502ed5c7a38c6e7f898a352c307c6ddd0558702cb
-f9c763be246b45355d103ca1bf99d92e0f7743000d0019d4e66bac2292422b81
-7dd20274357d55680301b21eeded828c8836a5c47b12daaf00bdecf88289692a
-da641e1893c2eb202c614afd6b70524c9e2d6385de26e6f48a5959f587f80a69
-5401aeaae3c78d5928dc524e12cf874a89961e67d9d71db9aafbbfd960e6c395
-1f0ba3a4af64ec2379e956b2715829f009faa9fedfc79e06559cff13a4c8b860
-4a07ec9c6565dd8530acee97e2d2f0b92eab28e5299648f00bfedf9c87bd0223
-02495fde3f194d735815acc2e09bf4abc693de6e975f0c2b6b0051c90d727988
-c6a90a3dd10bc83e264984752520880d26f1138dddd805001ec71b935a8461cc
-0d6aa7cb0cb6c7c7cbbc99af3a513ac06848f7e6a222363f8696cf4ba2409054
-9b616ffe2d893a8f5066e6e7cdb21656530c2a720578af66d456de1723b3dc3d
-1406bbf7dfeda3aa3f649077ea7ec19f8bb18b28b876ce1f8e61dfc50d7b4db3
-968efa987e8479766356441906d6298fb426a428a1109ee9058d4a71235ff03e
-205a60f64b77d3e0920790200fe13d6676c77f78e4ced35f23912234da3b568d
-e729baa323bb7ebb41d72994261eac9f2c02709de342ae5c070d9e7b394a3ca1
-aad2e95d98c05cd4696759cdf12d16c3e000f3b2a7b5ea03d3fbb204c6d59b48
-e4dd5094a54aacd3f8f62d63b93e3524bdfa95fcbf75fd8be02544bbe661c485
-9f4a12191be62ca8b60cfcfba14097f4f7daaea4af8675fdec8f6ac22dd822e6
-bd4cbb2380c0ce2f6e7e4db197ba213942cefeca436f33249a881c60c77e58e0
-93100c28caaa5f861d8557cd2779911d42563f5fb8f7c890c8e24bebf300c3f7
-15d0854bb460462de7364c007c0be17a57c23959bda2282f9fa8bfc1571d7e2e
-5cd033129735be336dfe0efe4bbe19669e7c1a3f3d21e11c8ca081ec442fcaf9
-e4d5a1eac515db6b686f9da7757475c7b47cd2dafc56aa63208f5e0bdc127a3c
-51b9bd6796842d3089641604bf32ecd04874ecbcaa8c4be805cbb6bbd3988040
-8505740a2023924894097f466e1736c0bd795cddb95d80937d662592c70763b8
-97a8dad80e3467ee8192d4d8667cae0ec40a5bc9192d59eece9a405dd140f988
-ecb324c75704e502d088b5184cac0ee0857289ec1bfe9a2bee359911b9bb30ea
-8daade18b1ad9ea1c28b2d9aacd6e93833d9d8acb46349225b4d6b0e32cd7848
-fe8ec185522eee670d0cbeaaeaab94fe7904232249027292be36d2aa06ce4b53
-adb71f29d4746fe19cec148ada960820ec7eca5ebce18f19de5a7974b0d15b14
-2c0f1d0af773b4bc5ab79c7f16747b468ff0a9ce39970cf439720bab853ae9da
-c6cd1e282d0860f012ca867969474e3d396370a876dd9f603a6b64afcccecab7
-dc0186a089a815288a68564f62db84d3a295f31efe6c1b40d1602e40c8fc8ab7
-713c11ec7f175b31389f70bd3255ba32c10b2db0215aa5fddb1c02f74bf8c33b
-d4059f1f3640a4dbcbe0fd59bbc830881326e28b7c8d5b9704f95827e5e21d8a
-f720e3ce0c1bd124963ea970e1c4eaa6d340eae793aff5f8257f471937147c59
-fdddaeed8b547b3b98adf6b5bc81a86dbf9436d010d14b3b5ecc4ed9aecf3ffa
-9a4ae3b08b9cfd79370f4c6ade8406e7808ab8fe30694ae7bd9008c3507786da
-543465aa40f8ddcbcd1d561a5871be7f39c95ecb0e3fd7754469b1103c71d18d
-446ab34f5ea212f0b5c4d3fa8c50658466d770adc17f53706ff5449729b9c23d
-72cb4ec02402c38924dccbc49c976312dfc8f086050dd5a38132eb139b43422c
-756a95879b56babe8f77771f221f4f1f25d1a308064ec10eecfbb306eb55ee78
-2692db518eb3d477c4b52a182fe897e45c0c3d302aaa0fdc69ab3c26e55728e5
-5e12e7a51d28af01f104e5dbc61bd210daaa526c4dd9a93abf8867178cfb178a
-70dabac26de06f5abb43392964a7acb193fbf31070de491ab477a4c5492f4fc6
-4c3bc40d760d41ab31d8a3ec657814086a133801701ba8fc4dc5ba92b03b463a
-0f8bbd73b9bfcd6eba567e0c84b5ad5b32dce09e5edf39bd276d75c3cec89124
-a4a8bdf208fdc212469bc9ac96ab17e9df27ddd8b085dce1ba68ab50ea445bcd
-0f002681a8dd517660794d96bba265fbfeef267d26fa2a1bda94235f763209c1
-1f817081f930f20d2d0cefb9261e22eea39cd0a390626fe71d312fc0fcf11db4
-6b0b70010dfadb9c7725f419c1c89f34fcbcf3b268c7a4f838d94cefd82685ec
-b619d3f6df7571031a82e2d2a8bb98b8471d8c9febeb853ce0d38d7747c0bd63
-fe04e36dd00d2ef30b0c842d2a59457b3b41e2b8cda904a5d281290219814b59
-c4a75469375e9e0b3a358434a910bf1774657bbdc64cd408c680e2a09ca26507
-06f95e8c16735cdcca195f20c9a03a2a0ed60184c03f4e3478859c6639ca8ac7
-241b33432661741333406add1d9439690f07564d09f4b67152f32943cf93e247
-3f2a17a476bfd897ff69d4fefed1f4a994fdf535e3e45b1a3d46d560d5ac55dc
-2e4c20408c8ceb82d7bc21016bfcdddb8d5daa9e902c327261549ba62090dc4b
-27ad160070880cbdff5d022dc9c7d6f3f51a49af6dfb713308dc590c7dae5236
-74d7946c1db33177e4caa604ecf655b792be55e14272e0daa0cceb2afad8f3b1
-6558426e102f72ee42a5d9dff66d65d672451316fe551fc2923e4b24d9788091
-66457f55f9c83350a62bc5bf590f7135929b365c0dd003a95e98760472ce988e
-0e5affd7c654bb99eb4255bcf030fa008bde51daa55ed736086953c599bdc3be
-16efb2368acc883bd670d753fc7bbc65ec5bd797d0cecc14ac15f6423f0f22d1
-6b630dfe8736c2db51b45774f99280ea1274ae1c207ef3574e55478f68bac3b4
-8e24180f8891a2f3e8c0c9f74c22744830f1617b99a78feba5fbd752134775f2
-5ab542c17ce32465058ffb9e3dea8030dfe1ec82a1818c9bd1e3db30e25d8128
-9ecfaffe85bdcad5126fd461b6d5137d2b15cee2d97486f3266e4c49964d46b0
-db16d96593bbf257efaf0dc10f18e2f4f14a347cdcc220e8ba87eb215a66030f
-8f30d405308dc15ee9f7d7c92c607140a6bd1cd8c8274a507c5f12293327b9a9
-e5c3a13eec859919a805f12aad2f1c665d054a17fd4dbff471890585a35f4e0b
-5e64c4df9b687526be10da6eca391eb351ae661e16b930ad77ad33ad2a2777a4
-ef8881b5be91a83cbffd8b95a8f7c91fd86c71061e7717e4cb2f44f4ba2cf5ba
-a64c4f7290690036427ec227446192efc7c14479525994dd0e86e7bca081a9bb
-00d55ec51e1bdbb504c4d43463902c05ff0c1d67f3125b8ec48f5d1d394c7f13
-54e70eee5ec074d6a7e0dd6f3d2f006fe8a527b56a560685cfdbdbc9f5c905bb
-1dd508ec7829a13a2d49cad2db823dfae5b85f3d7c04c0d8ba1fe9878964534d
-c23e890fe460c0b25700c5f6432f420f3698c6a655296104eef778a5b125c74d
-79ca60a8f987e278421b0d4a311bc4ccd59fc3f85972091516c8a4662275060c
-8851c2532e2a1f72dca5c350a03fe829db297d0accf6458b10836d22cc461b68
-452cd2f3764a3abbf2314105e414fefa39686715463afcb6fb6782eddd94781b
-5130a77d16bbf0689bf64fcb46c14682df23e70f7a571aaef0aecfda9c889562
-080d3bf39422821ae0093fcab7bc29f9c4281eac9ca14454adf3ec397855c008
-fe7a9d64ad134fe9122f7650e37c17bce7bfca7661a0a11b45b42bdffff2decc
-47df5d33671daa487d7bd6a5aadb32e7257dc8d0feb9b7f0a4a7825fdb8a5cba
-a31a988477486d0f09858c772b8c468b794ab2db0defa88c3b4927b615bb34a5
-8ac9d9af50a150e991e6f4330786f8a4f98654558a4fec8144eb2e46a6190b4b
-5043ae396e7fca1eaea3e9a96c0b200826cc065f49c47c2797ddfeecc6e9b95a
-f2deca74b594224dbf75041f00fb37f3aa70b0b0eceb4343a9331e3047e86548
-c3a7b1a42e7af0792e02a5bbd2ab548f7cb8cd112babb89213f66913dc109d8f
-c1fd5307e7c20d7340372935cc459a795ebc9c4ada9136b71fdb3f68aac98729
-16052f949b6657114a04472fe931a761c4fc5f9b8ed340c16035889172f7669c
-c6dfcd50bdf910c615e5f3c64101e2e6546f252cc4e0ecec03c5e19249b37269
-a0bd2e68296f9627e4ff72e37bf3c2be74e3b34d259aaecab472a595af08b2fe
-db51394d6b59c390046ad76dcb8285a32c247c7cd181d2e386c6d5abdcbb3789
-3e8d9859a02c13a72743047d8880606488a521185ca446499f7adfc9a25c8ba5
-1b1c84ba24c0612ea3d957e76bc398457821e25844bbd906defed4d3ae434c39
-9e52e60fedecc1acf4ddecfe92452e9841eca92acf99c4ca9c2cb32afab1dc46
-d0ad255a851a78cbebac54fd314846c35d35cb7ea10596734ab79be35e11dbb4
-9d30fc29b140d5823f429eb8eb3d1fabd90b9c1509faf33f609b3ae40a48f873
-763b3a5d5c9236aa0a2be1661be917921b58ba7fba139796d4c125127885779b
-6c71427cdc5812dbb6725153a83809446d26f9bc64bfc2a2a4bdca0c57a20918
-4415951c5d56cff5a3824ba8f8c0652e91a5d9c04d1ed0d928b33801b98d36bb
-04af8348436aef4abd549a063eaed12f7a4655f5183515b067eccf550f7bf906
-abf1dc63139fdb1e8a1d2472133fe920777df1acb2d12f5b655e568bd42e381d
-861daebf84ed9c6db8d307de2bed017dece82881ed7677b5f26dfa34ac25e19d
-5837f76dcaf237de6391c1d6679dc1a981737ea3e07e729060a0472090d5c76a
-dca9262a3823f24b1ecb646aaedd7de4a319f091a948935480d53376703049bc
-a45851f924ead472f1b100ee7b4b388c6d37e6e9cb850ce7da81896c1ab68677
-c3298a9e5aa71ae6379990327ec585aa1e291354e44ad972d3193424a9805226
-f43b07992c5f1c5e01cb5d049ce2922dd2921ddb5c4dbce968dc7a340ba0449d
-11ed4160c846a508b5227bb5ae574c8c7dc5d43a0db7a0bebcc638814f8933b9
-03404c4e720929833b4a5d5b3e54b806adb35724c2ceb47d77d39e43465e7a12
-51da0d53106f41313f92fbf9cd992bcfa4d13054bb7154965dcf530b2e0cd18c
-92690f54a6c6d7bb38ff4c59d8e35359eb3ee07061356ec6506b2081878986de
-80a2ba253a34519189e706fee9906a723bba749cef1c15abe3653eb31c59e486
-a6191335292bdbba1c442b229b56e7180be446a319e811327ed75f939936cb0f
-56e123a274c843f27b94b35babf938717b4d02c2a673df0a88d35c35833c4d84
-1bc1d5cfb8a00a181cc1bb68f9dba8fb10ce8ff9a520d938ed21fefb140b5634
-8f2c237d2d1701e50d3132ff93ba3c0543694c83dd500000b829b705e3268ec6
-f94887386593f0e629f6e74d3cd192a48c20d0b1a00ec7b18aef659a62777caa
-3692512ea0efe4b8a4f2a138631b10b59f0df0fe27be23f2d3e1b195c2375be9
-6e307b3b8404d2cc6f798fc995c1547354c24e04cbe50d273b50967dfce4ec7c
-ba9bd4cdefee3ff4310358014dc02ef0be941c4a8273cce80ca9b8f75eef61be
-854b698a2ca1100f40987aa622fe8fd1932984e77e8c9781c691734caf0c4e86
-566def79a60cd4d3a3cd79f59332ac99315844424a627e2d6d38b5d6e81838fa
-357f0d137804d5a29abdd374afb2e3c4f5901cbaa94b8d15a5a8988a62fb92a2
-e06cf8788f37a1aee7adc0e67626d0de2881d822f940dd658b5f310a1c4f1bff
-cb7fc9fdb347ad0372127ab143e4d80657e5f0c364f4721d5d68ff624705da2c
-27090a53f2d481492c3b15bd70fc050f909edbc2bbfcea26ae850abf2c2bbcbf
-fc4ab4d34d006a1a41469e2c8a8f5b4ca5f9820d105ca12f1d1240dd32d955ce
-ef9de1e096ba539a3fb11415bdc0851356a40e0571a1033aaa55cc3f618f372d
-8c71ec445768cfc42b2c10c04e45e98a649e770a324defb330b84952d46e5287
-65c417a6a82deec37727a517c12bb296eeb5e6c285dfd16a479369bb85289a0b
-e24254e6ab5de4e3a0343e7f901c6e39d79902e7bf437087fc894556dca62fc7
-114b344d4052b3d7f84b07ef17199a938f69b2586ce6a9bb840c7dc1336e185f
-6264b644cb411a2eecdc43e1dd26ec51a837401cf78dfad608a3b9038f9a3a40
-9fc464ff2214599f8ed573112ac944b593ae83348f92c54ae5d6db5956de20d7
-4d48f8f6c685a70265766a97367ec2d7c6e1ac00c30fd3b0fa4d2891d013d840
-693f61956cd4dd4ad134886868a55d9244f58c27f101b321ddb99b4e2eb23137
-a2e596ee6d131304df4265d6e72f9425127729028cf2c3375a4bba7ca9363e30
-9278afe6c282536537034c787be5e9ef1a0053c64b461ff496050cfc8da1182b
-c1abe0eb88089e2d4a994108b1d24a2205f33f3293954b8e8102be94aee1e8f8
-d725d52e87e57a2de1f79c68ca6b5b36d05ac31c2d2f73cf5b955b602a1f2eb1
-6091edaca5e90cf43a1fc23a19e2fa06eeba82b15704ccb5b1b93587b2762517
-abd0e6375409f518e74d727b145daac480a52602ef35aa037647d7c0d403408c
-095daa192800fcbb56e5af904fb72d069f6a15d4f95897f530bff36828630bc6
-e4f83f82a6f0814a943a49fe2288eda1452db8c48cad67b1b6398e481ca1835d
-b0f9f9257fd3c6aa11a7242786b47fe196cb4860964cba7d224acc20d22fffad
-c9e11d0c6a4487b53654719506c04b2e1ec53b3ca316d5232b821e5256fcbc7e
-7ee284e54eca74acb23fc3efeee59e1dabdd4e9c46c7a4234f7e3e5784b3e65d
-32ebba3709c63dc9ebc2dd6891e39c87bf846c3fe524e434d98e2ad199230432
-c84c95422e8950c4323caff03a9de5daa32a5ad3d07b5ee831bd589c0e331888
-33ac8dd264a563457fe1213d23d0d14536ab8c1e75e5af941e2068d1ba9a74d3
-ada91585fde5c2797229599749c420c694108595966b815c96adf3328894e76a
-a0cd504efacc06434c27cbcf96009947a0f80315879d2108bd1611d6f4a5455b
-178b5a85b5ea739546dcf226c6889dc02dc08b5dbad34b702fb77b82069777fc
-3892034144ce7995712e3295cb7e31095f430622eec4117d98fcfd6075a4f0f3
-01794fb45f3a05e725588fccca124eeaebce479b9a835bac7b113dddab302dee
-6c50e47c8e87718b3867c99025be81d05a905b2a9335068b59de14733d656b89
-97d21bb34893b9548830c45071921d0f13add9d9b75a6f38ebffe39f1d2cc4a2
-2482a80bf04e13b0e3614d1326e97e86b3dd77757764a9cbf6a0eaa530450928
-0c5926cf98b98bda505da3a35684fd0fe656e71aa67ae6e7693d3ae11425e6c3
-7fe01890b287f354f747e4de8d5bd48451ce4f28ed4bbaca7fac03eae6525174
-6e75b117e4c7fddb6979ed288f81053783f49f4ecf3af9cda24a7dd6647368ac
-4f2b8108451496612276dd42d7281d6365810a5ef3cdb304fa2630432c5fed60
-ace8924e807b54a77d63185e7c7ec65c887ff17a3633322c0d4c8367affe2ab1
-0845fa3f85262ed12a0ca9c74cf1c0f87ff1233868b83238831f911e41845abd
-73a346e7ac01c2b07dac7153de91318619f576a5ff1c0f9ba90315c5e89b8f37
-cb2d8d413daf121e0c1b3aa7bf1a62a2ce28e39d7c43da5275e8f0972aa73986
-98dac6dca24adbaecc997ad0488bd9cd356dc86c15756ecb6fe2fac61d4553b3
-0b996e98157e29e174bab3af12176094b414bdd13f4145144f087c349b8a7042
-b1e5b9e705c93ade44defd86ffe43bb513b3254e8310ec64409e79743c2f897e
-40270fd5154140e0e65566556892c49762a351845f767621f5f5e5cbe0b67109
-84e30ad39832cc5f8857c23aa7b19981ffdec5e4497cb52da24fd1ebb53855f7
-8f87823ff65f6650f362d6741f496c21f8db8a609af33f6e60f858e7bd5ab91d
-9ac64226eae4994670acf610130e10e7e3a6b1e6f3a07b87d4e6b712d243a493
-d5280549b827378ace2f866acaf117f9094c2b15c2430624d2f1c9a8ed3c92aa
-7c3ceee15ef6eba0e90686949aee9f375acb97a49bc96942d20abeae79fd8e04
-fdabe92b3c8b493f3d7efb13ca6bb9b8d98c41fc4c4f8e171dfb2ac038aba4e6
-60724b873c96a9e7b7b4edb24f09e22c937c8068589afba95bfab3c0618aec42
-fc7b68f1fcecea13a54f421c23e2df1b04785dd471f82587616fbd140758e21d
-17a1ff6dc30b301925fb1d2956cfe57f8b1baa1ccf4d171fe03c9336bdd0678f
-4640dffdc2ea1834e5eebfe68d4c26c9d009cc04d0cb8ee8f4f0bc477df068c9
-95eb41e087a9a4c390ac5ecc87667aa713ada2cc1991262a20fcda33625eb9c9
-1f419c6723f2875f40de2258fbaeb821e2a398dc0ec62119c4efc1e7da92fbb6
-c0175c56d32e975115a12697fead8852b8fb75b23cef1bc53b8deaf493c7cf1e
-9e9a9ce177bd9a78ec55f3dbfd247f9367974984f31ba071365fd79bfaacb882
-fab5934f730081165771963587130b5a1826b618ee51001ea81ee3372507ed03
-545d33d977d4bbdd73e0d1f235e7a2e020a28759dc53d383a980958ea0e49865
-b3658294acf2a04e0d93bc0806150eb192c8fd02c5dda1fb457bbaf0f71fd063
-29b87327fb05fe02ff88f7850d17b65ef608e7857d2876fb37fb0665e634cb39
-2ef9a4e3751103c087fa26998f68fe730c0ae114e34a3d412e715c7a12df3b56
-862f24f1fa06f6cc83769ba4d310467b07a91ef2dd6bb873deee11f1f326c40d
-89aeeb8f7ab1ba650444b2d3f077dfcf18803f38942f3d30f22d93cbad14fe1c
-1d968b62b018525144a5d2ed4bc636a0c9064940ef84d9ed682004774d8b09da
-998824b6cd1e7efb724fe553a8566b51bf2c6ec6f949501ce0bbc54a9309eaa4
-378e143ce3e035d57beb62873b294d07b920fece0f58d5ad1c5c4c67d3180a3b
-33eae3ce510ab906c841ecd9366ff615f07a905df9810a163ddf8d681920bd96
-d7b2212c74a05cea57e1e474be64eea47b8433755d72e5c1f79b8fccbcf7106c
-b70022721bd1bc779bc3f59301fb393d4429bc19084e228034291413f21fbd79
-83661ca0f6d331c1657fa69e2117464b8fe708520655c58b3f346f9213630fe0
-a31a55ecfc61f5466ccda3138f52cbbd575a56d4abe425266cce9e490d03bdb1
-0f9f959cbd9e34505dc46b9a439167931828d18f8e2b8a0b5d33b4bfb64df5dd
-b3825d34568453b740127811f4ef2995d0e7a09f29d432e0e0097343d5726719
-b04a72b4a5e0aa2804d6f7e155e1f89a168dfac8d593a8af33c075e213c0ab66
-366fe474ddb9ca17e6e7bce12b473ede15fc938239f21583bac0d6951648cc94
-cedaef748a18fd237b8b50f36fa97dad4b0a2b9e4bca1eb243a60b0eea59df8b
-74c76ea6067e77c0fa5b0aa43330690462851f923f6503ca2076f6b3d10483d5
-a1e8871c08434f6f2707f7cdf3a68d7dbeb4f2c7332d01435e37787877a7a29e
-a59c1493f2a959981026d58da06923d04c47502c7b5bb7f151ad5f0ebaf72c93
-db1db631865b261af7835ab3b596e4efa81cbaa8e6ec72f784e0b268f71d268d
-517cfd39804d0759486f8968ec149b1952be695da8553900c7e7c6878b63c664
-078dde438b8c75888e32c0d3285f6bed05132ff8e81e393b8be800662356b8d7
-b0fbff19c35c9ba9326b36586a179ae3e8869af85ca655406e1bd5a36c94ada6
-f280d1352577263444122341f71b118c95ed413a1237a72a78b59d12eda3da5a
-3d9fa119572142e43ae69551a024fbce71d153a1a1c211288f878bdb3f8a9502
-4a6420b3ff69f0ffa246d5ae44370a24576118dcd8c5f28f6988fd922ffa8cc3
-af68ab7dc10d2c3bd5900b05060b984a063bfe7b03932a1a4427de62b8e4bc21
-4ef0c83fe86919a766478406f57d148ddc4ae0500e6e15246e31dcf0a7149ff9
-1800ade772d44268a63d11ee0f3f8ad11b01cb96d04a52d57d827fd931e7aa12
-f31373e2de4027c293a1329311510a63a268af6d73bb839ce767b3bbd4da9680
-4e36dad7495374b17f506f899ff61fe23f71310b8ee2f530bdb6d8c951fdb34e
-8fcfe71b12a555f174cd72428acc96eefa57652a2f5dc1a446d9f363c7994c53
-0159b89ec2694fc59cc9e083f506698db58d841d03f3961897168b96a3965a92
-500e29b74743e35681fcf93debff5785569e3b0e42b2b586dacacb72ceb0dfa9
-6c2aa8902fb26f1c3293177dcc7f70b54d85cf1ea4ca1a980e0e053bedde3eca
-0aca76c214fbed2982cd51892bdc35baa7e3ddd34da26a5b9302ded1de8099ee
-0e87410403d8f782f46987be974b25ad7766608525de89cd18bb00f831c8b3f0
-54db8cb4ab0ee2a9b1e63c8840ece040c3d7d763c7f65bf4ffcb33e7ba98679e
-2f2f77ea277314b42e94e936751b1c649afe60fbc8cbba2655c4bba13e622e92
-4f72a5612bd507388c7cfc8077209c68c4252a81f8efbe8b8f9799a947594894
-8a1d1087bd458d2436f837ddce87ebea385e3c44f433f2b775f6257b1f80dd96
-2bbb0fdcc8c78d32dc1e09521bcd9810fe25117326f2ba159a60c26d5aebae75
-8d8a422e14feebf2cc3d30e6c70e320d3448eb3edc08ab72e44824e5175790fb
-4a6401326b5ffe81fac99839bdc39a9af68eea930ffcb80223bf21e301c531a6
-2a523ac9985cbac3bd9e426dd9cf6ef112817313ec460f8b90a4a2349f819d74
-3444ed4872acee556af837375eff1b44dcc310f4ef67758731f7be7c1cfec351
-ada83a533c06701f63d2d8b7b2084afc5e7949ff250340351eb4b2886d16ebc9
-7cca76190f3a4a58995fb281a0dae019ed92b64190656f7bc5bda4b2532c52c0
-aa2d5ec6168e24b120ad5ccfc0bd31d631345c2e2cf3c7fe1ef9ca9cd4322b9b
-9d587204a24e18ae280b2ece030626bbed9f66f2979131ba38043a92d19429b8
-53e3475c7b933e054616aafdf0d3fb6345ef888e3fcda12985c2b2afeb2e59ad
-ed76cd456c6ac11d453deceb45655fe71a3ad5f5f770a7124a2976639a0a5847
-b79379244738b5a7b176207080dcbbda96f43a68370b434b348ab5631dbb1d04
-1f1082c04c564b44191a51afdfb3950c2b65f9c4ed4afb5f4bde68fb7a09d710
-4bbaeaab1612c1a0b1060fafeb385da056099a2765d69388d9a276601bc13a54
-fd114f2ce447e68ef452a6703d6fad6acc3bb591c3da0581c45de6f2edd02422
-aaed358aa940272865f7f93acc28460c8f0f5222454c05fdd3eb100219113eef
-5b0c02314cd29c2ff20f4e86b7866ddc9b8eca4c7256e9434091319ed99f9446
-f606dd0fe2e5b86e3237b2af55df6bf9624b286a1a9970759fe83b3bde380b8b
-df7132016d4be25517449ad88c5e6da4e292da5632eb662a898bf2c76714b963
-ebf7e7cfd268198ba84cbbfecb7c3fd01612f7c6a9f118aef4cd59307cdde680
-25d9f98dcc9542ecfe6a8bd8b2d09caf77f29e4644bb7b6ae295277eb8f5b733
-617f4ed5a2111a5d9eff858db8ebec3e59e8fe318c2e7a474f07c9f4234c9add
-fabaf11cac0a958be217bdce993dc99865333aff57576ea0e43fc70016c23077
-8ba456546e8ffba24581ab50e72fc463e2f524a07cc6bc11a347584d4c9f40aa
-8fe8a6873b680b5e7871b47e1103a77f0fdf2110b9801e8f24ca8218e4a9724d
-021144c9449ded25b0532a33d410bfef2382e1ef629e04ba1b5fc09d86b85481
-bd8b1f1d719cb01352c49e1cc54c34d115a6c1d0f07a83afa2acea650ce304bd
-919eda435e6f5a044ce65aeba0884f5099d860fbbc90dabbf0ae5cb1dd59555d
-2ada2f748f3a74010519af69b8ffcbdde7e88de7ed1b0f53c255cbfb8e41fcb4
-8c80603c8be3f3965b3af9f94b027dac3754764f75509ca2f554ac1de60bea69
-a53d7a9c4973b51a41aa7c0386117b6353555b31670c803db4e475c330be39da
-4d10f247ecf2992f3e3b35cc56bc19ec40a3914da09c914005419448a633518e
-3d4a0ff8c39f6ea57917fc87f890ef834dd2c6531b3fab0eba79e0f580c19291
-9974c58cc1320d8e66765886ac966a55e594abf6fa69fd1ef3ad7dbe2d964495
-08dac3b161a45e836755af3ce6b0c3e3247fa56d71723e41838bed42de4404b3
-967c900ae419a7006f0832bc24559a56f417921ff6c83120e70fb9bacc6ed431
-8563d3a82877b5c1422cf56cda1305e7154ad1f63873237de5ac6f382217c4c1
-17559be71ea1491edfc3afeb9809fe0b4e9b6e830a48af9798e70c9411acd054
-9d835fb1466aacfb17b7a863c7a1cdc81811c220007ca99454e8c423ac95b8bf
-13ea2b29bd1af8ba4e56662df2eca3ac252b683df1e9ef0cd47326252131649f
-e64086725efa8a6886b8c6dbf56490143d5d91ccd1c1f3db4c78ec614c3f6ee0
-3a5cb384ad5b7f3c7e1fa13ac9cdbed4eec6c5012de7f3f48b41531a79708f53
-d5f16ac0b89c06267e11a5fb32aae3ab16a1782489945c14492824724206dddf
-98cbf03cd9d969a543ea1d516df6664b4a839281b179d1096a434bdf08b3b6a8
-b0231c8857f9d4b4436f9c02211b6af4bd22d073d008bb8789545b7f93635082
-641c6e475c12ce89c0a4361e91dadca8ec20583003b1c9306122accc59fd089d
-28757e3e3324c4bde7ec7a161b49bc994084a42880693ffb8676366879ed7554
-43661ba1326baaf4dc099884f753648a05a37c71be30b4a3425d768b049a00e3
-2a3f3c3b12ca5c99bbf419fd25714cbd00a850c7d84a0b4c3e5346cdb1964a0e
-9cd1ac316f017f6dff9679091a6e93a70fb6d26072a2dd886baf9b4bde98cfc8
-372927bc92f28bb3eaf14252c7661be1c656129af8b3e468456ce20f872bf151
-22ea95d1c79560268976be3ee9bacb2a468e1e84c8c387ac41d3531742ff094b
-c3e14b27444d2d0dd8f4dc738e0af4133cfdf7b0808498646e6d28b738e80117
-870bb74f8d4947a15100bd891188a1609560000bb7bfdcc210508903dbdff736
-07dcc542b58699beef7545cf0456b8ecda464126c86ae3db47c7ef6a6477808e
-a8c1dc20768895055bacbe2562921d078fe91794be3ef5ac268f410e4ea47f0b
-68bbe84e54fe139dc9f18808574ae9316e15d0f3db78ccb4c0a8ac63ede19a31
-09749a0829ae1302fc18d38d27e43cc24dd43b091a58ec394f998c5fd4145781
-d6ef576e99c850fd41d46450fbe5d5cd4063d0a24c8bad4a45753335937176df
-36d2d60a677fbcf63d8342232b3d9c0fe3062ce4f1ba853b40bed54da124d913
-4ccd113e18fe2d0c4bd55b58fd5c5fe6321996316eebcdaead6751004dc26676
-1f47c198fd7c0b686705a63a8d2d7e79fe826edbba1d166822aa804858c48f3f
-2a126fb0e7b2d0b4f2f082b78b98c2702f5ff3e4307e1b55fd99ddd861bbaadc
-90075adb2581c3d4e5ecbfa5bf8fc2a4cf6df7bdc0e3382bf12e612cdf016479
-3e237ab37bb1049ba63bbbc0da17d1ba3f98d88ba38f98d7133f53c2b9e87889
-5304664b4d5b6a43fb2577c5ae332fef6d7b7982e0ffb57b265d0f51cb569936
-8fac060e6ac472317597615711d6c13058b2f192982a9e858c093f854a60ae49
-8687141101d45bcb53dc69d432e0632265d8704cfb3766836caa3b09b2a44a1e
-bee69f88f9b8e62d36dc16fad6fbbad7f15c91f1d2431ec61b659e9072fa34d6
-8306c715e2d111f834f7d9fc93a902976ae995bada6bdcfe09d5d3a67b247c74
-1e45d070c6e02c7a9e4aa540a8fe3a41df7fb4b60dc943bea339219bae869762
-223c7492de1434dd6a75c0366624f936179c494f7166085416d126a6bedd962e
-1321f9a2e1b359ba90023ac18942f3d19f8dc7ea36468d055d68c9e758c0bd3c
-7bd2b10e7567282b6fe689a2c713c3272a664df39acf1eff9e3a64a353195290
-4e100ec249c9de6196020e30791284f028f8d98e4447330cafe620642db22f16
-e4dc191d9c2d4ac9b54c1de35a59b2d3138fd686741e836d55d4b12ecdf1cc85
-5bcce70a55d9dccbd33005e654150899527801be8ca74b238a7be4fa846ed624
-9e4d5a6a0fa190963db0d0b8c5f982aa477bd202ce0fa2fd54c3cd4d788d3eb0
-1317a307682c2a2813b48ffd7603a4b40d79209d49eb456064e66cdf7551161e
-9204ccd7d84c0deb458cad1a4556a1cc1e7df0c815da189fd9499e58c9d22610
-f387782f059929860518d3ad42cb245278dd67b01c9e3ad391e0a57b19fee753
-824cb856bd538a05898ded31e347c26ad123ff3669ac5b39e137d655b1c05899
-a9f73546d556290347af154004be5e9ade507c27292e9c60d8a2bdef92d57a90
-89ddeba1dfb5bd781c8ee4d036bb8b67ede9cdd533269c40a7f862a4ded71e16
-cd04e4f144cd4e2070379f4aee9c47781a15b46878ca5d640e0f434010cc15fd
-220aec4821174563c17e19cd934cef3290b3462ef9cb001b84991f29e8de05ff
-686787bd434149a2dadd81e4bc4079c31b7f19ba28eb7240a06b9cd5b5e11490
-66573636e87e5c0a10d0ba380117618f8bcdf3152826b110a7218c329e49fedd
-c3d494bda6c0fed8ff7da20da6a9e0b54ec79af50c7fd1577bc4c5fe1bcf35d6
-891091bdbc81d468935fdc75756067516080fa9f6cdffc557537b959d150d86d
-9e0e1794de22b011073e79eec4ea6f14d6ffe0a75677d20fc0dd0391603569bc
-8e7ffee11b6b4f75f081fe4e7a9eb847a49d11d8531bdad6a73f1b9146625294
-85db9550e9ce21213904a4f9997a83c1bb9d53f5c2099ba94f56bb7985fb1cfd
-be30d619af77363e943b7e94b12f88fe3f3a1900d722107350b0376291296f94
-8515d1b41e6bbb5addaf252985596f30df0aaa37b0e16936dd786cdc624c68d3
-2d796eb0faa89df09f0b41980b8b86009b682dca85eea7c16638d99ea711c631
-35a79c1d426ca9e8782007c61e424c8ede1d72dbf919267d25c73727882557eb
-f78da42d7e816cc83d80b95f3bb86356314e65083022a08f82148044d071cdaf
-db03c7e44017af773f0e7d03c2124e3bb8ef458736c1051f70fa18536395e521
-cbbe933c514747710cb9edfc30f774f75bba103b091e24e4811b4a8b9ea2b492
-de7c5ce1ed103b70c913261fd04caf13727c6df5d246a419c52f175e580b9f73
-fa96742e4f119405174784450411374263d2fa6d277cc0a9dd60c97e9bd91498
-a7942547c6888fb80f8f9a4a3640aff4c00b2181e9a89f367a680cd1932b7ccf
-6e1604774602cf412130503d43f8bc54bee8514a24da005c733295f022f6755b
-e5387da8e24854cdb5a73c39b1c34c4d1884a4d234adfa8d104c004efacdd2eb
-43f20ee50840d297bff0095bd290ed796f726b506e316224907130eac9d99a69
-3a62927d3ef4bafe96258b2b391b373b255a84d6e9d03797f0b1db056052a5d7
-4d4754284dac23a05ad8f2a0c823a8a9add8669678c9acc3d1d086ef67e116aa
-2542986d3a021f8bfcc00f66e812c83e1235990d4adeb39dec07e62c10089c93
-f1801ab8f6210bd328aaf6d44e0a4df0d5b2ee8ad1c8f2a21f43e4f9b897ada3
-88653a83ff3cceabaee4fe26de33ad5fb3337e48e35d14423718642c4071a56d
-f39725f27ad0f2a71b67a14708e70007bac926be651398bb19746f14d1271873
-b7d77ac822aed13b6689b311ca57b895287e16acaf3a03cb9424dc840ba5fd17
-543bf2b93b4a11cc9cb7f9cdf118feaab5d22244096b4ace849d8e51c9b86d4e
-4c14d5874bb374b75e8e468a10db921c066c5c095c5886f4f21b4cf32801a1ce
-ba7968215ea52e217b2f892722f3749460b65838227b45b4c697c2f7d9ddc59e
-e76a83887354180d4eb39a789f0c4ce770f54802b55c238b5189e8809bc29775
-e02104bddfab6edfb13614960b68a49f8e903e6c53d38faeb9472c8bafed7516
-0fad6c4b186735d5de8f6a655ca46f880fac0981383b4720fbb3cb90c757de45
-8f0036a7281b877143b5ae8d0bcfcfbf15f7fe641e216d09aa391ade483d0b4a
-f304f07036ba5b7f32d9f2d0c8969c4f392fa855dbb57940e80e56b3209853cc
-f140c62c9af0a44b180280b95c9af522e77b0f32de23eb5f7625251bfda99170
-e9dcab1f6ddfc1fc7d9ce75c8b9d9350a73823790b789a41b33bdd12e5f527c3
-6785611b74f8232deae963e873156e473f2282f7598d6b05275e8c5ebeac183d
-5239da1e92b56d987cd9e8d817b2be1730651955754e028b4041189921f28683
-8f80a3097ce2e58784a85a18477617d1565160895c588601d71584c097711d07
-fceb3809a57de8185ef6f4492f0ed8691693cb3c83a889f4116684657f1aca5c
-d954d0c87ab67b71e6f13358a83c1a651805a7d3571c0c9791cb761014129388
-de2dea7ba4d0e10c3e3055155fe5f713e51e35d927ad9bbb85b033b9c6d94737
-22cda751a32c178a3e9a526ec9f50d3ea4dc1c4e979597a1f85e3d4342e25e4d
-2bc78e24765ab3cfabd4db25c870488c2d5962756d737bb1c27ec5ea049e6ae1
-91ea186f69bfa8c8969c6c0453a47b73d9f6550131e73f00140249cd8dfe74c6
-c585467610842babae638f2c67ddddde42cf80d561cb19fa06a3b9ef7dbeec22
-e0083cd8916482c5badbcbf03e88f28aa322480baed5cf147f7077da4368da03
-9ba3ed7a96798b9bf4af20946fca2d5cce88915df1e03bccc0a8e8c8c65bd6dd
-6b2195c57bb04dd20928222a230f22f564f51b3e9fe79564525eaef5d017872f
-3020c9326b49682962c78064c067c2b46fa3b94567647e04e9e059287bf2895d
-9d9d169816cd864157c41b432c86626680157cd9e3bf1554965ccf68d033123c
-3667deb2680ca27d3241d6ad950b50ad22aa3166f566c91128cf9448777a33e5
-15a5bf3acd90e0148c7798a5a3875c7aeef66ac2d30c16e9ce00c71c82484f9d
-39ad43a5a30dc01aa0e0bf5e18d0f91f0fdfcf8c30fb6bbea79a848af26d02c8
-431733f1f7e82fa4b37afae125d374fc172d1c9197ead90f986afc0da1243ff9
-97d02fc4b4b5c340a748429841b3a8b56cf3f72aedd6a4d90575fe7c781667ec
-155153ca416dc9eaf8df3830eb21e077653f595ddad569d8bef8802ba2d2e2b2
-7123b7f55745380a83080ea954ba9f2c9039867777b33d1d3dd812d4f8166baf
-9e1124da1b7abdd6c69596cdeefb999777943235314d3098beb54f8f9ed68ec6
-b6acb5aa9d3347b138636a0718f19a06285f194e7a7a81fc94e4d54110561e5f
-61b8fee49f71566c8109162f879f16b80e3ef0342c1000e0cb32bb3b81dff1a4
-dbff77e91e6a561630848aebd0d1c40c5f3129e409da578238889870a7bce285
-b744707adac54c8091b1b1f50390f2886144294e036008c3e4f20267974310da
-229b68182c2bb1af96139268da254217c47e5e2bc279200d858ff72a885fb791
-43ae0be2efd2ba6233620c039a1d47d8b111cd330609cb1d810279a7882aab28
-0a20204aa812c580712c7179488815e2366103d96cb0d564afb0f5a020493076
-46cdb743dd9df4f304a60871e597bda480624939ff921d7d36957afc64d5a507
-a48f8a087585bd0548b1f2c5a4c72533cef1db0694faae62c035bab307b765ca
-422f221a5536c51eb201ff03b81834aa581f36c62916dfb1dac0a680f1f4ad6b
-2353c8603e960f4a70b2aecf44c0d134374c35c88a77e0a62b542efe834e48cd
-4de9d5a989923c8a6da285b3f6ba2e8ba4df07e63a16fe98bdd392df72759073
-f7af0cc58e8f279a232763a8a9d18dcb205350cefa25012c0183713203ec50d0
-f2d6bf83edbe9a6d933ccda8b1745b183adf413617af83605120075f49db2a24
-df5dab6f8085d71c4eec8944dde3ec0c1e51b4800a90116b25204a3e51def988
-eaa3ddb44d44a052477e2ecdde55d0282a5a9c5f4fe31f1d0bc7f40d1f76866f
-c31db401b2865de254b1699ef0660727bc944470949955feb0a8077be04a333d
-72de1f17e061040ebb66504544fcca2ae6b1b58dec1478967b7b17659a4e8c9c
-fb5cce0a95f52d3b5b9fae59451608518b907aef2e1e94144b72fc846b1990a4
-69674c263d050b38ee61ca447b0b25043c980d68fadf6114bfe9319f27ece2cb
-2437c5e78984c9599761d264bf15379d554540b13a2adebe9d5dde18b5663650
-025f9db1e17d5ebdd776125112f32c157d87978c564afc1ab4bb9d734689edf2
-e165cd4ed1eb93b699350d5253f3f869953eeabb6add680ba6a2d840bb7d90b4
-c4e478460059c38a99be0b7c07173b2fac2c68e242e9d3a2eae427c6fb733698
-e429a14c8b04fa08bf6b9980895b4706da12e7f8cf42fe3eb14aaadc87638a45
-704b14972f1df00b8e7a9354c15462ae600a6a8c4b95f33acd11a7da207e49a1
-192cf225d16b58ded179c8ae20fa7d6ef7fd384e7941a588fb7f8c5c29d98172
-4a848cd2a7109333f2a5963f2f42c6835170a57f92c54f03fb2bd434364d6a55
-d5adc8f90b553cf66848ead1de1197b267061f83442021bcd668fa332f3f2034
-143168d02812313f6abea888a321affb1a540a20df468fa35562ea4e45640c54
-e03f932f5581de862bf2bd2c05d2c995bf6ee2039a22ca68c9a71990cb499081
-60b1ee8c5dc10c9174e88f2aa5791908fdc7f7d37e7bada45f04043ee35d1dc9
-ec3704d315bb4e372ea62da6580a5cb5192ec21865ed4ded15de27bbb1672531
-bc5b4c3b2ac266dea3812192324b38c50e264f2bfd995e3a33119e6b47f23fd5
-51271d0a7603da01412889b76031948f722f9fdc54012b4ff53cc77e9a787946
-b79a81d8a32577317f3c7f715f8d3f0daf03877d06d4161503cc441c723166f7
-40e4727f23a4c75bec756e4c40b0cde10315afed35bf03d523d6ae00bad2dbd0
-358e691bf92867237ab36951657aa0c4d79726dc75d8c1c272da1b3d0b47f95d
-2436d59ca941577a232e540928bbf58673d51715188aecfbee7aaa56fa672850
-b047bb56b9c8ef5104b10f8117402b229e483c863d4831b9a1efaf164e99cb35
-39c0299e73158510e5e1f861a6715b979a9982dfd800b0e38a394f169f0f3d9b
-f4f931de232db24c616bf79f59719e6bad4e451df62e9769ef3b2e74033bb0d1
-437baee3efb900853193f6ce69c7d28a871449e9f84909a96e594db7fd08efc1
-217482e67b2e02065e60f4dd931136556c80f39641860d84b7354e86feef096f
-06e84d35dc3645f05626b80e24f01df1031a4e1ee3df4fbf139d27f95926ad14
-fec86931515bb225c1334c86a2a59dbbfb13d6558d389a7202e0fedce9df3d06
-3c4559b11255d23e5a45709756d857060f186c9dd2cdea53f0c3031a4f0392d1
-4beeea8c705f18ae48fd22c8412b71aa4c62231bb9f34d2220e361cbe109818d
-1b6b0be26b2ff128546d68029dc837e42204d73a35ca2a18e13c46d488fbf3bf
-7f6a6f623085e42743ad29b3b9c042efbd195dadc87928ca26487e711463969f
-e972c925d517c754fbf308c3a4ec5c604359a4c8fa57e8db4ab77341dc6364cc
-c6d0640113d541476389195295d68984a2f25b33441d7d7bdf581229503759d5
-e955ff29ec234f2a7ddef7fa898dc3ef0e82da664087a42b6dc28d665622cd30
-92868e09703aee3764518038ca3969947a1b4e63cea5d6a7ec7aad6e7577b88d
-2c9fbe177a04401747ef15b436b75d660c7cbbeb77bb44e430e9835ab409c2a9
-108f94117951832a5a0af0a5acd4e8233fe636a348f252d22fbfea95a5eae39d
-d145abddd1467561b7fb12660b7cbfd5cf9cd84ee2988ddb6d56429e4b87fc44
-6cf4b70f45e8fc082d7020bd6e8ee33c6b94fefc99336031d219145fd293f4ac
-bce0f52f8ea974d74f2b858a3daddfbfcfd50c3a778ddadd1d1090abf318fb58
-2129ab1f2acd880911be86a256af0d0f74657d53a339a4f527e0e9809e47914f
-d7719db5db1ab21f486d85dc8852e9e2cdce6d35f5ae66b361980bc0516d1d12
-51f9444d3830473e30c9060a76edc532e8d74c4fd22b5bec03021bdb293a3a60
-9d8fc3aa0ff599c7a4593e555e1b82f0186671be699c73a26a281aed93af14d8
-5f9961d44c7f4954d3c878f8bfa0c5632b31d9a0c978442e917fc9ee88666818
-9e13fb731cdecca15c658320272ac9e968ae89bcb8fae5765998c8b4d98aa59a
-26e36ec1543032f391f712dafaeaff23be8821b3a23ca765270cb0bfc601f57d
-da601e2e28bac03b7b171101ac26c195863ec701a6ad7b9db8177aad94be5ede
-eee3b11860892cec50ec4059b6adb16c63482233de6c780a26109f8639a029f4
-5c2d3e6a2d95ba25de8097aba992609cdd0a76683f8fc50acca1533e04f0eec3
-96859b3a92dfdc7d8d34f2add87cd55ff8cbdfc446e7154adea4dda504f6a835
-8e2b3433070f23fb153bf3838e13a23672dc8a1f88ad096693212d994c523955
-75b925b8ee182522d63a882f6d6a3ba45fe37eb499f44ec274666b1256595d2e
-537684f807838d60f07ab06603e23f360d6ab50c94cc48d3ac9b31926cb8342e
-b5a881221c1e34888336699c7cee8199dcf5318cdb661f9188be6dab543d2bd6
-9016f5094d7b04677de039ec3fc22732fa1ace506320899074a31d1e9e580063
-39613072d3eae526b88b5933a0c5c1a438558372ae20cb80e0d4682571f75a1b
-47d69c6868ee47dec033c4ac744d0f958e2915b2c5115a73b5268aa94ede8f3d
-182e89777695d9bc36217ecc7ac1bd1e460a6503d1f1a33919e1bf91349ad296
-45cfef1aa1dffa8a68d4cce0d3f6f5dfad069c8363c68924647562f23fb98a00
-62212b4b82a5ca2d9c98353b7863909d6c1de93a2bea9327757528701415eb45
-43472b40f1a044cd32ba7ca9737ebc5e98d7a0bb808b66d616526ec48e60f788
-d5051dfb52801b9d3ba318da1354dfcc13edb89536e9eb6216bf35a77a1f4b7e
-5eca0840226eac5a9ca586ad811aad53a1938860af4fbf5fdf1af521c07ba519
-e2c2fa0dd7dbfc1153a5a77bda9d78b0ec5f28e832943ec8268a9fe453bbb53c
-6a45a9e2f679126e323cf885ba754bcef56ff40bd992f0372bd85c303930be6f
-14087eb0f5b26e5900f236d2a8895aa299e3b769767af33f88da11e5374eb32c
-6f5cbc9cdd8b067abc22e26504fa960e4464803f95af1ad57b249f0826e3b092
-4a5508b46c8ac2eb5d113da479890a7be56a7a5a4896fb097e2374f2ac7d2e05
-ef4d4a31d8e9fae9a0df448f198cfb26ee8462dc01c448af7389076577d4814b
-65fa2e4cd81d22d81db6ac028c2c0419cf6c6b0c8678e1c8bbeab1b89637fb5d
-f04d600e7ea27f4768bb2200fea08e1872d2643cf36b7dc9a1d45425c2c330d2
-44dd92eb0631c87d8e6a275ce000dc7891a91f71a326d191c50c6426c7a5f677
-17a628260eabd753444083e6ff60c1a4257d97c6026a15efb19af06c73de3845
-878b618e10ecf189126b9c1f440b5114bf0d736226f86753da676fa34ea9958b
-863e2f5e085ffcce7ba461ed3191701eafcace0c98abdd6ec4e5e37cdd1375a0
-cde67542bede694bea4bd5a92bcb296e6ff79e40f730490fb4ffa1c0b88e5d7d
-cf6819b545612c1978c34ddd242ce9f05bd2de8c6bff8e79fb747035c89f0c1c
-8bd4f55f14b6c510060105605dac0e571cfc02a8a580390292473b7b1705175d
-33efe45867e7fbc9029106d0e66341ed9fa6ecdd6c8b4c50ce213a022a4d16f6
-adc0ef53f46870add3d7d1038523d8fff0b2443a58f087f910fe374b3181c982
-732b86c0e23bc8f9b657d5c49f4925868ece6e5257b6aa08f08b2df97380cc7f
-d9c8e09d7b6886fe8adb6184751bb1a776b0f0b365dbca4d2e470a9f33c0e424
-318ce60407abf86c71cf2373e4226cc556491a91f4234f75d8a974a5b4c9748b
-25e143d76d91150a4796b1f668e9d709b8d92c47173ca4323a5b1594c97409c1
-82a52797bf1f74a8cdebbe221e9d1868cfa963b57a28f27ced76ec79dad9eafa
-c9dbc14b8a0542e93eb35bee947ea0c0fc373170406275d6f94483b5adbc3c48
-1d877a83805751d169c08a772f3dbab227d3ff467c9804ca7ccbf700a75ca77b
-14f32e0fd063e6462ef94bec9bdb4e8a392db2d4e392a270e982b05cfd2dbe37
-02eaa1954bb92e0c74873c3e7b780e7ac3341635c5a48ab40a855052f1f769b5
-48b78ce8549bdc2d972b41b2ff8d4c188a6c6a3009b3cfbf20c9320c78b823cd
-dd1b836a827ab16d2479c289f766029f35fe1fa278ee20c0c8bc21b02837a586
-2112128d04df3d2677260b123ff58fb1b7e6075f1aa0f6c7d56b9cb593ca07f1
-7e5ee7ca93720a395140b558549933bda0106ed4fb29284ea2b76eeddf0e1ca6
-89aa2a31f3a655c6886efc94ab37c6f2bd2cd81e351554ac3f569683ff1876da
-ca0e0f2183c0613ff4266f9c4399f11dc9db5257a48f44ae2994dbce930db588
-46ba3d42b1e318a207645ee9b90ab34aa0ef3e113744471e5b827a90fb5f7717
-27f72758ca2e49aa0fbb427df80dbc2dca243e2d6c332d205fd8e8ccf4efb9dc
-be143004845e09908024e4e59e8828f3108da8b9a590decc82e5f821cf3154c5
-319038719c08714b54082e645fe0baa6667f6ef885a19de9033e25f6f2274f77
-8e8fe9b9bf35e5b8186e9cc7ab124d0e49a8df2343922ce64f0f65a00a5ffd47
-9dcf079a301f59192a3b9f6115845ed1909643e3171ab6f105cedf73ef9652ac
-c7f9c68b0b0fd090ea8bd3d3838af25fa3cefa1580faf0c50bffe0e964a12859
-e27e017bd84f8d89dd445f0afbf8da3a73904ca77d2b1ebfed76c96ec2f8a1ca
-d38cd76b2343f3b3ffae2ce64de4a0e3dbd9f0e265807f731f6f01e1d61bedfc
-f214ee2ab782eb6d3cf4746fbc372acea6153853b94f37f3f8771c5c01d46e1e
-1d307cd73f2963313f46b0ece915298005a2e37a20e8b0da1eba7f0c06a7e2c8
-5bb8385b2034401837bf414b33e4cfe4c40f46efaeb4eb66d8c73c82798b4dd8
-ad3e231d2fd7ab77e3bbab8f4e7b15bb6c93f92139beae8b92fe3903aa35db17
-35cc096486740c95add2ee1c3acab366b335d361f39b441d0e22794696cb2a89
-279f434cf1ca1cc2263218f4084261de8635c0f87e38240a07f5a0b8706201d5
-e84cde169961dfa50d0aeb38a6606b76289c8234a918a37c766877fd4b254b55
-44b31946a76521b83b6175e892670905956aebb55876d19cbb009346b8f6f10f
-a6a7a4c86da23716364edff21cfe7427d6bceae58e5fffe9e3ae92f3f88d9ef0
-786ec2ce0f1440cf0ab52ee2249d0eb924f20687e6716af698f8ab76f919d5c7
-4b4a860d28647c916c23421c50754d52749551e7349f72a5afdde899ae41a0a7
-074f2099a53d4403e3bebc0270bab5d191672b4fd9b24a3a32bd62c863ab113d
-0c98bd274aeb746e8c592c72010af8b3806c86d1434113fd3a915e11bdfd4e3e
-b975ee34dce95ef509c14f5cbc0ad0dc6b2eaccbfcea974baf685a369aaf802c
-0df511bd0d2250813063525c128eef1a2ce9e0015937a9ab1d590a71587a9a7c
-b75c6a13ab9072c934953e93ee05c36b99d54a765cb1b1062e5a312de7a5cb2c
-092a5b06a9ac8914f57212df83432441a1eead79584163d3aaf35be581bacb6d
-b70a2e42bc886f8bd7224c1e98dbd4fded0f293650901d03b9015b6a6f761978
-770bcb647758f87eac41a98633abeb13226e46171db24a7f0cb2f94e43cb7775
-e389dc2cc772f99b17f04dc1baecab2cbb77fd8810e1d818be0a22fc3e313d2d
-462d439e45ba764422692d68b01e7e18fac49e91501607974c9c1cc61f2c9a67
-1cabd1ea8ce615786bfee65314b414fc14528e59befb56f4863056b4fc18bc21
-d61bb8c0984bc7c16b491267a7f80255249179c6f3378c9485514ac7c2c84f61
-00e5d81d362e49f278fafc1b6bf0aa9d76c98476a3e3635165d53a904dd6b699
-d6ca2e9cbcd609d11cc9373f4c1179891d2c370681c8010ec75ccf893b040b7a
-a413663f8e262d4c054bca74f0c5fe40e24d57ef4994db6543bbd561f2b33504
-0356430cd25451126ec91f82bfc73ba6d843c07f304472aeecb7cdd660a34a2e
-05c1e3c06be790aedb514288ec1e029bdcbcfc13689377be037674051972e96c
-df6753b2e31da945b56c0a7316ed42adaf78a531d7412b3a26e33c3fb926446a
-4a8abcd35799ef47481ac60948245280236668ae7df01f3cba2384dc88945c36
-7c9d70039f6adecabc5be2bfeaa8dfc69bc1d40b593140c974587905557c4a68
-71ff97652466fd44e8f18d31e9855bcb25640f15a398c257292c61ca77b752bd
-aee91ff16e070da93ba5a9cb1d2e137fac8d78499b015ec2c3f8e38422c058b6
-8ced660fe0af345c9d4513983a7662a0c679236b9deca23879c983788e49b143
-67ce3f436353b3a86148ec21402c05a5e815ae1e375de539628557a8caa5af62
-7bc56019eb0c11f753193b3475c6512f1af8cd4032b4e13ceae3fa51c167a692
-01d054707f40b3cf7d7fbd23a6cd3b680d5c20e0181208d4b102e0f96841b6e7
-ec818a881bca226699ccf9587bac922a6b51b545d8222e9fec0fc90bb7b88496
-01a7c60dc2adcbcd798c8d3b67a6c4b6978388d83ee7f052e58d117c15067d4c
-7e0c8bcc3064287cf2cf511ab902872592280b67295c0cfc7b1e51b3f8b71fda
-b9e285f6f0de7030ce9b57e50df59fb2ad6ed36d423f7f2e148246e66d343396
-82ea928d4a3153a382a9638e9bac663b48e2d1f565ecf22d2a2eed624f3eb980
-444697474a2b983697ea5614c7a867d48363a1ddadf4efaedbdcf6306543d62a
-4e2c4b153ea731c1e44b1f362870621b3f7b992c85fce0d4889b78b25d1a1a1e
-c017613de16f6da6ccea3e6c0958d27aad413ef02097a1e379a965ccc3a75b04
-73dd0b82caf8ec8788d4bdd46665810855f8bac3daffb60ad8707c728fae783b
-e9c8a8d34d949caa5122f37fea44063211379c4b88c5fdc06f451d1c06b1fb81
-3a25044a5f8d348b4eaabdbe4f9c1ca8943d2af204c41dddc2c1a2bbf979128b
-665b9f84cdd35c82fe3fc9f7457513bf4a908c3bc2a0d917d8af2417ad776767
-9b8c7be588b373753077761f99fe50c8df8a8f85eff5e4fd53d36644b49e7cae
-3f65634f6feb5838017ed45a4ca1dba9adc2d4c525d1f952090d31a49b8e2aee
-6b45e0423385f52628d8e43e0cfe89d07640971455c629da5d938f551f8e60fd
-03eb7fc642bcded570f8f592eab13c71ea7c9e833ca2d2d08c453f84b13fbdaf
-7cdcd6383ff2c103fced1d16cc4d8a21d57a9e65d89f913f1a028250cc3226b7
-0fd0d223f4d715e233caa1aee5e9fe4ffaaea243b0e13c198bb8dc8af12fee06
-09be128117b9c7bc338f21434dbc92bba4f7034b062a3232f73132558ede0fb4
-5ef02c7bb6c146e4290f0d897ca4d72eb8d5312a9a5fbd0b1fb878aa3ac69c5c
-3330a735239e9181ae7f29267cfb5249fbe39470d119ca8dc6e0ddc18d5c277d
-b2f4a12cc489660685fd824e4db3a9053cd6fca133c94c75f8ac1485ca36045f
-8ff8c6640b95d2eb5a7b0d4c5931ea75418c151157bd25f93e05cba374c43c38
-f04e4e89cd5cda0b60e1e5d4713396e2b553727a20bb76a33273bfa660ecfcee
-2d3df3bce3c339a423fa84d97a637e3a3d99aa19ed8d6e5a68246ddb6d3d609d
-7515cb0f19df665d9f5cefbdbb745a89d3d69887e5a0bb1b4e59f4c5bc0c1a03
-67568e924f8c50654474b48003c443652a2e7a32d5c1775e9b930cb0c99f1a3f
-e6ed3e505ef02e231e9ba5a08c77571fb397b28df3f6334a59d62e87b9b73bb4
-8b3f911be84cbf41565870434642285ab575d94cf326ac39d601db42c83371ff
-55b1f9d5471f81754a3ec6233b47f444e28c0f537d91d8d13f57be0b8cce06ad
-f946dfcd3b272ddc13c3360225b79919f97bd2218313b06a80e4d76d899e17e8
-90a00622db00345e86a42f406a6f4185fda063e80b2f8b98b80bac88b400eb82
-12676ec8390a716d56e244320febf16f4ecb70e06caba17d7459801da82232ef
-71c80a924edaacb29af50d26be34bde0c1554671f4b0153a40a8693790d3ad6a
-5422eb65661cdca9379e47e813ddf9e1240cb259990bd8b92d96ae9576df599c
-743168ff8f0c64c37e870e3ef25146a9231c46578ef77cc3464adf25ce35131d
-640e067c5843d0d628a36b9f5fba003cf19d15ec0d693a8862685d46a30a18eb
-7d66a20b365b258edc2e9d9a6b414ed0f1ac1894ecdd4bc2d707d88833a1e34e
-a72389fc95d26ec2c10e8474bb00dc4200aae15adce11e1d8c4014d7e13c5c0b
-6caef835ae542019f4ea14c7283fff973eaa8a310f40de4de0ff56807bd4c46d
-c45523fc703fd8c6d08b32ee6e31943dcb52a47b30dad4d3d2a5cb4d647febff
-ca269375f1cd0455dc0a81e1886a1dd4b78a9d30138e03517011550a22997fbc
-4c6a833d32631d4a6cb9bfce3d8a98fc0393aca086a6bedc8ff833bb9c455e2d
-1cfd953d3f4e60f06e8226c561ec5dc4994ed8745d934e231d95765a0809b952
-48e85d325ebf37d8084619d4de9cc4aec1204c9122b918279b1ab7e63d9eb477
-74654bfa2cc04b8ca5984e2ed6cf7358df124b5bd67b523c4785046780708e2d
-982f3a7f3e6e266a5b3b72c1d9d13cd7d055a957d96015b11ac1e05dcd9fd6db
-aa69fec04dfd90eda81bf71aa205d1587eb8d1ce5b97cf43f32bb9bb2a41ba55
-2fe72fbcf8573a998a4be2e870380d4f6cb4d086ce926c86db0e248b4e594d4a
-e233bc13dbc6a55c5e7fc9c9ec994876cdc9795e0d3d0535f702f13c8cf64659
-b0248033530ea3b00295bc96240e3a41fd97a7e175b544242eaf7146a6d413fe
-fd9d4c4bc1362f20a1678b8d6ab03d7a72d9cf8d79a9fedcf826274efea6ae0b
-837eed3e717c09f713dd29b6ed9f5a6bd7ed0676b6dfea8c9c02a32fe56d704e
-bf1271604acfc1ea301d86e270427c417baa917c5d6e8e24af0b352d4f6b419e
-b63ac268e581a5aa86c7eeef14a718e33f4dfe5bf05a94675368e780b8f81ef5
-ade6d7647f4282ec319bf5991a09714594dd1854ba9c20d6b00ffab76e54f388
-a60780ec12af64779f2adc061dd71135447bca3daafcccfa6183fcc78522b533
-1f39f30e8750c0a3337a44766cc3f7f210c1a8e10f4ed1cc54d0729b26f1fefa
-7367aee66b33e8dd0e78cbec4bee5a70ca809ac39f84b72f1d119e4353c2e4d6
-20c7f6383ab7129b62270e6f7e75a1648d1da0536e79d60787aa3149b96a284f
-2ed1e0d2c9c4de7be5db53b35d360c1c6210362d4a35f91c6633daba2c2272ce
-d87c53f85ca1b55002d4e8680cbef6bf500632752827c0a5f19a062bbad900c1
-11442036e66d360743faeb0636e1f31b554b6567e4540d07abd6e1ce39313277
-5029e890b63ab4708ad351725bccd79d75e49cdb612da57efe3b44a2e7870e67
-a5d9686eef4b57c2a17f2d83cecdeb54914610e5a3401a97050fa517f1662297
-e06d29442d0fd89ba10f21584e71eb8bd5b03fbd56f5a538f72c9cc8ba5da11d
-9e4a7f8d9dc2fe56f2976d3e6bfc901de356a3d0690a0aa715ec6d339d72061a
-530bfb5323a8d038b8ad3adae140668e505bd100bdb20b98371228b841d0873e
-832309912ac7e9d4c7ee9ce81285c7f8e9afa8e2077e635bb36167c9e9c6153b
-c73fe799800c39fe343d70e38f30a721cf2796839096add3c82b675f0b659f6c
-99441f9352a332065c9df5b419a020d9b2fff06efd3295250d5335f7a256ef97
-992005ea2fd03f408a7a923ad8afbc8224daa112e8e4faf2ca974af2cafa92d3
-d5e9fc80b0bb00d933f50ab9010d671751b3a12196919e073678c2b047435a8b
-b826809e33bea0f12379ab1a0392d37f27766ccf15b3648e574e7dd1aff8295d
-df3db858bc078153072770fbe45196c3107a12df7f48d7bb6e4b99cd3553e01d
-59bc130f7877b18b65b15ea50db1146c8ffb2da5180b603d920c099d15aa9533
-b594791c144a3822f337abcba4d33d36299bbcd94190f85e0c28f4fd51f9cbb8
-9d301eb3f41179389b4e3323bc407c1ab223ba1608a5f8cea8d08a13dc4fc307
-2f93d59a3c8b32cf0721dd80c369e4f590d6fca9930d4ff110611d755b5fafd9
-9645e29003540c72f70f1ba5b1a884d1938f77ad689e6e70afa7216f31988919
-86df34a1089f9a009926b8983b05663bebbc603d90ed348ec33afc5a549af5db
-86b90fd34f534b24234f229409f960e2e921575cf45520f2d651c62bce7ab637
-6c2fcc99345aa8880a8cb7a67c54ca398cd61ad14162c9561ed8e4e9737aa9e6
-b513003edb220ac92894ab112e100509608504afe0fcf85b7bef8000adb3afa0
-3f85f52b856c23a68f58bc28a601e5430ae318ffafc24975eec7836b147a5a50
-d0369b90f111aeac20b4db1abe66c32bf4231006d79ef4c303e7aefeca4cd5b3
-00b6900a26b2b9d98da2809a9135dc6e16644dc932f106b016fa02730f1d6dc2
-b1c9e10b610f2bd769fc071e06ee636ef566bfc05899c740bf3ba380cd7164da
-7fa355324aab667f33fe518cdb19060cf3fae8a0363e4460a6c2c9b70bf39054
-b2d3eb81093b0610cb03e2e7180523561cb05761b5ca8cbaaf5a35f7179b1d4c
-18d0b7eedde1634f120fc0f6134e55a6de259aee6d440444e0ef0fb7db8a9c63
-95f3200e5d40b854ea844860529d1b694585b8826d988f432be1f620629691ae
-f282e79b2874754f96c4a4a1155c2ea07450c2a256b9d8e33eee33c232c99860
-1e34dbb63812ca08aff99255ae6def9dc3ee2789e9bc1d956de9fb255bd51d5b
-09da88ffc9d8744f61e002da68f41aab3afd0314ef876318c8785f87b04dfbcc
-bcf681dc8a0d615e24ce8f6322705a59a0824b5d1f0d35c7b04062d13f5cce04
-7885cf30dada61ba4cda74df52c4d4afa32206ca799ff9e9ba2bf939deaad2fb
-5b14cff0283dcb41869cfbab91eed9065d69a6ddc91cb241634df75a81fcb4f1
-490bf1195ff98db50e9fc3c82f10d91968259bb1b07645881c274d7751e5c2d9
-40e9e8a23de33344c3e15b8c0a3801cf73eb1dc8e9df066e7ec61667ed349f0f
-45ba6b0832143d4e6e7901d4ab7b461ea6489f419b59ef6fa892663b01a222e2
-7bc2f4cbc81b1982f595dd2cc94d6388312cbb61ff2bfecd27b1220dec43e9ac
-143a83b5a63c057e2ae6393054710b5d616316ed94db2e6698c4c1ddeab6d9ee
-2444408d659c7b68d4cf5c294dfd4299507c41190068c3905bce2425f652c49b
-de244eb94d28d3d5297e9a11adaa7c9a9138f00659f2f4a42fa34db8b8e29246
-15ebbafefcdc538911625e0e0e9ac8eca76662bf295c8fc2f871fd9aab87ef3a
-3a7b293875328e89d018f40c760006fba666b8c1aec0c64231793e22825df5da
-923979c72db39f5541e7f489fb5d9510674e8be697a1aa7a0249dac954fbad79
-06d11031ce4605ea491e9920524f4a60ae55c85371fcc9f046c1b83bf3e5812e
-2a2f06cd724c777d2238fc465bb016e8a78ce7c86808698a852d474b63c811f5
-43591f5d8391fe4a4d2dc3abc5005757a17922b6eb0be4b9c238fd162f9224e7
-475456f639c59a26c8c6107ec20330c8724d6f6842edf3875cd0f87dc434ee65
-421155bbf5226c31de48374d426bf3f3d07b9bd718ec54f8eb9a6f88a9de594f
-ec2c9d4b2b32827fedec8078a6851bbd269993b246b0c902242f0c7ea422d799
-65338a2ed8a27e49a0be708911bff10f485b753574d8ac8313caeab496e0ccd9
-5b67f10cc0c074ca7613d05a67bd45df6b72f6e30eaba836812c91a2a0a4bd42
-2141d7443ab359be588901f46a22d52fcddf6bc04e1fb006a32d37dda270565a
-575354b40af0869c9b1f8a85696326f546e9a25417b38b9b5d972bd0d933226b
-f8b34f70b324255750f5a64c85318907900c3320f070b1f789620e4f5db6f37d
-461f4a2f15e884b948327d53420dadcc4b073b37ee4fe935c8f520d9828ee209
-976fd2c26c71e3bad6583784ffd61a2f419981d51592a6f8f47b4718b6736a2a
-1ed7f729a521155a39394d038c34d8a76e9c6f91ca369da29fed83edfc05a219
-853e5ebaf1f3d5c6ec932e69b7a0dc19d248f81cf541348c85853acbb8334b12
-26ce33140f3965db1a6f79ae0abb24b93b6916496b1698057d4c2d4a6a72305c
-11b731a8a07ff1eecb84fb6e3f3c3706b09a0cef4b1c2012bb9278b76f5189a9
-38d5b9fdd4cb9028f43d16dd39fbbd10a684582951236a05e0692bd1c139742d
-7e75a21cf14fe99d51dcf0a0b71b267a0ad42b8c1d7f46ba46972c8ba7bdf849
-15fa6c5a922dc93fbaa9fc50c7696494e6c372f3467695da5a6d7eb87c0437da
-d7b68ee36874203d741e373e931425d4ce521b2728633a25dbb435f963399f37
-8d0adde8345439cc5295ba3d255a72039ddb1592dce1ea47a92d7b641182d0c6
-85d0616a85361c3b78bede0190834c1de0d4d132f459d8f29586dc73f974dcd0
-5def570984a9c2bc5a720999111c7de6a28dc0c6e9c51f82d8c55a26ff5ed760
-4337606960f847382671bb144d5ae5032c74e0581b19b21eea8ce4529eb792c1
-044418fb0e3da356a5b33cd97a0dce15ee9279b076405e23683f68c63b6b09fe
-c3ce3e1b30a4cb3a1e72455a372b6eccc7e4c97336df45d0bdf94aea01a108fa
-f28d98d7bacd750c7c25874e0fe3fe20d8e1d51043eca67c546278dc13716d9e
-f81a8fe2945a6a49c82b653804d54f626238396d8e4a9bdec4946c365d1164e2
-fed12929b769cb13712ad61c764d31798a87a3e12e1502cab14ca07efb524ca3
-dc31cf17f73feace77494de837790d812dabd36cf4c78123cf76b504886d0cae
-13fc6757bb6878f792a86d52d0e90913d089d7c81faefc56dfdbc3acc2195981
-0728dffd98a2254e39eebfb51742657ac9088cf8adc21208f3a333a1f45beafd
-69ae647754161c6bf0a76800edcfb6a2339f03e4b5ba4308b924ca56344770ea
-1c7322f692c297794b03f3c2a180b645ebf850afb290465ba050ebb9c8298f2e
-50b75571a15a599650a7fb1fde8263e49a68773b5184c30da3fe59a7c75943ae
-c5d26594361b53c26162410d3a1bced7c1cd0053390c1e2f8848e6aeaf75319b
-7ac5654a16cb93832bf981b9d54aebb8daecf97894b560ea75f51bb39a2bdc9f
-f59d01321b51b23a10827e1845e2db316d86d7dce368313f99ce7cab2a8e7c50
-8f91f0faf03626ff87247ba86dc7f3d837020e6aa83921385df0f401e4084237
-95251c27e8944749aa33b0b697456453ad8a5be8324fd22b192adcb22e03c74e
-6a3c9e6f7e452ca491db52e6b18016592cb09955f05365ec73300dc3e179c32a
-d08a443de2753d56f0c968db00d9cd58f1af7e3811202398bd58a337e7ddfd84
-1c8c8efd21aac90582130416d261f3a1b9f36ca431c8d4efceb9eee03d680165
-70ac1f37a1698c0b4da94cfd4c57ff54edc1b25fb713177fbf209928a1272cbc
-25655632d43e6d14c052763452d51cfaa32c8df47c57112ed37ed239f8c00268
-c78d7f3a0a965fd9e3f3c1aef2dcdf74f663a72b15fa09d7309f2d15b232efcd
-baed8a66f17b0dd190081a95a5619684a184603491a32114a5ef2c5076caddef
-0b4eb2197fd59ecacc6416398da20414cdb6a9a3e9ead646c34ae4ace4cd57e4
-430cf5bf55ae076419c0b79095d903753ad7f46dcc1b93f782127d33a309f245
-33484156f9ffcbf9e841d0c71ab0b12594cb2c327112508593573cbd95d75739
-f4ed866beaa48bcfe3599f62b0a848d6f63fbf79937966f3a0ee4c6163ed16f0
-4b8bd51ba483da59fd1d719499ea3aa49fe4917e10e2da13301b0a8b50f3841b
-6e80904dec24e5428b97ec17e66889170d12a27c028cfac9adb2eef49815f433
-b6089c9d6ef39f058f0cc655b27f4241ac74993af39e1fc17d5f9e27c569ade9
-ffdf46027fdd633bec61d8c5fe318810180f4437f356001633e14e098c992da7
-52f392cdb417d2bd30698612dd7b2ac00d0e5b4b3d7a20b99d0858d5e744d4af
-bc9acac37005c3841103a6ffdf3192ff85ed425dd221e4bd71ca3db6a739c7fb
-9602c130a1cbfb5b9bb9342099c2f60497642ed1029e5f9308a5097d6f33c815
-0f9a31a988ab5c162e5aa56357c8186ec5914533aede037fa99820ec322c8fcf
-1ae1a6aa6e048c99d2af1b96ee8b313ca0453923f5fa095aff28e7cf79c4be83
-70058ec3619ae4eb31fae28947355290e967453cf351ecd976ad1c5da7573f0a
-ddadb5b6661c47a0dc3dd22d7c175f9391bb9e359bfec4eb2b687a5a6f2fc8e2
-3ab232c34a95f54cf924fdf8011148145466799cd44a8440a0ac99b7f119e470
-a7fdcf6ff7a57a588f407de565b6a45e7fd5a1925efa770209110c54af8815ea
-ac1af9a0b5a790f6df301f7f9a105e776ba30e2b56d1dc2c0811990c8d2a0d59
-d733ee5bb53fe30323632057131ba4ad1d49cadad65d386ccd7a2c70bccc068e
-e881a538aa3471ea3b66ae24127dcaadbcb01a9abc8df00353c568aab8a971f8
-fe42a15ae22fcba141317584119f38d44e479a0d230273fb235a7895972f3f12
-c9964d1fff7ae88b9d39bd0c948a5ecbb2d858a26c01d57f3ae91ecca2475bad
-2d9c5d8053119644ee9ac5c3448c412b9fa18b8c5cd666b58714124c3c1f7d24
-62b31fe9605544652c1b62a4c16c03876977228b7808919fd49da8c14e12971f
-bf157f70c41e54927f569a8ded69e9ac4af29fc679a278a7c6b0b1a605bc8f3d
-d28c0da975292d88fb0b27a12c56ebb71bd93802ed8634e6615f92622e598726
-f1964331f9f3353638adfc0b3ae281842a8ab707b753f94cdc80a4133dc2fa76
-0e723c34a5962c79901e1c3be3644d926abf5a71cd581c2753042a0264fc5a5e
-f6196bbfbfc152730227798be62643e38c512d889e61b5123e58c173ae6cb8ea
-1f3c5358d9ee649afaa3c0fa0efc9d018be248b664f9b16ff484989e0ed8a199
-85abe77acc50b0da312164a738dd0b0f8156eb2b18b9c18ad7c08ad8b61de543
-84d1f5ea363354272e3d937a2f770a74d30910f195d337780b3b65791a0546ab
-18a8ad95353637c276b4fba66000886be4c478fdf68bdeab674527bbb86d75f5
-f05702581626ac0e693f73f08005b929bc154a5cb26f1c1447a34cf441aec12c
-e061d5c75dabf9b6055131b7e27edfa1197492525b8ecb98a74753f10324b4be
-61c87eed22b31f59c4fc0a434df9d34e3ef204268df01fe50866c937fdd83de8
-be67591219361b44441676d4e24fbffdf0fe6ffc1246c94de5de84d0e2ce54f6
-4001a4d5056dddaf20dab145f59405e14629138ce2aef7f7df4c3ac3c34c8270
-0195c65a7e6770d2e8211b5d6ee9ee826c316acd3063c634114d96b68f9e7be6
-d6f09e1004eb05a1b8d5b8602e7dcc4e9942a1a07cbce0515a5f651df70bd369
-31149d9d07e155b69fb7aa2ee350c52fec11cd82b0bd41dbe5af51b22a0d1aa2
-42bb655f8bc0cf68708f4891d0152ea90a8ace90fabedb75807baefc45b6fdbc
-ce98089dbe4004fb84cf3ca808b355a401bfb7cb0bdf3d34c56920ea7c9fd810
-1022917883c46cea4f9c53a1b735206870f51b55f688da9c8569dea21b033a7d
-26739a6dc374059371d7f0e4f1369f24abac48e2bd6c37033106921804790ef9
-8cd1e8b8e954dda81ce530dfd6b96e68e9e65f68893704d4e1d462e7fcb38be8
-9687baab78161f5e6957db5340f62b08b6a15b34574f8e66a0e3ef88db94a571
-2d01ac0f7b3971c994b8c4867c26294e63e18b06748cdf7067f521acdd28f928
-efd5ba043ff030c24f8dd60f472c254442493e4d5ba92cf85023881b5a222ec6
-5a37ebd19b3cf67310f5fb521ac4f8434ee8e998339f7fed4cb830c5f84198e9
-c5ca9e7347186fd6dc622118c624b6c5ec9554641de66beff929d05364b9ff44
-dd342e36818f8af5a81208e7d92eb91647f1b68e4bfbe708c0ea70e90a1bc7fb
-7fe7d3d81f207dcf44c20fe86ea34cebd111b7c5cf7e0c4ace99eef31ebf1160
-ac50564b361d8d039b8f622e3c4d6e85474d232bceeab726bf66b307ce147c32
-b1351681a3b6be40d13fd8da37cb71bd787b78a922f3e9f70969a716a76c2c1e
-fb6c315bb455ecc8d2475b1e61aea14f788f235f8b5a7cf987b78910b2da28d5
-288a7fdc879b66f78d5aaaed5293a17a1d96d0715e2d0006feb9a9d7e4837fb3
-91f3ff93e02ccee1ddb2b47716abca344666c1573ee338bcf35d7956b9cc82ce
-5083ef6d3155e28f8755aa7f8dc6dde81dce8c37736e78b97c4459be3b471336
-5b93671811cc5a397a4a943b1a82f712a7526d9010fd07514856505621d5d667
-68820a69f5ea83b0d810ab8ed4e5c9acdd54d4c19f958add35d3d21f7089ddae
-f69e4fddb831a94cc51f7be19410c5c6f3b0ae57026c4a2ff33bc8f91afa9844
-abf3f6ce
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
diff --git a/lib/fonts/dejavu_sans_11_50.qpf2 b/lib/fonts/dejavu_sans_11_50.qpf2
deleted file mode 100644
index c88d099092..0000000000
--- a/lib/fonts/dejavu_sans_11_50.qpf2
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/fixed_120_50.qpf b/lib/fonts/fixed_120_50.qpf
deleted file mode 100644
index 95b60804e0..0000000000
--- a/lib/fonts/fixed_120_50.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/fixed_70_50.qpf b/lib/fonts/fixed_70_50.qpf
deleted file mode 100644
index 76e5919dc5..0000000000
--- a/lib/fonts/fixed_70_50.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_100_50.qpf b/lib/fonts/helvetica_100_50.qpf
deleted file mode 100644
index 5b407e6a8c..0000000000
--- a/lib/fonts/helvetica_100_50.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_100_50i.qpf b/lib/fonts/helvetica_100_50i.qpf
deleted file mode 100644
index ac7c696301..0000000000
--- a/lib/fonts/helvetica_100_50i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_100_75.qpf b/lib/fonts/helvetica_100_75.qpf
deleted file mode 100644
index a1ddae0005..0000000000
--- a/lib/fonts/helvetica_100_75.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_100_75i.qpf b/lib/fonts/helvetica_100_75i.qpf
deleted file mode 100644
index 8bd9d1a3d2..0000000000
--- a/lib/fonts/helvetica_100_75i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_120_50.qpf b/lib/fonts/helvetica_120_50.qpf
deleted file mode 100644
index f7b8484a97..0000000000
--- a/lib/fonts/helvetica_120_50.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_120_50i.qpf b/lib/fonts/helvetica_120_50i.qpf
deleted file mode 100644
index c796828677..0000000000
--- a/lib/fonts/helvetica_120_50i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_120_75.qpf b/lib/fonts/helvetica_120_75.qpf
deleted file mode 100644
index 14c1904c68..0000000000
--- a/lib/fonts/helvetica_120_75.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_120_75i.qpf b/lib/fonts/helvetica_120_75i.qpf
deleted file mode 100644
index 2078f49c51..0000000000
--- a/lib/fonts/helvetica_120_75i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_140_50.qpf b/lib/fonts/helvetica_140_50.qpf
deleted file mode 100644
index daf1e0f97a..0000000000
--- a/lib/fonts/helvetica_140_50.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_140_50i.qpf b/lib/fonts/helvetica_140_50i.qpf
deleted file mode 100644
index 002ac3ffd0..0000000000
--- a/lib/fonts/helvetica_140_50i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_140_75.qpf b/lib/fonts/helvetica_140_75.qpf
deleted file mode 100644
index c75d848b87..0000000000
--- a/lib/fonts/helvetica_140_75.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_140_75i.qpf b/lib/fonts/helvetica_140_75i.qpf
deleted file mode 100644
index 81ef8ec96b..0000000000
--- a/lib/fonts/helvetica_140_75i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_180_50.qpf b/lib/fonts/helvetica_180_50.qpf
deleted file mode 100644
index 23900221cf..0000000000
--- a/lib/fonts/helvetica_180_50.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_180_50i.qpf b/lib/fonts/helvetica_180_50i.qpf
deleted file mode 100644
index b2d32da5c5..0000000000
--- a/lib/fonts/helvetica_180_50i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_180_75.qpf b/lib/fonts/helvetica_180_75.qpf
deleted file mode 100644
index b3a5f20410..0000000000
--- a/lib/fonts/helvetica_180_75.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_180_75i.qpf b/lib/fonts/helvetica_180_75i.qpf
deleted file mode 100644
index 4beaf00d8e..0000000000
--- a/lib/fonts/helvetica_180_75i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_240_50.qpf b/lib/fonts/helvetica_240_50.qpf
deleted file mode 100644
index a703e96fde..0000000000
--- a/lib/fonts/helvetica_240_50.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_240_50i.qpf b/lib/fonts/helvetica_240_50i.qpf
deleted file mode 100644
index 75ec4ecab7..0000000000
--- a/lib/fonts/helvetica_240_50i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_240_75.qpf b/lib/fonts/helvetica_240_75.qpf
deleted file mode 100644
index ca900141b8..0000000000
--- a/lib/fonts/helvetica_240_75.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_240_75i.qpf b/lib/fonts/helvetica_240_75i.qpf
deleted file mode 100644
index 9584de84cb..0000000000
--- a/lib/fonts/helvetica_240_75i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_80_50.qpf b/lib/fonts/helvetica_80_50.qpf
deleted file mode 100644
index 149db404f4..0000000000
--- a/lib/fonts/helvetica_80_50.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_80_50i.qpf b/lib/fonts/helvetica_80_50i.qpf
deleted file mode 100644
index 007d1d8325..0000000000
--- a/lib/fonts/helvetica_80_50i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_80_75.qpf b/lib/fonts/helvetica_80_75.qpf
deleted file mode 100644
index 429306601a..0000000000
--- a/lib/fonts/helvetica_80_75.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_80_75i.qpf b/lib/fonts/helvetica_80_75i.qpf
deleted file mode 100644
index e1929258a1..0000000000
--- a/lib/fonts/helvetica_80_75i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/japanese_230_50.qpf b/lib/fonts/japanese_230_50.qpf
deleted file mode 100644
index 5bf076f72e..0000000000
--- a/lib/fonts/japanese_230_50.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/l047013t.pfa b/lib/fonts/l047013t.pfa
deleted file mode 100644
index 475bdeb0da..0000000000
--- a/lib/fonts/l047013t.pfa
+++ /dev/null
@@ -1,1346 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiMono 1.2
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.2) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Mono Regular) readonly def
-/FamilyName (Luxi Mono) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch true def
-/UnderlinePosition -88 def
-/UnderlineThickness 83 def
-end readonly def
-/FontName /LuxiMono def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {0 -211 600 993} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078983 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D83BF47CFE01E54AE843C1
-FF919109F85F08DC15086C2613CD4932FFC3BBCF951312D7AC8EB70626A8256D
-9CB48AE151BA7EBA556B7FC8966221E8114D04E16C2D41159D816F0736665744
-C5AA840A8C9E4A697E288564BABF9F22155139A91877825F56BC44047FC0057C
-78C5CD71D7859D99CAD461A73C7871F7161E71EF00E7DF6D787AD0209C092AC4
-FEB4AE0EDF2141C62D4C5120EC43941E32433D8D3EDB02539B98433D8D9CA45F
-6AA67D383551729AEF5E277B8CFC1BF612583912EFA2A3EB1C1490696E3B5B64
-987F7129C7F195446A898B0405208E0943FEBF10E74DC40EA182198E60E9BE5A
-785D6DF540CF0AE65F2EF925FD27DE63269160F358AFA6CEC1C121F1EE2BE18C
-DC1237C59283BE1B774EFB9863BEDEAD8229E459BC6E2DAE03EAA3083214E847
-AA01F76B67C91AC84CF459139DC819E0575C04BEEF896208B91E6A6CE8AE784C
-E77246F7BC68A2A4B4F642AC3AB4748E352DE8555F5907B36C1668ACA42182D0
-E9FC1C228F7BB63F6B041C2DD08180D1AED8C25B136D007C6DB9E11C2367F0B9
-CAC27A34AE8EB2981315AA94AE8377875C50BD43DDB93A2DF261456B4B945340
-C81C790B5EDE5C3828C55E244DA6257D05D0D2C3274A35FCF96C19BF666B8C45
-1982729FD8C9E61FD1F81A4A346902E511732F09CFEDB4D88AA555E15C05F19E
-2CA7BB2294D9079A9182D8970ED7153C9D262F6203290D693744F86EE55CF4BA
-2F11579C681D25B9FA91255884C9A5050A15728E11348EE5EB4F370749C3D27A
-D6A686868DCF0E327FBFFB45EFA735CE9AE0367E6A239B85FD751BE92E2C7D8A
-618A08110FDFB48272337AEBA86F992A033663B0DEF168DA75BADB4071110941
-7320C0990BCA84EF516AD34E5AE14FADF3E3E44EAD46613423069D24BFE0E28D
-DB6D32D0001738AE534BC2BE240BB5BFAD1489CC2B2F6621449936C68786A51C
-02E8C179B643E401D01BE6849BFC89E896B1C3356DD9E8FCB69691AAF6BEBA04
-24D62B9F266D560B4089E20A9F35AD4A7F65A7183761ABBEE0F7EF26ED3565A2
-5516A3A5A57143979A1EEED8CD52A69E4E1AE4795F3EE0CA21B9F4D166783A9A
-F54B08B6C56703932A310197E328C6E6A6BADAA11D66A952964F31FD690082FA
-02D1E2A4512A9F274233B203FB770A3A1C7490ED630D0FAEB3066429D00302A9
-5B07D8F628F1EF4E3F45B5AFC9638A46BF1286E21A7463ADF8D870CF36728FC8
-3FED84B967CE31C5F19D9E36E707907AB3946AA1DDE97A87CF71BFAF25A904BF
-9D15DA7739FAB55835A8B8AED166F2445E020BABCBC2A84B0A20C8CD2778BC3E
-074CF498E454F752CE7412BAC70A04CCB4C093854AC72F28F0ED22066816568D
-2B61F311C2EE3444CCE402A461CA0118CB6328C7A8FB765C4A008B5DA5AB9916
-AF83CC04157B769C659A794A7C3EF8149211C0EC2E81A2FDACC6E6C2C0271987
-E8C47DDCD84E8AA3BB0889764042EFC8249E0FD10586BBA5E3C7D5394C3C2FF1
-D482A67514026A4D65B094DB94C4A8872BE1FF437E983F6F2E8B336EEA6FCEC7
-5ED6683A41C9CE6E70671A63F4BDBE846CE41857FDACE3327FF35AAADE4C338D
-528224A55C4504C2CE5A774EE32DE11CA3FBFAD628A915FE452B0B40F774AD1F
-099860E44D875F4DA0C71B9E586A7D4B8AAA9B7D8225CBADC7C069C46B465BB0
-3F558588B9A6F0330D353A8025B39BFE5ECD63F6A6DAD23A1034B09F44BE2CFB
-F7D974BFFABD8E22DB54CFC0CF46203ED59D7E257E07531D818752BE3E059D0C
-453666701360B64A0E687F8B6B06234CEC96F09671999B301174E74945BE4726
-3CF6B35E73461E18DB1598541CD4903EE143F0FF8411858E57956DB86364104D
-369FA26A999BE77F55F821932BE8C1F6995ECE359BEC8CA7232E70C3E17F0DAF
-4983A7A210F2585266B9AF3C044D70B536630411908DE81B688DFCAF9322E09F
-F0977B628FA31D986C1A66D0F4A6E8A2D7376C6C60099E31F0AEA56CC42E30FD
-DF24FEA95C859905D140824AEB9FFE0A7791C50B22E8E158989FAE39A43D14E1
-BD1617E8F13FDE3BDD86015BEC64003E1D634F3DB00520FF465705B55C18F64A
-695739ADE2508BB69D539CAB9101F955D15BA475043848600BBCB00FE0A2A53C
-C5B5C98B2B0996D3DCAE394BDB1284A6B716D23AD0714E05AD6F4C749DFE7351
-A9DA7F1EE6A630FEAA7ED2BADBD4779E7715B866EF5CD6D17A79674F3F185A19
-EC9BC0480AE6FBD2DD06F3DB4D234F938A4FB5F61FCD5E23B151E89B610556CD
-C649D036DA38897E2603E9E2A5E16116D8484A0D810FABD973AB649646769A11
-534B6C8AD5CA5BC5A38D4236DE32F33F47132143AF460828E7AA912911E899A0
-1F3C85D501D3C8136AF692B3832412113F57F5B498D06E8BC475D6FFD7DBD416
-5033544CC77111B564F7B21465B2BC0429162BA4FD49C7A7A7A36F646BCDECB5
-01E63158A6DB744B925977154927F97628D61221A64F6DF5FD63771F4A76A4ED
-D0CBF03C2AEBE2B364298D7D8A4089EAAA7DF9CD4D0632E38525D0E59F037188
-BA436DEBB3D050B7D214B21AD842DE28E6D46D273F6413FB2B9A508639FC3EAE
-21B2F659568474C617900CEFBB5243D7496F73E0EE7F4A3A0343746E7B189A7A
-B1B3974DEE82543797BBB3D093DABCEF39C27CE8AB728CC971CEEFB76A24EDCA
-564A31C80052563EA4E9F5308F070FC807CA062E26F2D72AF06069F50B1EF911
-97C8873EBACD1D974C8BD85D586DDE8E621F41648BB24DFC3BACD74FAB79EE9E
-1DBE30BA8C1671125E5940927893B2790F7760631A34DBE6CD348E5605B5CEB9
-ACF9EF7A627CBA5DB5E899BD414506329E46F0B9848F730E36553F2A35AE992D
-42D7AE4DA66E75CDD23CAD56D4C51176924D5BE94C2A974BB46E1058454FDF5C
-7EBDA1632EDD353FFFF7525193286A9AF6145E102979CFEE99D9FB3CB1FC2EB2
-570476B11EA9A19A434801D58F4318D8414439922D89E568D6E83A57FD76802D
-C0D30431821B145BBFD0126F2AB0161F103DC8F2A874238870740AD3B8954262
-55475C3BC6B1EC0E77BA8B1CBB176A8959AAF99A2969C4E0A3214D0627D7CE92
-A0D7EFE8E39CD42CC31263968ABDD978F3108C8D2F70B6E386198088209826E9
-6C31F1325BBFF8FD0E4A59327049FDA978C9CDE7D79E565E1BBEC909F8EBB12C
-6BF8505890855BBBFCEE7265519875954B9F44FB1A024C28A734BA1A03AF3A3A
-64CD95D8884B321A43F1041E38FCE81A6B2563C2CBADB04F4036B0208B863FA6
-9E88D301B364AF0F99CA28E1D023539158B7CCC48D092CBE1167817B113436B0
-7AC9BD5B0382F02EB8C8BF99E2F463994CC60A09BEA9A64E8D2CBD966140F4AB
-F361D62845F72FAB9A107059C96E70DC1E2469EEDA1FAE3982A64BC300C9E81E
-A98B34D8DAEF36B9E1F55E3F5697EF6F029E650D480D210014C8F18647EC2356
-8EDE0B22E54524F04BE37DF85FA61E3377A08E57E03B14554FDB1B40F07F2E86
-259E818A7732150B01A71181EA18AF4032E1BEE9A4532B26B9C8C063396DB817
-1A1E25A731C10F8B31A84393E9ECB4F279C884C29A5E596E08D144D081C4B7D8
-CF46E43E35EF09F56892E322D345FB7BCBDC665FFC924AD4EC638AF0959D931D
-33A54E0062C68EC1852047D73E8715D5A6E11F62837DFCE1617608CDE2C753BC
-B1CE0C4C1B151CF1FF1A4830F7484B8B1134617F6B1B60CD54B3623E518CBCF2
-95C49DD546E783F884D38B86022865E8B57139637516EFAB9DC8043A4A8EE1BE
-623EDD5DAF585F5F3A9EB96E6A51C18E0B3793AA94B6301C3473C58B11B9322E
-F90BFE890466EB6EC6A1138CD2AE2398EB1AB8749FADD587C711E18AB171A149
-D262A8EA2A462C4B0AD1A00C53F7C3D3D1C9CE8FBB95A7653113D387ED03573C
-6AE045A7190E794571972FD93DBB5BB1475EB2F946795C131C1572F187F1E6DD
-438DC64EC74AFB6B730830D835642F1456E76C3327850B745C38ABADF4E742EC
-17B3293D8C64E041EDC5750FF5552C333DF29FF5AAEF6214463FCC682254BAAE
-84C0C71D4ECBF232AC4A4DC563C819BF966C37993F2754077385DDEFCE85C532
-95B2F6FAC17A557DA24669B61997BE8D589CF50BA27FEDD9E76A19A96D1D48EE
-4A4D2905E97F89E6C08F25172E511F66E04233648C85F00F219DB234C3FF33C1
-3A75ACEDA696AD9D778666C706246428F6B0BB75F812A4C16A689C9733B0D105
-71F948225DE8A512B7B94298D38555F9486E4496389426C896BDA10B71A25D12
-E984AF2EC3F78613269F85BBC185013872B1572A799506137E9A6A271683B7C5
-4590BC0FAC02DE3E0C9AED49C5CA0E26507DF36C2574C1FF73BFCEBCD4597632
-810D07BA9A666A07A099C06E0639283F42E7EFB3FF8DC79F7B2962967107F5CE
-41CF3EAA45B092F2BC433BADAF57E390D5995B69F1E7806BCE13834433C891F3
-80694297260788AA2EBC3A0910CAD32B7E0B3E5101B5164BA8B0259B7DADFE9F
-84A7C5DC8DB864471CB666F4148991C3530535DD7C086CCC09A768B22937D0DD
-E18B1EE12E1DE6AE83F6FB9E1FB217B1D9BC2B4F8A01907A80DBB16A496B2B7B
-3A00BF5CBD2BABFE145E5E49AF9C3398605DF0589EC2438A167DD38B46D52340
-2EF47C0644CE0258457F0D24FA19676191AE2540D4C98C6764B00D6917F62C01
-276D9E04BDC21E83A59CBFC7C6C252233BFD5C0C96A004B217B1E78436EB81F4
-FC2F82B70B19EAC733BB0E5B3352E4293717DFE2DE360EF780567D255AAFACC8
-432774772791DDC2BA4C250CF314D53DB0D8DB88F2B624AF4337C19F36D5557E
-8CDE1B8703A5F1103BEF1E83A8327F7DEF9431953A9C814D067EA660252BD0C3
-BD0423DA5EDA7EE5AAEACD32ADB758D3697110DC41B6F67CC19F7435BB9EDE00
-51B5D7D941F01872ED0EDBD0E012DB3715BA84F06AD9A7CB13221290ECC5D98C
-167209DB56A38C8961533D3CE2897063DC915F84BDA4095703477FEAF6720F09
-A70F352C574CBB342C3E69EE05242DBFF4BC8B673216206B6BFBC5FDC3F79216
-F44F8E2AADC0172794192CB17A696979CD4F7264268D1CABF9F8464AE0DF3FE9
-A8729F8B6AA0B493CE015BF1BD950E9D89FD9473215AD7513157CB46BD410FB4
-E130B2CAC097335F9C546FC6F678A0C8351A9424E981F316D7452846DDA58384
-5ED585947C87D1E1271E7ADB72085C960D9BBD3BDE3321BEE52132A62A57466A
-F6BF8B639C9E5B3E57461ED4671283236D09F7C26F35EFB6D363417E24684C83
-C758B9AC5FBF012EEA6E69F5CAB55BFDA10B062E6D439FFCA550E7BAA1019636
-C5113FE61ABFF64F29118024063A4359D114E21D80190E293B80AB32BDBA340B
-065DACA9553BC4C0F1FEB1F16E073937B11413C5599C058579543DD1A350F69C
-0C66EF2D800F790222CFA1AC0745652238BC471FD4DED46ADA6226BD83089FE1
-91C7909A2FE12F5F4FB0D41341FF86465D4539A227E782E1FFB9652E853F65D3
-04D9203D4C9A93ACF81DD54FE0A4ADF2E839C997FC49927B92A99616BD77CEF9
-C77266204AF4219EA4D4EF5D974D4993EBD3FFDFF0B5D7AB0CF13279577C58DE
-726476A0C291CB406A8D5DB1A631D404FA202AFD525B54041EE4FCF4DD94B326
-40511F36C2958FDB83DFBC22D6CFECF5415FEAC44C6529AAFE85212E9F030844
-DE707696B057D6AC50EF053F5BD88DDDB9552CD9F42AE29CFEA52065F06AE1BC
-3F1D7B12B2346AB2EBB9024294ECD82B148D17D1CACED60D2BD5EC91447CFA12
-9479FBFB279ABDBF2FAA8760A54708E65EE4B3CBE671447A8DDFE9C51881A47A
-83D5DF96FEE8EABCE230209E6A5208D1FB109D1B49BD2E9278C6603FA82DC102
-CAA038525870995634541931A77177BBF80BCFE9C12EC321FBCEFB916653F349
-244B6DA93CE590D48C6DC0D673299A47621E8397E0BCB164ED6D4CD605570CD0
-AF46D0FDD920181A58A1F2236D7AE126F07723445AA36179531633F8647F88D6
-3494299041A1B7818A7B62B8B8783B97E7C8F5FA7E65987EEE8C87DF23C0B09D
-8E84BEA5B8613F0C144EE32E58C837B0A2037F51B467083EC9FDA57FD8FE5E72
-89455DD56A17275637E21AF50EBE5EB9D573F2D834B0BFC0CFD414D569D4AFC3
-C71219F52DA9A1A73CDAADA94EEABD9B14D42421A562065DF9EFF2784F1F40D2
-AF44CC68901213F1E6FD68CAE79898785FA3FC317F5D402A6697F6E52FEF977D
-1C962966D0E44C714B15BC9B613A680B054D6B64B974AD0CD6C4BA7D255E49FD
-D881755B15859CBF57EAE82406FFE8453AEC2F07C9D17A8C4D3A52B6D4259CEC
-604DBE8177A6C3A96BE29FB309773A1B1472529C21FAAFB3AF407978B250353D
-490CC9BA66416E522E200F5BAF87A3AEA2A556021354D7B74A9AB3CC0955A5AE
-2B462ABC670F327CCB53C939E0586DA606EB7C2DF1C9692FA4CAC3078A250F10
-1A73EAC268EF45F1C3369758E1448600234477C85FB11770D17C36A66CCC5413
-544AADFE34E62102F2528407ABCF5775AC6308C7E3395F9F31976A7C0CA9A95E
-30A5CBB8DE888F8C81B8F9B1A2BCC36A89E0E75B2F0B19EB4145C9CF0917518C
-0EEC1D6B3CCF7DB0EC6354B75B9C54951796C825D9D8110F17BAEE6F4713ED36
-07BFEF64033F1B1E684C6F7D41AC91E8404D46577FF16E2851D3436770FDCB17
-B53D05F1F49C5B6DE9CCAA2B11F5470537C5C80353C62346058110C084C804DF
-7A0B9134752E93B76F54A7A573FA95D6175319FF47496E608241D2E33E51030E
-B79B9E4838DDB48A81DC4DE9492662F91C5308925214E2C226B28D8264F96E16
-4A49B248594E8053F86234651DE05A0188E26BC3D2CB7116DADBBC4DF98312B6
-8950C20F99AA330B1F011370CB0E50111CA1CE3773ECE6446742DF74432A38B4
-800DB338C4ED84E75506CB8E601B345BF60BA8B49710AC9765B33470A85FBD2D
-BB0D2000FF9C0EB524F44AB6A0ACE74EDA1D46317CB2BD488B621FC237CBDB03
-B23A450B64BAB89B60FE976160E5BB90642C647A0FD609B2A6DE281A9978ABEE
-0CD7D99F087274C3AC641CBACBB0E128CC29E141F022E4A404BB25F7FD57B58D
-582D176EAADDAE7E3385A93375C8B37D11924AAF00565EF7E53C117F10EEA3A8
-24D6DAEF6766D9BD9429C84448D9F1890BEC8FE63513E5690426F85655741096
-D2DF9DEE68530E79B08CFF9C53B280581C6FE3C5C5C8D54C54705F12B1CC6C14
-7606153AD79BB94473AEE5056ED3974B71FF5D3AFD68AB651A94ADA4F84C58DC
-42F3E29D3B7423C72DDE240542F038B338D888910E27B4F55F40F11B654B4BE8
-A196AC89067CD52DEBC77E0C4CB4B387D4D7DA79FDEC55AD017E62AECF4A69AE
-F04A2CD3F7F897A50FB1ED048B117A1BED63E07A0B9645EF7CD6B91FECEB75B2
-3E4C48C9F82300F8C100972F29F0C132F3F802128B3C28DB8C0C557E0C18B0F8
-F6F3085E1300FA06B9C360681B8B5083079B79BBFD9E8E82D160E8208A3940A5
-553ECD27B328EA8425A53EC26CA31D86D486D9EC8BDDDCCBA4421B050CBFF54A
-7CA93679FDD917E46A288060E42FDB60BCB784FF90045821410FDD246DE7F240
-8E4E5F9EE7A97945D959936D692C5345AAABEE0E739C8BEBA85316649DB457C4
-308CFA1AA2D107AFF0EDB39DB5208C4F6FDF48B053A1D7F89C473A158A031213
-80B96B47905A4FF806CCA81002C3976A4ED1849382ACA1BC62940D2F2B5423D8
-FC67B48D387B440A04C2051BB75B24B4C15F6B0665988427F23A3CBD576436CA
-4656A035E9CE18B233FFC11FFC35A88367DC48D61512CD052824B2272A92304B
-5D04D414022E16FE3A86B047194B7A0A29DA9E2111A575ED97405E78DE606058
-24E00909DA25E9F50E335128969455E6D3610F129C46501917A352E5F34C5C30
-8B5E67B07E4E6886E909FE8DBDFB2DDC0D3DB1F4978326A50ADE74998840F3B1
-5E82C51F00454B57DE06854A58A38D34B5B7197F46CB9AFAF975198C7821029E
-4CE991BFBCA3115EB5131414640292341979F90CE55FE7D737BAADBBEFE37D14
-F17C8D795A06F04883E3207A1E72AD520B22DCD826B676463DF341E365C3E95F
-58CC0C17FF5E13DA0CAE7601D5C09D0F5E5A06BB0452D26D3399AA084D88D2C2
-AC9DB9261BDAA3699EC899459996E26EF30C36B636B18E5532DEFE9EE1157949
-D719550715D577C1C541EADAB9564D2A5A8EB242014C65764002DE9D1368A3A6
-F7C2B52411EC39477E94FBD8E022F9B3392097953BE4F90F6098CF819CF2272E
-5D4A4C202550F1DB1D98A097FB8C1B1636C2E90C8E903CBC9461066D6D4F9694
-C8D0452C4AF2EE38513434633ADB80E1CEE43F90DB31DD3402A9A8F79F9E4C6D
-4CD4F5F4B8256B973923766DDDB1241E963F456273A768608B41B160472512FC
-5F708B6862C97AC5722799EE650D6B94A9CC66483FD6BBF17282C1EF506A3034
-7751B8CBE2494884659CB9B9E71126D50F2F771358C7ED0038C67721E4DE280A
-91174C08D3D1CD9CB02D52EF619EA3BCA6304A8C64D277BB7679A0E13E12BC26
-5E251DA7E103F7E82436FA55F5CEAA984B0920B415D919AE9698458E336FB257
-2E4A4341A2B26C69FBCBEEC84E608777CFEC5C099C912B638037C7F47828F5E1
-D47957FBBFE87A5A7B5454435510D5A79B769EEF11199C6A81E64D7C84AF6E42
-80C3185BDB0353584EDBB0B8691505CA9B69321DB43B9DF3F19E0A509EDB55BC
-0D1BC93EEDA436AC29C087835CB7DA098813889261C2591DE2C20672A9260E6C
-F7AD215E722505889A98A0FA33D9C3939B5FABEB8598F413A47632A029D99E6D
-1E40079A737A6EEE0D5DCE9776746448B4DDBC1DB82075FF8370512BC31F992D
-0C1865E1EB7B4A3234EBFA45B5DFD2803770063E06F54D07DCC059022A2F5793
-2A87A7E516B7B69099328F1274B491261FA9118F4305814AEC9154C48C2E6E63
-96C5E315056B50F5FAEF68B76EAF217AF680340A8FC7F91B83D79103E1B168C7
-6D90577D2E151338A287A5D8F6D45D21EB07D98D1445157EF9A970858E80ADA6
-30F63B956FD01971FA9FE829E99D8F460616C4462215CA40B7BDDAAA74EF9CD2
-20E86A2234C836201A7A53E511DB8C7DC430CBE22BD1F93E9010C27957A20FC4
-714981CFE0EB619D9A84E1B8A1985D5B638FC686FC8738CF790D91D97741A74A
-FB39448D99ECB58E7A7A5C061DEB0EA250BD616FB538CE3F332E455860536EA9
-7F59962BEC3D23EC294302604305C544616D3245EF904D6A62517BF85BA33090
-E68D5AD9D974C7A97CC63470138DAD63DA0FFCF87FF4476EAF26DD7C1D89B330
-9D11B5E451B73F5F6D254939EECBBBC90596EF0EBAC7D2F6A423F44026DEC23F
-70356D47F2911351B9FFA5D17B8A5D3100BD020FF83FEBF040FDB8E179C74105
-376613C15F5BDA64F18E162CF868DA0862F89883CC6822B266C1EDC84A2A5A76
-EDE519E849C2794B5975E968CE9001D823F33FD56E14E857D1DD6C5490EB678D
-80B66AC404AF5C25C00DE8FD8B811F68019A325BD008FF2758CDD0CCBC65979E
-2B8F2CEDA715EEC6EF000AB97CF24F5021F0529C8E52DA2B05278E9391D0E164
-DAC055D267FD3403237FF9BE4D30660E192DC8AA46EDEC4230AACA029C99651F
-DA02296C4A7F48D3FA14A66A46D3B2C4EFC585B4638DCA012505A09F6DA59875
-3C418609DCCF6EF10336093B10BAAFEC6447D8820F7F1D2BF8A1692D3876C8CD
-2152617F95BE5E507C9FD85B65CCC9716157E15E9A9A163C95A615981F67FB83
-B9A30F47E660766CDAB3D2FB5D4B32CC38B1EB62F4B0E3977EA0CEEC21391C6B
-602EDD051F432F219FC7EA421597F67D09B713DB13061DAB18219213F340E5A3
-CFDDA5A71F5FC87E6AE0DF373C0F4B38CCC8A69844740E63E17E526B32718E4B
-E1678F5B1EB02F35ACD314962D7D0111369142F1F318CC5CB72D21A1749F3C80
-744A126E6FC8875FF8AAC49573E9D28CBF5EEE5EF984507F01F5B56C6B2B9012
-F5C2D8C85BD09F8548D24095B691888C39ECDF6C1961DFFD56FB055ED7C620CE
-3E680603440A9368C457C95E340130B86737C1BAB1DFB2DCBD14A87FD61359AD
-F633434879EFD38A7DFDC11F935AA0271875377A39346F4809792D75D3D1A036
-DBE9C6E0F4BA355EC58E46A7C85241D72D3CA87B2E5BDEAB24BE6E087CBDA69C
-F5507560D13D13510640742CB19FDB451C2A313D3FBC571CA74E48D20FF8C998
-C30E56C2142EEF490F5F88F694708AE7251AB61FC5A55FB1BF6D975F750124AC
-21CECC1B8A9175BB8FF8EFC8DA34C873E5C3ADCFB3AFA3EDEB4A4BAD75CF63D8
-4FF86FEFCDB51FF7B8887E5C2E4DE36201AADAB8BA2671F2F7154A157D1C9700
-7528B1B9509C36428E277BF37A097A281F2D9ABE1AF16328505A265A4F2B8F9A
-E0D8F6F391785358835D5D382FBB2BCF5839D78EBD49A104ACCA215C17877E59
-B438ADC652A2130F5E79D4441BFBC63CA8AE9D6730FCAEF12C92FCF1061D0E24
-83FC035789A10DA0FA865CDDCDDFF7749D0723115D869E6DF100057E2EFEC85E
-1BE6C671205128371FA4D39465FE54343BC195498F3EEDBCE65B913E9A45F96B
-5591241EA325970EB5F2CC9791B632F057482F8E1309D3A20A52C2398BC96673
-8D6F30BB78E4F55FF4339CDCAFA8C47A4DBE00CC0A3548B1CACE66925427B900
-1E6ADAAB861EE413B225C26DDC765B1EC7DDD718CA0AA0E7E0B92A4F11435E7A
-BF6F106538B016EC5C713774BC3D71663029E0AD2D02674AAA26A91A6D048D2C
-8380645767CBFA882FFB0F62B5452AB47953C35DA3CD6F178B5006DE79D5CFDB
-7CB628E29C3BA71674D35F346488892F0C1FD53B47B8613BCD6FD8EA73BACBFA
-15C85653D4DAC9924A324423C92638D93E2C9DB9289271F7DEFFC67C5CF3DBD4
-DB5997D9356A4086B5D2041EA33C78EB7A4B8271840614E5D9021448C93CCA50
-85EFFCECB75F30B1466869558851A9190EF43F6C25EA419F02D0B4A571C62454
-2B5AF2D07841904716A18AED7F49DC7649704FB5D3154D1BEFE2E47073D9D2CF
-40D1D6EA1D0806ABEEE7803DEDBB65F30E69E0EA7838BAD0E878A86359529A8D
-716C6123D5BE99ED71A47CF92D27EF42F8BE0828261054C62565CF6DE988943D
-0E653E4A4E2EB84AC004FFCFDA56E5444E36B1BDF8021DAD38D68975F68B96C6
-AC7DF86DFA8B06E85669487FF3066DF334BC3F7C7A0A7B728653D333C901367C
-9434E3517D782B7DCC366E5D1217790F14C87839E0F820A7073E8E7ED430B6D6
-50FF6E60F50E6B4931ADF0B9C796D47CB44C9B8497D7AEFE83DF411DEDEE59F3
-3D9D24C893DC7C9727691818D856A9974422AF79A32AEEE7F84EDE5FDB53F405
-0C4CF8D19DE038DCBAA6B67621BE99979BC8D08801682CE7A6BAF9AA0920641E
-19F99686191AAD34B84C6497D7035DBD189A5D868721EB92EC73D62DFB0E272D
-6C9F5048E0AD5AA1E8DEE499ABA2F8D891E5EB8BA3BFFA54DABF3B16E439FC34
-2AF610DA9801FD977A102A136DCD03342ECC66E68B983E344ECABDF95387D7A2
-C0F749E5C9F5D71AB50B9AE441D7053332CDAFEC4E57FC1AFC794EB367307AB5
-750CB771BA33C8591D4CE3D0E8C4C841E3FCA230602B4609F13433CDD4D0815F
-7059BE698C1F4DE0D0297AB43C3C0B6417CD6DA5629BB857F4475DC30267D831
-01417146B0C1C7DCF877E445FA50C2CC5A433EAA684798E2EDD76EF9BCCC978B
-1A6473F2306C17A6B92A53835E2F6C64AC1D129644EA310A920E420266CE2648
-E3DC281BD364B5C3EA9933EC57E55FC1AC534FB4932C1764D84458F8B14A9D18
-3E99ED71B7D67CC839E9FB4747D7E15EFF60EE9026598D7FFD39CDFC634F6543
-4D538D4A33A5C563FAE46EDC8A7D4F7B62BF7538694CF5BD427E01E60CCE30B0
-50F2890260F7B8B82EE310C5E20E1D02310B36B76864983A187BC6FDDE8B1617
-F64C971F69761AF5C6CC550DBF3C80E69BE8B2AC311B727AD651665EE53F9350
-D472E4CFA202E95CD72AEBFED28F411F9B7DC4C2F7F9FD501B214E9950EC3F7C
-684BC28D0A8272A769209EFD48ECF6A633511388F5738FF97B84B7230C78E9C1
-C76804160BF038CFAC465E3F5ACA33E2CE853F0191415EA84072F9E44AB09715
-950013A33EF8E0EC7A9A7B7C10BE0DFC17082ECDD1C3D6E108F098623008F3D1
-6E926ECFFD1A0743FD695D52008925B0B031C14AB64FF996FF6128DC781FDBD6
-ED3C9B0E80E49B36B3C4812E9EE63A70C689172C65687BB83BA8E7916772A06A
-D972087B74718FECD5E32CC04FA76B57915DC0827C9D387344E72CB20E373325
-66037392EF2D1E9B7AB58609145AF02EF435A2EAE82C06F29B8E736F081D4FF1
-992BB239C627BD9CEAD20D82B9675B70AB6603E4F932B3AC9281DF73F2F40F52
-C2FC6951D6EAFEDF7F02BB70E1B5684665DC0AA3627AF05FAF58031D6643D0CE
-A54F11E2D07CDFC9DEF212ECB685522C9D6F6D6290D59677AA606313D0F44812
-7A4A7E1E2C992286184CE893B4A89FC32BAB2320BC3961EE4B49E9351C2B28E7
-0B28A837FFCF09E2F6054902C0BBACE191453FF48D6D0B0190BC3BDBE365846E
-D2A8039ACB5D9673C50C0AA82BC0FDC339FAF8CB61DD5E0BF5F18B9F979E3442
-4CB364E6D9AE720DAEFFE1A862C0A68EDABB17C4E43278B4A4C98C08D975F62C
-31836B3EF8912D40F1D211ECD3FF967EB36F332E3D8D7F7C98D7B4A57B373418
-C5732B949E391CC6B7C456E72E6ADEC949E603814467DA7D2AEBFA32EEB1A039
-ED79359CBB060DFC9782B28B7481B356CE2B39605EC6658971360EED1C72A524
-A95FCF684A44781D103CCA8B11D4390524D1201B68527E60EE2CEBBB3CD45E74
-9468E5A73EFF365C05EF520230A52BA4FD53405D08752D01613029D77EF2A7A2
-05F79644E955660CCAA3F2CA5E58ED822F24E73970C92562F3AE99FBFB7270AD
-D588318B44A214CC4DA5CA6CFAAA3F70FCBBA7F0B40767495A2F19599F8C4DA5
-A055EE9BD280F09E693A3B196A37628AC7115190CBFA9CE5FE51B5BCCCF86DD7
-3B2BCD92FE8F51246D0CB193661F197F9D731A3B719D87853D1BD267A16C391A
-9D4F1E8C16818DCE0D24F7213E3A140C07F66E465BD7C1DDF762F48633464D42
-7B8529FE6968B378DD6140FD636185E1C58C4AD8FC5FDA1F5D1ECD76E81B2515
-F29BD82DE369208FC9EA8ECA3704CAE5944CBC74FE076852658F237F3AF02D43
-9E11DC17C900E66910009893C751E74E3BA60B95605DA55CB9ED4EE060A34859
-7D0DBB5021C15E596361346E07833987845FD9AAB8FE403C9455C21B4947B978
-00840CD11857A4979208E2DFF63E5EC4D9435E297CB1EFB5E022EB30FD1C9508
-C26D1135B157259FC7E6B53094F4EB7E50BD21979F428CA996B438D88E02BAFC
-D1C2DD524879A76FB96C515F18DD3BD49A9BCB9B6D5BED899757BE7E748D842A
-61B916DF86CC3CA1431A9D3B6F048BBF4F348A70E03EECCE83961F7675CD8821
-9241C0DA67E5BEC09EBC3A4A16DBF7F42FF35D7BD3EC21B52FAA4D1F6A446721
-6F9D2C770CFD004E830CF11BEAA35FECEBE878B85A3A0D13C5EF7FA6999DE090
-3CA1A7C149AA66CEE6AB31E3F376AA4D3CBAC14BC612D5DEC98121D32BBCA0B0
-97BD77384E215A3011EFCDA2E24B2866C0CBE8A3FA646CC1D40F519D62A7B6A1
-10A442599852F9352221219EEC7873DE48F0105F95AA4BBECEAAFF33F94BAEA4
-B90C5A44943E4B9502598D260476DA762FD3F69CF92CB3FFEEBDCC3A333CFD31
-F5893F591CDF7A14412C7B6B24FC6451BDAFA0B88AFE3BC385D30C9459BACD7A
-4A50AEED28243A668562956006624E4F557E942212DCB86B114C5F88A1064CAA
-FCF7FDBFBF62609E114E9E1AD40AB62F6D638D866F278860E3F89A4987CDB130
-2704A70DB8C42D1CD9BD22A1494B52ED3B71761E459C30492601ED712A9A1751
-CE57443CCCD28E6116BCBCD227C50437AC7812E7AA9166AE6C0078B7695B4853
-4880007783A978B75D2DA6CC7FD83B1E7B07D55078CFFA0312FBA9062B6DEE2F
-B1093B47682FB325F3EDCFC428D3D56DE67101CEAF945ABB8BEC9A9B223C092B
-A322E0F0319495EF5A6B8F5538CF76C538D5D57E8D05945412B55720ABAB2CD0
-14FAF4DEF7793100A21715F4AFD7B9A2EF18A633F5767DE967E03954A7052057
-E0928F7A8115C2971DE3B14FD72DD75665525EC2DBFEDBB3153B7CD0B7BE1E5E
-A74148D557436C3F3780C8DAE74A715A41FCF50B069E45D3451BEDDE480F3689
-0E48EE9A64D35252B51672021805C0D7D76772470D28616B7E760DBD09C52A82
-D83AA682F189222CA3A01889E016BA4854B1ACF2121ACE59DAECEA323F9CCC34
-5644FCA6B0537595851B12A3C1E159D5CC40E9B632A941EE0AFA50CFF3E26575
-A3B799D850DE384D1BCF84AD581E30B0EFAC66EB8F4FE9DCACA0403F2F42BABB
-C6E30BD7ED53FCDD893606CA9F41EBD95509EA1448F8BF76BA545B3AADBA02F8
-9591452EB3310AC78FD5F86BFF400475F9680452976D717374C62B2AEF3B6115
-53885C26E4E2B35C58847F36B825CEB631C11109E5E9EBC52918DE2A9DA5F3F4
-D2350E2A69897FF8E4D148B2F554F22B95EED13BB4CFF88DAF7CB8EFC08C4D0B
-1A4DE99652B29BDA1AD6C58FE3626A1D31D0FB3234695835C33EDFA37584CA48
-5813347EFC28237649F5A29775D2681CF949130F93BDCD16B759B44EC210F457
-E09F25FB0368E4D98209EAC333EE2159612984F18B8F06DC1F7E89F2239CD7B4
-43FAC95CB2EC0881218DD3AB689168AB4EE907E09490DF361A1BC1C978C7C79D
-6FED7176C2B72C3F7D64B01E635C404C6CEEA25FBAE5B5669B5D089B562B1408
-D5FFAFE3C1C653A55D6F1F6EB4EBA1A56F8E255C15B41C6992E070B1DBE872E8
-202F7163E36C72AC78DD56CE8239BF3198293006BBAA89707D90E4C729D774EE
-165DB7FF5988125094175A7196939017EFE1A2DF1ED89EEC5309790AA50ED3AA
-1B310BD333BF2970CFA038C3DB87BE39CB6BDA17706D5508C26C9F8B4FFECDD4
-43E098165E0D0635FA8A54C2776C655113E27FE1641E1738B13873BCDAB2D922
-85698D571A6EB65A8F33B3AE27DD12C05F08B57E307A7B55561805C0EC855E44
-99B73DD02A6F95156A9AE5C64B677DE5339D97F19F4BD75D4A1251DF34EA169F
-5E5EF8C7B7D1043BF75E80212D05B3C3A9161F68FCA385C1D8553E299F9E2DC4
-EC56F08ABA3B8F692A477595AFC231A319410B97C5A34ACA08133BB3B5E7D449
-63DBCE7A0404711C7CDB14BEBF3405F1AADBD8FE13D8423D5521E11766EDA4FB
-8D751F78D4E012237C0F90B6F8FA1E42EA550FE5BD856DB4CE9F84908DD27B0D
-452373A9CC8CC6267A6C8B8D5B253A7F930DE0A861540CD3D6C5B68B817DCDC0
-11074810779B2E243C444DD60FA0E165B662FFB16418DFC1E476BD40549C09DD
-EFAA9752533B315BBC5072A3671C294126A8D4DE746CB0C61499577D3AA047F1
-28ABACCF06BC80D32B76D83C4E4EA743D61BB4D8F6309C5BB8320CAE0D0E84F0
-F5E407311074CA8260A32D676B3015DFFD9442D9F3F5E55C06982B3E359D2608
-8F918A354373C5F8209CD51BB8AEC4786D2591108D6EA01C0CD335FF3D007184
-F056535B30DA59FD9916531C9AE0EE69F9851784E3D79DDF5502D878FC92B08D
-D94F0538670EE8273F0AFCC92CA9B34BC71F06080DFD08DD0BEA5FBB4918DA94
-1AF17468F57970A007EDC44E7D095C66E6325A9C55BDCB1E4F0D003BE568DFCB
-D49D0C91EE3DC0514CBA3707408B35428689AFFFE60EC051CDCD04F8DDE96BF3
-37DB8DA3AF0587D4E1F7AB4DB221EFA93094BF7C8BA71C66D41A850C873EFC6E
-2B0FFDCE7524BBFE592D7C5FC27856125209A19CABD8390E436188984B982E84
-EB38C95514C5DD830ED54908C08B5076E174DB8B3A739780B96C085245AB077E
-83734DBAD19AB141ADB004B4B2A83A579B60EF3DB586F18DE7636692956290F7
-2DF3027C7E083EE457D4AE6CC35E11C90405304D9B74E0455E0DC2ED84D3223A
-476C7442336595FDE7F1D9CBD3B108EFA3F5BAA7C3B03FA2AD9D0BC7AA2C0160
-4DD87E2DB156E11F0410C59556A50A989ED90F37A167349B9971DCEE6F840117
-7A985EA44452A62A69F2406F0E0D781B7D52575171190D42F2156C67BF68F828
-1947A1E79ABE287D6A19C2A2003891AE956BBF4F18012385B249354093DC1692
-8D7B068CF6B371CDCDC742A20AAA4CA6DC052CDD2A1A3292352AF976270951AA
-7BDA8D6A408A761E73271A77E4A6C299161FF3E2292F77E8D319F5A39041741C
-FAE69BD1855A2DBA7CF238F0E0F3E1AC707A420D40ACF1AF5D79D268A01106D2
-27AEB0E25D265EF85B6C4715F8B2169B191FA5666C369C3DE090D352DF99FCB2
-A359992F5379F796992C77C4648B74D2BCFB70D2CB88644E6773B17385767C53
-63A897E259DD25D1DEC1B917270E9C2B90432343A02F62A3E864019EA3E48350
-482ADE56458C646DC3213CED67C35798718467536C417EE7ECDE3D968E5E6E80
-00BC3317067F615FDD4224B8A4A6F2D063799818681FBEDCEE6BF532FFC9A4C6
-22E99C5A3B6B3B8B0906E19934E7B4768E4229C9993DF93D279CC08E624D76E4
-97F5C8A68B9B0A3E20DB1F97AD62A9EFD0D94C86D5F5A50804D93680F7875E8D
-CCC5D9720BDB031E76C4DE35D408282506715C928C4C7DFC1CE7B569830E8158
-C64FA2D3791CA5C5EF2FEC2D0E7CAD0F72C15FBFE175C3BF768A011AFC3FAE97
-77F15B35F618B040B5DC4A6D952C947C93BFA3A49CD7660548F0CB67E1B7EBFD
-B02F89B429212C589DCC26E8D0A862F978743FE67E6E3CD80E9EE36023A90F9C
-6EF66BDF100B09613E6903BD7BB4893757F772842C8E71E01529740A453A5FF3
-EEA0FC407143610F244547C5EC06F18182014EBC167667B1C3469C5E36674DBB
-CD9822914244A3FEE18C6B145EE60C806DDAE13A827B1BFF9DA3C5D7219689C8
-4F425601F01CB9E15D67395A0D571B3B189818822E6CD0537C661DFAA8852E56
-1DC02616F2CF080976E48997C2115D1BDF863473D7B76953CA6B52F23F7464BE
-50CE2C9875882D265A9DD514E41F3CF44009F5B71E1F52D09261D95C025F1D51
-924891EBC45A09E1360D062CBD2E65DBBDC8BC92A7C3BF8FE1CC570AB7CC1691
-129650C975F1EF024D54FC934371E605C47E06803D85915B582E86A3940618F0
-6FFFF72D7369C2CBE7A2A5A1E2DF9373BD3C2D76AB12EDD4F11291781DAE2F6C
-E0601144B6E3AF22F5723403303887F1A4EB9EC17A3A0AD2D020EF2FCEEFFA9D
-EDE73E93B6714CB34307B11763A1B833E0783F918F72C508C529D76CBC4F0AD3
-EB9D86EB288648F2857D546E8FF022B5B0B039E490BE97025DACEC16D8EFC44D
-3D2D45FF8395F75EBA7BA973ADB7EC73C539160DBEA3E380F875ABDA51710054
-EA6D478B39E06839C5A163BAAECD19EE086474D9EB302B818061E1E4E6FD1D12
-FF82DB6077D6D6C99309A225074E6E8E92256042E3E88FCD9409FA1E19E90047
-9697E4AE194F086908F91B8D34A649C060027CDDE154E9DEDC39D9F6AA90C217
-2DED68743609DE718C75FFDC92FCA076BE4D0865A249BC72000F94E4F1D03FF2
-7F13CB176E0DBEA521BFB4A536E8FE36639ED3EB0CEAD041DE6455138576BE7E
-41AB953FC3720AC4F3512BE290A5E2D5C63132E1B0D56ADD8728CD616117EE12
-066D4E68B82BFFAF18B9DD91CB69558534CC419E600EE3E670250D0E19F2FA17
-A381077973542A10F6182FC3D0D250C24A2BC5C2E3AEDB7ED3FA858D558EE47D
-FF81A4768A9A233AB11C844035ED5718497E3395F0238686BE00D975CF7ABE92
-E0C58038AA7B09DF68EF4C559ED91AF5A6E607781C7D540BA0C77D4691A475B7
-B39363B6D7CB872032C4C8E382127B0756E0B91BC6F87FBB050C630453C08493
-AC24F4BC8379CA871515C8F503BB0ED5CF55A6C7BFBC7A09E4208776603447BC
-068A016CB63AF338355B44545B4D9FF234403E858D2CC43584DB031F8EE38B3C
-2732293233312769A0A984ACD721FFFA24A03AA9A00CD1620FD332EA6421C40E
-F4E917FCB00638E8B8FCA62228DE95CC02CDCAF8B2A43BA5950881BD7136286F
-BDCE88C3BC964E268D8BC6EBA1D367EE179CFB277778F20CC21DF0DA363F73FC
-A0CABEE965599A00FB9DD52C9E5EC85F598CEBFBC43C6B1A85CD6A382829FDBC
-D65E57C80AF9BB8D33177C856F488A91F6C97D89105702D9E36D3CEE11657DE5
-848D08C6F777ED161CF596C2C21DF22D5CAA13E9FC2B0DA8847C63B78E9D8239
-B48EEA44A4C1D17EEF695C8ABDF5F688B0C71537BF80146CA2DBC3030CA9D942
-1BBA232834D3220B5DE5452109AE248D0F5C87F26813BFAC6A953C49C456A74F
-D0840CB8E08AED6E07BFDB69AE6A4E9F8CDF872DC0D05D3CBB3EEABADD5428F3
-2A6E7C217E8BA597B225A08BAAED70C35EC9FFA8941D719B6E228C3E1BC94879
-FEFA33CA8B6941981A8E1DAF8CA642C7A6932686EB7E77BB54F4477290DE593F
-2AF063542CF48F8C0D92548903DF4144CEDAC9B9A4E83824839188D0755AE284
-07DC1C008BD7102572EACA79DF2F069BD6C53818C64D855F2B8B3658BA55E78F
-391BCD00E3E517B5FA7E738B10F304E917522BF4AF52AB6C799E1839C8CF45DA
-28A598DE94B0F4101C5DC4FDFA8D22B53A0A9D557B8B84F8ED6B0ADAC375B837
-346130A77F0B97CC46ED60A454CA958EE065584A0E3BAFF867CB29889F60BA44
-AB61DEA85910F12CD0F297EFDEB244ACC85537514159BF2277996C674D9B22A8
-94D2A552AF8556F487B6357F59B3EFF328F675CEA434F5780C1C59E540942274
-D6852E2461EC38DF58D6173EFB3A520EA6E08A6904895097746177A1F2676225
-A229432E5A44B77909A74D1300BFBFF446AA4394524F93F4621A10AD5DC44722
-0A0F1B79AA194C275EDAC3E6016E7FD5CCE9A47A493CC0DC6922B639EBC98EDD
-C906452E37193235127A6FF5F873691F98D714AF9E834004268D85CEE5D87D4B
-C9CA8345487900A16AD97243BFB135AFE42A138C2FC26E7F7C2F3655797608F6
-A722BD7A87880E7F7B18E61BB5C780A62E81578C2E6EAE90468CC53C16D34888
-A41F542ABCFF5946A475CE31D631010238C03288ED5EFE6AD0A08F5698A55CE8
-6202516ABBA71A3837168DC0F3605D7B5FBB88FEEF8F62CF8014F0759912E0E2
-883134B6D916A436864BE76727743F4AF4630ADE41507AEBFCDC4BDF1B09866B
-AD6C12C854E15194E756B96D2C9F986154E767F4DD73ABD97D31C0C5619B5CAC
-6B8F9F709BEA5A9FE2A94B70C0B6E0DBF63F849BB253EB68F06E43513EDD6F6C
-F80E10D98D348DF6F6FCDE5F0C20030A05AF703A5F4EF72F09313E7EB7450AA2
-BCC6386463FD43B51DCBBD2F585DE6AE64C8C0A58A06C26377E917EFD2477F9B
-0C084ED099199C387A3176A2DCC142C8103B74275F997C4E38BEA75F25CF3594
-079939BFD5DB439C24F25E5D900353EFC3A71F9E826D8019148495B692137587
-354E52E822609639ADDA15D9C466FDD5E41A6A3BCFCE8DEBA38F3605B4E262DD
-3D905D67B680F04E08208A21B7FD8ABF2D41D46BEA9F5697E32EC9701DC0F395
-B41101EC847CC82259A5F603ED6D8B311CC68D48BCCF3F88D19C2414CE01FFD4
-DAE254116363C032E274B538712310F46C2CB3E54F85D14D8FEB6751068A5785
-788CE873183B60997E0D5A0E54848383B56020F7105B5FFE278B66D7A4D075B5
-B7F02D7BA1EBDAA9EA32EA5953591DAA2A39FC9A72C364D0FC44D199BC1D035D
-F5131AA54AE791A2223AA3FAF28FC36ED32F102935B728BFAAD51EDF8A379C22
-193172FD86F26ED77EED31405D2C5A964F20FE631123DD3EA41CA5EE1A6A0113
-5B6BA096FBBEB694E813C3B99672EC808A0909A9AE96A68C0B960BCDE731A49F
-DF5F8AEF17D96B253E80064577DBEF7CCC237877477FD25650E26939CAFF93ED
-A7354A9FB698D629CF1CEEADD41EB09048CBA593A6D2698EED63F5281ED9CEAC
-4F6D8447BDAB9573AF6A69326F82A1D28C1D71B5FBC6BD0160D5D058B3368F16
-DBE9BF339018ABFE4B1462FC12B5AF34D94C47F8FD72320A2CFBB2B5C6D871D6
-630887B9022B75D603DE136AB08A3DFE989519EB471C308BF4CDCE9895092439
-190441AEE9B95D976F4017EDC3E2FAF831767543507A36A011000F889C75695B
-73B38DD95EDDCFE98862142096DBD55100715BE46366D0B4C07B41BB86D33CD6
-6D069C60B2479D512CA1BDAE44760D26D1E1AFDCAA882EF6DBCCDF5C8C9C0351
-55C58985B1E558EF7BE135405B3C6F436C4B601976951BC2FC021C95530D4962
-4B1AACB5CECC35355CD348565F2FFD9726CFB074F1AC582B433D330560B72DB7
-7E1DA2E2F92E695978074DE5ACBDE9B3BA497249A6E31629FF041E8F9D1AB785
-9954E01AF3E318B983E57668D6F9A2C71CE7744BEC3FA216ECE3740D70445691
-FB86F4181B0F8DD0250A0A5FF42E07018D0F42D2C052751D942AB2ABD417A219
-15B3F393CF8567EEA0991F9C749AB79DC9CDB9972EE564AC97281018BF54C116
-F5678650A7C0408E4CABDF28B7BB84383B4DA3F3B32B54F1B01972EBBF2C540F
-AB2C85B4E34106D01593D680CEE680B83E335DFC30951100DB3B2F1DDB92169F
-86D88093DEF5FEF12BEDB7334DE681043A76E887121AF90AB152F6B473222355
-C088DBAC06100F32F9601C5D76C7E2EFD238C3B1F06E91471E2E31685E7296B2
-DBD18DC081E23C608BFA875F632C9C2943C10EC6BAFE59F116B1FE4474FE9B34
-F1F831767543507A36A0110017E3AF059AE3AB77A75F4AC116131CF4CDD06D1D
-57A80FB17CF0608A0D00E77F7769C2278833EC936584C62BC403E92716EEAAA2
-E4264AAF7C0340E1C3BDF93090E2E9DC77541690BA2CDF850F9E1A967B3B867D
-1961709D9D3D5E3D0D9013BAC0D2A581E09E7F2F4ABF073BDFDB2BD0FE1C8162
-B1A98B5AF8382481B511AE0143F87BF420EA3E4B82D4672D449371F4E1AB6165
-36583BC5A90CCE79572D8E6A3C6CA0FD46FA494765FF4351F6A773D4EEFD42B4
-A2A1A24DE128D63457808B5CAF5DF465C1E966923DCDD7E3099A8D43C3676BF1
-9E3D6B1E7D996664E063E0D51EE85CD6AA56240BBA9DCB5485888E3F7436E467
-8CA74F68060D052110401E694AF6E016184348EF4C6FFEFAA073498205527B2F
-51EB6276E8B1A483ED40E46D10D775E5E9FC3A58DF4E4BF7E7692E61BE18F517
-BDD664E28E4EC5C6F53AFAFD18CB2FB7F9F4B2A47CF529F9536637875AA9FFAF
-544A50B142F015EA16B9A1055B5A15F184E4F6BEEDC245455943A3DF312D7F24
-9EDE312CEC2160BC7A169D3E9E6917FE7E795BB1D3D2733F0E77B5D265BB1DE9
-4641C27B08879B89E76E0AA7DB55C373637EA09C358324C9A0522F6E26B263D7
-2022A0E788DEA549DE6A1C991A3BD85C4EA3E71C2B461BE7A9121FC09139992A
-B474CF3732B8EDA9C38F903167E4DD3B35BF99893747ED95A0494141D3234970
-B9D8DAA1109F6DB5122A23C155A988FBC188C5A0E7540392C039A6E7C8553473
-7889355073080E32DD4E529DC97F6E7040C5DC37214DB4BDEE26CBF1E2E2E7F6
-A06B7D9E86C7561842B61A3E5C4B94DCCE011BCF92092A00D42B1A3B3F799F58
-11A4C8115DB64711BBA4AD932297F91739565F38A7FE08025B5CA3C479E39588
-5657AD3849A134F035FD142A263A1A68902ACFBADBC4CF3E64A10064C5EF7B5F
-A8C5B11EC9199E75B83A1BF891B2DB8B180F75E942471E7090E9E78A97507941
-9798D4CA52DEB18C09E4C4B24D4FB511681732E021342BF769437EB266EABAC3
-9332C3008375CD804DBE03AB0C9B5A29475E6D8C79E61ED661819BE50AB9F1AC
-81DD036968F39844EC50555A5DE8345382150B2693B607A67E0AEAF3DDD09858
-7AC8D0A3FAAF552F1B224F0BC57B967E9988845C61AA68AF74A3DD5BA00AD7EA
-7BB4D503982779D7397B566EEDDA93D4E3FE0558EB8351B7F15B4BFA39351FBA
-0EA54BB0FFD1D31E22E8C00BB3E642A64628C51A5CD3A4B9AA240B1E3EC4F597
-9A1090ECCA2120EBAB4132F0D81B60A1CEBDEEF87161DE49A707240A70F667CA
-5E78346070629D8C4480F9FA4B5026FCB7C48A149AAF3C909A298FB39CD6778C
-E1B0B400B1E2EE7576DD50E082E84BEA93FE08F884171F5A3B402C29D373CF5E
-339D8988EB92A5345CD6E10B6B61FCBF51E881A1B64C40BEFAD5C72C5DA4D219
-C4F3D0B68FAD2EF1626D1659DDE8EE66FC9D7E65F8DBDA58151412B6D9524777
-F9F1657AE4CAF358AEABDF7267A724AD62B4D006C463B44221BEDA0C08CA934C
-5DFB1C77B4A6A1F8A56D91B1D9192722B265E883AC45C1CEC5E176F331183B63
-F3E7D61929861372E46631FF63916BAD3D10C1111E5253878F9820DB501B0FA3
-1FD1A89C3DAD269A818B175E6E2EC61B7F7A562C0D58205A9D4471B083F9DBD2
-33D7DBDC0CDB8C464F5A1A798401A3EB50004CF735F8E8C16E6F83CE65B720BF
-B15410AB8AD4A9407BBB3E7A68EAC77AEE9698E5E50DDEE6EEA0A984480417F4
-9097AE400B8999F08A7572C37F89207CD83C1BB1FADBD562096362A13E173B2F
-D82D67804247D0910BF81334F2F843EBBCC0458DBE9F21D458D7F7900235F6A5
-C0B81D6E3B9C9FA25F53C714CE8BD134928E88EEA0CA70F49B8942CD33FB9BD5
-55F6F9F9B40879FF7BF41BEC25C6E676244AE10DD13676A09FAECC3FC2B62BCB
-89AB7305887932C37827F4044C555E89FFDD6DFDDFE507DE5785C16EDBB13D2A
-C76A294796ED347F6A6B3FD434FDE1329B37A4EEFAB85A489FB253AB54F627D4
-51401BC7B78F2FB41F43C47B33F33980C43939686392D3B1BA80063E35F07A55
-38C66B7B2CF11058CAB2EDAA16250D57C889EBB4147E963085ECDADD5CBF741C
-FA9D1CA3D307758530ABBB5C2A50BDCA276808972135BE28DDF01016E7EECAA3
-E90E76DDA13906E7ABF92301C72CDB2334AEC951934AF92A594F9FEBEBAA74D5
-25DDA66DB5045BC505FD43450B489B480C9868B17D0305373271039F50D0A381
-FAF7E94DFBFCB40E3DA958514066303BBA8D0B585721C861149EDD288428DC05
-CC5252DF29CA07BDA189B9AA0E56463FBEB46F098E5F1FFEECCC14C8AB0731AE
-B7AC09C515B3167691D90457F87A16D1AD02E53E3CE8CE7A199DD93C809825BC
-F1D8C736EBABFD526601EF314527A827D08C987749EFDFB8D57F95D0B0A4D32B
-7BBE1828EB2DF4C64C4DF2C6703BD8346F14C59A9AEB7615B3C6BB81ED09F494
-0B02C88D60F7C344CA0DD720220820CC857208B0704530AAEF522B46945461DA
-1FC1A105B514ED4A35594D391DAC2A7A7DDBA6C62802EF75E7A4E21454896F5A
-F42FAF1909A5EC61831E6288215D8C8BDD866C18FAE3668D39BA217567BED9F4
-5415FF5916B851FE3ADCEF9B9E2A113019436B3184884E6466FBC3F24C5ABB32
-621C0C4C793AA0BB51C4A68429A611563162457DFA45F651699F2F21994680D2
-E18AABA6115B1183D6A4F6CADE349423A4D3D83423EB59023E66023872E80D96
-D3E2658E3062E5EF5B9A90A3C4BD07442F57BFB0F4868EC9D373B5B8C72F8A4E
-290A12D1B2EA158FA7EC4818E27BCB2C0DF316A9F5A9606899D73DC39E3295BC
-3B342D20375451E653AC76A096F731878C0B250C5E3D1045A01ECE86C5643193
-0E309F64893EC5E5818676980BCFFB3372ADCD656B42ADA232BD1EAB9481CB85
-B738B31F0504C78A89298EB16DC08E3422516E51B871241C3D348A09576AF5A9
-A7AECB8C4D04B679187879EEE76FC1FE0810FBE6FCF7E9A51E25D02F4E30672B
-9D1DE282DD2D29265F2B8339533EFD9575E2FF57B1122DB4B16D35A54F3C4908
-6CAFC314068E5C37A89E2E6BCAF8D9B1BCCA87C14F41BEDB9214B3230274F922
-3E269AE3396283032830E8870DBFAB3B01EFF41A49D360218850CBCF2772F780
-0E30166FD6992C18FF429CDDA136BD81F7CEA7AEDEE140EF20D9F6E827FDF918
-0C1FE773A147A4AD0C2C0D8E789F4387DD69CF4DDB7A5084A37C3CF6BAEDBDC3
-7DC82ABFBE44E6D45960858C46A5B061A7FF169E95C4CDC59574B36F7B410B43
-C8643EA56010192D8CAC939D95009F3DB69E782C71A0DA0F78DC73FA5F3D6BB0
-D0E05C11D401DFAC1F127860814DC9A14780577C5ED809412BFF82CA82C47E49
-0DE1E08AAACA436EB618C2094F3519DB1685D572B046A4FEA93D19EDE10CF0FE
-DF2BF0C402D7BC3A9B9582EC955CC57A9377D0F7562F7991F7FEB542806DFAB9
-05F9304B0546C9D04C343418AE1204B6AC2BF6EF3DCAB00B2EFD50884B8BE2DC
-7CF985258C5489A37BDD9AB727E4430A2361D6CF0CB45C80A60DF0EFC677F1BE
-66CB904C11D868F88BF36D9AED9D4217A42F0D138B6943E8B42FECAD07B248CB
-89B415A0D36289E1F566A4CD2DEE7C8EB9F62E8A2EB3F6016780C60C460750B7
-D599D04F3868956371D587E68063D86A673CBC9E1FD630A85F27883E2CDEE493
-D0ABFD045055F162A009CB3B29D3219CB8AA3F6E0441E189C29E0E7033240F93
-907A7FE8AA4E9CCC93B0E6E6E8EA3DAF7212659378E95DC6AFE72DE348BB9892
-DB4CE11916BF8B4ED640A9CF0E9ED09E4A133AD659AF36196A8E2BB82785C51A
-A4931E36CFEBA394BDA9306F93BE42E9775B72743413D41A5656C6716013D30E
-21845140AD93C540B7EB94493BC25C27BEC5F3BA459F9B57EBB9379AB42AF326
-F3004C8EB6E90661E23231B96E054D7D903E77E3C01B8BE2A05DD624B84D7876
-E09A58E75E3A14D40BE9710C87B87839DA33A74E38C40171098286EFED3A931C
-A2F3921A688BB57252DE0FF714E4E6C57F50476BA3FEB5ED6EE6434F1CB9EF2D
-6CC52EC6A483956E812A30C4B565A02D85EE90C1899F5CDD9210926BC142F7B1
-A19C4487B4417F94AF9783815EC2825EC7B16FC827A75C293800C70C525C1C6E
-DD8A31FB7149ACE92F580CBEAADE4D8025BA127B528C88B6D511FB38AD626732
-ABCCE4176971678EA3492A168B16055065351D18576312B863B1FA566D380FB7
-A2DBF1AD881751DDBC8328B9B2E3B00EAA12136B14BAD25D2173ECCFAD1C0CCB
-3954B60B4A0A93F027050A2323C8A24175BFEB0DC33F9475401A84625F30CA4A
-2990ECAA3127A97CF50F995C001D5F190AAF7E1AAD3FD511E5DB04BDF3A21D97
-6763083BF896FEC43A4407571857790AFF5AFF1262814B9741F3A72C872FF129
-6953B892CE7159640FEBEBFBF790BB4017B4BDE4BE66F255D4115FB0261BD500
-90BBC4117BE9CC9FEB9F58C02F5ECFD16C402A55E16F31AF0028CB62A8825419
-8F04B7B83C6BDBD31FFFE546617B785D1CB84918226C8D15E29CB8E20EE2F706
-58E899DF355A4CDF41C7C3DCD52356B97ED4D9632A11C1F10C728D8CAFCB6A9B
-F9780D00B6B3088C8542AFA3BD27BFE59FE97B1A959295AD9F3998637EC138F1
-686C00676484DD3CF97AC801F31A764C799F2F207398267508558163DB6F9401
-041BD8E9D12A194E2B9816EA4585414005264F0F475E10A452799732C04A629C
-B2A6B696CB661584A092BCE0622AAEB5C8DE8753925752E8D7EC353E7D819192
-37A48D0ACC93BF59192BD92239E17A144C8FE2FDAC9F45A0FF0A784C0F33C0A1
-DFF65E2F1BBD6FCD94C4C41D49D82097191871674F926937EB84351E66D618E7
-DD0AF1E5D1F4BF5F5FB6E071F16389EABCD20AF855322775F6EF175DA0CB3525
-A0355FB8A75B2DDC429D6A3D3D14DF49E594F6132F40EE84607B21DEF33CB651
-986876CFFF7B9BFBE0A48A13A616583D41167A1AE4985DA3E295769E6833C073
-421B7A1BB12A1FB7F68E2B689C62CAC27E49ABC85400AFB47B65C347165E8287
-E051C825736965833C97C548A4DA4A5CDB970A26E5594D058A664ABD5E5FFDD8
-D4B2E46CB14A1146BD4318DCA6B934C0C0CB359A2F864314C060298DC7DB3C2E
-EE7A53DEEDE3488283848C612E01A3541C006D51EAFBCDEAED5C8BF5A53F8765
-8882C233355671ACA971546F073AF5D523D6CB158BD2E52ECDE1C86A320C1D56
-5C7CA1E2C7DA1518A64D7A9946BC3CCBD4DC99ED4C06C49FCF7ACCEB3825C20B
-A7FB66E20CDC7CD5B6DF85A6F9651B5A0A6AF8A7007D247E588CE3D10A659DB2
-2409C592617E844B788F8F31439A864A83F150B9180ECCCC77FCE80FD76762F9
-FE36D8622E27287C1BE29C6ACC87BAC41E303229045ADAB41339583A7E2E182A
-25AEB962E2DEF3938BA4A36C1FC61694231232E0556C48E4CA6F2D8B778AA221
-C7C2C602E5BDEFA829B8042FF26F6DE8AB24C3D6AC15F08F18AC87FD5DBD10F5
-6FDA435B1844B5B5C001F812465593DE42ACCAA50107438F94B9540883D5006A
-989426C0AC036D9F32221DF58D516CD07E8A62217595902DDB61C0122DA5CC53
-033484B751B448E828B3F2F5B780384E879A4AC2A0B0463CFACB6E71E64910D1
-C29D15AC53900540AF00AC76ABB9F58BCDEC17A66943978DB0FFBF26E7182F9C
-51237DDF5171BC1272D2A92795FA94FBCFC990A30BB4089729DD36B34EA74298
-4CEE7B47FE85AE188CB7F01E9D976191C6A179C793CB5854ACE7105651EFFEF2
-EF8A2692CCA84735965666AAB61B7E66FAF98B03C2C91AD6BB2CAC04A25697DC
-378F43BB2026ED0CBF3A95E8D43F3DEE43E2121623BD3F211D15AD7542666E4C
-D1139BED9A63B41A12CCDE934DEAF7417779748B6507ACD789049D0A9A13F020
-52616D42561F9D099CA6C9C2FE5F75841BAA73F9B66B499547924103D120A9A8
-D487525A93B270DDD29CB89F48CA3794FEA61AF992B6D063EE294EA6506EAC90
-50E497D4029A2EC47970F69C3CD93871128B24DB7B64F9E1DB03D6C26848C888
-DB489E5494A272A2671FDEAAEB5467D9BE36DCAC57C1EA64B5981105D6C0CDE7
-16047600B109EC9FB61CBDED2B3A9C048F5DBCC6894A4C2788B66265AE2919D5
-FECA073894E52BD30069C895471E01C2FB1AEBA27E651ADBEE11798B8641AA4C
-6ABD9FDA2FF963A342E695155472AFF17729FB6CCC8392DBDFD0704DA078F819
-39A12840DB11394E8C52B7D525F1CF6A9EC558175489B490C6CB529CC6C9AD9E
-858F6C6574E5765EF040A0BC741339CC899363C897FB17552B54170C094AC439
-C633D71A0A6B07FA0E5F052CEC01B7D39972ECCF810DD236071E6F33886F1967
-5BEC9E659784790AD81F18478217BC614A09B450F9F367CA8C1319EC321304C0
-F167005B9442397C767749A0E80172A3E798778842E72C9995090ED9EE7E77A8
-B4E0B5182CBD20305D29FA42232D25CE8CF595AFDE8AD238796CAABA7A05732E
-DEDC3D9611E73FB21BF48A838AE013D1DB05ABD0A8E104C793ED29C821B74B60
-7BBF7AF551643427F79E4A5D5430AD237629DC722B95DF7997D56C0AA35261F9
-059895E4915405E39187287F253D0BFC35C9221BC7BC7D1D6347AD79EB57D16F
-7CD8A0F05688C5BC3DCE2833435A9617B0724C9D0AEC113719FF60498D379DF1
-EDDEDA305BB21A276068B03655C718ABCC9463672BEF5351A07A70CA909BCE6B
-EC8D4FA901DACBE229ADDD6196678AB4931A4453D433BE83FF4B10781976554A
-E32181301F75F423949AC99BCCAA0D5E45E2C6443EEC033DBCCA5EBC98FCC960
-4D0FE0B2AD4D63F8243ADF0C07C669433639C898B6032BEF98D61A1C712624B9
-D703992E39D06ED9903819E6E06DD069AB2E49B39C7556A9A74FB9CD4005BD93
-9571973AF75229D7427643828DA54783719E0BB7093AAF9CB43E93C70C17CE00
-4F2F2518524992ADF04A85077EA168970C035F7BAE96F1982136D215BD19ED26
-B13FE585D88B9CFD80BE1CC3C475BA976D327E06A2C9453439C498A77074A537
-9CB48921B22AF51CE96FAA8194FC00E1A3BC5EE90758A28089DE5B78A9DA79F7
-9A292B613509BE684CEBB5029E7D06B115C6357A5FF14977EEEF7C54EA07F6FD
-B144024D10CD770D563B3BEADE262952B6D59260D9F9C5E4D0C0A01D3FAC32E2
-667FB0297A92CC731A30F2B6380E4BD1B5296001C5AE4AF98196CDC282F8EA91
-D79C2F7A25E3D28549EF0AAFCF9F9D25AB744EE76B62FCCCF9A2DC9EC00F4411
-AD6B2A3F7DB78DE22ADD31DA29ED3EB6105C86554605FBE0A9ADF6AF06360856
-8FEB129D9EED78D6CBCFBC65EC32D619405C62C5BB36FA30FA0AC7E38AA3A920
-A681E6368244CE4E3A850D08D5D779DB84AB1E2D2CC9AE7EB7179D01E910803E
-8D156650E3A0E2BC7DD6A123E640E6C7C950F5B11DEFC114FFD19B69E0028D81
-5D71285E888DC780692E120C9FF86951A13403321B6B32189608287EBE42C9D4
-5D87D9930A80732DE39715374715AA9B5D9CF24E753110E6480C0895F87A6055
-F9BF8CDC63AA7A304F91B9919E658E3E3506CFADCDACF85AA32C2FA99BA6A40E
-DAC21971342C2969C79DA65A09543D982FB7AB63EE9E016BC89C3782AF98FAE4
-F3DB22427AA0C4081BE2A3FBBE6E6B8873BC448E79C38E4ECE119CBAF49303BE
-83CEBFD5ECDD39B618D87AF87D2B23D0A39E529E6FA487799979C9CA7A8E057D
-00270FD2B06F5EFA066E071C7B6A2A9BAF7FF07383B73E115E6FB2BF4961B35C
-C1A4CC19E872465C98C0E7EF7566232A6E519E5DAD75EDBD011EBEC366C78FD7
-C38473EA43EED26FD251482E3BE6985FF6012BC6C29DAECFEA389E34B13AF04E
-EF40BE464C56A9BE7BF590DC2400B357FBE1010F848C62C3BF13A095D5CC597C
-49FE5119698063A4126D2B1EB8CFCF9A60521EEE14D203C4538EC94AAA4C42F3
-CFE1266BDFAB7807874978F69764670312AB322D502BA3C577E532D388864321
-F47D4750A55010B09B39F55F76BDC353860BBEAD1DBB0DA88986D8FC0B7E6B56
-4AE8ACC638BBF965BE16F967CC3647B7BE00D06C28EB360FF58801B5C4AE5DCD
-79A68AE48A36385CD539B0682551D1D7C9B35DA190991341443F3846F6A4E957
-9CB8B3CB47A432906010CA28F18DBA32A8C6425DAB7723843421C0524AA1542D
-7B23D36CC397AEF3C65D5A18B423B42E834ACA21BA92B5CC7E3B64BDB23C87F7
-2FD8B0D0BBB84A14DAE53C0582C35863FF8F372FE09DD1C1433F20DC53B0C42F
-15015FBAADBECBD8BB5AB0CD91B740CEBE9D7BE2B4AECB9E5D572C52BD3C8DA2
-1C52B42DC5B1861540EB21EDCA20DCA5901578FB63A768B5B25BE7E79E6A34DA
-C77D7BB4C18B90968FD2AEE3FA992359E5DBAE6CCD81CF3EE72A80C2D834BAA0
-B3E1676DABDE1FC4BA707DA236C3131DC4E91EF9716ABB2C71A57A076C7B366E
-1015F0E3D69A002190FD689C11E3D137D5130EB46E27AADE6203B1726B852FDA
-9A9BD004FBBA6F449309C517575DA18E7A9255152F8AE78B3B9C970C163DE775
-B9F4EBF840DDA1F70B2E20E5946A84C3997436A0F52D5EB8C923E9723EF105EC
-93BC86F27DC41BD26CC28912126EC88B376AC07409FFAE4CDB01A72E5B781BBA
-4316A3FA4F46A88B9B264F8DCBB9A8A043FFFBA529A134F62A05319825C7949A
-A07CFF3C255C68BDB81DD007AC7D759CE74DB20EDAAE9153A9EF4E48929CDCA6
-8F85965CF5F8DE1C8E7526FB5F8C79351BD2027287C8A587461FDD4F4801E953
-8910F3D1B2B3487FA56B2A5A19E16C0DF0555B4003B3B377A3E2F877872944EA
-FC334A14C024C1BEA0C8E8E18DA5B3E3CCEED380D50B278FAE9675BAE1A6A7F2
-8FEEA5B7220C84496216141E83ED512F281EB0CC8A34F29A04E02D29D4A2385C
-98E61C5D507DCBDBFCDD6DA3CCDE8BFCBE2BB31875C62F5A3ADA36A5BE0B2F1E
-372A88C8432526C8FDBFC2A8CD635F9D3055FB335AA1318425D44C7C290926DB
-52258A4467AE67FA2A373C6ED1FE3FD47FEAAA70439A06A3BC4F764754F48B89
-A47594FD6C71901DD76C969477F61D4D0760F0D961AF9A24620C3BED85DAC965
-0D2EB1883381DAA2E88792693D52516CA19AEC59085AF2DB01903E2310812CA7
-F43D7BD3B08B3B930EAAF44539AAEECC6F35507CDDB5E92D928DB87A72CC9CA2
-C6C454D3E8B1ACCCCA5FB80D518748898D771D7B6428DD6CCA288DB550D7488B
-296EED5C50F2FD74255C7B2A1177DB4D86F540764E9C51EE17F8FC39653B2AE0
-5171EE26A21F8242502DA857EBD9718319168669D9ECF8B072CB8DD0A5BE623C
-C26B4862EB22EB5911AEF655ED4F52BD5441B04F917EC023851BD94BF70E84F6
-84DD916927014771943A72E8BA16E44F782B7AB40839E20847A2765FF9EE44AF
-66834EE6E122B159FA7247AF41E616E5F6427F1D29480CF9D6B8BE66F42D5122
-34D7275F749AC63A93AD14E5E9C5C3A32CB1EBA1AA184EA8400FF39E0CFBDFD8
-C46078110DFCAD0CFC32606FFA7BF2183FDB0F9BF8FC68D5FE2C6B267562B777
-F3E11B16A37876A39F1824586548F5FAEAAFA57420D0CC28A57AEC1839C07AF7
-80C9D53D08C9030271E4B79739F2FB995A9E5EEF6957BA37DA2A5AE3B49D66ED
-A57B58063CF1A9F7A19EC131178E8F7CB63BCC3AB7B0AB7B2B705E1885766A14
-615520B8B4752ADFADDB24092EFDD737761709D8C2B64C68DD84C8A6ADB68FA7
-2DBAAACE58047C6E051EBB8646342AEAC94BCFC9D4111977763847DABB4A4061
-292B80A451D5B0ED2908242C842B907206BD8A9292F88F37106900F8B6826488
-81DBB4C9005F5618C7E807C45B04B914B5B96BD39C432BD8B29D3EF605898309
-C7C30A2B24A64706862075A7CE7A6C58331B1E6A22868D9032C34BE24C468B20
-CDBEAF15A1027E4768EC6D30A39F68868911CEF80C074328B8210FCC725F835D
-32B560BC1BD4BAE1BFCFC9CC645F24CD71CDB55D8F1FEB1CC3B579C2A6B2A50B
-0C79A09838569602937841E0D6CCBED038A7635CCFE7DA841CDDA91C0C14BF3A
-30F979E31B5060A102C24AB5CB6656DBEA74C04ECA37B8C9404426C60E0CF670
-B14150C7F519967FFF101AAE9B1912D0965119A31A57DDC772759F107B915F74
-956D7C9B33DFC59221EC7CA179952D0F05D0A21BFEA10AD65DFE985951304701
-1B0DA869C6444DC6746EBED908FE37E046A9C3A05263F0ADB027A201E3FDFCE0
-002339107609E666B29BAD895D1EC51C8CEAAF77C9B7900D4E48A8E0FDD7EFA6
-85890A414BF53D0811BD4424F73EFC028E1E24F827EE690A2C455BA56826BDD1
-76AE96CECB5CE924AAA05223080EA723FA1AFACAF18C879B1675E1334D14DFE0
-BB8F4390F3736EA40A1385E830E015E09034E3EC1EDDEB2ABB6B6923540555F7
-50D0AE29B82828DB755C16D3E28B9B4C003476EF672D9FEDB65C59FAD148693B
-2F9A6AE55865581D54A0EADF9DEF317DB623AA0178C423C72A5FA7CF6583B565
-D68F4AECD003B6777AFB5E54B7724838FA27BBCAECC7FEFA482CE122D67C1F5A
-7A89524A95B431C56180E67A728EB87E3831EE81AB8ADC8D5CD1BA34CCD3F7C6
-B57130F173E1E74167505C95E062AF8D17DA1AE20F5487D37ECB72D48EA157BE
-8853F32050DAE379469C56F529867CB1DB8102485946F4642D12EA28AFB23338
-309516C967102F60499CCFA5BA738861ADF3881E4C77381AE42DA48CDB8B93D6
-8C944D9C00CD08FAF9F3EA6EAFC4BB81A046D60B9615E9E32CC1DAD8BE65CCA2
-4D9E275EBA74300318C0808FEB2F97EB11179CEDA173FD5DCD01C7A9B55F01A0
-72CFD68091BF0936F2CB6B4762B4129DB790A130341B1281239317BC4413C5E3
-33BDC68F9FC125793F1E71E49A160E70A0CFB2935384036D489ACB19385070F6
-77F1FCD18ADE1BA6128B6472D9BBC41916B50D349294BD9A8E55C53C32146906
-C33F4E0DB30DC2B1DCD95C14FF736DEC32100887BC3AD61F47D518B984DBF15F
-9DCFD8D52DFE416E9330E8A7CB387993E92C40CF345CE5B4AA6237E5C165E444
-87B999C9C9BADE827E99338A935960B43E5D489216AC3A1B12553983E7387DA6
-0B30128CDB47234410C2CD262F4F513406129DDD4A5683D9A90213B15D82CC9A
-CB95BF820B80792BE989F8CAA2C6A2BD03A17BD5BDD2CE037430D3C9D50B04D2
-57C04A27111800E45EB0A23BC142F8E94FC5EA851476BE4B6F28040CBE35CB92
-D58E7F283EA78F7803C9B531A641F969CBC91F76F9971D839486841F7C73CFC7
-12014116686BFC632620EA3758BE9A1BADF107C3CF1D56BFBDF38A243BDF7348
-1EAB5035A7D20A19A9244D922A16A66B9A015AE480DFF90EC74E1ACD6579A7DA
-C0B60F1ABEEE7340156B4DE7DF797A6EC6931AF2FABCC7CBE12408C17EC209E3
-FA0AF21963EDE23E789F16FE7D5E504A082E0B1ABD3F32802541CA86D3DCFFAB
-FB6BCD78D318EE56D9BA4D9C79727ED3CEFD9C95FB08BD05CD91E460F249B955
-AC1EE6D90C09D2C58621940E58E8BC2C7CCCBF44D8677D17D00AD53978C46064
-7F3A231901E4C0520D07A04D308BACB848FEA20D5D3AE8D2BBD6AA1637E0510B
-42CFB4D7DC696414DFDB26622E3F9A763EB25B77136BB41ABAD6201D4A26597A
-D5A21CB25E54EE60B6FD238905A26192BE539C1C06301AC836402BA71952528D
-29E35B987EC4107D74F018410E5224C666847C416735AA1894A23651DEA153FA
-9AFB47EBB67B66181EDD00FC8D0ADFB9405159BA37AEBD20AC6DE2361C787BC8
-60E969638371CB4003657300F22EB205695F5780A9EF6946C41ABBB314860407
-5E8FA325CF7A73966ACC1A9FD07183067705EF961E44784033A2B5E439679D03
-649D027F64149B1C223846C72D485BCEC6C627A24E5606919500289EDD483582
-86B9F89FFBFA9949AD5119486222D9B90A836E9F3A30DF87C8B6605FDA841D75
-3CADEDA0CD4F5E462A769D807CD93E817597583C273469E451DC0A0EEE2D44DC
-390C8569903E0E1A8F3E4BADDF2810625A94C64B478F3B23329DA39C7D667A86
-A8C7980840A5BCCB26E9E00A03AF919AE303DB02E9CD24843A5C31D5C581F344
-CC05E9B78C99DF60271303F5636583D4AA19261A27324AC35FC60609C95D8A89
-1E1BD2D5D3BF85E9995ED8F5016E3ACD768C628F6EA4D629C225DB7665CA678B
-CEE9262A08F77313EC07D428CCC490FC953ACBEA8B82662843EF29194BECA18A
-9B9F7DA6EE5E69E1F6063891B6640E66A45DBC1BEE2ACE06966231460AFACBF6
-5F8CC0E6DC0E990ADFFD6958E9CDC3E2406ABF261D1E566D66C53FEBE676A6E6
-7CC2B0490A452F36FDDBDF720A73B499B2A24559447E6B64D3D1B9DD757EB587
-DCA3B09BBDD6270F3341F3C050D58A19DFE8DE6C967DD21191AF8D007546CB2A
-29B6A9286C4E247DC8499D53F166F96E7B48F6CA9A1615156BF26569F38162C8
-379229886C9A14B7CC27079581E9E1AD044B911A204B5B5099A0A6CD4B93B5D4
-9E19292024C8B177377C650F14D7156E7F80CB1543B7D1AEC4BC22FD0CACDE1B
-873D788E7679BA8CD24809A0E54734FB1DB1CAB70F0E305DA6FCE5158478FE21
-33D27702357D89436ECC6261F07609B047450F38F1FB447F44AC661B88D599C1
-46625D0796CB6907DE4EF2E96FE6619DDDE75FA874FB4C1885F533C7C3441FAB
-FEEF1179C13A7C15C3742B832629F1C934D9870FCC0FC49877DEE9E31BDAE0A2
-B7D7A893BEFB1D1E8D661AA06A615166EE1A809739526EAF5748B402787680F5
-15B0E2C09D10BB1CDBC540B321DB8EF320F8762787A3550C6F0EE4A1F4C448B8
-989C8ED0646C084F39F72A0DA2F033A27A309F002779633D69E4900E716DEEE9
-4957732BA6B0DB00F3AB9EC6838E8D95C2CCB4F3C2DE12683AD34FF8D98CE70D
-C2CD04BC2308FFE468EBF3E28C0451D2126E12FF74807E4EA74B6D318D358392
-50A057D3518C663E5C22D431097FFA3CE2D3BE94315C3C263E3192E2A0AE7468
-E8734C3907565B917A802637B8E17C0C3099E09CE5FE1F4C49E8F986EDC3F62B
-925AF8AAE0DEE73B4554E19407D4A8AE540954CADC8E8E04C0DB4F4CBDD597DE
-A042F8C1FD867A5981117894CB11DCAC13CB5B1609277AB8F52D5F14B0EF5CBA
-6FFEB15BB5EE985C5BB5B6FAD69DB3DA85EA0F607ED70A07F4186A976157CFD5
-1FD77590B37B053366B2D59076E7C4BB5B17E37C0905B5A4178801DA04393335
-C2F5EC5170D36510D8EC5A3F74241D943D32D5936312F4E1929201CCD8AFF4A4
-8ACA3EEAEA2F80811E1AB97C722F5683CBD3BDDAABE2BFD365ADD468CCF773F3
-0D4CD51FBF78276CCB2261335439820D3335E049625BD62D64C10FA5482CA484
-91353DFF4D23AD3A1BB45F544DEDD955B76BE2179A3C115BA21486FEF6B9FE06
-C09DD1FE4CAFCA1638BC6C9C063D6CEB9ECF127EA34B258D56D9F466F3DE8E98
-44588EE4E2BE29AB2BA7CDBD0833E48070E2CA66569D1A31D74B3BB93C88B192
-9F41690EE73BADAAC366A5583EDC00C3A09A3B36206485D0EB6F952BC475A992
-7A08E52A909D47F93064AEF90826DF8DBEB1B8295843C34526CF1A753D2969F9
-41D4BBFEAD6445152C7566597E27074A6D65751802C955762833EFCBB59CC9AD
-143BE9E315FF6962B510AD73E357C23B1E95E95D0E66F1870342066E083EC5EC
-106599332D0B1C04080710368D15505BD555E08552C6BCBE59F8E7F52099DD8E
-1262CD45DF1424FD99F35CEB8888EE76950AB97C325D1FC8FDA6B59C1DA5E642
-BECDF0BBC1D8FDAB995F0B42AC4B210841683DCBE8B0E57D9836EA9C5076D4E1
-FB7D278C068BBECD60136C1FEC4694E4C7258C4B907CD50D03481AB429B0DFA8
-5CEE01A1A789EAE744D80392D32F2D0D4D985DD521EE87FBEF8880B755BD8C88
-125FD6AB5BDE712D6EBE6C87E3CF95763C7F97C390E28B46DCE4BCD942C38A0F
-B259F6EF84B53657102B0F531757AE6F3D5ABC4AF25682F4AA841599623AB99F
-13613C3A8AD151528B371AC9AB71D884EF7605F242B0733BD8D053338AFEECDB
-C04F5CE3F9B87882C241BD22612D8BC8CADD3A0C5DE9F951B4A9BD4C31C96EEC
-7CD77871CB7FA20002606DAEB05C950B80428F48527800E26E462003975BE918
-6686583FA859951BD6B66661A0285D78F322604D2CF6CF12A3F92FE9B9121F05
-FA07B5FE84861D713956C1A4DF6A7899918FA425B97261BE40FAE4AF0F524D0B
-1D3C7708CAC08B05D68296333F7CECEAD9DE485E3F290E8C8011B7A0AF2ABAD4
-C8C91729CF4CD7176F99ADEDE5B888EF92FE06D05E597738BDBD4579103CF437
-75A0F31B10B54642583CCA5C7C2030E21068A52CC5419406BCE7334F4861970B
-1974F921D71FB38A0DDD0276EC5C2EA35C500C0806D9E06316B43F1B00B954BD
-ED1DEB6F6840D36EF1E6F0DA25C565D06862BED9473D6F1F41F7B8B5B91E7398
-EECC397C96AD82ECC8411C61E0AC028E557B5AC3155EA12547C4E7BF9583F0C4
-AAD5FDA2DF0A8590B0A142287F7CD739734FA5CC5C9F4F3BE2007B055BDFED37
-D5A1414599E5BD8308B7C0CC59F59A2E5296EC476E578983C818F1307BE7EF50
-5BF52A9F05BEAED92F19301C5D754B4DC22607DF4F17C843EB25A57963128882
-1636862F5791840C87DB94004094D7472E1742AC5A8223803BD20BC0FF3B4803
-C64DFEE01FD9603B9ACAC6BCA107E276D5AA4F120C007B0720493A37EFBE8110
-0873203D4CC3F03BB8986608787346ABAFA70C97ED093AD9F8DE3898454D286B
-FC6BDFBDDF3A907B1B9756431A73857B9C4605735776E00B63168AA6A7DB76F3
-3F57D42D4A742641C43C16DC4E9F9361100855DC833F154EABD36432338160B6
-7DCF1DF9CC167BE044C95A0C78ED4122DE12E8651941A9A00E9C110C7C8DF6C4
-3FEC21390330A78136783A85A410289C94B6EC85B28DD48F2D7299F10380CA40
-0689234695AF310ABCA57D37421A09245CCF60213C250BDD57D3FFC4B9DADA63
-4AE1788F0C90490780650C1BBA52139B4DD961A3650F6144C89E82012484AF76
-49C3371F84EFA5EFDAC65F27E899655F78E40DFD797CFBDF2888C10F720B55E0
-36B8670C5D0F2F1F7309F109583C440338082265523750F1872CB7C97E93E319
-D9D2CD62FD24A67DBBA77B305EE62FCFC13A60831F86F066AE738EDE223AD809
-74A5E78B2973B979B27652B12B2F65A8BE423E5F09E511623472496F1F886A93
-593CD8037AEA269C1D652B8261BE9F2C7DF6E2D923F7BAEB1089BCDA3F9F6C21
-EB0A8DD0F0CF8F28F5B2498018D995B14AA7DCC6A8C5F620F387009B7F4C9533
-C42D6C3EB234EA2AC527C551D098B55FE095645BD6EA74873635FECE40689D95
-B644F180B4515FBDAAAFFC469EDEB3D2257D3DF9F0CD87341F7D9894B709AB5D
-2D2FDA926F4E66019A5B2C66A22CF7875DE999248E1C5FF77207B1F4989A1155
-BC301C4B0C7DACBD9B1A233295DBD7ED1E750366EAD9C138FCA8F38B12E067B0
-24FA74A712404A8EEC4B37BF2CA76783D8B7D4D1EE29CD494FCA463F2D95CEC4
-C602D52B102556E20DE647CB9EDB1A4C0D0D61CD40FF4EFF35C7F7D7E39D7A65
-B932358B6A749D90089F0BD9B0754C0034E1D599A0F627B6B1BAABA838567120
-D4EC81A2C61A44CAEE0721DC58FB6CB4A294B2C27FB1848499073A4282F8914D
-29B158333483A2C30F1EB0CC5C35C9B44FE629F6A5A4B4227010E3065A39431E
-4387E8FA2BB656DD3CAFCE39CD2EC1B8C694FF8A9D0A83412B59E064CE126325
-7D47C1E6D0A14C2E00FF23CC3B46491290CEB5CB0D77C076B682822AEEF33AC3
-72E5C3C7F130D4ECA6573DCFAE80E2AFBFCD8F75B97767336622B7186D1E4D2D
-DBA4D4E7848A2528CA0B2932CCFF7C44CC84391A790844B68B7B6AC4E5247E11
-12E8B511AA79B10523C08F87C4FFD13DF16A32C14C14DDC3DFD5C7707AF0ADFD
-206C5F08B6FDFBE6A25BDAEFDAC6C62D46FAD67CEBB962253F422E03E350FB2E
-5D85310C754A56CCC4D415FA3EE330F65778D9FF6EDF4561971AB36976A7AA13
-65873392DB9FEA65D6CBD192D77CB3D712BA57CFEDE28FDE700E023D722C2107
-FAD33C3EC6DB0A1B8ACD2F5BDEC6664AE084E37C08DB2A394D6A03A4B5AAB584
-C56986A6A70CED92535BB8CDEB6E061803769D9AF11CC4F4B6681F7C309ABE6C
-A45067EF13BD9BB6128B82B884A82A93805C7F9979E5EC4259829EB3A609578C
-8B746C21E78AFFC105BCEFA657BA7E6A5232F6442C8F797CC460EBE086E4B5BE
-CD71C218A4B381E95FA0193E29D9925E4892369B4F872D4D05041E04A94884AC
-DDEF4B84BBF7CAB2E86CD9794931FF10CDFD59E4532F064BA6A043B7C878A1A9
-5E549CEFE02905047F5FCD191CB9421DE1DD7BC56EBD37D25CAD0B443663813C
-AACA226CC461223ED82E6BC4ED9C9E463508CFAAD72D7B294F6A1C3F2DC462DB
-D1D7A36FDD4F7F33C5CE8C9401117E58C88A1504E23A59E8B9028E6A17BE97B3
-A24057954B34E02B2013BCAA8E53A2A3BD80AF59375E58574796C76EB4F80A75
-65D18766C38957BAE977FCAB12B0905A798BDC7DF764A74A832F01A7EA583D2C
-80F177A56353EB1436DE7BAB8FB36A72D0C99DE947F801522895B37169329106
-9231484FBF6DE63F4B2E97EDE44B80308CB50770D49F00E61E0B7544CF8B1069
-7014F9E674B59D24685755BF266F6F9A77ED1035A8101CB2B78BEB3008E75CA5
-5FD5304ECF13459607A337F5784ED89063F6844277DDA39787738D355C680929
-DDFC4CC7BF266D18523F2A710260820E8EE84E3B4EC13886E43A399B06B5A6FB
-1CBE44275EC77FAD42B0D5F7F44FB119F848EFF4F93B7B4381EB3A6C70213BE8
-E90B52EE30700BD51306F314589A1154878DDC33967229B0A367AE70418739D2
-56B24EBBC2D687681684FD867163128BE945622F74AE2F6C57A63484CB126820
-17F30AD1C5329523D679696C4A7B8CEF97FDC8BA5C0C31B7F19EC8C39A61E5D0
-60A11A4CB9D899B363AD88F9297900E6BF51B5315CB42DDD6CEC555AC54E0320
-B97E989638A37897AA76614326D90977B6D5EF13DD830F004093E5A685C8CB50
-D976EF544D8C0471D3E037E19E42CA87028BC27D1477406ADBC4CE196A1EEE89
-BE9A06ACD6C17922A61705CA894C0D7F1783EAAB8031CB1C18DC3CB81186A1F9
-867B07FC73AEF3526C0ABC2F77FB35A52F82168B7A5C0455DEEA2522A5B74487
-82FDB49035062FA89995B9123F6EC3F84592158DC2D4B6D3E61EA90BE082E44D
-275A6C4512FD61A3012861111496E6DBCB2CDE57F5963AF6FB129A3DDFBDA2ED
-0EF9B3208FDFA7EC3B1F02381002D82BA5229E9F8D23D7802E8FE955E0DFBF6E
-624C20E9707AD4C924E080F65243C1B0D53492B1D4E874BCF92862F85A47A010
-C32FC9FF385860AE6C95481FD8B83B37A86435AEFC6230706452993982ADEF24
-8236F5D4105A4F5C20C8796778B8C3ACD4D0691B984459608915C7587D382C20
-69A1DA37B0E75C90DC7060A5971B9551A593932FC8A137CA32952BD67B6EF041
-53E8AB1D2DF33C50D1F8B46D057333F58009BA460057573463E0895AFAA843FD
-99F54D106E0BD9C7A87F8930DA17C78FA0A7057314E1E450CEBA5E65CF2596D4
-13684ECCB6BB7BA6C778127C4D69CA2E5F39FFD757BBDABDE26CD4059A85BED7
-C0FBB4C9428796356EA5F3094E76472A79E9E395F5CAB8B49F991F4D20CFE349
-D07B6412320C52F18EB4E87659D7E48AFF69D7A415F38BCD5BE489256C1144BD
-281F85F7A037E4E7C8D141FE449D16F8D36D9039B298BB1F61BFCCF6737178B9
-ADF9A3A184489C6D5EA2B6C81CCBC3D89072F5093025BA69B6A29F2976898824
-406D932F7F3A6EAC0A65A7F016FFB80D0738FBC2D503E2531433E4F074D29DF8
-507C48857E39E25A1EEB835D5300ECFECDFF08215141C7B6100DFA0BB932334A
-A4250162E36AC575FAECB1174F20F11EC6FAFA4CD886C023BB60DFA8595BDDFE
-BCE6792B85B17D046054A266412F96583F76A66DD1D25599F31FBF598E8E9641
-7415366257EDACEC2D4672F9165BBE172F11BA76E5783CAB60F86655F87BFFEB
-08E31DF6CC6863D05AD0ACCE9AD421437D17090354412872287B6D9575F45562
-C35597EA596E716B67971F5667713D8F2A971285C4D1B67EA77811AE7799CB13
-E357B1A03D5B71F3A7B836F74E65DC19DC8822277DE8B0073EEC17ABBA940B34
-F664745A79EF90AD4FB007C3F7558B84C98EAD1C20064082A2714539CC7F0155
-87508D192DB05FCECA78630C4133CD827932A84D21CC953B999C8C851A224B83
-F3EC014FA0D80C0BED17A359872160683A658B65309BB92A871B736E1B5E77A5
-8C43A658A9373F92459653C47707297BF2B08A8087B0D0E9BDAD307F118782D7
-D7003D9A160051C772E5291F33508921E1E16E48C03FDAB0F1C33BD9401CDF51
-9C7771022D3B69FE47296770914BE6ABCD4595116E2CDDA1139E6C0236C217A8
-DDAC4962DE70098E71FE6811A2E5441A54C5C91C2673482AFDDA9F1D25D39BA4
-667AC88E269E0A5973EAD0F112FB692A8DE56CD0840F2D3ADA9E35C8DC532669
-AC8EFC8A473C52E68A47C2EB6D1D60FBD80039C1722CD8D33121C295EC3B0949
-9DC8E10A76323B17EF0989B8C811A46099B179716BE70163106B15C58FEE49A6
-2BC6787698965C531312264F7AC5013A7F48C25D3B484D88213E093F81666D22
-D11A0FB4FAAF8D579125D58063D11ADE621799BB9CDF9394828BBA7C73BCF863
-B8B83B42C94AF06F076B73212756A3B6FACFF9F4AEEF704A5E8F6E66204C3EAE
-3042E58635DB16E2B20D6FBFFF4FE81D34DD3E3CA24D9870E81519AE8701328F
-B7AE637F2E009C8CAFC9C8CC9FD212A8D04236540FFFCE06A53F5E0DAD66692D
-CF04864C36BB8B932D869AB4675FB0576610A39E426E16FDF718940E11FBA5CB
-5D80356B2E191F3A6EC7062A60A91ABA2BF455C38A88681213E358016AECDF6B
-F29412284CDD0EECC405ADD56FDD02D4C98324D60EA23BC8FC61849D2C8CDB45
-EE7996210A041FE7DD55EC3CB98A89BABBCB11EF1DFB332DD2A053E2F4DBDB18
-D147A80A364AA417B4EDEE6F799D012BB094FDCD5E2FDFB3CAC7D592C7B04C92
-29B6C5E2DE5B1C88FADFFC69B356394978FA36BB8DD4B8AFCD61EEC7818029E2
-86B5135FDAD4C4024472565F1154BC76FE9450FE41BBD47CBDE835D888AF9CA8
-2AEAF152D0EC8F366DBE7283298711F4E19A262AA773A4B5E2F83E514AFAC904
-ED893CE36C8CF3A4032D79B3DD677E49E40A40ED8B818D1C49A49E9135FD3A95
-CB47CA7EDEA07E1A5583B92D7DCBBA85AA62C70C7C79706F69C374EC8C9C8DF6
-85FFAC786ABEAB4C650755BF6B5D8B0D7C73E8FE45DBAA508665EDAF8FC4C49C
-3A053156D255A9857272D167DE1999D51869F4329F336546D8CAA564C40E11F0
-9BFB24D7A92E602B520D2FAF80AE1F2306A6E4FF24EBEB2BE5F43AE99546F739
-2C1EB46C7E678416F973FD64C8F9A8FBAC24DDAC97FC3BAE905285ADA80EE265
-EDF710944473FFE82E0326579BAAE82A11EC1796F66BFBFD9D42B1F1844F146F
-468436F1E3B101350A15961BE3ED3B060EA6EEA54B4640F9135DA9678B776415
-0EE9B4E2023FD929505AC4ABC41870A287913B41A29D4482439081B22E4C9EF0
-606DB52CB4E42B258E26E398918AFF672DDB8137A3D9E56AAAAFF283CD204F60
-1A7020497BF3AAAFD5D19BC5027129759552BCEB666025A958E3C89D87F2628B
-B1CA120F99A5011E364F45524A30398A89324531FF1974064D8E442FB7F217BF
-0DB02F38BDE00115A217DE0B6450DD5B06C1B4335B55DA1B1738927CD6C0FF64
-82CA6B57AC50923C38343853D1FB4F04B8A5A08ADE3960339D85271E59CD2AFB
-2EB22CF048AAD9F50E5D79C8F640FCA9357AC2201E2F111B19E9E6D97837356B
-4BD21586B4FE993EAE89C196D08C445A0936D9AA5ABE103030F5054173E33ADD
-A3EBFA2DADC766577FC0EE7AAE0BE5FCCE4E28732905A49107201BF8DF75C2C4
-8EC78180A36420836D6909671E85B0FAAF3771EC118B6420116DC43983CF83C0
-98513F8F231E9C94DDA2BE07461E9738659913D3C7157269FD28A8B32CF11E0E
-9548AA110FCC71B3F98284962854310454D28D8E38B37AE93433824FF61AA808
-5628F23DE58D64EC1A52AF495DB65FE16087D1F3FA0A36319B517B51679755EC
-9E19706ABE12B8E0641336FB8F05FCE1E6672820E3E9C5EC624186805E4399C1
-F55F16230018FEFF64C51D5B89E6AD23D260551504393A9DE155AD8B545B4D09
-EA2EA8275E104F7BCFFBDFA9F8D4526F1DB9ED1687D1B74370F747B0B0E4B720
-CACD3A22A78819EC6CBA08AD1E7A729E5E42ED9B8D5166ADA2A94EEDE2627751
-336CF3F9033FF20CD52BE3F56EEC67E5B732998F4B1F136736987F4A2605A64B
-1E95A07F5CB058FDFBAC5758E9F0252A31F72ECC06DF1053E090762D17AE84F0
-0424DD6FED7193F99520FAE01556CA67914867016AA86C1C72F87F5D843DDE28
-FDC16CDDD89050A337E455DCBFAF605FBDA91BBE7E3BF1E88005CE32291C52C7
-DC2B3640454D0C36C05648DBEDB2EEBB00F585D371E7B2A9F3B1B153E5635002
-25F859F46BA3CDEFE809C80B1DBC37438479DED51ED2647F405CFBAC7A429360
-4AD394586ABB312F3751FB1328B15C7B15FFD6B7E92B3C8D61C99C8054A33C94
-F6A9412EDFD6894C45AC431D1B29E2AE959D6B610A91725265C4EA7A865A64BC
-CC1BD93DF0828E529C0CD5744644F08FC05B88A5D0AF329972E3B2CC2768CA75
-05DCFB2F758327BD961D7DB6C8401F3337D0A72CA5CDC00CAFF86A5A40BBDC38
-904BBF359700AE4DAFD9AF7B8731095AFF6F0572E857E9E8AC1C2DD5D74F5FF2
-DF3C0B3EABAE300C043FBD2E64AF0CF21ECB09A78FB62778C86E8E5A356B6007
-12ED08D19AFE705CE8E73A58136657E7357E074BC661681B4CF919B0B01B7D87
-9FEB2F4955DC17B86633EE72F9BC1277EF7D688E7FF5DA5B8E5646FB7A5B0457
-F37037F76100FAF3DBF4504F203F569550161D1B578E0E03EA93857ACF26C58A
-B75CAF8E1BF6BE7DE26C974E540FA8049EBA2D17B4C7506EFD6E99B776A78613
-3A953BCA37768BB990D56A650C70D0805D21856301BA9ED1CE9CA46DFDA188C4
-F5C73416AD75903FBCD6D9661C4599BC07E28C6664C72606BECB75783FEDCE87
-29EE7DDA74C74E62BD1F1699531892540E34B795189BF088923E21E65976588B
-A3E06B30DC4C62A4E10064F6D638CCEC9189A7BB33E8B599CC2AB618476D45AB
-55CA9D497C2642B6F3326FC846AD02EB109AF7D9866B5988ADABEE994672085B
-52C906A7F28343FE913EA90B9ADCA82FF8EE7A1B2F3E43687F4B420B5D551846
-3CDC11E099D8B0ECCB24B40C74DD93C5E40E9F3BB4814840A14A291191E95446
-2CF04B18F0E7DBA93BF4AD458F584FB02AFEF085AFC248263B12D76133776A77
-1343CD1E0BE802CF9D9A6FCD7F70277B10FF89AD4A78405C4D3C7C6767ED85F1
-20859187EDC5F026CFE93BF7DF4DC0B32D1F4660B5995A2A79A8FEFF93389CCB
-93D00A3CEECD3B631015A56D9E6C5E30D36DD98E6CD2A3F6148940AA180D7E02
-4442FCA1EC0950FC292E35D3A1CB8AB4AA1EF85B6197BA950AF5D1CB94712C7A
-57500E5E8B1B0A05D865672B098BEE02BE07A01B0A9CA67BF7766EE0EA5941D6
-823ABCC777162C9E35C8451EDA76E0F06E758EDCD0B65BA8AAB143C339D9E843
-24E12148C2CD94E6025FAB0093011ADBF3199D7EF02FD52A7DFDC782E9BB9DDD
-D76955BF841D7A75D806533DEDAC7A906D6CCDF5990FA64F38CC5C22A5270396
-0A8C7963FF5830231D6BC7D0A18A9939B159B50E026AD34D7A8BECB7EDDBC6EB
-00546AE102AA3D88CB76D9B816E069F1821BB2804654802E8EDD9A9ED2458D99
-C5C2D04D87174093282AC0879457510CC1A8EC14B3CE72B4207D7D35F0F74B8B
-0F121DE6EE1A189BF7E076302AFA5C0A09BB8095D32F469E08575E6AAC4AB9A6
-BF82FFA86CC60A3A34D1EA753DDE232119D9A4891B77B9527FE9D9DAE34D6944
-CB9EAE528886AE53C91EA315E708213196A01CDD9A181EDBA37AE4C63A23FC75
-77C3AAB05987D3BC0A654BD9CFD5E6F48D8F4AEDC967A8C51DEE87DE9629BDDD
-680515991E6D71FD417CB784E3EDE648DF8912EF71BF93E20FAE714E422792D7
-2B5F02A314191CB65DDB648898594B44A33F1252676DFDE978BD0188390120D0
-C0E5550B77CD3A08CABCF2FF5B62C59B2B6F95B8A2D8F3DE2BEF93E9CBC20CBE
-64C51CE0E03300459F11451F42C33DCC1D361206A1FBFC4FE27A48F667892C7C
-0817245326322B600B6C323587E7A07A6132BEF029835FE7CE5DDD5DA26FC5C6
-786FED8425EA1D113230D161A78BE519538614F61ED1E92DBA5A0D8B5B5BBC4A
-D875B43B1986449AB67508BDB269D2549D2F794881556DD132E18B657D33C2B9
-83DF615A05ACFB843453E291CAAD9E2CCFC7490F9F6E57C934C5A92037E866E8
-3B2785EE6F10F6D4DFBC8BE8DC383ED4750E67ABA0A74669E2C53FEF09B69CD0
-9D14DCD5A8050AE52F0BEA66BF37B315DC6461CD782957A3A14088A7E4016815
-AC603ABBBB4E179862A20129AE3E4BA0ED6CE562F7BE1C8498A17CBD58E954F3
-AE82734476C567DA005C28510423C7914655D53B0CB094586A0509C190F64770
-C55D2EB3329FFB1D67E35D50533629DBD88986444EA470207BC789EEC011E302
-4B5CD55C640C3D1174E1EEC5F5A1E68FE677BE2D0D8694394C0563734E6F08F4
-FC35024975ABFC560C487AF7AC9961D912E620305A58907A0F7A9CEDCFC7453A
-290C28E1AF0441419571546FCB5442A20674459E9E4E56D02D6D636DEB263A85
-38C63FF6F4F07EBAE0E3E204E94C4A56AA818FDFB54BBA54DA4C25A55C2025C6
-CB6483BC3B55AF578CB4BDC8DB58FF5463D1FCCC63400481A4C3CF4AF3D2C61C
-A7ED38B6333A755EA1190CF54F7881D3F9AFF6408FE2DB0FB36321DD833CA4C6
-25816321DD6E830343CC5325331E765DEA567A8A1ECB8A7E54AE74C7DA049606
-EA4BE6A9E13BB0084093BA80DC98BD5E214F34ADC9452D4A9512E550FD4E97D2
-A64FFFC366896E8325A6A816D04BCD8BBA114F6469D3BEA397E35C7F91AC75B2
-2DDC5B9BD0BFD8C259E0467F5E874BFC42EC6ED7FDF043469FB69C9BEA747915
-778A99648F8F00738962958D1D87424F2667E3788E945895CFCA9EDBE7274A4A
-BC44F16EE2A78599CD73B41E189025BA088573273DAA7D6A2AA19474AA29C1C6
-BD656548816750A76FCCD5634B7599362FDC9B4A252BD5667C4260F1116FA856
-AA4F363FC6032974DD19B5989D7D27BD59B8A0ED42FD9D1DD2858125583F28FE
-A266081D50EEEADF0DD5096885D7DC706DEA8460D04D3900E9E081F92A6A1F95
-3EED1486DFEB20B3DBDFF252D0B2DC7EBBBD755FA3929015205986AAD7404ED9
-67AF080AC63ADE35132A4AD0E9C63C600326048179B6AFD1907C0912113199B8
-427C6196084922B5A0F5E1FA25052DFA4902BB43D349527468A9A8F3732DDB4A
-AD1E9E3028B8ED4623D8D1320CF8A1E0B29C16DAB4A559EFEAB0D234A1A7D8BC
-71B25D5CDE127BCAB2AE7E71A328F2CE9D3EC9D23E370A5E95848A00F2D1AD8E
-ADCFEE7E929F666EF63CC9C90CA02C2ADDD3216C3BA79F469738D1B2B6349F72
-CEF3CAC9F4B4596771D6EC39E61B9817439F0380A57A97AA04091D75B7DA14AB
-0B864A58E00B4B28F054910709B93B37AFE76A7EA777BBEBD9A45889FB52C6FC
-FF985679C9607AE167EAD42791BD42DBCEB89D356416A38007220CEBF4A3203C
-70DE5BF488A91278272E337A47CF8A5F12F95641AEACA5AB485FC5A316BFBDD9
-3052340DD5739FF1C1F850DDEEED70968EDB150D50D7A1F1C894FCB95F9B4CE1
-79721CB1DDC387073BAB999EF40FAEAF721B6BFE427276E3AB02143D3CA60AC5
-055757203EA5071D7730811D723237ED10B83B457BE6CB673B5BA4BC097C6293
-EBE8393443B750766B87534949057B7FC8265048A748D61C4B80F9109CC7E1EC
-36217DCA2709BFDC1682F85E75E0FCF3235ECF266A78E859AC400D5D02ED385E
-7E30492DF22D7D5B3035D2162DFF1795E7E9096BF30957B3F75481F31FA87916
-D25DFE1711390CEE845A3B7842787985B516D60A7F3636AE0D036A911771BA34
-866336E447DD88B6892A00BA6C017156F7D4F4E613BF163EA2F325998F046CB7
-5EFD1077B1EF7D9A40705FE2AB8C9D3200EB1E5903C5BE740B88B3A46C6154E3
-F702924AEFE30BA19D64C20876D8CF14877BE2F1FBA6D2A52D35C395BA35016E
-8A9ABD8720C1A79360150242FB188AEEA1D02D7BD70D15CD0A4261B185ECC8F6
-DA0D3C23250D6B4C188D10D99F5B0B8EE0809BB20D0189D2E8B6FA6E0EF6E415
-890DC4E9F8252F6EE25830D5BF07365B58E0D682B4FB236DFBE36F32CC574B75
-9C997F3E74832510AC57C496D8F131F610A607246C31F548C859DC34CAEB66F8
-AD4A6355C7D04AE6876746489A94C750471DD1A33FDFDAB58BE702D1EA89471B
-1E73286289ADAD1935BEB2F17B2EE77AFD9FB1E278C99F85C6EFC112C997DFA5
-66FC3238FF89BB840CB6B9610C983C24424EA95A2229CCD0D0B62DEA1CE377EA
-B18709581246A060B6181D0A99144212DD9D4430E8B213FD5F37CF5EC4E11DB1
-E3E48223B990724D7C8561A9FA5CDEBBD4BD866647653F4DE6D794FDC4005D88
-C2773247A5D6397CE425E51B96C741FA01EFAB5DA86E5435365671E2BD29A628
-BAA80C56AF17B725BA84E5ACC005C658105162FFE81B5CACAEAE8F3A22209735
-E470CC97B04B0CA0A969E41E94EBADFE40684E0D018007D1267C2E27F4176BAA
-B484A032B0CFD0B3977322AA298EB5A11ADCB2F154294FDCBE9117DD3FA00587
-83430596B2D432A471615ECA7789A6B01BB496309C8424C818357844F34ACEA3
-1B71F88E89AAAE14BB7EF728D75425CEECB1408334D2836A9F62D1B34A1BC9FC
-25A43F2C69F01F3217BE0487563E11A9DEBF88C7655947F0BD725280348F9AF2
-864C611638D3B78B26785DCD3E05C47D297A4C6BAC0840C5E3C646521C7DE8AF
-CE9CC7AF715F62AA0537E7965EF4158276AA8C7A1EB9D7D61C423F39CBD918FE
-EDFE99AD29C73D106F7F1C3DCD4BDBD56F6E608846E32CF26DE47B08C53D3521
-9F8841AF5554757D0CCB44FA7ECD5BDD0C20263D097D9975E1C41DCEF4D8C9B1
-97EC5977EA0EFD9E405B429D451140105161EEA54D4632D6EC6220E28C7153C0
-307E1A3953DE1CEAE5D51CA6C58A15B69BC2528B1500BB281C7E90F40453A685
-A329867D17142A7D2FE906E15FFAEFE641EA5109E92FEE41FF134E8BFD57875D
-D4F8270C12808FCDCEA5812812501F64EC79342DC192B20FB93A1A6E0475DB34
-B7A662C95EBEDAF862726ACF65393A719980839A9C05C705F251E6B46E276CB0
-127CBB7EA4C251B0672C01FD185C7FD287791019D8FBCCB391E9B9F818BD32FC
-E61D57334FCB2266384D8FDDB094DB86E87EC7789A3287C1194827A38926AE50
-F6DAF70C2D3EB91238D87148642EB0693F7583F0D8D8E2B6FAB7DC139B06CB0D
-AEA8C08415C14B835BB928FB81B7DE129A08502D89207B8673BEDCF22024BD99
-5777574A3495BB18121903550084E8FDDE6F940511F23FB95104E76E3846515C
-F954431752CA60C08E345CE8E6199F1041855242A7315FF1ADECA2A23B7218BA
-F7D895AAA7D5C49AD7EF03CF8A2EFFCC1DADFBC101895D17B0C3E102C7DA16CE
-7BC977E49BC120C4673E14F55D00FB30DDFCBF592AFA42A887322F25C15A100F
-82F5D3336804E68FBD0A470FD66D0566F0FEADAE76BE6A436D715BE62A653700
-BE088E4E594D99611E0ABE626A9AFCE2E7066B65295DC87B6A508FA3EA6C0C43
-2580AD8D9266FD81E825C4B0F908DE635B650613435DC700B7920A3B08BCD409
-69D7E559B5AF1E98D02169D4F2BC0CC08CF94FDC62D1877C823D886569EB5DA5
-B93EC5F0283B8ADC719A4831C107394919DF585AB3BABDCD98A63B153DF2BC7F
-55EDD18E2195CCAC549C9B4CF3B91156ABBFB56970EB689EAB871D6FB5919B3F
-21418C07BBEC9FFB2E1C7268290776B993363429B20A5D4C7C66D1B3DE0256FF
-A3A1157C96BC1CEF6F6CD55207FE4DE2CB26E799C768E1DF47654968F6A708A9
-7F42E3A32DAB67EF6D16146793C36FE6876F1CAC18B409D5A5A6408F13CFB9A7
-141D3D25FC0027F6B7FF6D186587BB146DE91530B32B0F1677C48C28D54F3967
-C0E9C3619F09878D2C2A6112DF8FCA1133BFEA4AA87D358A35591BA6F402E7C7
-404A078F95D33AB26E0595B5BFC85D6D8BFDDE1297DCAADF67E1A30DE26D504A
-7FBBAD316A050CB9FC56A10F0A6721E61E87A462711604C33044D6197C0A52D7
-236C147B09DA467579C62A09BBB25DFD9DA11773EBB8032D1946A35928ACA3E4
-CC94CC723D4FC49976F39EE66225584DC3537EA4138AF062951CFCD0BB9D5D41
-F119E670ED47DCC59E67DF658942835353783F571801BF33922D8EB886AF461A
-EF66824F731E5E9A50B153195536AE96FF7F34F21598C83712DAA54B780FB815
-36880FBFD56675EFF13E12A8EDA31C76F6367B818089DCB9C25464C47EC3968B
-AA0939DFCCFDAA0D60672A349E2E4768B386160EB8B41FC8F959D45FA8831BBD
-4EA49CB9F152FC8D730216129FDA998DB38810CF886864927AE9F047855AE4CD
-DD6BC5C4733B48C6614E9E9F7EBE404BA26E352CBFE1A533E9E74C78EE17A9FB
-148B178F503B2154264C21A39B323D8B4FF8129A8E101949DE2C081E28D05DFD
-CA2E08F44BE9B5663F331D34D47C8876AD9540ED7DAFCFF0216D6A50F7D9C00F
-1591AD6FB27CEDEE703D6C3D9D024675A117EBDDC79DF5D4DFC7F201DADCA2A1
-72EB9A21EB33F5C8325CF8D8230DA66B6C7BC504386ADAC40C00E20BDE3B5F2F
-111AF81049379BBC4712A78B6B0A33BF40512A1C42E3095323D07B0B85927AC8
-29EEF89786724EC48D30B8F2F26831BC7238AE0786936CE46FE7B2426A09D370
-460B950E850FA2D6710C50E78497C27E5FE43B7A830E67C5F28219D8B0BC1158
-0A2B02EB3E7A96CC1B6FC8B3DA8708070CE1C26AF0B7D80D83021FC27F0322F5
-2C3B92C29F738CBEACB1065948289EB43E334B5BF6FD7CCE82FE9DED9E3551D8
-1C4F66C9F9C1A3BAC534D79CDED98FB5A28F5E7A4650B4F3DC52058B619FB0CA
-3DC70998B508CAC359C469E488B925685590AE5084C4EF8572EA48DFAACE35AE
-B9CEFC91F38A26A2105DF9C3B859674F6B20F9B3A9B7E2DD2FEB80A899FD2731
-54AA5EC8D6107A55C59A9C20F2990B9DB221908F629E0E45E371FAA3ADE91879
-84479D6F3E3F8F2E972606BCD37276E9425B893233852201D8ED2D753B33450B
-1CDD8AD735BEE3AC8C4E4DA651748B2333B972B6A9DC1A133E3D695D6C975067
-228ED6A4728729D0AB55040AE154F668A2DE8CE6CD5BFBB28A9DE3F90E358BF6
-1BE66D7BD0409D59A6E3430C2C32DAF12D55A8356E25B9B805A69B828B399F96
-824B96589D5CED4A9FAD83D70D12E2CF7C9B9CF34E3F55423F478A2B8FE24C6C
-FCFD80E8898C26FE65DF206C2BE1C6439BAFBF809046472A059F53CBA38090D8
-E03AE270F456B2F63987F18AED9823DBDD39F8A175770C6164D839BDCD7AA732
-E63379F4A5C45E217A5F37AF8DE3F5F463BB67F57192F71AFAB06CD96B2ADCC4
-D9FFAAA11B176A5CCCCD8FEE8453579EE23F97143E6B176418184C0F3C004908
-38D73E689018BC811251901EC141705FC39D61A3FEAD3D869A1CBFA833AE9FB5
-659AF715D30854D9312919DEDD227A4ADFDBBC76851DBD3427A28B9C957396BF
-6E530F570893A2056E53515D0B5A9FB44E16F26039161683C3F4D34A87E1A631
-7C262B4A9D1175C07239B87FF6756B5AEB02E315659D938B7E55CF59C35DC48E
-006F444D7D17178FB459506521227674339CC9D1CC80C3BC472B026DF0A45F61
-A8940F2D6E9379B95F28AC3BA13987E685E4C30BB8F6BA6562EFC9D1BFF66E1E
-AD72AFE048DA95093D064B0E692CADC6DA786221CD5655FF768B51FECA289395
-7062E952A0347FAAFD0C28F1ADBC0BB121F0AD038DA635D0AFFD2F1D65A769DB
-2F69BA310ABAF715AAF91EC3C5DCFADA1235716A9F53A510EA3A3A21D1034163
-48A7963C8B12C1DA71A02EB87C2863176EFCEAAEBB5289568D37689921FCE677
-7D874CCFF1A72391F25CD922DA5A7B35A0E40CE40AF2521B567596DF422DE776
-A9DDF64744F8164F24985B081F0E73F43E43217BF0DEF9CE522CE604AB739192
-BDB8FAD799C43F17AA436B7CC97268A73D583BC579B95E56B2FAEE303A565CAF
-5BE8FD7F04C03417A3121966B549FB7E7BE070C0B05A6961733D4F189B78FD41
-412EC99F5B7E841DBC5A7503E5FDFC10E85E2DCF4D4BFE9CE967C09139082FA6
-F40337731B9B6ABC831DEE16BB3DF818EC2B701210BFFC32CFA306AF069522E1
-C05F3A0A0F93E7251FD4D57FEF2211F79422C5172AECB8B51D1FB521924E43FF
-54BA9A4FE04BCECDACDF64D00D736272937F9257492E90A83E064051ABAE4FB1
-8FDB08EC54106FB4B3289FB095E83299B57CB6276B78F465800651B8F7C8479B
-1C97E0E31CA741CE73234440C0C62FC373006DA598E550AC386DC6E0932F46A3
-8A0588C3AD1B862FC14D9A8910574C17984B1127B6985C969729898A9197529C
-2897CF8A077FF821BCF055C2EFC1948AF0569AAB1ACD59F15D648671E726F3F4
-2312EBC0E6BCA0F7B977B04020976AE645A5738401DF2D81720C4BC90D1132FD
-7334F2C852838583465DB27C834F3F10B1237A7DAC5E0136BFC785759F29F5B7
-CB0DA5C01C2AFD7460F14E03A73C818B313824B23B1B5B7443E3581E3BC11200
-D55AE9E7900AC167A7D2F20935FD72F33B695F25B6F08DF95677
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/l047016t.pfa b/lib/fonts/l047016t.pfa
deleted file mode 100644
index 48094088e5..0000000000
--- a/lib/fonts/l047016t.pfa
+++ /dev/null
@@ -1,1356 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiMono-Bold 1.1000
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.1000) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Mono Bold) readonly def
-/FamilyName (Luxi Mono) readonly def
-/Weight (Bold) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch true def
-/UnderlinePosition -88 def
-/UnderlineThickness 83 def
-end readonly def
-/FontName /LuxiMono-Bold def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {0 -211 714 1012} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078984 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D83C82A2DC38F66F08FF34
-E7B34FBD496A97F0AE69763627499CD43525BDD2FA2EA9DDE51C821C26AC69EA
-AF027BC54141332FA165BFDE024DBE6CD20A8E4EF56F52F260AEC28695FE9141
-7E7F100CCF64993650A81C0856688B1D101418D3B0926F70BBDCCAF43FF4B16A
-B8328A5C459C7D6DD6FEEA1AD5049C4EF32D91C30962146E922D498E4D38D172
-CCFFA8F084C6BD440ED2C77C1B574CF8CE25AC39D2B18C91E596994081B36688
-EF1C949FBA04376ECBE32C3E29ACF83A8C36569C315CACB3DAAFC2FC8FF68839
-D9BF2A301E3E8F5B27EB82D8DF5D70444998F05B99D26AD632FC21A81D887E9C
-80BDDB95A1C0FB1F43386515E0F2903E3623B19F363F35885143893761E54BD7
-C9EDB5940386C62FA7A8919B57E4A4F0D9F3B4A4EA82C071BAB90B57C7A0F553
-BEC3A57EEB877476FACBBB61DB74A76D95DCE4D5C46F9686AA5176D6B65F0FFA
-37E1850A881EF057A62E3092D923107C691D32F3D619B05DB75B337EB54D5505
-2B7669A69A162DE45E9F900FB8BCC2BFB7AC5CCC64DF94DA97386D4E4AECAA28
-A9CFF3C9CE3031CC890E563F7A110D4690CDC5BBD49F7ED21C6E635952FE3ACB
-02373DD80C2C653E01525504AC37C849D6C5F25DF0C5C762C45A83233517EF9B
-D7F67A77881F6B46BE10E458FBDD73D225A6047095AB3B7AFE9FE2113751B732
-950B7865DE7DE98DDEC75D3D0311E902C2D7FD4A7F08F481ACB695078B930EC3
-6F3669F4E50345CE0A4CF1C739BD8A92BA29CF5FF0C3A85B687C0BC0BBBDB8D5
-DB96AF1962948038D1EC4ADD39D3DF966ABB57CA3017A28EB9B2148D1AB72F08
-899F5686A2013D69F6D3F5ACFB0503DCDF2D93CC7722D3F7D7486466F32741C0
-17F3D8F2D64063A9CBEBB462D4CF8569EFE4DEBE6DF3CD2F3C2AC955D8A20B1E
-A0199D05C93CE0F92ED01330A7C9E65E7ACE079CBF7616F24ED2AF540FA4A1FD
-5CCC7A1057ECFB91B02A84499F9209CE5989021F4D27B2B20D4793F6C81591CF
-ECBCC22005F89BCD1A089C36E659BF3BB92558ACE98DBDF10F0F6C7514356F54
-5A8BD7EA0E326494BDE14D91C6C74224FCBB42FC22FF8F819AC8CEFF7F28A56E
-A86FA3DADB388D04A015B0E703553CA2C2E5B688DD49DA92FD89107B744BDE7F
-85986FC9C688B97C67C0C4C555EC943D5C6CBB8BDA89ECEBA41037A92BDC075C
-3C2CC573B084B19EC7FF10FBE814B0226E216452BAF96DC3503218F49ED279D3
-CDC0369901B7764918E8071258114002152AD47B0ACA19066B5DDFC7AC37A6D9
-E49FC3A5C16F51A5B86663E15139A063C5D408C562951934700371469A49A940
-FA7074CAB31DF454BD990124F5E70B4B6D62DAFF949FD73DC758598B34376867
-3F7BCCB83086D6AED4460D71BFB2395A94A27CF34DACF70BEB4906BC6DC19203
-5512F6948158915E228603A5D4B906997D51EEA9BAD01BE45C36BC39D9C70778
-D6F8619B3814F7A3E9E0524C8DD61EC63E8B4E15C42FBBBDF8257442E5D2CEC0
-890F6B2476340387E8A4E21A09805F82A17392D2AB3CF3429DB5FFEFB093165C
-63525A9BE659AA22C7FA5DCB894DCA8D1560668636FAF723B4F618936EE634D5
-EF823BEEC25B274EB5E8912BF186A537D3EDDE38F09801E74D5885919850F48E
-A7A8AABBF6625CF2B0A9843E5D9A499C1047C490EDF9774F02A5CFE926BDBAE4
-18843FD4575E8634B27E536FAE9E09084D3F73FB29B9E4AC002E709986A90995
-B4EE10012F74A0BCFF2A6C0A69D945C19DF4F7070D60E3EF03508AF8793BD70D
-5D4BFC8BF5A29B4339C799EA8AA64ACA925A37EEE489C7FC8A31F5131F386A23
-C63F7D3C6BB60E204B169AA01EA12B590B9F0FAAD50D030381CD0C6177D28538
-377F92029F2A448F7586C7B14BA5BA08543D8216E6875AD18E974B39A53B5D3F
-157CACE3442B1948D2C44DCD88D1604D3AAF4487B4919349B7F0E01302261204
-50380294937386246EC4444C08955919A30118566A9B9D409F58255604A90782
-0583591C68296746D4DA1BFD0184029B73EC4C955C7F0BDCA08D8B85FBFA4CBA
-336BA29DF59226DB39C3B02AC5A906857EFB7A227A09FFE63BA35DE73434BDAB
-C11BE30C59E650592C518C0F533FA0CABAF3E2CAD23E69776879CC7A9225A086
-281FDF2C1F72FCA1723A5C2492BA061FB6D73F6240AE5708521AAB52F736863B
-B05E53ECB5C64A26B277F106FF2E0C9699719335BD32842806F0F866CE4818FA
-F61D141532738ADC2C8BCC1145BACFDF3BE1CFD92914C3945126847769D6DD0D
-6F44FC9D966F224AA72C22D0EF953B2A43C93E581DD907B611F3005D62C25162
-FD2149DEF7894A112449FF5F43D8F30CD7DA81D408E85F89DA78C4998BB8A24A
-38B9F346E5FBC6D09EDF332B8B7F8EAC363D0D01708C24655412AEB148E28D99
-D9F41076F0E7BBF10AB96BBD72FD05BA982F673D3D79270107C040707C6316E6
-11E4FB04A320621B6C3E10575FF97A28B60B30B840A877A5BEB0EFCCE0EF03BC
-F247ADE0F509EAFD6CD7F70B523E6E145EEF8AC9C17614BE65934DDC17545C4B
-50770418C185606C0A01B2622CADD9CBBB97E14A92D5230FB7ABE7D0D8CE9047
-F64225C6D488695FB9801EF4C76E20340721F7734AC114B3E6041D4C76C11F19
-3326FB3DE6CBF4B4C1F18B3388D6DDC000F04E195827F68CDCA2E0C411788B05
-4AAD40E3E09EDECA7817AE2B29316063C8579A90CF67D93AC158E940B14FCDBA
-3B82EBE2D4BBC8A8B22AB531DDDCEF6E4104314DDC2DF028E2F09436CFCFD32D
-0238D1C9C0404FD97DC627773CD8022632E4914D40283AAA5FFDF86914140D42
-0C4350BA37D3CD49E1D79081462E3701DC0A9E9AC67D712BF7CEC27C1200138C
-9729AAADB724BB9FFD5B831ABABEE5BE8C270A1ADF85A246ABB9612F181730A2
-30B9886D897C2EAD9AF7E6A47DA049373049E5E4C29F5B7DCF2258A1AF341CB8
-C5F464EA85663A9B8132775E4B8620420750161C419F88594908C64A2BE265B9
-84A950C8B63C065B1FD4F78121F582EC875F396E0EC8F6851AB87C36C56EBE7E
-036ABC0D89D9FE8E626646AC65DC5445EF3FB60CC5C50A5118F9F248FA15B3B8
-C8A88E168BCC5488D10CED157A8EEF8EEEADDA64372B76B944685B686DE8AFC0
-F4A376200790E0D0DB2172C80E6BF90052DE847633912F72840A5C745DA4E774
-014841DBB53EDB729DA7AAC1D3FA428DBFF252F91BDCFE3AC31C2CAEEAE29045
-DE7F0795D6D924180292E18B3955FA93DCC555683FCB5FDECA34EF0D0885ABA3
-C7BF9CC897C6E5737AF9448C952269D18AAA18FD1D3C2F5DB49D652F43E6CB21
-D22F7ACA596DE470A1264FA065C0B2CE3C58DDD168BD28D6A2FE2A41045F3219
-AE87AF49E363AEA5164C7107CDFEB8BACAF39C795D98F9855E35BEA4482F78B3
-8A62DEA5A26336671AE7D96AD413A2A5E98111D319AFF427420906C75D4E16E7
-AB85A37972380840CE59C78273A510C819EF376534266081CDCF3313C83D7089
-71BF31000698E853973A6D275A8F215677CE9EEC26B5FC21E481AB9C189C37FA
-2F7E2A63B4286E1AAB933C0CCE1AEA78E1F7B9F7A16DDCFCF350514F1E671D3F
-DDBB3CB3324AA85E9373060D2FEC1F218A06E4A1E6F5DA7E3B72511C5F0F348D
-A221902C405AD22CF96C4A14F09BE984C710AE0472E90ED804C33BC2797D5F30
-F31B250C791B0CDCFBA202DBEDEF03C144D31D7431B7667F88C1AFD9E218A08C
-46811F871812FA17AB468062FB0E478B8AB84B9C06208C8ACAC16E34B42E8B9F
-747F8BBDAAE6736A5A4BC9C494EE15356CF6F02FCD2F52D4A3F9CD5B472AA89D
-BF371F08DDF4FAD324B46BEA792CFD4E148E33CD0CD5C74A76CD5CB4EC885420
-AB9DF5D757C33BE1CE9AD32E6B0179C4C511CC984A5365E50E12CEBB8CC71CAB
-572054A7DAEB7EFF1025B60BBF1ACA5C3A701396DA00C6F77E7B86F1BD246393
-1030F1B6A8D13F6A0D3FC3825DDBD7CE36CE55612D3516EC214AADC5ADAC59AC
-054743534AC8068A67C09695C7D04341D22F5AAAC4086CF370583B93F417579D
-7392D7B57928230688C7C5B1931E26E843B8FC5D2D5D09A3005C1803BEACFD54
-F5A8BF2A6CF7852616F93E05913D188AC4E2F9AC3F2C1C455B0F0D1E32D9752E
-331E7ED9F777FDEEE5ECA4FA4A27354C1D5E7E388008D7C45456CB361F3E4D0C
-AB08D54AEC00286398730911A5F145D7DDA76D696F1DC17C0965A4B0899E8B4A
-7AD364ADCA31D1A0714ACCEBD2BB7FD77A4025EB94D4436925DC5E460EEB013B
-359983AEF8637A929A04D9D5A963AE764FF82C42C62FB220530FE59018A89D0F
-CC8C3E2E4B918FB14279F5D0ABEE4756C3E79C1CA70359FDA92487D42B7A2943
-3ADF2FDED43EEEF0108E7EC8778E14C4C0BD06B6687C08C1AEC415477176C892
-496E84FD5E9A7E4DB11287A9605F5F0CE1B71D3C198900C67B9B333D10F5F331
-CFC638F80E03CD59C5DC5862BF8A18B6ABA8435936A3E2406AE848EA94716472
-A726D75C94BBA07926745B20EFAC14EAC276B477B94FACFD9D664365B1CAAC7A
-DB2BA6B75F4F83339CD645428F0A5F498677108DC473CA984370A7D6A9E295AD
-AA68CE2D5B435915EB0F6B72A9F4D49E356050223F524A270A9DEDD0B8B66822
-C8E94A311C4A055EA18BF0292CD25EAE689C8F932226643B5085E72F5FE0A232
-6064C6850F189B2C46F9EB94966600A8B7205C654F33737ECAF9B4F3FB3CA0FA
-44A85FE7A9AAB211C6B4062052C4C01685F58F0D2786585CE0FFDD1B348F2FDC
-A19E31CEC44C59BFA74997E570EE0FD56629135F3BD7CB2B6466E2F031DA6E8F
-11813E7118A232D38AA3EDC86ACA1328FB9F870174F4D1BF511531FFF0E23278
-9D29E817441F255261318894BB2CEDD0E6F8B3339D888A2C401D7009E7879D5A
-7C6DF9C8D97C5221DC65181A96992EDF4C983DA8C0669F3D0BAA4DCA2FB17848
-F34F69182E6A129A983A1FC394EBFC31551185A750114B383E01E61CED8637FC
-B4765F1791D121B8B1D08035B6D8ECB2856FDB43B25101444D160E02588E80A6
-10D55BA3B76B5B9C6B97B4C07A0AEB124459603BFCF1C50DD19776543EE9891D
-9FAA53093A933077B5D3C0280679818348E77835C679C603F46714478BAFD156
-803B736D4CCB3F1C1FC2192B2EC1CF78C36FED5E0496B5A8F0CB1B72407BE183
-0BAB9171EF79069EC940B9B13F69F952EE781A811EA4A0A7FC8A5E5BE4FC60DF
-45874393CD027EB52EA2DC1EC163152F3B74B7E7D62E042093CF3119F4F50179
-302EEBB352C362A6C2DAE8A251156664B492FB60A1DBB7801DB26476BCE9E78C
-444040DBB110FDA2783A62FBAD6A95AB513B292920960E7F630CF7F5C2A5785D
-5BE65897155D32CC657E231FFEE30CCEBFC00C375E105A5B613FD2C27A6FF7D3
-92C00B7E0BDCC70A6E80F5BA164F116A2732526B669E50F5F6BA575E37FDC9C3
-38A49BA0522EA697F517D74D533BA28F928565985AF5E32B84BAF188F2B9B952
-0C291440B04DBA34354177783CDD82AFB65DE0E179E638FE1BD2EB3EB20D5344
-C4B6E5D639DFAA78A77433D36FED5462B6B090E3434034B8BF00BF7EF35407EA
-9F122694EBC6B6B4214EB779C94E6BBB04998AA57249B8D84353E0BDC605CA98
-492862A8239E8875A9BB5ADFEB966F0D7FCC355E3F0428E227D8B41945257F63
-9F6A6A69B7A902DDBE08D9FEC8233E11BCF15C1458C19F9E487314C26517D162
-9AFD021C75353FE5A161EF3EC7E06B616AF1447602483A3486788298AF766714
-939A160EAABF06B61D86CB02F6A958690D38C86BE7998B444B7A2B74C6BF72E1
-B9A59AB78D20C121D1AACD208531FBB2BE37BE529FBCE24D229CC242A1FA721E
-AC762979A4B92565B6BC94EFFA2CD84985F8FFCFA1BB44503BF1265D52370C53
-4B445AEC55B12E40F05DF383B356CED44B5345007B9F3454950F12C8E87E41FB
-72715838A27013F689D6B55925C49D92E0E14CBE59D9585BACC8CE5D62F86F27
-B51E89884EF529F27CF4C61A28BAAE981524CE3714368D664AC4773FF8B71728
-88C3E8878032EE246359A97DA80F1DED34DF09EE5F249B364BBA41BF81D16AAA
-9ACFE092E3E491ABE1C40A53B1A50B88788AE14870079175C14AEAF7EE777437
-8F4A7A03178AAC032EB320DBD8E0C19C0071B262C76913B787E1B3FBEF926A49
-CF96ADF8E3BBCC3F679294B5DBB5005DA2294848229A557865E0116AADB4E6AE
-94AAC10394B4FA2872BBEBDDC869163E50CE3BB2925B554235B6BDE9A29CEDB3
-07DFCC3D8AD0CFEBA9C7AE10314771DA1E6C3B927FB950ADE62D1FB8AE7A3CC9
-C9E0F4484D61A6C9F353B9AA91A186DB859385059544FC85C15E1A3357BEC89D
-92AF74938D1B56B7120B934297A71F1D92E93658C69E7FD4B338F59FA6F6C337
-427532AB1A4EADAA5FF1A8C7A84F444F81D60557808ECF3DB67C052EAF4A9FF1
-0538A114857BBE83BE784E9865B00EE8B407AD9E2B65E402EE6CF733C9B31603
-25F2C97BE78D94A51CA51F28ED9E840F13057B1F21C30F77ED6FF458C8EE4DFC
-493B64190AA9C8B22C5977FE16F31C3ACD5CEE976839E2456916EC66FCB30B44
-8FEF1B63D552E1B0F049C48445DE8C80F8563E9870134038DA5546C7E7E3A1BA
-1879235D0F328957290810F18037833D7A83558C94EE9856D3D82A3AD00659C9
-3E9587751B5BF2535FA1D1A508FBF86DBF7FC7009E1A542150F8F0EA356689A9
-DAA05EACE716C3496D4D23F326D4634B24A419F483154FFA9B81DFBFCEB31624
-1C87449BC00AADF4DA13A25955485D0C7C5CB9AAF29E1940B0DDA19594A8F7F0
-033C60CA8C9057879F10A6116BE5991F332AC272834D99344B0E476F9B2034BD
-EEBEAD5D1437C0B9E10DD38A002BCB01218A40844A91FAF28940BA11A40F2BAC
-EAFD82E977AA41B4971C69E82232A5018A31F71C1E60F2635D59DC40B233FE47
-C29D0A2A906955CC69BCB72BCA6D80E9B84F06F618BA1C7EFE99A75FE35AE359
-730863494339E0F2239191B6E7C5E8FED2F43EF6B5789872128DC528CCC2D023
-AE7A0BC6F9C194E642F09B78D898D63EE3EAFA611DC428C24CF363F78A174C45
-8C3C91CA391D7F1AE652C2D81DBB7F1A5AAB745AB08EB93BB316CCFD7D353023
-4B7CF322F928CDD5A413D60669D062E5C59A0F2C1D6BAD36CA9C5F5D50BF48A8
-AB77EBE65D054FECE72D08CE3A0C1916AAB4202D5BF4F07998534C1CFC49350C
-095D98A12E1E1E6A5BB2D3F3B6E6DFFD926A647DA7DA8EE687AF44DDC9FE4A00
-18D679F66287FA26D6AE4075E430BE22684B42EF75CD59AD72C2E97383D5AD52
-1867C37AF8855A4A5428D125DD22AE0B2757781A80EE7D425B7271AD95B96B81
-2092E92DA4D04D9E711AF88292C56E35E7FD15C0D12BFB7F244BF4CE5B589CAF
-89807DEA042EB5CD7615FA6551DEC1CAB933A6218E08C02443AB912C915A5E95
-DE3E2B66C64846F9FF403DA1642BFE9F5FDF0DA4BEB832D07FE6552394558903
-82ECF4DFB28B7E5FED973A99C0AE3CC792EBD9E7F53C84783AECAC10F9AC8661
-F023093A9F37141E27811C6B33FF8614AFA7DFFEC2E01F0B3D60442F6C62ACF4
-7274D7F52AA594A3A096EAEAA2C161FCB10E0AF00ECBF9D7EA6A4533B7F8EC31
-FABA55E1AACA89E5D02114E7FFEBA84528FEFE356A48090A59AC39F358FD8800
-0AB1486BBE16BED95607ED284CE271D6D9239F3F23FD403304C19E3132E2F3F2
-B7E1323468C66444B2E296E42365A9276FCB51DE065D6196CD4ED0E45A096DA3
-C45D8DC05C009C1C335ADE0D874F714C8EC74121B386483D2E67B8E7466A8ECB
-DFE911178ACC242FCF9DB814498ED313CC6199DE67133ED4EE9253C6EFE87DFE
-CC9E4C6F2950F1F9A93834BC359215BB37EFFDE944344F922B2AFD7723A45F44
-DEFA4E344C6E8772EB6F9D89E850E853E8119860A6871668C8A062869E15EE11
-64EDC397E138D823F520B8475FB6703098E3F779FD6446B2E2B27289B5D569E2
-C2B5FD00FC05A609572F57D14801C5EC159423E4B0AE61ECDA938424F47E99AE
-BEC534EAEF22396119C3E79AAB1194F71044A8973FF94FEDC317CACE3FC26E25
-8514B5C039CAD5B2E83C049D31C135EA4BC2167C44EA92AF8F45BB777BC56EAF
-BE7CB54F02AF2263EC1AF29C7E8D548ECF88BC262AA04D6F7DF26E5EC5E2919C
-52B5A8CE42AA960EC9CDFB35F2DC8FA31E0DD5FE5BC18A7A5FBAB0A509CB7451
-DD4230D95D6ABB2B914A93F42D0B17AC931E4814AA939F90E389EA9DF311F834
-8A0A1A86602B07EB1CAECA4178A885C11CAA3710B6DF83DA05AC6169364E6EF2
-BB75559A056929BFDCAD8C30CE83AFB66266D24D308A8A510FF245BE51B49A0C
-C608B08EFB13973C7BE9CBBC46838DE5BEBA093863CC9B896C1761E6DABC0CC8
-889BA134FFDA108C9B101AEB88E18B52FB151DD631ACB1CACC164306CF909452
-C967430620DE41E0BA22C811F5D6D728781DAA43B2279C9E301096D58DBED1B3
-EBE39E8444AE50AF6AD2929AC1C2FBA27497A0AED80A72D515403B46DDBEC309
-7A8F8A7E1D840E4D7F7FF390A0176E85D09A5AECE75D167594FA3F7C670068FC
-31B055894450460F91CF36780916C17E8644C05EFE80D525B2CCFA1FD1B5FBA9
-2CA3A87AEF0867E8F135086BF78C43BED284339040754E8091EE2FB26E58DCFC
-9025C55C286E99D5CD2B1C0767F1FE0D89BE87146C8D9C21118267CA2D9E15E5
-4DF80A9E709C6E4D284AC29AB032FCE2AC173A4381E47FC8876716DB39C63380
-E0D5417D1D1ECA49D5414E93DA59754653498A27B796C04CA3B3DA37D326EB09
-5646C20F0CF2D34D45758CF49BD7CFF0D71294BEF0584E87D06D4C069A7D9256
-B5AC4005F524A46A97574FC42EF2F0FD8382C26A385A3437FF85525F80711A14
-B928853A5DB29B64475D06B1CF33ED36396BC1FDA09B35E0857B2424584D5E9F
-A1CD56B852D910C67EC88AB907BDD4F94A6CDC9FCD1CA1ADF7D2D3D3F4C8EB88
-EDDB632D8430B157546038CC69FEDD9FBD7E58BEA5507520C9D55910A656511F
-273BBBD804DB9AC2CAF9D0D02F6F9420C7E3974B2A7C57D74B562155FE7D1679
-904503BF008E32DE50A007251D27461F62277E50DE498C0432B48F3F8AE9B589
-919EE62872BFF2DE14850773B86331895AB20BD96412A52E9B87D06DFAD62EC4
-ED02516D2FD8866B41140D53B4AB65DFABD08B96E7FF634DFAFFF3403BB6ADAE
-947387754DE0337BEBB7CBCC8CD4D0BE5A2FECC73DBEB5A3684979939F352E06
-CB07BBDE49096A91872C1B77BFEA8B6686354E53009577C2AB75BA32D9E6A6D9
-1D2324B105428EE06BB04B862127F0DE5A849AF6647AD7722B86E1E42C58A940
-F3A7CE22C828D84B84D80BB7A3AD87E1A16C2BEDC68E9E3ECA734840614E1480
-F70C26D8D185830FE5C1B2E6FD3AA633E5F856A4496574405310C3FD709BF92F
-23353CE76FF2C5D22B5345C3AB129F107D478063807E9EC522EB4905F59F72C9
-31012EE90C7A4412D01832AAB0F8B0A84C532ABA1F6EA8EB84C91F16C5EFC2D1
-3A9C2F5DAEFCB1B00936DEA1988049FB1655BD5C1912399621DD755D506845FE
-A59C625AB92649383BDDF1CD48B33CBD8E207CC63D7B4EB314354F5609A68713
-5EE512AAFE98A7329AB516F89FBA8BFC6AF3AAF189CDB905ED3F63F479CDAA3B
-27A384522D571226623E887756EAF7539BD2FEA33ED6A30656A3EFE0264C2E0C
-44E065EFD20E0961F86B2067FC7B60A3201F789E8712D79528CC5449D8A4BDFF
-A16F13C8E077A259CC71DEA56691BE117BBF356B78074CED1F54C9E16DD2CE48
-501444BA0AF54B1C84F5415CE7863DBBE37CA30688D5B6542E9E743F8EFA5A46
-4F46FFD30F801D02ED63B52C6C0AA0750FD82ED149C8D35DB524C424B2DE7D17
-A886FCAD0D9A0EDF04EA5C4072ABB8D07A6589E9AEC0C9E1933B94DDF9350751
-A6954226F040D8D13F7F34ABEA21CCA64D59076F61885116C307A95E74F52324
-8B1E8A05358FADE97BE4703CE7AA80047BD200F59F4CAB6EADB05A892469C4BB
-3816C606D39BF8B7CD0B69A5CBCBAF35E7C9670FBD4CF8A5E11ED3794308568B
-174D42AA69F3FFE58333619BF448FB0951D9E627DE153FEA9A4F2312EC701C2A
-9915D9434205857AE251095E8E856D01C4F1CAEEAEF2A7F2B974F1C27EAD3976
-7479273E36A7AFF9D4EA352ECF7642CD0CC31982D945EC00720286E2ABE0F9E1
-199033AAA3F9F0142F285B88B091E01249472F339FD8A9BE3ABB16DA3DF606E4
-2467780732D6CD6C20101FDE86391D4CF8BDCBDC0A112E9339FC5E928792B62E
-4FBE7770C4EC526C4F5CEAFD25B3E4D1A0B4F06B516971A099299D8005C9231E
-D06688D4AAA4550604F7D1C9294B74B159B6B0B15CA2A5395EF6EE355E59BB68
-DD8B01A0CC19ABEFD5337B00E8079FBD5E5CB3188C414E015DB57FAAF330FD45
-E62887ED507092202F32CC49757032D13444DF1F619FB561379FAF4931BFDF62
-3FABFE5B949829267190F61A4318678A07403A5FD9FC8C2F10EBD819D6EE9C73
-EE3D852B1DB42EDA74C3C63EE61762EE0C8D5582332AFAAD3A3BA0B5FDB17836
-9BF11422BCD69EBF2F11C67780BF0533353DD045AA551757111F11F4FBC067C7
-84486CB7A486B602F9D7C56EF84A804AA08A740E3BD2D647D1DCE018B4D225BD
-DC9607D21377E450CBF76AECAEFE4C4FEF2F72A4A44E90B28D2F46FC8E549C1F
-312CBB690F9D96FBBBD77827158FB5C2DE80DE51D17BB86A4E634EB917ADAF1B
-00038B6028D3FCFE6805A72DD10B17C7A434C68744F19A260BFCE7C040D1930E
-B4B35E0A3A8330A6E197F359CCAF0EF03502846C784ACB3068280CB7D3095977
-9BB914063E289DB7BDD5F8D50B9D8B64A6259AA947FA3AAAF20FBEB3B020B169
-8A2A68D6C899F8CE32BCA97D75E9921883663DDE2735439F8BB5B62BF61463AE
-947A0E4862D480D9197054727BA1C1D3E34A0310DC8D30F24AF051A384D5CFDF
-4DEA1DC83277553715A026F0B676FA651D6036886319455F265C4AD78FE72B41
-9C8A0B613A4FAED194DFE836C15F10E4EBDF0D2779B0337D54628F4CE0EB0AB9
-2D67DF7D287D233815462CBA378BB4D05AEA230DD884BBFEA756954EB0A6F304
-5169129B2D3A55D3ADAE8017B3D9CFC5687F2CE00BE59D084AB6ADDC8D8DF76D
-B9449917623FFB4F924EE1BD40A536E1380F22BD07260D3BE827E62220E0FCAE
-E21094047696EC4378722E62F696C4FFA6CC92D1D5F719E472CFF99995CE95BC
-7D3BD9A6172195243343868EC7FC4C51DDF43BE6649F096C4DDDBF6498BF6208
-A7FD124B9D7CE06E89C45EE3162C8505255DA806684280C4A7487692862096C9
-ECCA26F72DA251733B700261FCEEEB7DDE3542FA852B39707044F5E34AA80AEA
-C4F54814C72C5480AC15478E28D7898557F7FAC89720BE0C02B726F674ACD9FD
-635A87EEB2BE08765AEADD636E261625FA9E93E77D954E5DBA6A2A75D431879E
-5936B3E396B3E681F393669F20884B1D75CFA3714D967A7C6DA12D31E26FC12C
-96CAADA06D701DC45E00C1903A8D9BCE04B19DF613B54AF7B6DE33678078C03D
-F1B0C31A9B87FA42FB434F105633C646E2A45617D8352BA18F5F9EFA6DFE5A0A
-2FBF4F79A0CC5ED15F8B9EFE6BFBD2F7F7ACC99A7162F1D0491ED4208F2A7E23
-1165C3D65FAE7B3513818BC46A9A2277100867AAE0DE763FB6C7319C933F92D1
-4A8F8B5B5460200FA193805D3972F18B4B3DE7398F8C0A4462EB53C54A4CA42F
-93E671584DFAF63AB8B91FE0EB29A8E525C1F137E7673F632B0E1E3864E1AA54
-D22252FC1EEFA76092E85680AB35DF214E761395744BC84E03D6F2E50D15D1FD
-6B0C0914E661159BA887B856C49C04993C4F3FF4530F45CE0323752EA175F97A
-F4C5CF8E8F103FBB38295D016E639C931E1421762C075133DA533E5F5ADB6CF6
-AB5BB6C69A761BB71398C0E1C15E112489367193FF3464271F439E4ACA94F47B
-8855971F042AD99F97B049F6D57FDDDF401551B4793C4217851444D674E2E61D
-98D1D55CE1B7B00A82E16C25766195167C01E3BA58CAE1A5675B4E9DE80EDCD0
-96DB71DC7C2E8B147A22E683B900DD3EBE402F2DBAA6DDB847E5AE7D0D95D4A3
-0E5EE6E1514391A69ABCA5078C96E0895047D2242316792BC99D59EE40293A25
-AEE147A96C9B8CE778C4ED454D1E1BBB351966B1684FEFD4A8E707FDD5EC675D
-96181FD81641BB578C486A0529FA2EEF184B0402BB93BC400B1A29DF5ABBBB03
-774499655178A19FF518E5241C86719B1AD5C04A0775C0620F23BF19A1DF3864
-9219F74D06410CC1C85DE0E172DA953238F83BB44ED46C37FA1841D2282D16F2
-5C3C9D3A3897F880D49BB65E9A12432F517175C2F3F12C5F44DBFF1094EA2CF9
-0AF10CFEC825F1DDBE0331DC70EB7AB9736DFBE1D6C3448B5245AD469DB40B64
-D1B89F7E083156D3B44E7C27ACBC411413D69D515FE03C7EBAED6DBC7CB3FB7D
-DDE6239F8A21E6329C07E0C601D4B114BC3964D921D3C15BACAB7AF7EE202B20
-3FEAAC53D13F088A932409337991D5CE4D4D55FDE4D515EAFFB5E47ACA6207B2
-F059EE7A93965F859AAD0EEF2A6FDBB45408834E885747349244741526882DBA
-7AA940C038AF5D0909C1B6F163CCC5A9601E6F7BC13AD1DE6A699100F9E2BC5F
-EDDCD46C3147E747C6D6006C05988AA402A7C123F015A271C9199E3338B7FD85
-B73B31611FC6ECC10F203C91605279EB6894304A0FF6B67A7CE10BD48E44C0BF
-04395105279961D56E6D3CBB3F5ABEE1F069FF512D70BD9C81BEEB62710FA967
-2AC750075845E2EC4B7826F170023D7BEC4719EA2028AAA3EE91D3E212DBE02D
-53CDA397F61A4CFA58543FF5A5AE88D410EABEF0AA0CA8170AD71922181CD387
-96ECBC28C88C3199618DDBDADAB8FD6B87621B731D91FD6DCA973F2CB347C2AC
-110544A352FBC02B408AF4475AC4A5792455416A6E9184C861B4EB02F6D565DC
-EBA2A752C0C9EEF51CC5C0EB286ECEBC7FE5303AA411F14DF5B569A271BE0650
-BA2061861610C64BA81442A8C98B5334CC41603B00FC7D49CBAA7E6257EA6F13
-72A7FB4FEE1F7EE3B6226D7564B105D7902B3DF2BB43286B6C71A5F70A67E926
-706F301CA4CDF22411A6C91BA7EF405FA5EECA8865E2A12290BC2485714D891E
-CB9EA86E36EF1C7CC6BE96AFBEF493420FAB5195DBE4DC80BC075C17A1DC6565
-AE1949B72A9E26D9E832C08CDCFB37B73BB0C80C452EAD2145E1C217A53C1E43
-6D7EB4F6D035DD6A6852F33E561043F8C9ABF09AC746E936B522522D1B5A4A70
-7A0566D6F3BF82A29918D3C01EB69EF77776236EB876853CD9C599D81E0ADBE1
-F909101A47927116919FD881015CC23E7280DF2AACB0D0D442B337952A691393
-7A7D996477A04A0A7893B22E6DF75C912518C0E80CC57D2F3011F7CA639FCD2B
-5B69DAADF0882629EB56CA6823680B247C5131EA52B097977AE71829EB7D60E0
-9190E3B34BA4022932F24166659795E75AE0E286268D84F7D57F1ECA608EB49D
-04B7BD31A76337C487DD156A131BCD19154ACBB7C36FD5E11FD3DD7D57684E4A
-45861AEEB590967ED45ACC06D360188912A89BF7F01CF4430DC196B32F29414C
-8BD6A961882B3999A3EC9CED31B063AEA557667AF65595B67ECBA01F488FD07F
-4684052C4BAA9D038B4CC8FE1C1381083CB1A2F7DF95A213C46A272C45F7AE94
-47A605265A776BB5B81CA6A87875B3BF33A2E055F54E73FBB3FBC63CA47C64C8
-21D776FB9AD5FBAF9482E4A24A556B1C1F92B3984105C1C466B340DCEAAB9A41
-7869FA344F7AC673AF6D49752B7391260762B8525F43221A86D87FC74EC3F92E
-BF23C1F2B04CC63F9751471E3B399B683318762DA5742988FD122D1263064645
-079F1DC46F7F66039AE0B9D42CC2B387C7C47758426CC1E35A249DB3875A8466
-198155C887D5502FAF403650E6E336CD5366FDA28662B818BF5C5E2BF484E207
-498C3CF05C037BCDC3B68D0FC718D9EDBEE4B27CABFBA52DA116A60EB766AEAF
-3D16F3DBCFA065720704DB80A7045FBBCB219A4F679179B5B7E5851A4CBAF2E5
-20B4FA5B5382EED902E6CCA8EC283E2B39726C5B79AA72B45CFDF9E30EC4D5CE
-7FFF76A90F2A3EBE77E017CF6418C4CA1E6DA141D974360FA597273013ABDDBC
-A340524C822A2DBFC5E9551D79745595105EE1FF49A6A1E33516390A2C59FB71
-E394B13481C5179DFBC6A7E698C0364D93A8830F2BDC3C7B4B603D64BB53BC7C
-67270C93AC504557DFA97050029D6D7B85EDD9719CFF04581004BC908B358FDB
-6DFBEE6183A0F7AFB84040299B04C560ADA8AED59E43C2036F6DA09F3044A781
-DA12A23145719FA0B2C6AB6E10CFE84D8466BBD176EB17B5FEB793A917B3B604
-271F299780A5F33E212CE334756D9768339FE866DA429858CC7A6551B192C80C
-659A3627BB903D74E8ABC3910A662793BF0BA13CCBB5361ED6D1B4AB6AD299D9
-DB7CD8E592D2D3D9615AEE2BAA6E67A46327E29298B0E91DB801832D66788D18
-47CFC4A5C9B8CD41AEA2366E8D7D19E605D0474D6A2D9C1AB44CF5CEDFF9A678
-9B74A83724CB185EAE4A58BDD2ADB9941B41640EEBA42C3E105393639D84152F
-8E26E93EF7D35E028244785683C8A4D59566AB8D2FF2906C0BF7C4856AA9C3B9
-E000677FDEBAABE33B23F13077EA25E1699519624C03916E3CC0136CF3A3A468
-F328D43F7BD1C6DF305206F302936B12F3529421A81D0D5026FEA5B811029790
-42ACE0E4AA1D401D15B283E2959F3E130ADBC3262F73DD1CBC94EF659860A2DC
-1D9ADB113C701867A4E62886C63FC43BEC3461205A37F1307061C62EBE4509A0
-24A95211B890842C00ADACE0B75EEAD4031AEE5EC113B7303AE4C42D0A263021
-8882592E518CB3274E367B937274A5F7FCC9F6E9D36B83784C4E17888FCDA3B1
-CC0F9E41246CB830D282370137AC001D9E4ED0351BBB39DDD7F19A78FEC3CBE3
-B875543006CEA3BF1724314ECC6AF4932DD9B5CD64A91D5A72CC2487A2F4298A
-34A1DF796D1E32DE2A7F12685B33992F92886647B4CACD145FDC35C5C8317DEE
-C9F58DC50E135F65B1A0A1862EAE22F1056EF92A2ABACDAF4A701543F274700F
-4FD59D4033BAC20817F1C97B41466ABDAB3AF22DC3F60A5A5C1096A2ED73E84D
-F5ED5392ACB5FE5027D0C3B1D47249D809D5D7C7FFCB0AD72C6E54438CEB4AFF
-E7F1C42D158C78144B7073B8A1AA4AF5707CAD9E9EE68C45C32B1F2B2C876624
-163DB24823427080D1F81F52BAA3C0BDBA113AA6F24AC2F01E7E70D6F7754BC4
-BD2DE4C46D398DA4C94DA7F8A38AA2EE20A9D124291FB3649DEBB4A5476FC536
-56E85EBACF09E3B129BD41748FD8972F124DBB5821EA6BD7F26EE1DCF086D847
-82D0C7D60583B1424EC98A3B436A9939ACD437CB3B0F5DF18B4BAC9FB1F4AF87
-0854FE355E5C8790F5A5BDD2DDC835BF8FAACC22FBAA6589E843E04C2E8FE52E
-AD35EA2608BBE0D77184EB4B4D211FF2CC58D37E3D7638A57551D4961F9E2264
-A7DDC677F263450D357D482B61D91D2B1EC15F6DE08864A5693707AD46266ED3
-46C1E5C8D14962B82FB881FCDD2C2C20A1AAE200E39FE74E8CAF7E396F1FCBC0
-5A0CA7EC0D2FED67B17DDE349A72923D2692B565D5B752336F4F49370878AD9C
-772386F42C7E2FD66F4B8C9558F9E2C078B7D140A5E6B0D8C48E5F0196CC5D66
-553EE79C3596349568293464FC361AF011F8148B47BEB397A4F8A0552E416F02
-03FD3967E0AD6A928DC1DA73488D2A093E7D587A404F909D24A57CE63F2EE6EE
-C945CFB2297EA4E331F41A6B8F67843B61C9226FC429EA62FDA4F91C98C4D7EA
-D2EC09399998F08AC9C2A3602018CD28B3411218D90A7BD6A310427EE54B19D0
-2FF1A39B7363D31D6BCEE6394174BCF0CAA755B2EFEC05B962B7E28A73BE0BED
-9D33189E82D125D4EB6E5CB370705430B78324A079769FBF7B4DABCF305924AD
-1A8559ECEEAC4D0967AC739420C712B213B9A84C5D930A7265728931CB35C4DB
-1889EE886BBA68383E8926821C7EBD13CA2AAF9BE7C5090F9D301AAFB1001C75
-C52BFFE1B81E7F415C38F560E902653714B853FEB28125DAA168ABF2EE66B6B7
-E4C0AA21E4B936F9F757188899EB4BB6AB3D708429954F706B12D928E264AD64
-1C4AB1A5C4D209D757DA7857B383FE9AC3319A9380603348A700BBEE4849D9A4
-2D7C6D49145FDAA73074B8F568BCE751C0A9023124C71F8ED7D8CEC4FB01E841
-EDEE9C56BAC00DD17E83CDF905D1B8667BF13C3B8DF717D23C6676840A152215
-ED17A14B0DB3602DF9170F979D8098412345BA610888F3FE450387CC46D47FCE
-2241F9180024331FF12D713DFCE680F167E8AEAE710C765FE0F791C065DCE040
-676C53C797AE7F26C52CBACB82AA12DA9A14846EAA73A6F0F98A628CAAE12718
-A9C30F2B1D13A4FF3BAB73CE32593FD459A9ACC4FE7EAC78E893C9A37BCC8363
-D8DAA0049F383F1848F037F0250F5D9A07E0D6271F771AEFEA2FDD6E298DA77D
-41CAC0CBF6871D2D8891B297AF8927D33D6E7A16974B97B7BEE5FE92ACFB9442
-3DBFC1A323C2DECA0AABE3C44C4E5FC67E31AFA32A2E384F9A158C5F5A7DC04C
-C6342B7D88308F4BD0C813A8A8FF6D44E8B6FF5073F11EE1FA41FBBF07CE8E72
-CAAE5FD345A00CD4E0DF5B80A44DA6A11B271CBE994935937BC477AE4862E0E4
-0F55BD2214CA9F7186885EC69811F821109428BB851C01D1FB2F38341408D262
-F5DDC76451A7C107A725B609DC363270EAE8E75CF6BC1877F2B2BA1455EDE408
-159506B7727F9ED61D807CB758C0BC165EBA7C734EE4BA55AC6F42B6BB930FFE
-DD0AA0A34F994AB151BA1815BEDB828AA1BF85DCFF99404FE4898548F2FD6DCA
-E1A338E6446093AEA135A75832AB0D268A3B56C8C20F29341CE6A48D5F5CA445
-91CEBBC1E344CED028FB823437CBADEEDA3B322077A05573D60D7BD016240153
-6C28F065CB849F8CECD24377C69B42B00D01D388363B99330AF05226758AAA2C
-B34BACF2F63EF54FB718B001C5AC90C9BD85DE8CC38398621AAACDA2FCFE3784
-B3257A9DCB63773B8B99076F2D969C0D7AA09478DCA4A6B3F7D8D95CEC5208CE
-ECAD3A540AC0C067733557B5134B7DE5C75D2B5673CC9E3F08DE0B9AE76C829E
-97E3BCE64918E5F1687046D0318EAC32659629DCB7CCA135A2A7B450E14A9A1F
-D89F5C9793A4FE2AD7719037418ACDB24643ECD71D70FEC1D529A87B89847945
-F4BB9E9919386DA70484036A926DC3DE7FED1612C4B89B701EF4409979CA914E
-5FB3ACD50E15AC6B4B22BE79954F45DB6BEC4CF3670414540C7F394BE2CE8F34
-1E8D02282357B6BB6DCC14B6E1CDFCE52FE38BF7FD091F44E3309D88C2CC2014
-3AAFFF868E201F1729C0303F62F5E21EF7581674C46DB63F615A57C4310B5F07
-A591A293340497C59D73365152F4F1ADD62DF144C0B2F4BBA9C04819D74CF5D6
-E5DED166D9065438C89ACFB14744EEFF77FF21A5DC2E60F8FAD10DF69556219D
-3D5039A505D5DA8A35EE75094EA3930417E7F92BBB14C0948D347FAB53BD7077
-3FC6CC7EF5541D2082507130932FA415218BDD959004B5D1D9C6AC7A6D62AFCD
-CEEC5F43688EF251A1D7FD4A9DA3018ED9A63520C0A0E4910C2D5B2F9FF03712
-EF45FC4AC93DDEBE9E1F434EC1D86938253F736F7991FA0E20500961EA080DCD
-D2A9164A8CF2FB7546EBB59DACE8B6BA5F9438A8FE29223341EB1B1592607BE7
-E6E7FB761FB4B198F8D346ADE3B6C7F31192541D688518969AAF7C2A1EB51563
-0A233BFB89F1C2F8736E89A46DF07D64E68CD0F58CE1D698675E4A3F504F5D63
-E58854608EE83814127A760695FF30281D2C4648D5808C8C8548854474CF2F0B
-94E15450CDE2CA5D5CA333BA71163E202F54DB4E6B3AFF1948FF2A5758A9BDB6
-9F004B02C13211A86F6B382A809BB726A22AE41C4E6210B61FDE76D99A5E6890
-BB1C522D0DCEB8916506622083567680F405E687C7FEE05577A8E7C02B30161B
-A775FE0DB6168AD93C19B83AF6E95761BF57EF046642FD3C47CA1EDDFB426533
-5022A78E85A91D86F3B78E463B01CC30807204AEBC0E622B383DD5E2A093188B
-62CBFB1CDC759D4FD7A66CDE922671D6F6F2122F39DB3C4CF73F3E16C1003688
-21838863DFFFB77EED7093A1B22CAFF89443AAA734B788F7F64BEB8B7C6E9579
-0389ACE038CF73D46AE11F9D653820FB3EEA99144CFDD4C6A28B3A86621F664F
-9441664E4B2EAAA897F0FC577344FBEF2AE0AE4DB43C0CF12CE089AA00D6925D
-BC8537F52868FC9EA59DF56FBD7AFD6A4DB12BD17E4B47556DA97DC1931AC87A
-38A1EAD3D3AD8B462C1A76F830D7EB0621CC8B4FE740AC409EACC48BB7324B92
-1F5B2093F0F6575E4A903E2EE134E77874F70DA87C073FEE5191C118EF6E75CE
-42E143037A40F8D5B5C92C55B497C134B61BFCE61D8E7AA93E66F74F0BC2F725
-A8BFD5795BC47B0B46F526E772917BE1FD164181B5731E27CB13D8DFAD0E8D9E
-BE4436C6921E7AC96953F20CCEA3C2E6450E51FB088E16DA8DF471ED8AE84F48
-71433349B7EB58332DE9CB7126906B6FCC08CF2047D39986D4DE9BC1B2F2FDBE
-163C73C9DF62D1335EFC64F38D42E2E4EE9A422718174189082A4E83B5C5D04D
-E34ED308A2D7F8907571A40A0BF77B4990D7C1BF1CC0474C0A41876F2CA0633B
-42D5A037E87BB056483D0E88298260265AB723B24DDF8E4220C8E7F3E681B883
-E94EEC6B2E77BF249CA69E12AEE9E03569D6E99D63FEAD2ADA9135B62793AFD2
-B7CCB2CF2D1144BA7FB613F00C6DB9736720CE1BBBC49AF359FD56F9E98253FC
-57E2CD93BBDAFDA1FFBF9A33E427B37B333BC48844B9F7A757398D146133B416
-58DA341B54FF74D097DFB950D0C850E11D85522BF8D10BBA53A99117CC4A4B72
-A1636FEBD444F0D61397039ABDB39CC4D969910F46AD2EFB671C05C66B0C6FE5
-5FE8FACDACF7AD619A44B49800B287170D086BCAD5597BF592521B51603CF4BA
-A286F141942C67471B47D67FCC581CE2F96D3C8152D4A86F9BA90EE6D5F06730
-CBCAFFB91FD653675DF525C3948EEA1F09CB6CD084D7D34F00826975368373A0
-A05CBF4F7425C9F57F0EB5F1BBEBFEC259BCA347D47BC00F90EC77A06C0787F5
-6FE2264D2E37615E28C74B5B1B96B950243C32CCFCA6925F42E921819C57D387
-819BEAF8250E117B9475D4A8FAC24ACC0EC44CD4C9597F0F852781C9C1817C14
-F38F8280AC2415268B3BFFABE7AF59B50DC33F7ADB38308F67F50EA4A74B81D2
-5FC9C14894963F82D10525E0926DFCBFBE775B85DAB7A4BF4D13E422643109AA
-A93E559CBAD1DCFB01C24037672B2AA2E06433528915C03F222C8523E06A7BB5
-90049A82D9E930E77DD4BCA67A765B24E7274C45331E07D9AB8544C7112327F1
-538C7E19BB37C05C42A2AF30EE19D10E4137B75594EE6D6CDB9431B3AAA6950B
-99CE785EDE29C89F94F3C0A395DC4CE31D058732DE45B6FC3D15E12E474AAF6D
-D43D56FD939A8719B432D4ABC752E1201A8C1A66866465AD9DFD2D9B3AA029F7
-9B95EF7B4459F360F4F515D11149942717CE8137F0DCB4ED01F74E474FB91718
-4AFE6342F4D4597ACBADCB5E40EA16B86D4DADFDB970149C0177A943038CAA99
-D07C82504696F1A87046160F9C0AC7DC0F3C8496CD63B31E56F51BEF07C6E7E4
-C73FD39EE686C0B833315629060DFA6DEA06DC6BE6958C3F9BD1F007F64525BF
-7F1F1B1D17C682BCAF0B581F0B986BD12A8C843DA6CFB65E901BA8BCBFA7CE64
-9F1E86EC50417744825150D56F2FF41E8B34D07B7EA3B19CDF906BF67DFAF212
-73EAAAE9015C8DFFC0C6EB7934DF360ADAB6BF70FF5B18F2A571B9E42A113F11
-38EA6A07CE358D0B2F4EC4FA45D3C441CF21D465CE936FAA1033E7AA407DBBDC
-4A44306ACB55017E136D70DA322A115FAAE9FF0A07A3D588E48B1A571D2585BC
-C7AA26DF65D9416A3C5DE75324CBFE52A76F3B74507DE787C9E9DF41FEA9A02D
-7DD35547E56BD3FF30B12668BD2804F93CA6199B4AFBEC7EA51EFC9EE14AFDE1
-91C69B76727373D40C5D66129896314959DC47D672ED6B3F977E671E020BF01F
-1A838631CA10118F13F91CF616BA7EBAE0C06EA8AEE25C73D4CCB7203FCFB0C8
-6884A1E23FE5ADFBFB0FFF19C532C2571062CBA81D3570761E3E00BE5556CA1B
-25F2292F689E5B950288B794BAE1E15FB3284AA76731772CCD6C6085C394C5B0
-3ACF82A852A32989A638054C2E75B0E6893A880241498D3627B55F3E58761B83
-34208FA0A34738A75A67E5DEAA16597E0264A75BF6E05CE3C3B8B1B5A9BAC508
-B282B2B77CA0F5EDC38EF2D3DA6DF7646AF3C9ACB62DD0F59F50D0EDC193D847
-F8A5D40956C169468F5FC14E3D527AB047E8E5A223A8BA05270700AE1A07C3A4
-ACA5ABA29958F3CB2D1CAA9B5A0643012681D0A32048458BFBF2E3BE88C326FE
-5F6AD9C996F3C82F186B5D77B4E31498CAC8EA4F6B3AA6BF524B38FBC53A2B04
-3F27EEB7854861B3EFD8C5DF19D2DE5D9C44540AD64AC3EFE729F4BE0CD144A2
-8A1DA61C8CC27BB6B861DDBB25782E44A33EC1D507D7127B51B17C7BB260937B
-C4267B4CCEDF56B1FF949DAE7C5E5C3F061B6CE47BC4BEDAD0A78A952A33F339
-ED8654918143FE913EA90B9ADCB9B5C9C140DDE7E2E692B19A49AC15E7ABE60D
-29453E54AEA9381B981EFD66CD957936D6C7F54CBD6306B82D13B8A716DABB77
-465EC55DFBF33839D5F37B47B634CA94489BF050000ACDEE4019C668C6EDE0EB
-42985CA668123F764789075C18934790B1D1D9191E72D748F2E30E0AAAE07451
-E4D294C0106CFFBED91600DA5FFFFA3F6DA6F7C5CF3502FBB2DC37ABF30F04FD
-6283BEC78FC7865D1B428F0698672E431D2A20E9FE24B1833C0EB0E82A34A1D9
-23C4791E6F8C17911A579DE17A289D904ED8AA16C8A365481D8235613B9C71A4
-26679333F179886DF86BEA8F3FB599294CA1A9859BA59E42B061255C93ECD97C
-AC0E4A89EEB16A25A5FF625713F8A5792A2E6A0F537D3436F603D7F464B61470
-DA712B94735254FC69C4F4E0A66A36170EB151353CBCC3E55D392D78DFA3FFCA
-EFF08200F1B222D9D9C4BF8329DEBB42D651E826BEB449BF8DEDEF0F9CDA4105
-8406F1E26BB06F60B7B00E92CAD3BF4EF06B9553688B099106932B18F7239DAA
-27B747808CF11D151C28C9DA11678CC1E140DA40049190B194851F753CB82993
-349CE659FA85B8AB585EB7FF322499C5940C026FE8DEA5EBC9DE866B03C98F79
-D36AF4901182DA9E9995FE8400AF094906D52D3CFE28088B14675F2A6F846CE6
-5D5869A70EBA2AAD1D0C538E0EF7779C801F866EB96C7B5E19C67354BD364263
-B67D82983106C682E0D9A3BB0D5E60EDD6452393FF2724739D426295CD40AEED
-882153073D356E2AB1F543E20F2AC2BEDDBACA73BDB5E8610E58BE6D704E5274
-D5C252A0669C56261555D0642C0937EE08329B8BBA2F807284B8777E1C2D73F2
-31E897BAD03DF7587757BE939038E75B25137471552DE0B7B3842760F441FCAB
-0557EE93F87FC7079457AC62402B55E51ECE8D50F94566B1671675F0215C37DD
-31FFFAE9B27B48798FFBF14D18A2C6F1306522CD8E8C0D8CFC228B3F1C17A827
-1E5273E3B5B20C2792275DDD7C17053AE8DB61B679ED2780740E947D5DC47B27
-D35F9B5DE0166539FAE75DA2179F3F9EEB39ED0452E49A35A1E1083683BFAFFD
-9A066C4CEA4DE699EDF570C9208892E0ABA87784EFB455238BE1A6A376F64252
-82EA5B523A8B2E7812E3253C2B6E1CC4681656561179A4C95B48E97CA5F9A39C
-D255209D9F7D80DF55AA3FB99908B46B101D509F3BD513568A4949920DBDCC6C
-70ECD3BA39C44423D02B4E5B13E9F434545979F7ECABE6A6FBD131E169C914A4
-8063C6C9748D32E71D0A25FB40C764ED26450EF49735E12DE893F302FA491B29
-D5154B441D5C61AA4AED88F06C63D52409DE17D7D97C572F7579296D297B9942
-880FFF44810390ACD46FD1E090A6412F7BF21DA7CD3B166A845890CD887F607A
-1F04BCC7F4BC3107BCAECD61825A959B61E62795CF4E458EC63F1F2235C64D60
-C62FE46E4A913685CEB2DD7B25494832542059ED9DD0849029BC1272582D630E
-4310F978FE6569A4B9B97A7BB4BD602D5D32E79727ACF46429CFF0F7BB8EB39C
-DE55DB6246DD9DAB7863DBA6DD21EF340E19727D5AFE9026C284326BA0D4D9CA
-E015056824B392BE8B930D04BA60B58CF4A683FA14850B6B24787958D1A7A42C
-7C33C1362DF20AF31CB88F0F11BEA022C609D9575F71EE270440480E0AEF6207
-733236DBE9454F088CD4A01F63B6B2C6270DD08A13108ADA783F2E7067B7DE4C
-C34AE192B05F68B0022F5F30583D9D68754782186E5B8FF76ABC451DC9EEA08C
-52C12642165408AEB813C00DDF6C27F4053435F2CCD8CAEE50704DBA37A4AE42
-9B7960169B0C865E92D270A714449FDF13D8835FC1D4C03D7FB376ABF7201BE8
-A593576476D8AB905076237BCE2630179D158F04568CE4C85734FD0A1C8E3D90
-272F3A65B556C7C803FAE8A0C82756B99C35C06673210766A8042682C873F811
-CCDBC015005336EC438C3476B4AE13715DDF6F7034D032D29F2383E005F6FB4E
-19AFD4A02BB7A79917D54519D37BE66ABBC156464898583522A4D63FA6DEF194
-BD4B90C83470330F8B5233C24E80CB64C13C0CFFEE81E3087A4BEB84FC8B152F
-44A9FE7D4393C652799B12A2C0FC0842861B1F1B656E802CF0C40DBE95350BA6
-32341D0503CC7CC3348953723981ACFAD95E18348CBAE09B630DE4247F3F7A7D
-E4A0095D461854E4CB12840D355912AAC33A5A04C833E20005C2A71509AF51EF
-697773C2D5C8F958893B26BC64215E4EBB7350166482F29539AF54D860C68F3D
-1C60ADEA814E869E974E1B78114B091134589C089A2CBF12ECF1E31C4122155E
-A90587849A11C46DAB620284D66BBEE187B61413740176EA8F914D6923AA0A0D
-3C3383D95EC1FE1587DDFEF289B4BBA9EE208408BACBF5FA0A53BFFD88BC0529
-10631201650A258809DCBD5D136E038110AE4B818783716501CC5DDCF42ADC23
-86382A06F7FD13F6E99935F9CFA67D49BD51A2D28E1C605DEDBEFD24BA337407
-00029CDD5E8808F6EC2FE5BAF3BD3995414E9D390092ABDC355B9CD4E80A8DE0
-F104658871D0CC6A7F06CD149A0FB36F4C1F484D5A43AB44394934F65C216EB6
-C33002BF7D0283E798813065C84BB8EBF6E19A0855F0E146A7ED9B4B11C9B89E
-48465EBDA7CAB38EA818991CA0B07182AEA5438ACC95823656CE47CF932851EA
-3B0A9A2DBCD3FBD926D904749F62E27C4725410E297D9CB2CE16ED4B32AA41B6
-888B1480C538548FB6EA68D3E8221626AE219EE5E998B310D8820AC61CB9D9AE
-D5C1AEC7C3CDC305A5E88E028AD21C6DEAF272ACB93916AFB42081E9C46F0C2D
-98081D7D0CCFDF2A3062F218582CF432DD75BE9622B1DADB99B5801F709E2267
-BD5E0E1511912DA7D888FDC49C2137F65D5C1A0AE5E10961CC392307890FFA8C
-3CC9CE5B898812BB6F0AA59557E352735A2B11D6CA98017C7C118D1D460585E9
-C6A2C132A522F0632B5B66CCDD2572EE7378ABD5EEC211CF82EF19D151D290E5
-0A0B3328C699746960A0A7BBF540E6F6CD9544581D879186CA576E3CC0164930
-264C26785042123F5784D2CAE377233A1387A3B4F8D868B40171EAFE7BEA628E
-7ACC740937076C878F76BB8EDF36ABE98111D319AFF427713EF3CB8F16464228
-C083113FCEACDFAB97AA3E193E8FA750FA5024B674F63CFC58073BA959137339
-4B6958AD894CD17C4DAB82CCCCF154343270CEE203E13322D3808321FC02051F
-90CB293FC80FE9BCB853738AAD70563E124CB39F9935AF590ACF3F5FA8560169
-2572D275F36192A5ECE86B988D6133B0A1745D6D386937989850DAE1E62D09CE
-7D24EE2066814DB161F6103247EC2E8E065940F82E1E984942184E68E556A120
-23F52C75017514BD176AD60F29DB768E9F1B3DBD72C89E895432C39D2EDEB089
-3692507DCD57FCEAB7031D391E5CEC454D5266D140D7EE0CD151F9CB042E044F
-FC95CA7AC869B4B04DCE1AE9D5202C36E343B1A2AD786F5B7D0F1AD1E42C4C1B
-6E6BDBF86F022D90840FAFD81604C02689B3550AC41AE36435B29CB823D255E2
-EE9BC538502D18ECA40E1F340D0E9BF70C58E9C775D86DBB6BAE3D3EA1BCF920
-6ACACBD4D2E960723EA3376AB2B077010C1E685F759A56E9B0A84BBDBBD9A0D0
-FB4B0806861C272DE667F219D8645EE294FC321D8E373021BA63C1003CE2D689
-D5855861A575696ED7FD601D114E602735DEF72049400119E933DE8A1198DD94
-8457A24FBD19FF5D21D169FD99B6F6F6A2824F8D1653A13D5BBCB9B11E36B8F4
-2F9DAB2CAA39AA9453279F8D222EC4AC8114CAF0F7F58736D457BC01DD915ACF
-7D9B4AD3D90F93256C4C9E41CC15A43B71E26A8DAB324639FCCD3E082B580CC7
-B7F2A695D029161D2F3A2A8963EC8BDC0E6D256BA06F08B6D48682CC9ED169B3
-58B063D8D7265C15B59C3DC91EB307F33FFF73C3101AF250F3CCA40A161FB3A9
-B698F261E9F7299F2418D1DCAA1400F7BD3C74AB55316F22593595649F3E9C26
-6F903C6C0B74D96CB7F92CD33D610F0AFDE14516105B49F1A43BFA558BBEF71C
-2FE095E954125172B6CFE4C6390F701738232605A38671424723A68F13F2B94E
-2FF970C51633660D9F5B00FE64046C85722B40515F34E44F32D18ADA4C85315C
-2461D81D8F34BA7B13227E865B7C24236A16D9C6E1F428998C22A43D3D0332BC
-55AF05204EA352710B199C0F1F710C96C72370CA7203A2882310A629995B5D78
-D57D695B654A718C5268E9751C7F848CBCF87776ED10DEEEAA32F50769CF5BF6
-58455F8CB9C793290D7F8A38320743F0E87CF2BAE8A07BC2DADAA9F61ED6EF01
-6E24883E78AFD03E23D3A9E77C62147447BB772B4C80C1022727A9C863CB8A7D
-5C54C057BE3E148FDF79659CAA77229C438A163D366F5CA9F857ADF98F9377DB
-8CA7CE8F361E5A553B4541763D9A6102467A059DFE0004C350EBA6C8FAAD15A9
-3C68C30AD52BC1496C4C214B5ED4E537C3B25DF46166E1B22B0185FBA3F9507E
-7ED64C77517B077164E6661D73E441ABBE1BA0F68D8B53BC8337879EB8C08F47
-A579D32D0EDCCD91CF143F05CDE56B87E1F2868D001648513BE0FF3700732AB6
-CEC0CA78BE25810FE125B5542E407A984E758EBF4A3FCECEA2434815F64425D8
-C8D0862CD06D88B613434DA7CADDD3D6D4F1739E744B4DBB99C08CAD6112F0E5
-4FDFAC2B8D0D75A7A7AA5CFBE2C3966284E9D33CA71043357CB951808B3453B3
-B140807FBABE8F6B89A99B329D84E21F14F5D0022C0AD05D24B00CC2DD560C03
-AFC9AE7BF337FCEA66C41BC6A6D3768172C30F45DE176C1B4EA57828702857ED
-DDC1953FD25CC900941214ACC73A8878EFE63AE700ABEB0AAF8113675B12D8EF
-E370EBC067F82917498DD9A5C6B080AC066FB0B209C52448CD68713AB98D78A4
-7ED37127959969CE4C18D686B8FC5312BCC6B5F4B375DE186E927F42AEB377F4
-E96381BF6906E4A24328DA33A3C33F00C7034C53B10CEC70058D312D3EBDF1B7
-C81E0972E77259376669C71141162CDE55F5EF7E4A8A95A16AEBF41D00740055
-FA8CADB6CCAF1BF0850C4A11F905AD3287BB90D66E2878C58F00A71DFE1334B3
-3FEF4A33513070FB9AF215BD26E039563DF3BFD597B8723545C52570E863DA43
-8303766D7B0CC6EC75676C77516470F9D83908C0F91AB5DDF2041BCC68B1D3F1
-652153EE95DB246F151F63D85410B6B5FA265937B373A085AE2C42542287C17E
-7FEEC7246F98BF641ABA0006F8658956222A9E5CF6605A3A93E5C0C97F43E679
-321F598CB94963C49AE48BA497D99B304D53F40D605D17DC12D966837825B070
-6AF66368D569B2BA9FD4066A155970E0A9BFD8F9E4645A41EE98391C5A2819A4
-CA09ACF8A056B5F65A4EC08DB490EC4BCCABF6D5ED8DDADD250A704D8D0B70F5
-D54C83A4E971792EB7A807172475F195836A9184EAB13020A8924232C95C8C54
-5852CACDC34481E182F98C3A3102EB6979B8D81A2FDA248D74E76B3C8900D6EE
-9EB9AB23DCE457ABB1829C514F5AFBB43435FB2B4E83E6FB0CF79F24E93591FF
-59AFC759E491A9B569A1B1EE3D61CA858357BE7215484F4504C6098EB705BA7B
-A38C7B683FBF36EBD39987C5447C4F5074893D934C59A056D72AE4F0A363BA09
-EAC3C4AB6EECF15BAD98A0201CDB4F836206F64FE1B84E590D6D4119D2F7B548
-36A2B3EDED5A8BBCD95509EAD11F6F43FEC653F131CB4AD546A6B7096353B016
-FAE4C3C0C8AFE9E541291104425A1DBBF7091AACF5F539F29CF261F27DB2F2E9
-96B170EBD139D7D9BD009D6DC3EED26EFD5F0FD4F46F590B3D218F0F54F324A5
-C4FA31B4DA7340302287C8A3F2417F02C6324F2EF4A7BA2612F343EF11A4B4D8
-C3D6CF3DBCD272010AC01B525420CADFFBF2341F22B018515D954AA24E026A00
-AB3B5045E73440ACD6A2957BC5835009A310C7C85DA385C498D5D847469563D4
-146E97EC0FE9F8B5244B6F9C83B6E1DAFD109EB7FB1AA5AAA3A3ABCBF4B4FD5C
-07B5524EA0501EAEC5D280688D6FBF1441317C2EB2DF818120427B4FB62A6AB2
-68FB208350BE986F805CC893E6C3F0B2936152B1E7E19001913C0A9F821C345D
-6873A92FDF009CF16B72FAB99632B783DD3EE5317C30D3363C10569FED1519C6
-78F6A2343B3152C4303321F6E2158C040C7877C7514F30A15F052D3C0EB1794D
-17A5BA81039F0B0F3CB0093CF6FA0D7389DB279018806C1957154952901F41D5
-C9786A7C0EE76E57189A58925CC11B9F79C17687198674B2CDBD77AF4E0C528F
-21E588FBDAE805AB5ADE20E37242C55D6ECB9574C82A6044BBF8C649A39C5512
-D500006733919C4FDDCB5BF3F586E6C0DADDE28524039187CD1551FC7E193DD8
-B912AC9D6DAE8B1FC859C46D871FC08408E2ADAEF7A361A47DA2DC64DAE45B96
-AB720474BFE8ECB8A524FCEBA21ED5A28A01F90F6D28A7D40A4F1A9C2A7A9820
-12FE8B0E532D637F1FD9E939F124A8322AB92792AC25B2C6D5964F54FBC0E882
-9B4BBDEBB7895CCC4DE40159121E2BBEECBEFC1E83E2C386654997A9E9947B7D
-38EE4C03C5145167E554DA0A7EB0FC8F4B80D822C321D7574D05A1289494271A
-501FDE3325B7C87E1D24C34E08B799A073AC8361C9D49A02B564126065A7D550
-07E36365337A08E65AC7130BA92D6C9B97B12300F2C8886F55EE9C434F7768BE
-5B9BD13D87F2063E39747F10C2CDF8A60B9196FCAAE79FEFCA552919AE988A2B
-B16705FD84EFB22DC538ADECFCCBBE8E1F58BED0588678CE1A0005FB3F5BCB82
-E5519E9D23ED670D2D6BDE06E36D0EEEE7D78F99BFE25E1A89145B138612C8A4
-90D0B41453AFA81C62DDF3B21CAFE3C9807275BA3C5A25E74FFBD61A092958FB
-CB84C171EBA5F91D31123B578780AED7E074BCAE8DEB9C10900F2261F198ACAD
-72621D416CA2768A0851FC0F5483895FC84FD629F1C32212528C966DA662FE7B
-8DE8D4B261723F8853A5BAF63276EA472698079F7C8E09908C614A0B8BC680F5
-9EBD5DEB3866EE4DE76926BC31DCD160224A056BB6EB98843D2AA129A3B35999
-3A31A60727B74218771BC7594DD1494E8B385F037F1CEEF0E1F413507E89F426
-A88D4D599B8B7D40E7C90A2CE00EC61E35AE94FD68E165AA4B30F3163DA0B493
-18FCC396151A860D96AF51C1BCEBBCD15C711BFB5A33692D7FB570F044386748
-6BF849598D52C58F4E963263CE9A9F64E8EFABAD9FE77B69C1F62A418E7DC918
-87470BE747148D5D3B5C718F9F49E2F398E7A2CDC59216AAB2F16FDFBA741F9A
-9E0FDD43CF376DDEDC8FE833FE4CB1D5E27B7CF160F2F22A05A117F348B632CE
-B9C299669607C6A08C86187B78A6AC4A70C5D6A204153B346D2AF6E4DF9175F2
-31607B29E99B5641BF3A818AE6173008066844469A0837A35C227DA9863D9ADE
-DD2314224B8C3296B93D698D0B5F980EF4E1B62C30EC9760CBDBFC0277A242B7
-CE7989E0BA910E13734EDA04992F06A0A77E8B20C87EF6AC80A2AB7C7FEA5768
-46D2BAD6C8CF1D70B9CAD91EE7FB2F88562D6280C12A1B4D32FDA0A422E248CF
-220ADA5A2AB5597B312386A58F8A21C3ADCE6D5FEE3F9D2A4363835B07527BE5
-BABF7FD63B05217FFC7ADCF2EC311F6B91AB091C6C963255B4B8453897C5D8E4
-B67CEA88C09C23A3FEFCA3AECE9B7ECF02DF65A99750A337D1FC2F13D198247A
-D892F0D9A6A06265820AEFABB3F0729AC4AF8062B916DD3ADB87121EB799965E
-A07438A72CED4E5320E6706DC2CE33BA6085DF0F9C788A176571DA3501A15929
-C2214FFA20A0470B9CE8952CA671C1B717A57B48CC839F5DB4A6D66248D182FE
-C6D0C89A8CBE513E0AA41595376F70DC4EEA7ECA38B8E44EF6BAD64F6C15103F
-A7692126DF2BB08AA38C4B90DD6C39B0B462A4B37729CC59B85105D5C6309749
-F1C93F8B2EF214F2CBB58922F050A80C2EF0F7A0D332B5F5D0209D7EB3779828
-F94760FC65E0F1547CCEC5159B7F751637F8A73FFF9860547CDC94040F432FF3
-0BA714B6665EE9F20A8A56C3D3E6225C3CF95D24079E41797913B7BC1869D27E
-32212E244C9E9184CF56CD15A8F1EA694C92FC45997426F19201EE37CBC2B24A
-A8015D92E29308FFDF9901CFD5061DE67D85AB5E9E5752356F4C98AB864AF589
-389E6B85C439670B28609810859B5EADD6173159903FC65125EE9F444ADD967A
-CCB73B5C4E153C81110C5578C552D914E05DD3A18395087CB147B1985AABB2A5
-A2D97BD3D050EC2729E4B2E05F5204C06E266F552ECBC4472B0710D7A431C3E1
-0B7F89FBB561D42487527024D0F9AAAB4CC4233DA4900FABA883A595CD445101
-45B5F4088B21B546BCD6C0D6B757BD8114A7AFBDDEDCF923016671015D3DE3D3
-3759EE001C9828684374E20D6EECA756DE290F6A020E09D8C411353231FBD7AC
-E02EC25A5B7AB5C681FB95A03D79AA01CD91B0F58CD3E3C723BD40ABD4B9459C
-4AADA21BC33C4F5161874616818BE67923E3FD3D65BD18D4F90691F491B4EF3C
-34DBBD11D03D396A086FE67F18928C5409FC0298D21AAB0779CFA7440FD3A083
-7C3414740EF7654EEAEF51253FEAEBCD7C0D5958E1EE340A298902E4B23E5BA0
-AB47D6B8A41DCE006A4E3671840A4C077E9E948AC9C1FF7AE26D09575727C2FC
-8A2EC23A7736665DC4AE2BB65B475640BE71AC6D66BA0971128E7840654E715B
-EA8C8277C1BC221590A283EE764584DA9AEF65CBB1E52CC41736378F1E294C44
-0701F1977AD8F5F8F2D060DEB4FA32D9D9FC53408522F74640D3444BABB39209
-68C1873D6E0C0E3E10483D67CF70570F55FF4A111F0F4EB54557AAA79115E31D
-8D682671241914FC07D431201AD76319A849D53640C5E517AF616A157A056CF0
-ECBBA141AED25FF648829604626D52BE98AA9B29EF2E2382ADCF9704D0B2216E
-D7408C359B159E84389B5454AD8E10E4C62C592E052590DFEBE546B02E2C100B
-599FFA2942872097FB093540BF7786E7D45A8B5EEAD6D1C1118FEED2635012CA
-178A40DF6F626F6596CC773954472F5D4CBC310CCC041E384304ABD270BA8ECB
-D04051004C71FEB557C434CF3773FA9750F5C2757B7F1CD17DEE48B1437B59BC
-30E690522C3045943D45EA6E51A4EBF8FCC557261689C562BF8705780986D2FA
-C866A3FC22F941DAD2820912C97510B1CBB1BA36839EEF82DCF7368E382A4EFA
-0ADD7FE767994941E9A5D7CC44570DAE3CE7A785D65AE2784B079BAA5DF1D7ED
-C870EB560B792467C72C874601061E0FB3BF003101EAF8BCF7BF01F6DC3A71BE
-32D391649160BE738A739FC07BE94A0241BB41CBE04A5F794C37E2F5C258CA81
-9126D73B4471411D4251283EC936EBE3F8C28EC36BA0E38FD4136F779635E95D
-8D5E5C4E14C680D855DDBB8C1F90FF30BDC971919C7E6A93074A36D88561114E
-6C999B1CBED051B7675B6264E27EC4A015CDE54B0A986250A21271BFF242B675
-9AD36175B01E120D43F8A60FEB9DAED5A70BB4FA975450097B966F1C95F2BA44
-3071E1057B6996F53199879DF834EC867B161334FD281CCF75CA1480F04DDC4F
-511E6EA992114990629034D590C97A6409B520A5E78BF118E11B2BB74F1374FD
-F3415AF23290A4FC3DF6683F1D5663B17260850FB1E307D670CD527E53BB2CB4
-40A4452BEE0F4BE7C62B0A7074A5303B534F3BBAEF96C818A3BCCC30B082B502
-55B5A82FC5E0C6EE660EF38167D9AFD853D48500839B16E1FEE13BB232D55040
-0805F63323C6D228E192B6DDBFC0A54C19C3059E16EA511F33278AE666C403B3
-BBEC3B9F435A9752984B43DC4DC6C5AED25A3D2E73B10B01BA097BCFD167D4EC
-937DEAF6D992D924FC03B53A70EDE75494FC0EC27A34EF8B637357BFE6081EC4
-9731750F93B4AC3D1B3B6FAE7AE7D71DE3F2C0CF4D734CD43DA41A24DA7E7C46
-A1E76C9C1005C0313797A2C620DB3EA13E924BC71B2916C308533834030CEBE2
-E2CAF5AFBC7FC6D6F0D12FFB290A461F7D262A1F620AAFF509F05705D48FCC67
-B143ECD4F2B0D61AA00A69B700209F2DE4988323112836FC1A75409516F86D16
-3D36C7B1E7C4995E19F0370586B4C6242C64E9604D541B1DBC252F782D4F5BEE
-A81FBFF9D7A49307E2265AAC20501FDE30BA6E9C949D5095DAF00ADAF7BD67A3
-77BEE10C62F19F9CC3B0763A9B1A62EBF43FAB15425E7D7AD7E29D9B40FCA346
-096549B43EF7BAAD35FA663928050E3E82551D502403105F7881257039A8D67F
-1B5934CB7FF76D879DC26D6D9F8DB1412E04A18CCC4E30600EEEF35557E73FF0
-B9583317CE899891CC608D3E5332E0CF05C754FDB2256BC946EE256607A1550C
-75907D32C995B1B54A243617AE98E2BA9C042B7ACFB4919970505E7482653F4F
-F780ACE9308C9BEA60C891C5FF175E108C45301C588D4636C09AF8D6AF016450
-F66E262673314125FD1459282BA9A0EC01A7305A8ACFB6FCC254BE58DF6CD19B
-98483D77048A3DE933F94DB60CB3D89A7404939FCCF918464032EC47402AB1C0
-DB66E1F48AADE6A3DA6D77D6124D75B84C5CF556AAAB07FCC2DB87262E5454C6
-4814F1933591DD4C29841719D334BB11281B94E5D44D234212C3A7A42C2FF04A
-9766AD45A1B0498D0DE841D0DCD7C02428806F6F158B7C69B92743892FC693AE
-4A147EE4E79D6F47017DB95262BBC9787D330D3A4A8A85EAFB909E197177EC4E
-F2DF74F543EB7D97B5EB6534D7BF16D16560908D8408777D96D88741604B2697
-67E91C3041645C0843815BB87E0C6CF3BE2F8244A24017E6C2114EF0F51BFA97
-15353712C0F388552A853B285DFDE41F352F5ACF474B8D86491C2F2977FDDB43
-1F00F9C05C87ACF8D9F9B56C3617FEA2E7D8D9195C2C553A6863C734145D156E
-FCC1D17572AAAEB4B0BE5CE51D10BD4273020DFF43E0F1FD270BFEEC8B2BDC3A
-F16B43FBDFADB690685A6891B497412EDC358CED9589836AB173BD20E984CCF3
-59759CBCAE3825BE4A428BEF168DD88717837503804BDECF675BDB8174DA3EAF
-EF5ABC8BAE00FDCA6F1AFEA1C03C14902D0FD9BD67EEB2F344A374688117858C
-DFD1AB9A50E7F4BE806C5C5BAE3F07B8A7F3D4F54A29187BC6C38520895A823C
-4B5B184FBA09CAA547CD661F6B4BF98E68A630D403D214374C554737AD7D5994
-81149DB2480176D618EF15E0517D56BA02FC995E85F2DBBCBD046F723D52903F
-14B617472E7305E9F6C223D78A2F477C9D065181AA86FE051F70F7B52A3D82F7
-ECF18D48DA8C17870E8B7E543470AC7BE549759A1B27F31AB30C68ACE22BC9AC
-E147F8C182255E7262EAC0D1DD1B8FA888D0D5CE9E2780C0280C519AD761AEB9
-C5C3FE40DBC65147F680F9D2F6B9AF3BFB5D075E91CF3A092249EA71774FBDFA
-FC479A7148B477BE528C3667F0C3CD9C1CB9ADDF4F4AC8F93E1FDAAF3FE1793A
-24F95BD0EFFDCD59298BA7BD8DD48A718C660E195C765E450380F771183B302F
-F5F27514863F9FC48CBC94306556B6DAF16D54F9CEA9C45A8D28AC6CE2CF954B
-771BD117CB67E8F93D933BD0693AC61D82BA1381D51AC427425F8791B779AEC6
-20AA9905734C7688F1B1EAB3F1F713B14883C48EBA0E91A64C7EDC850C1A6D7D
-186F405C48125A77377DE45AE05B6BB2FC42849EACF6F6F9C003EA93D00B89DA
-79E540A2B9BD52113D41618D7483068F923B847718FD6C516000B5B51769787C
-8DF0B33977F61AB477861AB8D493ACCFF30D4F39511B0D9BFDE188FBDAE805AB
-5ADE2C628E6E047CCE9EC352CB63964DC90905AF18DC3C7874C337AD2184267B
-DF974A6237B97451A0C77410EFBB3A8A3D55643CA08A8EA2E0AC5F0A9375C461
-E4B343F80CEC40568C521447BDCE1A2E5D45408B47E5058D328C8BC323DAAE9B
-274E797685343E37583F2F631BB07A8B954A5124FB9B90EAA7E22DEE4EA616F0
-C65C57864A3AE70F4E7C09328B845F53AAB943138E005B560EAA306EF67AACDB
-122F74773D084FC0FE926AD1FC0C3EBC9BA82904EC2D6596EA65F4B3E4B5BEEF
-74C3CE3CD45EAC63D7202E2FB9EE03AE4DF5B30E0C78AA18F38EAC73045DF537
-03D558AFD6CF63271F3AE844614482BAC4A34CECBB873F13888C35B29652E763
-30087613B8C3CF47008FF0C2B4DCE7B4FB86D0B968AC4E98882EAB48F41F7197
-9AD42A9C46648EE7F0F270C203E125C92CD0FAF9ADCFA05AEB08A69DCCB712CE
-75D6B6BE60839492D18BA28DA2251A5E5D3D9504100501B32AB001F5D4AA2991
-ED06C8F063F93B888D504C5596CD273307730460EB46BC5FAC040123AE2837CF
-59E9BA4C2B1E83412CE3F9CB5E2FC7DB0D15607276D93B3738C549619B17C0D8
-357FD5094A703B74DB8D61525C3FC1DCCAD810F5E5278897DEFAD47FE30350D0
-C9D3D830D5447A8E52AD2DAEFFD2279EE01FC95F4C38EF18A6EE079727FF62F8
-7F4D2BE5B80CB0B14DF3281A312EEEF077584D7FD2F0C06B6047934D745F3396
-AA7ED80DD3B1E3D1FA27D68C68F1317D30FB14C6D9D5F31EEC05578C08949A0A
-866D434E4C62087DC082C036BEC3F9DAD2A26BF89687D537B58A9001CF3324A7
-75022AD2F66C9F4200A5EDE0314190F6638E8F7703B25C0912681695CEF8AE5C
-E0A8D860526C6AAD0B0C3CA9CEABA721C69D93D5240F186B849BF50843DC098D
-9F57A70E3B2F0961B304D771FFBDBE2B5B737FFCE21DB8EAC51594138F63A104
-9994DB21D186FC4C317A14FE9FE9FDA16B9B9B2F94E1E8A9DB232DF8B23C3704
-53164F61CCC22789D30C7145B6FAEC3D0501AF29B4FFE749A091BA859EE5CAE9
-9A404B19E949311CE275101FC885408CDC12C46AD88F530DEB6FC3DBC7929613
-C5FDB899B93807527A6CD8842B09E701E3C2BDCB75945C4B2E473BC4DE2C9B07
-5DBF4243D35E70B03A26DCD0EF55282E7993032441E8B6EBC5EA8923931B48AF
-3A9618E3E6759C2CF32332BE904D74B41A46B53EC579A8CD490E2D94BBE4131A
-89BDA47D0809830EAAA4C6BD50D146AC79909979E5716F768D1D95919C6AC4C1
-A63AF5CFE0C31F4E8CA5BE704EB74876DD3E8BCA2CC14DFF2C6D3F15A5A66564
-2416789B275E6FDC2E93EBAB3FE9448FB38AF02F3D37D1C9105B03A49DB0A86D
-275CD3CFF32C1250335100991700B0973F3D5E54C39D07D260C2FF3E054D2D5A
-728CA8DF72801940AF4F129FB2E5C4F32DAB16258C3DDF41B41334304C99D25C
-D164D565E687B6FBAA406E001BD778939720B725B29B0444EBB2E22AF08A50FF
-0C00EA68F9D4EC2C0DAE1D0CEDDB9C7417A413F5173326DC5CB8275021CE6F04
-5A9B58A4D50832A861CDF9C9D31525D35A943AAF66A34877DF57FB6B156AAB19
-3EF93C8C4B8394FC0A51732AF46FEC3497D2D84B19F64AFC3BC52B054231D5B9
-A34D45FDBC25501D52C6ECC63492962B685FEE3BBB6C2DD70A84D704CA35D745
-467E73C8E5B6A2DD66C370D412525628174D5E10201C84C9C4DC77D0FC4EFF73
-293ECBD31C01A74379DD9C4F90EAAE5FF84ACE13643356755405F66C7361A2AD
-8600BE9E98A52536FFA517A2D4AF896663E6B930A66E2DFFF2C57D4D7A5C9F69
-F3154F6F8375E9803060CE0D4C45AF6475E53920957BF365961DDC2DF476F74B
-5149BD0687AFE0786B18D2BACC769E28A6E2E8BB1E3F284992AD1F1DC058AF02
-CC94EE0845124DAE980E6D9ECEAAEE1849027B0684DF492F168C5DE0DEADF4D8
-9800BAEAEAC9168846D852C49387968E86D65ECE24D6AA3B60A64CF86484DE06
-F540D5FBFA86BF810EF5DA04473E8E25345AC9A12424150EB621CEED8B1EB090
-C76FA51610E7CBE23C6CDF040AD880B73F3331F85824319DDE430C00AD7F809D
-D408879B1FFFFDA10384BCC19C8F3499B63C19DCAF99A5D0C2A948A7CB69E094
-5D3A79A06DCD7FE2122D3B3E646ED2032B8F82DBAD82A8563C5667A5F015D31F
-8FA8AF22D4728672AEED085F88DD7DE8BD13B0E7D0306969AF29AD850E149889
-2B4F81D1592CC36DA27A29097B8F720F477E6F9E26DE7C265A54BE07E036B7F4
-ED5E303876C82496C2C5396679DF6A91802452F079AA8E653D13438B214AB47A
-282D714843AFF0B74BF1F72C4F7EE4A012EAEE04A82AD8B2EFAAA33A87977644
-AC4F6E5CD474A6C8B08EADCC1665E3FFD09C78FF30CB4929CA140E04795686BB
-C985F7CEB0363FA650137E7DA8226A45810CA44175E66ADA50A0743211D3FC9B
-11B4EF4B5DED09A3CA69E48E0ADCFA5EAF749DF18AEDE11F9046A8629880C9D6
-38BA9498CC17F4DECF25ABC9AD80335ACCFDC534C82A9A479EC9074A1D9A01DD
-96D464E1D630688755587DCCB5E8C1AD4032B4EFF0E645E2E2329D08128E3D11
-C8D22F4CD4E4783DAC3D6BE9AAEBC2F4AF3DDB05020796C972677AB90AD7E8EB
-9FE96669A4615BFE4BB77CC787C941B7A0FD430AD5B9D7B63A26E954A28F60CB
-E380AD0BB4724D99F3F46E73160555A2BDD7FF5BE83A2312F7B04055EBE5B2A0
-08FD96C4C90DD9A06DB0B3D5F570E8CF4E9FD7FAEF7B5042A5513C1988E63ABF
-B3C8E1D8704041E279CBBF208AC23385E97A6EAC8BC634E3F9BEDCB3EAC4C57A
-EDA544E06719AF5BEF69257CCA51FA7840BE8E21F66707EF31300DDC70717F44
-EB2DF6070007E7B93D1357ECF8ABF097B757524E92D31524638E69E63B2DB200
-4BA1E338B284936557D6DF04AB23741BCA5CE6B34099FCBA07CAA9595DAF1E8D
-F10FCA58FEBBE12F8E2FE6A0680EA5E6CE0CDBF9A1C872621CA4C10AC91E3F55
-14C3918E1D32A2078CCF4D109ACB79C3FC55E3D222B9BC8E1D0CCBA5DFF91B1D
-76367940D4CB4CDEC260F3152E03A86FEF74DA6A1DB82522B496C177A77EE9C8
-652B0B6DF023E60401AD8614ED9D77224D822F4B961EEAB6D9911922311131B4
-49167FEAD3E3EC5E251618F7D1986069847C7F1E7503E04B48DFE249135CA5D2
-8903F8C25A141CBD2E7117332EE320DE0DBF03946FBA0DA27F8DF4AF8771699F
-696C489E8AA7EEE92B7824B5A03D8B297F9C606E64BC376B10C5C606106CA8C8
-B764BFAB04512AA9510A361CE189858A9A565276CF007EC6BC1C7ADCD6C4CCE5
-CDF512143002C6C2376D3CB2624095DB10CE42032BAFBFF7FFB6BC8AC5EBE973
-02520AE31D24A36AF5C897965EE3922C280FB056A36B802E1FD49A7C590F9A3A
-2D699F0DA5D50F8EF5C01779953A5BB88EEAFD3DB8C428C6514146B1B55348E1
-E2CE1D3D4A13A84A240C40084EA97B971EFA414370BFBFAB6F6342425A324388
-7DB7E4A7BF1FB654BC7DCB56C7E1FAB0848828B86F5CC8B069055B76986391C9
-76CCF12F945173646F85C1676235855107EBAD75BDA3CB3E655BC81AFDF3F629
-F79687F72BDA04FBF6ADD00F9A1F21C0007599A177F46140D6004D06F6CDA03F
-F087938716D4D6B2806985ADCC344B17B976547AE0F745FBF4B8663EE4F39196
-4B21F9AA8442DF78B1BEF23166510DBCE4405A20DAF5AEB09C4ADBE05169A52D
-839BA7B8CC777A0E4F685686F344716E2AC2940282FBC795966BEB564B018DD8
-FC56F588AD42CC2630ACDB1957CD2F3A461AAC09E95A549144809DD7533812A5
-7A8BF8BE337EB618E11D24B0B2C34CB39BA93DBF0A588DF611669ED72B92144F
-FAC3BE40B7B1E56B38068008B17DAC0C6648E5868A965166A798B9C918B5FC67
-E60AF10D6191FCB156411ADCCC75010D56E7A87C95F7C1CB33EAAC7231BAA719
-B927473D40BB980F3E9D304567305A653290423E74BE544D39BFE92E0CE23BE9
-0ECCBDD14E74EDC3C19B121128E807299C64E68391F13A96CB1A418A450AA9C0
-982B3B3CAC83E11C8A6CABC01F5F358F2BB79578D8298FDB47151007756597FF
-0574F3357B719AC0E368A14CC91F6E65108FE1AF6797DA6AE4CA52E1B15890B0
-888D8082B70CA6B7BC5FB7AD9262CEA6FD18611AA1D7378735E923A6A45D1869
-81801E21906A4D73AF8D397B6DFA28F52355FBF16BCBACA72DAF170FE4CED247
-F8A80C1CB66BD33BBE1AD30182305ADB2A88BD5F9B435B472AD6564845EA9CD8
-84738801D498CF826C540664BC8E87B868C982E49D77916CB87E10AC669FBD19
-2CAEFD9113127041479C98CF1B2987A45A22ED99B048EB76AB183714E069D51E
-6DA757A9A4E17E07AB37FFEA7618ED5E583F4910C7EC87042E8180DDBA7CF58A
-B8417BBCCF198AFB196124807215030A9204771B3CAFA90876A5193F954D73ED
-F0BAB43D936D0617D804B6B2CACCE9FACD2035141808E583A6E4AD03FC1719B8
-7BC89A97156B32033B9A3538E348C8D7A59183132E9BADA34F1E77B2FC8CF783
-3ECF3E24FEAC7C7BE1E236A94C9C44CEC78DA17D4D33BEEAE1A76CB5D4F0DD8D
-93E332D493C6D6ECE0FC03CBBD275441D61AF9A42443355A369A0C495CDB74E5
-AE071679D9DFA6715543D3FC1B6E4F66E5557428C616047C498DA9F50EFA1683
-AADCF6B403F0EF9A78F1F8F1ACC478D0B5B66FD60322C5AFC4C79557998FC714
-41AAF6009A53424935C0EEEAED8CB4513D8CF9AD3B52CF941989591FAF2696CC
-40F1887F8EA77AEEDF67CD3BAB4BF1DB2E57087D50A1F5944942CA5CB7085240
-1929A28CF489F26F59B850FC78A647287740EF2755A91C7196E4A53063C42BC3
-575061B2CC994D41EFA131FCB266A9AD1E18DBD854F2B99846EC903AFBBEAA98
-B32671B08856D84FBB7BCF5B82D245F7DD6459CB437B4183ACA555B4B274A63E
-158F68D8873925660D260B4C7884014E735B72EF322D646C4CF5EA4917CAAA18
-3FF6ABC26D16ED118DC4F1B85B3405A6EBD15C1A186D7C7A9A8D22F6F03B5DED
-F11167C738C758092C6BEE44D03532AD27708884E6F3EBD040A906D59E81FDEB
-BF0C0AD4030D661DDC3048CF4883A59C362229EAB078978F7E62B9AFD9E329B4
-822CCFC1DCBC7D0714E5EF2B7BAA7126894612E5D1F4CE7421DB0580E8C3CCCA
-BEC8DFD6392E9575607C895CD9FA1D78E92B634D62F3FB5DA75BA65958F720A8
-C0006A580F39D8B63D7351BE480B24B3E10318BE8780D486D3AE2E510217A5A0
-3936E396AD22D01D611DDE5F0F5140BB003D24599E9238397939ABC3833B8B79
-5C2B8CF9DEA9F3DB71377EA34DFF4A7062E91BA9E090A815AAB4EE3CE94A4619
-488EB722ACB22B32C391633A9B6BFFE656C75BC7A9DEF0E02CDC56DAEA9597E9
-360562717D81560E24972ED5E8C9CDF7F54B30792829A9136D2CC9B1348504C7
-A2F500383EC033F4756FE20A8EC0B1B0643F8644C1D871AFE21412EF88BB7497
-C79E3905528B6B2F744B9C9F10988BE7D061F5A5F56C72EBFB94A5FFE994A2C5
-D0BBD6F79F2BBFC9B811D6B4AAF40FE1D3FA6DE3EC49E0F24EA9490D6E3F81E0
-B56FC8B4D6EA1A0E899A9C1ADE24693A6D7E4C214D0847E8C0D5B31FB133F4B0
-F77BC331474486F8E4A69E970054D0802BFBEFA856550D95FC2CA900F5D6D3D1
-38A892C66D541937D24D9FAF5F54F169E5E78BF181F2C2E2B2E2B5D6E0F21727
-1E420D2E69203BD76417DE9A70685382A0F3329FC26C671537CB07764D1165A7
-6E4403882716938A18DEDF1292F688F657E27FA8E5D86821978DB65B0166FC49
-E7CD5C8D1C6AE1B78EF02E8A81B51B20EF5BFA1EC1F2B80017292FBB6168CC82
-871CA253ACEF6AC823372F41CC766617377ADB19FD677C46D7CCABF870DC5DC5
-0366E0A5750ED38A2A86811F9852E9878A95D3BA0F6CE7FA2670480B6523BAA2
-ABAD6A9C2D43E2BD21F2EE7222D21DBC394EF4CA9FE693A5A77CEC2EA60645ED
-BA3BF1ACC360B253C970F7BB86281CA813563CDEE08817DBBA24059FF290B550
-4F803469E990F5ABC2F66726E7D04E00D8E634CEC60EFF5FB69ECCAC20C2986D
-65F5ECD610BAF2EA2AB937056DC724FEAE337F5777258FB5462F3C94AA7E94D0
-FCA0B0684F884D7EC6ED8BFD0AB95BD5830CB4ACBFE139AB0A0C1C288A318B59
-A9A3E79A5D1D8A13ED7F632C7E52216E16A331101EF404489B2B095C0F787063
-9370950775CA15495982D882396417FAC4FF86355E203F53B33F35D4A5175EAC
-A78FC91C980A6AA5BD49D87043C4686B224D0535C816ADD1D48BB45EE7529E64
-0EDB35B4A27C167DFE994EDFB41D9D166802E37318CB6D4CDDBC73F7CB30816D
-E9C645E32C1B7513199F8D099CF39BB8DD762B6A947AC26242B3D51B11971F72
-DA4F942EB19C883CC0749E1596CB89A1E6EACCB35594FD8E272F1DB7529B059F
-FB204FC404789EE182D117AB303A886EAACAC08999B19367801BA5622F5443E5
-1EB2903D603F215C9355DEEE42A5DD29C5CBAF1BA1FD52B9F8E1FC5DED7DE91F
-34A4461661549339B595FEF063BA44CC0DE7428E131CA38106279246F5B9FFAF
-B127B9B46B1F5E050133071924005746AD3D6AA91E4A0E75E5056AC983A6141D
-D3DE44D5B37461A76EF6A8906210456F13FCD15203A80AC071FE10B2F064145D
-0C7FCF12AC9EDAD42EDF4E327FA57D6BA92607F41B7E34A7DD27945B4AB2F0EA
-532AA886EC057F98964EC0CC1E4BE095ADCF030B1952293B7B6465919A833D52
-F24EF2D9BEE963F7A33320CE29D54471526D4592CB09B0DED834AEDCAE0B629C
-5BE4E13337BA87E9D64D744CA5CE709E528F7BBB7C35A3444D643B1ACDED2F6C
-F4CE7ABD757F477BB4F64459886814743C8872DD2312EB952D5DAD81B0A6E52E
-AF1915A81D5DE395BE25B24412ACFA3C65B7E447BC4B801B5531218BCA18B0B8
-D72809B5B3DC921B2BB0B76B91618064F45F614C3B3E0506CB24DF52FF8F2555
-6B231AD0088DBDDE51908430A8102E0246EE56870D08C960E00B9D49CFD7D751
-697625B30027C82D4B3AD0AD5CB90CEE2A2FF301608967581CC45FE77D67EFFB
-2508905DFB42A0C335D1FFF2FDA1DEBE81C39628F53601D9ABAA6211D044F930
-70378306273D11DA99BE820BFF208CE0A7A81447056FA422428A6A21389CCFDC
-5FC34E06B4EA5D9C5DA9AA401F1733E2CF6669B438134AF47130FB9838208A83
-668067B89C9025CC059E73C6B4C332E1D70BA59A83EB7E4407D000167DFDEC42
-8B86B4B1D5772DBC673CE5F8128858E46EAD3A675BB5BACF61E0D1114D5AC0A7
-D4BA9FD5C37FE37D6823A517F39B1FB14B01E38597E51BC93CB836825ED1A3B5
-B841CAF361302234A2C3560FDC71BCF6D8832A1D74AE60806863BC1F3271640D
-73A10720CD078DAF15652B50716C0BE61EBDBA0AAA8A6DAFAAA327C69C29321B
-251BF50D418596E84DC3BE92542887BC0785F6128085F019C1FE9EF33E02A968
-DB0504FAF26E033A05C4C37E5946EC500C5941F83318E765DCBCD06D4A09B208
-56F226B0C8A9C55B6EB087C936F7237FB2A3D2A262E9C6F95D454AB92801BF57
-B5788CD2C0FBAAF274BF5A8BA908CA18EC8FB5C52368DDBEC42F9C3E6FA16AD9
-6D4CB47C2359309BA3B458BD05FD4FB40EDF6B495DCE6A091E780B328BFA995F
-869B5ED92BF513511C6DD88690114C5F3626CC6824ADD9E2BBF528158995DB9C
-08888D928E420016C254485603C49FEA0D26E34850843A066F5628509183FB4F
-78C3E0FFDF61E91C984D23DBC5677442559540A798E820E3F1BCC192456E9B53
-72F2EE0EFE321115375F0E43AB35256C770F5DC063DC7DD4CC59CECE9E7F3BAE
-BD474CC7AA33FAEB2920A44D78A51D3B75964A4310F30CC0E33018D3E365F947
-A69434C67400EA09F40706320D603F292862AC24A488AAFAB0392C470C84C912
-11BD82A3A5A3B70D3DE85F3095A6AB122A930F8014AF527B71B424D29E91123B
-0934BAA13F0765A883CED744E967B810EF265AAB4F7097A817E94C580068AF35
-C141EEBC26D24754BEC2FF730ADA142BEAD3DE4292E93A359E701D90EC594E6C
-D1FC795EE82FEC8FEAB7D21C656D079645F36FC9FC9D7C8B35B0BF424FFCD466
-65CAD025F6C31398018304AF29117430B8745D8372FAE966404129C8BDD5F31B
-BD827695C491C7E6D7B15867AB4C5DF488CB9628C6C8C114293337043B1616D5
-6F6B6C5F75238B27ABBB0773565A686BFAD3593BF53BA7C8272E1C597DBA0D6F
-D16517424581069689EEBF47641F9A0E3E7367423FDD88FDFCE78426A0D3F0D9
-942F66169B84E5418C80585989E407B5415EEDD8961BABB8AE61BDD51AE60BCF
-033F5360E7294430CDEB05DFB40C382D28C9834782B68F73FE9C129B7AAEDC38
-E3B6DD8DC041408FA064E0AC4EE68A7C07D96A51A1B7C65CA28951E38B58B774
-0312CE987BBEC2B3C6F20556F7E8066353CC46D8AF15DA8D7CEC2DBA8A3038B0
-BC09C733C76D095F8BBA0EF44D6C1E397B19A866364DF8EAD8E2E0E7531C7525
-8A6451008591A02C59FC1DAA7C83A3689A79037EB90522FEE181763D496A716E
-C01C78642DFFE2589D3980574220F09B144072E6135DEF2919CC852056C82B8B
-7F8EAC363D0D89CBDFA1B40505F3D356EE16E5170FBEA46B426E3D88FEBD8E23
-59C2FEDC109DC7A300FAC3EBA750BF6071DAF7327884D3C7467A15189AF18DAE
-17F6605DDE4E2B2F3AFC641503E4DFE27F462705B356F7C17E1AA0E3D26C56EB
-DADA9BF8B1E7149459B958001093DE38391374A78BEF8951DB54A69964525693
-63C5017ADE86C0E2CA89BB581FF57D0370F8AED9C95E326F88533E690B1C591F
-ED30E893431F6F615ABB187130634BDAF94568E2E17613658D02B29A25F35F06
-7FFA714B60A56D2E9D586D4A4DBCFF440A2B47B179CD456EF099A34A56AF169E
-5CFBC9C59516407286B2E11184F91EF25925C9274A6EBCA6BF38EEEA96E27616
-5AF1E9F5E84D9888F8EE35119C43CD7F02DA23C130A2D1A753A2D1E25E0F7478
-1ED3F6BFE62714F53DB12D15138189D0DA31E79F18CDE3FC84CD6D6B5EAF9E23
-F90A1703C6C9B435623FD375F926C8D013620432174B8C765299F6F08897EF92
-F129CDBDC3006D3755D3EB5D2953E182015BED56819D5A7A1773CE22214CC7D6
-0ACECC81DB66E1C6AE9AB70B77F6DABCC09111F559DF0911A87726B44AB063FC
-1CD60C964334A97E2A6604CDA700C112450389FADEC5DCFC12980381CF6BD92D
-772BC45964247E3E39D087B52FB67077AA8197EDDA4F613DD43D1A3EB7D6F686
-8528F7024C7A22B61A33E43502CD37E91605E0EF16D28A9A2806518B839433F8
-1802738E0B1BF0C7E95C4C1500887FB099834FE6DF4CD9A9D7547341A6D8CF21
-F49B9F8E7A9D602644B31396A7270C989F1A5BA9E3E225BE1F592D02D8AECA8D
-79C304CB010A2645158654387C77AB0083D08A3C0A41B29453908AC57C181431
-101C6EF00A8A55B6CB8513DC8ADC5E2D6FDF41990E6B3DADBB607CF37411345E
-42D0DC8AE568B2DAC69CF347B18C175C0E91CD34ECBBBF3DB1B5E6CBC17AC9F2
-8F77337D91885D14FDA32EE7A7367A3A382E8A894A9AD550DE350398FFF2BEFB
-C05BB7A915B8DC4AA5AAFECCBF716F518CC608E1E76588CC77359CA228596279
-F95055FB260502B1377E1AD575D3C1FA65DC158057E071A56D2BA3BD77998B43
-938DC18257C526FF2F9625CCD7DF0AA3D50730B35720E75777DEA2175017A503
-A49509775646DC8D8926A75D64548B9E9C01AC33502A7BE04BA31441D5F39CCA
-F889AA4D6B0CBDB9023F05B39DD7CCCA53608173E9DC5D45E772A3F7B4F7C4E8
-C3F7E7DE51770B2C887F14C473EB4F1A2FA420F64F4DBA1A6B651625F2AEAEA7
-8A030BC2B65BC4237AEE381DCD24B6E9940F39EF1D4BF81DA1A25140BBA7E1ED
-FA371277B13A016B264B14833BCBD14E6B3F71FA822CD0E1B174B569ABDB6C6D
-CAFF1A208C8E409623A051033AC99A06FE1FDA685CAEFEAB404804A701A702DE
-79EFA5F9DBE3587A2B8434BAFF152B9F18C574FDA77AB286FBE21AE741813B4A
-CEA10B071946CD4EC410BEDE7C68CD0B5142C2A99C836861A5B6A07FFE60E7E4
-1201B9966CABE2B10E71888FB8FC43FDCCB882DC2792994AE178B6129F23FC45
-32BFF56904E68A53B85FB8DC55D917C7DDA412625BB28CCD6A74273F5204CC07
-962DF7D462C57DF81738A8AE709F63BAE35532607CDDBA7CAC46F6789CE52010
-D84412E3CA30A0B8DDDE45A1E9956B4A7A8199D3177B5CF715A120FBA413CFDD
-ECB451EDF3DE65A8FC8069D4D1F65890EA6D6969D8663C5909ABAC85D4941312
-CCDE68C63BAE2DC990B6D119FB0A8ECBD5A11C503A668FD66168BD051E55CCF8
-D0022F58FCD3B6020A70838B97BA5A54436F41D26F4FB60EFA36F9E632BA44A8
-A21F57BD665EEAF35BA65A4F2090F3D831E14B9164183C0565DE2352C00C1649
-0796E84BDB6B679DA065AAFFFBFA67CA8AE9D024A3700959262EB552C67FC216
-E61CEE4ADF9BADF3A38B4A618BFEF4CE0F96C5C382641C99B706A9BE793B24F8
-78CD09F4CCF19795F93B8B35AF5598470124204927C7EE6D3A87E05F40626F07
-B9521BFD489B136B01F406BCAC98D60130A298C5C455B0B2CF05465D268C55AE
-26CAB1A2D4D740EF3D90914D334910DB05B5BB62B6863A4CFAE3834014D94C38
-F8E20C677C6A8B6BFA4B1EAC29EC87CE9E3E08C458219FB6B719089AB6982F75
-ACF33109F84FC1C7F0F542FB61F78587B7010265B411CCF63F00EE397C6C9D39
-2E33E50B1182385C79773956ACCB5970A8758638FE8069401540EA209B2D5AFB
-3B20D9B33A51EECF3D65F0DA2C2063BA2A2AE9164761FFB5D1D36F2E21F29F31
-D2852443F8C6316545C9D413F64466CD7CB3D0DC23B5C282FF5E2F91B63B7486
-83800E8CF3D07434DF16557AD530DDFEACF3CEDE34C7C4ABA3278E815297C7E1
-DBCBA8FA4291D43F1D1AF0E35B0E09A2AC97F10A93AB9F2510BB690E3C635D2C
-986179ACA326D19BB958BC60382A9E8C765A978A148CF02403C2C9866D78F05C
-3DCD029540EDDFE623C9F016734B8BC19BDFB039BFF4FFF409DFF33F62508298
-B152FE332127EEF6B236AD5C1EF9B145849788311477ACC365D9E5848626DB26
-773F93F0C44AEA8B014A5A7125D09E28761A8720DA53966B251BE1C1534599F9
-B246763A28D4F9E3C52C33670EE390FCCD476419FA1C4429B31C055EB8072D74
-0C1FF3311293F931EA7F73A35E870F6D81D0FEA3CC445C841BED7089A64EA42D
-947359421B7EBDB671E2E30306912EB99A754AE5BEC90783DBB14BB0FB3FBF95
-25BF143F7C9D9D6DE690C88CFF219075D9F9698D23A5C428F7418DE625217393
-0B79113E1D56E74ECE402015E0AA9FC320E447AE0345FF429359C48D617CC9B4
-6FBF2F72C9DBC94794BD9584E23F757C49425E7665A1A97CCB278AF1016E4969
-C813A40590E738E70C5B732537F477E9B80B3860B6FFD35A631DA0B6BC84E4A3
-8C1576C9EE90FE2E5FFF30F1ADB9581C6296D442FE1D3B3526780C5F70F73E07
-0233A3C769F74334BA6560ED81163307DC4AE74060B736C49BD83A837CCD7EF7
-44EC891EA5828026982D9E56834A3663150A462939E6557A5AA30C47C4EAB037
-589BC1710A9F042AC39006A5170B0DB0A952257D231498633D99B3D405C2A4CA
-D064E43E50ADABA18A80301460C2F17965C5EA3DA09A7C96274AA1915FA9E98F
-059358763626AC7EDFAE84B026CC16BF40296FA76396148C57F5C0E219B759A9
-33A46A922233E0AD0FC248DFEAD35B8B6EA330B97BFB4A6AA6DC27DF5082AFC1
-C17A6DED72F61D0C7F4DE52A3AB13734E55A875946F6D36703BDF1B917A758B1
-C1B4D00A52E890C43A7B8C0BF725F82FD416DC8EF9BB6E0487D7682F79DAAC6A
-C9595E33481A87C6CFED013243C5BF92AAF6D700006F608E30CF70FE9E9E0835
-255F9ADC616A0218C7D4892B9188C61C801889291E17344448ED2D8C56095302
-E71CBCA27D70DC38B8BDEBCD7109D47FC1B6E6399F07AC085BE592FF9B5E4960
-02FDEF5F965785540CF412743E0C71126A68272CB23128133090E757249854BB
-3F271F2DD8D7FA66985F9C380C104FC3A1A69A0CC03E2AE81E1EB3C7A2C3C297
-BF91DD1A6E2B0D3798C3535717F8046E92EACDBBA1ABA7D68D08AD31AE673BD7
-D10BCAF3324CC5A668199904ED903BC88746F2995ED2F5B1B49C73C34607C632
-37FA574A1F09D9C42789077425B8153E8F7F36589B1EB8917C87FC29A5E97E14
-3FAB4DA5EC20C38DE0CD0863683B58DA5C412A72C1BB8280A9236A1600BAC9E4
-BB930318B55E3006E5371157B1E2567C9AC8FD1FE196AB8AA86EC2A27B5207F9
-81AF2F85115BBF22287BD8A041DCEB89B3F5DAE811F1740D010C345F53FCC8C7
-BA7C7D685ADB01AFDB0D30CE7CB0E3BA122B9C8FA4F2CF4C5BB5793439E57137
-9D2E63B6132100B459F31D822AA742DBA61B8CDACE93DA530A66C034125344F2
-DCAE69E08FE774A5E09B29466898ED616EAE3458478888DEAEE12B6C1E2B1228
-A8A7C9AD6658D0BDA20DDFB0B4D831AC61CD216A60DE294C7408F7E34487487B
-B462888649DA65F548C6EDE671FF2967FE50331006EB5E3636EA8998384CFFFE
-0CE6AE5DF4E49ACC5574C73223CA5904DABBF73437D55E2353AF9F7B17E33771
-775F67FF5C53C5D45C40E60252F70ACBDDC054CB3867AF0BA7B01EFACB67933A
-404D56C53520278826DC106956E120A34A7E2B9AFF2B46C2AB3E64FB38776E2C
-456B5901398E5BEFC7CEFC35AA61E497CCEADE62360A0EE94D0273636A6CA4F8
-F144CBA6697FE4707361E09ABBA371A5FB8D8FDD319ABEAB87A5C3AF9889AA70
-B53E3C5A9565AC1A2F275EA303D579A0221004365CE864634BBBDBF5036CBE63
-3B5358E8DDDF56C65BB54A9FDBA710A10F9E6C505A2D8D11A6A17551616EEAD5
-679126F3C7D52B17EDF2AFE286454580A34F1BD963699F1AB742DF7CD9EE4D34
-17DD8BA2497BEE1933B02EBED1161165924F04915D1A9D227B719AD876995D88
-7C67DF53C14C7FABDC5B4D773CCF361BC58413765E7DD21A439E86B74795203E
-24ED7491AE6C9FD9CF3310D3FD1E91FD3F714013722CA2B13DA3EAFC49A2506B
-58B3B2984A1933CADDFDD10C628BEA54C798AA4E0A84FB4639494814FA18D79C
-147BE5E688F182B901F9730DA6C8CF362F915F69CC74ED4B436E5DE3924D7DB1
-6B4728BC39E8F9E0841865BFB0AEDCD7404D48ADE9EAE74F6C1E9FADE513539D
-9056DF8B2F6168A86405EA4635C19E128DB67D6F7323BC14A983FF1CE808B4C1
-F9226F3C6521310DED43A16EA768C8395E6584E90C5F24857BD989C1C6C2C248
-06D4BCD3C2E271C7AF22210EC2A3EB1A73509082819760E2AE9950D761828F9C
-0D1DE7B23A9DE64AC61F48D45956B5894815F0DE950FF02FD0A4E0355900C665
-D1FE0B411D4E34B093E17AA8087B606AFE7B2E909AED96B799922953C8416148
-7C3CF96E27365C3A4CCCD78849CD9D9D498D7747EB8AE8137B16178BB67B7B36
-E41780DE90DC23072DB8916BC8C778B79215212719A88744DFF9AF40980996AF
-379552BC08C8FFDF6605FEBF9B3CFB6D3D27D07C49554DE4844981DBF08A43A5
-DDBC572CAAF60EF7F8C4137C38B057E1AD5D953FA64E6844EF770A9B19B7E643
-F376273E028EDAA0729CD722C57F05023957F93B281F91510ACBD72F476572F8
-B66681AFF60DE653F4C8BFFB5A9076447AA5676C08828D7C6AB803AE9063423E
-3FC8F0E7DF5F8238EE36A7B8DBFBB88DFDD587D5C9133B69C6E4B86D4FE42886
-F0BAA809350CC835274614E4DCFAB77A8AA83916E5B65351273A69E6F9B5DB39
-205E3A62C2C4F483B3D8BB2C4C7C72E2ECB6E024A275DBD82F5A1A9ACEDEFF4B
-9C5175BDE3DC023253026E5E321A0F5867654B8F11076CBD6D49F2A7A1F45420
-9CDD551806DF00372B4D0426EF46BEA85816AB39246F38427431D513FEF9E143
-64F3A06ED9F59F1F0C250C9C6D45FD2B6C69375E9E0B89A4478A5EC458E132FC
-433E8A93D3497DAE9E1AA0AA7CA895B8AF67913CF0D13310DB883D388AE9A35F
-F5780A0AB6D55CD9B976014689C185E9455AB5B9697DBA8B9132C517133CEA4F
-CE40FC2BD4D9DE31A6A5F60E00C781F6763DC03DE8D159CA70048B8CF6D1EBB2
-2BA6966CF523579CF5FE324AC1C7C12A50A8EE71A55B3A6078AC0EE02E877A02
-18F886CAF9FB51F29D01E3F4AB961E5515454D05490F4C57AFFC4E63C0D1FFE6
-C4BCEF8F67066A4284ADB88E569F0E7D36269A6A0DA678CAA5C1B1A4BDD3800D
-FA3E3624A3698300BE00884235A996F611644E19AF114AF29E045FF2E4BE248B
-7BE9FB19B64B2DED77D5CFF8D85A332A33EF073BC94E30BD78AACE2B40C9E04E
-1E88D9EF0F0116E27E9432D461B64FD5F4055EB420963FDA20CB8D746B6AFD30
-4C70C4DD1AE440D04C6DE4F876BA09591D1A7F7F5755DB5DBDF1AF0FBB9744A7
-051885F2F13400F77297D66BED2FB53CCE01B56A7B0F7A74DF38BBAC0BB556BC
-9EF9F4FE429DFA89650BF6453FD1B6F472427FF2F91DFC218BA4690C55CD23FA
-C7E2B86EEEA984E0DF8ABE65813C6E9068B878F22467E7D981601238F82A43AE
-4F61CD56ED2C3828D7DD53AF88655ED8E00FB33795EB13F5A166626D35A94AFA
-3EA4331C79B44C8AD4E85E8A58248B83FF91BFB89C64CAE2AA2EEB95677B075E
-3772681DF3F512E315C7266B9B6DD3C38619E8F0813451BF48660E137FC76714
-F799E17380CDE5813B4B6217B0D0A7763A754065E2CE172EE6DA76FF5038C614
-0050F3BC4DD98CFD8C0BF526ACA742F4B79B53708DD52EBE58B00CBAB52BE921
-C131A671AD85BBCDE61B97CB147D9786EB2C01DB4425E827C3297F9886BA6354
-C526D89B6B4629CF7DBC38AEF5D3EB58E92A7BBC14F796778BB3ACFC654E3CD6
-9B0C5EB8B24C3279D46CCC0A3EEBAC870EFECBAB222233E62E76022E9C80C109
-70517E245561033028135DE10E1BD8FA0BB9E5FC89AA5197CEE50A98EB778B63
-BF0E7A97BF243FC8D6952C78192F19753BE77B576486D491344D4DC5172F9655
-EC6D86C591840E8B90AB507C63A7942A88C5301C8E7C9AA2EB41BFDEBBF19DB8
-A905B90FEBB86086E2E01600FB897AA3EB954761045B00DF247C796EBD4E8E18
-41894D9F62E4C8551944FEF97BED212B29FF795A02979ABF453C0E83C00AA39B
-E95AFEFCEE23B58571795F0358912C7396AD8E05373E5DAC0F76AF1B7A5406CD
-2D82ED5E0F014AD1512DC75D71DCD22443E7A071E27A52329A04A18E12E4191C
-57DED26A8573ED0BBCF6417D993269E56241E45E05A61CE72C63252D908DBBB7
-ADCABD21921CD36B6C2B1C4A5D8E6ED8F29B8F6AC9B8097F477AD77CE01C51BA
-00BE8E44D5B3D3389E4ED09A7327763E7F50426CECA5424D243AA8BC7E7B5529
-9D14434148B294C2441DD0A926B678211EFC6A48EFE84130BD4D15BBD2CF1388
-B5EF11940CEF3CDD4AEE073AC131947B960D716973E63BB928977EEAD41B80E9
-BF08B06F0F107B4DE2828FECF7370578FC116F03ED602FFCE688FA6D25E274D5
-519B1EF07165FDB10CB32D3748C33CFB601C98D17F274887B554A596FA9B3C3E
-63A7C426779220BF013EFA2B30448FD9B20790F87A069E0704A1EB4188A4298D
-6A7ECAABF7F0454E3E7EB98650C2BB14D2B08F2265B439FB20C74BD93007DA70
-EC6C445351BD0607997666DA0A56A186859237F9BCCE4F4E594BC8A81E6E22EE
-5A58C7B349DDCF0F753B3DEF9484B841DD1428881B625A4E28CE54CF896711C9
-4D380F508081C26CC9090E09C9C6BA12FAECD7074E2549779CB6FB88EB1368A6
-F709F6A2CECFFC5CCF48CA2985BFB1CE3E0FA2CF5C3B0F612869171F3649ABE0
-20837D908FF436B01AB54EE132A8F0D0ABB4C1015FE6ED45575B1573AA3F9D64
-66B521470DCD5C73ADBDA46E86D6EC5667D2AEEB5F7938F42018E1541822E475
-B11180512375AE63EC7BB000883043513928140A23CBB26658A6B0521F8B8DBE
-2007353A924E762BD8DD3AD901D81DBADAA3DF3C2ED5AA2163167AEBD049390A
-F4459FAD558F3FBB3B805EB1EF332FB14F0C677FF9CFF7831F203383DE4CE7BB
-8CBA629180AFF36228D3997BFC97E051F2390791B6F5AC0B5AF929107EF3CEF3
-00894DE1693653C33B012583EC5FAED006BF9410510A709594D34E558DF5290C
-4A36633EA935D67A351630E6F75FCCFEC361A8298DD7C9DA2326C8EF247481EF
-20B8C91013AD02613FB321DC00C7B9EF87ED8AF212D769C0EC1D8F116950A60F
-3FB2273E4EB993A8CFD3787C86AAF54CE86DD44A9A652307B7EF8BDFF73942DF
-F52AE037D5D9FAD5E2D673F4346921B642EADD945164F8B8116C24D7A5EF8845
-0D1199AA2D6C6346075E1FEA51B351F6688DB0F9D3DA6489C34C9E1493038281
-D5929568721CF3A309C21FACDB7B4AC9BE329935446212E060629507D78CE8C4
-C5BA819D284C6AEEFD81CFF819A14C445BA6DFC9549CAAD4CF56FFB4FFD46716
-C60DA7F437EC08CEA0FD4711D745892ECC7AC2FD5422CB464D42977F991BC3DF
-52E26CCF63B0A0D73AF537712F551DF4C8A9EB5837C6CD11119603EE13228E6E
-3326A8A9484B9FBEF42D121304FD19581085459FE250BB3CFF7B689EE65EFAF9
-9CB50E6DF0DE0F2785EDA4C7B9E7AA036CAD799C8451C72C8387EE5BB933851F
-ABE54FD373AAA654DF7B5646427BB0165303DA86B8A778F4FAB052928B6ED9F6
-083D9DFFC0FBADB4BA284BF9E3D0F45337EE4E52138044E8D2D9B09D1B3BF028
-C9EAFE1E2D352CF101B1CB1546A455C3264E951519FEE78C35BACB2A4103D5F4
-78A555C6E7B706E40B55115364E3690C7A7632B74CAC15C54D97662DAB2E7549
-777A7D0F70F1D20C5DB19E77FF69AEEE8DDCC120783D327817D3BA0E2BB98D02
-123CFF3299A4475153DD03AC6ECCD53B7395EF1BBD235E4E635BD925B46E5E9E
-DD4E3818F1092525B84F504450523420B40140F7AB6FBC8441779B724B371939
-CBBC534E8AD2EAD3561DFAE319F1455D8F4D6F9A20A73A79FCAA449F067A1AAC
-90D25E25BE199A9AB789D2B130605CB19CD2F3D97130B38B6B493DF57325B885
-467EAF56A17FB05542CD9567B0E04E291EE8E9E19ED3EAEC6FB270FA3F477B65
-4B60FD0A5A0ECE6D822290233D2FD6D0ED1BBBD82E5F0222A18417773597F999
-D3619B41BDEDC612072E87FBEF1ACECF313C297F4D6B27837C60FD840353C902
-31CE101BFB0B80450E991D466C0D33093450F373EF24A82EDCED7B9D0BD658FB
-8C7422C078FFE08CACA51E7C14795759B2F8A100D042FA3BDA944E6412659973
-4037B9A540A20DABC38FB0F6A346E50E04D530115AC770669BF34FD88238EF5F
-A80C403CDA940AE1CA5213E8A06E387EEF3C7D4941D634C3B3BBEB133BABEFD4
-28D3FDB15075E1A6626F90303D4E3DD558B910308D9CF699AD02DB06629C894E
-B09D7EDDB076FBC42ECBC07B8C248F653BA031FBAE56D61762B48ECC3DE15CF8
-7FD07380AA03FA30DB29CED313D5EC2F8C21F74A337E76C097AF48463869D0A7
-20F46A5FE98359236E7DEBF231916B70AFC44E201F13215D4C0A017EA43ACA63
-F86A6458D0AA360E451DC4E3F864F33ACC0D5187DA632DCBEACF296C6C85A42B
-A31E58EFD9F8B19893B59525B1DAEC780A71CA6FD27CA22C23733382E6D46689
-9AB673C87D7C6302C34FABC19B4BD25CAF910BA2A2957DC98917CA2BFB27636C
-80F2A056CFDC2CB868CDA68F342AAC19538BA177B228B3736D6050298F868F8A
-E9F0
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/l047033t.pfa b/lib/fonts/l047033t.pfa
deleted file mode 100644
index 11e8dcd3a4..0000000000
--- a/lib/fonts/l047033t.pfa
+++ /dev/null
@@ -1,1353 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiMono-Oblique 1.1000
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.1000) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Mono Oblique) readonly def
-/FamilyName (Luxi Mono) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle -11.3 def
-/isFixedPitch true def
-/UnderlinePosition -36 def
-/UnderlineThickness 72 def
-end readonly def
-/FontName /LuxiMono-Oblique def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-15 -211 758 993} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078985 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D83D51B996CA62E18F5E16
-E975A60A300FD933D7A757982DDDB53E6F052956F0A57B2EEAD78CF7E7056859
-D267B6E270C1FF751B2B0803C0B282576AA3575CC0743877BC5F871D3E0260CA
-F07EA74B7C3BD6E1C9B3441A87CBE0C24C39D5CED05780E7A051605C83647B3B
-4E86D8C9CDCBC1029AA84E30E1903B322805D506160BED37770D3317D2FE2469
-3B12CC7ACC1E3BF68E1F4F3AA7AACEAAB78CC0288FC854175DEF8280BA4981A7
-E88AEA83A0960C26504940E1104086BA90E50BD53FF14FD9EB047A0FBE45457B
-B4327143B7AA30A23A05D29D397FE113A6AEF33F0AED8CAE911EA27A56560D87
-1317E25F10F1FE017D115ABB4800E8CE8926A3146BAEB4E48DDFC4834F93F488
-42CF2A19F662EA9A223B7F12DE1F71E9197DB954D2E57806F6CC5741E5AD0EEF
-0A47F7D6CBF12D269A2ACCFE3976CA6829DC8BCE2165E18952C86A417777B867
-93F78E7A83BCB3FFE7891DAC14FD7FF0D327E664BF01093046303A3D43CF4E2D
-1D22D2CC2900FA2D274C9A5E857C780DFBB1E935E529EA1903FB85C982282A15
-A36BA8725067022561F47DFDAE8B913B525718B98BEC9AA28A50EB40A96D1A92
-EC82A03A1D24CBCF043F743547B8DF642E7B872793C2D61ABAD6B655233F09E0
-509B371B60CA55FCACF6FDAC2D1FF5710D1E9613F5837963BEA103D99E02F9D7
-B75C9D78DF42286BDF35A50997D6BBCBF08309D0247C1E9410FD6F1A5BCFE056
-02A6C4C5C6E54F32B1AA03A7B377D0F8C5378DE4A6BD519FD954BE94EECC40B1
-1B2B14FAEE89675C2D6DD97623A9EBAC87A08DBF8A71417904116B989D30D794
-A9ACFF1EB9FD4EB6627F541FC552E3602EAAC4798761225FA682C5646A21FCDC
-FE9934A59F90722F6A4D1A4BA63C4D44412F38CF175A8FEFDF9130DA4FA2F614
-E6842BF6F2D1DB5D8CEA85ACDA992C3ED51F60422EE7BD353AC911432419B925
-629BA2CF0CE7D2B93AE1783756F78FC322FB4BD50986AA0AB7B789DAAEE7416B
-8023B87A09EFF918BDC4147B761217310B1467D92B15E49C3E15AF62D47AACD4
-AD77F5AE7EEFF90937C6FB7A0C27AB7EBDF1D97E1512925D772B114BB44747C2
-9170057AE71C3A36D11E1B8AD9C1CCB207915DC181A0FC47E0F66B1018EB091B
-54602D0D0F74463EEE996ADAD5F99148CCFB27D402A59BC27D610BC0177BC0E8
-CB287101F44CC082E657BDAD45DE4C4E231522E56FE328FCE34D38B020D3E34A
-99A9CC2BFE1DEF5E1129CA82364C6D62A346F94599B9ADCB5459507A92F19D72
-9D461A4DEB9AB96E86C21085F9587191E01BF047B383C1DA20F1F56866D370D8
-F3DCCA23F36C776866BCEC11F8451FD632233B2973A1A4A64B94558A92A287F5
-074A8C0148F2AE882FA202212C575F5B32C44C767CE47A8101B25530F8BE1C8F
-B45642B3C7C2EF7FEBA3A38EE6BA20636A525A7A4305D8CA22BDFE84D0F95F11
-AE5AEEE2D2F22391F7CB647E1131C0853DDDE1C65EF3C618B286794875DD6690
-7ADFA1F1812F1F078C851C24E2B2C31D593589E9F27228CA21AF66F4E649B6D2
-3F67B91206DBE74E704276634E6032C91B71CEFADC7BFE832A8955F139F56981
-3422C47B3E8809B23C259975D466440820DD4E9E5F20A24787504667FAD72202
-83FE9B391A7CF5F297CDEE3DA8E9B9620F1DB2D387351409D38A9C120367E388
-4D9724EE90C5BA737B847A5E330A23ED12DB609837BA866780582E486C89CDEA
-39D101941B7608A5633B6EF6FA9848C2F8FD8DC9AD48201C98A7E72C38861822
-8DE5C6800E152D2CD869137DCDE16DCACE6019FFD26751A5689967512AC8BE34
-882245228E4774EDFF6C8E4A805F854AC5CE495EB91F84876A1FBCCB65F5E896
-BF07B3AE7B4B6F388D6EE0072BD9DBCA176D225D0F45E55F492457FFD2CB27C6
-DDBA44578E2AB640190F11C953C3C80CFF99D2FB39BDEF423AA9AA4DB4D4010F
-BAC17523B4B386B4E81B98F0AAA487A38641A966C829607521C7CCDFD1ACC6E4
-088F0295842C8F86DB2D05311EF38924840BC8FA3E02D9B554475C09786CC4E9
-F4B942030E1765F1CCCA561FDCECD1579DFE1F6B4A30D35576599941A2CAD8A7
-783135720E6AC6454BD4F1A7C1A1CCC9AB629445A4423AFA2B99296B2A478735
-62DEEDBD02BE125A4F7FAAA55410683B4950F60131BC8969A7E52BB8E11F986B
-5193BF75D36BACD8D2B732FFB29A5A7E76E6BD785EB1F605D035B653276EE252
-344EE302BFD7DCEF9C1DFA24532D6E0AF7F221ACBFF7EF479F8031B8C836ABAC
-FE89FEBF57CCF8089F9387AF1E919B815FDB85C69DACC562FCCF6BF843E088DD
-E64FAD2F51D22189D6D2402FB12C9CF390791BF3F628C04978EF15CC9C2EA909
-B55DB3141788765F610587CF76FD63C73FA8FFE8F7697529D85F42E9FC0DABE9
-4DEFBDE3BC659FB168A8C4BF06A57A8661EC248E1579101F4B7CF022E7186675
-EBF6E5F8C3DA362612D97EE664BD10A0A81DFCA85F2C3250BA95B0903B45FC2E
-34AA1C9900C092C3C1EE4A514EFDDE0F7BBB3FAE4A7019B547126FD62FE6ADB2
-17B9F504BED3487D1CA9DC6B5DD9DE01C2CCAEC45A0E115C251B0E9275FD216A
-9A7445B40BEEA1E99997E81D10C6331797DD98C94288A64DD4DEAFB68E64806D
-4B758A177694A38BB736D5C799F8B64FAEE01E8DBCA99597F0DC4DADCFACCDA1
-FC3010B68BA528E49BFC3A72AEC35B084DA9BEEF372C53AFF900824CE31269AF
-9FE252457BF229DA29CAAFC67A6B91E2B59922379302D243B2BAA44A6D24DE8E
-9D7470F7987C54DC3407221E1E90FA763B03536C9FE5DF99064B716412EBB665
-762686EB4249D83C7D80B27817DDBB152DB064796102467E4A604EF3328EABB5
-3366D50B9E2330CCFF98A8B98DD6E2C39AD991C8921DAFC4CDFF75DDE5E2F2E2
-DC1D8091B7E4B03A9772298DE764FE81410506B7FD8102EC4186D6AF7219DBBD
-E11BC975E26F8057F5EFFC1FBA8E80C4653E80F24347D8D5697505B9D3FBF980
-847430935126B257A8E0B1326AE1C06A5EFC97F01C45471C7A528C550D2FBA8D
-9CF4235FBFD4340B9CFFFF0802EF934183F93E0CC81CB125ACD01FD01B669595
-00A7B8675E1E61515594C1612ABC6C08B93732760B843FC93880E9A1700FB89B
-5DDD227A3BB43D2C30A953182EC1717EEB6AB016EFF3FF18108BAAFC62AFE6C4
-819B12052B09742A16F9C86FE887BCE63B23A422FCB2531235CE49CD4E7D3B85
-EF05671D86BBD1494CFA9F2E8A9AE5C0BF831B6E537EC57F69626AC89B685D39
-AB226C5339D90F0CD595169E3D3F70DE1B05CCD3A7B54AADB9C0D0BBF1E35D47
-F55ACA00064767FA1A02318CC3F90635CEE5944C984148BF437352CBC2122F42
-26675385DD0131BC7F41CF4BB9D914D29972DCF531A1074055477B3AC44FF0F1
-D895759AF4B365FE9112BC4958191171EBF1EEEC3DFFBCF23DF9679CA9350A6D
-66E54A3EACEF4390B7CD1A9C88C53490119121DA5DB6E77D9E065E9EC2B0DD1D
-2A276275A9CCF63D4462A2DAC9B3F62F20BF5C8B3FFAEFBA2971A0DA0F78DC73
-FA301543A932076CC943C65D5147E2A018209F0D2C18926355994F3F17AC6310
-909B998AFA45EB9B9E5225630821DD05D6035F9677F839A7970499234D93C0F5
-5167BD2FCD1A8D3FC1850E21978C3E09188688E383677E091DCE521F65A8ED62
-1020255B64B2889C787963D0466EC3BBB6BD2A02907B6D8355A3149EB88E5EFB
-D95B59470D51616B93B5DC90C84564AF3126689E63DC98D432B6FAE3CAF328CF
-04373D09BFA77F54368D24D546C7B7FCCC1F66B7949AE19136EBA43BB5B0FE54
-E0E7EC4DE599DEDF4B2A437985235F08142555F62282CE0D0187987F7663812F
-DF9458012EC5EE9624024DD39C3C6F3862E12ACD7D7D993F7A36A0E08E777C04
-DC55DBB78C02639ADB7D7156624E00CCDE7B3637C8DCFA60BD96E03786E27237
-180F51C3613F2C1B5C38F173A5E6CFE20F074C3BCE04556B6A6F2677C83DB5D1
-0F3DA48AA22E8B10D61132A58534C477D8A6146F60F1201801046500D37541B8
-F0576F790E918F92ED070B31DE94AD7F46EAF05F3677BB5041F1899BE14950F9
-7CBCA06BF444839A18126D23D57D567E65F9D4394F4846D88F6D3EA9D76BF4CE
-9D168701DEC9254F2F0676F27917D25EBF495AD97144886A468F8CFE1475C3BB
-DA73DF9EE532AC7EE2D706824B81467A9A2EE84C5D6205C4E1916C8250C778E9
-830718DDB534E6BA14F4A1D723CAF5A43F7668D6235580CEF1D296A9828F7397
-1D97D57748460EBA113342449E28B8EF96B9D0B8AD79CFF9FCCB979C86F14149
-4970698ED1FB72870122807321E0E2C3B1FD9B6B88FC3144A594646335BEB914
-B8882474AF2A0315BB55C1924EA4BD6E305B7B92E2BA498F5EDF6E0C13AA9A10
-218899781EA3EB98E9C9C52361BB9338766F055198970A06812DAB8EFE4893B9
-AFFEB1D540EB70D18CF3C8D2CACAB15A0D158E21958F020427F936E15F969467
-D2D998C50541009AAB95BB2844A0F1FE9E3394BB64A6B1E5AB8F98E9311A0CA4
-38CE611ED06E80C9DFA8B380A89AF7D18D1692DA62D816FA3E20DD647958F52B
-9C7219C4AE3A6CB987E1C0442D1F92BE6121DFD75A4E7F68A4D3E6F2BFBF000F
-509F8CFFFCABED431E5CF48B6BEAD630ED02D893D8F3A16E97E91C802B23153D
-A2E93A3A9BD228AA835C9394085111344805E53B23459251A1FF26802D7A736C
-9ED13E9B53D9BEC50A3D35624431F2E27E05FF01E56BC64801D06434C7179E81
-9390FDD19E322010950F09F9A36878E41D9D3C2E4FE37C2AFDFAE9519FE4939D
-DAAD914E331196BC856E68BDDCCAEAD7551B0C9808E10A92D02275AF1A5590B0
-CB71F116BFC878EEB358E741F35F8C69BC659B844E2946E1FF649001A6A2B1F9
-F973DE46F57A27A567EECCE8A1EEE48760C663F9D9E5665F2038767CACCA4A9C
-C9D0C11D846A5C649B52FEC6B42EA6717434807A999FB70784E620E9E4F05638
-7CCA3D6BD952B69AB9845FCF2E197455DB59A118B8C43C26E5693170463E1DAE
-A8CAF498A7036EFC436AACDF9221A35AC4175917FAB053818A318F7CE4C218DF
-EBE15A7E773CD4E988643B09D6F5482B9929D12A1C3A8B6611F14FD47C21BFAE
-674C10B6B5FA34108CE615812F9D0E95E34F84BF024D6EC5AAABF6011684A03D
-E83B69273A74D75073A380781D38C7D2A317086D80BB9BC3F99EDCBF8C3E4077
-39FCB1D7F88391FD4445DD94E2F193839B3A5C2CE65329FBAF0CE58CC24D01D3
-539D2C0F94F65DA1E5BBBBA772997227B2A702EFF5EFEC87195F6905E9A9ADBC
-B8FF45681D61D02D28B119241FF8C8B377195451FD30AE615EC2913FD53B8DF8
-5E2E4A63663FD231758FCB97DFC18F1B522A9C1AD976C4FDF257E1D529E1D325
-34E6C1A6D8339B6A61577A17947148481A62C5E41238FA86968A3ED0DED467B3
-4AB877EFC912839525FF9A52C0E86FC7A9D7499FC0A75C604299099106256F5E
-EC8168FB9343C144A726004BE642D55027DF9B18B80F9EC609A91C8E8E1E4AED
-FBBED28CE193CD71F0F24CB64F08F936B7B0932CB6466E1BA4D8EA73E66A146F
-12CB155775FDBAE83E6AFDC46E9A0680387B6663919884E88BD13FC117963368
-0C637980CCE4B7F393A7A7D4BAFFBAF563CE3358CB959BADF631B42E21E164AF
-81AC41C462EB987D4A90EEEFEC128D1545C27A8A34FD0781F85C1FB588B2B12B
-3DD933BD3C85BC4DB4D6EF64D7A1E71A68E56894E93775823EF35513DA281866
-9AECEE4647B99680344398D121C290923103E463B7CBF17514F32D1201FA86C6
-75C00997EDC3C17DF62E0A4EDC539167A79AB515B0712CD5702B3C8ED1662A5D
-AA8994BFBB26CE64A54A1AF3B2373E8215CE0F64A6BA038654E1A098DE4E67EC
-EF8244DCAF470EB351B684722E9FF7EFA6FCD589A1DF28B713A585F013DCD268
-4808FA1693FED0A859BEDEFF143673340F75A50F4904E3FA2351D874ED7DD95F
-149C82171CF7992CE2C64C64CDF1E9E0C9CCEF0DBFA5CEB4B20B4466E1079B0E
-8BE6CABDB2C771776DB783EC1E4AA66FBD34EA8CD04D253B005D206916B19EAB
-2F89BDEA64268DBA665FAA0D68D2371EE1327D0C0CF18FEF2CA99B93A322FDDE
-68D8F289A92C39C2B6B722DC1DF742BA4B1BE35259F0CC9DF36FFDD4E037B512
-364BF1D2D450843A1E9651A7431424BF1425AA1C2CC5C8E0DDBC959966BC3099
-D792ABB111B5AF5D48027A853AA22167A6704708AE7AC5E94B0F233512A7140E
-125D86625BB6DDD4B919AA9F322F34A570B772307596216631906BB5B8D856F1
-665D2168ED20C9C7B5D9B4B49584B4687ADD1D4F888229E6A2DA6D7CECC34442
-3D48FF83F6AA41BBEC5A5627FC8A3F6D9A4AB9130C6FD0DDA44B48434200E0A4
-B939668D041BDBB88B5EDF1916598B4E6A28B893C4C1817C14D1E2335533F236
-B7B62C425C7155B85EDE07CFAC64B907C115859965A617D383440944DB680D80
-B959CD223F917446FF9354D6C833AF334E8E1C8EAABDEE4FBC864B5D4AF6D0D0
-3B26D04BF93BF3DED0DC029E69DA8D7D0404DFF15E050B233180930BD8B87813
-1661177C7E5B5348BF0EC3B12682EB539168A4304F754F244C8F2FC92D24AF2A
-27B4CC7B9FC94447E28DE63B3FE9754FE4C6BB25B2F5DC5869A1A2D088406CFF
-893AF7968C6D4DCE14E9133AAC1F03664E1E65A15C440BE2E9D7F48FD6F63A1E
-9C06C311A7990D17134F424C41FBA0351FE639313CAA5D5E13FBD636E512A543
-1AA47D50876064744E03B82CFFBA550FE76D4A3DF6481F178F27D5B2557C0690
-D702153C470986414604018F15C89DB61F10BB7CC0ADBEC3F7CB3359F9F85473
-94377EC80668B4947F508CAFD4E7566F388801E5CFF6DD19EAD712D1E2EB9AE2
-F15A76E0F5844A7D7609D654B6E32991568CDB99ABC3078D960C0D1125A75A1B
-90B73079E29654C0DBA19565303A9106602DAEBD547C31F82C29DB4A98F6142F
-B67DB4D934D42853462A2EAF9CB05D6E0901E8774491BD44219EEB9CF4FE4AF2
-493FA01140E2ED9FCB1372E6484D2ABE6B1EB5A63E272F44F7DB36080342F7BC
-A63321982294C76A9E63823C63722EACCA6C6A90010D3343A89E49FA2103ABFC
-C60D3DFBBEC711F50B739031C43D984D8D59A2A4BA4937B5A08E55E6319B49C5
-D36B1A39170EEBB4D892228788F90DCD25878A31660AFE06CDBA1E656C60BF5D
-0A07A2104EA457D1B3C6E54D068C7094AB8D0B9FBEA7E66C72547B7F63B8093D
-1B29DF5F16D4BE002A4C5093AD3567AB0E085C87DD97FA849C1811CA8014B54A
-C1B1518E962E8C96D1295955C53DBA39ED5821FB1900F24DFBB7C8F1942298AD
-E97C85BE7A0D46873EDDD6D5EE79531DB92F3A8DD319D89E5D59BC4761562709
-EFA2526749A5FA9632CCC71BDF953A4F0A26C5B4F383A7CB429322736F449F43
-570942D8393FA50AF619BBF760016BB43DD12DCF93A150D7CF1B41EBB4AE221E
-3C2F91C3D9DA821D2297B0C13A4555E289BE8B900A7B7FCFE2A1AB4405ED44BD
-76F459235B3A5CFACA4323E85FAC84BFCE532BA323A92554D9799B20298FB086
-EC7A1CEB5D36BF34E7D6BE96D8FB7CABB562A59ECBBDE044E0CCDC42B77766D0
-54F2B99E0A7454C4FD03E30CCCF3887CA6C048C12F9D1D8E6155D490E78833C7
-EE6085889F8C8DA07E233FDD3BE1164C715B07A160EEE303CAF453079DED6F94
-91311B6CC2C79343448E6C94DE4CB1159E00CCAC3DAB69443B4A52270FAF2DF9
-285B6FF81E7F2413E7A79BEF760C253E9AD40B28D86F4924CC02274A6E37102C
-0716859EFA924E50581B092D2EEBD55409A211010729337DD11B376D70B2E816
-39E3F67B0CA5051F2FE1D6D732878A8665B255A5C490F6376021D7C3E614BCF3
-CC3EF1045CDAF7A6DB17E3C496FF792605D5388C93E2316264D9CBBD3FB64258
-F462A7F4EC677BADA2948E272D2EA4F7D45344CFE0764886CFA3FFC4A2177574
-168F3236BA418838B7C0F68B9AF7FE806F1057E97575A79D4815C707C5EEEF46
-3A37A0E5B3DF712246A50C8A1D08940CC73A75FB7E80F73FC044D56001AE3474
-BD7AB6A05DD79585B4084489C2FB228A7BC1E39DF7C01F9FB6A8E8F9D6675C28
-351C433CBBDAB5B7F9EDF1F299B9F3831D60F6F7FC0839F3E33239F1F75E02BE
-2F0D9F0842A3DF1586DB930CEECFCACD4CD74AB61EB66B20C3240507EDC9B178
-B0DA13F58AF8CF48526D84D39D7E0EC4E8D2E83CF8510E052D2687C6FD00AA79
-FC426348F421771E9F728AE1DA40FC3A6400E2F00164C7640EE12F8B9D6D485E
-C0AB79540F30441E97941E5D9920DA22439730C84E1404E2E3142966D2FAE1C2
-937BD857F6A44B76776FDB46E849DA71032EFE2A5B50349990B90EC233E75ADF
-E940E4EFC436D15DAD29C10BA71FF988ABB796B659FC250BA6BD83561D00DD2B
-EE1B4187754F0DD7FC325EF420CF64149EB7C010F4A0230F5C00E8EF0287A430
-FD501437E36B3CA17C50A47800E8ECCCAC731F5217DC39CAC15EC1326FE67412
-4C8B6C795C60587B4A9200328FD08CC435723ABD617A9C1EB6D6137F845F1EF8
-12B2E76659E88A00B35C3D7DAF9126E35794B2BFA733206435AAD584A464DA46
-11C6F47250EF166301246CA57B7A4A360A43A577560FA90310B9A41DE8A7A569
-11DB0902F1F8F4580D2C9990E19E6DE153D42AE72F9CD6654A09EC69086100BB
-7C7F940DD92A8404A09B6CBA2577AFF4FBD1731392B404F2C73477C5643AFD49
-CDFF85D630DE9014437AFD41DDB2A235B606AD3D19A3F32DDA92502C833B27B9
-FE7EA1B93C4EF69D6C25FEF0919D5270F1FA526EDE7CACFAD9282558BE6669C1
-AD9987C7261825EC00DD51D806B2ACC0F1325743093B6B1BE15CB05582D942EE
-7F32F08C3FF5D4BE9BDA66523F19C565035E56A2BC2610CBBD446735F81BB02C
-4A1D232F34BD287241B57B5DBCCA8529FCDA70CAB0464A91CD99A0B68A5BA7DD
-1643513B5EC3F79264DAB7936CD59A7953F563E5E34EF016CCF46F1C1CCFAFD5
-118CFF688015AA2B3B3F287295665D51C4DCD6E96D18BA3C5E25AE7886DA085A
-C1A0FB9471BE802C6D69B23BB1E9AD88FE3258FDE833182295330067910857B0
-A3A72BE8834CB2A1DEDC38CDAE04D2B0CC5492D490173A4757421323238C8438
-A660C7AFFA3C261E5EE4CD655B19B6FDE54760C2FB0955941097301142206565
-D048CFE4A7148DFDFB2012490C551A9309FCFC651892242EA852DA00FD19829D
-1838904AE7061E21A7F1566E70469F52BC8B9E02EFF3D944B162D3C563D91E8B
-28382FDCEE78EB8A527C9B6FFECB466AD43E0C0DA5C16831467F53EDB0CB8626
-BA92737DA27C98AB10C97A8A76353D3F975EC666FA00DB003015608CA6BAEEED
-AB8BAC7D02A6607CED006DC1B4AF02110EBCCB50854DE1633C8085ECF57271E2
-49B479B3BA13B3D491313B266C9085ADDB3EF486237AF30306704B36D99B99D9
-B4DDDA188FD08BFBA1D7691651338BD1F9E3D2325CCB349327D09AD5A9F82548
-0CB6FC48BB965A24E3D2438BC00A80BDBF322E5B81DD7D51599A8EED5E1C0CBD
-3D353DF1BFBC3050243CA4CDF48EDB660DAD7CD4326E7D8ECFEDDC3B79A28A58
-89FE0A38791F9778B809664E1DF7B0DD829288C3C7F00CAC6182629E86B1931D
-D5145A5DA2FC1EBCF001ABA058AA48027688AE1725719BE01163C03F26FB3C6A
-DE78AC5156763D1955A713CA60E9B98A0C8A84D66628217093FEE40C45E1B873
-BE5E5629F437E9C821EF110B3F89692B89F15F7FBF46FA1B31B66F0BB6956A0A
-B1233B3D0475B839B2F3A57C1EA98842DB201E2F78D654837C11035F52C165A4
-91206BBDFB2098B435A0BC91622094B9F460956D1152AAEBE80BF2AD888DC412
-F8741BD4B4F5E4577F5F1931C1D9D6D8F16D63376507465B216E42586E28903A
-8FC9A8799742081204B5BAE38A59047E0668598102BF487733BE3F830A1F524E
-55CA5F45EFF823069DF8D162A2B4BE2542D6AAE3D7506710E46E50F80E4E95B6
-A5CFCD4063974BE71542FE87820C530BDF026DF178AF3F99BAE56F50DEB17645
-ED9FCB0F52A576EAAEDD00E5110E7406C3757DC5120D4E8263ED0F04FC7AEF04
-BF4ED0D0FD4EC2CF08044677B8CD49517FC934AC97789EBA59A68CF5593D45C5
-7257A4408935543255CB46F8BFDF523E1695065265FBF1948B95DEC97C7419E3
-D15BD2640E3965DD0FF38015994858FC8FD1EE7CCD08CA522F88584177240D93
-5E51036BD64402950E6E655BCF7AF79D94D5881A04E439DB1CA3D1CAB39CCA82
-19D1CBE17DBC2DB0AD5596B0BDEE6561229BA42A69763722DE13CF80BFC544D0
-49E9EDA64605BE71FD6BF076573B8F7ECFBCFF911AF62B6C45056C3D62779A55
-5AB3824802C2B317B985A9FFB380EEAE5E816EDE9A381334A323E1A3EA9892FF
-6B480084B6FC82E42413CC9DA035A5B587DE706804232F4C269FF4E13D8A03AC
-480124BF0C5C5536F9B491A40F9E5B74C154E6A7A05D91E0A01D1B07BD9CA08A
-DEB2B51FD97C30D828A530BF26D35EAF941340FE61AF9D30D96E7293676D55B2
-0F20991553AC5910B75E6C8F5728F5060B3B35A223DB1A69C4D2E752335B2C9A
-4D380197F9413221E12876EBD61467024A304EDF24E6FFB17622DAACB5AD710A
-439CD1626F3A6836EB48315B2011491FF4F2FD7D9046315C8998FE7C758D3568
-D6BA5C6E158ED2FCDAA81B56B603DBBD917D82C124A61F629F9F69F834D08B59
-B53F10029802F0426C83E923D658D7F8D04D96AF9912389EB467F7271278601B
-DCF84562F771B4BAE0A5A367015F91512A72171E37CAEA1B9930C0EE51275FE5
-0F49B05CAC5E9EFCDCD57CAA3EB5D101CEED7545F2BA17BC45648D22119B23B1
-0F9B7DC950350929A310C3853C4333C230A78479127953E85A56C335B264FCC2
-FCB6737637F864A503BD2E4FE44F14AFD8E8B51EBCA87910F6AC4671F9A9591D
-972D0AB26E2AF36519CAA939C07D6D75F56BB331E7F37B6173383EA3B967981C
-903177D5E441B6069D6310476781779F68B4A60EDB732DF6A9BF1606B5BA8616
-AD10D97F711902CFE0B79A228F3CE5D31D7E35FDE180E3A52609BF2A3E3E6DBA
-E83650227EED7657D43594200EE4B71BE9A70ACF49A79173A985E1FCDFCFB705
-EF6D655E220FFA05B96AD4A5EA28FE833272A2034E0DE412818E89160B1AB71D
-CC2293238DA9EEC3A0E6BFDAD89BE4742A4F893CFDC4847E769A8AE4E3607D2C
-8FCAB808540C553DFF751FFB4996580010C53EDFF3354EECD54DD2AFE4BBAA66
-3587D0488A2E96BD38B16D5265FE05D92608F41CF56FEF44E977CD965DD29390
-7393AA40AABEB5006D6F0CC0740DB96B2685737C89E445DC07718B5986D13284
-0589CE723475C6E750F398CF7B138D4017120F774054EFB7CFF3182167A24035
-0A31A73C79CC763DDBC12C371D8A77F7B9802F9200EF1715F163EAAD1BD26139
-289405D97CAA32BF9D5C2979382B78635E39E4B4DDC0AE2A0B2B411C08A8D0D9
-ECF61C48C33693F24EF1B49293B2F637732C932C35998E9F7C2CC23B5031CAD9
-B2A816310F484FA71FAEA04B09237762C23BA7D864095B3234E32814AAB28142
-F65EEEED4BED3A1B7AE05BE68D6FDD81AD73CA46CC51FE29CBB6AD9A7FB0C521
-6B776EA1A7418CF0D4168AC00CF74DC39BF649B27F32F9791D51DC32FEF7E1B2
-F79502F3AF78BA3D549E5FB21AE5D265326D93CB4D32F6DFEF33029432A74D1E
-B23363450A94833F158F86B7885E877AF5F413BF0EB3DB99B508CE4CAE50BAF5
-C522A038210828B44EE62FF7D64E0E33D959D6F45FDED3FDD6FA828A5858AF82
-4A63D360801D8DDC9ED0E131E3339E86C0A6E1C20F7B7F85BEEAA6067F18D9F8
-E5971282585D3930011661A5F4333868CEF20CF01770BA2C60DEFF2B368AD21D
-D4167DD179EECBE8EC29225FBF1FCCC1D1D5A311703D80C942388BCE852CAD69
-E6034691247123B45A5613C7A307A3118DF37F009001A8A87D093BD0F48B1E93
-57A0360E523CAD04BF1BE259C75F52043A7BA57EE718852D350F7ACCA3664722
-20026A57015ED6C0208F36AB7247D91F81868424C5871A376924FCAE64382287
-D232C928831EB8C80D0A107DBB9CB53568E51B85912733B9559B6DC8287EE61D
-BDB6159977F76D58C6D925CDEC01F728D7D6BDD27A8E61473EDAA7BD7D80D20F
-B47E20C691794186AAA4F6AB76FCA59058E190DDFA2179EA4A3297BCBFD6F546
-EC6A1F7B013264BD04DE97E325A7F440ABA206CE1F0AD45AD09932F33DA483FD
-A8C54582ECDB96F9E612C8F2A7DA397E1CDFC11D8C1168F18B5DE813CF7EA37E
-1C7B2DF3B38AA6B3D96C6DE5637FBA31152034EDBC6511A965C78CB526DF27E7
-967AB9939D93DB8379DD1AE267FB7FC543256686B68434D3C5A4F5D823B50F69
-0F1D4DF1F4C575B9DE19C46363CFFD6CED771E0A74EFCBAA609A564631C59C0E
-0AEF13343DF77FFD4E0EA2AE1C1405D5A9C010FA32317445B8B172E6382D6F19
-A128393ED2C4ACDB9391D3E96BF3289BC12D1B8C0D6E3AC30074E55F641FCA5B
-B237CC2084537A34284BC94F3239C4E56A23722E89B8D604813CB8F776D17842
-AD927359B8147FC6E05503A0D0209FA52653481E38E7530D39E42DD57EDB19C1
-C4D8ED8222495543FBA560AA5774BED94A5A24D933F633BEC4DCEB70166176A3
-49643A62599243EA05741910083A0652E39DA7A759A554F48A4D550A933E4ECE
-D6D12C6D6BBEC0A3408A9BE220B328060015B3E3B663DF829D93B9A982F4BB23
-F5C8F24DC9CB77C7DD80809D353E336659C5E7C2528D95E521208ECE1AAF8DA1
-D84A8A68E2289650D800AD369399594309A144AF3CCB62BE30669C1FE773F072
-D9BCA31AF45DEE792D623ED6E99DDE9545638A721111DAE7E74B3A5B07881662
-628D47F08A3749F6AEBD13FA11312CCCD8E06297A5A698C59E139D52EE5793EA
-A03B23583052F10AE38CB951E533623133568377A7F2FAAB301C16F957A12E82
-7D2A9451DD123A725EFA3C3D93838581CFD60E69C772647D384BEE1A312F879F
-940EE9E91E6F7883B91DB9D4F1C5D1A941DA8F320EDC0FF8E577DB3850F2B5BD
-3535917873627308450D8CE2BAA054BCDCFF9CA964FBFC8161787697FC10195C
-6C32FB43D6891AA1538B728C34ADFC9DA526E87145693815F6C17CD9C361BF37
-E788FBECC2905D57DE7C2AD8D03AE51C33210490395C00ADFC0CC1FB5F5CB3F5
-994FBBD3DDE7DF9A1ECBC87480EA78770C35E7DF78AF2240F7E1412F8ACEB501
-FEB03A131CCB795EA51A6FF5B188B5927481C63B82EDD1542512F069800249F5
-A8F963EF9383342C0BB584BBE323069CE631D985DB8C4F2109A8E1804AAF0603
-BE3A5C8863A4B815D5200B65AE7DF41D79BACC2510E700F390B2EA3F4BE01D89
-BA75972F5354406DB6157645B80A9B43B8E0346A7E20D090B0A37C533A7946C6
-EE2953D8B2B216AA2237E9407DC6F90008C2C0E449112DC5C3C2C8019CC9135E
-C136FD411E23F26398F422EDF01AF433D66F60E5B961B6963F5D14CF48F77A50
-8F6C584459FE6887764353E2BE8DAB3C4CCF79A1CC5E1B28C427F520E9139230
-83E2B8C409F6C1A8E954F81F8F8C1091C4960C5132B7B5AD865AE564AF68CEE8
-7924B401ED8FC90F9A222C6861BDBCCBF54D06D1F2B27EA2176E4BD643295A4E
-49CBB9CA351F339DF41D3A0ACC6A4C7A33196FA53E49E409413E8D6D69F21B09
-3D7CBF3A96347F3DDDA92C435E1BA4980457D3D9957B800B144F590C136547A7
-660F182BF7162F5292A4AAD4A1E841867EA48FD686C90D563BE6E2879BF05614
-EBC88A6DB350DBF2996AF28B2EBE9415AABA07FF509B9DC0F5F066F6AF30BFE9
-D9800B5708503CD57BC055F5434655E68E322D699EA77974F1A0B4BF47AE76AA
-29F0BF7A35312686997FACFE24E9F8C23FF882E36D99CD4426742B6120B67E92
-BB855092A15A7BC5E9A6AABAC61CC20EFF52246334525628BF6F4D7DF5542399
-91D6E985BD244B8A4FEF73A2366783307FDD8960D81648472C9FE19445AD3AC0
-7B0C8C2DF9CDA23301BBAC2D7D32574DBEE3A176FE9C27B78903D1F3B1E6B7AC
-AA2768578872F3FC652388DCE24FB5F4D83426756915476C62A386B95FCC7133
-D21B17F9548DBB193D8C57A42E6B76306487EB53A5AA8765BBF8B64188A44E79
-2087928358CD1F1CB7286D6C7BCCEF10AD5BE805817BB9BFEDFF5EDAE0F691F2
-742DF076DBC7FD8C5D3F6B2ACC84BE4E16B1D68C3008055340B1952919387BD9
-D3C45456CB361F3E4D00CEC4F4D289074AE591074BE3C7AF4DB010B6C1A577FC
-DB61CC1DAE946C39B1573AE788B86FF95457513681CECC79B5CB533AEEBC98DE
-D04DE9C0CD9FEB79ED7143BF3B1DD911BD1999A2F223D4C41F51F9AFD17C9E84
-AAE9B30BD00F460A88C74A27268559754A4E416485F0F9E71C2CDF13F62F10F7
-25808965E37EC3FECD537D32CF915B6F47D6AAC1E7FDC9A90A49DF2C1CAF5721
-66501C306734B40278AD1129CF85E474264E65525F14DBD3BE2C358364F5A624
-21EBF782925A9A271CB4ABA439475B6D52A65EA1D8A71DEFDC476F73099D7EF4
-C5E68D5D0174860D55486F443E0E9C81A86594D28B2BEFEAB7AB9B14D1EBD02D
-0CC44A01437CADF55E4FDF86B2CC1762175F11725F292819C97168262C3A2D51
-3E3A45B29C5EEB0E57CDB122C8A5C077D99AA50415E39C44C206E980F06F0ACC
-7128ADA7761D7520AECDA4660F2E3382A733C31B5A5BC5DDD782C92E9D1C64CC
-F0CDCEBB4699C08FAF77712EC8D58FFB78253B978CC7219D7D79515F8E54A060
-180FEF767C9D8798CAFDF295303E7F0A6623A8C12B14C1836F11F8EF13E426D0
-6713C847925CAB6A2BDDD84344A9F3FC9ED2DBEBED62986E39B762DB093A70B4
-8330414B6CC6210606074CF505197209BD0154CCA72DE4B58CDCA2164BBF3AE3
-3CB35DAEAEF2247EFE9858FB09FD7386EFBC3726E0D8D0C105CB6F39715A9AA5
-75E088AEB767E520F30FDB5B1CF1301EB4CAD57E870C91C11F2839956FC3B033
-ECC34C4794ABC5062BDFD9EE75BF35C7838DE696D2E89CDF370F6942C224090F
-6866206B027A9385C29E50DEBC25EC087EA404BC87D9B06D6C9A6DD16FFDD199
-53E5B20FF70287A5407C80F4C29BF1E997B9206333CCE010E05B6C8C2ECB7E35
-486F96890C7A4F8E97FD7B42EEA6FB4FB3083BA5B01BADA2164C3E71D2438FE8
-4B4D38EDF4F1B9BF8334A34F42C6D093A56763498F359AA5AF15D5FD17868C80
-854BD80EB0F1ABEE40195B49FF7E9E04FD5DEA0FB07B12E0FDAB3EABA242D3D9
-11CF1F8A0BEFE0F6C4CEBC2DE687F7088E3556B95C0EE7D0BEC654F642212093
-E4ACA7C9F8049BE764BDE283D512BFEB784CE3E83BE5AD94CBE97A3C71DA85E6
-5ED201F11B6BFB09139D8FBE9516F1CDEBA26868D60A5244700875C72BC399FA
-F5D8B663B4BE7484E46F65EAD424D7EE440E1DB7394CF6BCDAF07DB43C86D0EA
-E08F34C56EACCE341389ED82C4485E53C3273F3F7FE285530D13A9A7D7F0A298
-458A3735A2B84D8C2AAAB2DBEFC847AB55CA7B74D9364AF272C76A1E9FE5D64C
-9F61FB670F5521FE8386A332BE4D5083A16C705E61FB58D7D88ED2B540949451
-46A2514F38AF7357F6CECE334C83E274A194A376BB5F053914C7DF83E411BBDD
-271C782539EE5CE86E3DA2682C634912BD8637BE31FED7085282BC8FFFA4A0D0
-2F9F7B62714D3F5B0F594983C9250081011114C0BF6BFE683261BB901A140656
-7FB4D34B2D59D4B2A37952B2150F7F0BFDCE25FD104A664867D9B5F9134787F1
-BD1AE54E3E1F8657DD5094CBE001A79FFF7A6A29C25B50376929504155707993
-5788678C618380A2D114F65D064435D44F56D8C2E969D054F3A5CC369D6772BB
-94805947ACDB934C10CB78FDC3FE572D844AFE0E8CCC0B25C67EB4BE8FA68447
-22DE142AF0D17C8DC4581F65836CC100525220925067A5DB6831DCEFDA4C3409
-58D49AF007E13958E64DFF010B99A9B2C250EE05106D80C7958AF90A2CAB61D3
-6EC40568FC2DE10756E7DF2C9838EC534834CA2E6342768B33CE370AFC934FE6
-57DB8DB7E490EB547D817E717959EF4C3124C9B6DFC6F313430426A7CE5011A2
-B8643B26857188E1923BC0C0D722DB3495C07B393D5CA15E71B1163114B4368B
-1041D31ACB26D732FD54BD27F7E0DBF1FEC7D4CB80130F3F750E0B9574B850DB
-675B928FF95029DC848E8975132E46A07F4E4FB760DFE3E599C8A84ACCBDC7B7
-50E2E7B44B12315486B5E36C10031E4FF14E1B8C2C101B9616B6D3F1F6DA316F
-458D0F76E00AB6239173B13DDFEF9E5B0F0E687957932E351D6DA95504B359B5
-F7E5863B601EBBDE3A8F858F8D226B02DC011914865E009C6F55AA1CC4FBED04
-0C13AB5C954B2FE695699010F5F228428DD79C3D3920F2B75631467487FA8486
-AFCAD8174F32B55897DF2610EB5173CED6E53534406D78000826DDFA40459E0D
-FD81766CD79277D950B1615599634258ABD320D8F1E60750FC5D839BF5AF451D
-DCD394129C099484D808AF2C833BFA65B56B8108ABB795EC97AAA0DFA912F306
-4594C7CB096546AC99646BD06A66B00AAF37163831DF857D9BEC11D0AF565073
-3EFFD23961848DCEDD747B329B1C0470B7C2C88C044DD6153592E6CBA21A015D
-4623C290DE06B357E931155942D894942DE13D7E1FE94D4FB03A90C684FFA97B
-D7257106C3C71B8BBB70D322CCDDE39DDF104CFFFC3C6A4ED68FEA52823AEDD2
-3DBE10A46C930B7874050B7D4A310C14451C9955E7D02EA21B09EA974567A655
-DAB255D067B913C8C8BEEF0F747F9900806D7618867341C49F395D78909B00B6
-CFAFCF12CFB569C7DD3357858905A89C09DF87609A0153471300D032B2CACBA6
-85EE4EDDFCBA9B9393611CB6398160A6178618F53DC8D9A26BD12FC5BE10D99F
-16B3D8A44009CE664056FE03DCB5938255C6450A6EA03F60DC577A1DB34A8358
-C48095F42E3F59308B51C402724DFB4654944445C655F68357E6303A1F480E26
-337818AB5B12CAD66E41DF871C71486ABF5217658A34630968B3ACBB5ED31971
-F6853BB51725FEDADB0107090C1FFEADCB70367D01655BB43FED064F3C59BBF1
-CA9059AACECDDA6A93107A72BFC8C43546219FF4BAD0E2BA19FE9FC6F42772BC
-4EAF6FC8FE96218DE04D77E00F666550F7937F610B037D62FE873001382384D5
-371C5B73D690A5EBE7355AADD29205F7381D3D758D655DD72197445FD743A1F5
-57D7807A98D1E8FE400C6E741AC6537CA76BEF0A74C24BCBD284726DDA89E7CE
-4431F4AA32844896766FFB8569B70D3AAE67462AB13C25520560B97F1670489C
-C703998A80E8010D509A48CBCC48EC52D619F7542E1427470500624F1F50C589
-6F03FBF17BDA013A752F4CE279E87112216AD59910E1B9D0957B6A2A3D839CE6
-81E311273D4C2B9A33CD0C760282F37EBA8CF6356C3D31465AC73DD9ECA31EC4
-5AFB71B52BFCFDD2F8A4410400A2FF3547B80B65C397D4AF6B314BAE4B5FC408
-D697AF9AA4FDA94B6BC540410D270A5317D9AC13F075DC8E3D5A2424ED57EB81
-C9CBC37DB4C6F453BFB5E52A1C30EC66129269B583B04A0A6FE60CC5694A8056
-14F8A81D7171653B491E30B236D39CCC40885C7B8B57DD43DAC6C32C95481871
-3B112939856B2C6A16E27264F4F65F22465B0015782E1553643171C469A08D35
-3F351E5EFAAA5A3440FCD03EFAA716CDD06454DF556F027903045D850AF30425
-231E67D59DCA6095F1A8005A50D8B0F85B6EB4844737C66A590BFAC2CF9AD141
-658B674A174C6FBA8E57BF6B34FCFBEF31CCD3658BFFADF331351B1818494C12
-53FFD05FE9677DCA63E4AD2C5EC1983E045DC861AFD71A696FC606B7C0AE609F
-36C0A90EB386994A007ED9D2349EFD645265013E717BD94A66D6308D1DF01BB5
-F87CE336C3EAC77EDECEB76F173DB9E1BEF481B7B02CFA679ED2DD5EA04EA512
-5D3F45A05E681B9A226B0701941CEFFF253DF8FA7FCA4C793985E6993ECDD9D3
-F3D0B2F267188C93C9824B92E8AAE50BB63E4F0932C92592097425F9533C747E
-9F9338839396E6F5C6AB0834600AC2478FC80D4756428C5E8C953DA74BBA67E3
-CA1E597134FAF54121D96D3EC56B04E942C0CA51B9579669E5B0BA3CD3163505
-F5A18DAF3E10EB1A9CB666B811154FCBA7DC868C9A115812329ABCADAF9C17A6
-467A90E949026BB37B2647A7D051DBDAA490723C43F705D7A53FABF2B91E9417
-39D2070ADA25A7AEC2F5E7612F07CB51A7E8729B059C0FFD0E11D77A1EEF82C2
-84319DE43E3854368DC488DD65D2EC3B8AE92611C1B74CCFE301B9130B31C8BF
-8146355A86673AD5DC32D0D00C7FC33FB2F1FA263797411130E686373AE3838F
-A42AA4F7BBEFF22F7CC829A95B9018C232D880E6441FD6A2E68B0640E0C74709
-C4E1976A6499A9D07D862881D0D063D2CC215D4825573ADB72DE36F8FD7E7C07
-807E88153F4E1261BBED152592FB9E306E43FB4338C7FC7E584B148192B03003
-CC5DC0E2926C59FED544A5D9A8FBFEFFF43967568B595597130BE1D3806FC034
-9E769165B83A05436E610A3E2ACE24F3E6F6FC40F1B9C7DC049404F1282D8A29
-ED19A320E30C2E66D2B133C585AADBD736A4950D77B6278946459ECC98AE9A53
-9BF64A9BF5CF9B24F12BFB5ACF91AA0F13AD869D7F61CEADC50BDB3EB949B706
-99C99B4674DAFFC8D31B96A1222834D8F7A81389A583F8FE7C9BB16023E8798D
-C5C8B3BD2270C8D9F35EF54A8EA8038A50018F2B8CA0CF190BB85C7D135E436C
-3ABBC9C76086B6A9425F84FB3E6EC62AE49CD54A4B673DFB819F37847B0D3E2B
-9FC5DA3C384DF99112160808FD3E15FDF82213859EF0E653897B64415A2BEE47
-7B7BDC1882292CA07F3948B7C26A0D3B2A57AB664F5A0C399E5697A2FB09D1DD
-B2FD96F7691AC2060173B7457287C7B27B9DCF58E609623631CC0984DD4919DC
-24B66FD64ACFE2D15BA049737DD142A254B6F2F4222034E26EA6C9F6832B958A
-CB479806632C44A5FC3BEFFEBAD867D1DBA5C0EA9AC82CBF56D89B4557C7192C
-293A693759CE35359055A2A549040FC43F58E48495CFD33D7CC7DB25480FA8D7
-DF149E8E3ECEF8328991923C4B3FD0A4D0B1C7D5E1EB033C56A5546A711DE5E7
-A2F168EA594A7EE68BF805D039CA96CA9C033E11A20F8A6A3E1E7400E86B3F89
-DB506BB4936A300008CA2E3F5D28C71E2FFB2B5BBAD18B950C90974EBF01A56C
-5AB94077D6071CAC8E45B0EB9DF22A3D896D2A45DD6474CE6504CA41D3562F89
-A034D7A2841D810D8B9E962625D7B9AE806009D39C6568F3B86F87B86F3AED6C
-6A42F9FF86F3CD8F78659FBED4012AD3C903E140981577E9E9AF572E9709DED7
-2633035EA96932A6A9759E5A39A8B59CACDA37DA21F64EF56E6683C166D5751F
-132B5A99E5624B81A364861495CD9208A811C47A594534317D8172D71DEBC579
-B7F602E3656C138331A03C1D66E02A19D68B80B6CEF1A30C36FFB21A8FA8DF16
-5190F44EC79B651CD09A96A9572E27EE3DF890D9FE1666710134288E97C14357
-6DD606516778FE550B81817D4D29EF9C1048AB62C5161347B1239B5F456A917E
-EC333564922DBDFDAC3537BE348EEB932D2700855C1B38E6632AB42688EC96E5
-E70B6E21597DD9AEC0C66CD5BE04886842418E5D7026CCF8F3CDA2560CB15D72
-64FF100148BE72752ADC59C8F19B039954A66B5D17B03ECE70228085BE334806
-FB49BB79CE8082CE9CBFADC30179B303D64C34BBCD9BBD50D0773B7EE72E9246
-5B01B90848A5ADCC95227310A886872DC56466A02A3A9A5F720B7FE4EA511BB3
-518DA5D1EB43E13429BCB41242E8D2908CBA3FD3A2881C911BF95BBB667E8B7D
-612A9035BA2602D6BB6E44C66138FC57776827BB7D6E19056EEF9D1D01CE27A9
-02C6517FFE875770123508F5C5FEC021C2BE78AA71F9D9952EC91820874B0A93
-AD291A3032F4198BB8BFE80EC6EEF6DF748E37316383EC01CEA99A64CAC75EC6
-1BC2997B1F2856FF05FB6772F6BF07764CD4751CA4FE1657A1ECAF6D8C5AE8F0
-8C9247C4F2BABC32CCD25E991A387DB42B2DEDA9FC2ABC3137D87C9D54778164
-7EA9972546C794D69C636D58859035BF8CA3DD17231F354445FA10DEFCDBDD9C
-495A261258876CA0380917962C18EFFCBF89DC4194FE9A1CF72DF12AA04A6084
-E631F9D152775E93A4005A19C1FD6A4EC47EA032C6BE37A2B78785370405E27E
-6CD97AA308A962761D4B7FCA5F042615169A97F738D2E3DB6C4152C6FDC5D5E5
-5161772E44B4D900B9EC705103368DA03F5E062C2936E0A98D310608BB170E0A
-721766F9D9A6764720624C1A735DA3FC426FA08BA9FE9F9375A3CD338F0E8E9E
-AC95AD060D67186CCA0576C1BCD646981D38BA1D3D33819F9548E468D9A8460B
-ABABBDC0A2D50B5C4224C722A681A9BD8D7F5DA2D4A343D1BC9029F1B9BD4B7E
-FA4817CA039BEE3856BE4B367F942B1A9FDCD1B804D69A132A476F5DBD8D7253
-E11FAF4B04BEDB7CD483BA74CE27B2C4557DED04E0A472F4B745DA0CFB86A9F1
-8AD4206B208661CDCA7F7C7ABADDECD59EB566F647A9138A8C5376D034878D66
-B4F4B241411B9489A2D9BBAA5D69A6F075B790E42FC929F4703CB5993D7F2A5A
-233C307CDD20F07756AC73E62E3FA4B599A19B7114033A6CC6810F1166A06F2A
-B13A9F2183C9B05F13D80BFBE21F47BF5948766D82AA817B5DCEA8C3332A308F
-72AE7EA0CDA16227B77AA521C155CEC0AD88CFF8F8EAC7C6CF91457F050007C6
-FACD0E8DE03F5A484920787625CDDD132C551ABBDDEBB1F7614D5B84937A03FD
-51DC15EE0737A98368B12D24F6CC11F6C6DE487B0FB803A2322EC745443F93B1
-C31C452CB55AB657011080D77DE585799101C012ACCFB55B0E0DD7788B6D0BA3
-8C73441FFECBA1924D322BAE3B180D6825A4C3D4E0E72C2446FA448AA84A0FAA
-428D6784FE0DC862229A2A4432B21F3A4A9C6CE0611606F97603609792DE3B44
-FB1F8E62327ED68CB6F372522C05A857E059337AB8963C9B74458AFE461803ED
-0E49E0F9B522BBB7AB20BF8C80937F41971A3FCF31D06F62571373E097558027
-0692E476E281AC8009A400AC26FAC8D7E8FF65A454ACBDD1462A89E8B2E7C7B5
-394DE68607953A7E3555C7471750033EEC5120731EC09FA95C9790777712BAE1
-36730C0EA143778E476557720F32848A0DD352F1A909AAD94A17EFE08EDB3D34
-E2CD67848B90525F263F480C47BF4ECFBB1B74BF2A905127BFF26B3E844A96BD
-470BC54684FE137B21821358D191B3A511B8ED334E1FAA089A43897C1DBEEF45
-D9FC57743DC68822F51FB589DE48E0A2FACDDB47405E56ECB39CDE9E501FF1AC
-0EE82A440A3F32DBE2396C3F78FD4C591836913F2E60805CA398377919C31E47
-030E4561CD6C7FC45F0ACE67D79473624794C8696A79CEB837700F3EDFD7A8B3
-D1942FE8090CA16D616272E8A3ACAA54356EB2052767480F078B395BFD7B0CEE
-182D6D01FEA66C5A6941F74D1BC8DEF650740B2A2E9848262290D704AFAB96E6
-5BA9515184B323E2425356D38E85D137F79C13495330F034FF7BA30B02C5AA36
-8E0EA4A6A10A56E4CBAFB2A0043486426CD20A168118D5427FEA1264777F8543
-4A415049AF307F6E4C982FBB3718E255F947C1F2BBDE78BF7C08FDE37C4CB6FE
-BF88A3AFC4AB9B077516D7898EC3C87A4FB2C2CA4E89F6FCEF185990509F91F2
-1C85F09084E3490DCA8F96FDD0CF777FD4FF021814DBB471891F8DBD584C475C
-912EF1F70CC389A390D36F290A544F1D3303A5C2728DEA320843076351921FE9
-323462B251FE732D2EC98BF1E4ED4C3F96FE04CCAC497AC8330C4D3D8D3AED08
-3B7BA8E51544DEF22CBB7FD126F7E01D6E3E6DF0D2F38E0B059637D90E2E9DA8
-5A1A404BBECEBE1A0D5308D992AF73560603476754C6BF79126C436F8081AA12
-BCE6E8FEF3DD192ED812E7BDB1AAD1F8D14C169889B6C1E155007DFD98140F6F
-37AFB159DC12A9E05A272C8C7655229980B5CDAD4047D89FCCB41E66DED71F63
-F07673212DE5D6FE3262696586A92EF04561C101405E21B341424B361928FA74
-D1F0F4B36B01FA6A07A7E45443AF1CD8ADC0AFED6FA8D8AF2C8CD5272A53C28C
-AE944B9045DE6305CABA0B57CBFCF07145C297A4BFA8B4EA532BF6E6A0D7A452
-1F2CA064ACA886650D27E3F605A27B8FB827BC68BE30EF1707E819BE9F90FB5C
-D305CCA3C1C6DCC1F1A1640D04A037977721F14F49F449D00CE1AAF040CC2FC4
-7614798B64A4BBD1776F9A1F958C0364C5D87555CEDEA1D979AE13F028C1A79F
-5232C1706CD1957E6B772C89DC78F9E1F2D4B4CF9C3081973726FDC294698D7C
-5B133F141499C32F8A466D72047ECE96EB36F6CA3AEFC2DE54D25DED3A3E5A80
-D02DFCB3A5E366C0581AFC853566B5A8FE47871B3E283257FA60C5AF514EE72F
-97E44BF870ECCB515A94ACB1BCB22D37D563286B2F5E484555C5E94E56005A86
-A6B2AFCF2166929C97434E72C35DC831162CC6F484F36A130B8FE1BACE568210
-90ADA920D96AF14E812CED41CE8DA5C50E9E7B9194BFC59E3697790DE569A6CB
-DF2CEF5A4E802CF13C18826C26373F508B6972B82BF855F6908687246CB307E7
-38E9B07F8048063A9BF4B98B8C064D1F156887727D430BCC27D5A0C406DE1AD5
-140F883DC4948F45C5FEA6518EE06CAA2173A4DCE956FC96F1B1A4FDE58FE917
-F92BA13F1A97BE8F67D7F4E31FD190E48BFCE942219AB34B2471E3A1DAEF0391
-EBFD2D7E6B21A8A7E14768A51A5FDA4BD00BC6655F16C8186DB3AFA1BF4B117E
-EF707AFB48006BEA3A03CDEA5ECE604C5EBADCCE8DA638FB8C7BA7C62C458703
-31799FD9C1D86BA345FD20D20819400EA4C5852EBDB2BC24D93349E4A0F83B13
-F00FEB05C4B9EBF60944CF77E73B7B02A4FD77C55E8ED9CF5F90B74AD0F7B31F
-45008D57A1CABC54D17689256648BA772B5C5C4187AA81C5BA8836C4FA9ABA57
-7BEF8291D50AACDBDA73923814A2B3E7B42ABD14F3A14A60F4AF671FC8DE5ECA
-A91A3889B81A2396142D56AFFB120C5879E5A831241C321EF41D4F07F9D042D9
-7B70EC2AD9B5AD42ECE4467605FB8B7A51E9EF319684FDEDD446C5058B5A7C5E
-0CBA92B61A69E6E3C86F927AE51CA81DAB7192F880BCB408DF63BF96E7F0CF96
-EFD11A84EDF771B51B13C68E77F555AF327FC45AD346491162CC3FE0AC38869E
-A4AB1727C8B50EA6025FC0799CE6CC08DBEEC0F159D48C56DCFF08D9DAE3012A
-F9AF6C7ABEEC3DAF9A802F246923709BE64048C9E9F409485A1E176E62DA2859
-315677A95BFE35E67AD99F718D44ABD943E5B92AA0F2C59780C718EF1B26A631
-233F61E53C8A197A0AC2AFC9775EABED3FBB7130081B3D0C9CF4BBB1D9A1B67F
-AC2F993BAD45B51CD67920E4F9637B69F849E89844991ACAA1E8790D19B5DC31
-DFA36E3F855DC73143AEDB781072153CA543A2DA531EF0DC4810FF92D9B94FF4
-DAAC1B0DC33836A54820C7C7F5642F0D20CE07AAAC77AC4FA51AB8B736586F65
-56A828EA7DB2E6AF374D40D11C30BB974D7ACC1C2B27F947178F7AD8B35BF2D8
-EFFD2E20B8C5BFE5D8EEE155017AF9EB37DE7F5544097DD2470F66AB07CA6382
-226C92B9537D287A0A1E57AF6C1A0A18DC3764D19D0A7AA3467FD97AF670A0EC
-BCF0D4D42F1A493467C4535E82A258F95769C7BA6531EABAD7798E22B6A0AA63
-4AF47B8197CFFE4DA3FEC29CA25CF395D601F06B39C89D7A3C2FB110CF59402E
-D3C89808BA8D3F0302F82C7E66E1DB53D7B02FC5DDE9A050C2CB71003807A9E4
-9B73F7B945929F9B1D8C4976CFDEF099B1A8EEF3389797C90CA68DBBC3816567
-24D0C57D55758F460957705F1620DE8306256180F1DD9E98163D499F6BAD893C
-73A29F57A88C79B55D644C37882C7B82D16CB15473BFF847C60373880EFEFCBF
-15271BB52855B75762CDD566E6673DF95BB784B578353C1BC5B56AACE1CB6944
-6C79D6DA087565A0714E5EEE2D0EF9D6E3FF7EA0331DDD7AEC7DCB441C81FC5C
-12A3DBE217C4C6CF893B0D3DA4B73DC2F2BF130E7813E659A7CF758E73180635
-D5C9EB39D6802EBDDCE71040B65B96EFBA434E55F0D62274D2AA44A21AF5B0B2
-839A93A97BD9A732334EF951518FC8A0B10C916994BA16DA6D4CCB190DB6D252
-7A837AB66DE254292258131256E8924AC7A0F1D1AE25DBEE15545D26B0D675B3
-73CACE88AFEE6A1102501F8BAC82A5C49429B802E81BA07D03321DAC1541EC5C
-FDE0C08B796895F2E1B2C82C158FE38F1DB46C6B525C693253045F9A41C99162
-5C59DD1A955D89A9A803AB1B386E563E97CDC59A89F7ECB733951C53B405D0B9
-FFF55AE6A92FC524BF3627690BDD7CF51C91702ADACBF25FCA4472BC9EC24109
-3A7E7F146F626FD04B1B1310489FEE98F62094536EBF413D7A14F4630CF0049F
-3B06B0C0A9CDD4145844ED7B2A359DD3F3E76469A1E1F88D5BA08D98BB152BCB
-E82452EE2678CCAF2DF565205F1EA4B7152DE9267890184D2643C0EAFDE6A10C
-6D4A118B470525AB8333793D68CC118FB4C2594C9634E174E40A287BED466AE3
-EC659A1C817622EE74FDFDEBD0C315026E23F246872822EE91CA5F54DB10D82F
-34CFDFFA8EF5E7DF28599C76C3A5A8A8012845667C3AFC8778CB308A7529DCFF
-946D662F2985478560495F401FCDFE110B652F02486A31205CB3409BC2445E4E
-4EE5DA2608260D1F0FB9F19479CCB6E3FFDFD9C0AD22D05C71F85253A8A09AAD
-5CE32BB44B26A5E0CC4DE00BE9D053F69949A82EC43216A10D33D971CD003E3E
-05E46A797D07FFE2BE809534DE891063D91EF2AEB2CCFF995574A4A661AEADDB
-2901F6390E93E1D40E98C7269B5D0376B1D556138B84C668A3F01FFF41563CA8
-22496A230B1744C5E9BAE0716FD4B20FE26F31F982E8E15F366CE98AA78711C7
-E04BC14426245E073CFF01B310EC370CD7A1D12442A302DF741536CB81CA5AAF
-7E1AEDAFA92693552810E5E9A30070825694B374AE6A71C2BC836CA76CCCAD00
-ABCDF96D1A3743C526FDE299FE0D34D2A02D61C4609A4308E19B7BCFFC4F7468
-141592B2837E7508FEE49BD3CA0E7F00EA0339442D5FCD0D613BA8935D73B22E
-1D04364D7CF5B2884B657BC4654DACBAE1A96F281123179892C21127466243D7
-1EA15DDB2B6EC1BD2FBA790EE2F3A78CFFEC079558DE093D4D5D673E0376BE27
-D97737149CCB05FC15A018303C8197C6E9341850886B9BF902B1009372565BA2
-156D4594856A834EE39E1F4F4E97AD97CE3142E0315D0DA4FFDB85EB20C1849C
-A202430CF6AAFEF97F628D7A605E4E321B6F7338E5AA37FE94344F98CC48F5D1
-480C452EB80C17591C6DE1D3BD4128F0A87EDB0B4E6BB00C0DB0DA7552C98FEA
-1ADB74A24041B574EBBD78AB937751A3C5E67F47E90FBFA0D88CA6CC7A8F06CE
-9FE37899631D1C4175EAEF9B0D206F218D72495F0BEEEDED6B736898DC7F5BE8
-886C6F1F971BE694023581596CD92FB856770236CE273D67E589DE38FF09AC56
-54FF28A6229C014184100E63A58313053CA2AA7178AD9E83799216DA2A533532
-71491192A6BAA0AB61045CE0BBF1DC3F97EBD47939442D56D60BE3C8769542FD
-82BDD0C82C59E12EBD65FAFFFF9FDD1DAB4C2DCA793073DA6003D43AB34D49DE
-6BE4984F46469246C696D0DAC8CE1540946D3E1E3DCC62DE19C0831A2459B282
-0B3856AC04F1C8FDCFFF85FEAC4F39EB3978DC78A39A491F5345E76737F6D744
-949BD6C007C1355644E5CE8F5525830A9F6A41D5C4CE124BFA22D934D6CA17E7
-A605411CAF6FBB973412C0D77FCE528C4D8964C7FE38AA2E5DC90266B29B43D3
-5C5A25157C68155609D313E7F15B055FC0D94F2C5EDCB633623168D4A430FCFE
-AFA26C0FCB586A81567FD0F442B373F2C2244648E0560E0A8E2B250F6549BA36
-57E2B248920DA2995F735FE19502BE2E8E917EEB78DCBC7DA169D8A9CDE8B839
-8E49BE238E46CEEE2FFDCD4022924196A92BA33BBD2631A7299FB77168898816
-12189825E564FFFAC9BA9294B7355FEBCE3A2656F803951F3DE3703987BA1C65
-B70755A7A84702C1650E6BFDAF02630057C81DE4739FE219742C9B7B38799431
-77010C455E31DB824AC206466FEB06DA7EFC0FFCA5388F5542F93C56F9311088
-EFC400535CA13B64406CFED124CE07658514B0CD9997EE7BA1ECBF9F208A5842
-48A6559A124253BF0B7FAE1A572FF4ABACD0EEAA5CDF41731983F2AF1C3480C3
-6A702AAA1ECA89433F5C432AE2BCB78B762077F5885154A59B1BD750D08F8FAD
-1B239532A4963508222BE34ADF98816F358DCFD5F81ADD3C017A808F9E8CEA8F
-FB112E2956EEB689E0F7BB4BE12317FA352C08E74EA43CD49C200BD19DB6EEEE
-36DE5CE0E2C648212F1991F8CE69D093A792C8C16A31E40C436744E47B12D24F
-69F1EF34986004A83720144B5DD8C92695818BA4D9F95CBD1607BF768FF81F9A
-457B40E7C7C8218FEB865A23C41BB84557B5975F386D48F20BEB92E9B164988C
-426BA43F1F30EAAC3AE65765155B94555E2A5171DA4BB3E243DD6D50DF5E365A
-A54C5C47F62E3472D363189FB9BF00C15850225A95B2A5F85AC26758CDF14058
-7BA3F07245800F0E1A195477BA46830353A6707A63EBB486F1A2E628764849ED
-6A082DE08DA495EB5A1CF5565A0DCA7826EE7B800D4000619E90211C19E705E3
-D667188571622A904C468B19E515697B7D9DC650C1FE08D18E0452BC32175CF3
-D0AC419627C323C02CD6E23BA6C0B2E95EFAD56AE1C8E750CF210BE153986563
-5D15CA3700598BFFF0CE909C921ABAB1001F846D82C5BA038D314181B534D17E
-36EB7B608D2AD01818D2151408FB57D70EF005857BA884F800AE2103A18A1BD8
-F507E08944D6E0FA6CDE0CD3CF6D07898B8887B2A21776A198FEE71B7A0FA1FA
-5B6624E72FE4A672EC528F7160F23F837DFF75F7DC11A78B505A31E90499E92F
-A29D9E9D5E385BEBED4E543D0B0D92C271B9D517C82ED234AEA1DBEE24DE3A17
-C341549EC96164986809E4648092F6ABABB5EA4F9031F89D706F3445E2E52250
-4BDB1C62D2FD8A71BFE834C787C603609B62915F436D56A385237B84C024C2BA
-450E64CFE43893B573415FFBF0C18D97908CC3DB39DBFE5322DA82D4AF6DE21B
-CAF619898FFCAE76174518C33E6EDAB7A2EFFAD5EAF8FA4F7A3D021C55A4C002
-DDD96D014338A5FB2C214B43B4C6B733BEB957BDBDDDA16B762C82C4DB7CAC2C
-5C66C8C248C6B48A5AF78D7B718C988182F6C56635B24FEE045E6B5428A21833
-611058A27DFBD824ABDE08615491A1439AECD10ADFF051658375263C4C2DAE8E
-5FD3309FD5565082C64060ACF770FC723BD76995154D35D182DDED00B80AB6C6
-379C42D40BEA5A574E489B263FF2A27E12DAF300D2E08F439728CA0C1370E6F5
-C32E0A1D5B7C8C199C53AF6BF8905FEDCC883E3BBA883FCCCA6366384DD69818
-D9C4C2FE0D13A8F82431C2A4964D949850B936C89DC34853D7070AE0824199B2
-EA0787F3ACA846E37E9DC39DC89E106204F6234480E07E2DC94319BE1C488F67
-9E984848253BD7DB8332AC0425376B6B3F07019B87120B0F25807D6770754143
-5054374D89E7D617213FC9F782D34730F58E916F2DDBD5319F0A9BBFE78E253F
-BA463950D5737B84CC250DDA5CA4A9AE3EC7034C78AE09F6A05BA63E8FFC3175
-821DCD0275020A68EC05DBCFEB123D114D3967C7D68D5A71BE5090C72472EBC5
-472FA95F07C1B85B91B03BBB90B5BA9263138807B5139CF5C35481666A7ED675
-986A6305DBFB1E8681D61D17B903F247CCD7E94569F598958685F487F413BC05
-90B76EB550A20CFA7576E3F9901C1ECDB60142F578FD684382B0BDE1C8B8C40E
-70E200C825E4C853D1DE36CAD6DBFECEDFEF4FF8D9610535722E7E92FB46AF92
-30C9CF8547B36B788F6B464D0403FF830E75FE5C488671F49EFB070860EEB9EF
-59A0663919E552FFCB7DC70A9B37039FEA11F955E0047D4C51223B29AA0AC2EA
-49E41094B59A554D3F6B89B01ADA663A7239254BE38061D0FC1896AFE32DD6CC
-9B7F45FE6CBBB251604917CCDE3217439C4043638B9914151283B1DC4FCEE80D
-2851B13BC5FFB868FF564683292BF51F2FDA82587BA89618CF171347CAA34671
-020A84C1235E7CD9232CA37438638C26AF281B1437D126B5848EA474E61B2DFA
-887AC50CC739C34F9759ABD50D4814D9DDCC3023A307ABDC42DA6A5B11D13E8F
-7DB330FF224E96FB36C6FD432CE957A0552893EF638DF8FF77225DDE7F2FBB6B
-961280AE30FF7A6A2DBC7A06CA57F0F53FCAD4B5716839AD1B1C959535AE4888
-125A1995517B77A52783D0155B2779DD346E873DE3C6D648D1A7C9754C29C343
-D9F8C81EBBE8F59906E1A610AAE958373D315BA032EA026F22A846D421D29B5F
-49BC07D6C056B61B34293BD9FAD4F26F5F4F75C1AA67B8EF5B316ABF8277F39D
-C3E23830EAC84627EE1F023A670D25128907885ADF64828B9066A56AEF4D1EAD
-98A2ADFA5EBDF80B3569D93B60032B619F7A79A19406C04CE33112628AB098B2
-609CBF3D2E63F64AEB9A68526B4C9696D602A0DD4747AA230DEBFDE27B1514B3
-66BE6C0B6F33BA3A990F14D0148B7AF706B95F4677A8F0E84164F5AA9888FA91
-BBB46D23B89C6D9B3276AE7AF2DAEBB0658232ADF4BAB4C4D75BAFF7BE9EB97C
-486F625F571F41D950E521C162E4FD8CE1643E13156A74D63BE736BAC443CB59
-069BC06608C6D958A0CB4AD2F5CDBFAE0922ADA57600D753A9E48E82AE08B34C
-F5582BF8B654370663ABFCC008BC20A004F5DF0FF001B225AE06F0805733CC40
-DADCFB49CC90404F387E9D126330BC4221E4BA6A0E8A8C496115DDCC95D5388E
-E10C2FA48BCC7AE21CFE7CFF979F91EDD80B80C18D877BD93D0AF3E02F79DF4F
-981FDE508492B20F7F37E9D35B69DEB6D1F8AF3F05ED411D61FA89F8913A690A
-A3CDD0D72D529483734B05872038744F17760690EB6E6B8167CF2581B13521AC
-0BAD559B9C1024083AC6AAA885DFDE9AD7DFEC0B0139754215569281843A5073
-CA3AFEC3E265C457B628968C44A6AE9A53FA423251A03AA270F51F13BA5F9FFA
-80DA548D56DC6D0417F3DA517058DC9ED756FB2E8867B74FDF70817C15879C27
-0D8456CD4B4E39B41B635A8E10DA744889CDDEF45B406BC6D9831F0DD0AD77CF
-13914D7FE112EFEECEE1F881F9C375A9BCBBC00F0F3D0D5F9DC58CB26B2C63A2
-20DD5A5A1DCB3F49F29073957251FE88D9DE640BCA0978DB287357AD5BA5069F
-B7ABC4F5B10C9FC272A56490B24E0FD2F5BC3FF60CBDA5EAD0AA4CBA59E6F951
-F5FCA03546F7D242A0BD67804B580345DCC9C68445C213ECC69E1E730BF6EF06
-05AC8128F5A4D3140A8844846D174A77F0D4ED59F170238F0876EB4D3444A080
-44262048710F00D7E218346004BAC79802CE708BDA11BA209FC9002AE1B694FD
-3F616199C5AA6590761585C12B49F795C9A8D00808697A437F00921C66CE6D86
-C68FEE49A62BC6787680A27A0DB318F4CFE0891AF2EB26365BE68F2438E0EDC5
-75DEEA0C73886A0471F6053776C786453B1C092A553B7953AC92B2B10EB1F8E8
-EA68D048E35E3EA92BD0BD47632FD6E13BB4DA00F55F9199675B8636AB23D634
-06EA2A5C58737A8E30EA12F22EFB2B0AAF180C3130122D385583FF417202CA9D
-588754F5501E5368BD33D79BE01D9A2495E7F409C9DF4288FD55B9076478B41B
-B4085CA5B8D8B6701D50788124E5656B3E9D7500654730006F3A39B4C76ADC94
-9FE02603844AFBD18144BDAC7DD09D154D6A047A230D44CE62F1317B2A3B783F
-C13722F7AEEAB2F9150A95FC8FBDBB6CB0415D5409A57795F5083F72D1FD79CC
-FC1FF965FDC61297B4F76D059C493656CA6F0965F54229BF23A13F794B0F5BBC
-D4C4D0351A346DA55D4221010DC9A458902F20ACD56F01F409518C4EBE896B5A
-05CA57DFA78DCC9DB61D0C477D131CCF4DF3C2DDED4E7573E6AD6D5A54536E5A
-007FB21C25639DB2AC2C5B618325EFCA183E89A7FA85A0C1D6812F0CE129C5A1
-F3DD02C6181728CCF87D6F8CD5606D113EC79899621ECFCB29F8B4C4F08E89D3
-E7988071DFB3232C7C21D04C5A2F5AEAC737A1392DC2F60D88BEE9ED6E882CE1
-C7B42E43709F34F68CBA4F352B387DE2DC06E471F98B310D0BD3E994FA0FCFCE
-B4D97C49E494F814FB09835AF83EA1E18642F4A4C32D04BFAABEA46BCBFEA0CB
-F8230E404ACE57162F9F96CE7ECC10F782140E11F23F4C2BFA61AB6E1ACC9496
-012837CA40EDBA0C62E1230A30D5C8D2C6F478813CC3D0E8BC6ADBA1E5238837
-DD5C6E4F1675C92E41CAF10749907EE81DACDFD8A65A9FDC4ACE2AB457925E68
-8DF970BB7927FFF2E957E53B966C2A5D8EB11D43A8F10DC21E3F8D2490997229
-3AFA58573E7297834E153A23A61E1380BC0C8B157E3D52B9FE1587282DBE52B4
-7D021A4F83CBE165E8F7E25F91C78F8177DD0C5FFD35B497E519444446F0E24E
-FE29CEB06666E1F5760C2D2B5C8153659DB7AA36F284FEE3951772FAA4E9BD41
-D9CF7968CA215273E88FD37F1A64B7B4AFA2E239BA6F9C463A8C5D0CDA152D44
-E61D6524E88D940FDA1B4306B1388863F80ACF9FCEA03C88ADADB7C4FDE56D14
-2192097015E0C4F622C4118EAA3823248E6B9CD5C9DF3517F731E17C1DEE88E9
-8C10DD9482135FE1581B9F9D274AD2A4F4C4AB82687C897373786FF3A19B5DB1
-28D5A3B59455D17D2442BF44AE3D3E37E5635B3981346782D169E3860E6E33DB
-C5777DE21CB2446D3D53E25C1C3E4A5319068D3A4EFD2D1616859959B5573B97
-446B9CFEFBF8DA22FCFBDAF672748900A1986D6FF0C7DDBB737AD8CCADB39D93
-B8C0B42AA5811564134EEE9E1745DDB5D87D6336E21EB806BFBA21F296F3620C
-77C57F9F2F1535C1847D7DFE870D292F1889B17F2A1DD8122D646D4B5ED89A89
-A27B55E5E3DB0A21BAE974EDD145ACA2D3DBFCC41E1442E4C71572F6332A2BBE
-1F26951DD76F7E9F1D21AFDF2B2F176D5FA873A0E87927C98432469A5719E87E
-61F0AD048A2C6CEB22E0A274A2E24739CDAEF7E741785098969714FF22FD766A
-AA91BAA4F2E148AA2A4849E44018CA3A56CB24F661BED204A3228BCB34A71328
-DEA7E832753F683136EF071596E0E1553FA9B7C0FEF063099155D11E2B4CF246
-01F0BCCCC30D72FF73C88DC2AFC3E2BFFEE8455BBCEB9E130D528E13BCFD9FD2
-A0862E4516CCD3407C7C7EFECA329194A48BE68A099F9CC80CF4724252DF4D2E
-BEC248133C357C7601B3B7D76D040A3EA0F3727C4479F1F781F9EC9EE799A795
-EBEBFCD07D218B1C37351AEEC49D2FC2133127ACA717FB1E3DF5C553D7B867F2
-984659D466BD116A607E68A3D7776B10E62DEEE8AC4E3D019C65567E66CE17C0
-5D77CA70FF0BC2B669673169C842F724BFC7DBFA4E056DF12AA73D85669610F2
-98F468FA0BA593C51040940E87E2E7D3DC8C2E843DA2756D6D139F410F146B05
-D18180CC1FC0ABF1EF9EE86901E87582641E7F09BFCEB2CD5089A3D6B510C792
-C60E635E453519CDC183DE287C8B2340D731E4A792CED7174B9AF9037DF5B279
-8375003A95965124AF855AF2CF04812782E1CE0B1B9BF7C188A53C4B86321301
-F023734419DD8F8236B11F4C7015080B3990EE63A22D721EAAFE702856A5ACBC
-ED1FB74F68245C1DBF46C33B755777B983DDE8D41590E7248AE8DB259CA35197
-FE3ED93CB51EDCF280E094B2CFC61F53FB5A52CE74702030A3C90CE2AB3B7FA6
-59B305765206591B0143B4DA04D625B22C7264C261917A02A2750BA492C0F0F8
-114DF714AA6B003B9540001644DEF7462C01F7B90E2FDC0981E79E9763A10251
-FE38FCC2FD0AE00EA22722F96BBC059C371CE5936C634F2D07BEA7D46CD3CBEC
-0C7862B368988A95BBF0CF65967E54EAA99F39A23FAA08FB2858D70CF94E865E
-F7D4A937C06917E8D9163A2CB42CFB57478EDF9E6CAF70DB5477AB1550E97F12
-E55CE92A01EA26E55A8BC51A38EF2079B0D7BF46376B8FF0AF901B8227C936EE
-19B7AEABF17F242544350A1D0C28CD2E526A44E60A708221302E3B16544E9E84
-23CB9A8057A7068320F1D53DA24B308389962B9AA889DEA3A71C10E4DB41B967
-2C2B9121844BA1C256EDDF8EB34ABC0B1961FB40B44656693EF0C864971A3627
-C9C8D89E73445E684A49BFA4D3670AF017A9B5425085FF8CA94484C8D06F0C5E
-46302D06D1EB646019513472C9FA7C2296085E208C6891EF2A7E3DA75E2A5140
-F5BEA92C2A5AA6F44E6B2C1FA1FFE434E58BF6CEBE3F90E0D299ED043EA27EC6
-3CDED517A698152C766B56AE25BCB8FD12C27F0AA3F50FFAED672BDE0E14F674
-5EC2F24FC0C84D684DAC7F10B2CC4808C0A9F91818DD2F05E364D0D8658449BD
-BF598370B5FC48ECD85DD9166869DEFC21707C30F7B7CF99A34ACF26C62872FC
-A15EDE09F554E21317DFCFE0D45CF7E38A72DD2E8F6AB44541D85E0F95617224
-CAC6E099E08CDD956DBDC49F1AB81DE6C6DD6C48241C0985FD00952B453DE19B
-2EBB3424E658507F403FD0BD1C0C5E09F15CEE4A24DB327DDA8D88D18A41DBE9
-26761688A6666DC33A6B0CF337FAE51CF9337627941B818FA53001F639D488DC
-C10873E21F3BD0DEBA50BBFCDBB76CE071151AD2C3B54E7DD18865BE6233F95B
-69DDE72B7679DCDCD24DD7DB3732A1E8B4C8024AA5251A4FBAB4FDCE468774B3
-8904877FFCC902C3DF9404F3A1C7A1D0F49A3E65C7133B4C1049A6845A57638B
-A9B10CE7475AAFDCC84276DFD61369A1640C76C2372EE95A0EC399DCFDA9133C
-C593E499E24B5B2D03A6AB3E43B4B73E233F7F41FC38A0FE60575245327A47A5
-41E2EBB51562EDA317BCB5E207ABDC58B74F28B904DD69D58D534662E95CDA5B
-DEA467DA01B240A3A71B2624B49B71DB8A81A3BAF67E15F4F2B57ACD1F1900A5
-252B680D17F0887F613BA5B9081CCABC851CCB4C37A8E147D3466526B407A4E6
-19EA389E1D5ACB3B494BC5BB2104807977E5D773354C9AAEDC1B84A92CBB706C
-C4247888B0E2EA8CF8AB5F7B89834C08AD34CC099A59CC51264D833332D19422
-36AD35E35F1518AFC233A4FC35CF30F94A8518E299B6233AFC100FA3B3657225
-88A43DCCF90B6CA4DFF9685DAAB56CC40B6150C27CD76F4AF209B2385D41BA2D
-02B552C436304431B4B42C4C94EB36BAAF23740E36F555989CA4BA8B4C17400E
-044C7B7482F0683EDE11DBBFC36642676F02FE0BFB74FA890DB2125B1EC34561
-77E3D7CBC9BDBE1A50662C9118B78EBD96BED8BC7F2661AC6E39696CEA072E9E
-485DD6FE282F02DFC87F3588DE87F1E5B4ED84E5D98883DE09CD37B421ECF443
-F3FF7E57D32D528E5AAF87436CFCA1A0D915E1FFB734D14F81F4629400931E49
-E5908D1D3BB86B3E02D69BEFB614E5F058F715935AAA8A9B03FE6BF82ADAB9C8
-4C382F364D128BE5558747DFA3342979954B0C484B698B663508923650ECD360
-E75A9FEF372951FFFEDE0561CEA80EE29F015EAED4708616478E4405D09ED7C2
-6221BFB22BA42401FEA2966161A65C08275E9EBC7966E560E69AC39CAE196BCA
-DADE8D7FD55E69EBC1F74E8E0CD632687DEF2E32D02CECE979BAC2694410623C
-E89C01C905EE4BE92DB386768475C054AD40FAF3B044ECFEE1167C08592B4F6A
-038B20DDD4F8C70654A00C0D28107E45BF775B1219DA6B884F7728E0FB23DEDE
-A79D8B6F80E1FDF72EB717620544E58D042BFFB2A89F01B7E2573F6B5DA82DC3
-5F9ED7B644452FFACCE761382BE894061AAF0ADC92B218D3F30AC8B7C2B4474D
-740A9661FA4F44EE53F2BEB101E16102AF3AED740A0486BE28543BC49DA90282
-88E9977720ACC7720217108EFBDE37D013FF19B60744D735AFBA27C49281CFE0
-84E22E30D2B418CAE223455679F7AD9A8BE049562B8F8069B2DEC65E6C07752F
-3AB1D19C6EB11903187DE9A2B5ABE817EF14C5F3CAB32B382A4A1AE10E9FAC76
-57275CB4A19D5E4AA90485C91DE7D83846A309F908C26E3C98110BA217ED7A54
-F0FA10F8CC083189C8ECFD6D24ACBB7D14BFDF7E8EA573F01938E750BFCE841A
-0877F25A4EC9AF0D17DD358329C5779E3C4DC2097CCF7B2F23A3670B3B67AD31
-5428E0A587AC2806A9634B15CD1AB20A0245B4066311CF8271F005F66A22B102
-04DF7C6E1BA88413155201BB2CEC6FED892C8F812CA35EA384FCEC3DD8D5BCBF
-C1E676896DFC2D34507BF1E934552DB0C1BF2DE3881D42BEE94FD8B1835463A5
-51868CFFB3BEC123D3AACBA8589DFA7845CB99C5881FB07E97834E805686EF4C
-50B71DD309E704EC56C5B4C431CBC6A9C9F7454ECB5AC64113EE5D90DF8C1ECA
-86386B38D6A985E03B45448F55D39E07FD4696FC4A2DBB2B911583DFBD10264B
-9EF54217156384F8C0D5C99D0B6EB62B88991C5158542D202DC1B1365456BE94
-7233B0B31D541D15143EB4D48AFA929E22ED2E3AACF090B9E50E320256D95223
-2E4B473AD58805DC0020DA6FE8CEDEFF339569BEE59BBAB8A9C789A4D1B1AD24
-07C995B974AC8C26728E25C49CCF2F54341BE82892B3D3C1243075E500679F93
-7F120BDA233CE416FCDA2267AF799EA4345FC4B932CBFA61B588BD7152996EA7
-D441EB0172E418E22A0120D148A4C1F73D95595670BA3F983C7D36EBF68B0916
-407D8083877311B5F8C9A72023827ACDD925B9FA7FF7C1F629FAF23BB224EB30
-1322809CAF5DC40F883929D1039829938E19FDE2559D2CBD001A8AFDC7E2B716
-8118701CDFECA74D2F7A82149B3EC4101C77A0DFEF11F3692FF2B3DFFFBC164E
-BD71DA2C7005F942C76C3454A7904EB717C16848A7EE8B67A7575F5CF156438F
-0D54C88F91412C0A6D87AB253B6065B997B84AF1FD24B03CFDEABB2EAE85118A
-E0A35424667E71F732924097AF22C28DA648A2E8A5BB764E5DF9072E6C503A9D
-C05CE851FD964ABF5A2573851F7216E613F4535FEC10068E88C26E799EAABE88
-1BB6E4BA270C2744508F8B68EF9F551E7BD3247969CD3D53569723EA41B32538
-56AE9E4EF636C1299256E1D1E4ED108C14A69082900F5585906AF8A899A22450
-0DDF61DAA3B3F626DF290EA31B1F37F6007F207A78C798F40853C40F62DE362A
-08C0B06386E1A12270C528135D3C2602B14801C37323B53887FE309227353E7C
-A02D6EFD99748B9CB2493612A80A936249BB17F4540F93A750C56918D65FB485
-693F169B514B077E49CE664C619653FB7BFEBE77A63D1B2FF857326654F7A32A
-87970F775C3C57AAAE98365D69D3CD9AAD6CF26ECE04A9DE4E3DAC9C9ADAE5D8
-0C7C60C62F69414150C31AB9E0567F53C3A8F575DD994CE0F520262497BF8DE8
-4D52C3D9DD349A062154CEFB784AD62F625163CEF7F01690C711D4BC6FC53DB3
-A84187FAFEAF5D93D0F06A25B4EC48341EE39A8D1F8F7387E5A1DADC00F2D83C
-4E094BF1FEB09A0A7E6F0BE30284F743040264442F3188C84D388FC01332DF39
-2FA2AA98FB6A75E926749781717D2AD92ED2E14EC42866EB5046F7C8CF86D298
-0BF6C520EDACF09EBAAA43A477EF416E8F1088D31554E1CFA4552E1914B908F5
-92513A2C5416B76FD56C12535E2656344D0877105F841A259EF69927AEE6B1D7
-BED8DD0F6CA7F6D5CDB621E4FB44899CDEE60B8E99F3BC198912E3687636221C
-4CC00D2A8A80F196237A54BCDB1C1ECDE659D183A900F544205AEDF192CD8AD9
-0FE31CE9513D298B7DF9E2ECEE56C10DD81E4175DC2966504DA5B1EAB0D88400
-3A43F4330C53D2A7506E240934CFCF65ABE9C39DF8F79442D3B8872519D89ECB
-766F57344FC42D5611B0B86EE4CCF4BE6A550A7E32FA83A8DEDD10279A1A5CE0
-63F3DFDBF95D2A60323399469F72C76FB26B92D95F1ECA6F6D4CC8ADD207D69C
-FD0BB3E2B00F3944C4606941E723D904E5D7F55D72921DDB383430CD0C4EC291
-B6BA49B1B2FE99FF849FA2B5A8A898C8179D0C2E796DE8E3C4A0F998CF4B5433
-8099424A7C76C3A498AA6109E46EC9E6AAFF45E10B364FA41B7577457D6CB5A3
-FAAA3EED89269FC270B1014A22C4D2788FB425396B97FA3FB7A959823D5FCDFA
-2911B02A6A856224F202B50020F85FF91C1397366AA94734EEFCFF1D66AECD97
-B4A443F37733498F4B8175703FEC53547BA08CB2FC84DA76076B1D49905A36EC
-E8AB606AE53986B8C0F26CB2FF58A58538511FCDADBC5F51ABD0901ECFE06707
-B41CA6329128DF5CDD6F3526D41174DFADC2577E4AEE525D5B01B0E1E3327A95
-B0E4050946D347C0EAA483C2B8F9DA33EB687347B6A0CF28BFFB11BA7246DFD2
-84E721312CF19CD124AF18F3F8C7DAE99BA5AED0D951A84F4955A218215DC5E8
-EA5B2CE36C5E06196966B65F4D3AC37F54FF8B2E5568C234970369E5732F324D
-6EFA761A777DED5C806D6EC15F45ED14D58FDBD331C9F4597199205FD2AF2A30
-2C41EB17F71AC38A085AB87F6BBB37BBB8A40EED15BB05FC48A99859BFBAFCB7
-2F84944CE2FFE95B4CEB21DD43BB323362BE4C8F2D6E016F3D69FDAB2BF5DFCD
-287DF42B7672E4FA8AF34BD9E257A34E388C7B47B819AB081EDBDB20DFE86F72
-90EB77835924F2FEB9D7F1516DAC09467D720506C419E94E44B79225C6FD001D
-461B64AB5AE56440D7E84D5C551010865BE4CABCB6EA62DA4503C7A73C22E05C
-31EB5B7D480EA9F8BA4877D7BF8618D88C7B56E208215B9B50EDC8D378C2D835
-DB7F3AD35489F6F3D6A03C9F0490956ACE2D3878BC31CE5445A7C63B13086C28
-9C9AB643D12CA41C54A6A98FF8C550B00D8035FF7E485CE380084C80282609ED
-18BA58CF164A21C80A65B235A5C10730BD6AACF33BE7BFCE7371F647D5D73708
-2791C584D5D19BD75D9A9882B70B8AB253495CCCCAEAA74455C61DC23E257279
-EBF501B3BA3A249C6F0215C1810D02B021E90ED3946D96066880E8E594B0B125
-28B7F3FE3832E3BA37DA65ED789F3EBAA00FB6F43382BF83CEBB70F056D06896
-DDD48B5278A27EAD5547BA2F583CD0961A5A040692FA8158B0C83275529AA118
-1DE0670915C269650CF843CEFDE6F896E0E897E12899E591F6EE44AE743E3A04
-AA7F2B41CA6472AD33C6114561B3A15EC8FDD3595786C52F5889D3BF0B20AFCB
-803E6D199DAF887509A9A7D663840B15FD7DC05EFFB27B3A30DEB80D7BFC1406
-481BCE51C2D6033758F2649EC81044097F039C448B8B91FBA5AED1F15CF17347
-96C3F938EF0B212A707F4BA27D6DDB9016B07CE699C2AB314DAC8A99A004F43C
-92C0EABE8A0E13848850ED528D5269C353243B20EB4C1DA88AB6301137032E54
-0BBCAAB039E216DC09694D2406D82C1803D26BDE251899012A7EE6298D2C2F52
-E5D87FB42ECBA66A40437B754C0E57120FDAE35481382DDC2A498DEDAEA9915D
-4B85EB7A313C73E804D425B79A2EE9FBDE556F745F5DE31947B1331D7D965179
-3F6F66D3F4700807BEA5232CE668137CBF2FD67BA025D7CF37ACB925C5651337
-2EAC6D5513DB99F6BFA61B717B33796D46B47B68B3E5B937C170E37F4EDB7B66
-E3A8417123B7824569AD515E47CD823FA8F0A2944DECA5A257BA2A71CDE90A26
-985A9D46F4B4EFE36BD46C8CD48FBEA4B3B98FD33A050A16FDE2518E09B7FDCA
-346F6F01C7B441563D64341D29CAD327F62AFFC3A59675EAE1ECD2D0670AE179
-D98511AA514EF8111BD2812041D875BB9A198133D3FA17319BCF8F9BD838DBE4
-D0BD072D92DA296A9333250EA05A9796BC1347BAD789B803B317914EEF08AA47
-A05EA5C5C5B903B7F33CA520502CF3E8E5923C6AF86488CE2F05A1A503117762
-F49765A64E4CF9343E937CDF79097A9E8ABFD5CA9D31C8979B8F72D80259C4A3
-F599F0E251D2820A48B01ED48AB4BA7E474CAACCA2F9773285A049B66A0E75FB
-77F1FFEF68D6FC457C6C0AD6630266FF749C58A021FC1382BEB1F400FF4BBC2B
-EED145F907CCAF9C8532EE3F447C64D28334ACC54B9D4F487A1BA4CB26C0274E
-73245199C085FF391245126B990D8CE428C59F872F86EBEBC88D0242486BB201
-0076F1C5ED159CE403D08BD278DD21C917808E20CE8B23730A38E172F537383B
-410795C3915BDB06D922C3604E68656995A3452CAF4BEEAA176B487A39E24149
-05D0E6E6FA2EFFE71D96617E5CF773E55165EDBB37C63E700F1593221F866189
-CA8DC2EF18FD9DD83D312B1B3B159656679DAA25BFE2B54ECBF532ADDF3F7C4E
-BA23628D7FBF19E6D4271F16A91F751357AA46776D1F874FF4497EF50F6465F2
-48F547A8D00FD9022814F58A69A8643AEA9886EFEA87E5AEEDD35652FF584AAC
-31901B459D2BD707FD79F629C68F94B471FD95E4A4BA996AFCAEE15557C1B167
-4649CF28A5C8BF857C3A63754E8CBA570E4235F179CA3691E948ACB1FE92ED28
-F82D2D96E3CEBE59FC117570F19F364BD092070E06C69A40B6F53F5912841BE9
-AA6238E14A774BDD8E13060B20BC8498014F3A5511AED7544BA9CA3BAFC4529D
-27F430F14C6016B7A5487FE6BA6EE10545A0342C8DAF5EF6D6FFD4D55F74F406
-49C557FA75E61BBBFECCF67C0A512C23559CD71CC67A5788ED0282B2F0B8D6F0
-3FA276675CA5F2411929D6ED8E1F3C3B6E3011B46CFA2CE18AB291C7B3A7208C
-DF161C0B2C23A0000819848C490EDAC1C320B5A7E60DDBBD93003387298D04F3
-1EBCFCA1B17E3C136A9D60080DE114697682E4AEA88E2C61698E2EE9E38A491A
-5E10BA3E6AC61203642C2EBA3BDD759E15F36C75B4FC4D58F33BD9F4E1E2CC64
-E1E88E22F80F0F160F4BA00ECF5866717EB3899617C21D1ED5F98BF2AE74DE49
-F3BF8CBD0F8C68759C3D4CF56EE723B12ADC58ACE93CA4274A89C216AAB3419F
-78B60B263A44B1EB69C07BCB1F77E2CE24EDFFA75A88D5738C75424150EFB5B8
-9D128D3C20E4A1517E4C085C67F1EB943603F4DBD591A617EC740373B5AE2DDB
-FBBC875171152C79AD3BD887291433489521D7F6B4D762FBA6067EB6AB5996C8
-32B1D3179BB3CBDDA8A23B7238791E2DF97C654B8A8EA305EF4951283689898C
-0FB114A5EF5F29F9045C7817EA7D8E578DD48D8806DE88B68DDCB879A0AAF44F
-415B911131E45C4CD5664A1F35179A3355B4430520D5C5D08F7B63ECF99BD920
-7EBAD74476FA147B94447E84AC4FD7CB8F850CB19F41D18210DB569D5687FC95
-0CB2E776FCC5BE3AB89C611F488FC07C2F8A77DE6C008208DE782D24395BC158
-5EB7FF2D4AF74BB0F10D8EF2F1ABD2435CF699EFFC1E7CD37B4382BDAFD2A83A
-23419D5A7DE1F19EB03D7FEDB30D322BCFEF3234580A91DA108FA4EC4F2091BA
-D169DECE3AEDE61C07E2092A80F6A8D5A8E4F8C24106E0D76B71E9B63F9FD9F5
-3F7A735CD61228364E76D65077B2EFA802E15578F4785708DE8A509CA8A329A6
-9194B07F1FDF2FF3EBA62BD318F0ABB3ABCD32B4F77870D8C4F964AE4FB32723
-3BB395D30BCCA1A06966788E2F8FF5166985D83D0BBF0C0DE778E246B3B724F0
-2EE098B24EF06F6600BD6EC4F109FD2CD765F85E04D9C95DDFC7B9EA8D14A892
-AEC2C060A7356B297A3864FDB434EC80D577FA82EE91C8C43A1D5C6DB5120316
-048075EBF3A7D88AAF3CF572A1061617A075B0861474D4ABA6749D14C0272156
-4B8709C55F7FA89E47C8348E8181BCB4683A8F3AD1D9EBAA9EA7CAADA9D8E939
-0422BDD77C9C023E7E1DB7AE1F94FA53E8C9F98C6CF9A9F11D99F35F2310389D
-B468F37C3F0C856B9CA592915F91BD94DA48DD620E1B07DFFE09E0EE181EBE44
-75228558C1309B0ACF02BB225C7640F1453E89F9EF8A81752F66538498B835F4
-06DFA17EB45FA5BECF212C55F27E038FD55C6BAC12CF6589A150AF8E61F1932B
-AE29234E26183D4C05ACB111BB0CB06397264606C3B9043979785D77B17B181E
-B6749BD23196CB92A90CD96418B7DCB67C6E361726573735EF5406CE233A3E7D
-045BC9FFF1796FB53AEFCA6A13E8E00EC0583E5CF1546572770BBAC0F8E15F29
-DCFDD2EF48CEEDBA6E8DDF847396BD03631A20CFFA2D980AB6A8449F07A5CF5B
-8B21931B2019B4E8EA928C26940EA741038A1B7522B62A06B78FEBD9C88CEB72
-17FED8435A7EFA0ED35B36742CE23C508B0940A362C7AAB5C3A0CFF8129D7085
-12AAD5A82E3759AB1A700007A16A911E25B895175D3286FDC3E60B038D6D1E65
-4E0AE7CA2A93B482ADF9BFA97B46B314607D2D4227391DA382D4C2E0A853D2CB
-A9DE0559A60ED27AAFA24AC31726E19A213654E8DE43098F329C107E71698815
-86B7C2DF663DFD34504AA2F5AA848D3FBA32A8C21D3726A14626F8E253F4503C
-2AE03FDC57D866882DA26B319C3DB35DB4797D4FE14C8EDBB9E26B130B9D25F6
-42B006483B8541F195EFD48890729843BD683E76C3318701C0423997AA40E8FD
-214D5C28D6C37FAB59AFD4E9B17C142302800B02651FFA7E10B9EB88C993F559
-BDCA7958B2629DCB21C5AC2F139B5341D0795B594C2CAF50CA3112E030FC9E60
-EFDBE4D5CA899E0ADA27410CF1220E3C100148124120E104FBA6494CC9D8BF39
-6485AB8A75E588FDA7BD2E8F0ED89E87796F52AF8800C9BA3246C0CF0AAD955C
-15B545540748C11F32B970D7CF9C16F4BDB2908485E27807EAA51A3CF11BCC86
-DDBEF33E2B13994C109C7607C4635CAD863FC7D1E49051EB501E47D8AF8A96A8
-8DFC6A2A908FE78A7846016C2071F930FD2A3E5050E19FE26CA09246A350839C
-C7A06F69EE29B4826409249B8687744B1C28B1E4EFC4423EE93403C4C1DD054C
-28C48DCE81C21EAB792BB74E7C173EB784771199CB163783D232A735F74D8430
-5E488CCF55B1550C2E63447F0622B407D3B680EFB8EFD504E88F1F7BE09A97E0
-217565473AF1E7EF0594256AF56A4ED17781F897AF7251ED8B1680043AA64B60
-1D7A2BD9DC3F4A9D07B0BB2B3DACBB2A9AA3F3DE8D747016983BAA7C21BADD68
-583BC8A37D27DCD643CAA653C50AE9D4B40719CABECEAEC5AEF9419A8A370DB3
-3172E5DF5EC198F7E96F26C4EC7107432C2D8C7D280039031096196E57A0C3D7
-4B91EA0194685B4D933FB898F90BC9B31552486F1918653B50B28FF81369AD88
-39F875864F938051CBB1D872B193338E68135091DCEA243655FB323278B92E09
-D87D8CD4FCA034AD7A218B864A54FB13F39491938E0094E46CE16990BB47DF69
-D236799B02699BE88B54FB17C80092DFD628860824F789000BE4F2C3BB2ABCC2
-4447F49BD36B1BEEDED6FA3B5CDD935126835080FD2AC78D04A4DE3A153F5C9E
-23D4598C9CC923FD9AF0B6E47D50403A6566E68ED8655AECBBB4D4D0C0D70287
-D02AFC5FF37C660EC894A4ABB0614FC165C256AB968DEAD57414F06746D41E0D
-36AA18F73629BEE12532B32F93E5EFA54000F251BE4ACD610F5168D32E0ACF1A
-98CF89170C4D2D9E4F057E38E7E5DFD61774709A823581B0723063F88E217723
-54627C11E53B904958CBAAABE93292A55067B04FCAED977C016EEACAFAE4B8CD
-09F39F4854CCA7E6E7E7C1B9702060C781ED45C8354D3AB3923BD200BB2ECAAA
-5D767EF34D525398BA831973D9BB67903D9580FFFEE1AB2358EEC23EF38C426D
-C433391AB6229752CFE6EF4595299E02383FAB46AF8B3E3015B6CA441839DE46
-4841FA63E8A7CAAFD0DB875B0750AC00A4C4615EF8784E0B70AE0C00BA83532B
-98351D012A8994CCA18D3AA36C2E7AF12A051A8E166B2C57EA8A23AD2D66881A
-EDA79F565573C76F1249AA10C1DE4B60B51220D6B946498D9800B8B59BE65271
-A8EEDDB2DDDD19B273C48FA601CCDD84C5495F77FDFE22F609D4C8FE2DFC7BD0
-F108AA16AB5B34224C579A7E1BC8AEA267C44100BDBED6897528A799C2E9478C
-DA8F6ED505AE1410F0E4071CF80FF8D3CB5C1CE1B44AA7B2F38990E65D9814DE
-D5F2CAF8DF24154B0E54B58AAA2473F4A27F712A0C6690391138EA6A07CE358D
-213C6D1B0CB9DE945762F18BEC50C5E11DC0A0DCF0DC8A02CC2BFEE7C4DB0BBD
-9FFFF7F3C79F3A991ACE3BCC36785FCD072FD159E2CE9AD429A27CEA146BF182
-10EF72E4B329EAAC8B70ED717F0C8B4B2AD31A0FB0434652C01D42FE29A2E0FA
-3B529643E6FA98A66189E00CEED4A4A0D9A583FD9D83E8485C7569875F9BBD5C
-270B0859EF041BF4006DB8E2D32FE80C1C54C49B1906E58576EAFCE3DDA41AE7
-EA6660CA549BE72E06666D69F82B26222BFF5DB21C15B8CCA4D8193500FB0520
-F7FD4AE3196853618190C578F485DAD0D52D7EE45E47890327EE8A2387E26413
-3209DF5C93760B565625378FC1DAD322EB0373525447170919D40D12394CB0B3
-72859C51197352AD62F3417D147D88DC59C5CDF32543AAEFFCE63542C6E69B96
-1BAFB6AE012EB227A066AF9799C58A02FAC1227327FB5C0A4C3A83D105275287
-8CAA7E21AF180FA6181643E10B72E0139BA78A03A4FA97D3B64D079A3BA8564E
-14400D92A3794251E68CF55FA7530B64BBA2CC4AF800769D6F1CD59FE767D129
-D84B4CC327B4E27566B60B8505119C2A5967342B055274C793A624EDD6156478
-0859496478997011C584BD20CC9B6E950A129799A71BB917EF6399D60B62E6F2
-1BC2C88A955A6054DC6CC0CFA8EA2384CB34D381670B034ACC7B74954C6D3871
-60534C777E1E2193CAA62F14937CC9CB4ECE9B5F23346EC280F06B7A8FC53D6F
-EC0A91A2B5458D46763D6207BB6D7FBD8CEBAA2D028CB9C256EA1A9A04AC75F2
-0DA3B4021CB3F872AAF7828BB33DD137058B6CA96E9A371662CEBDB0CF2228D8
-BD567C88D9B813BF74D5B014E34344BDFC46FFDB501770BFFC22E3411EA26866
-8D21DF54406DB95377DB2DD3045653B25823DB046672CE0095BEC20B8F0A6136
-374EB7584F372B665C07441903E19E61F84A1103069F7DA211DE645F48A3F550
-1C42CC2330F1BFD8913A9EFD1155F2C87DC62608D532F4F5933A226322B91B5E
-CAF2A1061908FA76A09DC057B582119E526B5205CB52E77881A9FC75059719D1
-A0FEC51FAE6971FA9F981E7CE7A2050F426A8C1D9EC418825EE8EFA9D54A6C5F
-628205A912ECAD23572E3610DDA047EEF4457EC7F68CA82D2E0299D92ECDD09A
-BE7C3E9E81A9A72572E3AECF8AAFC39DD7FBB3DD56A1C8997207BA956809913D
-881A0B818F235611FB3CD8C3735AEAF53C5B6959A9CD7608FE2BA5C2A1027762
-83EF74740E37ABE827E61519FB78994F28C59F5BFD328171B825A4BF80C91E9E
-10ED9D71094DCE44B556B331B4DF9CCBFC21DE15440F2814F58A69A8643AD72B
-DD53A2CFA63CF29CA3DCA60EE2C558F3F4D0D7F6D1AF921D581FE434244AB4FD
-01C32682508A964114388582C645F32458FEF0673FCEF009CBC27FFFF120C57C
-0C5A9294023870A510CC6B5FB5C54F98FCD27CE5575ABCB1CC6F3930E3CC9895
-BFC7FF80C86E2608C3FEBC861C71F34C1F392B7BD86146590CEFF7CE332D8797
-BAE8FAE23DE40905CAAAB4FFD115849754D2B5B3A3B9B726BD45E0935E22ABB6
-CA298C9D8C313D83AFDAD44792AA29B814D2FDE9D8209FF3FA4DD21AF52990CB
-E0AE5B9B7024D8D8E147589B496771EDDCB46A8034B6B2E7D304B5299D44616D
-114328D7327730EA360AB2213EBA21A32930F323992973EAAC24BBF4097EE98D
-2C4BC8E7278923E8B726FC916C64E6E746F1E2DCE24EE57FEC432436DC2E0028
-375006996DFA4CBB077034D588E27C2DF082E4A4115A849E8B77FB3CE4B9241F
-E747E4A719CBF2DC16DFF86BD74F536478261827A4C9CFC96806731396036CAB
-DC301B8979F7D1B467323E0FA501905F0DD3075D6F2F859A905350285F8BEBD3
-C86186D8B644D7C07274A7AF96761464201EAA4E0694ED8C091326F7D2D0F464
-9CFAB448A108F376CB6BC533A3CEED71E6E995E33F8197F23ED966AB0595EC82
-4BB3BCA4DB7BB42E6593EB0933CBC7E404AD72061CAADAE15A94602A7554E6B0
-294F6DC2D5FB7929426DFB4B4DC90FCA08331AEA9D226D8EB21CB8CB2A4012D2
-027EAEDCCD4F4C17CF03484A94B824388EFF176962C3426A09979F84608628A8
-B8504D72E5040573BA7AECC13EEEC54051A31807E77FC5F480C8F30373B67E7C
-F9A45DAA5B97030E16604EA3A24337537D60638577913280A130C6D25C8FEF7F
-439EE76E361B3E3A46EEE9F6C61254918C666EE7A94969063E7C8E5023D8F354
-0CB1179A4BF4C009C67B8B10464C38B2B631DDF0801177681B7E7CFB941FC926
-D4362E86944ABF77E2C805815CD93DDFF46D574947A100854AF5BE55F0AE51CE
-AE58EFEE5D00DAD282DBB600935FD6D3676D4B35872E7DBF2E5D164495CD93A9
-E3EDC2A8D06F9CD7E6BB76D655CB563F2B709B1FFA45E486C1E2A46A5C2EB5F4
-3DAD30D0A21F3FA4170382DA80D2729EEAED59FA99800458B6E8C2BE642F01E5
-7181BE0C35DA1B3D85E49E78C65E7ACA7CBD3EDBB07C59D6AA49F89BA36F9C10
-E141D9B7EED632E1FB544716309F24651BE47D4BF099441B763567EB6156FCF7
-E90554411216854A74824113F4C7FB626A91F32CB824F6BFE607455317DEE718
-A0C49504B2817459B0BF87319085BFF82F8C2D4E1C7DFB0EF4A9B8D53C78FD0F
-5646B00130AB9F22300B69F3FA222971386CE71B4EE23006914F73B6AEA13422
-39126FE987F592176DCF482BA5B61AF13809512957A15EE3A1298A8BB5A11AB6
-314434BF61067ADEA42FAD97CC02F0A89A62D96E9E6C7B06088C3E02044E78BD
-F479A423A44754865C36F54E154D663CAD44F635AB03D62447E25F5FAB14CD4B
-86DCAB14B68003A6715FC145A62A8CD1FE60230802E56A5D906465E17E8E1384
-EF93A2248C92AA69B30EF1958459F2B4E073EEEB207CAA1C2C81ED7EC203D328
-080A7E22E41386A49F7C50C7C3484E118CFD08F4085553D08F95E9641F2F016E
-CC589906448A0710F3D46F2FBDF6E11014B71D5B000FC8563300F3DB14F20C88
-1777732B61850770B1292132357DAB822EA0E82CF09069DA6067E8810DCBA80B
-E038AEDC46DCDE18811BAF4CC2BDC823FA0E525E4920AC49A13FE1F0BCE09595
-6B0A80B68659521ACA8DFE71EE72EAB21DA362841DAD6F1F50D20DE4D53AE3D0
-3F5C96727CCEB1272DECDA82BA27E018170F55EA2D94660037E05207633556DC
-4C8F0108367FAE02F1409DAECD5D0CA9BA47558B8FD450EF3C332E655D3222B5
-AD96C39A5F74DAC7DE60E5352113B3A778D97A49569411FF7B8502E1B27BA4B8
-741DF55BF75E51AB977C3F0DC4ABF7A654AB21C603A7CB63CAFCC87B5E60052E
-E091065CD32CD1E15237FBBE40B5E8D4C6C34AB13D1EF5C1CAE1093824FBD5FB
-562B809BE191A1C4E6CBB8D8C619536385C76FE5313F186AEF625C4D7E159151
-77F732524F5300DCBA3FB5EC9091CCC533F9D8D617D02E93A80DD924A9F8FC00
-08F1B1D0A1F78B36785C529C35301BED56EEC11F4940F12EEBDEE487C8AD94B0
-6E14FCBC1BA8AC32960AD9FC1CEDB320D53204AF69A56E4EF6B28EEF0C703DB8
-0604DDC0DFD2296BF919658C28D9027434980456A57577ABA0024E3CECEBCCEE
-BAFE230A285771F1E6D56DA431AC0E06253F141CD97988D7002598D4B14849E7
-EA30A6ED6681C43E5169F2CD31BEDEB51F29542D470C3D90E87A7DB4F11A9D07
-B740EE90E4A39F4CF3586C2C723C3139F33186EAE49A3FD6F11A79626E422CDD
-7D7825DB95BAB0C42AF78CB0E03FCE914A5489E6AB2143AB4D2B516AFEB3D4AB
-92D533AE294568FC498E5AFCE3C131A7762C43C94BE1940FBDBDC0A44087FAC1
-5F7EC321EC0E7DDB3925C94BFD150FDB1D3556FA8456FCE3FC3B12263DF3EDC9
-C184528E75355BFE6D88935A666F53A53C1606A019E5C6E328F787078B15AE32
-9F49454CD025F0D601098FD599642340A59A5D2E9226E4E468E77B240030479C
-14BA84F04B0A4063CE396D89EF3091467D212C5FAE02730A17879A1520D3BF00
-BD5E80610A75E4C3581C53674B4D18E3433B24841C20B7CD7A63C99511366927
-0A117CCC8CCB519DBA75940D75897C664627C88B98B4EF7A34CE5A9FB212777A
-FC65DA6A4E1BB920494407828F19501A649850F6996171528F5A9E0740DC5D50
-DD72C991663F1605D53F7D64EB94AC101380718313DB47D43F2F465616F7949B
-E46CA304A89594023EBC34B252867541C336D2B534DAD7AF58653956985F0AD2
-D24E9C4B75755A5CADAB35E11047510AB4517AB2AE659E42B7C4E27262376BC0
-43B6FC44E67B3A85A9442EBAB410EC5A4079D690C3DC2284A080A520327DD98D
-8B9327C6F3B24B0B445D09030E07297E568DFFA76EE5B8349161CE403AECED8E
-1B539A2B8414C0C45C5D99AEBC72E97308F6BA250DBBE6D924591A4CDC18D6AD
-E9988BF0EE0FDD981A674D98BB066BDA43F2E38CCA7BC274F8B3DFC9F2AC5235
-01FEB0CB145AAFF3EFF9DD7884A228F417C8B1F62152915FF43D09E3BD3FF648
-30B06B57033983D6976E635939D746F194F3BAA218B2A37C6E27FCDC8BF8A0AE
-5B077E8F11A5A9C23C24E4E0F28902FFCC81DC60B243E20C6789BFA50A86C25B
-EA4B440A7FCDCD171331DDCD591C83A512B2B962B1FEFEB9D334987893211AF2
-C2A6F2F6BF83CFCA266AAB342A7604EF55D4A94A0B9BA8247A328697E3D633EB
-4DB8EF437A559CE366B7F84E3707C6957C09759CBD4C3432EDB02835B16E6F76
-5DD95A0DD812B06613EA5B80EB037010E9E4BC4A73D79B6EFF0F40E84BBE57D5
-0399F85547D3BBD324B30C931C8D48A3575124BAA6AFF4C0A857E99F0892EDD3
-563B4B441817EF65B4430591DCF7778EDCC73080CF9BEA32ADD6325D5DFF6292
-DA21601B493AC7A1619406B9A62F7D1A31AEF62B95B3ECED8E12AE21F66CF90A
-4C82CE92C5EDF3A29006D9960B110F2F732A0407D2291F4F4DAAB8E8F2C7FFD0
-EF48EE5901316D4A1556E16700248C0CCC984B728FC9A89858C4830B5CEAE115
-9631A1023078363A0A217FC53BB20791AED526194E1F286666325CAADF009D9A
-D7DC8E3CD65D635134B149F806BF27B10E642868B5E26E1A8A59F6B0369B8114
-E1BDD480038007155224BC3B593E60F4BE8E59363974CFBADC8A322F13DC7FAD
-F5A63B0699F8FF5181F2CAA5B20CF8545E63E7C034337C748B3BF5B61EB34EF8
-2CB3639EA164F6F8A981138701EDB82ADB3172C77F3D01BAC1B1F6740BCE0FC9
-2B09BFD6BEDFA3CE8EBA804BBEE1258CFABDF48C296CD1B57D4A938E2EE41B35
-CDC177E6EA0BFB5BD493637C4174476CDDEBE2C1B6F4F90FB9680907158FA53B
-EBB6B96EE573081C420A0C1FA35F7E2A5EC39E7A915E466FB7F4A750148E3CED
-EB6375853DE4180252E790FE09D57373DC8CA5BFE68DF4D9FACE3A95C2FF8BE2
-E342BCF84C98F2E07C6449732D7885050D9326172596CAF8D6C1D5FBB1A35DD6
-927367908C3DF2155AD9B651E02E56341EBE697F5856CC2811E58DA6BBFF14E4
-46094DA3EA6ADDAEBC29C3FC83A549D883622B1E02CF5C0C780BAA5B3C84D895
-39204F12F590C1F84947657EE2AD21473F766CEC0802E662797DC0322D13FE9F
-309982171134E7102DB9FA3245F906CDF1C2FFF5208852C7C4E9F7BC95803D15
-F7C2717D78D75843C3D5D4AEA4507956954DAFA23DB15D43B26121D03FE5417F
-2609A9DF71782DC41990592A6E81D9390838F1F753D9A3C003B0F2516E8D0689
-7BD5269E48D8BCDB266041F51E8BD54AB37120725945F25769DF62B8F3C24000
-C38ED31E14974A6F4FB99C87B2DB02A4563742A0FFA768213E834E4029208966
-BB4E4AC13F8591A02C59FC1DAAF725341EA72CF61C8F1EB6343FE99A924581B2
-CA0F034285758D49CE07427C96528834AC2C99F8BB4A9223AE4D8D2B113E769A
-5DCB1ABCF2695477B7BB30755346E970FA500A6575189E453C66DFC966F4C088
-B9DAC012965BB890CCC132F4E6160CC2B113F5C908C621AFA34F1D95F3DB2332
-AEC26440CFFC0564B57B4E40B484D93CEFED8768DABF83A3788F5B68239C40D9
-0AF793F5FEFCCDA7383120660A4451A9ACC99D10B232D25075EAA46D39A3D8F8
-80FC17734B9363D3FA70E30F3CBE102BAAFEAF854C1BB4944CDFA73A74BAD32D
-5D0760A5971B86735B2F349970B0311D9B36A74412F5F7235A497AC3EA69FDCF
-9F8AFA9812353B45ADD205B5F31B2B9BFA46D08FBBBD4CEAAA527B45679B55EF
-87DF44F0539987ABF6CE2E7088DF7AA13A515ACCD17BFEC5626F01D97EA9CBF3
-3DE7E57ECC531119B97695463806D889853FC8AB6EA6BAA44BFFF796C29DB97A
-FD6675ED1859C61CCCA85D672104B9F20384D2973797BD8E77FA198BE97E7B88
-D7EC196CC296EBFA08A048C60005DBB696033E87F4FA8D50423E5C58CAF32EA9
-F0669FCA67692291D86BEFF717D6C5A1E0AD6A75C0F7E3EFD2F7A5F5AD7D92B5
-9BB4BD9E7B6E7E337ADC6ABECC3C1B41073FA3A25A2FC1640DE3AFD97BE7BA03
-95DB5026086C842BCEC3A6A1C3DAB1D50DB50261A8B19A7CDD7B7891475E53DE
-754050D783D64029006A5BD200B6C64D18EE7576C68E30E1D6F762E9A90C9566
-D90FE497B27A9B52223A5DEA20D7A67FBFCA5907BB0496E10D87FEE2FF90C895
-CD69414B219900CCF5D5E73461D0948FD57B8681E8E598A25FADF80BC88667F9
-C871B4F87AF7DB9797A98B40BC29CA48F614F754442AC9F5D71D55D14B93BA67
-180B01E51B781345F1AEC0E68CBEE1270ECA7B3593BF4E3E4046CDD4FD9703F0
-59822E8D30209D01BB0E404EE693ED74480B179F8431E0BF3FFF6F404AB6803E
-782F592E87FCF7B811683DEC0F6DDEA4D5BCCF19F1842D5E08C16E4D61952D46
-2620AFCD1DCBB1D3D2E38539537B40E291FCC6D69667C47DC77742A8C01149C4
-DD0C08470FCF10C1D5C02985AD632A55C8C86BC7604D8438DF27DDDE6F773051
-38E268C9D7E72C12EF3C02287D229AB27C864DC7A90F6208DFA2B2EA0027420B
-13637FE2AAB2CD0E90C1BB3D58C1A1E92112353C994E4A3B1FD71781CDDC7237
-A97299CBC0E704ED11FEBA7B3ECA2A1CBE15F38BCD5999525D24200B0B742553
-3FB0065C5DD170C57EC79E9E04D46BAFD0FC8C9FAC2BDF17B5B756F9B0BFC0B7
-B505E533CBBB6762A076FD1D6140C3BBCAD87AF61D1FC65613C84FC7DB3E2260
-45C8A31C5F4E98DAFA54C7730454F66C867143D2A81D841400ADE0DA5BD9F992
-58C51B112AF3674B454C138B3B087FFCD596D5F8C23A5371D955CDD247F87229
-515388BC8CA93925412DBF27DC507D29436A64E236465C3BE9C5EDAE31EC5CB7
-FE4A32CB0DD86F5F5FCDB616F45FDA945A26565818F62FB21B7DE86F61160A6E
-BF7A74682E9EAC5BC99BA5709D96E52733F71385693E6B75BFC0BFE73B8F7F56
-690CD5BAE46F2E7655DC840ED4B1A8E1BEB7F956F586580CB3C73F144872D838
-72B7A58281EDB4576C06815F79EEF626A1269FA5A899B6C2B67CAAE87E737DE3
-A60AD91CDECE2F5FFBDE4D84179AA3A5A84CF55132C7160744A0BC0B30A59B8F
-31BB9CA6D079CB016EA257EF19FE7787EB73158D1589DD2CFD1E6F5CB343A57A
-616111909DCC5EDEE2194B0648D58FEB782562D469BFB04A55B027A567E6931A
-4ADF8ED23D57A6C2F7CFC24186BAB1D1637520B2ABCF18D78F69F5BDBF4D1859
-27340FCDD8E09A247752C05ED51A08B063FB3A21150ECB022AE818E49AC126FB
-B0BE9023C87E2F15A49B751D03EB78B55FA135A735926F6C08627D980DDEA027
-17ECD8798B9259D1073AEA2364F08F75DF3F3039C2A5268210941212638A9198
-2B9E83C5325C1A87EBCC577FE081557F252EDB8DCCADE7D92B6F90607D635CBF
-B1CE7AA040121AC48BDD09EB9A78AD2C004C2852CC208844EDC6C63C0ACEAA1B
-02006551B614463B87156ADE0E336773C7B364175ECB202EE9823D2C11DB4311
-A872159D70B91783BA0D47375222A677166DE6B2D727E8FD119769BDA354947D
-B4AA82966AFFD527D160DEB0E5589C3FAE2EC11A09A41F9B04A947453CE96A48
-203827A9CFF9B84AE9B0DA3F
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/l047036t.pfa b/lib/fonts/l047036t.pfa
deleted file mode 100644
index fb500c6e11..0000000000
--- a/lib/fonts/l047036t.pfa
+++ /dev/null
@@ -1,1361 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiMono-BoldOblique 1.1000
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.1000) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Mono Bold Oblique) readonly def
-/FamilyName (Luxi Mono) readonly def
-/Weight (Bold) readonly def
-/ItalicAngle -11.3 def
-/isFixedPitch true def
-/UnderlinePosition -48 def
-/UnderlineThickness 96 def
-end readonly def
-/FontName /LuxiMono-BoldOblique def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-29 -211 755 1012} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078986 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D83E1F4276DACACA37DF93
-6E81F12A36C75497181154EAB28226DE282D3F090A9E260BE05FB75D62F0E576
-938A5E3E63A16FD101E72F7A3306261230B60339CA66A60A810D6560F2BD77A7
-B4702D2F9D75A595C875E823EBD7C94797B3BC36F98FA25220790470D2A38DB9
-0E90AB4F3609A1A013CF93D016E544F4E385663414AB2B2927BC000A9B3E0544
-00B18DE5B168D06372C55EB16D6D952F716752775B0B8BC63CD5A2DF27C0E0C8
-578EB365ADA6493181D9AB5D7B8AE30E2B499F952D65877C8E38EDD7DB29F957
-9D09EAE5B1EFB3F29CB94FC40874DD2248AEAEDC411B39AF2D35822F0F742AD4
-DAD1049609EA9CD325557E8E160E64239BC87CA11A7E215BD050A87E55EEF494
-6198CD3AC7FFEBC6D44FE051179BB739FC89B74B5183CE255C10320DD7407CDA
-65E13878AB431E7B99F49D2E6E1B39D152BAB31A5BFD73BF6D298C2E71EA710D
-E094C139EC016D48233AC2C25E8E60F168DFF50892EE10F66894C471861B784A
-BE82A8A08C9BC8FAD0FA2E2D84406C5522CF6B9E46ECA79BFF1678DE26FA6E29
-2C3E13C38726369542682E88F4F3C0596C877E0040063BB3962ADFA6CF3FE9AC
-B15B289FEDDDAD64E40AC82B3D26B1593C4C8A90B99493E33C453933B127095E
-835FF7B340EE9EF89A0C792D4D0DB38784BAD3F484CD951F98B89F93824B729F
-8C93C7B931D025983DB5BB21D2560E444528DF8EE5A07CFC5B5B82275CD64CF9
-926EFA32B59335B1B6E709A62D8C17D278781FC619AF66FED15922229ED441D4
-008B81578C0F30866E20841D389875795F9FA5D573A911A573281A1051293A6A
-5C21938DB0F7E4508CED69E67D1F4C2BA55448BAA255E0A28DFA983C55260E54
-2E01F5372F15F74B785BFFC7502DCD104D2270B0B738BED86DB0F1F680F67408
-A9A806F586C0995A7586822B656B620E9B392D3BAE3AA5EBCBC86358CEBA1256
-EBEB0D9B5DAB1CF8F45D1FF5229ECEA379729F326E85A8CC963AF8EBFC9D84A0
-F5D7D4B3DD19142D521D2D7F96372E53EB54527D6E2EDCE42912D0B382FBD266
-4BB5E5E8FEAA8D4EA4B63A6497C0B276424F50A5E23BB17ADC8592E0A88247EB
-420D12CDF7417972702B41738B7E6819476362466410CB3BF8452135B16E6F76
-5DD95AA1C99CFB3F988F1C895AA4C434076FBC66297C8BEEB146CADC7BFE4038
-CC6860C0ADAE8C851BDFF35EB980B8B4CE3BC9C2F2994C4B76C25A3811336B48
-7BEACBB256D0C91BDF5B94EE65A4032D238B59DC55D442C02553C48B1D4B8ACA
-2FD1418A19576FF0CB0A58B41BE33D1810D691836F064809AED5E819D30AE1E9
-0CDF269DCD6CD605AD27E3262D25A2245933A08689A8FA2C7910938615C19CCE
-8529DAB09A8CCB71847F5A79F8546B054E6E2568A39A316267E1B0C145DDFD6E
-199C481BA1233D069EA926B81F1AD863C9784E281515F7CECC2B4845634D77B3
-70AC75FC74269301F562AA2B647AFF0572FAC99DE472A9B8154812ED7D0880C2
-E5A57DA12F51B724056475519E205047F52655AEB77EE422FA3E10AFF782CB25
-E02AC8572678232A611777FC31914196BF83CC82D2102A5BDFD5317063918EFE
-10B43E3BB2368B7868C178B1F940512B463F0D41B85D6275EAA75856AE4A5CE2
-5E3B7079EA624D03443222496D6E5F28752F3955638A06CA42AE43EFDE812EB3
-51B65581525C8EFDD17B0514F3096D12ECF2FB417DC4F3FD866D7F3A15B7E98B
-078A37367794D00DA2C72512A788A68AC0324935A25642C30320885272CDFBC6
-89F87070581BB8E902B500B878936A270441FDF0731517F86C512E02699911CF
-2DAED27087013873CE750708EFB2DE9DDA19AB4387E4A5E09DF05F620C7E4519
-43A4E391BA3069202557823519C6D07B4AB3D19CD9D081CF8AB9C8E3B2AACA28
-A6A1977A7C8609019A0A716631E692AECC540BCAFDE9073E2AA7C6BC1F9AF124
-CBCBED06053F8B176F6EE71C6D804F5CE9187A2CDCE9A5B5CA28A07C8C94E328
-6D29D9051524A60EFFD07CEFFC39592E14D6F1460EF90059129AF3D989144A5E
-0DAEEDF5EA6D1E7F7212291541F0E1A1DDE0CFBBAD2DFCD5B367227EF9F13F57
-0EDCC40844358B9C95764FE0981D99A793DD6260BFCF25A3F660DEB9EC5397E5
-D33D526857E454BF2694C50E7558A060C292050D534F7212AEBCDBBB622ABDEF
-F31E6B6BC528B7AB99169BD1DC4070D883BBCFB69EA73E05AFD18DF56F31B251
-A1E8C9748915856FE50D441C0F968B7240688CA6CD661EC9964D030BDB6BEF8D
-3FB25596A888D7530E767B60FC3C85932525DED921A63D7CB8D84169522B336D
-368901BE9754CC72DFCA2A1FD4F21C2BCB512D6B97D07F9902EEB1338680121C
-B2A6DD32F54632E44943081F80998C0674D640CC003BEB0307B51593BFA99CC5
-380390D36BF36A83618064BF63EDB81D5347C596D9E43291AE0D6083E6E10ED4
-7C78856F1F36C5B5C9A7570A654A86002EFD2D757CE3D59E04E2FDC681C3D297
-C8B8EB8FD5821FE4AA3C35B2B4EB97B45CB0AB7F8AFF57C861DDA0F78FC053CA
-B0F01FCDA6EDFC00174F62B4ECE8914AB495804E9793DA4587B0A295A8626A69
-64A1B3C9B2D828B60BC6D18F19B604AB72D007FF0B571BB42FD6BF692C887C66
-D21540E2790ED44D117E1C942FA69694067FBF198FD8DCB22FFB10D47F75F445
-59FE728C24B0968BB9EBFC74C1BA3D42858DF3EBBFF8C27E4ED19C4F2ECDC009
-EDF6F19E1EBB4A653C5E0FC6F01B30E89BB1D5D4D232034E8D1059334DB204CF
-6C75B87ECA4995A322BDE7A2B9B3F355A191E86A3B23AF11B52ED596A91B46B3
-8C03B34F328992BE927DDC4B153B615F2C55224167A957E4CC442C041BE4B961
-9EA06EF6F76F093FA3E672EF104FABE172545E51C4666C0BA73A6F08948D05E4
-E54C4496EDCEC0B33DA14FFA172A3E2116F1E10A04BEA1269E38F396C857DC74
-3DF40255BCA91906CD2710ED5806C6C6A4688BA557B78F5F81FC9764E06D391F
-EAE0DF580AB7F045DC04A3BB886BB27AF53DDEE38D38AAF35CA96CD3F5C869BA
-2DA4D9927809677025B7007278E0916FD8B5FB793BA74DD627CF29E7A3621EE2
-0951BE2D39031BCFA002E6FEF53EC0283247145B2947BBE8BBD3E7D5C49D9A1E
-E8B6C05774B1A339A469C677BFF0B30CCF7325F9077349C96608B60F44C18101
-25E03F6EB91B25562A4F3738977FB3A463C0B8DB6B771B3145D44CA360E54E7C
-697750053AA18EF9E9A3689B6248F124A75C6DBFBAF5181D8AF35A6152641092
-320A21B984DF101293A365918C113542819414E0462B6697C0993D8462A7F853
-D22DEE0AF329705BC81F362C13CD8FFD411D53BC4FDD03A3F5B95AD75FB29B08
-D5DE5830C69B2DC4E6B8423118B1069A1275CB6414D09FC27CA353B8B239AB41
-FB8E8E68E175B3793818C22C394932CDCE1E17FDA48E8AA619583D5E27A8D06C
-9176AEED7FCDE33883A4509A5C8D7F81BA4F517888265E57D756314626BF3674
-F0F327380828E9D129D8BC8B352658BEFAE98218BEDE1C0E9E2FD95D595506B0
-70169BC18FDFB2EB5B4F216D07D878FC92B08DD94F5D1E06C3B20A15B5772A29
-79B770D5C82EB260F821CC53E97B5FFB84FC936D1452A11912C9D865B1C4966A
-C9192A0E1CBC421619AFC16EAD4C75ABFFD0F801447D9E197A3D8049B859855B
-E61345674D6D4BD99C94B049CDB1253D45C14DFEE7B17B8F7A8DCC9B26296657
-E7F033CF55ABC7A703BC755504EFECE597F0436B98491E0A8B6B128C8A4E9B22
-924D33B6BE65CD0470871835C856E25B491A527B1FFBDB8263A64E7DA5914C24
-1C4B7798424AD3AB0E7D97C0EB3FA94215F98A2172FB9AEA3AE44B04F4F14505
-C229FA8974641636010907CA68786D1C84BA5510A26EBF0D9C23E7A0EF4C4E7E
-837392A223C16C7092BB2677A0E6C3BDD718F8C16DFC2232440EDD967B305F1C
-85346F4F5C109A902DFF10E990732992CE920D95F999C97948BD254AE64AFC2F
-771306DFB8454F8BA062AF715F50C0CC1C0B40C039D8A36CE350CA5C858607F4
-0E86B74DA44262C3F0D2F8E19D6E3D93683D204F9D506481C3022A281D465DA0
-2C33F3CAC0C9E357A1B96C24EEA1E4D6B3CE3B61E84ED48342BA80DCB95515A1
-964537E23E8368316790E6F5810FB266DAD3DD8F72FC219C7E7162596B4441A4
-1ADF396127473EB8FE164B52C251F3C997B726FE3F437564A1E5F455B595D20C
-F38A1BDE3D7A61691DA09F7D8698950883B397A9AC908D69CCF461892FD9AD5D
-F17B55B60B5378F9846B7570803990AF00BE3D92E40A62C9EAC215ED8ED4F12E
-10BAAF1BF1313B88FBC92C37292E2C431D9C5E7D7A6E8B1E300E0B8C7E6B0137
-3DF9B8CA1CBA01F68FF29F608572859251008B3CA544521593A19BB470E35DA1
-9749CF4B5BE790810DD78DC9C28C310F15AEA54D23D58B2449E93C5044D70229
-5EA791A06AC3DD5F512401400561419EEAE9D72900EE6336B6A8DE9EB91846FE
-14BDBB2A318E8FD269AE8862FD5121E402D85CFD707F844F02818F003B4A7C71
-8C03A18E097FC460ED1651C34B2C83A08DB246AB16389CD1B73654F222A16A96
-132EE0772CEFC1001FDAE643F0077E393AC5E328654F06FBB16490AB1C4B1016
-5DE8437C5E1C2FEAC4DA3E73F84266CC47928502B1FB5DE4A160A9CDA7E876F5
-FB512D043832F0B3C3AAE969C5DDE3515C19725D7573E0890C2A0D64676DCA80
-1EC2E72C1D93A08755E8E6AE34788A7EE87B0198FD576B798841A289C3E4B18B
-89438BA3EE74BB0ED495FF8F2DBBFBAF532A14B0D75B90D6533DC439F65980BB
-F081B537F94B4C48FABE0873D12EAFAE4CBF3779D34306071814D2DBEB3CC5FF
-0623456154368D68D16E478358590539195654C70C9C8C814F0AD6BDA45AA546
-3F309D22787B7DAA56F60D65B953A257254FA3054727A57EBD5055FC96BE3C9B
-9D5B11BD8A5D980BF5C1E1611D0EF6EB000D594491579ECC8F45962ED6228A9C
-AB2311B7E09D3F846ED366963BD57A5F41F54130103A97401FDBBACB880A8E96
-70F230922715A6CA9D88B33CF4C9CBA196C3BFF1521925AC49E514689B094159
-FF60C59D3D6963F72690DFCCD6740A1C0D274CD047A83F7630BBEC073AAF67DE
-E484787A78C170FB8D900ED4C8351FC64C75BC7F09089EC8D56C11C575E22087
-98B3FD21D1FE47D7899B908DBBB80C0CCB0304D491798F5090173264AF3F5622
-E97C4BAC6E22D336732CAD404D51CDF3B2C1F1F098244A8FB998E77BF689062F
-8EBD6631461CE66217694515BB0BE2F5A97ADDE9295001E5BBDFCF1CA8DF1312
-2D9D444EC1438AFB1E1A146D14A8D4D1FB554D8A8B7DDED6D01B3D3FD2D408B5
-6CE034520871339B6070567003255A7C685CF7579C5A9612D5707DE094D3DEB9
-1253809352F9170EB020BC26CF69A274B31F99AB44386C01A02D0F3E4EE49BEF
-7D85C07C685AEC301E0323C9554AAE970C5874927909BF8A2F48B553DEA37057
-D39ED353AC8F7EC2279FDCD395AA162354F237BCB993AB3311433B6373B555F1
-BEC82D844D2D51CD938EAB2CCE3603A46DA3C9868C3CD586559C403F21925AAA
-51C60451296C01AEC7604C7CED9363536F2CDAE99A774E2ED95A60787872E132
-311E1E8412AF134BDC094597C80BE0535D81ADD7464D4DDE57DD2BB020D0B57B
-C5527E84D4A7FEF6CBA439FEB165E0629D08E7BD41C138CB1232A2B992540D3E
-9626A62FAA6F64961B56E454CE4C918B57560C08868F0F262E79F43D7EADADDC
-6B42DD8DA70AF5AEC0966C0000A93949CD8B402017EE23B806ADED418B470DA4
-B7732B8CEA6A2464B35D3850F7B57596E5F6AB71CA9DAEE51B21C8D093D159A2
-10F4752F4410489CC6734735A4CCA0CB0E6124F38C5B879715509A99A5FB7F8C
-3353A4DD03B43F41117B9673E1B8470579AF8706965AB50CF5F402848A603E9F
-60FE3B123838A090E1CC6938DA3DB19908BEC6D92BB5A0E2774206CDD7EC2969
-186EBF848BE9EDE2A30DAFE89349062A111B53346E44CCBDFDEA993DF7E4D06D
-0C395C514E3C9BCEB7F2C3B7BB6BCA214F7DDCC1A0BE92BBFB04601563686CC8
-13901FB618CC2EB8B07E7568451B63F8D294881CF4E03C492871DD81C435D92E
-8247C5D3D3501CAE89D690ECBA5B0FCE995DA9A1A56B4A0EE568281C44589A46
-0C927D6FA7873DFB85137FC1A712C97771495C98F86B46968C3E9C62AB80A93B
-C5DCACF6ECAC4E0827809FC0A0C6B588170BACB25B3CB1E99A38CE73DBB6D0A2
-43E5A0626FA8019557FFF1B27B4EC673A3775641C4AAB7F84454191383E77E96
-3D309D17B3E74998CA515D9B80C329EA920A7BA8E0097AE066B5A2F83D7A9456
-78738E0CEA73B15A4DA0259507501DF35F8AED1E9CB8DAACD2AE0118428B06E6
-4CF0F812B618E7070F36C4A9832FC7348F2055BF55E5E25853F669BF1415B67C
-FA30F3C3BB89A96985E6B82461AA8016A93B8DD61F2AC7E607A86D84291BE847
-11A0AF6F40AA08BCC6464468CFA7C9B0AB741C3CC01C14BB26F6F7CCD561DC7A
-BC38619F3D445BD4BA31607DB4AEF620CCFF5DA527261E7C7DDFD6E22E7B1AE1
-AED11E8DC5132A1C58B15B82E65DEE25FDB5E4F53403C99E2F67FC074412DEED
-E83E53B23C4A571828C79AC3FF17D5701354A14B83969FDF984BB065FC0A6627
-1772E33637A3D303B652305DF8DB459E43637411B04312DD2F7BFD268B209A10
-2B2B3482C84E4A1F27430B729CF6C3A25116CB81155832670CD8EDC17C9FD068
-C07475A76F7F37D84C905CE96B5ACFBCA703A19E35DD2EA7060A8A6C6BED4209
-5620764469BE1ACAC422E039D35057F5FB68E446BA6134FA05EAF51D70809586
-44B539790748F9B7C0FF2698FBBEEF37D318DCA12FEC1B32F88BEE11A91E9054
-BEAABD1723857DCF87B13D57AEF68E6CF2CC31AD340270607EB6709E113392B8
-0459C10C6D06A3BB7C7F6252621C5BA73BBD8ACBDFE20D7146B0C1CB96E393B1
-25002DB37DCCF2633EDCAEB9A86F618AD4B3A985A83CEBF0D62B31D0D09082D1
-6CC0E355D4557C8391A5F2716F8BBF01F009235DC8070600F473ECA33DA726D8
-EF411D558D5A8B80CABDE111AFF83C0F9C058AC2B9D053CCCD1DA44C97AF4C7F
-702B162E4CB347CAEEA9E650C076DF694ACB8F2E4364C675263D3A677A754B96
-20B67808EA3D015355F0888C406D1B0DF6448F2E08D9A164F955940D517A38DF
-F9677BE00C66FF5BC8D722BD91D66D22AC2AE70BC551406C69F9CF4B2FE69870
-634CA58D8FA15DE46ADA6403D52037684CEA2F5BF8E589B23B402C596BA54825
-9A6B0365E1958886E26E5AB8BAF31DF7FC9BC809E8D776A42E7E8DE876BD72D4
-C226133F690A08F11E249AC083F3A984B1D3C27AE4486A4620E14D9D6A361F3F
-38CEC60A5178D8F91893B91AA2D5D8FCD1326079F29E439C5D2C7ED3F5F10B4C
-A29C4E97C111E18476731E0013A0ECCE409EA27077F35E7F0505B9D49F2F36B6
-4DBCBBDCC801645163D605A517866E71288130609254E5D4BC3743D7A81729AD
-501A63E0C74EED7E1AB6D1328C67236F9780E50146A5DBA0BD8A402FEFD5A6B0
-956C11C68D14796CABBA701AA133C3432ED4679526DCBB089DF0F4C6780D16F0
-E90029530125B39047E4DD8CE1EFC7ADD58BA85DD905807468446504DFCDC65F
-4BC08B27AA069C5383128B36FFAF4A06EA758C511F6048D9E5389A2F6066D7DD
-D1FB36F91CF9D555934DD2342322B725EED853A189C698331D26AF00B9D600A4
-EACA6CCB05E063BB7B9DE8AB01CA4C071F31279524C18B52A9F92B7F2BE7A2FE
-FA88112F9D534284418689A7E5A8DC2F7E03B43544BCFEB4B98CDD23C4D7A48E
-457FF99CF93866B0BE306783205E3C525D1BC42370ED0C0643C57CCE4ED2930E
-6BDA7B6539D9A4BFEAC4FE186CBFE3C728D1DAB5D59D8E542CFA2154FD2AD3A7
-64DC84114D21E4549D8F6E4E2BA469C4D86987BA339C9906EA3408481198E71E
-7FDD1C135105790A81918A00920B17A56B11A78605571933BF450B408ACC11E1
-6D18B2D95188A2E878BEA4BC99CE430F3336D11B4EE22B72D7AC4A095E34DBD0
-14B96FD5A7CE5851AEECA990F98FE61214104B1CED07FF1648BBDD5C9E9F9BA0
-EFDD2F3F5A9CDEF9D514AC81EF0194BB22796AA1A86A04F77EAC27414E94D4F5
-FDB66069026628694DB03635737D4F51ED68BCECD50AAF6A24DB6E8B02D83A6E
-6C06A2126773A1898855138F8B98E5368486FEEBE7548A968DB773D3E2B31056
-F217B22DE4E359BD03B38653F959790F3CDAB6CD89DB03B025438070C1C4C3DD
-33F82E6793C7B922548AC44BE5683E28948218D1DE771768B4E01079113772AD
-6A9C99F07AB2A10656CF381D58214C821846C049DB3C4D8327C1C6ECED879CB8
-54286708A843CF50D9BC0F665CA7FC81774C8E4FF3DD40DF528EBB1EA735B3FA
-FAE0AE213414C3D527012BEE1302C7301A8E20CE45CE52430CEF71DDBEEA9CDB
-83F0CB20D791183B6BA77076BF912A48F200EF883CB1A28944F6AD9E19B139A0
-39477AF27ECEE71A9CAB3A8CE15F721E65AEE8D97D281BC2D1E8700679C46D37
-FA193E8C3B307E013AA5473E32E1307F296AE7A69B467B502752133624A5D608
-011F4AE60E1BF61463E862D182A6C782C4B0FB86D6028578F317E5AB05D2DE98
-ECBFD98975BAF5C7A30679179E047A1E382B8515EC3F41793BC3A9F8C86B2B86
-84AE948763AABEF2AFC145EB1E978EF2152F8927334486F9A9C9082BB4348795
-478E42B197ACF9AD0D51A26F0692E9C9F7C802ED28E9700C3F5AF42AB9AE5983
-CA8A47B5E286F8E47B05F344DA33CB13C65AE17884A929F5681CDC218C128AB3
-601EA443AD09E8907EEF59F83D52223EA7812EECD8E5A49A8DE58AB7300838EB
-2BFC53A28EAF747D4D375EDC1B904C705F4A100476F6E06855452E1E7A89430B
-643B6ED36DCA4E4EF4C9B637F7865303A5B32701CEFB270B2301D97A4DA4DCBB
-6695E94D42952F1D135403DF65D025E6D86299C4E56BACD22BF8D8418436F380
-C34C7C40E583B8FE3D4176B905828D6FCE052D0363F2C525542E5F0A0B25ECE6
-DB7C70809D53562B48A65AE5D98E299881F30FF096E53E8876B2C18C88706363
-B7EC370D953C44BF78A10C9B76904191465F72B1839940FC5568EA58D62CF1FF
-A986F9B187FD03F8AE785B16AB08A5E4C37022B79E96250B31D55BBFDA0D8B20
-067CD1E1C8608EC14B2A1B46B3B7F6A1A694FB5001091D797321EBFBF1708097
-D4AE6AB1C315FE5BAFDC7BF2FBDF894973BBF91EBB14B0B850551CB23A4BCC39
-0F5F6CB3FE36DD2FF66DBAF8DEC16F99910B7D856D0ECFE608E3D8A5B018FDC8
-BF9B929F25DEB245704A546A9A1AEA30062141DA6CE80BAC951C432726C5C91E
-A5A23F31596799F6E675A932A0338F0CAC2F52331442FFCA5B1570A498ECA353
-C18AB67E8164B828A21E9E4FEABE3B94882B2E819543F4E723C59C964A267DBC
-A2E8EA1D48018A4D4DE7608A7CBFF01C29C4AFE44B2662C0180F0C686BE89B81
-30A280D61C321C67B2A6ABF1209D03F16C05539AFD90DEA6ACE3AC539214BB0D
-10E39EC438C3C952399C07A96521C42FBD1EFF57971D7B06902D9BB9C9E32629
-FE2439769D67DE7103138B5C161E8D58C6B01884C93C2D4FC8DCF87DF00128DC
-74F6A34F7CF4719524FC8D28502115EBB86938CDAFF00C61D70EE4E1CB98D1AF
-436197CE8670D99F6CD73828CB3860D34C9B8B49089129C71DC3B4BCA918CD9C
-C8B978011AE713105AD89529EBBCBABFD85D629F058BBE9C14169B7430C835F3
-6365DB92E8514721DDA91B2EA0BDF9C9297BE12E2897F59F5C6886BF8EF6CD90
-62F5364E2D4363A7A20CCF26B24016C260F4660DD823E7995F575ABC3048E8CD
-EB0E3D0EDC1CEA4F86EDB1EB6F46EF5CE226AEDCDE6D7A9BD142F87053581082
-168FB0FA1632F6304772F83781D5B797631E3D8305323C28F8096AE577001EF7
-CF4B69C7A31DC24D9A22EC0B9352A35DA0284E78D342059B2B87E186BCC06D0A
-C2B459EE7B3506C9E79C72E4B3FCA87AAE77183C14FA5BDE7BE126AF47E16A69
-2C1F50361E8ED35D6C77B0BDAA18C12F219741838E78E2E721275100BBE764AA
-9CFD95728F9CD3BB344B40ED7F23B0E89A8AEF47ABF898ED6BA710623652EEF3
-9E9FD89221B624C7B4277A4AA45FFF8147AF3F68D5A7AB0C8C06F122DF0F9733
-38B1A96D51633848FFAD7DC260BD09936BD1FC0ED1BBBF67ECF2D2CBFFA77D88
-82E4DA43E68A11690B477A7D3B2B2E404790C1EF1A58E898318A360B72BB87FC
-F5ACF9CB294A091162A5F0F9A391C8EE2BEE9A15C36AA99CAF216C1506B1171D
-E20E627B22FF9C685ED7D9CD8924258C4CD490F72AD5A488402919E2C6ED3864
-2B9C54EFF3C03DECB50DC1D48E1479AD4C6B5471103E1903365BCC84DA4D04B3
-80AD01F15F2BCDB2E341064184474466245E44DA617B24AE17C49D57F2CE26D3
-2F7175D78255F7195EE48400BFFD86B99F7AE62D0CB70E72026AFC38F1D2FB8D
-CE7DF49602D24BC8199199EF5D9706FC24E0A57F7270B70CC5976B9A6EFE8F00
-B0CD1CD7131651D0230C17C02A844CD9F4BC13FDA70F5CAD18CFDB6C62FBCF34
-E56579BB8D47053A5C3836C87A047C99D36EB2B66F89D8887F3CEF292EC6ADA7
-3299ED6C5F12ACD7D952E6E7824293CB993E8A68EA874501D84BA68A264C82CC
-C9A99FFCCCAE6702C9D37B9C9BD9DBC1471215DAFFF6FF1D0890733E3838AAB1
-31D94D1719B35DF54F41F3C1DCC65C138714C350825746ECF14A4C5C80144E7A
-4A91C57217C2BD91D6869B38E6FE2D2078EDE5266A3CBBDC8CC625FD5F1575EC
-FE57CB298FB7490111DC9D89F6450D8DFE17B478B0BB2C49EC8DA7B66B2CD6D9
-6BA9365A3CD1E90D2DC12FEEB38500CF56543D1AD5B9E8E1CC0C9A2E12CC988F
-47B5A75A6FF8C047C678A2AA4E8947F1C96F9C0BB8C2B9589404594731C5B18B
-EC8E87925BAEE0D39BBE9D1435305488DAE9BFB681558654044C27573311E2D9
-B0F5E4F16BAE74ACF4C5F76C53E2212EF9F24B36BE2EB027015860DBCA06F0A7
-569F7C5AEB098039038B90D2D5BBDB69BC563ADBEBBB65F09EA75E093D92FD85
-B94E5E495C985B406F7D41AC91E8404D5CCEC7F0A907C2600F5EFB567C7F2BF7
-95A755C8C121A23F7C91A211D454C004CEF93AEDFC906E155AB5E547F0C48010
-B410F1221EEBF25F4088F72163296E956AA9E7CC5E691D4B1C40A62F21DE31E7
-E3D78D51EA7704D0A2820FDE922964D51ADEA8D0B1D855F8B6C35848938E5E19
-AEDA302E955B25BD58B2582EA770090567EBC1607049EFB639A4CBD3212CB220
-C0E2E11B5694599C82A40C1EA9FD1C5BF91C782A9912715B2FB534013822E28D
-04F7C089CA656D77960368217E0B9D485AC80226495D72F4E29706E714227C4D
-38203D69653566A26033946E71AC51BD78A513FFC383FC3128296FF68026B46F
-6406FB931C699C0EE832519471EAFA2DDBFFE30EC2A34F0B7D0C2D87B34A6ACF
-57716BF296006D7ED48935215E98AF8B79568027DCD643E0E67E504AC34F5F0C
-93795382DFB9E1FD1B1BF12FB5342166D48188B84E30E3BDF3BBA314DA4A62BF
-1E8971BAF7DCD7A1B515B265FC0105E2E647175CDFC932F83DDE00AF9BA09C01
-FB1AFF7CE0CD22A5F5FD4DE0CCD0449735C1E2D4292D4F9B781E94C611126CF4
-772743225EC58DA1100917D45C41819D718CA930786377B236BC0B1EA6020EE8
-ACB3D3BBDF25BD5013A7A61AC75BF1668FD77FBA4F03F62119CF0737ED0B0419
-76308D50194F06B47999F6C354D08B0627D7319885FBFC69328416368815F09D
-DB26EEF2563129A4C8AFDF106AEA2FCC0E6754CE0F71F7DB6F559A70C683A5B0
-03FFD10A4284C9738039ADFB937A91D0C1DE16684B6D1EAE980EAAC05D93D5D9
-B262567864671E796743B9D06C00803B6390D48644914BBCA63F28C4562FF8B6
-20B8B5F28AD2F1D3E28AC217ED0A37FB310892BCBFEA9BD5B78DC8E507E14233
-B4B08935B47E39D976A0DFF3C78F35055797F80D7518184642446941857CA803
-86FFD7E3379ECBFC607EC5B03CC2EB13CCC4A1C2AC7FF94032D005662B432151
-27D3CF031A878AB01EBF4B1F99D8C9D682857399A88481B7B4ACE2F168FA9525
-F3CE2C2C1293386921DCAD7A0888D8E9934D4451BDA74F91774D2FC1699B6AC4
-22BB0E85C1503FF692B48E43F445959F599862D5445EC97F6B9543BB8DF87A5E
-D0F0BEAC996E1355CC2C2812D617842B1C13440B9710EB705419B7E9C7364219
-BC005310FCCBA5C410639DFFF7676D44166848ABEE84C5A14614650BBEEF7996
-91BA6AB25B3D3FC0BD80FF9FFB8CCD4D27160C14F4808AF0BCC62B288CBA9B0B
-91F266295E5148DC34C3D89961C76DB1BE8213BFC9C2259CE3E10C52DEF4331B
-4847AAC71094B1883BF342ACC37463B7E16E4769F3591B426F2B4E3DCDE31B08
-BA838A9DD1C9968204C777034A745374C96B13C5774D7F46C7DFDEA2D8EDD79A
-E678BEE2CC407FECEB38CF5A76F9EB8D67155E5212F77FE0FD17AFD4D7ED1D2D
-CA92E8538FD5152608268CB0A5A6F068F7C0D589F6CEE36634C81F69712726A7
-3393557C824783D5915BA5952131BAF40B28D78A7260A24E399BE1467125B7EB
-3C9E7988E993DCB90B1173D94007A31A87F35AABD3D6986B230EDADD193503DB
-0843329EDFE2AD82DF632E3CA916ECC6AF1E9517087660173939D20AFB2FC8F5
-30E028382687AB6CA543EE1BB120B29A9148ECC9EB08E580ABEC61BBF833876F
-965B1FB64C7A11616D8D7CB6A0A83F08ECDE0499120853371F936F49B4C03C29
-C0CFE89B22DF2705ED6518A0076C045DF47D08C708D13559F50620B00743115E
-301528F33A7865A028D6356DE6B73147FC05DD30EB35521DA418A1DF70E06326
-FA40451E91D8737117D9CE45F039635061F2F33253F865D60E7EFF52C1C6D2B2
-CD3646A717134228CD910A22C256710C8E61F8D0676AA54A94269CB103F83854
-FB64074E1A5D4335EB72B37BB1CACD438EBFBA04D9171CBFDE77AD0C9E12E4C9
-FFA191FAA899BB448B1321D2D8D99D54DD126C4EBD5E70BC9FEAAE644E79DB91
-167A89F2C736DE4E4A760B84109F746F56CD32CBF8846692DC46590479B4102B
-FB1F8A64B613277CADFC500BBAB0EE49BB24B134A5B4919163D15DEBB8E914FF
-A446A5F9E10538DF344392B75CDD5FC72C2CDF999A285C11C431B4F71612779A
-ED983EEE2C397420FD7F92199B2086A5DE50C6152F4EEA3E27C1B8CF908F2F3D
-11C654DFDF2636CACDD571BB10C94F2434D39D6D9AA97B12F8A1C2F5295C4112
-3145DA333E3A5E21253920B698A87521E4DC22E8353FDC4DCEB771D22781C30E
-9508B8D30431483F12637B271AB8BF27FF28658F62CC017071B58634F19B6FF1
-26703703E29FAB5F64B5AC46539BE8F3B8E11385543B3A5E997B6DB4EEF4BC3F
-08251E1FAA50528EE2F35A22D36444CA11CD8F0D4AD0BA9158D300E89E6C56C7
-2E84628C68CC84AA6607D9852351B43CFD29C6DCBD7E7A98CD838A80349031E9
-C8C30D7178E9DA6FA7709901D17AB300C946327F2A59F038FCBAEB5FE6477115
-411AED37A43BA69A99663FD1D6A1BC52F1A5FA757B9DC89AA452493786809D25
-9CCC6A177DFB1FE396A9EC6F1513303D16D806ECCB12AB4D160B857AFF1F36E7
-E2C72C5A4B29B5CF1FBB55B7FCC0ADD70438ECB5CE4961091D096AAD12166590
-A8090AC848F0442E952509F2059ACA93E6C93A62646B06A9CA2F27295DD72025
-61C8190EA2D782A12D98AD1F59A7087AF2F7E6AD183A2A8B131174BA12DE822C
-7ACCD50426A96AF76BADDF9C7E958625324FFA804319305B7C5E5B745AE14215
-517B1B1FB791E9E18E5D9DAC6DECC6397237DD6920D00B308E205493964BB46B
-09A2B35579AFF38D6394BAE736686D89495888079326F42CD18454AF18000942
-AABCA5694EA2B965206CF24A0971C254CA889E5A50CAAB373809D9AEDD7E2F49
-7ECCFFB3E20258D83B93082316E149A9BC3F1952A541F644A91D830410474264
-CB8219D66A87111B48DA301286472E62F68D9ED53A80461ED91A90CA5B74D7E8
-C715F2CAC2B8779E478DFE036BD8228DB056DFCB5E59D0DF7218034573352C36
-C2100F4D8754C41CB15AD0FFC7C5CE5D091C41B7D4E9FF4DAB4908EB2D5E289C
-FE228B98B3C647B12889739F99E9EAAE81C406C71D9BCCBE030FC5630134FE73
-6F462E6725FC49A9461015367EDBA48FED070CBA581C0E75D20ADDF2EEB46A79
-ECF3B1BD89786130D6CEB0514F294FAF1E253A5F6C359068E8A233E0069C371D
-EFA85D0C87012D04CB4A53BFEA47A148CA2B4530A5C40D37BCC73C6FA2BB7C9A
-AA3B6C5DB69F2BD36B1BDE5B739C3645C60ED7D37825F691D3BD58B8ED63A257
-4EB7BA091C66BD98DC9772179B0AD2FA4EEB2EA8D61C332D88B7E60D4D2A7C22
-80ABEBB582F7E1813E1448000CDEECCB85D9E135D7AA2E28D867F2A87F902F28
-36155B7D0DA50E56464765D7CAE2232CEC8BB7278F69F8631B33A40B2EC09384
-4DBA8F6999DDB77F55AF8E1C7F7646C66ECB86D4DD869491B457E9CB35CED2D7
-F4173E894210E65EA08AFD1EB2810EA4972658C21CEC80330D7DB5F2A07CFF6F
-343C3AB0930F392612FCFFF26CED13A711E63C591E0A592B00E2453F982219CA
-5C5ADF76C4F697E9A73C992D1EF01162D36DAD14DD0F6D8741C2E08FDD51A915
-B964D967EA8752012546F5D2056761F7B694C3DF915432944491EDE756D01997
-FE85794680849A613C1CE80F8BB514864A0340CA0AFC2BC750CF8DC0954B6DBD
-A97B1EE3D8C2A7DD7285F2CE0F995F96BCBA3365F2247AF9F6B924D80192A70F
-7EB242BE6441482A83D441856B528AB7606DB5E14C5790140BE1918EA5FFB306
-10E08F80C9E9524F73FAF68D5BE79419343B3DE032706EA272603056DF6A821D
-C78B5F703CB38652482F5D7DAD5D5EA7AD1F832596423EEE9CFF1DDD2998511A
-C43F3A71CBA3A5C14B3B2297A77DFDB49B940BCB3F33A9C4B99F26CFEAF818E1
-5D37C5D029C9DB979D89DFAF55D253E0E6629D9E2E4C5764DE4BEA3CFA6AB185
-F62E1BCDBB2CEF688433229D07BC458C4DCDFC3CDB17C8E288E7586BD7A4DE29
-E8A092A0DB26FE23060477AAF5359A558B9E79BB6436F2B181E8B53C4174AC79
-5796F204189DDB3C0156E5675151D09BB73DF17134F7575269B3C22BBDC58104
-12ACA2F40BB9918FFC1D77160991242FCC4AB7044F7C01282F166B3E9B6C6B50
-B805C828695555413CDE6DDA31E83000B76C5FDB3D30085E6F02A8F2CD1A8213
-2ED5E5188C18852BFB629CA6237F7B6C634931D90F5C183FB880D96B8B975DEF
-A29D427ED88A34F09267525169EE575AE043FD180E1A793372A551E0F4DB7EE1
-4B18B770EC4EB043067D12C17D147207190D0C6BF8723DF89AC1668B1953608A
-F1C5EF65B80A76E34DF9A77BEB0C70699B75F519C80468313CC2FCA9E3CF42BA
-1302BA6B3970C3A72655648C240CCE5D75EF67F49A2EDDF8624A2B7521B888B7
-AC27EF9CDAE54040E6E7E797E18A3FD149F680E6BC5192E0F067CF1DF6969D02
-CFBE9CDC500ED58B2A140BCA75AB5822B2F1F34D8AC3B3ACF2132A0944D5D912
-33923BD27BC6CD13DC87361F5D03186727F4FCBB03E24BC1872CFAA635014882
-0F3A790BCCD88F22F49F4EAF8C56955D3073132CA2F1FF89F12FF67A2AB9A80F
-02C257BAC189E1907300DED6A5D946A217AB4372DC64CF596DEACA9A85833E9B
-1827EA876EFB89C94BF9FBF31563169C31F5420F6D10D89DD88CC87BA46FCC87
-761E9A50E32FAC58648CA233FEA7EA1C3EE485214E0AB723CB192F3C46004010
-3F9CD7382CC394CB4A85034B2D0D7C0CE9DABC0C73FE7BBB8BE5C4EA27C2BAE0
-977C4C730F2A37981137D23657218BC8BCDEF4B2806AE29B135525C17FD4E8B2
-D5673C58F6DEF3D1F11A7E8416268A3133882BCE91A97C3F4F07B8560C918677
-C9ACCE4AD07653638F9F03BEDACA787535C2DFCAB3DC3A4303F7553989AF6FCB
-8D4A958EB5A3A6FA666E7A1A7AA41427AF986DB990336247DDE616914C4F41CF
-5549DCAD6C3F8A80A01108069974FAABCD6A372E7A4DB8A62CD1E052218308D1
-3335F3337E097B266D683A5305D0343F6813B0D1F26B118ABBA30983DDBED252
-36479186AE5CC91E4FC060EFB1FE70F9E8F1B450893D30B36E6C5CED71B45DF4
-E586FAFA0D9AF57647728ECC16025916769E84F870FB9CAB10ED3AB674F765AA
-E720DD18D2FEE1DCA40BCAF1D3F8D0D54B20B12E1DF52D625277B49355FEA41A
-8366EB9C6336F2030F0D9E7E467BDD8FA7A1D4BE6025E33DE99825D9CB401164
-C2EDDEBCCBAF38E74B4E41985087BAB13883F205EECCFD674203504292518548
-401E83A377D3E7E419C2D4F86456C059A1CE971B02FFA0952F361FB758F413B4
-5D9E783B6B9D5CFB6878EAC6A75CBF4ABD3BECD01F162ADFA2987DCD1CA12F0A
-10B7B4E153743E3B92D13E6378F770CE2937CB185BDB4B53963D54E1421DF5BB
-AD6AEF0F6702EE22FB980F24B15CD5F961D74D20D66340D37F6A8EEF4F1F19FB
-2529AFD84E67BBB1BFF305820F567697F675F0E002F4972A48B8A52AF5A98B5E
-71811A929035A76A036627A64F5BDF97178B83B1B9156C7E52D278DEBA318038
-8E59DDAFD2FDAF44F80FC1CE7E65F328EAE820974C7FE1BC0AA8DC328FE1C692
-5884ED1E5C19B119DB94952EC58139BD111086D0C134A9B6C0E1A291D5B091E5
-59D406F60AC58B82B6D0A523E7E94C53F6813F79B0FF1267B751FCCF9122ABAC
-72AA9F993FA42971B30382637C2A8EA8BD1567BE6F24C87350F581A0F0E3854B
-2893C37A5B7195AC467155C57F7A0C94F87102F98EB370D6C16D4CCAFEC2B258
-62A53DABF7A892D8ED0ECC1BCA5D78933BB69B9355DE8D7A3E297FA4AD7F1CFA
-C6A0C8E3819BA20EAF56487DF5A9FF545B958F3C9F8B1DE57C570D64D97C6396
-AE325AC12A5102A49D683B78A1FF49D16AE237886440B31B80A5BB3A15ABE827
-6524120CC5E432226F2B74BD6B24B2D285D95A840CE3BBEEF7FED24C2FD07D57
-6BB486645F60BC180DBE5EABDEF926E923F405270CFD781C2205D7B68E5A7BF3
-AA20A4961C3178420CE6F76ED017C5B23CEF6C66125F5642EA872103911A2951
-01DADEF025A53FA3C798183ACFC3CD6C115EB9717D36D1F293248B94A5A1B1F1
-DA51EDA82C30FAD863E0AF8DAF85AF76B7C49BC10ED28BF794D8122A54A5BAA2
-D9AB4615290010FE370158A640137212E93BE4FCAF685FA6C257E350E3CD021E
-F8E51CC1D4E89A72E63E6B798ED0A4C88F07B994EF8EC79FD3559DB99DC9E501
-235474E224DF5E3EF7B72C7EB5FF2533DF5265E2047323F9E073C4C098F55CC4
-F291C9B403FA7C04B0ED802F2868ED917EF69F45E4D95600BF425B8A62968D03
-32F5E19219432CC55891F4FA758943F337B8685DF269425F97ADC08EE9A35C45
-788BA07F0914FF05591B82EAE3DCF106975565EA089D1A7BACED9FF13E29DC06
-4F3CE6A1E3CAE3258426214A3D98F7FD59B78BC228B5D26EE0DF1848C2C135B8
-365736967E5F2DD98C468B5ACD2E1C5C51A961C98F7B043C47B0586D54EF8582
-7420BB57D4C6C7C670D16492A757D7B49ED54A3D1A95EF635F35E99F21C250CF
-DFE05FBD85576E9D7CF3942B870610526C130FB83736C0766A3F75D7EF20AD46
-DE70D0BB071A6156C4A4CD1EF853A7DBE6F0EF405D97515816F305001A0B9067
-D9A4025585E6CD0CE6D215C3CC7C10B0FCDA876810A20C87534FE9818037F824
-8D3F10FBAED0D281F6B455FC91B7253EA61758E318E724ED441468A793DE0020
-478004FAE5A78FF9B6F35AA3EAC21527A7C1E754DF332CE26EF004111CA4D791
-0787B7C7539A2AE35E48D7D6C28702B09187557EF3097E06B53AEF62048023A5
-19DE2FD4FECCCE4B945F7A90E38DE5C7C0E1A98F8294271A0234D735EEC3BCA7
-9544B1A2F7C0A934B04D6F2E1F19CDDC2B060F309CD5CD3A6EF9874A45DBD0E2
-51E52E2E2BA358F7D7D7D1415FBC788F230C17BC8E233396F121BDBEC3D2DF25
-FB9BA0FF917AC8E885481BB8F92A964FD89FA52CCB97BF4090896E1B3681065B
-FFD9B517D06A0B9FFF6C4E16984AA1631C4521488EB01F645B3BD1ECA92952D7
-229117E36331EE347A81A93A61628656D50A2C6C149DCE418D4B8F5FD8E68042
-B3A25C5B2A310F793D479E39F31BB5AB901B7513BA3C61F891DC1CBC2613C777
-E47A60B1EBB29D3D1C695950C365E0C3F13994ACA6F79C812D3DF88576EBB0EA
-C49A0C4C94A4B28CC6445A4E2ED8D7880D1FD473E2A62AF441633CD7B880DDB8
-22A0F54F963F56A38CC334337ADB163F5810DB8B478D432B99864DBFFFCD9CF8
-4764661D1EC2090EAE1A05590C2C48C7851829738234FB4C8E36415369E85719
-EEE6347675672DE97992B294BF1E501046FC1BF0EF48B746EA2BD8C277C21773
-406D0821424F52F967755A2CD99883EDD26F4A2F83138CDE1A9DFC3D85580E60
-350CDB143E479976D252AF123C9D03A7B3068641C950B90AFB26A9625F1909F2
-700C5113CB19AD7556BD54EB9BE6DFBBF4F4926C193802B6F61847271661D56F
-A4DD2537BFB0E5274CF71C0B159BC2A624BA9EF265FB55BC2806B5A91DD33F1C
-A6D98BB3B5390051B750383B707B2AA6D6DF26FBC1959A3438E3687E75E29376
-31FA652F12748C3B49B43C1FEBBD00687ADDBEBECDCEBC0DC1A940ABB1FB3F32
-2D46DB5455F3204FD1AE17273DDB24E6DB85417184C9935937332BDB8F115E08
-E8F54891CD1D64C94951541C296AC30DF00CAB27FFBB3CCE8402DF81F9CEA1FD
-6E04991D688114D018023694668911E06B29E020FEA094577DAC47F10ADCE816
-899B93115B1AE91BF47129A7AA5CB9C11654386EF9819B666CFDA0773A19BD32
-E2EA8E225747899DDBF6A10411AE29447CE9426971CCE0A5BFF7B0F3B1885B41
-4887CD11240ABF1F9F390AE922C049040C5C7CAFEB76BB0C1833C68D5AA59193
-D484643C90248AF23C0CC645045BD0CFE07A8FCF4F6CF643E5EAF566AFA702C3
-8FD22DE496E04AB1C4234AE5B7B7088B92D2AD2AACBB8D1F21D896AC099E3A80
-CFD75DE424F8AADF45D1FD52D240384A469209A5AFBD4EB47F6F391C5DBFB7E9
-36D6C9B923B43458474D510E4FC8F206353ED27101F9C5AD395FC7184782E80C
-0EF532C0AFC326D49A5A363E4A271AD388529B1B3A0DA25E27E116F282D87ABF
-320BC51CBEABF7B580F41EBE8F35B6C6D04D0A8ED6384B8217175DEDA617FF41
-E7EFC2C4DD7EE978E45495656C39614F9C129A75B0A8DC6A801BCFE9AF5809D7
-607DFB1563B49A2EC7FBAE0CADDEBD561E1E6C5143A22DF0DE9DAB834B095D70
-532852C47336F8DB56747ADE28315C5877E7B25CE4B3F9EB3B6659EEB0875A8A
-D78C8240BAEABE84B14ECB5C927B3EED837A9A6C105EA0C3ADF011474DB3ACB9
-2C5106FCC4CECD37AE11669188B553B8D19BF69896DE8F8974A73798B900C2F9
-BB6A1529ADBAD84A77EC86D7E1EE235586F54B6B6E12DA0432E4E6B15F9EAA58
-54ACEA0F332CB4BB133218B9A1EA0982FB1E8C2060EBAD881D8E0E89CDD8F1EF
-9A2B346D99DDA2347402F60638211263BE2EC6EBBFF8286E9DE03C7044CA2664
-C843692695475D60D325C46D8E6263125B70572D5B6CE75A6D55E7F02E746581
-5210E04537B45EC6B3D356AE83E64DA24942633EC35EEFB29AD01520956A34A8
-5F188CC020C5B5D8809403F3AC9AC67D1FA1919843CFD83A8990E89E45A07658
-F06D8B34392C44DDA5109A0BDFF6038A421223B0DE8604A188B40CC0236FF76F
-213BC77372514FA46B833231057BBFE73A2C60DF37E592FB8387B62150E089FB
-83BE288AECD13F6B9E4AFAB9860BCFC54F567DB1A3A992296FA72F9F7CF1236E
-CD4A8350FA3718C056786536C9585F8EDF06BC8B228C684452513CBF13FA5AB0
-6555D628BC5DC83C5EFB9D4E3843618EC8A1C2C80EDED76CF2162779BCD9E9B6
-AAF63DB3797294EAC1D1CFA70034CF6504EE792D4AEB0D268B31A09B12D39BBD
-B0411CEFC45CEFEE106C10865CB7AE7B1786F39C0BB93AF3FDA169E556CE3010
-E46EB2F6EA196A0C91EEE784D372D9EEFAA4A4E29ED940E97D1FD4796315FE4E
-5DBA57EC20895C32F37DA3327128C242FD357F68AE8C17C599BEAC615EC07268
-78D4E2179600E0672EE605787520E8B370567658078A379CF6437A7D2D6684B7
-9B9B155D30897740E4696E90C5C4734115153849F10D21B5D031CA61F1BA5B30
-C22DFC777CC5D5056B5FDDCCEB66EF1D37916398FB231079281D8BC778640A0D
-417BF9DD81E8D1DD6FFBD06AC6F7196D12F71D3E34BB9251EF2A4AFE4FA321D6
-F6227A4EB3660AA19D3F96DCFF1C0FEA659FB7DE881C15F7C65B76CAB9194B56
-BD1AA0A2AEABE2B5CCF260D74926831663A9165F95C178DE64153FE87C323C44
-692970FC8EB7ADB1FF6D3D4932C7D17D000B42BB579D1EB057C63894567C9896
-38A37897AA765949AED2BAD425F4F68C51E3E1AF0CB1CB0CC3F0CBDD72EDE2ED
-E50226E68EC8FB46BBC06BFF263813FA7B6E564DDE31DC482031B19180ED957C
-B68B6CD679326C478D5D9A9DB92B19CB2C662679D6B692643D81760589B7C211
-A71F69228B4A6EF80AA4D3C816525E1B589A15F825653201A8230C66DE7EF8A2
-33B3DEA5465FACEF0757469521C59FA932955A321AFB159DC42DF603BB449F19
-BE418B859D45F9FEC1B218465D6850E8F95F1DCE44708225CE2893DABA8F651B
-FAED8FCB4142D9BABF7FB71CA8B8C42B51F8BC79F5DF0BD56868C44624A6243C
-532EC4412C580ADE86D74377466C7CA13E6EF1BE45805791DC8C25D7B6FC32B9
-2021C842497995F60B67309CC132DE74EC422D7CBA71A1D0DFDC772353F08E73
-D333B1148D2ABEB2881D8FBE18A49476566F61593DE423E11AF90909B949D3B1
-0DFA96D77CBC1CC3330920AAC7CE2DA6456DFD8D0510981AA923C399FC3DEC55
-2CCC5CB34C81D21B8C6E78E529B6979AD17547B164C1D1D756DE7C9170A44396
-B5183E2F47B265EC4F5CBDC9C3EA2D68198772053DE5FD985B4B9912399F6A81
-C4C37724FA73FFAEDBAE3F31BCD6269FCB4E3CBEE214E9D46BF1ED0FD38BB385
-72225D7CA6476A2EA62B9E5780FC5AC3DF591F56261EFEBF59B567D0A9C81B76
-D88869088CA4C1AAD0DE77ECD53461B5B370F93558290AE7FD5563D16402ACFB
-A635A73EC6AFECB0F10F0F67AF7039B3F8E2DC7A03B7F3C50FF6C3CA4DDA95BC
-7416FFCC10A615B1FD4252DB7DA19833DAB0C79F4992DB442F2A1E20A16B412A
-211CE3661D04FA5E6C9BAE3437B7E0DA579B176E1CD6B5888BB4ED30B66C651A
-91EC753E6E672847FDB5F3273E55371B247F38C3F863B8391C7E6731C25A10BA
-E939C248D83D5466BBB7B868EC3B49DFE4904A796D26C0D0EDBF49BF0627BE51
-DCAB5D752D318EA1484DED9C7E50FE4C5F89F3A39DED4C781A17501FB5159314
-D26E72AC51F03DCE4A1534233A0FBE2F18E9E812D57323A7D463BC4394A721EB
-F4A7AFBF4127A3EDCB31BCCABF8B6E38553116FC15FDF323A7899AFCC3C61A31
-38E292BCFCA7833723239CDED4C31F8AD1E91B1A46D51D7480834CB6BA824EAF
-F468B832C6F59254C144FE56978D68A00C4D9D4FB1BE356543EDB9F71EFF7297
-D689EDC87A558463A913D176881552360C5322BB70698F8825D40790811DFC07
-CBC54AECCE432A0F97A63E71414964B10F330AAF531DA36B0E70364066EDC970
-A52637EBD8FCA59AFF1744F5B46AE79FCC86E31BA883012AF7033ECB43C8CF2F
-474887951DE88E3288936F9CB63ECCD381F906644CD4036D3EE056A6E26D52BE
-C23C2102AFFB461943D393967EAF80E1422E51478448C211A0D62AA97A686DE9
-6B21CC05DA1CE1392FC7C22FFC4CAB08C60CAD17F8DAF5B360F2CBC2F1611A62
-E704671388B7B5B8DC1405B3239085C2DA2944401276904B000D46A5808087FE
-3B7EB5AB33B934AC0E871117F8F9AD77F9D4C3C9ADC104BF7E6B53EFC37BCAD5
-7B73A3BC2102FFA686E1EB8C784654EB18C7AA971E30CFD598B54BF11E1574A4
-5A6E3C7EDC4B000EB802A90F9F2B8A9E3CB1476382542E8BE4745EEDED3CC1F9
-2E757983F8837517D46350DB7B463E0AF5EC62D99F161E2E6E2D5D31C9A67474
-0C33287741672DA6D25E4D12569BB09A57D05D77C4507A36BA534833046D5A58
-88DE60F1E3B475BF6645565FEA080C918E67AFBAF673B83A89C866954B2709C0
-98D93B44FF3379952A5C3E4F063D3E2EA07F67B2B5BF9F7202F4AB2DA5543DEF
-0429F61E4939CB9C41B86099F8EF62F5E80FE38139E9A75F9EF4B946F775CBAA
-D31654675CD0EA94A63803B27B72911E164560D5939111A1D1B579F80509F8F3
-A3A591E530F12741FA5C4673BF894005FB893C2D725CCDA3EC41429383A4D6E3
-0E69E7DD7EE8481E237F5C3B3C2EBB29165A7B672C8D9740E07F10FD04479236
-E6E61691A73374537DFC2DE078BA3F4692D06FB08EF2493633510914649EEF10
-B6DF07297D1C28BABFFBDAC287F83D9CDD071831E1688FE2A62D654463C3BF1C
-574EBCB7CDBAAFBFF43932F944D130FFFD11C37488E452D616E745D1F4AFC58C
-5417AF552DBAC64147F87AA28A04F8C1A3762DE1E9ABE6CA61AD64547C637D68
-0A954DA58CD646586933FD73C59B124CE7DC09A32289E13ECDF617084B05BBCF
-8ABCA791092C9D2AAA654B40C9F3D3101A47B7EA53FD3D3ABA444ACDAD67F9D7
-2F6CEFF3F06C5436E0D541A145DCD80E0DB56D966C563A2CAC59D7B64AD40E0E
-8BDB2952F66A77C6C2B2F59F59E5546B67F9753EB7ECF59099412A91A5E02DE7
-B42D80C851690AAEAF4ADA1785BCDC63DF7A857C1DF503315BCB9A48FBED6624
-C04373553329C2E2D7EDA7FDD877EEC15EB9CB4C32BFB2AAB37187E6F7D91554
-2BB4036E3510176A4CFEC4A6ED7AC037618D0B02F7E4E61862A5D8C89CF7B69B
-3CAC808DB6F582887113DE7E70B0A833831A6250348F19493BA4619D4E9AD23B
-356FA36E0576441BBA4ECE8E15F5C4AFCA524FF9F884CA6F22D0E8457EC0D7B2
-89B16700323B125633B5E78762293B5FBF0A3783069568099377CE17A2671292
-FE5C91CCAC9308C94266820944001038809ED5CA1B80C1C5E5FC35014F7CE5B3
-94E5C4C513DB75BCC1D616A3C952DE3370FEC7EA89AF705A1E035370E3695233
-F2AC4D0117290BCC7C63D930187290BF470C9D33C980F62A79862F5B722A8DD8
-5744A2271E7D2D5547E0685E046AE1B99FBFD83FAC7EEBB576FEA7A823FD665E
-FC5FE7C997AD1C6149B8494C9F508A1F29E64E8C636A0B570650425D4CC6F803
-5E8060B89ED4171442ABB578BC9F7DB9F768F110BF55B63AE8B1561650B6F11F
-974D2E2E2CA973C2599835523278ACE31B11CB208AB1BBFC342C653266768B1F
-F11C9D18A3125F364237560ECAF6918C66AAB987B0028C4AE5FE72225755269D
-A2A5C843B134E7602AAC47A5BC6881C111F4895CB6314F12AE0051B426FE1F4B
-2F6916CC6645CE8E4A636BCDED8F542679842582DAA3C10E7FE83018C84BF6CE
-7728F9FF32D39397C4B73BBD6EE5D9D13BAD2BE727A5FB89654767010A8E6380
-959601231774B9371798797E1AE5AEEB8EABC2BC9033BFA440A6895E090321BB
-2B02349DE3178B6A6EF649644C6DD4B5942881F6A35FA2D71081028F1D504AAB
-123ADBA4F0A59E8CAE2565A62E21C13464FCBB0DE37957F3EC66332DFB2BF4BF
-943BD3280E406863C8BE266023959B99C969C2C2423C9F7D814B82D56635761D
-3E026A163E3BB32C0A97505B9A87CDF5D08EE112C00BE377E170618E59897378
-A2026BC33EEEAF1F902194F17837E6D14273C1B23A97D080C26419F5E68F8378
-BA223CC1B29A0E488F21C47462EE2ECCEDDC58D4D6229CBFD7999F8552B21B07
-26592F5D4BCE67F427F54DF72C87DADEB1EAD4684319EA39BDECB65EFD9C67C5
-EFFC1C9171B05354BC769B4E0609E10884735700D01D3421295D75D4DE190D83
-90BC3F9EE03E97BF8FD273B50D3185BEF5B0EB32506F51335D8D555872182830
-1213403560F935CBF17B30B53A5B3F422F770CF3E0AA964B900635519F486A2D
-41EC65C342EC235F9DAAB07AB10D7B0A15A231538FD107651A4964B913E77C8D
-BF49CFDCF4CAAE0B2E3EE0EB06792C600811EE8890DFD01598B272FC8E6686C4
-FC425EE1519C372D02B0BBD58647D5E39E243AAF08D90F8092A424E2167F7BDD
-45A95EA8E04E1B966429027E6467416C98C89F16F23EE1CD6D5DD6856927E845
-20FEA2128528DBF01966CC8DB433C9FE3E0E9EB13F23896F84E369A9AF0E80FE
-D193C40C072D71D85045E7FEF3913094D71B84C8304154199B7FC2C7F278CCAD
-899A3107F56687C26A9F60557ECB4791CA4CE7CB6D7F6422AA1EA6C67C2D57AD
-2F09B3BEF09D36187650743D8A6A0FF16E88CE09728EC77EA0507EC8817AF105
-6399158B4C7AB6DDF3505A20880483579CCC027218CAC36E5AB7C4EF83743A03
-EC38E97E4C4FDF1B35D8548274DF1713E509BAD45BE78A49DC41D9341AE68D3F
-D9C5720ADB1D7077223F85E73B7EA8A18EE0A44856906C89842A0E734EE7D3F7
-5C7E6FF3524DAD3EAB6060F37CA8DFDDAA9D7B248F3ED84D4AC20D3D7D23496C
-61C7A315752E2906B0CFFD0E70D1328DFFC890CB6D77A9D8EF8C205E3E52613F
-08845C54EB98AE98FA5B7099211542FA54CC5D6F75FE3DED541B7565C656126A
-68CAD216C1A3FA9E8F72DEE7FA7C5AD5136044BB161023C701B55F483BC8155E
-7DAD9D13C9ECB613CB6D2EE48C0FDAB9FD2610B7B32D13B27E023A5975C776DC
-265DD695BED2DB7F63390B6E17810C6C84CC11748E49ECE00AB18896726E9C1C
-2BE9ADFD635FFED6FD9E3A319DD43560DA9614F896D762062C1E29A8408B1642
-C5FF316F6F919335C06369D9C4A83EA7AF7C30BBF5126760647DD964516E1BA8
-E24EF01EB04F20764837F7F5A7FCCED77389848E276F71F05DF88C655AF17437
-774B95174BD8D8B77064B87B9FAAFC461331EF0558F3B48E2004C5541ADA5A99
-A8C27FD3A67B18E8EA02CB2C28ED4CA3ACE3F456B509590BFE9F74F73C5CF180
-4323C1255EC01A6D90C5F25804E066B4497843CE0954133D363BC2B224549568
-1660734AAF2F36F4310DF330BDFBBC7D8A49773481CB4C9E220D86F33A07253A
-114D59D15851E63826920182939AC067D72A3AC13A279460F7C45AC519C8D413
-C8FEEF16ED896E8DAFC0AAFA8531324315A736793F0C6BEE37E9F856EA90375B
-00BEEFD6FD020C5C867950B8EE72FB0313B52D405817C4DABA49C44687FE6C7F
-8CB2D791B8268E8E6E84F7444A2D5611D96FE06C8D26A200EA644D7112BAAB4B
-2113F0B88EAC26D30E928CE19F1C0540F0A0D1B86B610A34494231FF64939F1D
-774BB1331A19BD8362EFDA7871B334F20E3421D7A36B38DE952F20E98D74028D
-5D076873146910CE272F9C22072AC3FDD68B4FADD7EF802375FFD8493AA5C52B
-54BD781D1B8252655F51942526D1415340CD45F9BF03ECB5F04B645879D617CA
-62E9B669DF2B2D6601AEA8F4207C0A5C0037EE3803F809BB12AD45D4889CA54A
-D60C06FA1577B206CADE0FF82A43D64F4640A98153E8518EDF8835116D21A87C
-F2406FD91D70F27315FF9479BC139C41ECB02408417E82A50A7A369D739EE1E7
-92524E23CA98C9706FC6007C2602B526AD5D4999C58A45BFEBA601FDE6746BA9
-BD6911DFCDACA9CB5A7E98EC1CC3B5BEEA50D99C33A514BA7AE8760AC054EE49
-5AF381DF0DDE1407A875F507E0A251BBB4929F987DE13245A0694FE20A77FC44
-18854A70B761B234ED078EF1E01C4AF65B426D4B8B5D0B677BD02C178FD0D9D7
-3D637D18ED510C81DF887CFE1B5179168ADF2A9FC4BC2CA5704543DED74765DF
-6980462F7ED8A555C59242F229689CE69CF6C02BEC7CAFD901DE76BAD3567349
-A91478177B804F1D1269E60D86154B7FDF152EF501961ABFF65752E91292B0D2
-1C16AD00A93162653338A34A851F64A843E265EBE373858298931361B79B6DA2
-DBD8BC513A6B2BB1EB207261B54047F34412C059DE05C6A2EA8971424BB0AA06
-84AD5E495A41CF9F11A844D22A805385B27FCD507DB9B5B9834EC15C047F462B
-63B44D99D7CF3A744E6528D738A3D42AE696191B6B6EEC3389748058ABB8A3B0
-B161E749539CA01169A39B16101EE2EBAD18F62D7D936D2979BF49B92ED08268
-A774B4121EA592263B367F3FCB7B89B35F72DFC85F85193B8EF32EB07DF86FD3
-6E3E8DF750C199322010950F09F9A3626121DF00EEEFE761C19E05416AB28916
-49570B7B77705906630E72BD5C12C99B68C09C00C43837F4CFA8715EDB4128C5
-7267F3FF652C858E3D2A8349B332E3BC2BC3B2F82D4B05EC0E5520B2D7235105
-51EFA9BC01C096A492130ECBCF21389E5BF1D2DD2F51245E47CE04E684A0ECB5
-3C517EF74789773889DCF605DC459E9DB154C3E171E2CB28B171C8A251595F8C
-89EDDE44A82C9F6349D51418DA47347DE4C2D8D58FE770574B409A4389293E60
-6E5AD82E2AF14DFF39A7332F5089FB957CAAAB4EE0DEC0C49E1F60CBAC617445
-F22E290834D513B248653D348E0F735BA046895452B2E091259E615C45FB18BE
-B00B5B8DE4AA1AF2025EF1FFB46AF12DA219772D7FA2D2D9DA29860B5C0B5C0B
-F87D104C167DCE484E1834CCAB2068722B51AA1C287DA9BB041C3FB12329422F
-B3B4D3413946FC5686F9A3C028F23305DAAE24901649B535D3A1D24A140CC6F1
-A098963ECC6D302BA9501B4D9CD0AC35D30B33051B190691253C7C82C43ACDD1
-9CC5A439590BBB934FB917A135EAD27EE431A2CCD999062AA58D70289E60C04C
-99083B7F7CEE37370AE49C85342882348661B1344790E6B15A26DE133342AE03
-140C5A9D17C96AFEA55747425D19AF523A42AF250FA448CD3E1ABC318A95269F
-07F72C14C466E0D2A1EA73262FCDDC95BF64E1904CB1DBCF751C748AE8BF7332
-F99ED128E60D4562A163FEA253F955CF0E61020B03AABCADF923972C8696B9E5
-5965A516773909AE218CE76507E734E5DCCD2CDE4478D956319FD66AEC8C15BC
-E421B166D663A1D143DCC8FAFD843D60DFF89D32D9D4AB29061C3E8E7E1FD89E
-065EC49781D209B5619ECC2C0A9B0F155E56DB3DBA50B847B0CA06587B4AEA20
-DF3F6E220EA5843DFC65600398989EAD4F6632B923C583D0FD4D57E9723D42D6
-420D9189DF6064E2F7CD8FF0AA59375DC4E1395787AF03FCFFD59FDFCEF452FF
-43E28A9490EF824BF80D471F2C5093885AA41DC863EF777730D074559739BB43
-EB84C8CED352384410B018842B453599909EE6CEAE259C96685BB1E5C08B7968
-82A00BCB0C6BFD57170F1DA7EF8FD41097C8BFE09AC3EEF9FBDD8DCC52E71157
-7B3996B93612F4B65FE0B7CEDB5F9EE91E77D7AAA3A3C8E6DFE4AEE3BAD2BA65
-A3786CF3EC4A3DBEA0BFDE3ABA62DE428E032B3B7471BD6CADFA8189FC2D52F9
-21628DE7E96AD5AB9F57ACC77F9B73A9F762E8D1E492BF92D42CFD210F7B3F04
-691F02C13AEDF69B0DDBDC417B3A12B292A8B41CB22D53AC02189DCD5D7142DE
-CB7568FD3584F6E1F134FE9251056E4B8FFCF06856B9E30DA50EAE765348F39E
-4F6EE206B73B4F399244AD997F7AE0867C78126F070E000859364B690E72D492
-CE00035F9F8341C61F220F27A29F73776F542C939445405CC670AD753248343E
-12AE1A2016E87A8861F05B7ED2FF65AB2E823C8D8FCBB3B65E0E24864D97B79F
-A94B489CB32EA91176D5C3D170F7DEAC36317AF5800B5BB0DE38D38FBDD75D71
-B2C45D2AEF29EE2F1F55E2C7BCBBEF114F801A4A8F340E3159EF67CF966520C2
-6FCDD2316112BA45E96544A86D3BA064E674ECF9FC71CEBEC0678A85B1229CEA
-6A174D115B6E834F74DC0E21BB0FE151482CED2A5E037ACD1262AA3979FA4604
-CF5C2E68C657967B3CDCA1AD9F7AF8E839639320D24FE4C8FF25F4F8CD459967
-E154862952058FE33E16357E2C204297AC81488E33B76DF2D4F93B1FB8CAB223
-B998577B7FC6C8B4AD8B5321AECCA360E98D2E163C3E4DBB01B7F8E02B413A50
-2EC8D14480849B85FC391009C961E2CBB0820A2DDEE153A29B727A4547EF7A4D
-40310A9CF65D49D68860D5161A5F4F32A746F8A4FAC234EC6C515608012D6AD8
-812279D4364864582CB04D0DB04D7B80F2B43ED41B46DDAD763AFCAD08B10DA7
-4A1BB1280D22A2E538FC8C764AF934494FE22AEBE6845D20A626BC4F9B0F93A1
-BF02AAC68090AEF9462D1E1517B0898B7607FA866104A60B652A7A2CFB9D4626
-1108C550D6BDA61800E63BA5EC8E7035F1D1CD66402686B231AA87C0B54399F4
-A67BE1C656004E34D74031C046CB57B35F3C32AAC4CB9F7757CB35C6C7204960
-975430B63BA2DD5B951EFED5A1DD645BA4BDBA778FD5231807A42E505D73277A
-7C0877821D82F14E064A16474B1D21914EFCF4CBB9A1F4B34E58E98334A0B732
-430CEAA87636705F6CB0AC748AC6EF54CB42C31BC2E9D8458D467E13A6BE6F6B
-F37777185D70689D4AA63590FE4CDD91031F647CED0B09FAA741FD90D7C82A8D
-5CC25897C73BFFA5D1BF67D768563A3627389FE841D286681FD2B507AF80B948
-1FA3F25EFF61C42E1E59FDA3C6A0F5BAD5C23F2470695660BF2D218F3EAB741A
-C0E0326D88691A2BE6715A739DAA2F410F51C9FFF10FA140F18DF3BBEEBAF0DB
-0BDFF699A8FB134DCD17E9E9B60AB3A7B58FD570957DEFD4854C2463A823B795
-2BEBDD075982332BE20C7755907C977C9B5C1E50D824748643748BB8B03EE518
-1DE1AF9DD73D9D40B855C8FF3501092E810A47FC25110B1B8B2DA25D6CDF034D
-1EF0628227C433E48BD5FC7066D091238228AA83342B306C3691BFD16F2A89AD
-9195347B3E5F51F07665D634933A348656C5C563E7843EA3EB7B6897A722BFD1
-14EA5CCFF297471F14486BEB20C5B086FBBC3839EA6929F640A249CB4A1AB38C
-45E76617102B4AC6C0A60701EA17B23C5452C03BC49B03592D9C389B41489B10
-A0956B893D7402EEC055A93CD60B0A91B369022281D996ABB7F9530F520A8439
-C76F2A1BE71639DEC7545C8E37C75D43B35E7BA53D52736A5D5B6231D795D8B0
-66A9A7E2F296CDE2E11A95C7BCA510FE3F3DA0B8F4F312C5D50549DCA50CDD19
-B6ED0F3D9B9266706A430EE505535217D0F4C19736A235BD242B044706B17831
-A4E8A51490796F045104BAFAC97ED33961535B48FE7642FC3A05DBD1196112B5
-00EBA4C56C3E0311E4104E50BDFAF7C98B8FE0BB6EBFAB065CBDF71CB3507ED7
-44AB743713804C00A5CD6B1DF6F3AC3E971937087C9E1B82EFDFCB905ED833E2
-A2ECC8E08775EB081C5D16C3B5CC5B25312AA0680FDB74F95B5B98A56D34DCF2
-7B04A3DACB5DAA21E17F8C13F2B358901AB91C13EA4EFC19EE44A06C38AE7091
-7C1EDB90B538E092A4B41F1308E6DE5769FCE25E6B9FFCE0426119D868C3B814
-3484F31941231BD94FEF454F62A56D08F5D319303B2A612AD68032FE7596CFB6
-916B5BCA3EEF33966B845F3F2D5F0BF6832DB5073FE3808BA5F1D9812091E226
-FC2F3F7F56DBD04BA14D06B1E3C77B7A1F9D9B3E81FE843AA08C650A5A7EA77C
-D9DDFFDFD4D0992A32915E8F162D52127248889882AAB06495D56780BA3CB143
-0A7D0D416A8B8B408E9C93EBEB2AD23FA486CAA8AF348755111532CBBA15DB40
-02E102A3D1E979190F4506447BB063CCD7862C3E842E42C3FAC628A8D283B193
-DCF1B4B5E5F9A8FE229970123CD899ECE471C1AE20CAE796D638F38180493347
-C06E62879492306E400F6643D5E4C05846342436B01287D915CFEC221881B6AB
-135B07C2066C33BB01AA8F6FA3E08747D5705F44C1367BA01BF0882B4128F5D5
-B3D3DEB47BB78E6FA654E56E66BB882EA194DC224F5F156A9AF7B30EA87FB116
-D6806A6A302012E9927D05D4F72E49DF7FCD76D26565DE03B0A2353467BD1E11
-0749F05760AF2FFBC3471E37DC0777E349A5D843B6B2979DC8F9C069A48D7506
-16502F58D9152C391ACBADF638ADB08809F71C647A6C3A2C8326E014215F0288
-D98C51D5875E0EC2C7784FC48B3D5BB5FEAFBF4D6099B903C034300AE4D78E64
-A2ED79053D3E95F08F5FB761C494ECD5E2EC943D8F38086F2D16DD9736D3DB93
-E4EF811A1506AE38F13A9BF5FCEE9F240C9FB139638305C0CDA53F3C42D98A89
-A0EC3B17FDA0FCD8AA28E1555736755EC5B9667E69B1F493CB5130C82B70E70E
-DE8B948F17B04E6B860D2C2744B29F6053F0E938E23CD2CB3049CE97430D6F77
-2C918E7CC58237CDC43B5B4BB714CCEA475DF58E87520EF3072AC90FC2A4E310
-C7D5F6AA831D3804E44237E08C318286A4947E603765E7D1E32F584F943BE06E
-64726A02131E416B04F0D33E0825F0FBC6D7B1A5BD6D2916D098A0F977D29ECD
-B2A6296FA4C182C24FA4356488E81E4144A5A1D40ED97BDE6235BAB6F3CC1318
-36B9B94DFD0C47C3341CD622F4F4DBF5EE98EB43BF107D59C005745FBAC7CF34
-8442F5A76B632CBBBC1CBCEF59B5B99C0F3981378DEC3289211094A4F4D3FA0D
-EEE94BDD5707EF4A94776766C76C85E9D984422D4282002D9CCC760339219864
-BCC23DD9E624B3360CA714A9B7270AC4A6F7CDA7BAC441C684D29D29DCB8A761
-634AC269C6809F99B73534AD2BA27210107E49F65DBBCF22E31F828FB0194BCD
-5D4FECE626925475B43DE7B346AF10893DCDCD9C13DC9111506FB5E8B41A69EE
-3BE7815105A6FEB8DA8C6D7BE2ECD49B7F315C66D212C4400AD81426EEE1C5F0
-193CE191E871D4F9F578518E372033B8121869EE7F874F3513BF81D28B7D660B
-B1C59B638E677ACB4CAF561EEE077ADB0CF64E8CEA0930FB294E031C0BA973C6
-903DDF3F33D4E18D0C55CD89FC109E72AE5CBC86C37EF512966DAD266676F8F2
-6198752E232C6F3241BAC082DA14A68FC89CCA1C3C0422D19BD2054D3B91E60F
-51AB90BF2317562A4ABCE1C96165F1DDAAFE73BDFF939C327550BBBB5B0FF5A7
-3EED7D777E48E7D337FEC7836A7757343A3C3781E99179C654345940CD55BCC3
-681906BD573C7A47ABC7E334899CFA8090CFF0104B88F74107027CD6412C6183
-2AF6851F048280DDF8BE1A2DA8DBC1F7634ED64C3EF0F1A94E27BB3A3E137BC6
-F4211E62F774070DDD96156815653BDE961D5303A16F67AC4AA7E66477973A84
-C6AED52AB10A57E95DAD8F212E5E25BBF0B45CF4721450894F67A01FBCB498FF
-BA5AD16FB1521E3FFEB53E8FE8B2174C76B780DF8D0B1B8B9B3EC6FA9B6AABA4
-8530493A92A904030845A5158D6B3A8247773BF93CE1D59D793575EB912FF49C
-13E0FB588DD61D093D3E50EE934563FF44E26728406864C4C955E58756D217A4
-B9506576819E76B74493C7D5EF4448673504D81E0CB23F039BA9F048073C5FA0
-3A47C5B314F1AECE21F8EB9D77BD9DBE49A2B505DDA54C1B787FCC1B302DC9AD
-3DC9A2822107BB6023F259B3D44F1269EA5A57C457DBAB824EA2F93B046B797E
-4C82F7EBBF47A4E69072D735955576F17F7D3B5AEC2A420C347CED162D7C734F
-3B0FA59774B5266387C5CECC7B5D856059C195869ED7C0CCB66DD20E8F70E875
-BF607899DFE6E1A2858380317E49BFCC0F331A75B12D646CFEDAA09CC28EA30E
-1BB70F720539A60C9348366D9EA597EC52DC4169A8505565FFFAD2D372FA6F3D
-CCFFB10831010C190EF3248898750D45BEFB7B444727F6B45B61F1D10BCCF6AE
-6190105A1B427D3754DD9A4B42BA65F82A85D0A0739693F52B01B7D1FDDF38CC
-5FD09CC00C42529D96579810BF9E5B6ADBB96B8C907E29D662530E2D67BA8924
-C68204FEAF80B1252084E657C7E7C836C65CDDB909B91B9E52E33FD14670C6C2
-B6316D2BF298DA1BF4E6BA9BC2D50ECBAEC0B15FEA65ADA070DA8FCFF3F7C329
-8CBC3B100307FBCE9EBD2105B663A86AC14CA64DD7DF46240F597C693E0E79AD
-C2C6B46AB8966B0500F46167C881A88B9F8943CED18762CE708D053EFF9A1837
-8A542C548ECA7FD8266AF696DBE4823DE65A7381EDB5CEB5338027881A29A340
-2C655936D1FACFBDE4792101E1A2F758CC2DA582DB3E8520AB299EAB77CC0E5B
-5A3F84F0FFFBE93A35D8D903C14D0CDFD9D592AD188FCA5ED5CC7C9F5A94929B
-50CA7CA7EA2B3ADE408FD05AEB7BF322A694DA53831DDAF8299196822D2FC0A6
-91B95D4A3D9C46C36DF6E80B80D6C2982B73DA7D790477083E312EAD31D59AB7
-D172BD52AC99925EE781493D6DF86F174BB6BCB1A79559AB6BBF6B6ED1A3A85D
-53BFCB6E7BC7BCE12042DF6071575DFB96CA21FE03C3A9C7BF9B6D48FFBF59BB
-83286F95D40151BAB0A20EDFE224BE0915ECBC400A0F11E9B7C1BC22C71EAAAE
-962B4E1BB8AF0E7365683A89BFE403880621422684A8A5CC63F6243DC4A1BE18
-E59F1184C6B8BC943282FC3EB1B099A47B3A8F5862F1B159DDFA05A046DD4311
-276D76A13E9E308C28C19A9BF5D6F4DF18DA369A8E9B18A32CF3838B641D8A73
-2421B397BBBF80BF80A197353D0CDFDF324FC2E34143D2C1D5EB6F91DE906A26
-0D11990A96F29B7F3C7735D5F8B9433AF21E8D84C5D7593FDDCABFC6D024640E
-8CC8A1B3F9B05E68797064D6F9D163246E6BA5A5198170406640001BE0C441F6
-656F6A2FC0EBF17E7324FE428EA430B6885A8F100D6C1EA6EA3BBC865DC7DAA4
-FD9FB6B6EFBDC86FCDA11FA62C2E76826BBF896846B90F99F58B3AF125F9DC42
-A7036347DECF0693A058EF45535278B7FB440A07E32DA0C52A0C8F2E8EDDDB88
-E6E97458F2FAC03A7D01873E37B3DE6E6A1125AC5BEF387EC2E9BE91246C530D
-E52F13CBF94C67FCFE5DE8E0CDF959ED6CF65F327C08A915572FCBB9AB6A732B
-289E2CC770A642021106AE8103B28A45FA062E84F1395D51EEFED2D0C2143DC9
-939EB6D57233AA4AE24B347373FF4C285749DC66FC225FBDB3AAF247AD1AED2A
-02CCA1391191DA629B0CCAC3EE434B12ED69DCB05A96ABF32A44BE6C9CEA1FBA
-CEF2FBCD765BAD4C53929015D381B8562E91AAB72EEEBC4E741353964D003DAC
-FDA6F739D211209B40776889B8F208336F24FC402F27A8AAD6C45A5182B1FECC
-EE2BADFDF613DB925307006771088CCEBAF0805924FB298BFA9A5AF06D28D347
-8181EF23DE09F8D8E1C8023988F957A740E5A7586C7DF06995D9820F82A8B44A
-B8D484561A558B896AF8B5D8C3FADE04B2D6D8D11467CCD869B9C6E8EEF793C2
-0529818E6742AD8B226374B4FE146219BEFD5A13E0C7F1A461A8123CFFE79166
-2EE95CBD7F0B29918DAE04E030A1BFFE6BAC8F5F0C3B9407C4B611CDEFFC9E01
-3BF0B6F50922900C431A0AFB51B32F6A2B814E03A17EDE45B3E33A0E1C2FAD2E
-68AE579E8F303E755C62DDC7E417094DA352935AEADD188273BD46E6A9A94CBD
-9C522A4197A0B9C40C79CA656396231D9C609C864A21B1697CE532436B6BCA1A
-B9370F172FAD0E997286D2806B3521E09E19D9F76311D65FEF941B0DCA969D26
-FF2F6F4E83D52D765D218DEF920D27BB21E270E2E7F31EC1849F641AF0B9FB60
-EBD6794F1023A7676A53E67295D46A75DDF7C240AA05730B045E1587CFBEB501
-BB9C9BBCB8C94A1061013CBAD5ED3F02D180C7886D926181B2E1DC9F3C8E8B6E
-FE48EF896AFBEE109300C692D2F94C8A140DB6378D6F294025AACC2E95E9907F
-F0AB63D937C1DD9EF1B4CA496E3FE4F329F246A93628923F122C2C7AD0DF86B8
-53653F52D36AA1F67091296FA55B978990565F63B92E7BF7B4B3D043D7F79789
-71CA93A7146A4C5CA9653C92B172FC275F332B07260A573F843B0BB83CC5E5CE
-EBA290AE6C7B43F3E5CB10BD84D558D2A5B6ACF1A0974EF20FCC824F5B92746B
-D2A517006E707EB44899D4407FDB912BE5F4AF3C4796438331EEA2B09ADDCC96
-F798BCB7749E54F578CF703EB0AD086A6A98E4EDE1118EC76338E3B76A28306E
-B1C400DB863A2282988DAD49F337A5BFAE7BBF6E06553DB67F34B3BC115C63BD
-5ADE29D5E6770BF0A1CDCDD0637B9F877BD2BB6363062B2D6A01BAED65D5859E
-16CE1A4EB86B9998D5D28213EC0E5CB2A297F24250433D61937B607C289DC54D
-E9F7FF54BA94E40865A70273C4915BC17D6D934D275BEBDA3BE285E12CEB17B0
-75F6C87759B2E2E47DB0F4A5BA9CDC8673EABBDEFDD2EB781D9121276371656F
-795F9BE5528E2F56D7BED80C679F996957AD3606C0B1E1050FF62F6CC35BAFEE
-3CDE09668AB4C5F58DD7B68352CACCA2D7CBC3DBBA2B1EC9ABD1AD16A21AD93E
-50DA4ABBA9EB945A93CF1C5BAB83C1BC0A1FD2084A42D892B2FD7A9D390CB09E
-96610AFC7181DB4D25EDC34FAE3B0A8B54D32AFDCCEA649800DCD263730C2C7B
-79EB5117277BA48A4A00806D704C58BE4679C71ED74DD4896A95248B99AC3192
-D01920DA9D284B03D8535DEC11F1A7EEBAB5A209458F0752746E1E80F1096EA9
-B72054460C14CD2DF069CFA77E7A70A366BD3A72CD81F4FC844A386631F2A661
-6C72BD35E2F5568453C1D67287EB4D1F088CE9167B2A9698507CFB51319EB6C5
-2D597A548460FBF527F53D1E43BE94B343F5EE15365D7435EFFBD0FF54D5E9DD
-04915AAB6426DE0C749A0221FB8E8BD679B93519B817938F6C92392F89446228
-57F2C33C867E0AD824B78A81EDF0FBA93F89DFF8A8A832603E6CCC5570EF6150
-B4AC37603D0126D485BEF2C6AB59CED890BDE0B6FEEE1E3DF069B7E62139AD5E
-85AF3BAE0A35F6F428E02FB819EAB7E07DCEEF52A2DC7AFF5BE9C5440EF61C49
-DCE3422CEFCF26721D73F0BB1D07C4F8D74494B399769273C8F3F8E8CFB811BF
-5C52C3B3006963ACF2CF0A240F93D54A62DCC8BBCCB2D9FCD29A2CC515A5C668
-9CC2BF03AE1BDCED18E564CE28BC424D8905F2A495BC2264B19B36CFB9606837
-D5648832EB6D7A3806FEFEBCB37232619AA722D47DD4C182E3496F5FDA769E77
-21F50C61BB6D7EA38412C02767010CB9DDC6DF5403EC5883C345BF6B0E49505D
-C74B68373429C894CC8051B9041EA12026C99F162CB5E817DE3DBF79FAA17FE7
-60E803A56FB1B25E425D589F421857C40AC0DB303AF7EA5948986EA9886DDF3A
-2EF39DE46E24A789CDAE1292D8DCB35FF1457AF0F8EDD204EE66681FD2E0C120
-566AB747A050363BD7F16A94438FA75B4EEC2B4B7BB6E5F37339398F57767DAB
-E217F5FB234595BA5858295B3C17B29EC35C5A9B944C9BBBFD3A1754C95166EE
-1CE61F4125D776618CF5F28929D708A1193944992FE9BD0084CB83D7CEC379F2
-35774CFBA88FA0460668292E55B932B806127E9953A21234F3DC2ED273715546
-478B16A332DBA4E9FD4F995BACFE211FFB648572B4628E6683BB1FCA63227184
-6C1E7B0EEC7DBC12D2EC7D3FDE590A0B1925C581AC460F873C2A698E4F95DAE5
-D52A2872D795687D3588DBA4CFB7D9CFF2CDAC190BB7B14C25A05852B03700CC
-03BBD5D3EB8108760D942FCF0816C642D0C11471864228D073DC6499E9B6EB9D
-8BED6D54FA3EEE8F83D47440F6004A62491027338203F8B8FDE5250BAECF0F88
-CBD9903DD0FCAE0C2FA3848E1FE0BED94BBC52D740C530570142D6849BC55957
-DDFEA6A33695FC5EE51D31582F8D65FB1A5006F87E3C92850815411F9A5BF768
-E78B7CDC680787CA9A418C56B5B51442F3084C1EEFB6F4C1F9584C9ED5FAD5C7
-8C7748480224A4B2F2EAD2D64F6AC26EFACAF1C50D2A052328A56DF2D3522960
-4EDF824D7F9E86318959459EE2501B4D395198562E5C9D53C6FA0F8FE9FF0363
-82197B9B30D56A80A999AA522C1502D2FE6D5DF512704B7FDCB041FEF68C8D9C
-B9CEB47B15F8D7B74CF7D2CF328B4F02AFEF1A2EF6BC1A3FCF1677944562C497
-46A10E744D45E0DA7A434CE2611EEC8056D331BA0C1E76ABDFBA1AF15CEE01EC
-5D43BE452C090D8BCE86A02B03C9D28F7053523608FB56C7F3C865843B0F301B
-2962F17E44EA805DD18DFF5D7B323E733D2F0D47476E0C701CC6CEB3D68E6D73
-4FED816BD6BC3CDFABAD659F39098034A97388B778FD29ECEBAE6E46F944DD3F
-F4A5EE2737FF5EF2FC6BFC7AC13FCA18F0534A61F2BCB07FE1F3FF2C0A708F1D
-5B478E0BD6E28B98EE9AED665B84AEA01E611D2A9C5CF678130C24E86A8ED000
-BD2B002F06420429DCFB092921512AF879FA9D9EEDC6FB1E83464A48D894AF35
-69968A886433EB620A3B2FE1A2EB577B19384D8503DE590B9389F70A0DDDCCC1
-8AB02CA3B5D0822BB6410F69A35C9159CA848B0F2AC5A3F34531E69AC0CB2EC8
-ABC182E05BBF7E1E3EF0AD8C91BA89FD8D8033071B7FEEB1EE932466A7A03547
-31D03B38DABCFD83F4E6FB7C7698FB11892E86B14542F8CFCBDBBE8231BD83A8
-5D9148E6B2C41D20CBF50ECE4290F33CD551E92A28F7BBC7E2D1B4EB303A4AEA
-41D682037B8A1EE6A8146C81FDC857AC9993DAB7E438328EA8CC01B6818CFA4B
-24AB35E0A6C4BB1A4AB166064B195F7F92A8461F982F6EC9595B7A1E36E72465
-04D6DA6A97A9168EF5A252A1C1E5CD9E9810299A105F59789304AADE75A4115C
-EB2201197CD87FC59E5A601C9B66B816FCDC2B23A062A8EA5693289B5256E9B4
-CDC042F366E3DE8511176D560764E0F92BC5E9A1BA1151A64649FBE4C3CCE03C
-0A427E27ABA7AAAC6EE305FB1C1DD6983F026C64CDEE06F57A000682F880283B
-AC0F18194953E96429BF6A59999DA5DF128503AAD963F49F61BD14CC82266A77
-A20B25BE10094D9D91B3E149B523B1A503BAB5B4AE619552895B8C632411F496
-865455FA98AD63A7F5CE08D08C212CAC5185AAEAB87823282A500A1B0530D618
-BEE058F8D4ED61BAB4CF56CBE19E66CC0D2F0C5E96DF2B23E1E750F050162EDD
-5FF3EA8B4A853C5E74BFC67C3B37E44E5CA5188745E5D18D23245450EED4DE2E
-2166A9C74A595E6C7AFED61479929F9860597BC486BAD3557C8A59AD38B1FC17
-59A70D61226D0E83F416F982CA5F8E7AC98D35D4401DD35A288095C220AA2EED
-4662643FAA021E474FC11C0A9601C8CB1B597AB9BDBFBDA9AD2FAD662A8CE14A
-89481D11C0814475C6972EBD78031F2BBB3A96A3C8436FC7E11A3C35654A914D
-E7C83F8B0521B3BFC4A98C87640FC8050A95CC740E01D8769541956D2C91FB4E
-3E4F5A45F76183A847F202D7B63478358CBAF452CF47F0CC26F82893300D0F87
-A8C0FF3E1505943ABE4C725516F1E52B47EA3232D3EFD5EC0D5FD06DBCEA8585
-5179CE8810B64978B9353C1AC8739B86CAC020DB9326BF917E63E1B4C9BB41C1
-5C165DBF5BB76E2F2E192874159CC287678C20B8BFAFEB61F621CB8185DEA0DD
-C45593CD896AB1E3BBE85A0D0957DF2E49E5BB066C6358FE7DD15D861E031777
-D5AB5336D9026AC2C8C3D041B6025E93E60921508C435699ED0AA29C5443FCB3
-63431F6A0341F4157B1DB8A2199C692E6ED6D3964F552BFAF7A4AF424F1A0F11
-5280159EAD178138A1076F51F7EC5C35E318F9B5789EC2EDB7C788D0A6DC9D2F
-4AD61CBC193222A76928509CB73986E377123B4ECC99CA12B6B627F3BBA93276
-C553B701C5F879E4B38568A77012B44AD4514EC0D7603E742C842D329B629B79
-BF38C72A3F14BD08CADFC25D7908E0B1D83715A44AD81368629E51CC75586357
-9B702B7761839FE17D47C63ACC701B266AC345F1AC15F3C30F0F5322E9310054
-EEE5C861E0071CF161E47CE6155A1BDB6D938996F3EB83BA923950FC90FBA41C
-9248A881226BA32174F85B488F3E710BB7D2376E371D23BE051EB54E15E22796
-675FF7A2BD540B119C78790E0B8C61FFE7E74E2B18FA0D5A7BAA2BBBE9B969F5
-C0D465E11D8F6CFCD8A4ECD536A7F477C86CE7D6561F3C17C4F70D1F7FF4A66C
-E315BB44D8832F9AA0B35974C9B0B741E96B8404DD9C835A476239135463C9D6
-09ACADC65D032E88A9C0FBA78C6FE4F625DF242383FF689322796F9003B66D13
-B9545377F48AC0EEBB187564E66F2A56C04F8B3093B5DED8AD536499A921A231
-765CB71B84DE828F905EB87E3A2B86DA1508A18788825CA0FFC5E1473015686E
-A24B2CE92F10A199A71FBFD56110E7FE7B4AC102AE7A03E65E8CDA68489ECD60
-E8251072A2B61EF9523BDA385E64EF7DC05DD37730B7BD4685755C58391EBB3C
-91D2E04C0840C80FB77B71B8E28F43BE6C7F54CD3A87EE5F07820F927EAA1BC8
-0BC5C897B56B83906F35857C0528044D4CDFE72EF613BD27EC286CA90883F5EA
-B50FEBCC77961B3B7B2A3C95127A697A1BBDE0AD2E485967DA824E46E982E143
-A514888D5FB0DDD91E7D216F6B3D8A92ECBA09B2F1493F520D32B16561603F59
-2A3D4F272BD7E802A871A190944C9329D2FA05F16C278D071B00CB25F3F5005F
-053683F8213CAC1AFA299BEE16F2BEA5F9EB512D60295D216F39AC080B2523B5
-2CABB71A1384F1A5915C255464AA7CFD008CDC47DC9A6DA83B65B6A5D121763D
-61EDEB73F5D1C7556C66D26DF92F853A665AAC14D074EE1F889A0C21348151E9
-231CC55FAAC46E267C623FB80A647FB7C8EA853B1380C623FCCE40225793D949
-49C0434E4604E86F46686EB9B95C5AB739547AB0238B4AE798AADF5D07B37126
-5858C1EAF561017BD4ADFDCF3BB5ED00381BF1638ED5241D6CCC706667E6A00B
-B656856EAF809EFFD856BD53A3FC2710DFB05A0E174AE941A8D60AE698C7DE72
-DC63147A6E9968E8F58357C12FDFE37E3294D210019B402A4C37F21CFEB68ABC
-E68D16E0E69BBB3BD3385969AEB2E4E16651659D31BB700A4D19CCB5CFE85E84
-64422D11C64113BD309CF149252FD5C0128AD0E70102B3CEAF21792699B4CEFD
-14B8219983F1E03F2139256FE52D837E8CA3A010B683D72D041D8055BCEB3942
-8E26C359BAE9B98B98CE6661F9F03EAC9930F8F26CBD4D35DBF12A828EECD77F
-66A2AF677147351D8EE322C049040C5C7CAFCC4374FBE8A8DF601C79830FE6CE
-2BCE4A1988C1DC1C063CA77CBCF6DEB93F01516AADB40629040B2BB9762239C9
-BDC49BB22D7DF3E3764CFB26F6AB4E32F60367C229B6ED37B3B69D7DC77CB752
-58B17DACA68EFBF15219F8644A06E87806CA9F98C44707F6CB21E91E1342E3BD
-7B2659D95B6273AC59078BE16CBE957D9D6B9C24CA9FE2C3BCFEB0A27034624C
-02BA674381EA0C652B6128DCCADCE4EB7069C9E67E96EA3A803F2D0392FD6914
-EA87C90AB51314E25C0CA722D9EEB6063AF0484DD6789D8A6FB1FB6021FFE6D1
-A4F5E64D3D944B44CDEE76F449E3A19ED9DD908F4FF6C1FDEE709526E492876E
-68ED03B7D07186AD57D5A39F79D56443236DCA1204B7FCB3C57D0D20070F359C
-F4CE4EC541CDBC9C3B3467CE5412371FEF041C5E2F3B0B5C2D020815ABFC26A0
-C2E9389C2B8B44D4C628E69C07712659B261BBE1CC681884F88ADFB3D44AD4B5
-F4CF7CEB5584EE640ABCFC226BAC4DBB478927FA2AC5C2968E4838C380D8B7FD
-054DF20862804848359518F189C62752C284867B8CF9A04E332FE1E3FC91864C
-76CA71B1FDC80B13654C7D19B68AC039590937B75EDD0863B62D7D8D123277CD
-4C97B1366422359DAD7155A816F0E9001DF0D1970A345E4AFAF3DEF28F81C7CE
-868ABB2CE5B2C145266A71E05DFC1FF79005D9116AFCF4F4C0ADCBE7B9600E2C
-295EAE977AF481DD81D185FE4A9533DEAFB4A95A91F32A00DDD4807D31B834FD
-B1CFE04F46368E939AC6F1CEF3472F2207135CC700F053F52407BA73E7987406
-E615265C624084368AC04A3666B290599F630C25FEAACFB0F42585F644631448
-79A839A9E8FDAAADD135345A7A69EBF2BBE571DCBF16D6E47BCF65059F71742C
-75D10900D875F2EFD9CB7A1905B63FA05DA0A0413009976A176B83B4A62D2E21
-0D86ADD86C4E2EC9ACCEAF1C5A0A19A1330CAAF6C223359A96DECB2F7CE50870
-647BACD3241D90E8850AB5E8EEB3DF8F9AA8DDD65CE046B7E8B29C3931350463
-A715A39482E550A7FC99F4F24560FA1B99B62FE4DB22DA4D3AC30955E2CC042A
-8F6E3447357622CAC0C961FC4C5EE16CB6BA958EDF66974AA94FE167DE4AEF55
-A59BC805AF7C6F00B8E6A81CC4820762C25577BEDBC24BFC65317D3F95871963
-B1AF96D90E6731FECEAC86368488B4F08FC7A9B4C23D2D9E96FE4DF19825DEA3
-6D9FA6F70A097E55AAC73D3778671B1442F9F81BD8DF5B80344D2F92CEA557D8
-28C5BCEFE5857B9B3A73351B4CA89C172C881B9BA568E9EF1E008A407D9960BC
-8056D9BD08BB53DAF2A577EA903F7E07B8E66FA81D37BA9D9967D43D7D411072
-462370676C259CD1C6C99D42170157A5D739CA097F1BAB77D25B11F63BB897C9
-EDD1A897380917EB694B9A9EDDC1BF72DEAD17BBC01475D090685BBE646F5F9F
-048EF97BE579CBDDED5ED2343563B24D73998833113FB4BF2780E6219B029041
-B7E508AACF2CF9F3B2D1C85290E5344B5C086678E5C8D33C99D2E13B40EAB5C6
-83C8213FF27BE85494CE767BADDD084CBD56E8CFE8EDC9DD3E22A625B14B1CFE
-0F23E0A45165D0B1ECCDB980281D0C39759E46892734067CF3C136CB2985E870
-D3E696D2F3432C4AEDCF7F2C724CB25913949CC417135CE988774B7B21661B02
-BFB37039C04F20403C057EAC33C7AEDA89F66ED53ECEEDCAE68554BE213F01B2
-0FC9D1AC95EA7720921B514EF49F58BC4C8833E7B862DEF57C1F2C7B10FF89AD
-4A78404133D02EC9B4C5D772149B516557A94C342BA907C3AE257B98A44A05EB
-48496A46C8E86874E1A4B84EB034F4E23403D733E5481F0F235508CD13BF99D8
-BF26939A4CA00F13449A143109A2C0A24EC521CC6C8C79BEEE2D566B487B78D7
-F8B30CAC371067C70D71A0A93AFD0D6EE568C98AB4559E3976271E492C15C678
-F9AD0109EAF8778855213DFBBE42CA18A25AB94E1F4FB86AFECD6F1DBFC023E6
-F525D79A8CAE50A6507512690D2DADCDA47E5317899284C2D0B2E6FF8A211CA4
-7AB9CDE6DBE438C0F0C076CF9FAA7D28B2D46B24358762E9F6B850D6FE2B3878
-FB03C70BB29D852EFC0F928582A49094AE48CA7D0FA0B1D20DA43A9EAEBB4F9B
-5043AD9355589F26202AC6C31EACF8C8C8F22F1C73B94C8F5DB698E081FD3BBB
-717DA3E5B0CCA33FF975725075C1682F7A6822A9C68241AE8CC93E97C3170476
-B17BCDA45C98B306FEAB6BB8E97833E70C0B5B314518A0433DB6CDDEFFABB2B9
-A221CEE0AD8E101B9FC42700EE65922C82D1831E1747234EFAB63982D92235F6
-0C4DBA8901A60E1BE04516F3A682438E051743524DBFF410B6B784F740B8E0B3
-9CA6C7029DBAA0E681572624406F2331C30251990B7BFE9ADA2061E4BAD72678
-637F632290DC1D987F2D6301399BBF70ADD40456D212A0BCBEBF947FD0D26107
-01D1037BB5AF3A3119D6967592023D483D463EC7E4474E1925905C17E7F7CE62
-7693A52CC38DD1FCCE98B63554379C03E033768C861C4705416C5E583CF3554B
-6BA4A6006C37BAA69FAE8E6858DB6E361DE2DAFADFF82EB8FF4C476C316B3500
-1E0BB925D21C33985F00223797F1B109253E41BBC99D9DE28B98301A77F2FED6
-1C09AB94F1A922492271878EE90437FBFD202AB6C3C8B6E66A80B862DDF9D1DF
-CBF60DAA668F88A1A624B91FAA8BD574961A4EB0BEDD209376C4174C55681BE7
-D71C0AD813B995508530F30839DCCC26001243A76F96AEAB5E1B45A182D7D3FF
-00124EA41F312422029232F71275F1D60FCFB1B6D26A5E09CE796D72791F3E71
-1B075D016C6A2C119FFBA95BE034EEF1EA78B5F520BCF583B284421CC65992B6
-F319DD039753EF833F450332B056A04A8B3356560C55438755D2842A27281C42
-EDED9E7F7FE3373F71E69DEAECC43A5F585D30F4C7DAF77FFFDDB558D6DA9233
-F8A7504E4B80DF76850BBC3B0174D1F45C3F70869957F82B0DC22D42426EDD7B
-9943ED5A17BBFD3EAA7AC9349E6FF6DE3B7E88CE522A399556B1DDC660E89BB0
-07458D0D55A51EA83D00ECBEBF007D509D0F9DA7328821D981F854D9733BBFC7
-79DABAEB9B3CC3AC69AB9D187DBCD03AE29F2C43FA4A0C5A4924C6C0A8A1E7A2
-25682D001C1A3BDDDC1FC4385B9F217EBAFBA7746AF6CD52A5DD24980B8591E1
-827F57943538CF2ED56FD9D52C5766B5A3C25B36DE530F532A795A8E464FD9FD
-BDB86793EB23221790692E8F6E4C4D5F88FA8C96C9AB9FCE3BAD899CAAFC0D2D
-7305885730B68040CABC1DCC1528C2DDDB37B9C9681B7E021E3190F0AF480ED7
-84E624376C43AD688D8E0FE302A310D1CA0CA912941A52336F85F7429FFE4560
-E082A1A12B75FCE9F1AF0B4642F96BCE0E61EA6798E7F8D0F0F4D7CA90F757CC
-3009A5D0897B22FCF894E3B0F1163BD490E8AFBD523F10696534A77BF17FB139
-909C1C7A69A48BCA3E8F2274F2C3063F1FDF0905BE8C162C7D790293DF5DBC9F
-9CCF48F98817AA69E9E9BDE280283A137162ABC9B27B0163E67EF310B51B51AA
-DF31943B3557785D5FFEAB1B34FC368409334D7DFA24CF85833783C7BA801BC8
-A95DFA28402DFADD12EB9D4B1F6C3041DA1C87563585D1BAD8AB65F0FCD4015E
-D21569A0AB4FFDF3265E1BF3F7F1A43FB96CBF13B905CD46C3571EEB02A3190A
-613B6FA912368F0099F30E8E64FE899411E4C072CB63E2C662AFB6A0EDC2F082
-1009F5681A23D7460BDA4ED4F9389A2FD7EF64DC2FA9B2807F2B307D44062371
-3AD4C8D327120BB9061BEC9A5834899896A9638D2F846ACA0462C9C8279E0AEC
-9FF78C7D6BACBC7D6A15A0F3E48A7E1B43265201F1484ED27410A484B38D6465
-9B2A29BA97294CB5DDF0099DA4727B8527F454F37004BF9C4901A378E1A623D5
-33D9B460D8E182691B4D8334E836942B0D34AF6C992540B4E092E6A883337DEE
-A359B9492BE06E8306ABCAB5686C26AA3C1FAD4B5A1313CD3C1B4D0EA2CE897A
-E1DEF890B729BDA6DB9EB328D1E52B4F999A0FC3ADFB787EC38BF65A3FF04FF4
-5521A909DC11E204408FAB630386252D62CD3F09ACF2FDF1B29B40695F1836F4
-2ACCE65A6266A52353665E65CA65A9585701D3389D23299D61A687A6016C6DA4
-B7E24F5E9F570B480814923A33193261B00BE584F9A35B92BC799B0FA940F4D1
-5A61BAE6E7F6ECFFCEA868A6FCB4B40C0D7F0D43A42DB66A287D2BA92A6C9ABF
-891528E30DEE34C8880AEAF2EAB4826A28E9F7097CC376579CDB7000111D2E9B
-66AC6207D5DDD92096455E86DE62ECD4C6219401865F11B8A8EF73000B5D3B61
-0F89405A82ACD6A8D675C44920E281514D16C177882518FC4532B2AAD2865270
-B26D955148B48478631B7493D5D68B590DB12BC72EDCC64BA4FD2186787BC161
-CE587F9F3E96607541C180114B16D058ACC89B425DC8C20165B881368F0E5292
-F6DB2F8350080072E258EA2C5E85D6419A72BA782DC01791A4959F08B2D40057
-10711744CF043A4D5E3ED3FDFDB4A5ABE1D842097380AB8693DB90A0BE28DDDA
-9C24F9446632F1CDAB75FC2A6234B15FC294D41ADD6C6E95B13FEDFD3BCEBD3E
-7BDFBCAE303B6A8BA181EE4B4CFC4C20432C75CE5323525C671AD4042519537C
-C934C699D9E00D605AA1F8A3635116C02BA07760B62DFD50D059CA88C69569E7
-194FC05579C53E8D8D9D3E9C0D43364C99401CA56A0E6DB8BE22D595E2D2D4E8
-6A251F9E9812DF3F355DBBFCA7519C53DD3C4B7501E11455E87D9BD6BD9B91A7
-50AB44142B0D01E7AE2548D0F544976E0172A97114927B0C4FBE9043575A730A
-3F3FB0A81906945BBC36CFD6573044326EC43B5D42922956EFE60888332A3513
-0B690D4E024A9A12175E39D5E5955790B9E5AEF3451FD1992079290DE16E36E5
-E6C6347F3716CDBBE22D39605A27024E5D441C9EFD849B02A4E43E4DE5425CA9
-6B6BA2C8EF676016432D4AC709BB0452F072D6039F7E33C33B3E8E1ECE0FCEEE
-2F6D083786DBF65E62D3A4D31C937351523E4851DAE2B60C7DC91194DDFBC13B
-353710E9A471F2830667C837FF0C8119C143144FF8B392C2BEAD2EC5F7AF5EBD
-DBEB4C36781BA28CA854128182F8D21760044B97439FFEF7C16A06778455687C
-9DB73A44DEB241F1FD9A5F57CA2D810B0DC8D3E0B87C242B916F68DF74B6A46E
-BA6622BDE90B6660AB6AEAFAD5D1EF04BE006193194A295B0CBE5C45750C5711
-A338631906FAF7A915B1FDB38BBDD3B4797B96EB4C816B7F13CB803E2B1DC5BC
-ED66B603C68CC23E3125FFF102CA544EF9ACB8289C19DF24A9589147392767CE
-F2D9B47CBEC2765B6D2E9C40B67534C01B94E07A6991813BA31018E86803440A
-C9DB6FC5AC8B0A4C6DF96C7906DC4D3F51F99AB314959EB94E82A1A5B84DFEE4
-D10E438ACFDDAC92486835C46E120824D0B8ABB3224B94091845A22D15600F0E
-5AB1B4C440529CF7957FD36BB2C7362251FE12FE59EE41F2FFA52236BB97DF53
-C29F81F4805992518E02D747E802D38B8E689BB503DE7928634D64352ABB3C68
-A073988A52DC63E1D606C18D68A95BB4F3D1D26799EA02101782CE1154478B36
-F4C0F4C72C032526C0F28B0D49ECA060A031D84EA9F5C58E38DD0E5C36F11BEC
-C5D9DC341C9161F092C1602E2BA67C1BC76938569701CEB25780E1D346582C2E
-716674ADD519D650E158B257D8212B9734BC1777032AA477429750BCA4776719
-82C313594CCA6F1EE1424082A43699F59ABED9D6416920DA4B69DB319E7CB0FE
-73E46699B31917C1453FC158262344098378AC2534954D78EF9B6B73B659E07D
-94B187D72A93EEADFEBDF1C7236BB2DD4CD70D79A97A92E0327177FE0A36AC5F
-5F396F771608D2BB8D90A349833FF2DD24CC8A46E8EB6F36B31D3E51A060FFB8
-FF66AEA579648800CD0C8A9615C8E2D0550523343657D6D509BF7094065EB390
-5643EA96270B1EC6D338602D8C8C72FD323E97319E7E4CE802CCF245DF7B11D6
-917D32B6B7735C3EB089A1071FE012C72D4336EB2B68E2BA85677F919401E5CE
-442F3CE48909B6AA122D9E16236284A571A5A3FA0923FAB58EC8DD172B2B29AF
-5A5251BCD86FEB0EF87F77281F686C1A14C734F4E49C278CA38ED3A5C0342CAA
-19CF6315677DCFF0FC76759A2E08DA2DCE2783D4B1B9284DB4F399A78715243A
-2610A4B1D34E3A6D5B0C42D96F19C4392A63186D941FBEFE74A2F20FA4B5D998
-5ADC9CECB760FDF57BE53F057F726F164C9072BF499BDDA065979014B83E7A2D
-DB24B70426BD9CA52768218CC89B3CBF387D550669FAE2FBEC1BA690D2D1D104
-F4363412050787C325B900B54483B7EE0B951626422963A54006802FFEC1649D
-476A8C4521CA07C68EA0D74150B1840DE5B9A801E7DF3A8EBB194B11A72E8409
-2772084D0C37AA9A158AB21B49EDC3EF581CCE7AD4880F17897CD61511AFDBCC
-8ECAE00DE43CF21A4C69194BBACFAD417C93A71A350CF087B77A96BD7EB9A198
-6B01A0929D968BFEA348475803690EC74ED1CA9032F4E201081FD85BBC6789FC
-4466A642A99E8F2EF742E5DB88CB2C8E6B1F15A29A2D25FC3B579F6DF6713BD2
-B25CAB08F81350C31E7E0FCD7DB5B9CBF9EE07778AE32322F684834F2F223D56
-62491EC149964AD940491C1FB4A5BDE45B8A81FE990EC816F9C3BB17F1D5EEF1
-FBD54785D787F6544A2429D7468878F210495BEB13F3429B8603CB03D1AC41CC
-82A29B3A3E23ACAFE098BE5E60CBAF6651CC765DB907A81A0C9AE730EE3C1170
-3C1CD8B5E4BE68B705502D97329D231AE9C629A3349F3E88270692E476E281AC
-92C364493BFA024B5BBF34C6EFA6995735AE972CB8652AE61331704DCB10C42E
-3B944C013734CCE07A91A4016AC624B5EDDC2B49E633F6C7F11A8F3503277ED2
-AFF98C4A3868C67A4960C760456420F4EA8C28606690178CF6335FCC01251EA2
-93A337B0CB1A51A1234DA080DC0209519A1D92CCC2100BEF87597BDAD3EA2B74
-27FD9E35ED1CA16FEFC86C087251BE83D80234B6EECC77D19FEC8944D5C344F4
-CD89FF27CE457C066F5104C627D4830CD57DFA3D4B416444F4129DCC2EB064BD
-D94E6888F7664817C3332FF17759435AD4E95C1710D0D72D6A7D7CB179D3EE53
-5E86BD4993A87996B4E793AEE530D6382AA59AE08898DCFAB4151CCD6F99AC59
-DBCA039FD79C24234CB479CF85BB7F99B9FD82E8BDF9776F7FD5D5C03EFC90C4
-4E3A016C7E653A1870DEEC325B2A08B0E636F4DB6949DE052FA593F7125B0D4E
-177162EB4E6AC264034C82E33A04F9850D6E1DD28E26476D46CDBA5D46F4320B
-01D2EC7EF1E108C82D64169243BFA6AA10A6CE9CC9225FFE15F71E1059D7033E
-C49B110FDEA14578DC663480A9B753495FDCE6881940D94C0891A907E0E02F48
-F8B2F61DF35D27493CDA6563FCFF9FAD1A2E41CB27E7A1B541C16E5489525A67
-50314E35DA4C6F2F82EE6C482B72537647F88A7A658DA89FB03373735EB1A943
-58765BD68F9C6644A01FE7DC70CFF3D2FDF5C3A009D37EA018D70BC3BFA1433D
-064E82206EABCCE150D784C9DB26FB54D3FDE40B8D7002ED0006FBB3A8D6AC76
-90B4362A900AA027782E6E31F0C53CF90516BBF375EFE5D0A40E27DF4A1441BC
-878DB3D53886E0746DFCD8B5111FE0AC0C96BCBA37077381E72194163E92C7B9
-7AB1731086258DB9A87F54CD7E58F1156020C7F72BA15A68F0EAADDD80B75523
-5367EE05111189354281E390B4E86198269B954FCD9EF07F9D957AB2EE67FE9B
-8C6DB530207753D889DF381D2E4AF823716BF9781DAC4C7548C385A62CAA026C
-CA5FCFFEA7FBF09A5A90AD09DE2E96D03C0D17ACB5940F94450B6C6663EDEF8E
-1613B93AB0D980F5AD0EBF2158D816E5AEA6262C4CB6EA4A01D1D81713B879A8
-BEEAD737A0A8684C927CAB5AB269EBD1A65109A4DC373149482B82ECCCFA24AA
-54D04084C229C625FBC19BAD1CA67EB23A0F9F9F16EF1566F5A29F8BC28366F0
-3C0164C58BDFA577C564BB2AA923DC5EEBC1A48F8C67B6EB6A5787003C691C42
-FA13C71EA7F6ACEAA29E1A6F0E7233FF9DE42D5E79433B5823AF41A99C4FE074
-E669EBACB04C9E7992A3739EBA956EB6F385D20958FFC2FBCA7E91C36DFCFE15
-5B78030D92EB4822E16EA2D5CFAF548F6DF59BD118987A35D67D67429FDCDC16
-A22EF6745D7033896A09F3DFDB36CD5DB2172FE15D4651EF4E871A9960CAECB3
-70E3FC83CBB5E1B22C52A46F1AE96EA361812384C61EF14EB326026ED0B94CA5
-A94C62E9B9817FA83DA4DCB60CE5746EC37F2C235B6F411BEDA030861D10977A
-A36E36720694009ED6BE27364F02A28BC7BEA691A5F7FC5F0610665B8B98F183
-1FC074B69C33CA23457F5925174A23B267EB85E9A9DF7FA7C1D3C3C9BAE34053
-455486562EF6CD906707A4D771E19DABB1B057F04D758112B2ADAFA1EDF3C3D9
-2CD2D77D61557E1BCAC2D756DB060E9D2834B41E6DDB87ED4827324D63988C24
-9440A816C9CC7B59EEB52F89863B27068111CFEA00EA162C2C44494E93E2051B
-ECB2577F6C3D9F2084C41E12070A8FEA78FE7CFC3B2AE181E1BB177E2F33F061
-9CBB7F4FEF066E63FC6038E43CAE90A4EA7E6122395BA10C730064E67C6CB284
-65567991D64C5BD47025CBA6EA0E5CAA111DD891C383CBD8E688E767CA0EE879
-9D60F259E539595348EFC1BE7D46FC67226F1230B6E16F59A3913ED0634FC1EA
-98962C1641177C618E38FB038CE792B06DBCEF5771D19DB5CD047EE9670F4508
-5E8CE0D6D3986F606A77C7BED728D7F8638087E3D5D7F76E1833F241EE14F6A6
-EC3D76588ABDA5CA79668DDE40F014CF285B5888CAD8489873789493DD3D27D0
-0A9299E68D61EEB26EA367F1927A0F8E49977CA12E4C7F04BB77FE3069130B1C
-4566B996311AC6FEE5F66561F5D2CFAF31A8ED3AF8897BD1929EBA5D09D03735
-E3A0157E61A48A05B5A4F1CE6916AE4C51F8E81EA6117D663E34E5A7222748E3
-8E46D64D8D458AF7610A00861A66D1D1BD47F9A37CBCC7A0DE20F66B818D0FBA
-2C34E6A560216CD2384B5C58D4C2755C8FA2FDB66D0AE9F5AF647B5E0C30430D
-9903489714236607C979F2E12994DA64794D4B4F541B1DBC252F782D007638E6
-14DCA8B2738BA9243D707395DACD052340EE41E0D481282AB40C0D42D0185E7F
-AF03C64FAACB36CEB3BB8053D3A8AA6C1D5626D27E93CB0CF2EED4A9FBA8B910
-0A315118E3BB6B7EA84A817A728E065624ED0AB9867019A358FF6E55FC6872A7
-33E8611EC84ADA92E51C50427AD3C22684A54526B48B2C58CF7570BDAAA73476
-CC26A3D36302F349F37DC5AD02A967626B10CF4AE6DB99C18C6F71C44446BF4C
-A682CBE7658AE83374D43E5CAD63806BEC29DB228AA1FBA0943C135837A515AF
-8B55D087F7A6760120FDF314BBF9F52FBBC9D9F013AE5A85212A5EC501096868
-8DFE1958EB6A783BD5E0935B9A1C42EBFBDC86B7915600303514554DC0B5A4AA
-6494EB18C2786DC7F6AEE22D1892336DDB607E9EEB8C71CFD02D3194AD1A73AA
-C1ABC69F794E128E5FF380BC01F4798FC6992CDFF4F0EA037282DECF99F45C03
-FC8B2B6B55747198A0176E54E532FC832602DC5027B4CD4BC5C5D8ABE25FB019
-789AF90B8A4BD8182F8BEFE13D6F1D5B13B818DC8C2483955914509C54E1743E
-A413E005F5F6856D0C1995AF86829BEDC2CDB3A4BBE45910665D9B520A879AB4
-598781138D35584199E7E7F682A847F6CAC2B3F2E05260BC302602A21CCBFE3D
-FEBD33B49C3C3B4218BC76FAD312D105EB6E1BC15E3BA0FCE6B6A95E6127B734
-B994C4EE09AC2DA6C958058B564A958EA0BFC04CC552CA28E75FC4D098E6C6D6
-943222CCC51155F2E3BBDB9901D52B4803BA384FFDE04FD20F5DBB5E9A3D40E8
-DCF6D76DACD641A96BAE0E281B88A9EA80D27D441B7AE1D7BE2ADAAC238D5B51
-43DA970337CCDA3E978F99B37CD2F1B6FFAF3BEAA267BDE8DD5E98D1A2A869D3
-01BE851623656E091696920D5BB24F9EC248A8CA28017E58DD9C48E53A9EA7FE
-8C70D4CE0A878D3DA52F3C575576C4F0BCC2CB2D35609ED39326320F58DD8E2C
-30BDE298B619B1745D518F2B8716880C813B6B1212D3B6BBA5152F9B792B1011
-84725D9C3F784CCE5932042EF5FDB73ADF28F1AD3912D35FC4B67E23BA84C35A
-4F1E524A95D7FC381F56163C02736A35DC7277AC5081D74B32CB2D6A34E7D866
-B92405C3C2D4A897120CD143B7874E3CC1B6803328A3D52EED3E92DBF27450F5
-F34ACD9DBF87DAD9F130DB9D487A67EA1D9A222539A412984207F4AB62A5592C
-358CC8F8A786E5461354ABFA8B2E746CBA08E266E1E06DF2F4955C1EF281DE39
-6B32FD4A1398E2C59E295A4CEF7A0DD49E135DB7FEB7F7C663970EBE419642F9
-E1FD36D1E5C197E7788235C81C36E6B4C104BFEEDA4F0C1CF0B5CDC6C09CE358
-218A907AA7E47CD1ADC594B4FE2F7FFAA606E0DCFA43CFD3538423E145C6B2DD
-38D3FBA074E97F1FCDF24285BD4291DAE16339AD0934A04ACBBA910DECF83895
-AAAA4EB2924C69396409DC474587C310E3CDBCB8CBFC417DE903CEA643F80F04
-9ED88E90E45562291A684D5344DFF82172B1B6AEEFB26A0964D35E33C0C3FCE2
-D979DD4A1C21FD478E3431BD4D440AF24893979008E0AF174C9AC54E6C7031BE
-E37A79D234544D94392796A8939B685D931559EFE19465564C18CD2972FBD929
-1829A64F790E76F4215E45AE0F8B0C6CF74E9BD1E15F5D76EA2E13D6346239BA
-FC95D4C89459A86BA6226EA3FAE0B1493FF2B1ADEE14926AD908EE0251E0E0CC
-F8D88C3AEDFC24DA6713815385F68E05C60444256819CF07964420F1389319AA
-44624B53B9CB0C6844A3C2C47635665E45A9DEF0F78EC59CEDC12D9E23F7692B
-5F2A04E3E3B0E2295F593BBBA3B811BC4E33878035A0109F9095399854384E27
-448FC4523808CBE1B095B0D21AD1DEB529D7CEAF5B22311B6B1F53B540031889
-3903DF99EFF332330A1E116729E6BB5EB05AD82E6D047C6F53CC7B8C272E1961
-C613DC557A656D87162316A0BEFE30741A69F1DEF72EEE442D6D5141B856C2DF
-5B4AB35B6197545473625FF3CCA81C2DB8A4EA622A5AE80C40E7F2379F35C87D
-5F0F264DB53AD10DD5209C3741CB50B2C51C50B2CDA647A279E591C6249622F0
-29C4EBF1FE98FFE5C1E5737DEDB9A348A6C66DC34DCAFDD983421E44E63D2804
-3B4286005EDF109F2A306CE74488F13653DBBFF9F10F36205801E217C08BC803
-AF2CF71D4C447A5CE08C1F7C77D61A1D43E6BEF030E69C72BE027512C9309B11
-902793FBE1CB3E990E94898A8D9E896718B029692678C29F326D4053C7EAA2F9
-EEC0DCEB5AE860D49C49E1F2B974E9F268935A428A3E66C9B5E66DC10518B2AF
-6B19F339114259019D6B2907559DBE1A8DAD8F6172CAA69C9730
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/l048013t.pfa b/lib/fonts/l048013t.pfa
deleted file mode 100644
index 4c9d0c1689..0000000000
--- a/lib/fonts/l048013t.pfa
+++ /dev/null
@@ -1,1233 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiSans 1.1000
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.1000) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Sans Regular) readonly def
-/FamilyName (Luxi Sans) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch false def
-/UnderlinePosition -36 def
-/UnderlineThickness 72 def
-end readonly def
-/FontName /LuxiSans def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-215 -211 988 993} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078987 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D83F2EBDEFED79F2D9B89C
-8EC53816C50F0AE382BCE732EEE6D88D5DBD81066D279225908FE82D1016823B
-76A6ECC3AE378CFA8D4858C797172833DBAD7A6E3394F8E694E1492FE4B67412
-7AD6A6ECC7A6ADC95E7AB30E84E5C6EAF70F5ADD2C2325538478BA68B505A016
-4E1EEE2C4BC00D82994B690B0A7F593DECA6BAC94DF9958F8C9D4A1B5E8CB301
-F978E31D098ADAEF1A8B0C49BE16CF963236BC1C98BFABE641EB28E425926D7D
-121C3B5ED3F3B331A592397A0118B79F023A1F3427922D646B40F1535AC406FF
-9A6639600E9DE05CB8CB72DC1C2315FF3C04432895774FAF2E5BC8C409478E7C
-5E14212F16CCB01F40C090BB951FBF5866A7C22C10FC75DB5EF8F207AE4FD07B
-10C82861AF1C7831ACC5759E0B603A9D8292CC48BD8720C06CDFAC12C303437D
-D3B5D1F4AF514EB57314E27DBDF3FF7C4F1B5DD60244CC8C383F433AC4D74E8A
-E0C76F22042BCAF8E576FD489CFE0ABC503C5BCB003992FE159A65392A4AC64F
-4E555112A88333D6CF854A48727EF93AA0BB589426AACDC7C06FA3D61049F58C
-74416E873A6B6A2198A493F73834D5C19BE517A92C5ACF16093E2F797548DD37
-FF9841B166114296FA9D03CAA6877981EC35D279B3795106CA671228224D0B4F
-D4AF3640A59F9E44C59541F7F06DB11535289BE84587C698463286E342038704
-8D9B9A670A0D11A2B5C6C2E2A1E8F4AFDE915A03AE45CE5947909B1FC9A03413
-75AA4857E725120F78BF6CE2ECB35F685371843C3D95512572A7A0E3BD246ADE
-AEAE95E62E9775AC24597907A8B56AEB88F46BD4B39018AB8432D9737C5CBE73
-77A82B56AF95293C7D0D847C7A508470CD6762AC896FE223E17730F05C9D3747
-E340F37E7BAF694BDAC9ABDB97BC12ED7B01173D3C713E0A8E68E10DE647BB03
-E4E67DE1972165C1796F5EBACF057A5AD7FEA38443D91ADBE54028CBA31F75EA
-0DA41FD14F15496382A0D8C9C27BCE1FDD6A5164F70BFA2C5B334A2D2DEF9AEC
-F1C39CC0484EE7F97A39D31A46CE50FC7D2CC52420898E2052896488606A5328
-FB195A9561E9D5A41A4C8117C86EDE60F80B6C70796B90EA9D3BD5BEB05E6656
-A8BD35A2A884BF8677D05A1F8489FAEFED5C645AD23A141ABF3E78C69EBBF48D
-14884B29D1A4D7F03A66EEA0D0EAF7476E80EE45A894E706B5D681AEE8B31E58
-935CBE30E790B7A3995331BA9B0FA2F03F9A4D326F249BCAAC590345596F8369
-028CCB95F0D1CE8A44391C0E9526214EE28927FC98B3BF6676B1EF48DCE63F3F
-48695A3AC668FAD1ED3B50A1FCD29ECE9E01F8BC3012053AF96B0C7D276749B4
-8CF046E7406621979A92FBEB7B5DD5CBB154ED51C4A9A1C13F6223BB54F6F3BA
-326F6EAE74DBD8B370A25A7A1DC320E9A17CA230A868B752FA7FB1065F435BE8
-A3EA5775CCDC33A360DDC25B2891F7D2AC399BCF6F789109CCB37DDD02BF9EB7
-EAED7A9CE82793DF6FA7F68F9D45530A14EC91D71A19A9251BD810FBC9934F19
-FE4FE1BED828FF3BFA6E91244AFBD8B430B53106AD18F41DF767E2DA16F57083
-B8F66A0356F80C30B956C43416BA6E5CB805AC10ABBD18B31F8BEF14757877DF
-152D286CB6B478EFD4C88A3DC1745A32A56D845A7E61034C7907A7EE957A4C7D
-A6525821611CBEF18947E727A49E0F765D648CFF974273D18A03080EEBB6211C
-E96439F86431EFD0BCC4CA2D2D8A4FEFC65C768D28FCE6BBFAB055E0DF961A52
-81ACE5A300787BF4A458016DB1CDB671B4867E5F5103551007BA0F53117D733A
-0D3E8802208CE1C54965A28912A03CA12D9C34D7DE9599E6DAB5124713CD716D
-916701BE3D6318B19A9E2827E94D4FC3F4D7D5794228DC958B3FB82617CF21EF
-D4A5129EF9051745A52DD66EC77E50F35A8793858819131F36413715416D372D
-DBEE44AA952C566114C8E3A21EC8BB0669805F48BCB27C92E609905D39C7FB82
-A62A627280ACF84937B0F10E132EF579B69992A1942133DA541F50CD3A51FF2F
-C56C10C6ABDA32C83F1DBB4127843928A4F6E714E815E387588478BF941F1F74
-E8632BD28851474673265AF4A18905C07A4EE77865CA41D23069615FD2176AB5
-2595D1E86B86DA9D0C416B67497B6B9FCB3E3F709C3A4E552E9EE130BAFF3810
-C30F41795F68105BB700DE11773B6435AFD59D7815C17D2D0C33C824550CEFC3
-1285EE76EB1E72D6D3BFAF60973919F8FBB4E2904079F53927F7F1FEA66FE0AC
-5496A13D446B0FBADA61467346AAB2E5A9F61619E09C929FDE2BB660FF152DAD
-AD834A43A906585B1B48E90D2AB718011880AD2A3431E5C9B2AAD5B9E401973B
-AA944A69F49810FC10FF7B7FFF0BC5A2FE856D757DA569F34FD03953534315FC
-BED3841FCAF428FBF5210F66C961BF468F25A82E0D6868D3E4B93F95F9B04BFB
-D9B99488FC520678A862EC1AB774A0CE59CEB043230B6DFDB2309D0FECEFD69D
-8D49085ACB83B16034AE0835FE67AD57F38D369F4D9604CE276CBCBADA2F8C0F
-3230E3525204E3868B0AA1E8B387DD2567E000CCAB04929BB4F9F5DAA93914E2
-A4C4F6C5E91C51725CC94DB972FD7B8B46C868D6D2FA9B63C84904E9C3EC77ED
-FF4ED0FB21A310ABE4C54FC6D6D18CE039B4407F06B95CE7C262F789258D0585
-BEB98AD999A28751FAAC37BF6ABE82331A9428F873E91254E820DA499C11F4FE
-85F0CC83DB4763D6B4C6B832D3AE8CFF77C0C883A0B41A21DE36A1D32DC13EF7
-D35F3E86C7EF1D8461B171813160E56FDB2A0232D1BAFAE968A4FB67BEEEF61F
-7273B238C3E2371A05B71B15D8E0B460156A5FE5DA20D662247CC36385544C4B
-A52BF88B7C20C78AA08BB0FA4835FAB7642F195D29A5EDAEEFD711169ACAEE55
-1350C30E459A4EF0D5E7F7C068D1EA4882230D157A51D639750E2550F96D752F
-97B0AC14EA6524AD772E10B6E420584990F0D622598832F519FF9CB6F6A20E79
-6E75AF675E3886621421E2B0DE3AB619E6D0C65AC4B7366BDBA74C76C5F6DDA8
-9E8D11F672D02ACF26766D7CB6185BEF931A4ED03E3745DE92BA86660BAC7865
-61F4A64F959A7B4D825E15FD9567A957B9C672ADADB83070795EE44D7022745A
-9E8B7D0C03ADE959A33ADAFD9FC69A0EEE08FEBF24674B0B6F16B31BF3BF0278
-68B511314B4C73FE31D640D6726EA6051A079A7F503C6C886C9DFFB6D03D2E6B
-AAC0BAB66F9C06FC11A4D7C165CF97CCF9737899D41F602E326BF02394F6E438
-A579EBA81C049CA9B773C10BC5BE33353775FFE01E3529DB4FDC9467564372CE
-1D2976040390CD1F1C0DD3DAC8936854A0E9B5074730AF4736C0E4F040759B69
-5AD6A1C46714E61914180D1F80ECBC33689CDFBE788204DEB11FA4E35DD610C2
-B82E28A25991DC4E55331DB54345E3D11EC304B7B25CFB5F1762444C55AD642B
-8095CF31A30BD6C429497BC0904B1F06EE90FD9926125E77FD430AE3852CA235
-92428660C10A19470784FE02E536926779B248650A6315FB8B784DBA9D226B06
-09C6900E5797693983CDDCF08754C3159545042ED401B364A45A9FD7BE0AC6DA
-ACD9120E8114EDF40F21D968935F1BF9DE05228EC140AFB1889AF353996B79C2
-E6795E23B5D0CED1E0FB1E6A572C6746958619FAF88C368EBBD742570DB4CB4E
-DED4D19E89AFDBF6092D5A0A48372685DD9639A32E4F91ACD9CA3A9E34D64E11
-9AF8E6BDF8674D52F1242D8FE11E19820F26BF1F533C34EA6471A4C96D4D5207
-A9AE99536705F6934CB16165657EE6F6E7CAA7720D4AAFDC6C075346672B3E16
-001BC35A331F03524D28301FE77D9C8B5FAB0BB872D568D5B95B2DEA4322ED4D
-0DC15BA4F0C1D1AF924873193FB809B689646A4CF1D97A1660F953C82211E4D2
-A58E370AF2693919EFBD3C1E18BEC7A472B20DECEBC0CF1861AFE3978C993CE2
-3D7E93946083689CD61E6C180B3EFA962E2BFC1D073F7FCFE39EC0F963C51C77
-B2A77F81D20BCAF1F0B5DC1AABD9869D4497CFD90953EEE70993ADE80AB6CE15
-864AC0BA7FA4B666C54EDCA0A0F9F67CFBC21A3BFC4E2303F5849C130B9B7E46
-0A8F60048C57FF89DED4A6D5976635ED1AFB0331370E53EBEF3835107D02FEA6
-5E28A746BA8E0A4AD649E0CC03B6AB56398D922B96133DF7024BF83A46A0EA6B
-E4B05CC77A461AA0FDCC59E90FBC96D16DA364C2DC55E618090800BB3E8A2D90
-CD72A4C067A1C107EC6B0A648FDFF3D05C508C4DA9826E7082CE58C2B027C014
-6C001421F42F21B18221E7AAAA092EC197AF592EA3D432175856F58FE7EAFD05
-B81FEDFADCCF38AE807B2DCD8E4260E348E3B561E72112DCD7BB0032120966E5
-5F131F2399D9C89AE65CB33A354903D37A9A5E480EBAAEAA485305462228C88A
-16F99457F7FCB1538C2BD86DCAF01F6D6404F02FD91C82562EAB72EE21268867
-CE2C0F3A083719E62205D0090F64F694CEE7F0F38D57D01F3732839933DC0F8E
-DF5F9CBB1FED7FB149AEF7A53C644E17A672DF4F8BD4A0ACDBCB32859117ED77
-82ED68468C311C51C8851ADBB6A9212DBBC84EC1B88A4AA31CC6D1F764AD69F5
-CEBBE3F7983C3442FD91D7EBAFA16CA047165BD327BFFDC247F822314F346D2D
-D3E28BB4C05C485438E70E62DF3E165DF4AB31B0CF7FE84F420304D3FB7D11D7
-DA73EDB8834AC45479C13BFC5B845AF24C2F1A4711AE4BACE4D60276491D1BCA
-E3A3667563FEF12FBE7667F1EA621D0C241E49D68B09BD92D5163246425565BC
-FAD5051C5CEDAD508F387E192AD94FFC7184F8BD2530FC7DD585501E34AF3846
-BB1295CF417B218758F11D342792D81C8CEC903D970E51BD263AB1BFD6E9B2C2
-76E1B061522A88930712D2C169877295EE5340A4D1C3F69B9874E5CE3E3C82C3
-E7CC446BB33407B2F2B13722054B9E4286C06EB291D0410964FBF53E079D70C8
-1AEBE7D82ED6C7F95A0F83AE408196F9FA71BCA747448B3D94BDE6B25D9B1B17
-4C55496B3D0480CAF91E053B3FCD02C6140317DD0457EB98BC899CAFA6D274C5
-06FD587285251051CD5DEABD6E5B22A3F42189ED36F3A5DF75F8A1BAA892D296
-13A466A0FD134597DBCB91BBC63400CFFE7B77A8D09367F2252C22EE637A686F
-C076ABFC10D88395D376ACE6CC23DB7F05CD6C457ACC83FEB49C6B50BDFA075C
-ACF9D01E6DFA07227E28C3F651EB02303A658355BA5176FBAF95414C6A704FB3
-C8025111091F5482A01628F05547A9ACB731A291F1CE05EA8D6574272DC2FC4D
-48006EE157BCD0AB293CABF3B6201A4D90350EEE2948A444F59C774847A5F3CE
-76E328F3A1AFCB732F339DED374E8FE3BF9B964C9A26B3E1C3524EB27FDA0B4B
-EC483B16DB62FAAAB326B862529E0B284283AD28E80F362343BCC66DF8EA0E20
-38AFC2F98F623770538A38698293FDEF0B75E3C5D851094CE5928150C7296240
-1FB139409667CDEE7605B4F16339E2C4A9B94E316D7A6B271182A19CE5DDBE61
-458DA5B24620348E77D1EA20B096050013A299D52E51C07EB68C151F6EC394D0
-26D6AEEA446783C64E15E7C7602522500E789A4D38EDC317AB7CF6765DFC3190
-FF1B84DB7A4A0194A4400DF94AEE615411313DDEBD12786D1720430E0DE1278C
-9AB02BF0705A2E75738D65B832DCE7751EFFEFC699B97CF4151AACA2D94623C4
-73748CC15AB6D1A07F5D13178979CE175326C5110B335E47A53F45818FC9E4EB
-5F7CB8332E12CB441FCEEACD64AC84BFEF1E858C5CDF1F0E895CF1AC75BF2105
-D2B6B86C14E9145BE2F22792CF68CCFBD007C728E816783AFCA822730EF16766
-2626857E1E7C525793A38955C4F40CFB8E42F86AA9A0CBF0296F9C54626FF1BA
-E25D62B530221D6421EDF9E5D7BE7A1311BA3AD0F48771252F4FBE4E55605F4A
-0A520DBE08CC94B181952D89633840FBD1F79BFFC71090E918076A9053947120
-70635D5EFCDE3A566101104D54B346DBECEE79FA87EBF54104904756ECF68B32
-2F6F26103CEE3B06A882DFFBB0B08BF9BDAE2C8D9AEF88837235BBC2CCF19C9B
-E262B6F8748CD3B0224E2237CE0413A4AB2724B6BB3C3391CFD6E8C45AC32ACA
-7249A955656967035944D14823D7EBA0D4FD6F3747ED319A6B133AB8762AF94A
-B43B1D03FCD9F63766753EC12609B8CDA51E65875B04A0DEE40F768D91715D29
-A06076D2712CD5BB154CB9E3E77F322008C505F46FAFB3ADAA066285A50F77C5
-8A9695E324B6A24B1D96F4D4197EA627089D71EA7371D0D0348B8893E5261EB3
-F41BCD40EE77A02264BAE486CB345CDEE0C00A98ED7F96A3AC6CE8C534F5CEAB
-889F7E3563092DFA96C44A28279AE30DCE4031150E2A4F03AAEA5E2D854D8AE1
-0E2DE62B83B05DD9C7F0BD5ED122FDFB6D4E5DDE5BA1C27E8961CF61119B482C
-69055C36E2C3A1DF9165FCD5F24CBB5D6143C9E43A0F93EB260CD66CD4BF54AB
-7AD064FD0D7B72E71F51464E7CF407BA9D90368ED4E9A5D11E63EC7F7E2563B6
-1678DB1300C88F3EB77DA3AC104B644C799344A7B93B7925991A065087ABCD6B
-4C72F2C60B3AB3E9B1B008DFC201E2F48E47C38ABE247B622A75ADAF193E5E9B
-301E0F19B8066429FC8F64E1E5D7822CEBBDF08B83A5E732FB45B211090F0A90
-EFDF2FFC7BB6A847EA398CAE9BD0562F73DBBAEEBF83595E5774C5290373F3B1
-161905296921A55C4C8E9C925AA543338254E7D9855E01803A2EA96B4AD8ACF3
-E4682030B7BA428C6C505C9F6A97567E568029A0FDA0652947ADFCB7FB74BFB6
-F72CAB5267EE86F34D878C62DC81BBF22FFE13CB066760353039995E461AB2D2
-040ED87EA2CFC54F2D5BE13CC99FEBA37333228C7302A34A4F508EE6595797F3
-7BD211BF901C4055641869FEA3546B89D36949EE0FA2CE8DCE71842A52F05DAD
-F63829F2B3184CF814FAA64C73B65E4ECE9B0517204981AF9957F1B6FB29BEF6
-8D47E887F8EC987889705FE17BDA506B1C9E521BCA46A10BD728BF9E21551C6F
-E233316FB7F5CF3CA15F1DD7B827126C89D4EE7A4AA82FE71026107963523F09
-096FBD47DFD66CA1A69A4D7C076D9A2ABD9D5A87B70DF1016E29C3698AFDF479
-451C57823F7B5250315EC85A8E7B1367C2E9F064E2B716340EECF712EEA14886
-22F560B22B39BC1CF25CE9966AAF766BC606CA93C04ABBB3DCCC7E0BB8F4CF22
-2D37CAF0BCE43B93B2EE318BD72BA502D596EF36562A056E1413DE0700C776A2
-0B4791C90FC8ACA2EDA723CBED95908811C2ACFDB5258CA181AF38EA66E305A8
-046EC71857E31894C750CF59C4FFD7DDF405378FFA7C854A0E0E3C7BCA0AD237
-2023844F8E8D69C15608CBE17D84FE9C0C9404913D68B98A6BC8FB01479E0B60
-E2E624A5B4E64213B4BF4734BD3C8B30B0E691B190B30CF2B49978BEA937BFD3
-A18AB4FE7D77EB75837ECA25ADE86438AB48F6E2A6C7DF2CBA1A3006F4A89AC8
-E9596510EC3FB24B33E24F8819A9129429376CDF5E84D61F79084346EFD83BE4
-55348D8E9BCDA1ED8096A3215600A1EAC278B99AC3FE8AC3BA9AD3B861A492CF
-B38BEF7502F608907CD5418B768C795E3A31E7B6971E482FDF8265032FB63F2C
-4B9385860945B83E244B19B7769160D3E90CA5E81E39001085FB8AB7D7A855B2
-7F58B5AF4D7A04C214015A5112FF363981AF0C9F3A6E98C391630F839C8529D8
-79B2AD12D38181E9A57642AF6915E8EC894A2592A606753C7C6E67538B22B1A8
-18D836B53E4E775A9D745F4F0C2BDC493A1122F1DCEEC4F7E18445546FBB332F
-45A62F4A7D2BDA18491577A7EF07D19F1F48420944A2A8DF92D953AB628D2095
-F02358B542AD8CFDA1E2C739EF10ABDAE3C7C17AFB2F0884175BD4BF29164836
-49A5AE6C7D7438D477D15F74939183B61119367149B32B38C4277EB60EEF82E6
-AF4E94FF0D5DCFD77052C2FADBD0554964066239180611E193CAFED231F7CE82
-381A14BB9D908D842151883AEFA0C5C155184D2A6E82FB943792DF1D1B9ACE7D
-3695B87CDA9E22839448241DFE11886518AFA164707842599A964E65A2EABB2B
-1118F729EAADCFF6CB3DA1BD784DBC6BC6D41E895EFE4BD8355B65AAE7FCF6FA
-0B2E115F67B7F29210611955759DC3C52E6C67FF1AF9B69D0DC3B53867FE8DB5
-E3E9F35BF158340E2E888D3A9DF0160F8150EBCB76D053689128B4DCE663EE5A
-DC8526F46AF7DC1629A28BD8200EC03F6A11D2573C68580CC18B0DF7E138A6E2
-9C9022DD9093D3198ED133895B6EB49A5475EB0BB06016E646F3244D76218EB8
-F26F00F8F507ABFD902788EDD8755DDAF9973C40D1B7CFF83E696C2B60AE9E33
-DB98E520A33242F3B367287A519255AE92F2512E3BAA70DFA3D4FAA48B6E16D7
-167CECC79D41D27F714EB1029BF021EFCA5D4D9203062585F1C2EBCE61BDBCB8
-A834CE84A1716F3A4FF8C8F596E5B4C607DF81D25995A76734AEC487BBB1D440
-F1F11D2FC345317BC2928AB4F59091B4B3EED478E821E6A84ECE01C760698BF9
-19163E32D29ABF92C5E2805434C317C05F7B1BE3B47E26AF33FB53A720820B30
-771A2DCE04C0E9914B6E7A2902C4C4A91BC788FCC588C96AC517A2FFAB00889A
-AA125ADDC939A6FAE98D809F8DB1DB49B6D1297EAACD08E94EADF3AFF59F8E0D
-1EF968E765BCA6FCC3D52B7DF57ACBF89E45D13F001325B796E11A5BD51AAA3C
-036C0AFB391EFD7984D3BC6EC248122CE2721DF837E44F58F9CCD0C06C045D2C
-5098854D31234CA2AE9C41B901CEE60220E0DEC181BD39A3EC3E3F355CADAEE7
-2BD3A09FFDA632139242B16207428E0578080CA7CD604A186154665B31877131
-4916A2C04C66E01C1B71821C44E5161DF2646899F1923FF90BC203D592B9C371
-58C88945B5D0EBABFE0924D01CF22B547CE7DFD556CB285F0BE5D9CC7AF56DDE
-5F61D0C66895199CDB61A39C944664CB438422E7FDFD2F3FC632058E5C8EC998
-673E8BA91DE92E64AC3FF9CDAA34DF107836B121B5259807ADE4324D0CE7B7CD
-F2D94F1A5A0D2ADF7A6AFF0DDA5E98F72FC29A34B01ADD8682B57CF97610EA47
-5DAACF94FDB9E61CC14CD2B2CC361C9704EAC1F54E3EFBF743A551FAD5B52174
-486A5448637530218091DE0B4513443C8342CD18B669BFBF241C249BBC8080AB
-012361313B220C3943D4F82EB3A66173635047730A44797CD20753F196A19919
-D1F75BB016E796214058908ED982F3C0D9A524C789D7F634759FDEA8C035E715
-190133B34E87347FC6E8C8671F50616030E5B199758E370F4E2BD838BDA6979C
-3815FF7625F1BD41B9C4B6BF0C7DE3DE69F1C6C1D3F4D387B9317C530A49A3ED
-37989944243F8DF2D60241CC6E4E5285289A7EA597D1DF92640A83360738B5A7
-26EB20D1E52850C829DB87E28B4717B8F2CC3C8942F38694A5DC5A5321DB5725
-89F49CA6D1A2AC555878CD43A023114FDE61FE8B8A08A840ECC2FBBF1041BC54
-FF4681D0B755262384A664C98ED1D1A1A2AF0F1AE96971EE2E4A1EF9E7C0B2D4
-A60B7A6108947C8BCCCEC3946984332F8AFE04AC9345FB60FEC9FD3534DF4E98
-585F371ACA9E10941CB122BB65D9AE82D16F0DDF13ED41D3A14448A83F120F7B
-AEE9C6729E8D82DE68CA746554169CE6214842C399AF76CC78415B52508CD330
-0A776680685FEC3BA39A5C4AADFDE2EE53CF53C5569C54A59CB346033EA7FEA2
-3A5BCAF2442B4E18C9609220A1A334E71D0C4F7748F8068C3E42F3BA0D906155
-3EA8CBD989C0C7BEBA367E63C8484A2DF3E8EB27E50E60D09B1D71B8521336E2
-04EE168BD3077E6444266E1506F7D8F1A73254E5422A0FA4E5728712C3217829
-071803C4E65A4FDF9DDA27A2C4220EAA6F7520292FC1374DB4252886600780AB
-BB1EB3C5F479E96AA17644BE204357F8073127B57B5058CE06C53475CF82B946
-E7632666847BE56D1E37EF9B4CE247B80E2287B80E7C3DB45C4F90D49E0AD5C0
-BF2B51C79F1D929FC84EC2B8EF66EA213E862A2F06759059D72931822D35695C
-82A834F08B21DB8F40C9BDE784C97BA483E15DEAC3552146AD67AE417836A024
-2F388EBB7E877AEB04C226031941BC5E00B62DF4C833303E8D09360345DD3DF2
-7C05793D4B8954D01DDC88C7852B722546691B0DE58D03671CA23B1F8015FE7B
-9E50DAD5AA41382C4E9CCB98FCEEF7785BF174171C4D386777DE16A4329C831D
-FC04CD5AE48E6F13DEB41337FC48AD7C7B208CEC6587585768C24852122B70F5
-DD3A54A92F38A4201C6D75C8DEB955471638A9EF4B81BC38DF39C4E4E6CEB929
-0B06974A9D40CD5622FF02A7D3CA2F25249A40E4F0B684E8FEE2A839FB365DE4
-50FB988F97B992C9E8AC58B74F840221865C6E48B044E0A1A4201490F74D82D7
-5383AB46CE69ACAD4B4B09F5FCF3C66A637DC529695C9442F19A15C927569161
-6BFEFC8CD1B7A7F3F9C67A445F8B6DCD2EE53FA25F68817012105E420A61D35D
-3741FBE996F921C24A4EA47CC5D2099A314183F55F4B098F3CC567E9DA4EB74F
-9865A8019106AFFE5C8BD34EC67228540A4F49747678FA79DAF3ECF142A4F3EE
-07E5B66F004EAF6FA3CBDE4782480D9541CA6E4BFDB69DAB7C72C607F56630ED
-2F3B78B7FCAE17BF13D3FDA9A092B0DCA9D75AD9D6EBB9DD649C3B032AF5A1E0
-E18B31810E6CF3D26702B480D1D2F16D8A6BE47354FE17AA318AC16390AB1C4B
-10165DE80EA293822BB63DB8B72D78E94FADA203B0CE078A929C5B9BC681D560
-B20A2DD69CFAC03D8F2EB16FAA431AB0E7EDC77DFC40AE2C8ECFC0CFD4A9E236
-15BF356CB6EAA90F6630801CCC05B577EC4A33463182DB9F40AD504669655370
-11CF974D7536EA8D8BDD56C268F2362E544CBC1D31E25F9E5D6F490D33026575
-E45B367739D77DFB4D079BE7C379235C8095D6D4F52C8FF0FD4C6DFF2D6C7C0B
-13DBBAB39AF732C38348A4B170978410668CC1A2189A058A3EDAC1B08C09CD6B
-ED16950A2DF3893B96CB35F551D7A8103380F1264FEEDE157C641B4783C6581C
-790DD7349D6703D0B61AC8196A0B787A9A1F0BD9C906CB00439FAA0A9C9CF7A2
-0F26A9CA013B8A737C921722C76B167269A8443FB1C894F35F7BD37EE31DA899
-75B4EDE61F409D8539472CE9805623105FD5E67E6FAC734A6E83151BBF93BD01
-EE89EB5D4021777C423461554F2C2406D35FA6F94824EB29F88E20BFD6383C6B
-2499DF337517DFE6F01B0CF4E35C4E05EADCF5684E34B7A646F3FCCBF3811790
-EE1B34FCA03BD9E6F65916C15C68D8E7B7D2306FBC705B90341415DB1262D49F
-A6BB3BFCDA817AD7668A2528A76CA62AA8CDC02C9671D254B8427AA2F0CC354C
-C9F2B673814A0637DEC6A052F3F279C23391148B4C9E761C5B811F89E737969C
-79E7666282A91CF9D865F25A1EA923C85660404A914C90C9CA6ED4EA1E552BF2
-F03A64AD507EF630E917ACDAAF2CF94A6DFE99BAFB2309BF05F9B6CC991664E0
-C477E1BE53A422CA0C85ED03933D3B210D6716E50022E0BC0DB4E5D5030A9FDC
-4DAE2DF78BF602F524F138F682A21CE9E1B929CAFF0F1006F289A94F5F0C9A68
-A2DBED5009FB809985FB0E9DE0A0CD342366A329B0FB96601624415392B0CA13
-F62538B0B96F27B6E24E8DF136800885C9A3CDD5615B8FA19529073873BC725D
-DFB03865A17573CCDEE9572D13FD100ACA9EF2AAA0FDE0A60A3A219778146581
-92B520565791410F4E515A7B088C43D514B8B16BAE2A658E0AEC9E9A6E7849B4
-4051FFBD37916E095F56B93D56DF69B39B3AA423CF3021862F9BF963405DC9BF
-2A13467ED56E1EB1A8A874BA6FEB5E9B72ABF43BD10C709CC687482CF96806CF
-8BEFA8F7E7AD89186534A4795FA08224116ABF435509E9A6773F88589EF40C87
-7EDE77FE457008692EC223B98E0EF858DB4C8DFB275F6E631FBE611CF31D319E
-C3E946180CD64A4D519BF3F311892C1A5462838271D03D5CE7C4960D675EC73B
-18D41303945FBA3504E55798D86E174BA38DD8B7B1D4F23109857567256AD067
-AE8BBE62696CE29C95D4326E1BF4A5DCF73BC0C79E972518C558654D7CD8BDDF
-67A3E799A95B05426A1072ECAA116CA332E1D611CBA90BBF9D15DA7739FAB50F
-E31BB619F7513BC6BC72617923EE35A2999EF78AB74EF7B3DCF32A6286EB096A
-920DA01F6DCF0693585165EA80543E74646D2DA147F9615D4914EB9690ABDE16
-92FD179A66FE9A0290AEF99733F5995943C88EAF7FB5F8B7E5CFAC2FA77EF9CC
-4F678820742A36D2D0AE01F11652063457DBF0A4C535708D4AF777D37E5A33C1
-C3FBEE96010EB3112FADDE319A17ACC1AB36157CC1A5BA41B291CAFE448380FF
-B11C7CE02791D702D70819E83C2ACD8939372B7DDD08E98D0F17940D94F825EF
-F759BBF2BD70387DC2467AB0B21A536F5F50F2EE5368542AA42BF43008D17D4C
-E9543A490AEA3FCB360B09198D649966BA730A06F8A2441F5408D5A7095B1A0B
-545FF0CFC72E831EAE74B4E3656F413CCB92A778D154F74E05BC0C1623EC926A
-E86BBDFEBFACAA94B9A6127CB16336EE4A412B32FAF19B7C79942A8A399D9C15
-A621EDED310FC33108673F0D6290FC882CE490FBF3FC65B26BF47A9FD3AF6BBD
-13539E842F08928531CDCF19DBE2CEF56C1FE7F6F617099F18CED9AD3B3B7C0B
-89DDD37A3CC1AEEB69C54C162ECCB17D73FA18405BD7F58B0E78021BEA22CB81
-1357F69CCACA5E090E658D1B6A826E621482991101CE50C62B343132BCA7E586
-ED3DB34DFD1562D7AC57A088375B145F7ECD54BEFEED6791C53B4C0F475C0B69
-F14A2196A701674C8845397E4BE0F13C66A2E28A98DC42EB96569E06F3D923C2
-18ABED5B8FF7B43DC738B9E2258D1C0F5A242350AFEAC5E95BD80C16F094246F
-182C53E12CE7B880D1A252999C8EBC6014AEEF1EC179C1F5175A7AD8163ED9A4
-07BE5B2D3EEDEB61826EFE3D65A9441701A76BFB637E5D5053988903DEF41C28
-EAE257229172CE100FE8D5591BCF99F000C5459559B517D3818A9D65A94922E2
-CD5517C8A5927378B580C048FF5D5E60317B469F4EE7889E4461050F2AA1B20D
-D8A2F241D25635F195218A37F29112C2DEAAC7D8A3B1ECD4A68FCE0C24CEC87D
-CDE22DBE1A0A73614C3DB14066448681DFAEF8D35598C6AAA8F70AF07A7DF0B6
-100113490C2131D5613ADC8ABC12FAA531B3EF0A45D19C72D77ED225F361BC0F
-86B70C9B531F4900C6CBB9500E532C5C50BCD2A1295434F1E763AC95E68D7C75
-2444EDA3C23FB50D2867CDA09A758D32E4E30B01EDBD02F917FED439D2F097FE
-0BD6B387FF89CA48E624295F91D96D6370FD42AA6A0BE14666D791E088BECB57
-2A391A8E87F2C6E50D188475B74CFC4F5BD1ED8D1EC22791BD31AAB92EAD4DDD
-C7E610667BB1ABF783137436279D93A71E565923296866F9704D97AEF3876367
-5A063F8CD68C9223B621797F7070D5BF6F743EF717E754F94D6EBD201AB0164D
-C240049723150C45374BBA15E0BD104091781F7CB67852002D31644B12E590DB
-82846375410D004AA8129575F45562C33862250858C46F72044D58FFED513301
-F7881208CAB4E4C4459CE16CFDFC75F768CA513523C6C2AAAAE41C0A219B06C6
-7B4AA98F92C074356298A588B571A0A03B566128C0F62ADC9663E0EA2BB9F686
-609BDF8D6EB178B00E121632620CB7331995A63551F8373A22801915C7BFAAAE
-652D11CE7CAD9C7AB1CB646C605C6C4F2E42BCC872D94160024D4C0B2DBECB02
-25650FF58D1ACAE991CBB26FFB229D8355814F5CA8620C9E637F4A77AE88553E
-E159519E232749E5D037EB2BD3DE28EFC4615515DE0F44BAABE6916F0FA7D61E
-2C56F5B0DD6B387A7C160EE009302BD3D1925D6372BBC8D72344100641B9A87A
-647386FC7F4A4F16CDCA462B9215D94E8C9068B760AC18660FA125B352FBF456
-C145C0DDFF3E4F6D2C84937AC82BB53D0DF720BB8E0EF59CA0F1DF1AD8A139C0
-92DAD7B59892303822ABFD24EA1A922B09F5B4344290B3647CAF6E7622583798
-3DAA4155916D90B1142F2745304C46BA7E3F98F1319A3F6500C402133D8CEA89
-A10360935E26ECDE1578D362C34DB7037FE312A5EEDC4054DB2CC52A88D2820D
-C2ABA013AFD88CE47E09BAE8B40F7CA321DD86BAE6C82B919884C8B855D7F5E6
-72B791936EE754670A53E92AD0C74843D15445AF39B6C7C2B065ED1B3A29B81F
-DFCA2F5D4191212ACB7FD331692C0ECEC8DC4F442A753F60024969BDA7E5A010
-3DB640453B353FCF772678C52781FD6DB32BAB10D6BC7DA3233D0DEF0EFB8B5D
-7009EB3F58D77C0B02B2341FB3D485EC340E80C842B6E1EC4DF85052FB2AF512
-A48412CDA18DBBBDB5726EC1DC3D5838FABE8ACC5C3D19414DFCEAC70B857638
-5924531C3803BA645F902CA88F74367B09C70A1E8504F8A850100A5EB21ADE63
-3FB038C571150C9EBD3A75A2F670122E92855F6354919189E36374E91C59886B
-22899897F868B8720508F9BD5A161797F61EE40942EFB26C155359D4A6B2314F
-CCE8C7059E214534FCC40EC602DDD283B2A931B5CA1E873773637BC9863CF916
-1B7B36B008EC1BB562C4FD883A631598831B1559C5D77136AD03E94DCD9C495F
-315470097E005FD022E53DCB7581DAB60FC791B4ED9C636E2DE5F5B22482374F
-088736F9E02EDAE88C55C5CEAF21EFD64EE282AB84452A1319AA8DA3695B7806
-0ABECD77CDC40FBF7D9FD09E1ACEF73DE682447FA18F45C93C03E7D8A70135EF
-2B18D6F397DD2885206DF5A8C52C89BD54B11B4F61376CA6D6342F44A57FBDFF
-171548EB957EB47C62C9B78FD5916FFC8B2D9F9D4B744E3D7B784BE985DC57A6
-92352900DF235A531109372BBD46A8B862298EB6967829DC163E55CE85F0D8B4
-D952851ACA00BDCC981DAF1B15E5D53D29F55FFB46E81327ACC6C147B5627FCE
-9989428A788A98DC4DBC9DF0904DBFF8DB4C6F0BA3CDE8FE3248F29EF8003878
-132430F063596E34424CECC9C9FF6985D4DB0786EA1CF7D0DB7099A3C4D5E26A
-307080C45892678EA66C0A539C32E688222CA098EA3472814A995A5701E5307E
-DAEB7C853A4B7B46F9910158BFC4B206F7E7CD0D9B5A1820773CBC23E6E43CD0
-6A4E88EF6F45285E85651FA56DA663DB16D356FEE528772A506397D9D86B3D18
-645D3FBC57199F8FE75913911FD64E03E24C6D0279718F7BBB0C8C502BBBA59F
-9B2CC3C21FACD744CED42569A8841D3867CBEBF2ED3486F5C187583E0E6B5D5E
-9441B9F0F659E5BE48A17B05F9D3D96F28D95D757BEF3CB83CDAE0E667F3F8B2
-42F4E6D5AA1511D320A2E1B96C3C7CC96A8737A70B974760159CE08941C3E06C
-EF4B1F07AB12EAD4BA26C5C3627A231EDAB2197F8B0EB12584C9817D5BB6B39A
-B415D59E2112DFC61B10A06EF9ED5252F9C0FF98FA4A2B49193F09F796BFC431
-38B88C7EC80A1E192DF7B6A0E5BA7EEFED908BB108AC20B5816DC41D57DEB1C3
-37E3BFD817772D44F7C1FC4F82F41685FE711220C8175D68F4C73727A6982190
-2894CBDA32FF2B70656B269657AEE710E75D8BB54659D46025405583BD30A344
-EB026D2DED75300342807E34D661FECA07A39F567E0AC9053B3DE8330E6FA84C
-10A47732062EAD6DCFE4982DA630008C33823AAB374797946A17678938259C44
-EE9BD6B2DBB700BD2CE90B2407DD6F7B48A62D3A9DAB971477E50CFD4F4BC72F
-5405120220EBCDFBF0034338D21BE2FEC949C90466E14DFDE981A70F2F6F26C6
-5F0A35C1ACDF277E7034066DE11C25984CB5511FBA51CA0EF84C1143F8CCB991
-116A2F8BDB68B1EC45CA2D0B3247F93B2905C146FB10A63104AD5F9C4B82C7A9
-5373F8783913A2F925B09245825E167EB08308B1691DF759C1E90FB2611AD646
-0F73248F56E90C86F99093486FD1B5736D4E0A6F880670C37F1AFBBF142C7865
-C846921E34887D57187F0828675AE07826351005BC73158A2BBA59F5E9614BB5
-B9E72334E760BEBF7E49E74F68525F9A017A34A18A1EF40ADC811DCA5D5835F1
-26132E606874DDC48E181F79D791DAF9B2668DDC6A833969FB573201E745DA5C
-8176B641258ADC5990C82F9A9C8E6EDDD446843278A83BFD4300F749EA148A28
-1CEB260198F38A5090427A0052FC91364EE8A2DE0317ECC66F676E2F9CAAF3D3
-BC6E4FDDC0F31F9259EDA5AC75B969257E635391539330BF9AE0AF73738452D2
-6388C2975CD9727BF11E0C4E887511B0975F6813E77A08DD27826D609F0A2F12
-3FD49AAE57298D7D814409C4EF9C66F81A02BDF349FA0F4F8D46683A56165B06
-CACC0EA3D648B47D501AD15F83EA655D5261DBD832A6C7131A73F3A25BFF3193
-B9B37D19D2334F29808FE28BDF612DC38172E9F35CB9616CF9F2248B7159465F
-FB90BB57BA61B00B4FC957644729F270FF485252643F9F16244BCF1178C7CA2B
-CA532F178D44B8A7A47550BF1D1BD89C0A15AF41BA0735C486F61D5CDC421DAD
-17ECEEE048CB89F0CC319D0C3809893E441F85E2635CA10A869BFEE0B753FD0B
-C9849370A0CF1631DE406FAA5C4A9C97EA07608ED72BBE10D82C17CEB10BC478
-1EA17F6336A773CCF515287E9646695A6A27E84A3ABE2EDCFC49656008B951E7
-B3C0453409A7003D5E33F3CE248C108AA0553D8EA29F52ED17443716EC967F48
-D3C2E15470F048D317210A67916ABE50E11F6199D769EB5C78E447D9164BFCB9
-FA6565C7B3AEFA07018695F7D3D40868AFE8EE320D6BC24D55F972CA66BA98E5
-1E2149F7D205FBFF2E1C5EB06CB71F2F10A61DB1571726D0FC78F584294508A5
-844449982ABF95005A4DDFBE364DB40D81E573C937402ABC251B64F130BFFD0B
-5EEC2B739A109B89895F8EF47F6F180A4423ADCA8738735D1287AE5EE35B0CAD
-09086479AC06B5D0861D8EAFF2CB0EA7EFBFF7CA03CF6460DF5DC7FCD5795497
-57CC8EFEAF7AC8CF44670B8519825FA30825057A23DF1469CA1C14E4737FE199
-38064FF83880E04C863D4B16292084505129670B11BC5796C4F551770C2807BC
-D5054771387B8FA34AB300BCA9447B952BCEEC98C72B7BA65504BF02BDAFE588
-0DCC68FB6AFAADECA915F572740233D78E6D3E652D6F8817B771B1E1B32BD1A3
-6DC2B632C92E6A2BAFD2ECC15F7316FEAB6229434E0FD979685202408F71CB8B
-1201512A065271EAC2BBF1B479798CF2E3A05F05F21E123C5644F701E3113EAE
-27B93EEA49A478484B91A844F9325CF0742AC676D55C9187EDEB708B4C8D1B1B
-37EF1B96CD3B554458B840A8C384B89A91D53E0C8EB72483BBB08CBD9FDA0BA1
-4E124713C547E137E60B37E88AD35B0FB9DCF2A29B8E191A2D8CA785576AF525
-938D5D856049CAFD10E949CAD5F42A390045D90F2CC97C981D1FC272435374DC
-3ED1E0E42C04E0984CA1E12960C2EC6BF263F4D74389F1761A6E87857967A6EA
-16BB17A46D36F1AD4D8BCCDB8988795D00C76677DAFC702EE863AE02392A840C
-03215E0CC08DC8385354022E7DD2923F419501297A3AB017FDA031D6616CEA5E
-888ACFBD83145CB8205DB631E632822AEEA28585015695A4B206D98EBD27BAB2
-DADBEB6FC00C72CCA83AC401B367414306D36291AD777747A3C29E52992A8F25
-D3DE12A79EDBF370AD7E9C4612C665C72E57B612FCC81CA23661FDEB7159CD5C
-1F159EB60B49085424F078081DC690399A5123240B698B7625AF0D34BFE324B6
-A24B1D95C4BE19428DCE545E7626705A7CAED84460B44256125B829098D97FF8
-FC319CD72C806D7BD7343ACAFD866D00AD8F5EA111E9089EF7902A56B7FFBE67
-F9BBE8853D1734D146AEC85E28D0903A94163C1BA0F0E5220558F85966B0B787
-3EBE0329D0E243970B7FA61DF295E8493C92B30B2F5019D4E4F2C0C775C25AFF
-4F502727BAC48067217E5587EA0C6A24918AB20D6A7C7938380D1A342B76E99E
-0F12B4C6F5BB424E447A26CDBE25766DB8A1E7E374BAFB4EA2DD58ECBF0942FB
-6A54885EDA3D8CA43D8EB86A1DDC6572F468AFA03E20F0E882958AB7EA7E3ACC
-8DE675B4C35F6F9052E7850E7205849E8505FBDB8168C26FD29AB6E849CF6001
-DD4FEA81FC83718F4C2F2BFA6E4C0C4FE66768B54A913D4A29499AE406B343BB
-450B3D7029E6C578F523974353DE37D522E8FB091EF6106819675179FD6BDBDA
-B6A42B339DCC43717C6C12C56EB5C80EE2A7AA2FFC8097EC905DF5EF9656877C
-4CEA6360082D500D23BBB0AF4B4EFDF15A33360DEA36DD2591FB9DB7A1501A18
-6A31927BF5BFBA8FFFA22F9EBE0384939063BB305E307DDC3E595E525780CCC2
-D4CFFFD19EA9BA61E2BD6CBABD1CE52C9B93DBED0F486833E7A252D818EA8040
-94213BFF2DB659ADD126AD0455EE85936D6C02E67A07B163DDC10C11B5A42327
-50348D881F4005572D61CC0DC9510C958A153D6434363A52DB4CB9B9E56FA46A
-0ABC1939A1FBD632E18C3D250798B27418403610477C6736004B1FBF6BE7561C
-950861BB6013CBAEF7ACC21C7096DCB7B99E8F4E17815C5D40BCF2218248AE02
-086353CD1E8B0856AB31A3C2474326F14D0CA9F6A0C52236D9FB89EC842DC8D4
-4857B0DB7F37131137AB222A517CB80C671CFF8A9A5889C8BB2ADDFCBDCADC06
-CC2BC3540F12169D3C46E579E6185B218228603A4B3FA8AD8E840C3761C61217
-8861458EC8BF163C492B748FFD349E00996B78705D9DD932D6CCB6FE7D7B25C5
-A92DEC2C6B950FECB4ADF57C5A95BF7ED12E431787DD29C6D4414FCF3C4E360A
-31E19B37E2722A94BCE47087C5E1845929FEB43E73D3EDA981A0FF9C0F757042
-48F6912DD892E2CF8880A9D1B19FF0A197921A2DC12881E913A4C7858A3B3B96
-E9A4DA7FF3598E74D74B04B5F2545DB3B1D84E86E26AA8396D696E667C2970A0
-DD9978187C583D415AE00359BBDDD7109C15547B9A56F978475531BE02542924
-65D23928DEAC21CC7D0C1E1B1BFF850ACF80E629EA46D71FCA2809061C61F65A
-B881D56F270E8C776983E3CE0271E3F502818DB1E3EAF30D0C98BEA340673FBB
-23CD34CA17648735CD2A532A8B3A530C3E523CD013151B75FF664463DCB0B388
-BF60CD928E28139A13575635F349BF70C798D0EFD52011E75A7B3A2841FC3D72
-65EF0CBC6286367F1F4B3A7EF9F1F4808954E6D973ADF0CB1893D49B47DBB0BA
-AD66EA4E84BBC2F1604FDFC7C9FA0E131718053BA1BF946A6859DE3E452E05A0
-0E179B5F1D03659522BF22518338B6C98397F040F0E93F8E6A463D7D504D3690
-142E26C28172E8DB43E5DC2D45655F7D05D999F32B6BC9A9D0C89041C2031C32
-C54C4ECD75FF3A95B871DA7155A73C3B2FFEDB148FD851AD87437BED46C10E99
-0BAED69E6900AA9F66D77F30873A508C6369C4F898788F8204FB5B5EEEC4068B
-2C58510223C6B23B668204B2423FE7146B7C5314969349CF72F100FEE07D4B8E
-9AF97E9B7B6EC0894C6E81DE8EFBBDD37641EDDE1D241E4C4440CC91F8E3E3BD
-E70703769D9AF7227E7A16BE76336B46DB6573D0A195837471D18666342990BA
-4465913A45DCAB6420462C5FFB8BF1E546D0C5B009ED19C8B11F5E5D7A41A3DD
-4AA97192A047F29E8C8A195634E4778EA5F16472542D9A0B24C8741F547784B0
-3CB68F42169804AD537C0884BEFC4B5C0953A11F050117C86BAD3F5E151FA668
-D83B462FC0BD10664F0962D62E31E163FBD8FEDFA0C300994421E54A9BDD620C
-42ADE78FED182C26595F8CD93190C4CAC7F46D7432B635725038A4FF6DCE92C3
-9385912E24C214AE42D5C72EC74EFE2017D4428F4961D416454F41738A6C3D2B
-4B59F8F915D7A5E03B6A6A9B982CD07BEEAE7760872646776324BA25AEDC88A0
-38A730B1FA17BE4BBAC909375FAFF664BC811439F269CE71B92CE5D30FA255EF
-5F5CD5ED0393DDFBBCA2C4008A6D58A1E470EED8CA803E56CFFFCD581793CE83
-1D49557CB4F47FAE9CEEDCFDE140E70F70D8AAB8B4A851D01F219538D8185042
-46E442E90954118BC348EB5896BB31B185D659503B9214885CC2600719EF8F58
-F006E2EC11EF22C286B7F058E8F4535D7EF5F3B674FF0F5B476E8D75001ED67F
-48029504CD633DDEA56FC7750A9F9D707C9D3416430C210089F60B231526F4F5
-3962D40FD4C549EB4E494EC03DB95DEB23A6CBF25DF58F1327470CE13B9001FD
-04467E3C1FA4082DECD79B4CFF71E9284168794F2151C1BAFA164AD43CED97BC
-A410DC015AD503B270D81AEBA9A963CDA9031FDAE6B51F0C1F3606A00215719D
-477402DA2B221AA885F6351EE8C4B17876409ACB320444E69B0DBDE6C90E4D10
-2F72593F2C36ECEEE2F293DDEEA74CE325E806D825F94B4280E94B8F5803A7A2
-3A47DECA7E1175BF08421112A67C59C1187570DA6B60528565F0AE1F9810AE20
-E9A0990380605E0C186092B7F65E9C0F1602609DD44A8BC80376EFA0D406DE98
-DA5E4D2BC78E67543927C6DB57C5C480CAA6D5D81041432F3EF05420341F369E
-499C5245507A621789317DC4C294265DB72AF96C7FE3825DBA6AB5C96773F1EB
-203AA5092F63C0DC5C8D47C28F86C5E41B280C77A8501F529B1AFAA5B1C64031
-DE2E70D75D8A471E16EB1660D64F8F1000173206D82C807A7BCBE7C318934315
-EED4B9B8403A58E18C1D4D7250FBD8DC638A3D13D1ACA9CB71D805D4809BDED7
-8F8732ED4C08DA5D6F705DC510892EBC39EB623095D6D7CDAE7FD01A9E4F3A63
-64BC83D0DA24AA2333F473ED023CF9189EAD1BFFF702E0B8E5BC6F6484B6C77F
-E79842C4F56244E6A5816F0C76A4210F2B9A81E367A7B02CB683C6A19DF10F98
-DEB661CF23424272183272EDFAF0871EC214A6261A93A7C8F9CD1C08CBACD9A8
-048961430AAEBB34A5EF5C0E321CD6C2B0AF1E3D81A8153CCE16C87CC7A24585
-62BBDB75E14CCC4EC692749432A52FF9827F1CA8ED6F47059CEEBBB945B701F8
-7ADE1DAA3C6FB9F3E95954CBDF0883BEC86A6F63C4A794634F503750B169A642
-3D73762550A657BF8A5B6388E41E7C8136062EE343EAF09C07FDB04A9972A91B
-6E9B192EF143F9E8D111CACA0540CFB62346A23938314B9EAADB27D5879E9376
-DF4465948BBD6B1E845C90518802D5389900E1B98B68DF86066A90C7EFBAB98B
-58335EB75CF3E0572DE2BBA77E7F6AF3E199842DBBB7060ECAD3045E834E1BD8
-64BDED3FBF9306C2912811E237FF9D6CEEE5278F6613E371AAEC15620C4A2A15
-22150F8B1B0C81F9A18D49B2684640E7ED5CFBC31357A236FB1942982EE96B6C
-E3C54F03A25C06968A53CB9D7FC3AE8C5B917BF33C2D4181280A0242E823E2FD
-DDE615424F9A3FDCCBAF420542AC90A4D9856BD2C6371F75767A6BEA4F861909
-1444B6A5BB066C63E46B32B55F2D26B97D074661CC54BA96497B226A353CE86B
-62D435CC24BAC65985A947BC16218E15579F16FC8DB371582A15D3E510558BC7
-EE6169F2D9D239F40C010AD8EC8EA128CE416E21637174D34F651E4DE30A024E
-0FBE8B5FEFB5C89772D5230B3AA652D6778299B048C4CB5D68455E18B66DF0AF
-851DF300836E15EAE115DBD03DE42716281E531D5B6994DEBB0897B97D21ADE1
-49F76FB3DF0FD481B322E2F3CBDE64B16BB7FFF8DAE55923757F1A65FCF48F36
-E51BE3D300E0D251BBD18AC914B242D71E491F9CB99AE0909D326AE17D9D94F6
-6F8CBEC8421AE9941069126986D9C26DAAA474928B2BB477D14D7CC7A4B3301C
-A9B795626F9FD0BFBDC870275229C5E67451D37BF4BF92090A5571158169BB81
-D3F45B9C6D65E3DB921ACBFF42885AEF73285D3BDB6FB4B9B8C8864BE52156B5
-B2F20F8627BBDC08D8AD002440E47A2C96D79240147936CEA7CFD7B09027FAE2
-60AB5109DBF7059DFF4FA0D8B8EB06DCC73A1D1405FC19CE7D23C18CF6B353F4
-FBAF8AEC7E36B738F6B1CCD05A0B9C9A4C13D060273DCF6D39DF922B3797DCAC
-876E0635F4D60C3D5A5DB9715D09CA2C6D0D16B62B747BB8BFA0580D0BFC0469
-3D78A9331EE1C9E7D5FEB03C241B47C60E70AF08FCC5A37CD973B4C6DC83C6B7
-0D4BBA368135DB44092579F9FC257EFBC1CF7D915FFACB222D06C52E4E927178
-80EEA6947B47345342D24FC41FC24A90178BD358759247F8102EACAFB14F4BEB
-256AC2EA0E6D3446B1F1DB46922790290C38F16317FEB372898EA0854C333A01
-6A43B3DEE51F5A114B90B421C4CF9F874C8AE2CEA867C7C7A95DB46C30C1AA49
-6FA9F53DA9825F54B6653E509A079F2FF1C3615F0F34D04EC75EB02BF0ABF364
-12FB55935F20A858F30F7C86974A3485927694695DD500607183FCB73F1C3428
-C9C24FDDFB844232A43D2C596605C70C9F0F14DE98F222CD610262EF9CB6AD1A
-41FE3C37051B2E591A879AA425118BFDC89B41D42E97EF93FD6E50A82B7F82B3
-267FD63506A2208D35FA855BED185FF6ABD8C5B5BC833D5CACF9C71AA6AB3DB4
-992C5BE71BB6DC0596ABBAA03F89A4FB0D77FEB283CE666DABC4AC06741D8B76
-05E80D80C8D95A5E340B8A23733960DC9283ADCBA0C75B0E78773B198C5A37E1
-27B7470CB6E15CE19E890BA07CA1A419F1F5FCC5C1CB6AFD5B530BA03585568E
-11063A0050CA5E8F3DCC804E440845869689478CE1D7388C4EBEF6FDFD245810
-AB2C5860CD320AAB722534AEEB9E3483329BC97B693DCF7D3AF4D29E08E83F0F
-A487B723EA2ACBA403B03F3D17F8380B2CCD6C269B6D201E465973BD821ED5AB
-BC7AAEB05418DEA87619D40F4B1CD70E951CF7AD151A9B8B1A127871BFEB6997
-8A90798D6D075F8C74E1D3375A932A3B57136131826C83F2B4B4159456BF5DE6
-ADBB4EE690FFD3F2D760310841CB6C21509871DF6CC08409617AB94A32FCC617
-632E3E8C98B5A2B3E7B4169E53C3FE3966CDDB526EA5A18DC4894660EC1C4FBA
-25BDA925174892535C368720C92C0EDEB4A245065266674C033D90D52009F5DC
-742F7289F36CE321838680EB9F8E667234E802E6EBF61B60E526E154F2BF3A43
-4925FD043EB471476117D86127AF7894C44DA04EDF2BACA67120DA53B1A116B2
-B9BA47A8193D791E951735E33498D8C705E67E2986520D880110D35C0566FD8C
-EF860427BF833331A7DF3F7EABEE61E25B667BB6A4584AECF704B45F24587AEB
-B6DB1D7B6972FB4B4328B2160A91199CEA30020FD62EF0337A4D4F10AF923EC2
-247660A5AEC4D22E976972C71EBE9FD9CC9988D2E272D8FC20E15C68E9CF2621
-4778CD8C3CD42235F7FB33D3DA71F5D2C5CFA17421AB95587919AC1BA75C85E5
-E459C9AA3DA52A0A8714594BE4F2AC32599DD6C3FA3340DBCCD87B8E7D567595
-14E3D254F660EF2C5EAB9373F33395BD7327777E3DCD4A11B7BFE54CE272439E
-E2BCC6F8EF22672F81F20318CA95FBD8ADF3E18ED04A4E73C9B32EA493317B99
-E7680A397A72692D0AB3877CEEB916F8D7D7E7B40D97E449F76BF4B1FDDD08E5
-DE37609896DEBDE25CEE302A509968144061ECBB277142D3512485D11003E3DA
-D57C8992A310C2968CDBCB65F3D975EC5E3685F0FB2D24B8E03774CAFA785BCA
-F6AB8F5B958FB630B7DB2EFE66EC1C446E5EBF86C0F02EB9A96E582471E48BB8
-68AAB996C02DB531A45FD3AF2696E0A459629041E80D4B25CC6C9F60B5218C9D
-2BD697F050E194E664AC1F229082656351C8CBB04F8DE1584411800C19261918
-FE7BA5FB2E4C02AB650D73B4A62E41C15D4A92EE8221C51A7C6998CE99BC505C
-DA3F3F384215CE8EBD281393E8EFDB9EF91F03EC00DFFA1B2229D70143981563
-4B52A88FC1378607096431F6B8E1DF869CE2FBF2548B6C1A9D5A4E40821E3FAC
-9B15907958C13AB21017A3432D57A0190FCBD86287B5E2AF6DAE27E5F34D9EA3
-1B8DC48F1574D9484951F76BF3411788428D05874F0AF0048192CC05CA43EF70
-E0E1358BF692F8B420358C131E06E33394317AD867CD47F5B91A075F5B72C49B
-DF756D282F3702CE9F03BF86CFE4F51FA00D186145C002F25D4F897ECE7986A0
-5308DBB80B40B71FF4B776BB4B3F82782A76EEEBBBFC3278DA716868DCBC097C
-D3D3A37B935809D7FEC58B537799E1527E7F0094B11490F9999D23D73C129A0A
-7048D4CBF9226064A31B3ADA9C19254A20DD1BFACABAF15B3DDB06C4D7E65591
-3624A68A5559C9BA94E47BC2C08AB8C6FA3E0A2494EC8B40F90E0CBF14E5076A
-CB91AABADA49BBA79CE47E70955200256475BE67352A65C75292AA82FC3998D9
-DB4D7E5366138B7C516819F0EDDF92351FE34CF73011FD339B0F8380B52D7C9F
-B7EEFBEC433B3CC2EAF0BA105559172088AC7BEBED21F2243E7FA81C59554911
-08E9304C1C252908CA315F95A1A896C0C1F782724D3716D3236DDCB129AC356E
-06E4043FC93CA6BE977339C6527B4EA54EB74E89CC4E8D42F3AA2F7AA5BD9D3F
-B7FEBDC1F174F5F594BC6AF14C89ACF1760ED6F173759AFA80476759CA2E7E80
-6BD05284C63764047A0AB8A545C67868236411D96751FDFFDD4990324951E071
-7A8E17659FCAAE93DBB7E387569959C4A4AE5F069207A13E1D1C7F40802A2D0B
-8B3DA376E109A1AA9A428F23B0F9B99650FDEF28AA801C1F9B7291D47880444E
-7EE09C0920ECD434CFF5B851A343BB70E2CFF06854E78A1F92CE831BCD253713
-4A92308D405B22D204FB7139CDBD1B14946F2CCAB6242DE87C5C7565EB1C9D99
-85CCA6865CFCD57DAA7291591A202492CD863A98E17F9AC2CD9867EB827E70D6
-B8B81A6996ACE08112BF38BB07BB78C6C879FCF709F8D94729D06D3BAD9CBCEC
-E85E1A08576B1B4192FF26B6F923D08EAAA58EB670D84361F9688229A9F103CB
-1D43978B1B067FC31CA0AEA33B5B244D7069C29B6BEF12907A78ED5128D678E1
-67C39DEE6E9BC38E134FC55DD7692F5219ED04924CE8163CC566BF6D6B331456
-4047FA2F3B2C10D95F1BA5E7E527C539144B135D3DA214B88DDD2B024E6F8F7C
-D943E64B6097E559B860E235E2CD13395DD7177D7F93070B8C8EBADCB127162C
-CFEC2895632A15CF1E55A525D342F96B023648E8C5479C6AA0A9BF9729DF2E70
-DC54A2A26B1DFE7BC7669FE938FFEB7582386FDB2104E6A19042FE6DDA8F9850
-D5AAD74050D5318F0F8D4D750A4492B50C2AA395795CD635C8A914B707B14E35
-844DDE1DF2912ED6B078D2685AFFB987D8C4D86A9DCEADDEAE4DA772B947299F
-E5A438058A936C0AF23106FAA82C9D8BB8D414EC5371A2AE978F99513B7DD837
-A6BDFF5551C9467EA26AA91C3900055EE65185DACE0D675A8BD6C9D4BE4B006A
-FE0F89713E038B7372A86D4A40532D6AD87D2FE7B62B3D2EC605DD00377A55C4
-E8392D8D3ACCC84664AC3E30C18D8C486E8C502196F4A36226C1538C4AFE302B
-846F2A87AF880514CE1CEFC5973FEB9E9A48C4E356EC79D3AC1B714E23B7562F
-AE7199C0FA5345D37ECB4F371BA123B67CA068CF67BBDA93268F4E08A5427FD9
-0ECF6B33837F8A4F42B37530FA5AFFF10D8D558C9B55A930CAE49172A6D36079
-3F952690DC1D987F2D63015B3DD6E2642B97D7175E345E299FE57C3AF1E83E02
-B34BD8A4244D95F7CB1AE5D501F358051477C15E534FCFE4C637E316E5701EDA
-1009743C789B2FD633798171F4E88DBDC447ABFC9C32701527F34BEE07FFDC36
-003856BFA9325A4F7D1611CC5B36A4D7604484471B74EA3D8D5A28E9DE243332
-D3C6146772D773971E5BB3CA34D8EBD37C8F435B0BB57AC9352DFB3D09BC2C92
-E9081DBA9D8BCBEBE3C2C42066DA13188A5DA5939BFA435FE5D2CD8466EB0EAC
-4F735302C75CBF6ECC96969E3AB91593FA24BA117BD0BED4E3F9A51384A5FBB0
-BDCC7A14B31D8833C1B796B8667FAE8348A7589218988BD4C2094B1456099BCE
-0E925A5673C13BEF4F1D91A72B00B75524E9F2B6EEE39EDCD8436A239FD6194E
-02AF04CE213AF8A4DE0BEBE6103A1CA891C90F1F79E34E8D7217B59F1F8A146D
-94017DD36B2610883692D55453BD9300545764CA404E3699548992C65226F772
-19066C8DC53B6CD2E378C0773B10F16FDEE74FFD370EEC6963762A9EE64FCAD0
-D793878A07386CDDC0B00A6E3500D50536E7CEF106105AEB4F7FD391C7825C96
-3D1492F6B4431AA74736462D14F63CBCDA4CA2808E3C55BDFBE668F6B1AE5F01
-4A4B8A8EA303C345CA242F0D9CC02F1BEDE134C6B4FFC0231CB3F16D0F5ED86B
-56A2D04CF64925215CC4DF3B51F59F69E99DA91BCE06D02872A60E8756EC89EC
-15FDA8D54067FEAC2E07483F66B00E8FBD5BAD31BB3DA45A549B205B2525BB6C
-74B4762CC4AD3BAF05C4A1A23B50BB22EB8D88603B7CA3052F83FBFF2D7E49D0
-438F3810F8076865973D1A4D2B06F3FC38498935E6CF0DF4DEEF6335403E4748
-611D63BFA4273A823E027AE5868907BA7124FBDF11C4E30446DBC2346B4595BF
-2CE8784006D1AD74432F5A3A1E5A7E6E69498995114830D4C7C9057B0AA4476C
-A9F5F44B45861ED13CF485B3CAE0E0DA24D805B5FD78D96064EEECAD82FD881D
-6046574FB32545B5B9D65C46C7605925054241013115C1B0D112DABDF00B45EB
-11CB82077372FED9B125B9091129BEB6F8F71F093CDCC5F3ECE4A9D33B55803B
-33758CB9F82DF01DE13A7E8C800BEDEC6840E37AF32B40A412F6DFE46E9B0469
-F96589AD547D14F75F9B694071F1F6F7A459EB8DB009B26B9DC8744E250A99BA
-EA1421504C17BC772862BCE3F07EE747D57487DC8A611FEB526095B872A10902
-6839B37E552D2C798F761EC0F1698AE49FD98B8CCE873259B911D61724EA6C5F
-5AFB0E44655BF454D1D35936638684A5FA041CC0E1884E362ACBB04BBE704282
-86E87C674245143F5E35B598F431EA3DCCA443318EFB85242AEFABD64B8F1A21
-CA7B1E372748A25ECCA6DED3A7E81737AEC77561723ED57A7006F96D17B8385D
-91BBEA3A651B5644FEF22A577543169056230A6FD1651EFC5140F2FDFDD1B417
-4B458D312D9B58176403D160628EAA9E99CB5CB7658DBB9A2217CFF17A3F5761
-39C720A5924739EABEB75FA12277C5389166FE5891B484C4F3317B2513FF0EEB
-18DE6D8CCF1306FD85C5C19D47C1C36BE1BC73957F8291A641E39877F3ECA3F8
-25A539CD09D32741C725A7F7520B288670AE6DB55BD2879005599744CB54B1BF
-8759C7EFFDAF992F557C13CC77A95FB0778628713ACA9A1A4F0F9B5304A2E828
-43F6DE633DC423B4AE3AFACE6D08A2CB7BA7CF2A0AE3D52100A3090637B446B5
-3D69CD48477185434B35884FF9A965BC434A6AED30C26537E14D7F5E27438F5C
-CE5A8F4B01B0375092137154A9937719C3D6874C9D1136DC203C1F5811BE4C8C
-9E10437D27586D4FD8B4A8146B0C96A4F13FF403188A9EFA26D0974C731CBD7C
-143B1AF2EDBD2A87304C5FA205D285D324BD21C1B8CACB4F5AABDCF81186B08C
-19A8FCE8F94CED88BFEACF2A6E237BACEDECE38B60D581CCB5B5B5D86DB88486
-0123DB51D12D11E49379765CC5994D16666C886D18A8D44DD3EF0235E14156EB
-EB767237EC9A93606E034375048396DAACA3D20F55666D0C1357222572E72404
-163C6F5F398A73ED1395AADF530282D61879A6DEA51473A286EA7F6243CADAE4
-BA9342FBF4A5248C1915590189A4616A3C774304B6E88FDF20930552BCC493F5
-0FA5DF80C3C72608D532F4F5933A225DE0F261A1D33D866417E49DD3C5CAA669
-853AFB20D792FC6BA87A46049621030AC1B7176156B1D2F49A8DB24861C14445
-4E528E2653D4E4F41681655CAF55E57A8C1D27B60ACE5AFCFC0EC8839CD99387
-880E8CBAFA86B397E8E4B6B286A8BB53EB55CDEB3F8A238B15A3C1E5BD457450
-E3DA8794F224C8EEE4A09CA8567A4E71FEADD076E0CE221A4834B817A5F5517B
-5FAEFA742EB1CA422822BB178B19225EC5B90387929145F7690A2ABF9043E595
-E67E23C9482385C17038DC83B9AD1EA4B0D5E0E0A9BAF8355EA256808B55366E
-FA65F8089A406983191238BDCA8F61C732D99E204CEFCB3F344BF39E240B8457
-5A6204C0257753542985E7AABE35B01B991AE9B4B10E87B3FC44BC3A14479902
-CFA8572E0D255269B7ED30FCFA1023B8A614586C5A2722EBAEB9DB53E87BC93B
-BDC9CABB3EA3BD4938893D2C8F2A198042744213F419C5571540E96741435FBF
-6AA57E260D84DCBE3A214954028AC1ED4DB2C6DE2DBF14A749647E1641A7863D
-B91A9801261731B65BDA550A199941158AD9827527B9D37464B8614438AF6008
-2B285CD83AF213BC6AE6198208BE43540B76165A5D5617C01CA772BBC98F9C30
-52E67F6E25F7192D36A130AC18B71E38D20A724E28C109FEBA4A3F1D677C8B67
-42F22120C99FA00FC0122F18ABCC0D24CC32B09CA42D428508AC63E421F9C0C0
-87D277AD58DADEFDC187ABC7D79F8504DC1113D70D7CEA1B4783AFDA128EA7CD
-C7860C3ABEA3BB53D7AD6EA3C116756E282C509058D599FC34B98F7022CEE941
-7108B44C0A6AFD98A6E79109F8685FDA6C2AFAE11BE2478FCD4E14BE04A19DE4
-822906ED944EDB5B532DBEA395A09C7156E45505D43215863F63B635C5A30F6F
-C7E316DA9650D9B5EB90F6A45E36F2D2B2CC89E18A246FA7D391A7728D51B18A
-D4C92D0E97BC88A78D5F3F5107938BAEAFADBE744EA9B9921177C86435A6475D
-5CB3F71FFAE0132E0F288BD509993DBF5C35A5C3B87EAEE7D3ED71B73091562E
-45B022CC7FF481142E18A8D98EFE703B4AC8904D275B08E51FA0DBA6C6FF4E11
-0D0334639A04311F6AC5ED7E2FD7E81D573B14DC0A7F5A6720D2F2F235554B8E
-7697BA92F17ACDD426E107A266D8DE4F774EE90C8FFE38193882015FB1FB1F77
-DF9779C16BEBDCC6696915D5E977BB40BE17CEFDBF4BB2340B35610F2BD333A7
-E0BBB08338C5BF12BB103756EA1BC94566FBC0F1549DE72DB4404D703DE8D566
-693DC9A8BD6D0679D54FE8FB5AC0934D2336600A1B528E0BED9F18B93F6CD0A1
-9363ED941A02704BE7C8EDB90C7CEEAF5FE0DE83DE1AD9398E42411BDBA8C9FF
-266FE82D375FF6B6B6B42E3C72F9D310A3CE90D112F7F0BABAA8FCD3DCBA9870
-91AA07E001EDB3C1B8452EAC75169E0A23C108FF9020C4CA9CF2A0E2A20E53E8
-42146154259263EE4BE01DFD078472363B0481B730FFF03E6B2322009818DF2F
-5B7BC17D57A70A9D02A1ECFB9CFAC92B4C43DA454E97EE9AB42FB800F397C403
-785B59D0961536165B7D5CE598913155A75310B331E633AF46A818FA0431F7B5
-E408BBAB437A7B9B47BBC875F8B7B14B7B46A421CAA505B3C6FCE2D6B98FEEFA
-BFC8DB0B5182FFE040461498573AFE9ACC85EC4AEDA3FA37086CFD35155115E4
-0F5EC7170E19913DC7EE88132663A1B1C04521A0216C73BBE09605D3D76CDEA0
-53C53126DF96298813CBF9FC2074167A41E9FAF05868D80CB78C1C114473667F
-52E8DA719E7427A6F688C5736E59FACD7B86856AF7AEAD82AEB9A3F3B76220E0
-1DB2ED0049230607E78DCA5CE38DA174A9CE4FEFA0EC187DE2020D472889E553
-C988AC4A918C3CEF06EF3BB4EF02C2725D1A9EBA406967F8A4969694E929C1F8
-7D85E82A434C5C5E1C5D9F03AAB7FDD6DA21D3E95B0F6709BA6CCA5F37D6A7EC
-58CE5BD8C82FC1A5A1F0B90A6E49F14B04D8BDF6243CEE499B4303B9FC35E853
-1FA4804F9514F966FC5263567396E28A9F605235C797ABAEADA1C71646A2FF24
-2753C6D3A5348441F196294860D44C47DAF1E50B004CF0677CEDBB7FB842B7A4
-90E4E31E85314E9031A665CC3EC0B3F0368567E154A4A6CC206CD8AE3CD45061
-AD67FA9594C4B3FD7BB01C6409D9C5E232323C60566E0C254DFEF45282E75676
-5BA6FBFAE1FEB9477BA7931C2C47F3EC2FA506E7DF6E1D4D7C60530F33F4FEF8
-DBDB65507F002E7DA817695508896578D84E2124748EFACDD527F4190E7C8931
-D7D30D8A7FAB5FFB4F55B8DEDFE2CB84230DDE12C54106FA697E84B320E0D508
-ABD664C7FE500549229636138BF213EB55CB325210895024F8F748E9B8A85AD2
-D5B1E888A503C4BCB2C5BEAFD980C202A0C580848AD9B7088A53AAF4AFE7EA35
-D1F3E05C7D1348ED6EDEF9D477987420E79590D1EB76F33043A6D18644FD3F7E
-E65597D5C699447573F37B082DF8D4527780A5B77A7A1C337759614B6B926183
-83B7585A16886CEB3A8EE1622BEAFF917B2397FD7FA803AFAF8F0DC99A0E202D
-795B4FE27345F3D275D29AE0A13C258C2EBEE48E5332C0064B1E08F82E2D7094
-705BE9F0BA6CE2ED4E7C34FD707F4DC9B586718D2FFA05108ED8F7623B9A11FA
-01D3A755250131A5BC85DE837F8F6E4C56721747A00830395E2274B7116C3845
-EEA1DDF51FF498DF2F143DDDF413870FF42CC4F667802695233C8BCBFFB5BB9F
-C416A5AD416CA61832DB67A517345F041A85AD1455D7B8580A04CED89CBC40B9
-6BFD0598668F99616579A960061DDBC5E4EE436730C932D645839848A1A0F5B0
-B8DB725B2D83F436E23B81B04B3154F98DC99032AB08C897DA86C933ED50BCE1
-4A728A52FE09F910F7E47BC3F2DAF8C22DC78DF9EC66C2664782FA94B3B9B56E
-49481B999BC60526881A7AEE7DA30EAD63A32F65D3FEED5D8D6CF94BCB618A83
-82EBD5CB11DD9DF1527112E4AB18BA84D3006F0A0E2C2696C6730BE9C8056FA5
-22D5215932558B28D2CA5CCF2EF5075E928DB301202FFAFB2578BB25DFA6B1C3
-20077C418C1840245F73F8E9EA4C473E182A46A33C3CAFDBC0BDB2B67442BD6C
-77F2EDE389AA66AEA8E1047FD90830FFC5A53C05A9A5F02361953A9A6365F866
-68D2AFB36867724E5F1E4E15DB55CB82332AD2B50D1F4FF598743A5BD27770D2
-E80178E01635596CC17D1625C55E7BE5C9B23FD330B1CD1AFC3B250A359F47F7
-25E6A837C96953EEDC5A4F3249F50435432A4268710DD9375AF252C2B1A90E67
-92545928DDD1FBC28971A075EF7F17AB44C51D4F5628AFC8F53B1EA0E92BB299
-E50CC983132C0AB98BE00FD6E9E432876859B25B9835185DDF9F88BD9D1045B3
-3498F720E9A146FEE51225A5C72758350B48938E63D92D16EA5E700C48EA5C75
-B493C810D5490EA12FEBB381ABBB5AFC1DBBBE50AEDCF797DDA608D4A4412F20
-4C697DECFA4990F5AF13CB7223442714F907D5C3E41A01CAD4744B346327D7CB
-2BC0B1CEBD3E711B8E63A7A28A21905488B6AE388BDEDBA2C4D81DB3E8AB4BEC
-105FB9C0A25BC6FF47973AAC6AA236B16D6EFE49EF27BFABBB061535970534E0
-04C6851F5129A7453CB74A1E4285B560ADA3D87305E0EA0BC89F0A6EEB2AC5F9
-14520E6F791AB083DE23866A4A84342D751D8494873F1064DD3CE7B7FEAABCAA
-EA808E944DC0311ACFB1DF0DE76EA38DE7E33AC71EB7CC7135D94FCE33FCCCEF
-AB068A62E2B9D20DFD65B57E7F436DBACB5E308A8E4502C37BA0E4DF7AB021B5
-33C6C93C8AB613AF3D96D7719E56809453BD1E0900E4AA9F01CABB634D972346
-081AF11A1E665F59E4BD86491205F43A6B21EFF8056478293CE34AE045DD7A57
-6C5C33AC194764C0DF930EDBCB162E093452D15A72934141F683498684C951D0
-733DB2FAAA862A3D7A4CB337366F8793A9B865D70EC280CD084E71484805D5C9
-7823ABCAF00585281C5F0934329F3265E38045E64752B28CFBB668C8077C39E7
-53704F2EBF5A95A8F6879E2135374CCF7A50EBB6DE63372975EC7A83770BDB60
-EE4F9DA3CA3DF1E31E5B489AA62E29B92E90C3D95E2C5D9F285CF3800265D8B6
-ED1822CD6F328059DF29C154ADEE3FB10D56D8600055A823E10D9EBFA3778A5C
-BBCA59FE3F40EA37F67515E5F947025F64785F172213045E882BDD672F434B3B
-2B4BB66EBF9E85934F3F3794B9B320D1ED0AB3C3B68477A595DAC9536B2E4C47
-E6B7057A96359B57E02F7282F35E9BB1A8F7DB62C9809BB21898B6402903487C
-2029C7300384B376346424D99E2CBA82126666335FA8DD0B5225823A733457EC
-DBEBC89FA3FD249BCCF746F8434B8E60EDE335D0F515A063260D6C6F0B6F5691
-96CF588D856421AD4561C864E0ACF9FCCD4CFDB4EBC60656D66DA3C1DA212A55
-6B4617DEDA813739C6D3D07669EC10F669711A17B460C00AD47359276CB293D4
-79B41F1CA8CD1129A6313A2253A29DA8C2CF46997F71AF365954F5F612141198
-8DB049ED9F3263D3AACA68FACCED6F24BE3E5A9E602F775A79EF90AD4FB00789
-D60896451A39A34648C7CFF8AF04BA351EFD772CD253BD902AE55EADB42E536A
-C1E711854932A03A36D7C3863CAEC28E4FDC836265504FF8406675A625644168
-3FC2038FD2F050F8C23233E0481832BEA328A7FC5C45446EA919DA3ED28F8CD2
-D8D93AF013B006C46E1508AAF9D159C348E04AA3E78119E361A34D67958DD040
-DE1781D010C6F15D890C0EA00496E8ACA9E3440860FFF5AC4FD0507983749142
-F92E2DC5B8082A5DFBC0CE442946ACD947E8127AAB82E5A60176735ABADE226E
-8A11D6D40F267030B3415603F18A59BF6F546F5C72DCB84B9810DBA500ACB230
-2105356AF679B3AF478E0B0FCF991FE2F2D046280CEB35647F7C63A7D6ADD948
-D22E8714B263952E07716678B4A94B5A5764C69A6F268CD58285A82AA61BDD7F
-3CCD2DF266C35605FF93A95A46C44E93514094592EF43425FE5E1F49206F0551
-DD35636F54BCE90746586FFEF34774E43D2DB09BD6A06733DB1D8648487BCCD3
-F1DF35D24638B081A4F04A41DB88609F63CC2B720F96171360D74DE840EACFDD
-36E8D3172BDFD986A3F7EE97DF58B1BE6867C306C5DFBC9F625FF2F9F743A884
-16889BC87FC49247FFA31F3234815B6BBC0599A9463E3AEA983346F55DDF8F8C
-A19517241D59B502D099BA9A1A254620F087DD37A20AE13AD23123873798DF22
-F94E28ECD0B0BAA8DFD8896ADED992182F78D35FBB5CA8F95A69984FDB9480E1
-3D524CEA820DADCAF0184A565A18AD4B756A287880ED3125581E4F094C6D4AE5
-3B7C7820C12458DA98A99A97DD7F9587E9352F8AF642133C2F9E2A646B97920D
-C9033A1E95F5F8A1EDADC9B6E7ABFD29F9CB8DB9365FC60B50BD8C0506A62EBC
-EB8A8050C1ED1A9E0A7F975DEB2BB91EE0340BDF44538E03C102627691BEF28C
-4243BB73111382D1F4F2C9D328EDF7674C7CA2BFF1570E52C3034B13E805E75A
-DC945433E1222B4A711B6508C26A4C3D0EAE6B81A664CC9024907319AA5E3423
-F9BC4A45A2E2A1330D2D6E6D087ABB22BD7F1006C1E8763BE1338E1C993432E1
-654098913C062B102A53F26F4A730E0756BB4A47FE961EED2A60C6638C1EE93F
-75FB104D556413B2314375DB036F4225CF86CDCA28662730E5022B980EBCD6E4
-ED29E615CDE69EE00F5DF937096A53CC303CD9A283950CBCE8BA1DC7592035AD
-FB215A6E4D2D343FADBA32EF8B9CF34402B89CDC729DC57F526FE3CD4AD46D1F
-295BE9B0D53FF0CB06EFF1919E9BA9019446CB33ABE3DF3ACB7EE9F5E02F9795
-BEF2E808CCC7FF21C9EA41C93E9672C035E37B75AEDEFC6384ADFA52A0762E41
-4557321D665719B7F4E43513C997DD56D526C10641CA654C19C2D35AC8CFC0FD
-6946C733A51BE65AE583F186BFAA4C8C112F94A24D33B435C8820F99E1D10F4F
-BFDB89537ED95354FA009A4ED9F4E3CFBC93D8FCB674F0E1C2C4716A203389E5
-A38E42C10A4C41EF6E63BC0B7D584A97FA508D4677F037CB1005C90816B90E96
-3B8AD64FC8D63E9DB21B4A8DA53C75F4BAC0137BFE9FD710D1B8E5EE3EF21E46
-4C6AF9F5E4676810CC19F9470FEAAB3D30F409AF9BE1BA0D03229F6F5BE5226B
-9471585C007D680F356F1F564D723049644039D1D3CB6124ACBE7C6BEFC36597
-6181E15716F691FCE490CB0F05F4E550AD35CC4D345B2BF4E85982D523BD919C
-73A974B806A1C8F78507798B5296D48F8A4B5BBB4D7B736C6ADBFD00D2590D3D
-924406CD1BB3C89636C55B1C90B69F51861A654D6683A0966FC413C1CED7CAAD
-243262B42908A3A16031EABCBCE4FFD02DFEBA01A0831BD1C8171D93635A1F4A
-BAB522D93E4E00BB91F7C18B38EE47C5739C6D215E330BA68DDF5A16BB025E6D
-EA4094D60332A289053C0380D456924C548588B9A6F0330D351B95E511E00C1E
-8D82BA7509A653A4EAFB2002048632D63B9883AF38567E3AC185A82B7DAF3237
-42DA7EE5A95115E5CE652D507D66073850363DF068282134BBB3928551DB1A18
-8FE10A825C388A73C1F3DB270504626154C4D6A61A750578A107F0BA4780246C
-6BE6C4B69611B7F01EDB605B19ECBB7A229300893504F5C32E0A3BD998194390
-5FA3CB3FFAEBAAA2175B85DB4B8EB762BDA274FB322FB39CCC73689232CC0A83
-8E1EFA281735FA00FAA4E955348A595240821D120D0C9ACB6CA8CD9ECA4980C5
-4B547873A58BC840A28592C3E66000CB4D7A28CAB1978083EE2847F2B681EEB5
-2D2D892D32904294C8E139B0FA4581782A244742226CA8911F83C1D7C98A2A92
-6025CBF85E82824CECDD6A9E18445BB815FE21E80DB10E2120D14DE94B453274
-E5F65F6BBDB3146690B0B7FE4BDC1C4CC55754304AB6B61420164A88A76E8541
-4722CFFE8AA2664311FB7565B3F4FD6493CA2A30DDEDF03F5749515DF9214E7E
-0B219296F094F92637A427C30F9FB712C3E8F11533CF5C1F077E808AF37E3E39
-94D4B0417212312BEBF1F4F03F95A1799E3AA24352B93B2BA891DD6183DD124B
-B9833C82F4BA2B41403233DA8ECCD88842625A8DBF00B5E3E83989273A3F7F01
-DC31FADA68CD56C8B95479B21EBC2A295D76B68437B80DFCE037B3BF87CD2170
-8BAFC158730D3B2F695DD6C701C65011720B3376581D6BC79166EAECFEA6F9E0
-40E62651FC8C72F47B47CB2E36A4E7667B95E82C88E20921A52C76EBBCE06CFB
-29AB75D051007EF5BA5EAA35FACBF549A85B3B6F37E3D206F7C8D39C2085E3FA
-74D3211EF5E61592ADDA9092C0483B9ADEAD2C64B6778AAA14FB6CC8A4FC6EE1
-82999FE543B0F2DEDD7E442E0BCAD4212F38852D6F2183EF8C3DAC77666AF856
-C410454D9F1CDD07DBBEB1547E6718FB9B79D00A9E3F744071CC75C3F48F8BBC
-3F09406F816A86BA4CB0D169E473AA3A62D68785283B8C5862E631A9BA78200E
-8718AF68C6215B68675C94B43EA901592FB2B8BBD53BFD835356FF45A200AD55
-3075927ECD06924B6DC3F7FD0C4FA9AE61AE9B1C332E2B996612E8D9F49257B7
-10D8C404213210CC338206109F6A0B5C7A1B9AD18E0979A790498C5BB0BBFE1A
-3F3249489FAC00A369470B697344E989099D9377DAF483C93EB7E7420DA436BD
-0ABA11777ADBB2716927806D95526AA226E1293E84EF76807953C52B515DB505
-7942B890DFB216807468A84788EC815677FBD55C02CACCDB2654585E42DA9A47
-16C0D5DC9D321C43C5E17EAD6E80DC8F3D11D50976FB342E1D16D2BF5C8CD121
-1DFC079858141F3631526ACF733A23E71C187A6E7933715841AADC7CAF7060A9
-CBAC2B04E33B047684487D4BA94B16A4431374A8867504A4EA338E192532476C
-D8EAD70E0CC6BD674A8AC75DC18C4E4C2E785FA52F89EFA5F0EFC6F624F30595
-1436CAF9F1682D2FCECD7AD11429EED4F64D82B51F8E8451802D4885418FC253
-41EC5ED0821E7BCAA89BD70A62D281E90938332744896875AA79038971E778D1
-2E350AD149AF542C44DC36C236272FB12BB8690F689C74736C6888E2884BC0C0
-4E105537BCF3C8F0CE8292BC5C044E2C99665F3247AC9330A516A76420D070D9
-0082116A6A43051DA9AC00B71879F1C9C1D43EE163635E87852088A6D3B77A4B
-574265A679334DE35F02698EC7884C8140207187933A36E2C577753E168F61C4
-21E2A3AB436CCA9C0BD7E996BACCB156867A89ED2B8F8DCB6DB9CE8FB870DE91
-4D1CDFA268E5BC6A4AFD1B0890998345F2754045257BF43591473F351B62AA97
-D7307BB7AD7C8DB43A73D5EECC987F34CAB192480F570574227E2224A5CD0A07
-3E2BD0287A3C313EDF5781A4D9E1BF2B2B8DF35CAD3DB80E0C5B3972260BF124
-BD3FC3EA966B57D552DE87822AFC04A46291CA66623FE48F0FADB5DD7CB571F6
-F39F0CDD7F541C9503AF6008B389F3B1FA3743AB1774F0C9FD4EF228D1C0F9DE
-E10F5839D69560391FC0AA8EFF9D4B83A970FE1351CF6478E4D91ADA69E3240A
-B1B09C1F24ABE2B23CF8D74DE43E3301E60F21A12FFF51D03AC00C2B44F552F4
-0503BD7F3EDAE51A89BDE38ED6A4B16481E457517A7E363CCD3FACB112996A75
-771474432AB0F08DB7F5EA12C3036697CE979D321B7AE1E4A0C1323E05C0C4A0
-13C8F18B2F59A4D396182763B94A855CD4CE21E4923B6B9AB3F7A9127F5F5BCD
-3C4550F697B4BE1ED870525BC0EA67F994558375C9E6D28D618E9CD9675CBFE0
-BF24A75A1B90B73079E2C7222B866C89D4D0BD9A041EF0FD603AAA9551A64C2F
-EB53C41DF2CAC894B78F8C84510C79F11CDF8518D585A2A5018A55CB8EF9E30F
-77DE2200F679F9C3642ED792137130083C0F516C98B6EF34758207B799FADD76
-E0939B3C1AB3AA12543AACC2B9BD2642B0FBF48E0427B64ACA02F1BFDC501413
-83E32E59F705BE89284AD702CB6F9BBB88F223ABE70B4256B8511EEE6E21E048
-148E8B4A7945A5A67D9819B632D86D6FA1CA5E0D040994D8165A5DC175245D68
-42FF80A82575AAB2B91C0472F97FDC8B537201F2E551D18CA39669DFCF0A1586
-370AA32695557CDE598771E158B023404861CC76464E098DC4EE83D9EE9B5250
-FAE90B4E0B2D46BC459D99B706E8740DD701F4C5F5D1DFCF365B261405541665
-B1E532AA3F9F03ECFF018E9FC36BFBBE50589308137B120975F70A3965582260
-1D975C394A11304AB7EB5A1448FC02CA062D2DF50D3611C2C00179501089BAF3
-E57DB91CBD6812C695B0CFD658D3AA7C2C32713B18D420AF945D00850EA7A0BE
-B98096A00D9AD0ACD656D4319377700D0BCB6FAE93A54BF27B3976B8353A6261
-E25402861065694F507D81D099BC6E4EA8D851277A8273E6318739D74BBD7344
-5EEECC73CFAA72DC0B7EC2A8794A5DB64BA9D4668E3E9F330DFD7F27CB83ED92
-C0A8480A15DCC3A16B7EABC23C594309845A4595164711333B2FBB9F877D8A9B
-426130F95F3D645A3336EF17DA63109B5BCCCD0EA1FD390E6F0DA649F81AFD8A
-1973EB6C74F7663D0BAEBBDD9B0738DBFAA9B7657E7B291E803D14F1EF7EB1C6
-B9306C771E3A5AA3AADFE2060D2323A9758412BB6E44B95F82DCAFADDFFD1A6A
-7F194B3E4F67279EA49410DDCC1F7DED6C0B34515D5E203BCE36F8755EB1C2B4
-8184AE1B1B570817B73D46D498358C4ABBC349C283DAC96B3FB23D2981E47337
-DCAA2F7C1010AF1C4FE80B7C22C534BE4FDCBBFB4731BF99A369E1E3D6231132
-F5AE9D2A1D701CA8B9F7AD88A5E17BB90C305D6604986C41058C6CDB78CDD043
-CBF6FE9D482363293156C6069C0ADBCDCF3710FC904361FA0CCAA012D3879556
-066E179E09FF5B001B52E838735AAAAFA899E71F2928562DA997133756576127
-CD0FEAB3447B5EA57BE6C32701D248813EA8B93E869F2137F65D5C1A0AE5D5E4
-21393E16DA6FA116864D07D17B1C8F08560DA2532990E2FED66D0E0FFEFAEE49
-55418C41DF71AAE21318D1CFFF5B38C90F7763B278DC825CD31CE53CCE9CC805
-C5A11B3CCE9EFCB43928C1E8482302CD6B66A2CF7CBEA7E98294F7F25C490478
-3080E7121F2ECAEC5F3563BA632F2E2019398B584284DF9EB96666FDF10AB2CD
-2D348D416D29200EA47B9F3CB5DA356DB357E0682943F0E5FA543987EEA76020
-F633FC4553F3D4E2FA6B8666374200BA14F12E9384A8099712A2E17916C61934
-317D443E56D8C3B5B11B5ACF389C6DF35125D399D19EDAAA53049E119EB110D4
-201901CF7D967B9BFDE6A5ADACE2222CCD624B6889D3574CE6E94F956198ED5A
-0245956F031084B7539141D01C5B66F6DEBC3C4F2E90E7756FCA65708F755E61
-71533842008AF59B1A9AA5372FDDB7D0CA18BE1EC8E399B4787CDFAA931DCBBC
-2AE9687D973DA7EB4F2F764B8EC359017E1877F4EF5B81A4A7684F87C4F91BA4
-54644E4C2D45F320A4A58592AFEA5731D47A118C814136EA91A00BADC6946669
-5EC507D7854C1C3AFAD477A1D844A520159FCBA8AD708B522B2FF6FBF55D8A0F
-6FD97F7BB4C4F61DEA1237DA3B8E42409936DEDD8EACF155766889931C4A1740
-4C3C646904268114676AF5B0E5E614930B0836BCD5292128779645E2D8743D5B
-75D8442A911425C3932B61F14C97EAE0D895B97C957B9C0489D47254A4ED52DA
-99F6C27F314E03812E6B45B690890743EDA6CB6410952E4AACF4EDB38CC22C89
-2E569D597B91ED013F696F06BBA6E6549C4B74B0D6DA6C7251E744CAF092EA4B
-D3ED88A4E5F8873528792A2549133E25C27A77F074142E38D2CAEFA2D83E7409
-83488D979E5EDBA0AF0EC16BD4D5E27E624765A93DCAFC7911604CD2530F754B
-C64F3F70591B8E91B2C28DFB8A4DC3534C6C74206D562DE3567DD3C2AF1DC5CA
-52C91FDCC57B08E23D47A3F9E55E1CCE984991AA4701210857FD85A8C2171FAE
-6B08136B3A5A1D1B738D0627F2FBF722F64ACD86A083CEF02179FECC90E2E6F5
-3567678D46B877850E30000E2061F68102B8B8E92AF0B9183F250AAE6C1B7992
-6AB521E20196EE31A08892167103257B1A9671CA14DE2079CF8770EDB83BAF9F
-53DA650828761D27C50DE9FAD629BCAD28805CE37222CEAB505D9508558FB660
-04D5550F42CA25880E37B395583EB95891942B443DF0B3B8187D5715EA366766
-E59E29DD4BB93A7D0876E35CC891EAA996CEE283EDAB491FCE06AE7B04D5A0DF
-31CEDEAC4FA7E7FA52A9DA00067A7D3BE15C0AD2166D5588B879E6019504F633
-95E783463A8C8418659F3ACA7DA1EC997D7A04D09F8D83784702EA9ECB3AE69D
-C56A063B59A8FCA9762D3DA187DBDF3DF719778F9D2578163CA01DD9B5B78DA0
-B5D9CF241A4B8ECFA244EE22D3B59BF9ABCE7320DEFADA12D442EAC7AECA3B40
-8EE795F3909C603B80DA8F2C1DD9441F84F9A41273ACF33D03F111FD78259500
-9BBBA8C3F021C09AD376B170C1C5FDCE2F8882593219D3955D73C0F9827A0A00
-262B4D50A92969469C1A3399F8580B67BA618D99947CC2D6001749FF6E90B2CC
-07617E54B52DC6C952B5CBB975CEFEA8E4FAEA7BC4B019BCEEF05729FA72E585
-001AF774F0F62C33C0D9C085AB8952CD7C05F0C4B63DC1C1C2EB91DCEB7A503F
-F0627C145467F95C8E9DD49FF2E8513A3691B4EA94A96F90774B839E6A7150E6
-842331ED976434BDFFA7526B4D3B4204BFC3C550B68F8EC23C735D3C23F97796
-4F07C86CD3E76AB44A4883B21A75A70E7C10404E6EF46719B9D00772E515BB65
-7B28F43986A8BA067C6686E4BD54EFF94038750976D74D74833CF394D6ACCB7B
-40173D0B70757EBEF5FB4D30C487AD7839EEF48E78C4550FAE0F1DE33D6A472D
-CD3031B2A3DFB0D743BA0FF56F6BE3E0EFF3A7471A74A1F55F4F4C1998BAC995
-3B5B456934344CE6D634E1F2D7D12523D1EA8720A55D5034D99543A80AFFB0C5
-D352E32A35DDD0320956D21442B3A6E82E83D81CAA47043944FD10CE1B505B97
-D6466083F1F5C6DC2B2929783F12658766898848C1442487D0091BF263CCD603
-52F2B00878D567075D442BD8731ABCF5D2C83F36A0F9A1E6513774501213BDB3
-CD17CAA600F19DF66E0CE30233080DC6DC9D554D95FDD1AA2BD681D1C992AC48
-329206615E6CE9EB6DE557FAD1B93BCE7E629962E42E542996231E4F5DBB96F3
-C98983D0F5AA6A21279618F524DB66C8863937BF8ACF9EE54C403A7E4F939388
-76F64E7201FE28C37D3745B817F282D9F85FC68693EC7532EC329DB55D4E69DE
-30F7515684E7F0D0EC089DE4784617BAFA338B369BE06ADD099DD7EAA13AE100
-6A36A3E098E41ED121FE71C1958477B1B592B32F9A772BB15A8CBE00C2CEF494
-4984A9C5C590BC158EE52960D641FBE2FC2F8D5D47E753F67C9581811A51E4F9
-9A4EA2F413DF149256CCC0F0F3A31207E8E3129A0E3B26A0775DF6FBD0DEE987
-3D30C1F5186B4E26F574B0CFEB2DCBF60DF97E82AFF543A366F9DD6696851741
-AD6AB8351D633BE824CBEBBA9C5A98AE6F1E23B9587F171AAFB43611DC5BDF76
-2BD293B37EF19137CE825A6B8F6413A22ED5E46BB4C922AD40E2650A6B4D2277
-47281F7265F3ADB31C432B7A6B88489D10331A923B403310BC0BA06B85F48785
-72D3259E3737071BE8A118D9549F3479A928FEC0116DA2B41D12BC958D0918D4
-4A8C9CF30FEA2149B200FDFD03B4D0CB0F148E89C344B90C59936A4E7E290654
-81B2444128E79E3D5C8B8A4A4BEB8921C504050F4177959B25F33FD25744080B
-4F05595644171EA0FCBBE047F31BE2976FFC586B38B9982CBF76E2A67C8C50CD
-3C594701C91398605EF946D3FBD80B96ECB679CF5894525BFDB39690431FE060
-60689DF26CA49C37041EA77CA90E89EF6E78C4BAD0F4ABF33626ACD029FE4809
-C409AE68C321A594E19A081D4835A538B63FE0B7AF8EE3B68F34E2F7976D4EAB
-B865510896B0133C287A3B8FAB4FE04E9A9BAC9865A705EBEAE689D0736D39BC
-5181AF6B84701CDCB7176BB0F9107FF547299AA8B8C8E8058D6B7805F084CA22
-CE4FB9F8A520835695A71D733CD28991F6158DCD0C43A09314BF520BC86BBF2D
-179F0AAD7E934A586F31A196F2A0718B30983D13F8DEF42C59B7F2FB0F8EB3A1
-F8B519E9B9CD59E18B3D5240F9EFC306BBEC014FC566445BD8B76E5AF0252FEA
-372DDD3DAB04E6D574FB30653EF31F7D2CF6B6F3DFE397D84DFAB299B7983BCB
-8210FD423D64A0BDB250DADE971A61D08B78EDC48C167C579B8926C60081EA8D
-9BE64490D5A6CE67CDABBF06041AB535A21380D43ADACD1B5C62664BA44FAF70
-1CD47EAD956DECAC0115273386EA8F78B268DA881EC845EEE5F3FA5B39B0A258
-E475B58AA506B250DBAA66059F7F420E3686FFD482CC9AEA884CB9DB881B4210
-A41BA3023BE3F62F42744379A82B140130FD6037773E62E4ED9AA6DB831B23D6
-672115DF51AD99C61696594E9750E3F9D73B215345A1EC45FE47F8984C4ED919
-B09A00582B00E72E38D602F5285C7F266D95AD1FC045E63BF653C8E781AE40BE
-84271632E81777B0FFE8AC6C53CEA0C785E4440D84216D2EE98D8A589278E06D
-FC7B5AD41D3DAD85FB465F63D773899CE58DB1991E71F15FEDE9183743F20933
-3CFC0EAF71B9711022D5AF0030016F28D7D5651975C5ED9EFCC7CEF436464F29
-39332330A92D8F8225475BA5CB2A6FBABBA28930BF747396C2F2DC0542BCBC3B
-98ACAE77991DCA7C81A3EE50E03555E9578D516C511FCF7682C5203CA9E83F83
-ABB3D68231F4F3445F8AAA41642C47E1400C48322E4276400D9CAE1A62213F4D
-55B854C7C255D24FFE8B20F3C67E796C7E8146330E43167FBC56434E40167A5F
-9B8A9273FF702A4F2A48B85874D309DB3B4824692E756981D7E53AFF26A1558F
-5D7BE49021311B18D34636D3C2572F3B0859014DEE1519D5FC47642A08FD5B7A
-CCB41475ACFA477D496C491739D4F32B6239E220A742EF9479A6C09FDABD580E
-E172FE89856018DA055DBE38097073833FDC90D9416B81B3B397C38ECB092D1F
-98831F1463319D89E2F978CD9F7554E6074FE7B1712560C5BEF1C7E1EA5816D0
-B10C7309A4D7C13F2F5D88A0786D283975F98A4CB847B51EAA2E65A2E822AE1D
-1FF5C49B42711E1BF49ED933E1485717EDB08612C7B86B05DEF387C2B2951610
-626DB79C36F8CB5181768B4C297A5FE8D73EB470594CEE2D0B12659D9249D1C3
-70E9B0E02C5B74D16021F039173A98507B189ECF34E4C17F982738B9B48CF9D2
-2CA18E2405D929A1F0E75094956689D7B9407CE9A8B392E1E4212FDA5810FB81
-E66BD56AC62D271947D981A459D0DA12E0FC520A54C7369AFFC40F698BBAC99D
-2128405FAC517E8E273869809965D208642C73531F4C670BCDF69847ADC008FF
-087487565C3353749DF7368566850EBB3E06B9C79D27E7792E48ABA5DAD5967C
-D3F5FD33DE4A39DBCFB1AFB37DFEC440165A03CD0F9A0B0D72ED78A56A6A6C78
-CF1E06EF1F4416F01576045A26722A346795FD4D4D76AB3A19660018B26C86B0
-F45D403864D6EDBE6231764590EFA528FB31BA9ACE331D3EEBE9871F209336A3
-935E8842954CADAF5386325C4BF2A87969FAB335E9FF3704929E0D0D5BBA1D59
-795A5328AA2CC4FB411C0B5898C092B1911334948BA2109432AA5045264EA67F
-5126164BC3FD96EDC09A44809091872EFF39CA0EA66EAAAC6314C61B505141FE
-A631F8B5862B04B1A4DE1DCF607286B2A3987922E0CFAC1D88FEEA2D2C027C7A
-121F76F9433E5314BC554360874933FD7AED268986B789FFBD6D6535772134A4
-52B2930E0207B273C98BF26A0F6515A4B42F39A4935E10F1BFED78D292DAB6B5
-105A43E5AB00181A6E3F035B28C5C3BAC2B6E9E6B495C08910101E47AF030DE4
-70208324CCE7E0421173166BB245B544B9BD102374B67D02E99FBA474E9C96FA
-963CF1B714340AA83F9AD5AF75B468A6DAD13E1F7420ACB51B0096EAB900C4B5
-2AC1D2866B273BF011E2C7C07F6FCBF0AC334A8A389D0F351D3C74D403EF66D9
-39DCB12D7DACA0F5EDC39F2FD220CEEFFF2E1B9617F305CDE3E740C066A0166D
-EA8B7E08FD185D048CBAEC8EF574F59FB4F80DC8382AB91F56388F586D7C4B4C
-3823847086B9EC3CD99DB118DC89066090B20756EF990678BAEF4498694C0884
-FB309CF7A22CFB79BBE1D4064021A647A957B773052A0CD872AFABF04478516C
-97F76772B6F511FC2EB58980103DA0FEB32E61D0C83FED84B967CE31C5F19D85
-A566ED750CEB9C8BC798CDD9F0138BD650943137394BCCFCD97EF2DFC435B337
-4F45AF417F9388037B4C5FB681F5E11F3BAD9450632E1C2DCFB263EA3ECAE66F
-AB78AEA057C18ACFC12098E0DD71D16EE1794904252BC427298F69D9FEA435A2
-F00A5BD09DF5C57254EA62FB77B0248873AB68DB7A60413A96F53850EC693B1F
-C5D2BBDFB6B197500C2CC5F35597D452A501E812C102F8C235542FB2E78278D0
-E1C1D0C96CAF2628B54C98E3F32DB8D62CBA3441A63945A250EC21C4BB97CBA5
-4A80F71E30CBD8D974EB3FDD3ED45EB008ED54D76BD01766FCAA8F6753402C07
-EF04B9B2308F66D56CEB917E0848C72ED4B1E290BF4A6FE7728CF68A23F6EA17
-3FF37E5F9574645DBED15C540C0DBA3C61E9C02697329BA57C29F3D28B5D76E9
-9EBA8F527DFEC6C96CF090804EFFB25E1458FC5897CB9E269BF2FF6880222F28
-1988909D794620E260521B65CBC1C495DB903F916F50D15F36034506E0838CF1
-D741CA25C5C2B68679A056F03F65C842BD628A2AE8D73203876665372DE0B048
-C2FFC030F600E500B5699A7CF7E9DEA818A5653700143FBEB970F2D51DF32730
-FAA372EFAEA1A4E15E6C2096AAAA5AE7DA3D9C05FB11F83E853763DE89AB47FB
-89411C369F036A03D881664AF026D76B52742B74F6DA12469E8D560D3C2E2BDA
-3357A562201416BAD3F046BBBF27A5ED52C606C96CF2FBE7236F0D76E10097E3
-03ED4F6A70BACB2E52F00C260C61B66040946AC7A5B4866C61501A883897512E
-FAFAA687ED471B7CCFF704B4674CBC082B07179B30F0A78459B6D23A16C49C07
-BEDA6A23F17F25F1166EDEE0B17F43AF8D897DDBD715B9D9FB540949EB3FB4B9
-8B749FB156374E73FD7EBD72EC9C4FBE54E24F17AAEF29B1E846A42C84D3A1CF
-27E2E59BE76B3A8828A1EE70887CEA3DF74A7C7DE9A239CCC9E9770740E16E87
-84EDFDEA5B34168384C0F429178B7AACAE1D37A731AE1629F8971811F032A2F7
-A88C26E73311F6BCEC83FFC99B01DE9BC5FF9F34999DBB568199CF8EF8836704
-192CD77B452622002C3DDF0D5BB06FE822B0583E00A425D85A4B29633B1DF56D
-9F5F7CCC9AF8C4333AAB65841CC7A4FEFBD07ABF367D0E691E22384362F43AC1
-4EF4FE416F8FB32F29EDB2A20BAC9D285D78F8DC79F7677DCD002E4A30C98DEE
-4AD9EA0B00AD161BDA8B6C19922E9840B3C2E96CAC90369FF71A3E5311A4334B
-10F53F90109B6C218EE7B8D23A95A766DE4D4541ADFCB4A488D8F913F9D07D35
-2B303F2518E0BE70549BA0F0D8D33EBA0CF23C610FAFE29C1302D7FD008972B0
-D8E9DFD0DA84C8CEAB1B160056C2B69F7EDDDB93B069C8E4378C7777696A7ADE
-9DFD45125F9609D8403F72905B73B813F320B6AF2C9D62532328C65FA25FA75B
-9B57A65347488BCB948FCE4E3843E9A195F5D6CC1FC91CC9D474AFA91BDB9F0D
-457D08F869F21A78800D1744957848AB12982157748ACDB74814C05F40C5C630
-171553B9A547AB9650509B4C8A02740182C0E902120721DDEC1EAB1AF4F9EB81
-2EB8B93EBF9875D368D11696BC7AC7631C0C357E4E90F121B58009626C101972
-BC86C45D2444AECDF6C734A9D14CBF243777B970247A6587AA078EB820DD9131
-2D729B6B7BC569A444460BA522284509F8F5A70BF465F20EA91733A07648AC0E
-D7630DB0AF9FCF9FEBD09D8847C8CC6CF63424A784937F00594D311AEC11B55E
-8AC43A2FDC85DB70DE025FFE25F1D314CF06847BF2DF90EC2F78116EC8583A3E
-52D8B8F0C8EEB01DE18B3F288710FB14DD0E10A8A4E7704662CEB3CE6E856FE8
-21AA289801B84CEDC7FCBF815D2852247C8D06922F8FA940B93421F256CE37F0
-441F8095E1A3481AD60771C65113C61D844E489725EA5B34501709463897CB5F
-B01CAAA3BE5109B4A49E
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/l048016t.pfa b/lib/fonts/l048016t.pfa
deleted file mode 100644
index a14e724967..0000000000
--- a/lib/fonts/l048016t.pfa
+++ /dev/null
@@ -1,1269 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiSans-Bold 1.1000
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.1000) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Sans Bold) readonly def
-/FamilyName (Luxi Sans) readonly def
-/Weight (Bold) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch false def
-/UnderlinePosition -39 def
-/UnderlineThickness 78 def
-end readonly def
-/FontName /LuxiSans-Bold def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-224 -211 989 1012} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078988 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D830D512B6FF3BE2CC450E
-1D74C05D938346D8713E75C290B6906D919052118C8C44FE8218A20F8704A3AA
-2AFD1790F3C31C39A443F7CB470E4FF7E05E8069552396C1CFACCDDC1C77FED8
-D4E7A947701898A3E50351EFEB35877FA44F29F04D5E5DCD51D55B1166E650E9
-6DD6DDEB0B5A4C018BCCE2D2FB26C42058026C5EDBB9FB634954094EB160B402
-CEF86BE7ABA16B63A88F1FA3A87A267C8AFD876E1910185D01FF64026182F83B
-5D30CB5CEE202C27B727DF2E31EEB447AEB941B2FCAA382353FEDF664D72D31C
-0C3D1FFEFEC97E0F0DE0352DE4DCD8F4878D9F677F89747B330FC1582796AE19
-B79B28EA2B74ACA2C127E3B4A3ED23A57F4A48260D2A401F4668E48BADD96502
-E7F1239E705F21FBC7C4FEEFA3F9F938850077D029227236D0D4F3E1FA17958F
-36E21AF35E8C937E6D0F988233C8438BAB6019020698D80B9C37EF035238364C
-E57BC9ADFA77D4084795CFA6A236CF1E0DB7095F4361AC525DAD39DBBD9D3D32
-08AF35AA38CEC79C2BCEC3B3AD52C93D4F14D25535A391290532BCBA80A9EF67
-0387B566C065825FA04BF4998AEA0942AB50727D74038FB6B602BF5B78C4CAF3
-75F946BBBAE55C32E858AAAB72F9BA53CE6725835E5654791953D26F7DC5EFB5
-5064F3DA56BE3C0A7E6BDB57D59843B0AEC11922A53B1243479DB95B43422F05
-95A1515EF0165589E6D74398C0D2C9BEB6E516304A4AFC8F76161A074969107C
-48FBDF8EF6BF7EACB8CCBC18D39ADC605A56A048CBAA3828854D358D473A66AA
-DAEBB2FA045514C5AA1B99A174B2E8148ACFAA807038B0A8751EC028E89CEC7F
-6D30099DDBB811888C900488E09DCA1D60BB398DAC1BB2A39FAD166B6444C182
-8E8993777B38A3EF591FFDAB9BDD2966BAE15327808E560AFEB82941B65E7B3C
-49B3C59330E2BA07204301F845E32EB608E12204EB511C09D06AFCC2BACD0654
-8B70A1A15916CD5CF40B633F3626B85366E1DD3545D14D71B21184CED78AAD6D
-A7B16AE3BD38FADDDABB38EA2BDA49EDC3926B1526C57D9631A664E872610478
-84D1DD1A3E6CA785B5630C31ED8EF22BBFA07286E8E446F1DBC37FF4A4925A99
-DDAABEB0BAAA3DF5E60C3ABDE27C49F5483FF1C9C3358D3F1A37C2DA1A4A53A9
-F4DE466B3375BCBCAB491663DC09CF549A191B4E53B533D4DCC3D65F0AEC3E95
-15CE5CFED746E12CCA4663FF4B93B36914A7688F13BED3A7A4B62F272199B8D1
-01CC86E75715BEE99940BD3B54DD82F8F3C3BD993723E0F032A89A46E40D4187
-EDCC579654DB07E4ACEAB6C1031B35466250647F37A36B1FD73CDBCD9ED005AE
-855D6AC8C5560B7F498FA3DA42D510AB98D922C364410F36D3AC8F27F0CB185D
-004AD2B98D3AC972C91E47BBE1C2766F2A3480176645B2F405589F151719DFD3
-7E40DF255EB133FE40C48966D61B175C9C1C422D654DF914AA78E6139E2EB05B
-D3F4DB9CCE46D7FB174B210C45D7E60B2DB14145DCAF2B5013C53BC002762DD6
-DC0791C4FB9031CFD24C2236AA61AAAD8AD8BCD9045EADAC9CB6E6DBA94BF817
-C78C0C686A7EBBF7B37BCBD484393F5D53EFC93485C0FBF6331F3A5D0A0AEEBA
-23BFE63E49B48245557B7C88B478FCCC333CC083D9D5F0CC2335D5D908413AA4
-8F690E81E40BBB674F7E2E37F37DCF5EF9DC6D7CEA3F7CBA27FE86AB62F65F36
-B2F0996F7F1A33BA903243ECFDCAC2756E95C19E4718AE188CC7384BACBB2200
-ACA8A513F352B241EDB68CCD6A74273F5204CC22D722A00F9930E874515872FF
-2244342917B787EAB3341439041E3C83667441D2CC74FB58195E474A55442280
-75BA96B201E789EF394C54AA51D2E55EE43257442880FCE2676A7EF904B01921
-74C50502863BD66DAAE2381309F33A3DC0F055EDCF96B2B6C9ECE80F151708AA
-750A0F2BCEBB3ED6E586340D9DB7E78BFA775366070A9E7EDA869815A4AC7B17
-3F139533B2F721832B5E846AEADC4E952C709B3F6DC3185A913D0820EE1933BB
-0B4AE2A6AEFD68C99B7AAF6B11D8F012EB816781A8A0A99C2EC174B0B6869F2E
-3D373E1CBB2EB3FFCA74B5A3B1667ED301AD1380A02DE73F258D2B99B81D7AD6
-00AA0E604200A17BE9AB1403086BB55B80E6B693B64C48A7AE2217ACB82FBE70
-3EC1F87AC9FB2B637D7D943EF4C4F6A49AF445A76A1BDF21F67493075AB227B1
-F36A743201A64A3797EA6539AA99A864A57DF2B651C3A77915A6BAB4B17E191B
-576C80E4023A77559305C25CC0D75E6BDF287298EA30D2E916F97ABF092CCEE4
-FDAAED0926B95AC5090C01ECE24D507ECAAE990D7808F294BDC0DAF5E74341B8
-3B9406A60C3CD4054DE11CBA95BC1C4F57531636628524311AF3018649CEA3D2
-1174EA1EF50985964346A8AAFBB7A38EBC9F01192D741665FB01CAD36BC34457
-B0E2AE912666E96B6E4F61160966AA3E2B051CD61584D9DA998FF702FE01410A
-62DAAB390155A045DF241FC47FE824E49A5E96D3BB3D354DEFF8F21498FC4F8B
-8906C6A7E3CC692EA39013DEBE53EA53780AB6FF1CEEF8A2D2C2930DDCD31398
-6CE78CBC84EDFF1B9C0C1B6DD756AA5B53B83BBB765E88A8A0ACA6938021139F
-881FC91A4FF6F1AE7B2BC81AD0068835D69B465196625EC7F1A5D19141240C95
-F95245DACCB2E0D527B37B8477CA62E9933CDA5FD82BF6BFBFCDEE5D82F07797
-3F2ED2D86C8950A8D4F2769579F25961EB3499A002E40B3385C9628BA50C7556
-693AE13A9FE9921E3C712BAAF060CCB0AA4CE5F70A9C473CA0A5F53CA25E6761
-D269D13235377380380290BF10467C2A726C096D4FC98BF402E498D91F4C2ADA
-A0DC3B235BB50BFB85FFD5252A9727C174AC924DD4B086AD6BA76B37FE0C9C0B
-C44CF99D67C9DA1F97158C69D689BD6B0D313ABB5F8BC62AED5787B33749C569
-A0FF5A740C6B51371CAE44B9F9A516C06341FD0A530ECCA6BA769D016E3E51BA
-016AB1C7E5B4A4C0AECBD0B743C97025C20D021A92E079B6F051138E5945EC72
-AB5CC8435892A5DCD78EBBDE078033E866859BF0F2368FDDBBAB67AF17B943AF
-A1D72B7E72AF6D5AF10ABA4350B627464441DDE21D458E1789635D18E3A51A9F
-6A97B5F73F7FAB11B0684C33FBE0227A67720F748C99C9FBF849508C9670CD04
-61BEF83CB62342C4215BA40968213B2BC35E4775218EF4843C39EDD64D2DD648
-462A625DEE03561D0688198DFCB24300DAA7348E9A2A3B7C3FF2119F3801BC1C
-450B23D9DE355A31FE26641EAC1C24DC1D452FD17A0DF9DE3016EED76ECDA07A
-96BBE3DFDB475675473851E0B6FC5784C065C1A49C88B9EABED14DE2329C139D
-8E62A5B152AFDD0E5925969881DBD1E11AA9AAA8FFB179789B6086B89FE4BB84
-736F63C2D2544A636A804D2FD6773B6B760E1493D342E1CB9693AEDE902D3ACF
-9765253D70A82D40BF2A300C7FC3C90C5A164F5BE083FB587B9910DDB220EE92
-D962E3B41F1D1D4517CDE42A1B31E1EC802220E487556F5DAFB74F7435C6798F
-D300019AA3460321482DD5FE5A0E513AB83021809BE7D502FC1CF70A03315BB7
-DFC2D92D57D026180E03E2F93223A2572FACCAC6E115E84341D155B11B15CC8C
-91A58C0F13FBB809BCF649BFA631D8F39C3E4930315D11E95241EB5C6D7179F0
-89254794EEC311CE2003EAE64E7AF47565AD3670753FDBA67806B8AEB8342092
-6C4455FE7FCB11CC99DE5747F1AB6C5E53B805BE44AD49B58B71FCE5E406FFA5
-CBDD6049906397B512151A5ADCBF89DCCEECD0BCF2E42EAF31D07147F459F299
-DF8CAE98460EBEBB371D8C04A7EE3D30EB34E73EAD6CEC8E569C344A4DCBADD2
-9BF49F036E25A722A0D94DA58DA12813A4900BC32E5BF7847FBBCFBB7C78E034
-6D5B6D4C951A74639BF257B122C698114A842431D3B7630C585BF5B4B943A83C
-09101C02EF689C8D2CD6DFBF459F0DA464320B7D2993EA5F9CDDA1915966D490
-1871C1537EBB120D16F8BEF6ABA64C72FB1DACC1299174432D59368220EB2EC5
-79B2F9F355F77959D5919815A90AA9C4A0BC87D40A06D860BA9B4BCD89708A65
-EFA0063378FC3EFBFD13003BD1E656A697F3C05FC6CE231015DFDAF48378546F
-CB5442A206740766A972CA9B08151D29C70702EFDE0EB1187C1B15AAF948E994
-006F532E9227C04AD44EE22FCA8450D745DB2DD5CCA57AADFBDF081D21EEAE5F
-6FA39642F58E8E669262630123488394D37C47FB8110D90521CB3F100873E7F3
-BF89A26B6A51122215E1647ED6BC3604A5B8FE349CBCED5D0C98E7E50DD9975D
-8214D3D164A3079DC1E702E8B88704ECBB8E015293E7D5AD7EE5F30BE8C79FE8
-C1E98BAC278DC577CDD159DF88DF799B7B5A48FA9672AEBCA7B54935B204873B
-3AE4272A4F4A578C85F3B62B45D19F2475D76A7581FCDF7C6046442ADC2E2602
-B456F96C1526CF436E2470D0D8C83FAC1DAED4536304C5975AD70861C56DFFB4
-39D09D5302B0AC6F33FFAB5F43D465A85D4403EF8FDE2ABB552472FC810D8660
-4C88A1A7C7EF6CF3E6B2D843F72873D43716FC3C52CEB6718F0E714B66B83DDB
-B8824156A1EB779ABEB6DE745D2AE5615F565F5A1155EA0A8D2FEE3D9D0EF1A1
-07D5FE36091FFBC8B5CC09733D25C1E872925EACB084C30ED44470FA44C3B89C
-7255A46BA16DA37F4E1362A200BE49BA9386B8DBB0C54F3DC801351C083C986A
-B15AF96A717DFAE03A391DFDD7F812BB6566B6F3A4F663581B76C138E9372D34
-B3A1925EC8B59A3563124CA92456B79DC0B52613EEEDF3A719B8FBD44D873F9A
-9A4053F77E37143B2E5822C7971C9D6CE4129C64504D5D857F907ECFE27729FC
-3D3D7CCCE919E50E11BB62E3596A247F5377C8BD41BEF51197374ECCAFD3182C
-D07F7A931D0D0B17C956D8BAFF218BFEC60997D00207642C52461F48E9B66B41
-2DEDC7D90051CE288CAC0A8382CB3FDCD11C1EC3B74515A7E6CB157F7B2E2CEC
-E5A664011AD2D240BACA4496ADBB2351673E0DC78B3F9618AB412D04AA75CC24
-462D5A925799EB85598559B6E4194273BFB2F461FA5FE3165B5D49620E4AE070
-7F45CC85AF3BBC554E9281C99A601789010A990962BD8727D38164A16794E19B
-C62AAFB909CBAA7CA55A17080ADA886EDF6E38D09AA4E6418E8111B33CFA14BD
-0D71127D8F95D03FF4C8E247FB19BC9D0F33E50B7C1C8F0CAC0AF3A8A62E9521
-E2292ECA00E69D6C6F94FF7564C62382B1A8497560131D9C8377024A8D629BCF
-B04005423D59F2494362AC97BE736AFF562A591454207B1AD52B060987E5018D
-7A2A17F790C0854F19BA9FB95F04FAA769B954FDB5A1A5783456B42845357E11
-81DE026B170DD8EAB0B9A782A6FF7926DC23910800D83B169D498A8F3F2B9BB6
-5C30054793B82EEE43F9055CB214C8377E94A020B9098842B94BCADC8C921055
-B1B60536E6BD12554FC5A56B1AE7F96F7547837F6F46AD232D7E0BE2A62EBA1A
-87C74C44047149CB00ABDEC136FE5CC1A90DE011C80C87C9AA7431C656EAF1C2
-A9CA320D197746BBFE55603A34CD3AD42776139CD1E155EBF3B3BB64AC91EC73
-FC0E23A13DB317753789E3BF98561A21676DD91B6BF3715E88D9ED98A8E5EA32
-E54A7D84390087ADAEEC3BE995D19B43C9635EB8BD6D13A46019762699E5648D
-DCD8331CDDA187AE4D917308B7DFD30E6162CF927F3C2AE9666C8DCD8FAFC272
-ED1E75FB3EEF0527935B9C1DFB055F057C998E560B6598F1972A8829E57AE99C
-9D3389EDF9A7A8A3A43EE4713357396C62A27401EBBF540AB2A29D50C1DFC3E4
-4012F882A6089D57D97BC2C5DE19A81B1DB98EC4E8D58C547A5D131B84341CD8
-9CEBAEDF1165E8FAF604F0290892B813242B6584BFCCD68BF3F01995BD89BAAB
-7C7B8AC166F5F78AA84659A45D1EF4FF658136CAB8627405EB36907CCE200B0E
-3A36E0593B40FC3CCE029881B0329ABB1A948F5191750478F46A03C3CACC480F
-070ACAE4B6C06A911E88D649D297907DD631916E60603CA49F35A2B3C8D478C6
-9F1C187C315A859AC464ED353F09C964BC171580257A31EFFF445950E2EB6106
-7EC224409386B3CC2BA0819B6CF9C895586B23E740C7EF1A1814A26117C868C9
-FE8A5FE3A8DB9F53165E0C62CCEF9F3735EC18C31E0C7C743B0DBEE893DB723F
-D1514A59713B273D4C9395235A126BB9155B14C9F47E20B8FA8880C717D756CF
-CEB12CC6C82FA5D3F4CC91A39BA398B920B5CBBA3B55E02359FCD284DCC3DBB1
-63DA4BA07C38E3E9E64BF24E74B62A6DE5F1521D4A1DC6657EA507E56207726E
-08C5AF790CC07D908750D852A0916861B8E67D78CF8ADDF16CF9BC6322274AD3
-8101E46FA56CFFC505B3D6C20920F13D8B40CDE364D8FA91E7357E5FB218A3CE
-40F84B5E537D90290154C68256015C5B8BBDDB702DCAC1FFB105AE9CCE0A65FB
-EF43BE91E7737533349E0F6D227B30E52D41D2E73EA55F52D1A065B1669F97C2
-0B4B1C2184C4161820220A52E85D3A0EDCCB2A5BFA3B406A2F675D0E272E41C4
-E6293BE2CF58E8536B0AD6087E5A89DEDC6C93F981B61AD9E91ABD1E4B2DD4F7
-5F909701A0EBEC140EB7840D69F2428045CD604A590F47821CA8D51DE41E07E6
-C69D97C54D21A64CCF2E914D4AD2C444C129D767B285EDFD21F8A1256CD18D3C
-3E5DCD834B3EB61B39FAD0579921459A1D6D52632A7CE0DE74D2FEC0A91E7FB2
-AB4C61CD334B66B27263BF8FA80456825DEC46D7144CE5888A73F545905F5B51
-0AB1C1D8FC967B23741C9139C2497899A500A0F568BB22272D360267AE36BFDC
-37022427D27F6A5AB5CA408E2E925339DCF18DD3663A2C088943A59B703F6BCD
-B4DFF736DB3EE64B31F93BF8E8E04C51231E453A4264DD5CB3EDE03EFDE84C6E
-EA04803556B2323197F4F0EFF3B4CADB6F645DBD3A80E094DF41DA69E7DE2230
-FA155A5731DFB74212F26391BCEF10568C12F3B63ED608555E29356A31DA7E03
-6630A630BA93CA08FA4B2CD93425B6B1B166E64759051117A5CA57375A175B58
-88CAFFF8058A6620717E3FE9B0B3199E201B99E29F709C9A1BF56E775F295EDD
-FC347391E56FAF1A620F41FA2954AE8516A8E7FDA373B6B3318FCA7B050474FF
-5043E3C1F6C2ED6B6393CCDD3EA31307CE63487EC58B0EBEE57B7FE38A797E32
-FC1D5CEEA4194031848930C172D98526455C6F7C97350B893EF62AA17684E675
-48FE4AF909D9D42CC82B801B19777D99ADD0CD6CF454A42AC60B6D973441E4B2
-EACBFFFA2980779B87FB9DD3FDE5DF16BE1B67AA40A382EE0A5EFB6BEEC313C7
-313CFE4522CA12401C2236D6BEE454693A7AE8275633D580CB578E4EC4B5909F
-E549B79860EB0381B8B2C60A8B729F231FF0BE0595747A6934D70274FFD50E31
-ED10F8B9B998956B9B7145313D667336D28C65DE14B92B5DEEB935200390211B
-A871FD3910636BFF0F9F3D932C77C412343DBB318F1C1863A71B0321D8C3BAF9
-8C8A851E1B210C3AAB8E4E92A7CB4743FDEBED828B8B40C18588BFA45C4972D7
-E25707F2C8F0F295D08E9D56C6C565467C088FDBEEB4185AC9503A87A3D0203E
-6913E3196A1061E4D788BB04A481D513ACBA92D5C024B51F5C974B14198E9C95
-564CB28A446A2D5E9EB79BD08DFF005D23E80C68B59D97B4B8B9D407885FF333
-B19B30DF7582E296838D7D68823896EE44C2E82D136840E72FC34CE6F718A07E
-E880A2957A3B516FA90BEEC49AB0BF5626609752BADBBF836E38E066339A2D0E
-8392B31B7A0F2B8256311727BDEC7102D7227584CD8F96FB0F218E7AC4B3B407
-61F6D338D99C1F315D53FA5176BE6563437533439020C2D967F0BFA4013DB08D
-678445D75A980B2456241EA5E20151D12B5E9E573FFEA0432EE3C55AD16E8C2B
-251F17F3AA1916A5F4FB99ECF340AC0770A763927BA3D5A03D777C84596FC8F4
-FEB2C582705B8A4A50E6348522DD166437DDB2BA6B029637DC0A189208FC51DD
-1CFFD1409F17A5B6978D776439D702691A79412B6114A9EAD17B2776A791AA89
-9CB426B20F18F45093EE66A86CFE232A2A9B979074D2D77FA0EAD9BE8A7C731A
-E38675C5E1D1FBF36AD4440D616817BD48C294E387F171FAE366474924E09855
-9839690F0D2BC32A0FEFF7E0A5D77C22BD692C9EA0557ADA09044AE6069475B8
-9D58EB7041A9C9A4CE8482ADCB3CCE1CDDCF21D842C619813D830ECF67B0CA67
-80E5B5CEAA3219E7D3055663F34D9BC549FBB66B199F36D4C033B74EC374CDBE
-6EDB97CF2ECC5FACF8A68D9A8514D49014716D5920A30E85908E232A8D8ADC5E
-4306F54550CD95ACD81AD9A997F0D518A14FCAD5997C892B54354CCB94BD7256
-7AA5FCC78175EEA5E30FC5AFB22CC1EDC499303058D767BF038273E6E3FBE028
-D514C87AA9A57EB739DF5C60D943FD5F13BFB6EC3179ACD638F3968CC3DA84B6
-E4F72FCE3DDB95ECB75C272BD790F670B9DE0D38F506CB2554FC55290CD34DC3
-EB2FAAB05A3429EE46DF199219A975BF5A55B7E802445AA7F3722104E7608F84
-D66A70ACACA0B4AE6CF96B4565577031EA3884766458C090D5E088B00D391D1C
-DD5F456F17E32A00F259AEA00A6419BC21DF016E538C74CFA23B1739B485A150
-C57FB3C7C4DFF0C2BBC03CB1FCB80AA0A8ECBC1F76A371259ED8AE2B92BECFF4
-573CC1B5B502ED6CDE7A17E20E8CB77C49F47DB74A64F66B43F8DBC1D4E75089
-440C1FFC5CF38A3F498CA3A1D226287CD54C1F5CEA7FBA8DF6D1448D322774EC
-3C0218D5DF970A012E1F5D5499F2B9D7C427741B518A7E40C05DE156DDDDE625
-1A0DDBC011601E7ADB83A38B9B988FD3DEB78B0E9189A6CB35DB3E12169BF0D0
-04AD6AA70E2E26DEBFECB88A224DA21AAE268BE352F7B591274F7B85695F5FF4
-5DBFACCE337F2220DA9246138706A0401C7709580F0DB5642F24FA4EEA4982EF
-4F221DD7686A0902E70E64DE739819B4A34C34A8F5C68A591B2F169D3F9E57E4
-409EE3FE9A19EE8CC17D6B23F836DFD6D053E43178F72C8CCAC64E90D59C6E7B
-F8F2C0F92CCA49109409E471F7D59743BA1F9756C105E2B3A88431E74525029A
-5D791598E6757242D6A2BEDCB07568DD3EE55AF3C2FE01BF49BBA42F2D669637
-8FA4AD2CBFC8335BFA14C486A3A80F5682F51719C8C5050E78AE3632B88113AD
-AA13AD85403489DDF471079F73F641A4DBDB5F829B69F9591C13E947C8649F20
-F4035BFB5B872781E8DBD33112FE780667F03EF8BCC1130691EC49A4F952BA27
-01CCEAC81C98E1E782F3005DCD160C5F10390470158B11CECE9DA5A140E33000
-801CCE2D780F5624CF5367ECD0F037F7DD4E65C282110204A16E258129615E41
-A8EF65A70DDF685028858C523806517B94B7936B87A6A63E5302981E322C3940
-CC320304D5C861FE2A10675005C9B824F2B23C1F792D79F6C21A79E0AE6EC01B
-13196E92DE931E84C4B731427523572F1FEC80B1213F8DD279FA35E6553472C0
-E5DD18DD2179BD5C5C386F8F10180AF0037E0C5DFFC6C542F3F54A1C8012AEE7
-3C5B07953BE7867171FF6CC743D5E470C8D1CEDB8B417EFD8388C510D7036255
-2BCAB7A81F4BCE4457FEBE1B643D11FFF23F57832BAB05A6B5595D1BF1AF736A
-7E0BCB97E4CC17771AC4C287F7D9931F87389E6D54864BF991187B4450B8B1D2
-72F78B4BEABCD93F81E5FDDE93594E34A26DD7FBEE4D8EADF932EC3B46684AAB
-D88CBEDF312A4079B5FB0D28629C0709C9838D31942BFE7CA23C619038946E3B
-59BF1DAD24910B65BA4B93A66BA05C795756D8C6B899381B352A1515F06EEAA0
-668103569EFC81EAF2770EF1F0C275E176683A19BAED35F8C4EB4FC415CEEEEC
-EABB976733FB60D260292631B8317D90AD16F149181CFA0F39381233F331F9B5
-5544F44E3B2F2C544EE067A7259C19F49ACDD963E79046E45337C98035097F18
-5E7ED0E33FEF28163473E8F682A2DF99FC6B44E307ABB5C459A0FD18040CFBD1
-8BA0F6583A609C5CAED532EB0CDD21714971E0EAD8248237755CE81C919824CA
-D88FB1D0F29A00ECBC76CF62C63857BCBBAB9FB36EDA51C5C69F3B766A8BF388
-8FDFC8BC575DB2FEAF388B75CE1FCD42E192965A2E21326B537DE3EA765022F5
-7CFA5CCB84859396439EC1D6DDDD38AC4E9F06F138663B9D1A4909293CBE7861
-93228D6A7527BEB9D7A06B90A109BECC91EAA1BB23069024AC95C58FD2F0D92F
-0C9A23F9F98A8D26B7A1E70E081D564AE0A7A80BB84535D7583983161F4C3801
-DED0939FFFA6B101A9EE4004A6800354267881F0DE62EA5C32B4A107609A863E
-E16299310CCFFD62A7EC33A75F7E366B9CCB16A9905C5B965E66AB0A82161CAF
-BF3DAEA49CB8689752BB02B67C12095F38A837A702B1A7008B808241CB3E8952
-77367FCC9D8D8020A70FB767B1EA866C8F0A6F1C5CE1BF0BD0369F0BD94883C3
-69243523E0EF6B8BB94FD81FB9FBCDB3F536F6EBDCD64BE81E24BF77A90AB41E
-1E682D022993F534F5F084E5AEE10D831D1561C3F05024CC81FA5807ED64420D
-479D0B05266B6E93CFB2B2298073C5DDE4DBB1A084D47516D8A59C7D8A3B6FDD
-4CC0BB36179162C61AE84F3DED09B5880954A324C3E8FAE9A1A33D38109D8D6B
-F9A471E8F90FCD48604E265BC789574CFE5CEC36994951F97CE0BC88CE51FD5D
-B44907874A1B286BA978537156E589EF0A1D087F435EC06F1691E51D05B51926
-E78A55C1E9A4039185DF20C68E2E4701C4F7C5E18F045BEE53B3991A3710BF3C
-9280A1A369CE41FAEBF3664B056FA83F8DFE4C4000F7136073C49CBE894C1B55
-4BE63B386FA539476FCFAB0E10BE9F82575D59ACAB276C35F800FA1B33646310
-F635AE6153D935E901E0EADBDA92DDAFC6B1471053D6A3ADE4E74045AD693A7A
-F3609376CDF493EEB0B2A69449CE541BE697FBAD39D86B27A785BEC81CAEC54F
-6BDB34984E435C3DB92D10DB49DC6C135D9D65AA195B9078D6E8944F2031D521
-7264C22CABD2634EB5683DA871696E91670265BEAF792CF81E80383A82459741
-29B9F13C24ECE80432CB09DCCF5C28DC545ED5E356A5416CF586B97ECA91BB27
-B07DE92C1178A0AAA216D4AC235B19AB5A62BFFFD114C4F49F7279C94DA0E6A0
-6C71BABB00469C502207B97A7CF0CB79D68C2F5ECFCBC94EF07D0C37F222FB9F
-FCA9B78A445E28D686F36A6A517B88FEDEC5F00D7E83C8571AC06FD325808921
-CC7CBD648E7CE9C1A4ACAB26DF540BCED76950EE004B457F4BDEDA23CA8B7C1E
-B4F47CCC42AA81045ECEA93F8170706A15EA93F5FA78B1A47722681A6073AC3C
-A2459CAB0D5DC8AD079ADE47271875F6F3FA540CE8F0A5097F12782589577F54
-58EFBA5D8590CAD95A6FC2BC78227994B43DDC151F5D2B7B9AA85CBFB11BF6F6
-A9FF8784909B880F6B06806CC8F830F92E551F363882847E215E147CC4B38EA2
-B29D70A9D6A9558226DC92E57F0B0E78C95CA0A2BEDACA4CD0EE68F753912E6D
-D252610CC37FE89078ACBBC215BADCF61A29263E81C2F429E8948B926A877C5E
-17E51B64E0D3B325C1E4F29B92B8770C90D1D6A2C809081C612065A3285DD573
-C33DDE2196577F6D463E8D19ECD438F12C339BD3CE6482B33CE6CEDFF0109521
-12D3D79FECC373EDCF9E3E82EB3FCC26178202F42AEEB61DDCAF57CC4F995B32
-56E41B2FC6D6C675FA363D1CA2C2601F311C568C224352EA2B89881C8671CA9B
-BC0C5C7548A74D372B009F5997ED4BC5C0A2137DE941588A6AB1000EE9745108
-A64F2F780043F4CE9656E3FC2E8777CA1E3F88A99DA1A69A0E79A40EA2C6FC6E
-E0C95F573BAE78791B02449F75E9607887C0EC9B3654233707C6954E07D9F742
-F637D965954D2CE0CE474B3ACD1226E4E9CEEF1B8F73F7CFAF10D83FE9C4723A
-37BCE2F2C78054F4EC5DD881815EA4B884C7A88AF6B0A78B100FF7ED33D8842D
-6728D98CA0A0E3D211A0638BD2EBC392DAA12E01F76B4B5123A337B5B3885FFB
-14DA87DE71AD3A7CFC662C020CA6803F5F1DE8D70283B61CB8A049254EB8627C
-C2BFDB41658742FE18D0DE9772B9D592CAFBB761A5A9768B4B02DC6627432260
-5DEC39919A487C019BD77225970F1386B156F85AF55B7B23AEA03957B898B1BA
-16515BEA6294D26F5A4722685E7FE08298EC331ECDD7DC824CA60F19B7F03D1E
-683899368E18FA8499A2336FA880F6B7983F368886C6DD31F7535691974E47A8
-299D8F4BF4223DEEF07150CF2453C714A0CB5FE7ABD5AF5FE47FCA3792A13977
-C531F2A8F81672564A75DD3BD50622F94DFE38EC8E8540CAEC171D690AB803B3
-01C80A9F4371C59CC0E0011743DD480995D5160986DAC3DF605FD473CE527CDA
-CF9C10E819F769132FB73C17399C6AF0692EC445CF768BAB03DC70C1DDD793D2
-CBD3FCAA117F019EDC56D479EC56914CDF19FAB530D0E2118B20E735E4D3898A
-A95329E98BDCE9DD94573B27564F8A1B7D075AA0AA6AA6008438A63BBDD174B1
-34BDD06FC334D97670568AEA4E7F762723064BD4B56CF0718C55DC8F435946F8
-9951D65A1333CF4C8DC70792546C46E3AD6353A2CD596FF2173B1CD5EA8903E9
-D1593C8B5DC53A42F76A233237C4E34DD339F1D789E5E8C56E3C8C37F5990732
-47799BBCB3E2C0A246EB34192F226668BBFA48CBA95CCAA6A9BA5C543A10532E
-A6CBDBDEE5E662BC1F8DA0D66AAF39CDF436966FA58CB3207070631E8ED917E0
-26489A16182B29AA0313E0ECF6479DB4675FB0576610A3A9D5617DC8807B61DF
-5610D4ABA159BC25C3C3F678D52DAEEED03C31F5DBC876952F459609915BB5AF
-1C35AF1C7CFD30D8F39E3F0B9072042CA8A2FC564EE23D45181544ECE19C2056
-E6DCED4653F6B1E02B203942CCDB6175463DACF0A1D56568A248F39C3B6BA054
-476489539269FF2E88D0A463FB60D52E0A29086D2F86C650842674E0D4DE274D
-941076913905096454C72DFDEEA33F2C7F142364018154475587DF2B766AF169
-D424EFB12A1E04CA32B1ED4F9A844F95EE708F7961D01080E2EF3C2125406FB9
-5F000937A6E5504917A4C2EEB0EDF0EE2C19CE2142E875AD64CFA4219072042F
-BFDDA76F6A8933616E2D9C14622C17940B2DFC4CB124E33D1C7FBA5D4DF91230
-95F75B3B2944BD45292226DEA4128D14B094477B804163830CE7A310A7433382
-53D9F5E37DBB6D1EFF6D699585993424ADE9BE7709FF882F7F66CAAB3DCD9D2B
-0A1BA066F3A43BAD8D0CF5D608F855E14B252FDBED8C6B944ABB3EA837B2CDF6
-DCF730C7CE1C2A0A63C652DB8D822E74767B95F5D7F20DFF654644F93ADF8FE0
-8B4C393F9815D4980DBA50AF43FB5198246C91D9D1558E1951B790443F4DA185
-B9D71EE244833194B6E9C12238A613015B33668D7300F4EABA5D7749D485B9B1
-1E2D27B5CF779EF39EFB94851A0A7FAB1BB928D05C4E38123934CCA47B88C007
-BA2437937EE3D46D8B469082905C43849D54E873FECE86A7068C32F4698A1EB9
-3097D47D8A14BD46DF02FB5A8D811A3ADC43FB362381634A4A95CEAB4F43A0C1
-DBFA3EE3721629FEBC8565BC17C850FFE3F757D0CBD3FBAC0F4F48AFE89E1941
-60F5B4CB76B8BECA2A734DE84DBDA0F33BCAE440CC5E7124076363E37FA7486B
-B3A90F827052429DBE0BF5B94997FDCB3B8E896C0B8786DAC25D2368FDDB7E8D
-311D6E2F50DD30639113DA11A915B3E36F450AE6738FE3E93C5726AE8C9CC8E1
-7AE55F17082C00ED68C7A189783E5D955077A2CE3C2854834AF677EAF4749882
-C90B37F66C7578C534C773D7AE8A1F27864541006B747D3B7580E3D808FAC8D7
-47F29252F83B4C4D2855ED5E9C129FB90FD85AB248BDAA33BBF956274EEB9AFB
-46A0E155FA1C006A66D408F32BDDDD511EB4F5E9F92231D7F3DB5AAAE0287A16
-688A9BB19C728267E13FCF20C9E635F1721B555C2E08A340503A75D6EFFDC772
-269BBCDC68CFD48AC1772CB37F9AA24DF90494F782DD63EB3EBDA77EAEB2183A
-2F2E9C4750CDE2E047A842288A7F430C77C010C0B7E3CC1E02CF51DABBDC9C6B
-DDA38147668F56416D782075F98A337F4314518A23F01C37E47244408BAEA44D
-BC156F429A9DE240414B25081B956638D2E0AF490E92CF18E44E666D650641A9
-A1E5746E8155519298DEE328297AD4EEC55FCDA7ECAB8C6241F8DD5B0959F9BF
-4E1F5B4E7E0CDBA1204D78ED01B95AA34AB90C8B3553693F7B18413E51843D46
-ECE2BFAB532BAF3EE2DD93B2620F96F907EF51215C17297F5A77E058AAE1A5B2
-A564C5C11ACB92D4C58D29EB2543F454700EBF7F350647406B306C2B9CC29B76
-AC75AE82065FEBB75CDF9D216F376215633A4A062191891371C8C165D47371FC
-148CCD1BCA39461E5E915C7C5B13F04D5BA7CB3B6BEC4489E527188B13E2C06A
-E393DFA9B1BC17A141CBFD2138C7CED07D86C0EBE50A8A6E48A0FFD11F791B3C
-E3455ADC6DC8A02EB3CBAC56D879820AFB2557E361A0A208213C0C2461E6CCF3
-576AEA9A46514266E2850B2AAA75A10FE3CE609A591C2DBA9545098FA577D89E
-35F48FD4CD0EDB72B9A7FB7873D01D683DB3DD2DB9342C23C8CA0BB681619B52
-0A9C6B27C726D11B382146FA8D54D556FA6EBB117BCE2E4D53089C9292C769A4
-37C573E7C7A00DD95FB351F20BD800A3CA17169BFE80AB0E6E2FF27A78BFC3C6
-9E416A86BD22470F4293C77B0017118639866BBE9D08A44A23C7508271FFBD1A
-AB76E5E655BF66E87DC916E0AE1447DD01B8D11F82362BA55B50A4FE5FD7D534
-318EA499A1A4924170C3FD81EF41BBC66090F7F393AC0CFC4ABCBBC4255BCA1F
-FFC45010EEEBE12B78C513C1883950E8D3E5429CC5BDBF05B96D1B6C53C7793C
-D79A82CA916C9EB160DEFCFE32691B44AAE98BBB3C3E35D3C871BC80C7A4677F
-76DD0CB632534F18BBD47F961EB620BB805BA2E5AE46B196E3B907C42F157B68
-6A3FD76F75AB344F438CA0661FA6243064303A7DF12EEE75669151F9E297E812
-78CFFA5ED9DEAECCB330015782093908846B044BD8C7740AF44A0DCC1F9C8197
-B15A30DFE0826454E68C9D80C50F2B1D98848A143134B3D19749F7E1BD5A125F
-990811AE2923F0BF502285C55B49BFCA0DC5E1CD13CF5A42E09C764E3CE54AA7
-12957D7B267213BBED74B278B21EE4B16D0C58152EF52C293CE44D5F4332877A
-AC8032AA8CAED48B5A2B2CBA52AE827F9260383D84A5C5A565BE1D1C7634FBDC
-5F083180351593A272342F08EB1BA76A321BF45DC01F0DC73F81E27B6E4FFAFE
-696B3D57CC50D1C05AE1FE053B0A513985B5A0113F1CC0922E3407376E339204
-27F8E293D1E7A4371E60CA2BF0E61ED2B81B12DABF5371D03C19257614E99858
-5B93773F057BE3212BCB115345D43339CE2CCA48ACB413B206BEAEAD638CEAE6
-5ABDFCA4D1E5907C1CC8BDC7ACE59C1A3E27DE3B006EE0DE0E76E72909F3595A
-4202696072875B42D51FA59473C75AF17BA7EEF32BD822A5AF4556CA5D88BC53
-2782DC0AEAF8F66B1024D73E07E0A26B90FBB0D583BAD7326C80BDC77E5330C5
-5C854E5A81BC3BC45BF9DF2677B9C89100251AC18CDE331FA79A1536E1019D49
-FACCAB95EEB940BFF44E4ABD1C0BA262C750E8193A38B8774CBB92B873035460
-D75CB085C3FDCCDDA3D04C963690D2F5EAFB3270946F69A65346A6A9EDF973FD
-CCAEACDFEAADFE6B2A99D14AF7A210DD834494A4C4D22102042A6213E556CCB7
-F645930874E32F95010393ED42DBF286CE565D56D5C80C96D5C88547C09070E5
-F17A395A3E030362B943B61DDADD60F7D5C4192777D6714F141BFF9F035B205A
-DEA3AB2A307B1F9D16E62969C1FEEAE6C5283DF2DC414E904217945AE629C91A
-0FCDC9BE4459F5F0448E6B2B8A907E6A000B860BDBB3BFD0F8567D6777415601
-267D05C6C0BCB3FC969A22D34EBD2B3C90EF8FB95E7684004F8805A80EED2F88
-CA8C552887A6972BCEDC0ED9DE66E7A2C8CB7E8A884D1693CBB83B5275429BCD
-5D3D846AE8233D5F492D02CB5D63118E647C17F89B3187459A0E4E64738632BD
-35C37B9CCD46499B7163FB436BE8D42CAA9CC1F21D12D7F62EDE4A0D88A4E09E
-F0CB44634407025ADD949A68633115C3C5569DEE891367A6624833ABFA6961AE
-6B34E438E76FB2ED7B65DC1A8515D9C7104587897815128A3A6210E08B55B083
-3EA57ED782299D70FBD8D12534E74F1B7658D61B999E0C6B67FA4DADD78B2769
-430C12161171250BECE14E7CCE85ADB0070ABC240A237AD1C2C3D7E75C23015C
-E145454CBE80DADD25B3FAB08B2A2FE0A3A728FA57261FEF8073952090A5892F
-B9A64E855D36F775154FFA79FE7ABB4A89D7D581F5762ADE506C2D0270E7D64D
-3E8E6F0BB595956B468833842214B25BFFBA2BC8818FADD58EF206D88E32379E
-2C8FA4A3A25D51EE8D8ABCB9C3772CF32DFB6E85789F5DFFEBC252CE9CB768A6
-28E09AA133598A0A664A401DB0D19674EA7423E1BCA26BE4BBAF9DDA21454FCB
-4C2B509EFE29AFE2A9B01CDFC872A32D175EC93C5EE5BE3469184DA910D449BF
-1038F75546A1E37F93169DABD6CB7EAFF6D30DD12975FBC71D755F29DC3C7795
-D150C63563DA4A6282BA626DCFE3D360EE153CC0F7928AA60405AB247E9FD612
-C77688F9B4D84115E797E5924E6B40F23825164AB8B23A0B179CFF6D5A02C500
-8C8AEAE9C9724A17A97B164D0B3CA0899FAD42CCB7FD52ABC3BAF5E91F64ABE5
-70B05D60756664262B7BF4C8AF85F17B4C8F13BBD6420CACA0A324690A307E8F
-DF1586DBB5BB4DFC46FB18C9C4DEFCBB8937EE5BED3DFC1C1243A4E6D743B26F
-CA9ED9F7402BFBE17B7CC477D4E79883162B4ECB3598FA99C53536EDED81F607
-B677815418063F64CDC05309EC4F50C3B49ECC75D47DD5159D24178277543814
-1E9AB69F495A3D0E03C028E81E74722766E868A74675747BE974D9465D48DDF0
-3F1AF3FAB683559DAB50A977CF47F7C4C1BF43F446ECA5374E2B8E77C23A3F57
-33858E972578A0FCB261E1C889BB8C972AD5081FE67D82BD8B929409DF9ABFFB
-BE835C6DE98E32112BBE1883EA92C023A73EBE61FAAB85FDE475DA8531D17184
-82C7914966D4331774027BB2AA9022A0843321C85146A087E617B126A6A17FAC
-75174D5854B40C08EBBF562A4C7B04A63C55A2CE2FF89E8E1D715B49A52C0EF5
-88C0ED63610A7268FB0C9F9DF4527E6CDE90D8AD645C54E26B7E7225CBFAD29F
-80059EB920AE850C60D68D5C8012B1ED8E7AE12482DAA3B5F674D4E569824126
-ED93DEF05AE9031440E88062F475598B4AFD463C144385359AE4B680B2828CAC
-014692B1C29BE6D84F5434A3BE10A6774D1493B466F7623C9371420936B397EA
-CCA8221353E6B079468F08130FF0D3619C4CAD9B8F2821986F91511EFECC3B95
-15EFC8A7E9EBC936D3860809CB265367DCE2850A34D673727FFD65D31E2EA8A9
-45E747716B12EB8E7B7859AAACD23E04E9AD85AD1E5E9A8C2EE7D535150A6AB2
-48ECFD5AAF2C9DB97A5E104BCA486DFD432AB386B4B31622161BE0F92983BC15
-50E454658FC2A987E2812B8CA402A618227ADF685169C12A4F0BC371485C6D82
-AFF5509CBA35D2316C6DD808E70FDE08712A1DD141399F925E8447F3EF8FE3DB
-11F0333E5CA2FB92CB762E46A1C27CD7EA355F8F17798AFB0BBDB5417E6D3FC0
-4BA77E9914A8D37EC26D6009FBBE4B080CD7D0B4F35DB32D4B7AD26C0C79B130
-D82A5481D024538265AE6F9F6066C3E4D4A4C45BF168F8D8CAC1C703150524EA
-62CF558AA34B80090CD22FCFCCA620F671F98E61909014DAAB8C93D36463B6A9
-C07B33058454664347DA527C7756EF50FD865F3D64C8AA8BEEF1354099FDCFAF
-3408FE61855CB91FF1C9DC778ED2784B3423B9779308EB908ECEC25D190D5233
-F88C60DA18AFF88C880777D581F369A750C6782001767220A84B0FB874E4FE35
-90063FE863173018BDC7B0E97A1715D74477DF5EE7490202370A838A5F15581E
-C98893DE26F75A2832A97920333F97214284F3291D83D41F2BDA3A74EB4724B7
-E5AE936863AE5758D5B6D4E0CCC9703D045931FED54F2D98B039099510BAB2E8
-804FD603E664663862E0AC4E957C7E65CE9A63E72F635570A068C7B696D800B5
-C245BD650BF0627C063678A88085F961B770E8C201418DCFE03ECB74776406D5
-557C37493855E1774F4C87B9C9ECD38BE306FB64016D1A54A848783821512718
-CA1A0BFD0188997081649F6D21A00F341BB0A843B0B598EEC9B18C7002F76150
-7272B91A10148713B64985FF6A00C75C22C708F2265EB223C200190DAC8457BA
-89C4FB61D095F6C2FAFD3F13780F75822F0E26080BD7CD13B31B8C82A4A007AE
-29D450326D79CC899BF3BA9399AF4012AEB18EFEFCB829B40EB8F2FC97225212
-A7C49B4D9C5E362D2E64A011E9891BB02075321E1315C1FE219E49C2F4D2C8EC
-587BBF73C35D13E91F4BDD3C17AA023E0B862BEE477BBE257910369DAA330AE3
-64B05486B6A13D5C3927EC6A591BA7DBF5CD81840841B453AE1832D0ACB35935
-9DDB4E8E88D45175D4D9A88D0F77065B98FE59244DA1B24A0D2F04FB3D11FE59
-C69BD19C9535A0507DA6FD68BBFD9023144D99A71EDB1D00105CB59BAA1EC8E6
-8E3F4D99723D87831482DBB370FF8E4099D6EF49A562C5151B948E529FA84147
-5B80BBE6F9C4F877BEC307667C6868B0384B98763A849B47C889A62E69E833B6
-04A60319B227A40368B11D3B0E92FFCD15009B654B096D4E09AA0896B70F1677
-EE32339A931B387D6476843D91DA00229282D60F04932A644B22795C7E86AE6D
-EA7DD4AF07E3D8AB4D585C51E8CCAD2DC043AAD95517E97BD18D688A1DB92A8F
-B70CAD704FE4D1CDA3310BC7F3C8245E18094E65C82C9A7277BE922334E410FA
-93D5D6087892FE352F03D536AC06EB9C9637859093538BF0BA676208CADBEACE
-AF9EFD10C49850701AA500F1600C42D1E635479BBDA49C2812357728BB540683
-90DDD54F4193883F2F8DC8849E90F329A9234F79A731263BEDBFB01F996024DD
-A95D5FBDF7A6B4ACA2BC93E3EF299B6010E203B59D24EA8E05DE48906B3E91FD
-7629A1045E32639610ED53D78236842B3B44DDD2F36AC347F0238E27182486AF
-A6618501CE34112F848598A2D28CE97A18407F9C82F2FE39EC4DA96801E1A23C
-F3BFBC09EC9C81086E2A48F388EF5692E9E5D6B5B7440A60D4FAC21316BFB71E
-01DE8CA6AA0496097FEC7809922553E6C7DC24136301CF15AE3A07CEB934CEF3
-61ED9A944BCEEA2205773CA1B5134CAB75E5DFAE05B79DF8DE0A30012B50046E
-ABFD0F4458746F14AF71EF79283E570B4FACD9A6FF5A309CF795520A812233F3
-3F97621D1603BB7878354C04AE66319A6F00F4ACF41FB459E90ECBDBF375DBBE
-B205EC6A89494E4390560C121040E8F4DBF68240E1C77B673269CBF10DBA8E16
-88F18C662CEA332147C7E17F88B126F209D2FC0262D7F1B9C8E42A6D56FBE9F3
-9AC64901CD5DCBC9E120C7FE424C5865768C9CB901EFE55B0EF8C363F0516A05
-EDC6F3195BFAE2338DC6BBFD8AB31FF7D2B63A7EDF197ED12D51B0342AC43791
-AE851C12B9FFCED87A9A0A66490A126293CEBDBB12DF32BB27DE30FD02A961BB
-9DA36A32B0E9E51DCA92EA7C9E09C48707728774542CB0B1DD72601E30DD5A6D
-22F1081F30A8F5F6ADCBAB5071834CAA362B0A586F93A1E2C08B4961094A6060
-0E767F90D241CAA689FCB364048D09C6E61277E23AE3D3907B5DD935DF1CF941
-ADDAE2D173EABC5C1DD7E13DFE00C4DF73E2CE2EF0E1ED9254513D20C87420AA
-690769FCF932DC6075577708714C19769E39B8171A7A771A5619F5CF9CDC8388
-082E54DEA0658E8218B2CEE1F8E39FDBCB057E7A728204F5DFFFA9E7EB0D6F46
-3A6328C32F4DF1BC54BCA3800F83AA77D23F9EA4DC3D78F052EF49C11DC8C3EB
-530C3AC4F2AD8C861C09FA96BF6313C7195F634917D2F4DE84F7193A837F9936
-25DED0C42D12DCFD281AC0DD5879CBCD46D17EB87693B269D8ADBD935F66AF0E
-8C2FC7412D541218A57F6D9D9763B51315EFD5B1BDAB6685D8F3759A98AC801C
-21B89D3575593A0865A4CBB176C9592EFC8FF47BD2DBF34B160EC8FF8842CE94
-F44F9A5DC66152B2980DADFBADFFC915A95F98F9406311732E077E8C0BEEB6DB
-6709009FCF541F514CCA4D0427D633DA65800559760771873DEE72E395128FB2
-53C856D3C48F8D8960F3E6281B2B4172734FECC78F09EC23F34CB920EE884D28
-41963A47BF3544912E0AA19A48799D894CDBEA789C44BC355763C5758F0AD638
-38C6D5492238EA2FBDCB43B1214B4E740296E3AF9789773A918A26E09A6167FF
-8CA0150EDC52D4BF795C8F294A0E2061C6372716FA0311F8A3017570BE24DE6B
-3F59AA1C888C121C4E2DFC2E504B014DCE8D922C7CD1C4DD31A53421883A63C2
-859D73F217F3C2B0EB6881A2B0BA479C5F826BCA1F6FBCFB672FF7CE4557E2E1
-BE07CB81D0D4F772A635905156711F3836A3C5919A833E59502FE32A06650B34
-44042BF4151827589B6093DCFBDBC97626490687FAFC9EE3411B49AE64F650DB
-4E9ABB16A6E3A029BA745BBD0E305EE5F3C7F9D83AAB3EB3F549EC62730EA472
-F7C0CFC92C72FCAA1319C6F43B3E523AA831E4419DA26019B5CDE3D14C264BB3
-55DA4D1C9CB74B073EB2C80843D55378C1AC7ADB2BA6B75F4FA7891B605EEF03
-A3D9DEEBA8F029CFBD4343E57D2FB2EFCFD5B8499275B74E39122F00A0283138
-758A19661381D508C36B49D7E1976BAD40690EE2AD29F49C499B66FED017AC75
-9EF5E0DF28EFC831E454F8D0EE9810EB0991A7083A878EEA81B494437D1680F6
-3344196F46A958340C9771BBFD7E9DBFD8DB8B19E15294311BB67CA78ACB89BE
-112053F96F97685DB0D0DE8D3772D2699CE60E5CEAC18083300AADF886126D0A
-9DD38E90B5A99F2A24EBF47FE8BCEB5E258A4105E7123C4174AABA79C0304B94
-506F89D3C11CE7EA02A7C3D2B32EFC7FC7AD1590B544D8F1F846ED5BC371515D
-82E17D0E200D026E05653C983BAA7C4B2E4D0850E3BC5F5BB62BD07D55510C62
-2CA31539137DFEA988AA24AA2B203F0D2256A8DAB677BC1AE4BBD0432491CF43
-346668E6A6D8258747B27898897B3B1D404B2F2473951AFE38A563754ECF4F27
-D9CDB65D357C5678952420C9EDE68EDDACFD9136E06F3CC2505B3E192F20CFB5
-C6AE456E1E8FA86B9E85A21FDA36B349BB98503DCFAC96873471B2AFC43F4574
-02BDDAEBF5ED48B959860BA93570D6389382A085A2924AFACC2D582A5C1C23F4
-4174EB5265F09C78CEE6858ECD88F35687046A178565A249F85F2F12EDE73467
-38CC89DC5A980864C877B4988C862CF44722E5B9C79C79B2D71548D28D50215C
-4AC9E316968EB5238484DAF7E28B79F72816DE3233BA1F2F01702AD28564EBDB
-FD974DE6E4D29B25E5D6C285257386905BAE46872615256546399CF06B80D0A2
-282D9E10F14F01D977FCE93214725242BD69CB5A7275785410885710D956F242
-A71389EC59A8FA694CC681EDDD984123C10EC191AFBAFD911524352B1E012DEB
-EE56767497213386FE17C0F5CADFCAF35AC917F5423C092EA86214C01CF52DB3
-70DD3EA2ABCA0D2C5160BFD7AD66A24B9725BB07F08DF833B26912731540F34F
-E7B772A43541E28959397CB23136A205FB14B5D98CDC692A17914E322114098D
-B91397B4CB2713BC28A75B846E1CA0FE21F3E936298F63D057BF943E5F6666EC
-B62A6E76C2478C480392BD50CD0CFC312250D8DB942A16DF1AAF6360FFF78687
-3B412DE5CAF16348601775E2A6EABED350E16D810C11C56D1365DA81125AA1E3
-6F0F53162D9D1453F2A9D3869FE5CF687E11B14E7B043F8477DE75406360D233
-A105B72CD6B28B49D84E62F148D59B935D4F80F93006D1D43CA1887146266DD1
-CF8CCAAA1460F59D854762BA4DCD2C72EA3B883355010834C167789742D0C886
-0E40FC7E18490AE6501D75479690D7A67ECC65D749B69021F8E6D86E98D0032C
-FCA0341852E051A31B948411F8E27AB7E23E0D9F6B376273A97554248424C0BC
-4CCEA57AEBB28E61F46FFC12365281A763229B00D86034999AD5ED76E9B7B5F9
-D8EDC6BC419A43C86C2013985EC8CEF1B6F251F6EE1F37E6752B326D01A2F486
-55F4469A4C81594D1133BCE884B1438128BA4592AEC98981ED6DB57046D20AAC
-D9F9FB14FF8E3549FE9A43F3F9B0C5ECDF97626EEE5B7A5053BB1E55E7665B40
-85C2AB287067E09BF68B2A97310D6F018D5EAE8FF29514194380729719001045
-BDC12CF32D5B575F04540A4C428D2567CD66F7DA4FE41993EBF6FB032AFEDFF3
-0CADBC79AC90241C71DBACCC99742BB516849F1C8B3A6C60EDB04D290F4C9F47
-4E3C8B45B18BBA98FCE737D05079940E7681C587175E13D94B676C0F29434DF7
-53D0D9757ED0DA610E69AA32B5977ABEE045EF8ECC9D5F9EE464683ADF39F314
-7837ABD6353BE90831A843AAC6D08DBCBCBFE5615F88774F47632799FCEBE8EE
-91D0CFA0783234042F66CE7A198017A867BBD6EF6B3077106B98A1CDCAAAAF91
-B5431654A8196FE452818DC97E9B64A48A20968E12A8CA92E434EA61838AAA3C
-F0501F1AF7DB5DFBD6A0CF7E1BADA364DFAB8B59E076A66AD0CDB95C13ACE06A
-D7CA855048E2BBAA48228BBB6C437CEB366EA93676F8790FBB883BECB832DFB8
-618120164630AE23C2515B6201CC0A637AB5397D3FD8F575230559F633654BF7
-31E0774D2CDE9457262341BDF81E24F69A72351992807EFD05F5331F648571BE
-824520CE7537ACA3E919694EE5FD274207130E28D716B144060FCADF613B8379
-693F7BCE8433B319406BAA89D577841E55F73F8DDCD9762875C18C2509D826DB
-4ABEB7AECEBA26BF2D06884BDBCD98DCBCCD11047BE8F33A766C5B5C465CA713
-BDC2FEA07B34070354687C2F5F0DA72C50904F37FA17496BA812ED7C556709BA
-FAEE9127BAC4E7425EA5584D317F6D4D6287CBE769C21099D2E3075171158BAA
-348477A37E790BBFCF9D214CB2EAB7167B7B9672D84C984FAE71FB830B914825
-7E789F50FAF9CB889C12B2D7237B8FA90123695F0111C4965802A7FD73809EE0
-E48BD07721C48D81FFA6FC5FD14994772D3A39E6F91EB962B0BB15471395461A
-577684BD8DEC293465B85682221EEEA16A02EB1AC65D43BEA067591E90D49660
-1704167CDB94B046ED3FA8225C15595EE9E3EE4ADF486DA47F269E9415B92403
-49E9CD8929544444B5AFAD300B274FAE8F3F722722BB5EF87E2166F084D0D18F
-E29E46A3635D2A9778382490F636E236D70F32841D846518AC83775AFF5913A5
-164E41DDD413728A2A7F67131167822E255A5BA9905B41D33718D506D4ACD872
-9C96A9EA31D639CA5B627839105D27A3FA0487B0453765C5475F2069CB73998F
-CE3B287C77637CBBBE181F003418488179A198D7DD76FDA0803CB5189ECC87C1
-373266E75972089432DE229A9837C0DB0C4F4A1C0FC242551112811A94227644
-EC271AC874D9AEF2F0A19C3E52507B601BB51CC4B063D7DB56272D4E064FF026
-77DF024B3EC16BCB3C2C573DC4B55D152A0847080520EC9794590776F8D1159F
-CA7D525704CE0773003528B2DA05CE92C37814295742DE3C5B85E72D398FC549
-8C627D97F4B77B17D0A0FA2AEE9B35B4BE1303515C2737EA58EFE3E8C02D9A5E
-B4BE134695380B10F9D29995FE9BA0F1B8D725FF40FB65A1B5E4497F6F7EF1F7
-C215E98F2B230FF2C1E77DEB317F405D76399A87858A4431FED2A7E40B444870
-000A2019680A7B179FC7E336ACB8B8050ADFD9256E501D716A64D40D045AD891
-B9BB7A293C0010A3FA8172743F2D84FD3A7BB02EE6BA019FE522761F5D48B06B
-82AB108F46B361E1215F4146B9499BA9B67F4CB7BE248C0F452366401C4B1EF7
-6A1FCA84C3806D14E98CFBB5B19A9E9C130D20CBAD9EA9D55A8BAD6BD22DC210
-CE6EE0C806A3707CDE7AFB920F87636526309CCD2F7C71E9F41691618503DDAD
-A1AE1FF5800EC16ED9BE08D0CD304939975E8FCD8EB99F8F408C2F9CC6AA0F68
-AECF45C5AF7D99B18BA291EDF4B99E01A7F3FC3271B8B14A6550AA3893C3BD99
-9CB74268CA2076FB23A1C93FF528D2A3E28FBF2B9696622858BB4D6621AD5C74
-83E08BE6C12D20D08105553DC668F32AB7699783EE9C5482F1EAB146CBBF5A4C
-7D5DCB7523479EB24CF2FED6A503570C210FE2BBA4370ED880810D952F4D603C
-7AF879D265332AED31F96792AE469D8B42B83931DBF557150CE66853B6B999A1
-11CD84C513E2A4F94F67FA8F95DFE5746C704E80920BA0521A48DBFDAA615D27
-8DC65DEABF16F1681C2DFEF912222B76D449F9EFE165428267881523733F8DA5
-C34922EAB8ADBB0ABBDAAC668FCCE4157FC5A41E6897EE4D7C8AB47B0D1F8947
-604FF9BB1034E652A091830B21E3955B49F43EB6BCBC35EDF5CD081CC4786F1B
-4FC68F3F95D209CB2B74944CD9FA3F78583063DAEC648AD231BCA52699AB888E
-2EC4B31D79F9016BFADDC53CBDD785E931FECFA07CAE66786F15E95A5E68E0DA
-CB1F7D2B788C9276446AF1353574A1C31BD1B009A9A4FFBCAAC540D5A728D555
-C19D50D543709AE3063F122F39AA2C1217975E12C08DBD572D242B6668089F50
-9303ACD75A32FB183BABEA1B4982B65C3F7AA3880FE5BD719295393EE246209C
-0929F1DC19844EF3556DF49CD11848BE88D84811C6686F56856DB0CCE63FD473
-BB08A721AC03A2275057214675BEDD7DCC0FB1BA4A02E5BCE939392C350DABB4
-4D81DE6629C7713119648A025183CFE5E8BC3FDD518ECE2A3F2BE0314FF8D073
-FED63CB458626ECA9525B2BC255AAB91B9569FCEFADAE921575CF439D4829611
-7E3B020B9223A6C4A622176F1E7C906390D4B436ACCE1B2E8D9C03E31EA0CDF2
-49D6F2B1296716CCECE5CFFEE825B1DBCE083EC16384935A7C1E654B6ED2BC5D
-A8A077DC850551C90C75A044BF66713F21EF2E6B963BDA8581797A833B1EEAC7
-BE663EEBBF0AA5779A508DC2CA40830ED8ABF4A05536B56CFE94FC10B3C0056F
-607C2F3625130E87C03E7201F293E62C69B5FA6E8AD2E870D20DD70CB689DA1F
-A955797C9F6EB85CC96505F409556992CA2A19E9F3835C0C3A77C134C6B716D5
-952AC896207CE3723AF534897740E4696E90C58025E8629895A4ADC0DB1AD6E7
-6A89AF91C2A6E39134434F80D4B50D0FB4BBAF31BCE787D3F42CD0B3C328B6CF
-3EB7D5DE10CE8CAC478E3340C549A20843857B65649F842B0402CB0CF0426600
-6C0C7C280B7B23461F4E555A40FBB0750E077EF744EA3A8814EC08C9FFFC4FD1
-2A840A1C6988BF0652F623732EBAA16537D2D88077B5BA6591844B42374A7506
-73B04434912167E8B2FA443BDD2919521E7CBB51EF56851735AE880DFE196687
-BA36E944F2A33C00168D15D83C51C4E500A1938A427CC97B35BC08A0AFFC0252
-A66E0F11C26F03ED84ACA2AD9EB4F4913D7BF8A548B8D395DBC847CFC3ACF59C
-A856D945FEFFC9E89BA7C441C85B718B58BB70886BD6AB9430D3DB53C985C8D2
-A59CAA7EC7B63976D36DD9719B373AE58F09030DF86791E4B8FCC2807D30307F
-6C83981D93095832EF7B6D7AB9717CD19C1F3929C31356B6CBD7B147464ECBA8
-ECA45DA761FCD20F61E49E496AE4CA1BDB5AC7A5591D0FA9439F19B136D6F9F6
-DA7FA38A69AD6251E5722C47DD6856BF23749DC3F0C339E854B4F84C4301417E
-5D7D4A42BBCA6DB6820B70F0432823B5E3A95AA69365DD34330BA317B27B4E9D
-9303691BDCA22CC1BA832224188F575678D5E7F95B3A090BA8CF1F57DF504C3F
-AE0C8961BF0FAC6CD00E2566DB1D502C8E953FF06049D00AD5C22F695DCEA09E
-37EE1B6F55BC691789350E0EC61F699A6E411AE0096B71AEA9A51137C0B1A0F6
-39D8C4B3C85C034057D56D235D68130FC3AE064B6F54723582F06EF00D110B03
-077E6FA25BB5525D5220DE4F8978D3C5BA050BE03B4A715910352EA58E625E4C
-E435204F0671AA1F2B58A5CE2BF58EEC8CF7297E8288823C64E9918185B87283
-93F8E3DADD1EA48FB267094948CA0448854729152FE6F9B81F9C734960BC02E3
-F4CD9659A1D7F9F4F2BA9CD7809E1233DB4368752122D756C3DA26E391DC4BFE
-4F83FCC871AF08E7CD5ADA72021562B233BF268F6D4B745371D8424019B72A90
-C124F65C29B2C15EE8C0EBA2E70A3DDCD6D9DBE25B3E3B80D3E9FB1D19A182B4
-902AFB63B7D989756462AC1BA9BC6371B5C6E1481E57F797693D19DF869414A9
-D314B0D0842EC99E5D156EFCFD20D07C11B7B5996A4DB5EC85E5830B3655F84A
-FD7DF060593758A6E7FCBBE97AA3AC1BA6C358F26F018E292E50E1DBE44FA436
-617AC91F2341E1E4B92F9F8AA179E6791BEC0C5782E283C73C4E9EFEEE734F24
-0BBB7B5CF26F8C6A61D4CA18F8FE8C39D33527879FE08C5BBE9D87C3A3E84FA4
-F61B6EE1CE3AA0B364656AB14533E527A55D89EA59BABEFE2114204CCDA3D247
-A11562DFDEF7E36B939A9341121F4CB1C61D2586AB147C17DCECF23FA58962E1
-11EFED42C6C90A0FC71F87939659CB868BC64C513BBF688C4802DA63D3AF113E
-6551D91D8A91461888073F8D4213CCAAC483B43B3AD158C537657F1D4D22E9DA
-804369D6308B4AECFC5262B047280C9B40BA4B53FEE769DE9140C5F262521744
-54DEA4B4F639CC891A1576364BE160434B02049C90225454CDFE46FC89CD6F84
-3F7B1E81D38743F469768FD6F17B3BB79764E72BB2BCBD8D9BD966E7ABF7D5A1
-B5816A8DF156E4E9EF48B33C87C03A0F00EE23DEE5D76707C6F123775265ABD3
-D93A901B7407524CC2A850771F4B609B835A62374DDAB77C8EF7B9BEB6867029
-537B4B34FD2354655BF0B16F473130084959670A0311CE512A487EB399253FF9
-03E9024BFDE1099B16943C88627DDC20C7CAD23F5BCB669FD448DC6DB3A6C4EF
-D2AD525FC42261D6B25C5DF42FAC5A9A7C034CA3B44F7A67E3AD200F9A8A4154
-A0D85D385D8F07763AB004C0C71E5394B0B509AA237175F5036C1AE4BDCF35D9
-56F7F958D0A600B28B7DBCF127E09FA3A4278AAF163FD9C8E576ACC5E3282A3F
-2F9167C68744E6D9ED2E5E76A8EDE76E6324A03DDF92E3E329CFC4E2B3C13D56
-77352C9CD47FC2FA1829C03A97ADB39F86ADC3FA6F8F4D171CD2E69D016ADC20
-7F088462E2A724E833B215EC6DCCA694DB9490F00449A11B83BA6DDBF64F6B9E
-4BB753980470E28ECC677DED274DCC0DE847ABED5968EE7E855976820BB417C0
-1072D132D7FB33592CED1661A8D1A476FC179C1636915BE6FCBFAB688EB06742
-424BAE841C7F675E524F376E16FF60489DB9EF1C7D95C50C4BAA18408BE32CB1
-80E85C1BB0F7CCBA1AF6D62EE471EC44EC434C85BCCE76F90C2A9264F9B03983
-CE2BC42A2A22D543398021E7905CE5EFA5E0429B19273C134E0E6629A8616DCE
-24C857E518F95FB64383F4D1339EE65AEF89F9798BE6B5807404B44AF398EAC7
-523815316CCEC391026B9759EF0B1696934C55DBE1992D458927AB4119C939D2
-2C186AD0B2B90951D14EB9333224FF343B0F8DC170562B3EF981442CFB4C71B6
-3041B81491BAA4D0C4BE442586D6BE61C78F64AF199737EE5AEA8CBC6F36919B
-9103A2FA390B8D1955EB6FAC1B7D4FF549AE12562EF99DFE37AC5021250FBD02
-6F2572F2B26D2F29C2660C5F311BA809E8B3094E8EB21476A72BA4FC2A02765C
-98EE0A8AAB56D511B5501F53BAE9EA91EBCE96390CF8C8EE43ACC8704B05540E
-DA577F37810B240AF659A9DCEFDDDA2AED43E7F7059F2767CC9F095DF20E9288
-1BB6488991DB85793C046F4BEAB2AAA7DBA69526E83A1628E09760CFC9068321
-087129C318D6B5A7A10A6D5B465FDF366D8E9C7E418DFF90534393FE1D48ECD3
-8460C02B9A7C98B52B2E9010B06DD9C73ABFB7EB8E74EBA05DF5B4CBF72232A0
-5C8349817CDE593F1856A84B2B7692CE5E831D890C325F96234218B9150C3638
-B5342980C1928BB5635C949B9902475E6CE9C7320EDD66442CEEAFE824146C44
-40F95771F064230C2567C747BAFD5934D9871CCAE206C13F8A5722FF06CF0591
-DA9576A35763476C59F4CFA638A5DBBC21B4C01190A58718FCCA959A501A6C83
-3FECDAA23E59D234C372D07DD420DEF9A0B23B4D0D908B907970D32763864973
-1EBD9CC5A7C53C2098D9A380F1CD63E9AAE74948B209B91F77D1C19DDD26CF4C
-EC61267D2126AEF60A9496E3AA26A1F2A383F2C854D709A60454B193B3149072
-67938C33E570D5149158FFD40D8D0592C934FF2AC5B6E0FD93BCA7BF26DA95E7
-5A381E94CF9C880D4EC4C8915C60B4430469EA3D6706D2D410C10D9E29A3CC0C
-1622FEB7C9F59E949CF40ED21B322985BF448C24D54A7B48A5E10C8CA48F6B18
-A1AD2F09F6788F95D29816A251C19A18953A4EE9ABD49DC93425D90DD80869F6
-858286097FA0CD44AB0B5BDF2A371B02BC8FA4B0A4AC48F111DCE4A32A856EF4
-D10F1B777AE2B9ECF77AA66E3EEB5DC82BA69AB0DB3E536B08E6DD8D32302171
-4F30B69609C9FB9B0F25D26E4E9A8F94785D5D816634697C604E1BAF6C4C67DF
-FF0D2C9847A27440D92328561541169C3AD45ED863C8A094ED14D1BCD713790A
-5E48CB225DC501AD7AFF378CF8E94B3F5A61F52487B5FF4510C1E7525031D39F
-63D9A9F8C81F1A4ECFDB4E3F1942DEBBC6DB124E2B695F6390A2FACEEAEC809B
-80D04EC03B4D3110E93F2A2CE88BE76298F3B2E6CA79FA4240154A41EAF28211
-B79DF626D8A4C541199BB9AC1039802917451967BC159176BB6F1E17A02B9E1E
-9D8D7AF8310F2F7ECBC22DE47F1B9BEEBE383C8B9730CD61D2392496B7239B6E
-3CCE01BAEA37663DDD4EFE1A6FC6D2F053F74FC1FC28D3E8DF2C3929F64DD2F0
-6570C474B0B4BD74CF4AF6B72E5D5B7A079E6B592BEDB76BD3C0584C2ABC4E2B
-0ACEFE33940EF69AA41C721F401460581EC1E4A61F665786B6674D2F0044BDD1
-2E2B115EC28A997E0B4DA476C09617B1CEE6A2283FB5064248D096EA5B0FBACA
-FB41C2781E2CADA452F82097ED5D12AE2A9DD94CC49E90B12731085364EB162A
-E404983B1028EE4FDC7EFEE7A430C715192E6A9FCD67BA58D77B3EC7179418E2
-9F44BD60D81ECD7805566919AC8A1F7EBE5CB882771808F32EDDED24DDF21A93
-EA0A872F229895B9912E65FCCCB6137BCE3E0980FA96AAE4F8040A233C5CF826
-97ED79A163839CE10B23AF1C6C48C37A7BD711DBF61F6CC713E37757D3B63955
-515B692289C3D22EB2D5048BAFF9E63865CC3C4EA26F356A448E4A6D93F153B4
-40DE89E06B98191899E1F9BDC0FFE92AC098637AA564E954937CA4758E3D13E7
-A790C92FC5064818CF1B96F9C6680708E10853F50E012F75A2136874340164F2
-800A9A0F7F7377FCA81760F626DB49D6A9285747A9867F423BF079DCCD22B46B
-D730DAE458E3DAEBED7A85EE3899B9D55965464F45FC4D2D99F766C95B9F6980
-307CF7E29C6465DBC4E2ED023334831BBAA961E4493D917DDEB50D0B69B1A615
-AC19FE6143F7294CBCD9B2280B3DD739D9EC30822183F644FB1F53CAFDF3BDC3
-56135C7C5A5365B3B767E6F77FE7BB353BB137B41B3F3258CF9869FBB302377A
-B2890B01E41C9197EFCE051C394F2206238886D69714E96FF6308772F7668176
-33A22E84871EF6B37F45ACDB7B19201C2BF5E3C83F74A58D319A9EB523F86F89
-C4ABF2C955D99B3C2F14A84E1A9D170FDC1F324C8B2F3DDB868D47612FE0CF75
-0279425A46062CFE4AA23FAE2A4EAA427191F42176DE3FA5A60A1C3E50723519
-FEAC2098A2955F13DC65B855B65D0879258D9BE45661FC2D1388D6670D5BAD5D
-48B8BBE379B90FB24A664A29C66A20BB26C4FA710956765D637B7CAB2F57D4C8
-D1CCBB2C48AC19E1C36E8B5DF12F94766805D0D8886515DA29354B5F4394384D
-6D59948D2B028619D130AB81BB38EC2FC7713D4D4F6B29C4B138467F8ED7DE28
-DF41B3746C00266C4DE9AAC4E71CDF8272152DF2310F80BC959107CF21814A73
-6EBB99F07B92CFD4E167F53562B04065401155ADC4BE985FB3F2595E835260CA
-797059CBAE17FC381AB62786EA902B5D0AAD92602AF851635A6C61B1D9EA8140
-A93E8BF8E24A688A23B4C1EADFF3CE00109D86DFA84005DB0B4E6B9EC75DFC89
-10E92A9AAFEF65F2ADFE1F47E8AF72E97CDB1AE17C4EBF861A7706A3754A6303
-308192CD292B1B1BCD12D1F69CD6F609480CAEF16A569CC2354D7B725C81F7AC
-427AAF42F2CCD1DC6031C0699C60AA4B0CFF2E6257E0FD316A90B9C034B9969E
-D1D25EB23C33FC9A083A84E3AF380B6EFA30D5B825A6FE68556F6C517BF5706E
-4E3B070D5D8F5DC452608180B6A3A7AD6A009CFC3AA5F2A6DC9BD12785B655F1
-DD5D1D6A3F0544D6EC661B9C1BF7B2D2585C0E74BABAE07E453796044F1B2768
-B08111D0FB75F0CF90C8E3B52665D07D79F99EF0435F805A95EE4ED0D9E88DCC
-8D256D7A67A96EF18CB707AB91902DAD348CD514772E0A649B66287D1BF8DDD7
-E1CC998D0B26311CF5F23BE0DE0A7CA089E0259EB4399FFDC4379157BDFD7655
-FC5C2FF95DC94F2FF04C1E465BCBBFB8E3BFE024862D85124974BC6FA083C3FA
-6DF2F92D3978A998904B0A16EE9FDF840195F817D6D40A630463D73F544CA551
-15F8784F4E52B0CC03528CA24467E1C3D6E1CA868AD2EC482C85CA111F814D75
-FC2E92124E29406E92DE5205CF02BE28F64902BDBB7AC3D3763FE78159B4F143
-7AEE808329D91B034CD438823E7736AF4135C5B6A38769FD9DA821E328018655
-DF6412118D8832ABBCBA583A55A66C758A908C2F195092D87B6887E9A5E036C9
-CB4BAEB7EBC74466E5410DD289DFF8DDD5C4ED6D478FC4715E8823264E9F861D
-9A9C9B99514565CA025360188AEAFD7A42FD1F319C46502AB8D81DEA78A95D05
-457E477EAA201F67BC40979F9B86E086C7807DFBFA7E4A2CC0F90D87B2A3EC2B
-753BF0346EF5C28AD1F96E4F5125BE9512886E70A232B8AB45B7D2B8FA190D72
-86A5A4ED1E542D23344CDEE87EB7FDE9B3957929AE3B4ED9E7A407530ED99A1C
-F948E2689B7FF456E82D8CBEEA5FA4D4EDF577D37188FE7B22523F5E7DE71480
-46506645ECF7C46862F4ADDAC3D3F0D8B6D6C962236F83DE4F930FB8B23A0B02
-978C3B9DF395C0DDAAC6417E96A3488833CB7E6FF68F0B67C1702EA81BC3D6AC
-E883CA0953D4FF48CFC6966AEFD6821E5FC91874CC51BD4B98233BD2164AC5E7
-802DCFC0CCA34E4511C4E68D89E711C0CCAF195E9A0E93217C5AAB30BAA40543
-BAE734612E4B74CD1D6D6DC9C794604C3CC678E04F8252678E18E61B292C3C7D
-D02AE8A6E2F0C7939FDBE188151F8F41E58435168E28CB4A3F33CB49F294244B
-69C4B5347D7443959F7267F45894165E735D00CDDB1C34980A9922E097795AC3
-1A3F5E45C609F32308310931BA9C18ACD083F8A63723F7E54D018DFB08BAF692
-4F258DFD971BACE3A13A863A9C951826499A814D984AA870A8FC75162E4C860F
-7B4E459069DB0E5F331EEF074B3481FC2EEBAB1103B075CAD3200E94D080F3CA
-66C9703764BBD33D05558BA4693AD855F67451118798CF236BA060F7539F4FFC
-F3B1E8396EC34AE1D06D51FB678E2FFE110223FF341DA23CE45E58097E4E7F6A
-99616B1A3AB563B342C5FD9DD9B1DB3B9544D0ABD8771AE0A858B8F827B5E27F
-3ADC25B822A6190EDD69346EC9D6460C0BA25D52B906F6E37CF8AE26958653D9
-96E6F4918FEB6DAFC3940E40F692836B8C46169D978D3B6361F720AA33723C22
-B7A4C1BCE4292F85BD581F443813DF12A02C5B460522DB1E7D2D61C79A4064DA
-10BF9B9DF9B347381DA932CBD3B152FEC7F3A0F7AB80593232F091CEE23A98B3
-7AE07929FB8D6015A6CD4B61EC26384966FFCD23034CD6820D426ACE6BDC79AC
-9C17E5E482D61D203126D5E628027130684D2F26C4986904482D6C1589E1C704
-E42947DA81A5B507C31ABAE6AAB31F5AF65E736BF281EAC3D9E6194342B0AFA6
-186D427BEA12D9AAE1FF0D34D52353030C5E670115A719FE28F830562887FD41
-0A5A3336A51F0D752382B07125BBAB85CF54822B0BE9D926A0DA846DD11CA7D7
-94589C19A6B07D977FCCC211BD35DFC09A4BDF028143FD057C3DCD6F6BC34B28
-99A1B03C506CBDDB4D8345B3FA949B8566F9DAA7F958A7B05744C2D8EB7E980B
-6A6A7E92C536995B673E2385F654CDD0A80F1317573730364ABC9463B77E3224
-68E4AAA461806CCE47861E9232A95B6A326B32C429D817AD5A3FDC7B2F5D472C
-E8DE7DD2DDE194FBE7859302BC76030576919474A610E545B2E89BFC30416298
-014EBE7808197B3021E6C000A12647EA7E90A7D835C1D1F815E175B944302A3E
-014B001CB71EAFD0363E6142082DC0A00B0DC19E740F33EA62BE1F8450AE3C9C
-1B184D3C3CE5839A0AF3229D81DADB6D93AC7E7BA27CC3B768A430185172BB97
-EDC7C3EB4B7611858F7658F604C6E411CF05662702124E6DC1A333771B319FAC
-9553FCAEED75C50A05E7BAD92538EBFE401FAC35F5CF8982CDED508DAB81CBB5
-2558C3BF59FCAF06D266BCE6B647BAAD2B0A2A2266FB6A97782BD461EAD173CF
-884F1370C9AE823C85F5C392EE21A7217E603FF66A87BE77004C67E600AF8BFD
-E68BA369C571B42C86C51D15350B9B6ABA774E10FAC7DB98893B62DBD832063C
-93CAD111B5177CE7520F95179DB50F512AAB94E321684F9EA35DCE472E607451
-A8DA404B573B4C11CE658C9E7D1A3AC07F0BF8087A36859762904A1803277B45
-20840FB55C7F523246599E4930DECDDDF53961999A25D2A78F3C26E328A8F446
-C415A92A14A46397CC5E1099EBBDE57A5556887137305EE31399E8E928C7FF3F
-D24B02233C82EA0F0B52F1B1EA91543BD00C69498E2288CB6CD5E8F4ECC2E314
-D463C085482F6C8F8E601A06F069FBE4FE891E29B73A333A4E48F0A384A59C2D
-A01D470DE89DDE5620D6D20F94437CF558D96123D8D451F609CB7023C246A63A
-145C16F1812AB2F82F7395A8F966CF3706B9ABF9D5FF13897930E4D7D697CBC5
-77D3D89709B89D5D83814E26619972C241A654B145A9B63E20A7D7394EEDC424
-3A0625F0515C60D54CE2A5B4D0506B130218A9C83C1824576C537A64A9922DF7
-934A40DB1783C98D9FD20E673CAFF7B532647689F1F2A5AA1C28E2005C1B9A82
-1B4A56D2F77C8B71D9945FF9898B85A0AD49C8079EC601FAB664DAACDD78E63B
-BAA581FCC59C0B23D601216EE8AA69B63738FB5D3A461DBBD635FB18A4CF5167
-45F612C2498B80CE2F8E3BE11BB0F57CB712C4C0570B54FDCAC81640E6ADA1F7
-0835A1B7E8EB31E9DE3C11E0B1AE5CBDEA7645E764A767421B6682839BA8484D
-5130B2F6EE7B997926B1B2600781EE5FEC641DE4F3FD213843FDF14A781D3643
-A267B7ABB5527AC813C367D58DA95380FC828D517AC437603F87EBFA64EA5E08
-3DDCC06BED850CC08EB8C61363F03414F9A23E99BC005124B5C348F422A67BCB
-DC6A5D865B2225D085B249B7A483153FAB21F5043FE55024BB5027BADFD52A69
-46BA5647A04940348317990FDC91DB0C1E493E83972F1CD01150E8A2705604C3
-B85B501748327D9FD8D8EB4A878FFD72A0E8ACD033E03C1DFB35B8B1098BD2A6
-E297AA8E65E765A9D92F7F0E46E567B2F0179EEDA2F674EEF2ED7EEDFFD9B922
-29F72D9DA808D81C312E823E83D506F50650F7BA2F94B94C40D58A00BC11FD44
-880CF8918F7C4C3D6949A7CFC770ED162941980EFB918215F6CC80A7941FC467
-FA3D65538B1DF061BB3B5238126E01F319D3937A3241F02D0985326FD56D783B
-24123E58FFFF3CDCC50E096A71A944C9E471BAC8F2DE41F430B319DD1F7F3ACA
-400DC2C0CF75CD1258E3EB945E42D9870E774D65DC1CB182E9B7D0FAAEAF8668
-84C1077A71E5C95228915EE533BA686504329DE2480D36A0B13501944F900D98
-230D0D0EB3591C23204D9C108C56EE2920D21F4871E5A8824615E3001300C447
-44AF734326CB7C742222FD862729938451DB670697B79CD8AF1B00D9ED7D0002
-3877A35CF39C89B4EDB3BD0BE7D12C0759E8D6A35A241473CA9C9D9F74EDE95C
-8D633B7DB65772E00D194276307C10ABF809750D2A8DD375675645E17A36AD91
-1F85F811EF4D5970C2A11397434642D495F67ACDB0B6CCEFDC74ACDD0A59AFDA
-9BF9194542EA54C24C9F622525E6D2B8EEBCB8F946EC7906E6163517B957F4E0
-C0C50C8E2989764DF98287DDDF2F211F546387494A2A44C68505D7CEC67E5390
-CCE4D3D6CF672FFA80B2DF81766D1F94747824D7AABAB17667485D17F7EC5A61
-77F04289FDE1CFD903083F5CBBF0869F6E5414C4E20D63B967165C9D7248BC27
-82084BA13896A667728B5C71FCAEA6416951EC753717891D9F90674733A05D50
-D5CEFFAE43BB11B72B8F16C855BA5F0D26BBCFCB694C667E507FF94133927748
-5681BB4DACD9BA08AE6630E7A742D3AF1D1DB04A6C13DEA51063F3437A6E36C6
-00D592F06EFCC6C485758AB22A957C6C2EF0BE8FB16621F54EF9BE7150D45397
-9ACEE4DFDA63D14B71B1ACD42D67B9D862F4464F204A25F337736547C0F3E697
-EEA0459991E492FC28B75B25CD8F0A188BDFDA900480BDFE67F172F61A015292
-405A576326E63C87BD7140E76601956826516AE66730E6D57F5FD43C964055B8
-6BB09EB0DFC93F5B78A15BE0B7C4533518847AFFF483F428F7675E7234A0F66E
-D9DC5426BD143982599EC2EC9AD374822E428078E8580837BCED097844C979C5
-9F07E4D5F902944EE1F0A8D339EE814745B4A520794D7F4DD9311AD372559AF2
-D1196F10BF336731499FD3DBA03EF6E49AA0AFE6C99F5DC9C99C8E85B1A972B6
-390176C6B6EDA3DCF0A3334B1971214483D1082789BACA1892A3BD971AC9ADD6
-8817F031AC322E16029C689971D06FF45284C0A6900FF5769B5991F290B2D32D
-1C7156FC9401A11290EF37C41B82B902221724AE447DFBB10F85EBDEE66110BD
-CEA3DF2351DCA1E65C972C81F2B89D6CAD1FB987C29F02970E41F6F2F317DF6E
-CAFD9E7F02D48B5AF58307320C0F95B28A8295C2BC29B689EEFDA81F1FBD52EE
-38057FDEF58BE337072D0462A4AE03F0780EC62F6D8AB4A242EC1534FD9C51CD
-70C3F94B538B4D9AEF1BD8F7427E647B2B8C5E19ECA1D565761531B52935B095
-A31B00B40D07D4E6963399EB3291F47F63C45C5E5E29518D9759E31FCD861518
-DF0A34C519A18B9475309AE617C8A456A4D6CF01D8D4E6482FF509A5CDDE8BF4
-C2FDC963AFF50E8F81E1F644D11F53051AD7303D15E633A5180114F5704539CF
-B8B50E017763CE474CDC35834E5AAD07A931A099948A6C848030ACE5837926D9
-7FD9FAFB25A099832D91047E0BC5C37BDEAE93BA64ABEFC831CB67AD8EC8A1C2
-DCFF7E1C18FC9A6EDF35F7B9642223D82A657245D3204DC8733176E4CD8B28EA
-BADB93906825BEF461B8A29EE8F32CB65D18CBAF517BF1E766BAE940F81197D2
-95A97CDEF6439C18716A8DF5DB91EACE95F2CEC2800D9EE93AAA4F12C642D0F5
-78618A3EAABD4A9DBF0295F5F61D1E0A5DC4FCB513BE81DBE23B733994AE4358
-91668A7683C8AA5E74253CB614CB72A002551865155C3B22CC20BBC234977D3B
-2264187531CB2AB2AE77044D7669139CC1F1E0258A355F8D7E45DB084F43E5BC
-BE11D376F1B040A9F2140904D15AEEA4C65E463AC396DC2F8CF642803FD2CA08
-6106863AD763A5762B413C6098EE985699526C2F10B73D5CF5A5C8FCFB00A75D
-8EE04EAAE2B1A1376AC4659C75DB630BC9D8A89EAC3A41DC65486EE0CBEBA09E
-E5127EBA7F22FB56E11DE85EA3FCC5EF86C61D035D55F8A211294B66ABDA4735
-370C8909D3AD3FB83EEDA6DDAC31C7211F55DDECCE2A76D518EA3EF7C18F1D74
-E551CC3B9718C023C4399B694CE556071D4EEB4332499744308695D7FCF4007C
-6C001EAD49D7726AE17109A8016038E923132F80C75F2B3C850658C69309E653
-F5E803F0F524AF61E8F70E875E79F32A22EF77670993C12431FF2740DA947B41
-6AE7C9D90C7712BE19666080CF3DEC4079B0C05435B1871ECF35ACFE8007113A
-BF7C8518CE4A114BC62126EA623E5138FDE2B573B58F30757BCF3B010BAF8A67
-4DACBD96367DEEDFC21731BBE6A28E4EEA2A625AA682979B88D37528DD8D6E64
-56A2530BBA7700DEB84AB34C29A8402F9FB72E4A2F0AF1FDBDAD266E799455D2
-B5D4D3AA9B95BF26D6B2393B876ECEC41011C4636D4F1FD195E95764D627690B
-A5236BA4154CADD7F34393FC514B1D46CC5EC334E0CCD0CE153F370CCAD25DC9
-F432BBB12D3101EF5B8131F8BBDEF9306FB49444CE206C0D487576DAA936A65A
-4AC472BFD5AE7D4F0DB1DC8BC7AEA924A8ECA1361C26DED2339B427FC6C52A7E
-6FB778423F3494CB50E41BF7DB32C1A0DE1621C04A609CE77F62FFB50180E3E6
-ECD85E92CB4D1CE6F5ED9AA0D0A0C3585968559547606EF6966CCBF98E3AF59E
-FC505D0FCBA8A575AB0BEBDCDB3053FDBDD987DEB7F5D6D3AF920FC6B27CE0EC
-3EFBEF16A5D809F604767C0C07D17F14636ABE98EA17DAE9C9835B780C78583B
-FAC4E38B6BB37E203EB776BBADCB416A56D7762B88F78D5DC9BD94044234C492
-10534455972606A286EF42BBD52005BAB1F5985E653A4C1EA3A22E72CD2B2B39
-D42689D41F5F56304423C3E346D82F39EB4AF398A003FFC0EE4CE90D801C5CF2
-85D7F4A894B2D42A2DEABE0A19749EBFDB6D2548AFB150735F33FF200335B427
-ECDAE0800F8549EBD4B6ADA45A4969A58617617F595E10FFEB0FBEF422767A93
-E95CC12E99261389A80BC08965F9315B286EAEC4E543DB7143353332A8124B11
-B0E1A81939228883986EB56A641FCEED024A10C67BB874A379D3AA3988F8926B
-A351FFCD2E957A06E74C79E17378CE552CD09483FC8945BBB64D67F8CF39E986
-2D1A5B12F15CA11F9DA9DCEB4966C178AB5B1943E9161DD105E62D41D14F1AEA
-EB4999D98815FD9D21013B2689919AD238A66B0B12B4C6F5BB424E44A771484D
-E67B57326A207217D6D141E267607D4C66604192A2B0ED182413F04C37F380DD
-7550442AE3E0F86563AC34FC580CBAF52D4DE3530FE96B2E2869A2784526CBA2
-279C138C1EC9F3016955D5E0FC2DA6ED47D61F837FC2F50A9EE782541C836539
-1DB89268F6A80455724585AFF4C8617B20EBF9B9664712F5F7235A497AC3AB3C
-6917218B2D18E57472F48CCB599C3B4F2892B8157FD93A4B9BD5A719888ABEA4
-914DF3E56D33582504876DB0062FAB1CCA694B9D64A49AFE1EA99A149B6E6932
-5AC364E9095FAE0244E648FAA9A9E1CAA5E94B085671A1C012E267B490B5D2B7
-52379A959E35337FA0C20F589C89C859D37F5502BFA3AE84BB9D81C56E8B6F0E
-76908CD8958E3A1CBBA061DD0CCC833BE7C851A09B341ABE106C619714EF14B6
-DEA21DA0F2822D37E783A765F5BDBFCE8FB5BC8F75C56E3FC04AE8FE03F600CE
-10DA2C120C1AA9C79DC8D987A87D1B1F7124AD44A44EDB67E785DC2A4FD7B5AB
-E6BE85122340D062568D207A8729DA26B92DC7029117D29FF071D8F689F65D62
-7469AD8DD1F5E3CF1EFD2E0157EBA8F41ADC76644E48AC74E202D10DFCA98479
-49BBF66CB748C56FE70202C02B5ECBB1080D6834B8CFC8A8488BE8A502F0C0A3
-DC346A1EC38B172277B244DF4EEC610E50E1FD9C6A45F5099BE894D060160A5E
-7481F3AF11BE4A71C49C4E089A12FBBEE7297360CAE36E35E6CDF16D9CAF3A24
-E680AC8CE756D3C945BBDB2139063062C9C4215EFCF77F2E7B2565F0A0ADEDD1
-F8FD0C4D7A4C64704B568B3BB66721D105D3D8A8D814CFFB5844DF2B3DEFEB44
-D3CDDAE7642EE75B59D780D7490EDA093D13833FF102AF7A186EF8F2A8770FD5
-69F98F812B29024DD4BB8F5FD49E0927E8202BACD9F773A1D4EC9E4A2085624D
-A7566081270F322B2642CC758E2B5CAF0432E78E331FA5BF0E025B953CC08833
-7E80E535DC3EA12F6D8B0E73E354E3B358633139D5BC3B37102271A2AEF65D8C
-DD0100DE27C285D228A4391EBE70428C4974E3BF16237C503BF9F17CAE80B5DE
-66630F26D6082728D84EB505452ACE002D3D96A3CE36F0B7DB93B6AE1CDF773F
-8EF4EAAAD384E7D28A0C499CC38903F7EE1889AEDFDDB6FF180C2776BA7DBC33
-975B0BEDEE2B02A6E34EF65AF208212A1BC47794823FBCEAB57E1DE0D5B4D132
-D31404C7E4E7B7E8AE1B8A90B078C6565143EDF7C86EA974EB2D84154C293EB1
-7338C5BD8F021D40D29F646CF31DD9AA14BD090680AAC8AE481099F316EC4749
-BCF5BC65E7F9A4F856CAF3E5D3CD9B06CB7B64DFB5C439CD92E4E1D63D829701
-2CED8107B4FB6A80E8DEBED078B3540BB5E055250FA529530B0B035D749AAB59
-B2205E1E405363DA6C0B16BE5D41F5FE3B16289D983B44BC6D3F589C4477F592
-3CD817EBCEAEBBFE6CC9CF1C0C94CA39E7EE2029007893C40CBF694AA88BDCBF
-A0499F2A22760B4FF01EA292F9F2BF0060FB72421B5C4F92D132BF2FEFCD5323
-435ADF9299EB3606BBC7F1DCA88068E9A8296C020278C65CCDB5FB0D41433326
-D85B0590D0B4594B3B6897F8F51E56F8882FB8F37DF7BCBD41509233297A11CE
-368FD4911BE32552CC2FECC9A98AFAB72B9CF21062B5B56F37E35457E6E27EE6
-9EA25C8B8933E38293FE178BD91D18DE69966E068DFB263CC22392F61D765538
-DA54523707A62EF8DBC323983FE398F8DAF8FD95F26F4032AB1A6E3EC76AFB2E
-1279A60B8AEFEF52DFDC605DA9CE091F24491B7BE41177E2872A851B4DD614D9
-5EFD53076DFC5756509CACA9E69EB0380634E586E9F06B786609B625022AB77D
-97922B1F2DAB9DD033BE2E11443F24F0FB85EE66A1985DCFF9D8AA93A11D0AF3
-9BF24E33FBCAF72BC85E6B3355F130672F0630B8A1D258718EFE45A51A522F66
-DF6D779B654150041D8F557A9565C39FAF1EB01153A8ABC4D05524A4FD160551
-2E09A4B4E1B446F5C944FFD0B770F7DC166C85886D301AC3483BC21496B09642
-A11915728923B01957241F7FBAB8238E79BA49B49AE2154F71165EC8EEB62298
-578BCD5050EB474A56839BE37A67174549EBC4DA422B4360D50797BEDB115C85
-3C3526FD46B7D1105428B68AC52680A53320AF24AA12D793D1F14E2560635501
-85248DB2F251DD3423D6C6722A1F354FFFDEB5006B599D47C7CFA26CF96FB4B6
-8057F2B1FB82E5119BFEF70384997A19DC261F62CEA0364D93BEF6DBDF85C5C7
-8C515EB0850D909744DE8720060FAFEC8F4035C3CF065BEE291599C5B82410C4
-ECDCA99D957871B1485E028BD5D837EDAE9EE2615F29047407DEAE94C05B3B4B
-37EB9B774415CF8E6D759908FC40CED03761329355416C055C21A529F0E89700
-ED9136B16D9971CF1A0299D3703BDE044A8FAB6FA4CA7D6B26F379211AD70C47
-A8280E919091DDE0F9F2C9D4303CCAA9DEC9E6A41799951C6AF62F0DAC1123CA
-2E3FD3046438002673938F576A96B2BED3E5B2FD39A969B638C1FC2BED379380
-6B86F68A2B2405A010F02B796F60D10AA97A835C6733C6E969CACDE2194680B8
-D76B78275EA088E01E67DFF1BD081E5F9E7C3DE17AAE4CDFB4E4FF98A22299B8
-BC3DA60C4C02DDE93EE6821A8DB3DD1B17022589A333B7323509CC2AF888BF6D
-EF902CCE0D33FEE46BD8A476D27C3DEA65F6FC9799B40391544B8A42AD5591F1
-3E8D87E933AFDFBCC0DB880385A86AFA73365F6DCA9A1A8836579FCAFA0ED18B
-7F2A42FFEDFD233767B7247455E6D0CFFE193B5B6FD6EE0273A32DA45DAE7189
-96A2FBBF5049380345BE379B84997C0C7B72E34791FD65E38A44CE1CCFC98ED6
-D1DF926C4455FE7FCB544D687B70CF416A547D94A84C9DF64A61034E43106093
-23A4FB1754E274581CB7D01871A8E00AF352FAA6C1B24FD27343157B5B2709EC
-625D8F85192393C682B739EBF65FA47BC8FA5DAB1828F4B0F7699C1EAEC74E55
-2645C3E7FF03710D24901FFAAD7BB14A12003ED61FBE2EF0EABDE9B02FB9FE16
-E0638DF3ED8DB8A0DF8EE978368913D3011BBFCB8DF718FBB78BE8C0443EE4D9
-774F5269CFEF93D57667F09BC73FC37DAB996CAB3CEB19BE1966BF7735F5D8AB
-6404B66C3760BB3AD191DCB23AC2ABD884D833DAAC88DAE232218AEB006B40F9
-9C0BE61B420B0EF3111AD76CD972EF61CA05F32C450D30AF955EDC63A3D70EBC
-D76C66F83B7E61A149FAC77884C78494D576043E0C44D5161E29D8F482484494
-395202D50B9776B54A9944F80AAAA81E6E3FC8D6FF478923E4975C8B591C9A0E
-094F422FF675A1C04E736A827A6B42C8C91AE861B46F490A77118ACD7496C339
-1A2E16CA94E34E2C61245E5D54DDB5A8AFA3B0A0C04F462057BD72FBF9CC85BF
-98808D73A036C2EA1DC6DFB3C98239921F322C3C3BB4B05952D9F055466EC977
-648752A0E9F8C126BDCFE2DDCE5A85A5B57685F3F534A6460F8273F385BA690B
-FB3EC6F19B4DAE1DDF8E3CED5788350CBBD3832EE84588184C88426D82687614
-42B99AC324BB7D51D716B0771281A3D209AAE3AEB76DCE73093375D4E9740244
-87C7117DF8EA6CC7B99898363B1B407C0B5CC18C597832F1557E154C7D4931BA
-79BBBAA593F473218AB0D1798964605C02A2A60682289BA88115781A36E05AFB
-213DBA60AD771F9D9C332EE58CE4104B4E3213D6C5571D09F4EBA3D85926989D
-A8E96D143CA0364C780556E59E39914E4AFC988A7BC7B1EB352D02F753829F5A
-C6EFF13BAAA37AB5A8B62510D0DD373F5C0DA7DCCFEEE724F0D7862BB73092D4
-55C7E0FA43FBA607E4EDE16CE1F875571DB09956D6FD53FDD0AE47A91BDDDF60
-4CA2129A9EA729D41264A039D4B841E207BA5A2E8B81F5E866F7944E2E432C93
-BEF83BEA1276266B1D37C2345FA232203536A880BBDAF573B7CE9855AB7A2574
-0D58567235EDC86C82D073B8AB94BDDF7B8FFA4821791D5E68CC0AF581773F02
-4D27367C2F3CE426E28C2FE6C238BEF5F4277111F624F1FB2C0332D464293AF5
-81765D8A0DC5B50915DB1155A0453F1FEC0D432FC5868F5851B888E4F1B7FB08
-9D12B61C3EB0C8FD63D92725F2D16604E12E3ABBCEEADEEAFE7368EC205B4861
-3896CB2A9CC7CD3F8D345BBE5A0B2A96ADC7D66A8A241A652A247F555BAB37C9
-98CC5C16F7E6C59373C15C4197A03A43609D1DC9E210629140F440FBC85C4E6D
-F120EB3E2397A760A08C8825E53A5D5031C3E200CDDE60A29992A76E3D70115B
-809445837F16E1F30BBEF48DDAB6900107E371318BC7A96AF47621872ADFE5B6
-01D78A37DD12EEA29FCFD3E9E1DDF86379280062D1D3A542A3210A79618702D0
-5D8A2707395A5D78C698C7FAFB0D1345D977278210E75FA8A9D611242A07CE8C
-7F68E96AF1EB5A0A9EA7A73E044638639BD0B1E0F4F2FB669DBF6F0CE59747F4
-CF7DB5F4BF5423900AC729782077F36373EA1815BFAC07B281B4D4460F583887
-5FC0F99FE28826783D5A1080F5C8269A54A9C15D787ADDD9BFA8CA0EE94E292F
-4F4DC1320F29C6EE65A2D222C56F468D80F96153D2B57D83FDFA444D34076F2D
-6EE3FC065A7428452AF36B19A56DE3ADC2936E1B6F6DAEE66D6B577F1A4B32F7
-4BBA61620953F8457F7AF03011B76AE28940FF69B61DD4BEEA2A98999D335595
-193A8189E521588AD09C7866E86B52AAA822F1C58CCD30A67F2CBECEA8126582
-066967E4DEFED674CF19BCB9C1D72DE685D8618368A1BCB59FF49721A55275F9
-F1F8A6D5C58C232708E56C8040AAD633347378E7F60E30AEEB95D9925EF69524
-AC0348583C29402388491A01138274792A1C728F6ED2ED23491180AD718A2B43
-7F7691C09E7008ED1E8A49229F41AA10719339CA4EFA44FA24C6D1393ECF41EA
-7A1CB96A8F4EF84305C9999BDFE0684EEBBB3B3A4A9498D89F3CD588D31FC00C
-6AEFB7EB9650C2BE752B819D2B68CE36D79F538FF203748B6C491C51610F04F7
-43BDD86DB26A2B905FB8E0601EEA9F7CA1E2B26B005AA8FF0D451D4F45C3E6C8
-22B79AA3FDE7E7D95B91834C3D01E94356BAA6164229AE7A3F82455D457F2EB1
-DBA0D7FB8F79EC435B59F25EF6F9337C635655EA13A8A04F5073C3B6353A0004
-D9D85D824BE17A94612A3559685A42224CA59A9F55058BBEFDBBDA5CA519451E
-DA0077345ADA9205320586AD3B5568DAB951D8C2F998B0BD8C1C01D3270AD982
-2D391EA3C8618293FBC09582F21658C8EE2FDCB9EC7FF8504ABB9D5803483DA8
-A31D985490FC989E75288C5E8EB1A3CFEE35777B2C64918AD3EE6D2FE5F13B50
-9FACA93C0645CD9BE90BD7E48CFE25AD2C6DA42234D7D2E9DA83A0A0271D2110
-00B0A9E149392AE7072ED5D31B088F7C1E4447D3E5423C29B5546A26B0D4C1BA
-7B8CBB26BEEB492F6EDA6B03429598B28FCF3F27AFCE1DAF8E7CBAA229CD836B
-DF8BB45825DA2858BF9DBC9BCB30CF660C7FD418EB3D7ACA2BF3A38D304A38F2
-127937A9296041925BD54796FB2BB1B01F0E3C7C4E7304C87C0CBAAE4CB713D3
-69A10398CDF5C40E43B301BE17F0094EFF2BB3527F44C1F0ADE74549FE2B290B
-E84B679A4B2D5FA09ADBA16C14EAFAFFECDBBF13E9C395AD367EAC66697AA240
-DBCA20F6F84CECFE2742FA6BA9E9597B65ADBE892B4747F4C0C59890DE22391D
-469AB1F8DB6B962DCB4F3AE6A8F7BE07DC903D0D6C1C00B1A06B51B12A418720
-8B03C294EB1336319BD0960040AC293459EB6EE4562BA6ADEFE9838BA89305A0
-20E11073F479853A856B3F994F717457416EADE555F569D7F9024CA0D2486BFD
-BAF47F3F006B149DFB328E836C3AB71210E42A1269A7588CA3BA2FC80FA64B42
-91B01A1D58CFB9A2125B161988E7DAA519907C73843EC08FFC502022034ED1D1
-3A27F57F94FC6E57F7B24348D66D198C48114E4E936EE6D2456C5D61FD509182
-A18BADCF9F6014823E6915885273D91C173CB58C1962F640668A86EE2454E318
-F5CCA728BA2035EA749CC674E832B90EE789BC9BD0D93959B901C006D4A57642
-36ED92B5AE29D8BF29BC8ED3011D4E2E1A180CDAACD9679D95F3685CC3FB907E
-53B1FB857EAEAEAE33E5B87F1B53D7432258055FE02EF80351F8651E169DD121
-14654E913B701564C9DFF335B44EF9E7C34C891E8D5B4DC8AF49F1E8AEF69C2D
-181972F3558AC3A9EF3649C5A8F62DDAFF9E15B8540AEB5D665FE8C58A7819D2
-E945305CF8414E4C82475C6C7EC10365322E0D1251AB032D2B53986AFD68F5B0
-C2E9BB2BFEB6A1E1BDFA8DBC4183DD875B6E09D9D7653C97569AF9160FFD0177
-3D23E21C59B0330B6034F8BDB5854B6CC73463DB04BE06AEFC170A9A0E356537
-99877948CA4CF92F1B24267A1BAE1B5EBCC70D92CF76D63CEBB004B77151AE63
-BF957222499C82FB04A976118FED7C15810F7CAA98C17E06CA6712F318405E8F
-E40CAF5568AFB6464B10B409178F6C2FC5F2E1659D5370004D8319B76AD4E24A
-EFEDA214690C5CD3E0281612E90822632770CBCA36CD5581410F0BA737CE5581
-AE466B3A4DC73EB951818BAEF2718749B834A3A4C7A7EC08C123069FBDA203DB
-DFA7B49135B6C7872B51E25F4210F282BC6D6F429C14B26BAB2090EABCEBE2C3
-C2F58AC82C68C557C63CB2B4EE2167F7B52B444F917DD54AC87D21730761ED32
-561165CB25CDFBD83C1A718BAE119AA7331E7C99534DC68AB0996A39AFA5237D
-FC1007CFBD84917E667F53A49B1BA38998F29056A0E8972D5E6CF04456F63732
-6B0656B515C865A55E7508BBABD5F5AD3F3FAAE9C2081E2D32E5DDB16C3B4ED9
-AB0F7B3A0929E7775B0FDFE576E15043A3A9D61434FF0A5379C2266BC4A898A2
-A77B5C032629C85724CC1B91608539A0DC2CCF7DFC55021C75350C0EDDC79D50
-0A577F2F2960175A90515EF6F58771CBD2D7DDE0C78AC263AA2FC00F57EF85C1
-50ED7C5513B0E7960D2AF0B83BAE0D9B696DE437ABDE36D128B618B872AF1F6F
-959D1871BEC575BBCBE847622031307858B24B041DC8D4221F1C6DAAFF7AFE5E
-C7064515A0FC41A267943125A71F300BEA8175B85668632CE8D65D99C75C3C6A
-3CE8CF0165461DAE6E57B5C92A2EF499B3B657B887D05F8E8B56759E23F6807B
-8B3143BB22299DA9DC600CF907D983E4EFCE3DCB42275C706E1A7A2D47B5A9B0
-F3DC3D3B279ED66EB955E2ED9E64F660050A9C1629646252924412F639616A27
-1A6C4FFF63BE6B0B616751A5A80154B18BF152F53D153FB21A6C269298D54774
-38331BE0DEB93A3D42831ADA931C653006BFAB39162AE1D97574CC0ED7BF5C44
-610F6C618178CD9BDE88E101BAB5F278828B3622EC01DF8D4717BA72F5DDB4A3
-BA3EBB687C866EA3405D8C11BEACC5DCE3076FC8508996D51DD1B2AE89D37B12
-83E11FC3E41AFB8B497F676C5E1D161BAFBF18900D50C03CB6CFEFCFFEB649E4
-198F1453DE0BBD03ABBDCB5A075CF618978072C47C3B4A24043B687BAC3AD657
-3657A9A9B3813C2456D2DBA2D910D7DFC0B55EE4EAAEAEF8BB07204F0F537CED
-B8F67C2738B5456BD9F0F22C6E54EAC7CB905375C915D0D662060360ECB10C10
-F30039B9A5606F671E0EE132C5788655E4671F2E79D3AF39118AFB95EE5FC061
-BDB869E0CFE549BD106EEAE8EBB6A6DF727FDCE35F0375E95B27DE211FE1ADC3
-90BB092E442046A7E5DC902CCC3553CBA4912D989ED8261539DE69A871F82C99
-06282FB2E8105107F9B443245FA74FDCD2A47673DE6E2F631D3918374AB6236E
-792D5DAE1C76F3FE6A7C73346D1E8CB2944E382E7C31F99F6BD5029DED9C3E54
-984492F4B99F10FE5739F6D5F6F05426991B8495BA4B8B21002CACFA1FF45A51
-6B76D1469AE3874D97517A32B9BD998D2E4590862803544E33330BB869C5E3B3
-60BB9FE9B9756D3FB048C5A01A25B39B8729506D0F392350136C3DF46C9BAC76
-CE450B346A274AE22058339C6DE92E6CDFD584F421756E17ABD5F5DE2BAE2D7F
-547DD3CACC6AA10AAA3BEAA1BE9651527E3B7CC5F11737FFFCBC52771819DBFB
-4E6D3E71EE6C4A0B24AAE5988F828CB5392821FF2195D3452DBE0408D0B87669
-C6A630B6C1E00D0F1CE10F1000310B9E177F6253BE09247DE827B97FE02F2413
-AC5E94569BAF3635B4C5936BF1434FD7D5971F6286BBBF3102B3CFD68AD25993
-B69BFA3C89F4F4C777BBF3190D1295957F9ABC24BC147E8C95202A6CCE6BCB05
-91B821B1A27A398AEFA3A22ABFBA4227C5D0E0E138FEF04391E39C66870A77DD
-5D2CAEBFBAB1C5511BD62849EE9963D536461C0693074DA942864438278C2778
-2A49489EAD7B43340ABCF99A71B9836A696995C6A459740D58DABB5AFCE96C08
-B03B0D403121744ACC6F475E194E79A30AC2B165BF302CEF914D34777FF1CA88
-46EF2376889244CE73C9123542D3759DF83B3AB2F8E5D4865FC242058AC4C337
-96E923EFC4FA1F23800DA6B51D6187EF9F1764D15FC343C5989760998C65C642
-C4201ED35171BADFECDF52AC6CDC58A0CA988E44FEE389A599BC59395969C211
-DDF7969C5922950B0CA4B0D9C960AB1E16A60BDC44B9F90D309EF1BFDEE1949B
-87B66449FF949F1B935DCB7B492D4E1E805167B9B5FF1454AC7D5409E2C8BDB6
-13B3DC21A3A3A834A64BB9C9FF803E2754EEDCCC140AB0D8A38A4B04F78B83EA
-7BDE25812DBBF98994D414F49D560B38FAA060E1B8B5BF985C04D425CE9914B9
-6EFB14ED4DD7C5F5CCDCA97EC2AA2CD6994A140004D12F7EBE5DCE90183592A2
-7F431A2AB72AF8E4F462C020B3166583C05F3A1363CBBE68DBD024ABB7F99523
-E89696A976C173D373E4EB4B20671F010F1F7A186BFFAE0152A8A38F0E41BAD0
-8543042253DB5F848324A27D0E681FA810AFE80151BB2A7A97594377ADA7CA6F
-58EA91BBFDE300C547F762D6D0696A4C1A145191F410B6B784F740B8E0B3B855
-56613610441A509EAE3F7585272FAAA54329831524A5079F6D78093B3EA3FBA3
-12B7691ACDAAC0611499FC658DFB64A1A7B0D048C82050D8912491FA1F5AEE1F
-E02E423A89119C25AA0F89EE27882697E60DCC0156A721528E4D449AA5B9AC21
-9F1D343CA479DA22D4DD4DB7EBDD46D7985428D4E799D9240AD52ABF2AA64773
-D4319BAA29ABEC21172CAA7C0761F78756D3C72A0C921EB3AD83A850FBE9A583
-EA1F219428A23FA044BBBC6755F512F7A8996DD7C793CF8BF7FB2277DB8E28DC
-BA3CAA878C7BB8D04343B7B9E4079EDD1ABD862B8D65FE1E305BE631D3D03700
-EA13375B58FE76453947CCE3A01890CFD4F91F5ABC705BBB15
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/l048033t.pfa b/lib/fonts/l048033t.pfa
deleted file mode 100644
index a56b5894a9..0000000000
--- a/lib/fonts/l048033t.pfa
+++ /dev/null
@@ -1,1267 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiSans-Oblique 1.1000
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.1000) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Sans Oblique) readonly def
-/FamilyName (Luxi Sans) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle -11.3 def
-/isFixedPitch false def
-/UnderlinePosition -36 def
-/UnderlineThickness 72 def
-end readonly def
-/FontName /LuxiSans-Oblique def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-219 -211 1101 993} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078989 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D831E44DCA3B6490FF0789
-636294029DFFA55E327982DD4A2A67A6FFF480E29F5A881EF13E768B43D431AC
-37F159650C27EC72157C59E1AA122FF145C863CC787E9A7DC23FA008BE85711A
-EFF0F8EAC9648157D8211D40578588623322CC38EA02A3880326DF2645BD3F64
-08412786DCE5E604A2A62FBB694CCA1E173447AABFDD315C766BA891E3D75393
-437A58C7BE654E8B56EB2FCFF72BEEB66DA88A528F948A1278CD8C27422AEC7B
-96BE8694A1B33CA185601D99A08AC4905EBBBA42E7751122791E5150EBEC7423
-ECD39B2D6D6A8D2A7B920E68E80ED6BEE52083684530B8484E6475D0646EF488
-BB1BAF858685DDA12D8D63B4D35DB9F9E5C0459001B27DC28E98E154771B08BE
-055DE6C18C9DBBF7892717EFE2F18DAE3B714528DF55A9BB6DCE3604435E4E82
-3567F359CACC0DFB39D23489E75D582DE8FCFDFEB6DAE957065CFBC65CD52E90
-ACA6024498AD723DDA921826B6303C7AF6121273B3C87372CFA8D6D7A2F23D4A
-3B217CE35D2546E0B4F34A2B53F780AFF950AF527184D475FFA61133B9E1F3B2
-8612DBFEB7D7ADE93A68187E35865E23165C9BA77C899A309DC736CE27DEA6D4
-897D93B9E5FAB92EB8DAFEEA2E1C8A0D4EA9820860F103331EEC52FD564F17B3
-A6998015B9ECBFDCD47C10FE6B1D915FEC61720051C587E36D4D4C4BD30DB959
-8F0D1F67850B7342E41125F0175B287DC0984BBA8870B2EBD237852E12869412
-D864BF76ABAC386ABCF0D8CA91CA842D6D4F8450DEE0D405DD7B5965F69B0B96
-309E02CE3CABFD2038926DB8DFF48618F83DADFE43C6759F21487EE741AE2E56
-ACE575512F6AB199BC9C0098A082D4D4E21BE5F66A54DDEBB6CE8C00DAA5D92D
-51C6C0CD9D52E07A2476A92BFAA6DDAB6581E5C5F83BA2385B852FE2367420BE
-66C7455A817DA5D1484BD3EE124847B89F1451912F4A759D0AA87D1EB408C340
-D047831847B5DB5C943BD2D5EBBA1D959BF559D2BDFDBB69BA0DAB927E1D428A
-C401BF5F2DEBFA016CF35B31F5BD00883043513928144C4A98A745D08D81478B
-A5733CF67EC9FCE378C4940303BBBA71CE104B525874E93DDAD5ED06EC4F5E8A
-917C2E46A4DABA795E3F72FBBDD96C88817A501BD3E639B0FA4581782A249F1A
-C62D58ED43C26BAE32FD2E592631D9336CB4D957105DBFCE2D22586255E4D643
-A0C3BFD1EDDB43B97E8615FCCE2ABFF8EAA14702DD7E5D2795AC181014138B5E
-314121F572A72E0EFDE33814F6219DEB0B31AF67F655FA5B1C28DBD78E322B96
-A1DFDD81E3F75EA43A7C1BC923344774F9A06E8323CD1C5A3764C98A95F78290
-C66703AEEA967DD717B6C11E2BFC4CC966D38D7CC05BB9FE5B98A59D0321BA6B
-908524F664695D6C4AC6D36DC0650E792993B3C8BF3A5F9BDCF1DEE23469CF3C
-9D174083F0666A94DCE183EEF39AED664EA96F369CA87C365BEFB386FA3D1C57
-855BBEF5FB778FA0D16EDF3BB714C5A0085FF924036170096886992647B0506C
-19AD3E8183E108F85F22474EEF2FF1C792F900A7DED01E37DD0A0E5659BF98CD
-FA278D5DBF3C8BEFC72FA3BC09B646D5C229439C3E3E835CF60BE09EB8DABBC0
-76DDBB693716754E3869C0FFBB425A3B33CC88681849B22F31CD98FC1B7EBE30
-76657F699667B51B1EF8E3B550CABBCA69BBD090C92898AD9834772DF8465C42
-4856D3AAC91A29A3B67206EA3F99A19DDC78433464D8A6315679916C4CC1F66E
-F6B43EF15FA032F4BC45336D4119131936FAEF8A440BFDADF0B6F076DF1ABCDD
-C3579F02E2C40EB55CF31782D8BB8B070C3BD4F48D0BBFCF331703851266D535
-61FD82D986F1D33C5CF6A9EACAB25D736AF2A1BEEE35A765BED58A75849F0068
-5210A5E110BEF1741A96C2FFC63C3F9D8FB305820203C1B406F3DDB54D869961
-E034946FBFC4D184CB3481693C579145761951F7EFADE27ABB4A0003847AD885
-FE585EA13987B334332EFD1A958CBBE3CB21A4F1C61AA81465BD4F524CD99E79
-35297F71EB9CA7C9701760857CE95295B397976516378EC7A570126DAF1CA3A1
-5095186DEF18373FD55DA596EE7688D86A367E02FCC0A36D564BF7DB6B263546
-79F4E1276EA549927A38DC8383E8FBA16BBB17CFC6B2833C90959FDC6B3F7266
-32F177624A9E26835C7C0E2FBEB1656E246C8BF4EB7803FE4AB0F9DDB77221DB
-E4F134C8304EB13D8AD0FB57C4766133AF879DBB7FB52F25A555FA74F145DD3F
-65990835245E26480C90E25CE74A249D9B8388A27A4BD2F63D72E383BCFF0E08
-B9EF146B512522DC267836520267ECFD46C68115FEF3ECC655A1FE092B9DBCC5
-412220BD4EF12017FAB9C51F198725E8F225DBBED24F56239C558D545D353632
-415F5688D0A85519E8AC25F27E20A4F7B903F62D9D2EAEEF33ECA60EAC68E55E
-2A50DABEBCF97404687089D2B569EF016DE39DD953D7C458F77FCEED17ADD98C
-C6AAA67F4F09E24BF7C24968B44D1B489726DC2E2BB3C481C676B3BBF0E623C6
-E649C80370023502121070725DF295DAA8565F5771AD8E8E2C82F96700D896C0
-CEF869F7EEBA4D2DAB7C4E455C10EB229AD97B669781182BDA58DF962823F597
-BC8CD6BDEA739C255CDA232E4B2256815DE91D09CFAC6FDBD8657BD9DCF730C9
-86315332754F25B6B3A913D786A2AED4EF78083F82FA1EA8EA16C0A6CCC6533A
-0135BAC54D05B4553EFD04D1B5BEC10B60E1A621050CED2CAF978B057225CF30
-2322C543CE420CCBB0A24988653589B431FB84646945114A37A6780BF1DE812D
-31E82FA08B4C0716E17F6831F4DBCF7EEB127855B88494315A98C578B5C5C03E
-151EE2E561D90DD354E6697425A49E5B5ED079FA28FB845E4ACF4D447FD0A560
-5BB8D71BCDD40F657184F0005B40C2A51F9C0B3782B8B984D0F5552537C37BC3
-5864EF3457143C4F36B42E59B27AFDB623EE36C82EA73A1DC27B52E544702659
-AA4073FF40AC396F1B2D19E30A4A69A1723A5C2492BA056DC1B7D04BD4331E99
-B921369A7E502808FFF67C468440ABBD4E9379C0FF2893D2B9E96F32F9E2A304
-BBA87F43DB45BFA9B221EEBA8F65E0D97385485A49FE8C259000C6E2D66120E7
-492347BFA4021115140252CDB140EC68E2E404C35FD2BADB2A27D36BA2E11F15
-D300A92DB828646F12CC677EEBC545630FA2A8046E6AB14CAC5A6ED967644D32
-D0D915351D39913CC43E4C2E379C59762DE62C190657A6AB262F4D2CD54EEAAE
-6305BDCD3D240FD8CC45CEE4291D905C01C05975FF24F77EF6DC03471E9BB834
-AE38A38225342FBAD3F20E3AEE82799CF60EF345BD46DBB56BA7217C1C887F89
-581B6A9BF199E4EF6B9DB643C2D0089E0AC0DD291D4C2A0752B7944EAE45E0C0
-A3CDCD4D5266C7C8FDA7D5D1F84E6C93348CA767108DC279D961CAEF68F8A496
-492D446DC08D83A60796EC823C1BD78872704B08D9FA16094D274398B4B3CEE5
-15504209BE801FC20D7CA94EF3571938E17168A44B36FB9674ABD86A83306CAE
-D9EAB6D8325852DC6B10D798B95E56EB8FA973A2BBA555000D71F7D997142E36
-A93CBC654CF5966B93D599405BB73E5473EEF6B961452F14E0865F44FFBF0797
-C5693895A9E33620B85DFA530C480ECEC3D773DE6AD42EAAAE6ED9DDC951533B
-635E40FC95A015974764B7626C71A9FAE2D672B158BB1557EB24EF575ECF5FD5
-3BDAA7AC6D8A5FBC83AA00F45F1007D1BC258AF9A672D9E103A74087C041F4CB
-911F8DA6BE3CEBA90F205384E9C509E13D7B2B47286F459789FD24A838DE07FD
-ADACC111B894CE32BBDB391242AB4FED699F01D3CD324F1627B6C6734795D322
-D9CF128F25DFD154B79304FCF80893C922859143320D0D9EFA15F2E03465E5C3
-070D93B1B8A13271D90437185C6772A7B3B87B196AA179FA45E7C0806AC25D21
-E5A085A0510B197C7A5207F5D56ABD5601CEB6D079BC26849DB73EBD4E3C802D
-8BEAFEAD9DE346E7AB231F70318B1F0238C766D61943F81F94EE771042743947
-77E4A94D282D61965A8C2ED87E8439C080B889BF255B92FF7B61975A1AF63EA7
-DEAA26B4F0E843E7F4A3EA99AB6FCC3D9EAF6160E3BD2F4354605EB04DBE558A
-A52FB6D8DCA009DCB6C601B876B742AFC3A23E15974F95967200EACF37191675
-2612AED74EEFF9AED8C10CDAE9EAC4838360EF1CA65674752F40B025A003AEB5
-A5919B705EC58109C2CAAB41D8776E02892099B9092A6D457ADBFDA01E85A140
-703575A7733CB865589CE31B02D11A0C00A947CC9D9AEA8BCB465AED57BC4ADF
-061E66BC22D032CFE50538610836FC4AA481441FCC43007AC96BEF93EE9A3A34
-4EF8100E7DEF7C6A000FCDF5AE879D1A8DD4DA585C9A71303E43D48B16FB83F2
-FA5C94590FBC5EAACE4B55291AB239B5DFFD8ED7C872A8A35B0C82EFC57F42E2
-93E4A0A517FB12D9317B6CC10A2627CFCC61D350D5D0DA9E5359D97B7EA1321F
-F63B3991C42F2CF06910322C780E5F47AB64AB236225724FE7552B9D20B80758
-0380188728CC0D3CDDDB0EB24112C19122DDB20F74117A55EBF797C1FB3BDF24
-F2008D619DB7C4625A4B057AB3BBFAD0DB7CA7BD269E30E23AF79F55128EB072
-F1230F61B2F2335E4552933EAA4E2FDBA83B68C4B728BE38FF1DE4D3BF0E9E60
-B3B1B5DBB32C20988804C2F8AEC791170AFC72CB1314B80CE56F3F73A4E660CF
-A37AC1164AACC6E4FB408F222758ACA11306768B9563D26ABCE6712B5A8D9C52
-DD6B23BC73ABC37DD6FE71959ECC1068CEC2F7932C3097B97660938717DA89FB
-7D5D36DBFE675083324354982253BD5397F872299E6E1CE7324A65ED0E36D9D2
-F4D8782C0F73F85442E0363D3E3059AC33E8BC80164D5DA72D5C5A45A02552B2
-EAD050CAE6B0568943DE1A68599EB004B2915CAF6A1CF0C847178CDAA1A1082D
-A67CFAC77E43F21E5DE0B4E0C67F59113E98AA0908F7D84B4AB5E52BCBF44D2E
-7742591D365B208AE0ACCA84DFF546069D8D3A8A7007B09AEAE51C00248BEDFA
-48A4D06B188A51E9FB585694A79377E1F03F685C1E901D1DAB35E37A3E4BC240
-CC1203D603EBE53891ED663DEECA562214DDE8A6FD4145CD70D5C11FFFA2C160
-3E855E6F51F5702C127348920EF8128B32C7F355C491392075143FE94B8B9B9F
-9D692E4937B217E4023F20CD7E215EC36AD550FE802D12014374F2B71C66491F
-B36A3A167BD8DD66B5AB2209A161E45B377CFB13842198736A301B6032E48B45
-89C83613A7D8EBA90E721C747C3FF4DAE1B0FBDC1832FA1ABA7AB8ACA5AA0AD5
-3EE07D977E8423EF0EE73FD074BBF9BB333107C8CB8EE34C6453A92E8F00D97C
-AA32BF9D5C29794B97F94B299F2B256225F83749D1804BE657C1AAF393A517B5
-A299757B0DC2927975118FCA733BA8D1AC62ADF30D850F2F0D15FD7CC86DFC9D
-FE51B94E5404FEBA90C39EF938AED93E3D871780657B4B3B2089CA226A6C5BFE
-D558B6DFD466A8AB3FB9B1EBF7DE20A58D73F7169F9C3D74162097245072EA76
-57C1E0CD95A52F20A9696CFB3A0C9B5E291AE98EAE099046459FC79DFC035FFA
-2226C3484390AD5453CA6AF02EE6EF557D7091197D9D6B4A350268EB383A0E21
-432C9947F0406246D8F092D7B4E66C4F26022F23764C5FD368199A55043ED876
-DB5153DE7AB4517BBAFE8C7E2E5F9A8009953CC190CE2FE17D8A4A9F935B53FD
-B0A7E99E95890FED19FD4DBF3037CD343F0DD60D976DC45FFD226BAAA771F8A8
-825BE0896EA5FB4F1630E3E094F4CE48BBB77DF3B3E02A4C87DD3DBCCEFEFDFA
-49366A42922C9D6BA8B158D5CA984E39747767D90406F265EB3969458A0EF64D
-3068C11E9AD68E9A7CC8D16B9A7D039C771FDFA7A53B57DADDC28A192E855F08
-53C1181C71FB478D99689750BA59720B93D59A6A59BC01E31043E0746B31F184
-4484ED2190B3164E5DC9611F4866ADFD85A70590F1E10D3342210182D774DE19
-69E8B4CF605F9DF4C801305406F5D6FCBB9980D63521C12AF90CDCD2C0A728D1
-FCB6FF4E863DA97B067C95A66DB6CD3793B140F62DD957769B62E5CABCA270F6
-0398DEBF12A0920735A29CA5CCC9E713A772E5F49715EB6940E4A9F06CE317BF
-7591CE708F06D58EDC3780472793D31B359ABD417FC8FAA880B39E7957B90312
-0964AA59434BE4D1A758B0AF818B2FDECE8A66A7E8D5330576145B60FB56297B
-70365939DA78E35B2B557012568991AFC0C30042E0EF061ECEC5718B473C9D00
-47C519445B354A2A80A161A49E893D787BCD72AF0717C2F77F8AD5883433EE6F
-EF9792F7DCE4CDAB9C63E13CF9B5BB241C5EEEA9DE55737F194C2F614E80D0B8
-B52B1972D6FA1B08B00DE7D85FCA62277DA0BEDBBA20788C1C6F30A81392BB8A
-1AF5EBBFBE30161C99A168DFAFC67F3A32DC0E31E5E08B89B0E377BD4FE7016D
-8F65AA31FEA39019E03A5532DFBE38754B6170E0A1104AF8A31B47254FA38987
-90E53D9688161537F1C6CFBF189C792B2B3E7817CDB7072E1391457DAF548270
-2F91AE044394B948B167AFA7DFE2EE15CEDB3409095D19844E623CFAF4907DDE
-965ADA237507174C60EE9869D7E5E8ADDCF44279B0CEB596DABFBE6D2ACE78E2
-46211F05BD34346E31D885FCF6BE36A2A643205944FF48190F448087D93CB30C
-3E7FCE736771910C808CF27BC1E5C0960987EE453BF73AABBFA80108154E66F3
-159104B535BE89859557D664DCBDBE24E6A9B9AAE1EC3FE611BECFD8A0BAC2C0
-861A22799746A3F8C75DDCAB438BFC31431CC7113AB6360D19A91A275CD45503
-795765EE75349C2BB62ED8F062810D3795D653D4C3E4FC7AEE0D09A156F4D683
-BC9DAC716398B877BC4F4FE997255B26BD15132E963BFF80D6F74B102160B97C
-27EF76D963C6F54668D47D8D28CD4CD8BF8A15E34776D3342BBD5B6331DCF1CF
-8C960C7EF6DA0F04E136CE2DE3B338ED4E45C625BC8EE55E30FACE1700323489
-C7DFEBA8382EF6CB5E6A61833D9E92E68C8C3EA2DDAD87A3F2CE295D4A629F88
-70010FAAD335D042BC9D465C0CF51CE964853A3CB5CF28A1959E3C865A074CB0
-37508C4581F632DC9DA0241D0558EA26CA4F1FC705E5D041843E1066695BB5B5
-8255BAA392B820EFA34754C408516E11AAB38CFC02FAE7FD63DD7074A6E184E2
-CC740327F503868E5E520FCD90B8A35C82AA7CC73CB7131DB9884A3A5807A640
-AA44A3DBCEEF922811D110103202903499614AEEE640F3FC59E388063977C9AA
-A9F8EFD1011B373B255A97FD7B78ACD5DA909CC4C93A1CB43FE7AC05602460CC
-D1C216CB1CAF35CC28EFA959702BD3428F7D632425234F0F576620EE6B1AEF82
-20BE109D25F84EEB9B63E0B73D821DD4E61E6818399CEC44CB0EF3FE1344994D
-B1DBC9DB8295A167EF8E5BDC1EDA72F083892ED899985AB0A3E18498A45E2B59
-08866DF7F498C3B2F7E23DF363253F9E98305DEB607409E5D0AEDC7871C40D58
-F23B5BA04228862950727602BD83F688C922D3A68DEB7D232FE494DC1FED59B0
-0D466C25DCCDBE438E03D313E569FBE1B6876622BA9EECC2FD175489A79BD995
-351E2C9CD01347462221D7515DBA4AD2C9C20C266973409876EEB6CF6D6EC08E
-2E7A63E48B4A67E5855FECEA3C54F06F726DC0F2ACA724B448F9C4E2BA7C6938
-B6B3C6059DC998EBBFC735C9663F1A247697647E5D26FC8389E4F6FB5F69A18E
-38EF7FB2B36238EDA100BB2B2C455247CC08127C60B9A28D024C4DB20C80EE0C
-CEB3C166B6008D6A907F24AE05B63C9B85B430E35CE927A6D13715B65F5C67AB
-E2CCDE71EEF21AC3FB69357D5916DDAB420EBFE320A253887CE8299F546BDA97
-17F45CFE9FB9B44D66993F40044DA0580276D975D803A05A027FE197C3E69D59
-B0C603D5BE4BE783BF55EB89256353DA6F7DCFAD6C82EB09720475388F813717
-7E2483F98490A0BB7646648F9412A4C4FBC5DE09314824BF6A43D101BCFD9C49
-365EE33D1B763EE47AEDDCACF09E3E6D9641FDC4F9E284FBFF5F294B5D0D7982
-A9E545973B54B2D8C9D6BDE55FD08AB8E694981977C77FCDE79028F32C83957F
-26BD8CE3831EFC042B0451DC555F7E9EE0F2D40D2CED487607F48893E8696F8F
-82CB5367D9FC51A77ECF7E5DE6B8BB8C626EA7FC74B0244A0BD2EC1FAD94A851
-2539C6AADEF9353DDCF498D9733631464FBFA298E9D23BBD041773D482749836
-38408C5D99794F76C6446C22FAC277F8DDA658D73EFDC46B2554CA6086FE7EBC
-34509F5B1207C16727B2BA222684395FA168CB5AFC620533B2F96B75C1775BD0
-441201D19F2A70D8ED17863A5475DF5D6A5AB72770F1A3DD16B39E8144782FF5
-90E791130097DA74E731272EEC9BC60BA75957A5CEEBE835A0D77A4780346A93
-CC984FE0C9C46C069BB51434FF0A79DBCBDD5499F48CBD944693E0B9D18A143E
-5441A3A57F34B00B5B8AF59D97B19425795D85109708F66F3A37E88E291BA6AC
-5C37B29DACCF16C44FA4D77AA0DD573AB26DCF46D8DD8C33C881776A4FD6B343
-4719258FD5B4718BA8DBC94882C530D8F47B26EAD4E54B19848AF2D897AA7B47
-CFA178A45E213BD3CADA498F7BB93E3C74A3598C62C28C5ACAF0EC172F883BC0
-79376D48F6E7BAF85A6823D839AE7AE15458BB33C33E6FFF63B3BE3D76E02B32
-2A207D6F113E85E66112E81177C3E72A5B7F902B6D1B8B7542D7985D69DDB0E5
-97F03187C939369D10A417C300DA1FD0833F338232A00C85085354794AE9A087
-B8459A999A576151D01F30F45CE06180A55C236C5C3588AFC541DF83F444CDEA
-779B7C825B740D7B21897818A5BB90E728A5F1E915D789FD3E8CF619283C1599
-ADB01CFDD7B20F4B9FDE8CA2413C6F1325D5E39A641E638A5F212F32651FC540
-CEF349609A36CD64B144BB229B28B167355EE604084E480453478F271D93EE51
-41D289565FDD80C24047C5DA6F6E63CAEEEB361039CF136F6BB6771CB997F039
-D8011DC0882CB6E07E419E90AD2E1BC3ED4EC481A2437C1E960B86E413C54264
-4B0D655C8BB8C1EF0B2A584AFEFEC63AB229B037AF7FEC78D0C0762B250909F8
-84A3937FE5ED394B22B1A4F7172070CE1BA5EBE02E93389A6451711D2A33172D
-8FE716E279CBD94F81AEDBCBE43829536DCB6D816B5348FFAA49A335FFC47016
-40D65A9C2CF70ED6F14D294D7F00F94DD5E918704CE7BCA42214E9607686FF1A
-61397C31A3E9D28589472CBED26C2B8E3AB2CC5DDFFC5936D1CF3DA9649A489D
-32B719EE6DA53A1FC5A2BCE8CE665D5AE01EE561782FE7B3200A132493AB290E
-E77BE8561EEC178552D26E0BAD490BAE7B2B2D1CC2AE29BCC85C3034F43B3BBA
-513BC8375DF221D42B25F5558D19E12D70402A1BDA81C56BBFEE60F99D9F152C
-6437B8D268FCD49673024BCFD4755E1A0A3436D12D2F6E71CA0BF0C3CCD00D38
-34EC290C7CFFAF3485C8FE848A543DAC0172E025CEBCE2287E958BC91207DDDB
-3734DBCF73E7EB9E6ADBDFC35FE75F759EAD1D341C576F047106AA89CE30039B
-A9C4155E3EB571E700F8C0F04E24D4841EEB8D99A1BA05E3291925820C28DDCE
-34CCCF4CFC655D49295F159733DE276D962A8C5CB859886FB0CF642903F78E07
-FB0995EA336A63EC9CDB5D2EEF6B32C81B13D1848849F07B653887067115F113
-57855931115AE76D7147110B2F3C2ED20D7466B19CF8DED751C15F12C730CC54
-C86124A03673725D1331E75DD9E4A84858EBF5F2DF6AD2B0FD5842DC6372F5DE
-F334D21F312501E790CBCFBA0EC9823BDB1BBB32BE5CEF2AC5906A368D6C39E9
-D913191C0DE05C20C24B10048368362E7702CF6E993E6904A85693B520CCE666
-7F7DDF2FDC2195CAC5CA89D230EF1C383403DF6E22B64EDAAF6A1ADE3086DC01
-1849B6865F7ABA165F2895DC703FC7536F3CB306CA6C3375F36CB5C7BAB8C78E
-DE37462B465EFAE538C52267E0FD152467BA4EF681512BE295D3FB2D5ED98B37
-9544A30798D1571B8E794A4D3B6D0D0F2F630E2948B45B187EAC18272506E2B0
-8029D9ED7C5C82CFB5713B0FD929DB6B718B8C3A1211C9A9D587DBD58E54E0B0
-E05B89A429FBDD4BF4CF309E9C189A21BD42065D007DEFFF38387A02B90EEEED
-CC4C5CF3B8788549D626CC25AA246CC022C8C1CA9703EF945139B8E10936251C
-80C21FE36821D75D0BAA1443C3E119BC08FD153CCC20A52074C095D2680AB050
-D203DC0CDE27771081ED74A2C5E0718B93364680F6512BBA43F1357A70839CE9
-C7D010B2B90DA733C74E634BD0FA1D281D40779E4FC55139CD11170ED58E71E4
-A4616EBF68B805122D4AC069B9C30F7F9B8A204D740C17DE428781CABDABAEBB
-02F0B018E812F00EB92D5D80D91A5E9755176BFD7625B80223C2E69EA237D8C4
-08E1A8B51CD142F48A760EA85D01BDB66284D61120A61EA87086227DD004CDAE
-FEAFD1206700187B602FBB2E3CED6F333E6DB5425EC0E604A7478C017CF376B7
-D7B7548FC9AD882014F7598408E31000BD53B0A7D17A8ED5EB220D9D7C9B0022
-24DB358061C415A4A3DA467579F663357CB97509ACB840EF5C7609B7B8A5E1A1
-14E23BB75597312A45241847AAB21DEB166BB0452821C26063A14EF05B628230
-D63292B46CB3F53B7FEF2070D4C4D613479CCF39888224995D02369F5E3F1DB7
-27390BF482072E7DE300F0425DD301869878946C67DE03E713B69DDC2BED58EB
-1E8FA154A787BBD1FA64D76CD35FC1502CF01CD9476B5C1B7A623F221317965C
-AD3838AB18F185A9B20DB62391599043F31D1B0AA90C38C23174C7B018EB576C
-B1C7D583F723420FEF9AC11898802AA768B4AB70748AFBFACDED99C1789700BC
-A662B71CAA1855B83A55CFD1174DCF8DB001BADA69E45340FFDF0202D311006D
-996FA17BF67209A51CF06B84BEFC6BEB2C60B8669704BC51BA6AFD0130F37076
-6787C7E5119A7F1B4D1CCAB950A4621C794A128D3971759E71922D9FB2112998
-4C50EEE88291107A0C519F68E411E47AE4EDBC9A269DB4830FA3B2914B53AE1F
-A58B33B223C20BB614BF2E63405764A993CC250A728E4D420BB85F5829A862C9
-DD58D417A74FE8A828F62DA4D1D31955E57520CE2F7DB2E4F06B6179E55EBF7A
-289335B17E77CAAAC62C6A8FF7CA4CAAC6BFA1326B5FA32FEFB991B0DD0B38D7
-71EE06380478EC47549B91881C3D6E1B0C66258423B3C69C0FAC17A802832D06
-0B9AB3088DEC73B497204E5CC44E434647E320C5D83F8EA2A7E25B5868957E9B
-0E5347626A484C986FA5105920F079A5F520F5DE92AE530DA801E329C8592FE5
-5210709E8CF735F74F9CFFD32746E3BFD54A40E4C08AA4EADAA303C66E4417F0
-8D5B75ACEA41CB1A41A6788BB557420A9609400F6062AF8C3BCE7F603B73BACA
-35BBB418E0802B22725723E12B92A231E0C35B37A05CA9380CBE911C8895F380
-780EA4E04A8714D90EA911376541A2CAE1A013362634AA04504D98DBCEEEBD8C
-6DF498805612B3931FF721E63C8EAC4C74C0AC8128468348A2DB56702FFCFB23
-A6F78B6F7DD08E48D44E4DA7880836CB949BA8E915393E6B62F58F9D34568A49
-2FDF255FB29FFD0DA9878C19F2961BCBBA487A9A578C36476E6A49CB72BF980D
-D64D3EFD82077CC0663290BE95C13BAA1C5C07F50B74FD00A1B50788BE98EEC7
-F0CECD0D9612B59E385BC644B0728EB209FB5A0BF334A8F1772A88AA0E4138A2
-518FBCFBA956ACC6F566FA6BCC66AA2CF374F0D457DC7D7A715CF066B08FF1BB
-561BC5F6CC3C48E857595F9986829E38C6FC8AA8573EFE7FD6A95CBCDD859778
-AC517A3CAC168CBD3B9BBCE9D00111B3241418BE0B2E690CF4A737C816441862
-E25529374DE12E7361ED23E542BCFEE4D30EB8B746C2D133DFA2A68A8D2FBCC4
-6934E2ADAE482AE22DFD714F77E228F95E934E4C286E428AF5766B5AA22189CF
-DFECD70F4D98ECBDA9FE483FC30EB5FC4800D0A5205F23F863C21CE0E4BF6C84
-1EF9E77C68C99AFD3EFB879EB1EBEA8ED7E8C4C7CF7DEC6C2182901EF483B76B
-F83AFA9C1827AF5C3F6A29C36723E3A657C0E5DB55C198934FF5A59119DB5536
-F69CDB34DADFB6F596ABD7C5885103CC95068D113C3C17E9CA8C34C0B74E7463
-1D5C83DDB5B45D8EA510C279FAF577840958A13CF2B13741D74BEE4941A1C207
-BDC5EBFADB4CC01FA3F12D22E431BA17527C4BFC940A6A08BDE150C6E47D752A
-5FD943C4B7CAE482FFB7AA27371A6C45E2CE4C31EBDC8337A1B853A74B2A17D6
-BC607BA9D38B71D86F586A33D440B616443F58A103521AE1D6A1755E74BE6BA3
-05E45006058BA47601191958463583E8D2F0985D6356D9868E84C538654AE972
-D59C6F48D9D3B929BA4704DE684A35438FDA0CF60B3D2E1610642D87F690A3E0
-7CCE4A5AF8180114A8EE9D360C8F0C6A033F2331C546D34FD1B1E95B9E7C914E
-0074C40A105428550886A264C74306F7CC221D78352DD53E39BA99C1AC851E9D
-14A3B0B9CCE04806615D7D90F377FA3BA50182DAB42EC6E32475AD56B8B1CBD1
-D265458CEFA79C68853CB11DCE026C339CD3ADBB44259AC7318B39EDDE33FE33
-E542E4BC5C64B36B159D68F59A9B2BC55C0343EDA853A4D9E6E3E53176F46EA7
-3EC1D108D76588C7A80BDB8DE432DE32CA3AC3C74ADFEC515372B0594EF82832
-CD7075AF87CCDFAD82D2A570ACF179B6B6A318AC8EAEEB99B34DCB1A14A52ED2
-E35A0EA8C1A5449D63695FA7E52847B7446C4489751099B0D2103FA57ABBBC30
-A77E6C9682D560D4BD9AF78B0798FD89623126945A09BCDBD5789F6551B679F1
-52EEF0A6603ACEA8F7B9E5B58C25D760BC078943C5502E3230A31539DCA5A7B3
-14562F1283E8FF98361D23CAA48BC78267F46B0255C526AA8E5800D0B570D3FF
-C6C79CC39C2CCF320006298AE4085BB7E3C57ED37DB620A2D8B34F1E970E7020
-4C5D676BDF124E2524EB93948ECEB3B53BB3DDDE062293EF03670EAD36FCD0B9
-001D87FC35F0EB90B6CE065AD2040770E4CBB96F020F665E563DF248C12C95FF
-C07EB290B8ED0AA843FCD2D04BAFAA0863143FAAEB275FA8321DF73D589DE07C
-797027BFA79A5B29C03B560F41C999739CD272B01FAE34C0735820A9A78D75A8
-F89FF3D929D1CBD7B76707BB236ABFAB615FD25F4033EF8A2A9382C58A8C3617
-78CDF0F6B662C3785833F58F71115ABF92195968F87D49762536661699EA32F4
-E8B82036F147A0C8726FA2181EA36EE6D627F2422115A66EFA13A5AEB1DC6743
-0961EBBFE03965204975852DD634AC09B0C3C167F53C34EF7ADA1D0C1A09FE1B
-EA96BBE639FDFFE69A5DFB097BE71FBFE695DECA330DC168AA85065345124FEF
-E37DE2DB9E927F58DA629D912B31688B51B4BA61D9B8AAD2C552CCFB36274DC6
-9E6CBD67698CD4D16E75D1119A90A32373982E631E5B8DA9D648A5CFE65CA188
-F27778BFF26E6A55DF01A286E8F6376AB5A472FB3B2E779E79D55A41AEE83A00
-5D00E9CAD77F5E6018FB4C59A2F114A65FCC20EAF2C8E026BB97D1B94F9E7686
-B42A7D9A1A1DBD41DB89C4DC7FEBA4BA24613D0FC3931A05E39C4C6BF4D8E92A
-11FD40EE366783E9BB2EE55F57B5E2C4B9C62D3217C83E28DA32D9C122149036
-CBA8F707B7D3333517F283612691DB9A335A035A77B5C4EB4B4FD5511346341E
-99C55CEAE7FFEA94BB8F326BE2DE4C8D280FDD633CCB813B56F4E85FFFADC926
-EBE5C08265413E93C86D6F3CE187B09B0747EFAA8E25A153167A140E2D49614E
-AF270C8B6FCC854DBF52B62DC238E83659B138CFAC77F86DF19FB7D5C3FD4DED
-C688799A95A559368A4CECB79B7CC1FF10CCFE9111A74487CBC153A2248A9E66
-C6EE896EC885B43B73C18215CDD7CD8355BF63F81E4C8796502D4CEA494AD600
-49C684E376F5844FB4D02707A1F96A5E942EFBEE3359C77ED930EE904361B0CD
-01C86D8DC2C913E7644821E9A30714D18BC6357A5FE23CD8C9866C8E8F5729BA
-A16537D2D88077C7143116322F0ABC5C980DAF9FA8F13BCCA75B02E5CACFC475
-801A43107FE42A0CC87AE1A78B0F839197C02F2680F9094779C3A197574B5C76
-8D48F3BD89EAA1A1D98D6B63BCC31CEC0996BAA5F7E0057C2447E72CA708F14B
-C458F47D91F356E24D91049EDE3BBDB7D1BBE32C4ED5AC7771CD321C3296D92F
-68B6CA333B0060E2A6F5FA71D4A0CFF0453A788C1BA661DAEB4CF87557BBFADC
-7BA7D7D2939FD8D63F29D5FACE40BDF71AD0353293E80988D111FEBF46719056
-954162563E759F0314EE7A0BD5367CA6D2DB23B8E33EF0A094B77C89E1DCB645
-8E1B168561D7925778E38208CD5970A2E43CE2A5EBF52E87273D21E7D35A3869
-CE1F1A0E07AFAF4C2CC21B80A443BD9851D8D527C1343E975EEC4512950413B8
-EA9F99D32A13F42A432EE52489EB370AA99FEDD2330B75C47DC86A9106D67FE7
-80192E2109FEC77E00F60F1127501F4BFFFF05167EF94EA7B9CD14049AB7AE80
-2AF55490FD8DA3C80DBF9ED6FEBD0FC03CC5D82194F950F902966279C4E84D83
-A7CF067E1D1F07EA1A31C93B8FEF995E65BD7DC1B3B81181F8B5954C7BC4B62E
-19DC9B35C23652C15ADF50C84B968A12CF882D426486C46D3FFD964F5D6CADD5
-BF4500AB9B4CEC2A1AAED512CCB64071CF9FCE7E5357915497ECC259DA2949CD
-9CBE29B3F9ADE03E939B636146E8A4E8AA19DCC0F8C7A0DC9BA422BBE4988A37
-6513EB6774F0043EECA9F241E6A827095FE05AA6BAB09E66D08AADD69EA5BB8B
-F813CB9DB27C48F68508550BD494EC3F16589333B7E4A1803A5BE00C40F1BBF3
-835682C6242C479843DE30D6EB9088A48F115BBA988EAD5DFA2FBC018400D176
-840CFE498BFE4F06367B74B339B2317362897D6B4134DE01BBF9E9D9F980911C
-441EA5D6F6548F4E87835A7B566C8471A03C53136CC7D6A58E77A702EECF4327
-89D008FF5E51A274BDB5A00D3048039287C11B51E458A4DB2A9481679A2C7FD9
-A30D9E8FFA4A7220F36A187D02BC85D76EDB1FF407F33E5E1832AFF2ADB9EC73
-32281F6DDC48EEBA894FCD14741BFB4CE477EA93640F8F7C7E8BD21E257477CA
-F7688681DF0D3954A6C6794AD9AED1DA0C570E04CDFC4D3933D7DF89AB3CCDBE
-E268AABAE4FE28CC63B84894DEBF941D3F886B0464C111B698856873F05910CA
-A413A719611582A91DE699BC47E9C13B7A0F0B3E6FB816D5A03AEEB88A82ABE0
-106DD301196A40FB17E79BA85A6D5D4867E7D057B246BB24DB079BF42D1663F1
-B20A7E4017EA26B390DC39A57CF356C81851FA5775DB347A0DF1F174202CEA7C
-E13CA1F2713381D9D9FB3A64AACD69C0B48C18EAFD68C6B6B3C088189E805ADC
-D1F58F03E0B1BCFF4229CDE123B1EA5E026AF1B958B9C08ABE3B5D3E2F821ECC
-3B92CF0F3AE909D1EE1E5158D1D70E0891D888E385FCDD4AF71CA1EEA06C7BFA
-71D584E9A0000D508DBF6C18D30303666B2DFF6EBE81B9EA48D8D794763471FE
-5FF36DB90E8C6D2FF2B7897FF64070F8D1982DF106E402426AD09A64B7AC5BCA
-1C6DCDE633BC4DE9E8AEABC46E7559E349A0E905322F4B7E395EADFA8F8D959D
-F0E28E01DBA51F7BD55163D95412B7E499C9B480B6638F1CFA2278CFB3B99555
-0CFC8821F3E79EE3362947A6406B58C5077A75E2ADC6B61DBDBE9AF3205257DF
-8A7D6069D7B2C9721E50488BC754E94D1D8A4FD3747239724BB3C8F5CA2F88D4
-F69CA5F395B8A36141E40954392B5D2E3F3E49936F48E8B51CD931E53AADD3CA
-32B241648A3CEAA5E2D53B8B0A8DEE138E3F4BF88D1BAD2988AE342E825889B0
-38B5F9606A6DC3BD767EBDF6DA984E28F9A203F015DC1B17E26CC038DBA71CC4
-6A3D5ECF75802A02182AA4DC7FD34438E59960BA78B9E11755B4314886681B17
-AE05C263496170AB1B642C34226043809F8F8CB80D30A3C3C97F07E9EF849CF5
-FCF99D9797AE8DFE2644F1D597A37BF88FD02891506EB46E3DCF1C4DC905B39A
-568ED960C0CCEE30C5A075244E2DDFA8B568133780DCB656A537936924B7BE2D
-30D00FCB4A82F0C6CA1E7391B4ECEAC37EF8A32DD4FF229E31D8982D1B876C47
-924D26DED97B91661E126FDB72057412C5DA49D95A2FA3676CAD58E01ED9DE79
-162BB27E9F2005680D82967F953A96A11501ED68DC6157894C3461E1AEBC38C4
-DDF4962D9E09C66323FB6323DC88AC476ED6FD17025A5FEAB7B6C6A1BD4EB30F
-97C6527D6D836BA80E4F2A1C046368AE6BFBE132742EE6538DC48C918A1EA445
-A5651759AC5E5ECA97F21EE2DD6EE9B77B406DBAF1EA9BAA64AA075C57DF68B4
-119C681608ABD57E5A6E99251B000CD846F2C72519170A7750E01C1BF79C84E8
-0C24B2F74C73E3939BD161C67D2DDFB5451488B8EF6EB0EBB8C8012D237C9ADE
-B04820C893FA30A071C8431E028D33D656ACC12A83675C598C4E5F1F4162F113
-75D9D193D32EB3B3266DCA5B2FC27AE87403191FC06DE4BE6B40950D60CC2483
-E9EDCE3525E6AF91CEDA7A7BFED86C6D2F5ADB3DD0CE502EE2440D6529604ED9
-0CAAF7A0B94495B5E3472B9B4E4E72EAB9C899661AA695F0E1DD191597C35CEC
-11286CFD8CCCEDE2D696E60DFEE518FE2332532354EC36D4027B9E54B5C1AC41
-5D9087477E50D0074E93CFC74A8B2B4040C46D926982699A02547C6E5A95515E
-C906EADFE24EDC658549171DE19D95CFAC7A3E49590A741E0A872F96766F7171
-619DE1436EFB3E29091DF36087E573ED4C72A81B41ADC7FB681D08CA20ABC35A
-51BE69C85474E53D53F684AB7FBA6870930D72B2AC917858348C081334478640
-BFD6781387E5F9884F5B9A2F3F1377AF5FA2CA52EA68406AFAB6C91A888F47A1
-E002AA927D2CC11E2DDBA648960495CF1DBC184F6B4D5A44F1CBD67D8EB6FAC9
-76E386AC7DDC99C1D872500FB355A3A0AC805C1E00947F8B82B918A84B1AD2E0
-3E881C0E82BB047E0275CDB9E09E1580DB2EBF20FECDD095910DF6EE017D79CE
-6E4590FE4F14BFE554C625122FCDF115A6C8D9F6FE0E9AE6A29BA1F7B2311716
-E37CCFCD0E972F8CF909939007CD86D2AA045ED816AC1F330DC706C3ADD1D239
-D3FAC4AB5CD5344994EA1978131472A279EB0A8F9B9380333CA610DB402B679A
-0773807938FF12E8244ED2F0D75D6C5BF2C9AADEAD23F8D5BE373662C8485AF0
-66A33CF74C47C41995581B77AC05E0165E15173A956E59C6DF4873092C27986D
-ECA1916C2E34439E1952CA26E948E90840495B9698C2FD3A729B83DC30A0EBD2
-DF4270B5209BF65B841617AD963AAF85FA87CBED7158A4268F2F9C8A15E9F4F0
-C665FD784CDFD2FB1DC812AAFC7239315E7165A6B09E85D55C23E7A0482A6EE6
-E3F7EF9C479F66538A7F8FC39336E6CB09A3198E701F8D9C1CD3FDA395962097
-DC645A28F27CACABC767CA49D2DC82D41FE90279348184E415ECE21B1A3756B9
-F7E10BE0C2002D2DD040983D479C5E1F8A95DD7EF37E795B7C0DBACEFA209C14
-A295E95EADEE1CDC8A35E72C77ABA8DC344D00E2186091CD6420651F6D67900E
-67C6D42D0AECF3906191DE5996D7A9E7B78FBC03D5D7E9974DF81F1B203B6D1B
-BA18F089F2A40B72E69C7317D753DE2495E9EEC907D099F22EBB8AEEA6D65B3A
-D7EC581B0A8004F4BCA4067A66578D68CB9C0408C0010DCBD5A40D51494A19D1
-E586028EE13A0AE09BF2B52E4CDB383BACCB87914AE039A38A24282DBFAA40AD
-76D344F1F86950333AC92AAC28EB2B07DD65C15877AC6268091863E89DCCBF46
-F7796E2668AE126B9A74244BCD97445947031D6AB1C300F271EEFBFCBAD1BF92
-779DAA45BAC4E773C9222E73F14F1EC37AD10E663F836BC3E9C6DD70330233AB
-D8771658AAC8C8805D661334ED1DDF293DAF461212E88D95E53D5C23F3086DB6
-BC1BF93B1F0A90C0AD5C3321225F173D0E407D006BE11A963DA4FD5A1F189E1D
-04E40C2BF9162ADF3F8B672CE9991EB8C422B504F03C1B253290A000AB95DEFA
-6EF50D0F27CCDC324A7D8BAFEB8C5491377809252CFE69536FA3641090BAB758
-8DDF49F33CD14A87245F29349A09DFF54B8F9A743A5C20DA6A8178CB4FCB06CC
-EFCBF812158F6169015C38D0003E9D06223D3BC56E4585CD6A74273F5204CC13
-14CA969003A6D705CC923E268760A0A97E36A2A21EBCCA8ADB66C3798C08DC92
-7797F5CD56CB80CC88D00E789A677106F9D612725E5E982DD14E5EE696DC8C11
-12FD5AC302CBD81E03089865560659CFD4B4B770BD3CAD2D8B7A8861E7A625A0
-078977713FF4E8502B21B15AD68CAD7284AE50D0FB611980B82F99CD8882AD82
-6736661B89294B0DB38F4C65603F9EC45A0897400657BB67CDA50A67C94EE235
-33AF76525858D303CDA26C14E355132C92E132EB84B0D6297FA50620E36895DC
-B02B2C8562486AAF6D073E80CA875068774037CA16C01C332E799AF99DEB62F1
-2606727A6E4AE8715B98841FA84228DFFA642AE1789F45C86C8245807835C584
-BFE5F7EA749402E94A40AC9C72FFD3AF52510728ED95030C85816A117A6E4A7F
-B223430CC9A9AA7CE31278DD472D71E47A2D0265EB47773D14961888020A0259
-64E9E24B35AC6F44EA51D1F55CF7C7F3D7E4BD97877EF6562B49A842F6ED087F
-1B51BA1F1EBDF4C6443F4E778ADB0E990E5658A97FC203C6D210C16294C74B54
-104C616A58D1B0551CF94C6A9A0D2AED37A417E7C105D4EB2F45B4F547B814C7
-730342AC615286E4ACEADA9948C237F2F3F268D5DB47AC4663D485C60586245F
-E25C0424C4E6F56FF33EFFC35BA38B0EF5A4B2131CA9B516F6586D63D73A13FB
-867FF248CF66FBB2074098C05B3B1CBB401496A0D6B0F2487D1FEC7799AF3402
-00402CC895168C4194DCA7DDD0AA150CD2743DDBAA19A0EE9CBBFE6D6FB15C9C
-C6EC08DB9DEC8B5D3F1883CE2143843EBFAAD522447809E38C1FFC492B8A7400
-6C8DE288479664226DBBACFA3D29E6A63221BCC6939604DA895617A7FC99E15D
-72F4FEBB96EFD77D31B13D7B0494AEB0D286058FBBF013DC8399056C7F222332
-CC93202FF57BA3E51E10A873F20FCC95A776CC7EEFFB46A920E00A5B34FF82D6
-2D85C3A882E187199812BD1AF4C08FA09622A66C1BFF2AC1B7A8E36CC2C0C720
-4BF8DC761F23D8630C51AD13E55035A7AFC0BA10D87123FEE5E51EBABDD9CFEF
-4ECFB3530DFF83347533286C93C4C728054785E7A60516EF699351CA4392626F
-4697A64B3CE9995C57FE35878AD42BAFF0A4E511E18C94F740689D0C37850727
-4C48333BE8C6DF3E45204A752D791DBB8C972DC6F2293C46F8D4B06DC7B6116F
-3AD7A9F944B99A92A603C57BDDA29E77F9419E4E9885280AC3270352A38A84BC
-B10821D43020B2FFCA14452F8DB602EEC9201BCA8E538469605F5CEA321C8D43
-59660CC2623E613071B31A51FB9A48DF6238BD2A0625D74F3ADB1B67D51754AC
-E5DCAD203DE36E54F93728D88DD3A9684078D04CF9417A79894597921E636C32
-4B18C4C3A15712B9E765D8E53612FD66CC91C6B6EA4D2B93214F57C7BE19428D
-CE545E76188AF078C1CEF02D078645039382229BAE21580C5A309B61E2A7CAFE
-8A9A5E378FFEC21F36D2DC50674A7DF0F542C1D81198EA7861DB611F93E50E41
-B1844C0E761CDCC7D9A3AA3F11DD2B6524CDEEC67936C578A47918AC9A12221F
-6941DCB91587A1BA4D407E4CC7DBF883A4225EC0407B03303841994D254F04BA
-A725F0D9061B52D72669FA70D694E843A80BE0D8543DA6DE39C3EEC5FBB145A7
-8A41EE0C62F2F67999F4BFD255D279501AD97B94037E9FABD4997DC02C2ADACF
-82BD90C64883F4BEA139B8DA0931CA0C618454A19B639747CFF20B6741FAA7AD
-619B8DA6EE7569E6FBD4BC8C48E5E604A1F06C84C492150EB01BACA796F111B1
-4A10F4B95B2148AA66104BF95D064960984BC2A1FA25C6BF7A8B6C9A5A062122
-B0D1D705F4BED1AB70D5609CF5930D48E0292C1F8E07C50411F8B2980E36BC43
-10AC3CE58127BDAA32B0F771119C98F8FEE653B93BA2080CDD5CC2F5A2D96316
-2E40D79486B2C9DC53A6A92F523263C0D789EAF5A2EDBA95F5BCBE2AC4E53B97
-9870800E256D67DF46524B6D09714C3802318C52B7C24C2A37832E2238487362
-BA7DE4301CF1459801F03C5D4D3E83D502BBC21A4B0BE461FF5DD5E3570C8DB6
-6373ECF760002A8D36EA3AFA7B513AA886F44070E6BEA83A65F1103BB33505C4
-A17B2EC8639359548F49F5005107BD2CE0A5FFCEC5C2ED08C9905C5D31C36247
-961A0A1638F3E8553D5BD8CB1E8273A552B2BFA3E0B20024D0D3E2C710BAE20F
-58E952611A8937E30E1A3E57DE281897A638B4620E485A3D792D650F07806B12
-EB8803D2C0AC01B3DD975B461BDE462A5063BA108DE6DAE031439764C95C9A28
-84BBDD4AD3A67671883623EC2580ACAA99051C344D3CD418C583044813554C5E
-0B27B7F42EECD3D54BB7B57A788CE239F0B076029EAEC2257A5C8EF9B1506B71
-289FEA35762F47EC6D30254499D4C2AE0BC6723E560B0F6C8C137719F68DF348
-73DE963A4F912227AF342F82ED46FA1FE7EDA82B59CEF25EDAF5764C66A899E7
-08B0715CB21C10B318EF66E5454FF1A7B324EF19E226EB1587F8AC0326F55D03
-9290EC6B01A9EE33A1ECE1C3E2FCF4E3B7563D3A77FB4D40BBB8FFED1C858042
-8D4A83EE2DEA47CA2E9A9A59570B0C8448AE0F8C05A4C205BB4C20E37ABB860C
-82DE3869F24BB6882E08F045DB9147D6E83D82D0EE5EE7596FC89B23553039F4
-449C6E2629BE1E78BE116A98E435CEE7CEB3D70D98AB93F766468E307E11FD41
-C26FB0E90F6D00455E229C987A128FB36D50BEE7953192FF409E5D72980BD49D
-32AB7A064CCA9431BB605E68F5EB862218762F7C3094CCD0206C0383108222AB
-EA8129A384294BB9179F412E182ECE777D34269CBF7607555AABAF56159B724B
-67EBF49667E47B7988E5C81422540766D26462046894A61EB9F764746062F06A
-34C3EE2767798433263E6D3653FCD6E4C43E6A5F0BC762E77D4174F95E7173CE
-A03CFF3A204C72773A7F6C301AD3C418A93042A5C479200D13EFC4229BD31602
-9D4ED8CCE127A1A900B5CC3F9B292301DA6CD4AD0D5E1465BCD50C11FF9F4727
-E4BC06013CA5F0FB6B4E26C5636217774935F63584F69D7797E6A871FB51B3A4
-7E3108E160D01C4DA87DF33FF40B452E8A23144649A72A04366B1B3B026C749B
-A897D52C40808BA52ED82FAD0A6DAEBF41F24D5B9C705C7F3AFBF38C923DD3CD
-1DA764DB623D1E0AFFBAB095E9C6FD5788E91CF697FBF57B1525A0164E536F82
-20F532DDE94CC1C2DEA0AC7A41D75C50E875D605DFAE0FFB07009EB4B627662F
-C1A17A5F8AE3DBC794023639D4E4328C55067A8AC921EF54D272E6F6C60EDB41
-AE35943D366D41F12C2BADD1A2BF17429EB871204A309DD6A3375992111D9AC7
-902E0E7A62B85A1BC6FD35E11CC132F37EFA0B96A733FF668EBB8778FBC2B799
-33AEC8E08E1576545B5BF0E1BA5D5766F22E29E51D404C25F3E54B77D6882DA4
-B491536CEF9DFDFE15362DE2FE5221D30D2D6F15158E57CE561C88F277FC975B
-616887F1ACBCA8789AE0B854DFD86FB544192E0382BA380B79076A825EEC0315
-35C892FC89E778A71EAD7B9E578F849E10047154FDA362DC45E5FD1865ED2D5B
-F701D7AC0A35626A34BE036EC912E4C4C2AF61B55E75B1AE8D8FD27767696AE3
-AFB440007C6F73DAA0AA62C89081D7EF6B02751CDEAB00488A591E8F2E79EF94
-53BD8FEE595A98A986BBD053A3CB86DB5B039B0F732438643EAA64E5DAF3B6F1
-9E6B4EB430B9E7D648E729EE569871AD7DCEEDEE1851238DE9E23BD10E75B7D1
-B7E02CE3F22D27D7E262BA786D74EC0123DD208030553C0C5E1D538604F7F438
-858D3234D566EE22C36C2D09009322AD41D99A5D0F4404A8939E217CA32C5092
-0E72E2FF0991FF7B882C70F56C7B40003C599A8AE5D95B74F523248B1E8A0566
-872871D3003EA4885DA511FF01181DEE541F6795BB2D1F9EF7C3DC229F153A9A
-86BAF08D4BEBCC0D2B32833DDB4639226DAE13E120A99C5795083E80643C153B
-12744DB8D138E17B3540E971192EEFF244BDD5E799862023C858B885467E9E0C
-8D2405D1DCB579AC44CCDEC5AE5254A017C6ABC65E4B072DE80E9683A9A9815A
-23A0B829E805F069A98FAD27F3383F45A111AE854D512777FEA721804B019A6E
-E16F12CFDF017093A2CF52A4A92683E3B225EB0C99EE5AE97BDFDCCB18C5A674
-F48DB9AB89038911E912DC1190AE495C6BEC4907D0EBCFC1CA4E153480285B87
-E5C03D8742A43382AD893B58CF1CEAB04AE2424164AEA7B3479205A0B2778AF1
-44663E61F1E8B22F2670D11ECB8C8A901557F382A909B274B20725B1562CAB3B
-C57C8F857E9B99E033A41979E4EF543FBE70074F85072866D837954AEA7D9317
-3744DA0394C9412457E1C2188728371638DA19CFFA2A642CB0D2DB3A0D56F1DB
-CEE646B9407645BAC2A3CC8F14581E7175B1EC76B0BC82EBB69F9A325A6FD630
-BF9FA4967F7A42322E2A568B9B6D9878FD68F2254908EDC36060F474346BF78F
-7AF59EDEAF883489CBCEB0671CE77FA180FF7998FDCA6C4635785D8505A45824
-7EEE6F60384BA5AC06D4A19C0B127E15454A1ECC70245CCB99E271E83E42EDA7
-CAB83D34ADE335F91DABF3F0CE8A5DC8D4C0EF7F250391E51CBFD1C52B92C43F
-CCA1A3B71AB20E995E5304A031060FB78B663E939470E0F0A9602A56E0352280
-AFE8F87758508DE73CBEE78EC452185854B11B280AA5EF1D2D3BA7553CF54FC8
-1B73EAD7E3FA7FCA7E8558FF72DDF68B6F7E50CBDB1B51D3D50866F1AE4AF193
-BCB3D30C14172FB5F9E8A572F83311F1C8DA3C8FC589D01F32B7F96A794812B3
-E581012FC496FCA018C5E9C35C0C2CB6CC2E03F7BCF993B8B58AE58F3EFF9F18
-C49B86B75F8B33144A1D4DB7CD1C5F7B1A2C362D1C7E2686ED7DEBE396116230
-FEA4B66E13A90CE9C61656BEB535691E3F3536EEF300AF2B7431770DBA738220
-CEA26E86305F960C867A56F6C071F41CD6F5A0B768FEF7B5B29E75FCA8F336F5
-FF0135B4A715CE926A7B78D6441053AA2515C96551A08CB94B77920C8DAB9C72
-08C6A760677CFAF137665CCD19366603811CB5CD52D512FBD763BD62931BD5F7
-DB0BE87955C0AF863D4A7B7150F33222E24FAD730E0D29FF7A88F5BBE2272A3B
-69BA5BEB0AD926E9FEE21E8BE08DB110657546284DC9E724BD0C79EC3361C07F
-7EE42824DC1CB72ABF5FB3E3DE9CD4EBC1482DC3FB57D84EAFEB307378EF4B16
-7EB0832E5AD1D1AE04CD5590CD3E0042F528EC79E292A67E38EE3EBDA2335B1A
-1FE95723571C040F7AF835DC7493AA5B49904EF6F1947D26FEE59628A5331DBB
-4EC4A21D07231E85941A435A74F7DF7DE42035FC3146FD7921D02F20767A9797
-881B24164556762476E17D0EF873F17CC4BDE322E3A5241FFECE04EE7170E0B1
-835607C7716AA603FCAD9EA5FD2AB1F718733B58F31233E37A3C22DF2C3F52D3
-4947E041AC29A07EBA98F0261E5C9B5E280B7038568E470DB4D6DDE3ADA5B12A
-69F715BD02F4898F9222A0DD58647A31EB890F2592A4AD7DBBFB7485BDE7066C
-1EBC43C9873052644138AE98A18D4902960F2B709D194003346B0B6F810A8AD4
-21D63E3142B7589916B3B4B56C62C1C0FCE1713379EFB8E760EE7295AFE5E4AC
-2C38425CD1E4056715ED2F9B4E31E0F05AD10E6A52F4CBE25F37377A4E9E08E1
-16131D26CF7432D5F289930BAAED1E3A444E011653ECA7B9076094B5B72571A2
-D29E7BE5B062B0A69F7AF0D20CDB6F156B63DA9CA564F483395A88206EFD6569
-48C59535FB7AA8942518F0E85A8BF56E0E8E30A35F47C948DF5AC6EDF01AF41F
-A14D10ABD45895C907DE950927DBE09F79D53EFFC6F5681D715649BC42E8BDB9
-86894BE664314DEDC69FEDF7EDF2347DFCB070CF591CC8F8F14C04D7E665C0D0
-A413590A72D242D6B619A83DBC75754DA87F980106A17B06F299898BBE8C51DF
-70A6DBED6264DED8D4977BA25AB7DBA3BCE39AF7ADF8744170E7D4AED20EB63A
-EE248A5D3009C47700D73056995596A2DE0C316785F2CD4C12B442A6DECDE45B
-9C0F023599FE9F3FC5658CB23EABE96D597812EEAFFE50F9C82CAD33625AE0D5
-FC43ED0B732954F0058942C1BA515120E7D77A61028770A3CA029DB5FA12B06B
-DBD4ED00AB9D53A705215898CFB295D53B38E5AAE8589BC0CB1A942D86DE0FB3
-DFA195D7075BC0F01B4EE3A069B115D237DF36E372B650903CBB4EBAD1D6379B
-0429886D3ED160743BC13EB1C5F3AEAB78D1C01A27FDEA6F1D977B5F53117326
-2DA2DB70686F72280200176D138796F7730C9B883D56B8CA95A59AF0D7E943E0
-230D25BA4B738DD45E7923E09DA7D53B9E20CECB40247922492A5875D4EE9F33
-01251DC67C2D69895271F9747D0DBAD71C6E1BB31E734AE795042A285AF9574D
-63913566B3EB07994867850236FAF20FA42EAB0535D5FA5EC4CF80BB2B13932E
-7AB189A5B680852DE51A2417A70AC10DA02549E09CC96FDFBC49E39D1874A93C
-2A28AD92F036B9CB36B5563EE2992268B1B02D11E4E51D8F3D6128DE0133BC48
-909E0C6156E527C9D87EF5C577B5E6789D4307F2BDA049B17A489A32DB9BF19A
-A181375F10E7AEB96561662DA0F6748D37B99D116357AF029C6A25D761953BC8
-A91C2E06A070AD94688BF7954EB3D084EB4E3EB03E1DBB91AC3F3A14C8718981
-0EBCAD4DB31BFE5ED25382BAED473B29F07E225AC3B45AE131478E544BABF7AB
-C5C59D01188347A370F0D0E937D8F4562F2450B77D871C775116DC8B041C0AF8
-FC8C9B67C4474A8723ABA7D4CB318D941BA18DC07373EB74822D41D1C859DAC5
-F14A7B1956C000E545D6F617AAD2BB0D545ED9FF3851C123A32AA012EBEED2CA
-D81FF7FFD29174655C42DD6545611BD3B00F47CA4EA2D9D0CE4A01523CDF352D
-6A8A2F201EDCE2E6CC5D6DFA6DCDC12775D5261EB120056D88E080E5F5CC03F9
-F17427E7F8A02FE5C8F3B125EB22DDC9E79640EEFC4B643C915734D7684B873D
-51940066B31876F5A58A3B7224BC067C7476B81210CBE89E0714449CC7ADC971
-42EA708B18C60A9895B6CF391C57E815D05D8FD40A12B6564C812B371CCE1B9E
-B7876C9274B6716C8632F07302483B124CDEFB9E388AED5E330E8DD89BA229DE
-33331F6345FA3505FED271BC6DCD0087CDF347DBFFA4F35666BFA5C1FA6DE923
-97A056410CE3055CA869D9C583D801930E1BBA5BF6E6F2863F59ED54DB785010
-9F2AE393AB3C939BF8AAEF7AAFA0BE486855B4CA5E3430F242636DCA37FD0F38
-0315BD038B071C53193CC56934A5D428BFF9AD882BB5C3C639A3FD9693721E3A
-7E29412AC40F83C609ECCD2C6B52D93C8F5FDA19E1BBFC88CE8D0867D3A611B5
-A4C86E617E6ECB65C4AC34F7C40444E5891308703A88379BD35EBE3FA6A65EC2
-2A20EF94D793591F1F6EBD5B5AB92BEA002E9FC9C665AA1DC0AA52F4E5FE4E84
-F425217C32B82D8EE65A9D74B74EC359A9F117FF6E8D4E0635512FE4F387C6C7
-9B001E708417A717CD007D758CE443C0992A12FD65D06AFFE668E7A8CC2FEECC
-7C06025509E5C8E89D1D889480EEF3ED695FF92E7907860065C632DA306F6F29
-C434C5B6CA2A230F5FA0E33AF207EA5224B8603A554D5B57F1D353AC785FD431
-71A1473AA77E5EDD11FBCA16BAFB0057B12A30E3272164369F36542D813C360E
-9E1A3E8523A1723F786F34AA8ED9C5E0E79BC8489E65CC14D444D43EF65E52B3
-9937BB572F745603D59070B19A99B575DB41E09603F7A1F97BD603656E7B8F93
-B5168E3329AF11BFF6DC7163E2FD545BD213668D9BD3503D61961CB6F0CD1280
-CD3C349AEF61C49DE74EAA38502A51A4D5D0397C0F04979399A24C1332BF9236
-DA1A31D9481C13B1263F48A8D06351E2E860E7E7115B1F4FA8AE0E970EFE5CD4
-96DD7332EF2371FA5A2CEBED96A0BC563018CC42F51CE45E06CE5BA442FD31FE
-9BBF37A952BD37B78F06858BAD0B5B6625D943690E22A1C3F9DCDFFDD1630992
-A684A77DAFA50EA4D581074765779C4B2A41E3694FB0CD14030B885324120837
-1601DE07811737E429CFC59B8F4B859B2630FBBC2F46A2693DA6D1AC17034F2D
-68966A6798BF0B806F6A9A7FE369B501DE71DC9378E2005B5300E7E03693ADE1
-ACFF88AF74F27AB46304727A54EDAFC01D1E80A7E27598DE8D634D80508AD1CB
-0A06BBAB366C11D4FE2A15015FE4E85358EFFB71C9ADF211914A23083F71838A
-85FB2421C14D308CCD77A13E767AE60383F6967C877B299EE7A8C7413ED80D64
-530FC64CE65979D77348049D3A6F38ADB64E811976069F4CA20C8E39210921A5
-703B878F6C147316E8DD47066AF2D551161196B0C9FAE339104EE8E972932592
-CB04F23576AE3A61727E4E516FF3044724346D639EBA08111F1D18A47EC2B48C
-8E71F694412F029C85E990F099CD44D3BA1C5D3F2D8CDE64A3753BDE633EC0DA
-8D84255DBB77A07CBD3DD87A3993A5C3FA8C646F36FA02FF808329922028FE03
-1CA83777099D4FE72DDB0A14509865CBB53B44191937440509F542F3EE5DFB1C
-C124A4D58C22D8C9CAEE5214E05AFC330B1BD639651644F3C5E45B2BCCDC9AB1
-EAA1F69A5DFFAA62BD117724B278907AE755E2F9D30E4FCA48219D7840B2E799
-7EBBFE7CD2D02132EC89DE5340858DE4A670E931969B808E5FC8E1108EB3EF2E
-01C8E758532E78E6AB5E5B1F4C59F974AF1F0AB5F2FE1BE61E70F71920960B09
-1B5668527F343DB865947B284456BBF00A696353047B812834C59A166DBB8BE8
-92CE57146E59E8DD2E1CF1E356614AD29BF34D6474CEECEE1F90D3E776B0DF8F
-CEEC8D6F49714CFB6AE2CD7F77168E8977CDA9191C25CFE7A726CF78BC41A535
-09E66A3A97139535AB94B385E5B614EC835DAD2756F4585FF40483C65086AAAF
-DBC5F9A5AA28174CF307A4223D27E10720EADA0B5620C3C85D211D00017BC843
-B3F5A207A41199DD72831ECE3CE0F674F5F942AFF93D541651CD027D82E16179
-8ED292C0E2E5D4489471F860C0300E428217BA5121CC668486B35EEC259EBB28
-B0CF1AA02B7ACAF293D22B618C537A873247E4911B2ABA5B784728B4167EB1FD
-066712437790A213DA5A370F1896735DF6FEEEE02E2FB0C7D907434932DF650E
-65566124FA36D25812192E6B2349FCAB5AB2F78B5DF4CA8706230B78D6E70F9A
-3CA5D6CAA0CD72D2269D74A4473D239AE7E68E1DAE8217F890A4889396F86299
-1E1A3AB1C1298DF1C22A1BE1E665C6D4079B94EF89E816F4FC07843FCE5199A7
-20CE6B6D064051B9A98304E3C97EEF2F900C010E06EDD686CAD64F853A1E22CC
-CD9E47056A63A4E6CDE247A8903A2309B61EFF86E302858F1D236C5403F6DCA5
-9ACE76A2F51337BAD4A4221FD721387526DE8FE12FA25DC7802A111D96E6D974
-48944AA7A92186241F681392B54CFD91466EC39ADE17F24470C44DEEFAB641EF
-C9F4D45E9DD2911E9E50C150186F4D3395C2684C6045DB59FE947DC169D2149C
-A591690091C7ADDBC50DCB395A16334F68E73F3E222661838B1F74C4FC2DDC25
-7F06CF877B94E1D859FDC8CA40229A43D03EF76649A6AC920F73D8B3928F161E
-168520554BCBBF957883B7112B6DF94E62408E24C89FBEC3ED02561EB664DC8C
-3A72E91B03479C2D3CA8311B7F42F13F6E95D772ADCEA91A6A2C710E2CB3E833
-E94D5E817E2A8E440CC6A3D75C78487391F1FD8B85FE14C22C619C1AB4792BA7
-0B96FA5555FA29A0A847202FE1B32287D172430112C0787034AC9733A09391D6
-B5AD1A920951804361C8E8A4E4364C3E7FA0D108D4BEAA2E5370826A919D6C9E
-AD7A77D61C8ACB19DD62AE544CE5871FEC9E99A90E7DE5463FB6CE253AE40C78
-3523A3CB5EBB7EA51219537716643CB1B24B73EA26F34A49B52DC14F8441E496
-430DDD5EA1A7762AAF938C3DFFEA1934A6D486F9A9057B0B087FC35B7D97DAC1
-E846E39856B07D81DFF0374175FD94ADFFA6907BAD05820C519120FB80D7F5A8
-C08673F2D168394FDE83063EF080B9D1C52E9CE5DB537ACFC3009B39005F3988
-ED1CB1DC24F9278D1FF0F91D2FD9BBB5C746019B00C77C9C90EB833D42610736
-07AA36C7737ACB0DEB210D9C6DC10CE47005E9519C69D6264CA1160818CF0FE6
-63E9CB5FBC59542DDFA431D192C2C6ABF694013024190FC8422235CE88C200DD
-18020DBC11C9E41B12A45D23EB8B56FA7A4BC772B14257D8CFF8806DB05D3F7A
-AD6C71709841942300BB018CE63B35400F979AE4F37A787C10B8BF36A41B8FC2
-1E2940FAA7EFE3BA8BF96F5B9650795132B00D9C8DBB52BF0D182A853350467E
-EB02FC268F4DFD4FCDAA1BB02C9722E88AAEA3536C837E34B53BE9C2837BF188
-CA19639F2974A3AE40A8421DD5BA1DD903DF9B63E716FAD3E9E03DC6234C3988
-5AC8782612EB6F008DC80D0C758AA75D4A3909765831B2068A170AED234BBBCE
-DAA91AA0ECA9AD4C14330A168762D119A3C2AB0D552EBA73196333042B2A2F95
-0DC37909D3E3C38FE9E2BDB8B2CB77A6DEE2D146D777628B35894A538D561983
-55E8F2E37E00E1A182090595C7514EEB78E9D8AD37859077F102AC1496BFA3EA
-E1790FEC4B708738C8AD9C3542482D75E5960B92444D69AC6EC2CCCA945D23C5
-25CDFC2DDC08D599746B686A1485F474D151C326CF5C0C62FFFA4ABBF5353E09
-FAC520B165577FCF2AE0B7E623ECD3B44A0E7DBA7B0BA5B4172C502727283D3E
-0F4B4EAC070DA76E72B911AE6567411B7D59EF3622B213FD28AFE3645B061065
-ED44E30EC1D81A1BD801EFAB50C2AB27443AE9D256D4CDDC907E852BD0B5C8CF
-DF95B90D45EA2262EBD8BC29FAD72D6B1DB7669B2F33A6368FA260A407686AEE
-5C622E7BD7E620BD735A5AD6CDFC71EC5CEF80324CF59D53B945F9CE2EA42806
-E4EAEF0D882FF37FAD4D28E4A68D221A735061A5A25AAD9B73B4EAC3455983B5
-B717059B778E47E00698EFCDEEEDA99C754F6C61D56E617DD78352FC39F927F0
-0BAE0683DFFCF55AEA0E7CBEDF278706D147B6BB099950E1D6410A1F70CD056A
-C79CF45A2F03B522D95CD9056E31A51B4C71A10591BC5AB0CE178C529CD741BC
-0F4C7854BDF9E1930D2D597B444CAF59838AC30533FFC1D39B74D99E82E2DA11
-BF169929A097A4883B7CAB01C37D073E230301F4D58396D428F541354FE82CE0
-B360D5DDD4EAE075395DE968192606584ACB94493670C5DDA0DB8D8500A27786
-FDD7D908CAF14F86971771C604EDEB9337DA9A7C08135CC60D7D5CBA7DC822D8
-81011117F3B156360691A4353C84AEDE652572DEE12790CBD357FDCCB36DBD5E
-0052471DA8B89500EE6BD0BB9994FCF9F949E8FC9B92660B8FB66FA182447EB7
-7728AE2A9BF139C9AE75C9327257026A9CBF8AF1F80D0D6E4BE273148B2111DB
-5E76643CCE284E79FBE70347AD0D5D8F81E6944BD01AA02C3ABF66C27BD39E78
-5B8A035A17D7A8DCD0D241FB65DDA12357357DC0320C0A1ADBA0E17112A87682
-24A37F48F45D0870441DEF18F885FB7DE5726D545D91ED71DC5744D9B81B4EB5
-6CA17C065FFA80815D513A50C5E6762641EB969C1EFEBFF6F022D95F35AC3A5B
-9DE915A45BE37832AF5BCB8FE8ECED6566802185492E24C348D88D7B2AE14D33
-BF71D8E692B0857D1E744E75ED367B1E792F258F7D29F69A2277EF81CEF1C8D3
-D84C989219743476CBD75F8654CB76B137B8249B3A86513AB2374FD12027520E
-EF2707F9DB82CC78E312E4C5E1B52D50E6B21C37F796B40E9CF27E98080D3FD0
-F73FCB06B74A82D5C4CCFD484E8BAD2AFBE25A5B8F1CBF25412B160AFFD6E425
-86339EED833E1485508E6ECB2471393636E58ACCF1DA80B0950A3AC134B324CF
-F7D80AEF4ADBAB4E02DFFFF5D4EA2F87F667142A6FB5EA8414ECA68B302DF431
-AAB49CA5D8120C95F6C4E82BBB70DAEDC7DE821AD4B5DF4796E23316E5D20606
-DC9567DBE6F5A06182C3B9848DFF54E02EE26B6385A6F7CB9C5EE0DD0CCDE6FC
-E6F98D726F64F190DE1C523B1D4472378FFFC6F7281495DE8C36300F2B696308
-B6A69407FF6247830D3E1A6AFEA8C8DFFD63A737CFDE9B9E1780B93EC4244420
-9DE722676A7F64EED5F13BBFB0980BECEF18E55D12A34B13A4FAF0A10F74B88C
-59A45F668BA03B900D9F2D1D8220E647132604DBE8B06E0EAD7670A7D7485DF6
-30E8C003AAFCCF7DA4C3672EB8B76E56A9F7F0F5EB631008234A046205C7AE83
-36BEC5CE37BB25861DDBBC4539C38E2D99E6B17A0497C919D5F3309C30E43281
-C714450D9F883CACF058F8DA7B93192F76FEB29EF1BF10E262EEDBC797D85936
-96CD3B3922F727DA98F359DCC2347FA95A7905B5DEF2F0B3ADC90301405974D9
-792BAEBA9EA0070FBA6C842D40497DF039F975F6D85D705D3F8DE8386C8DF996
-39EDA645F3D1F7DA2B87EAB5450F40BDE12B26D8D4A3433668E430988C1F7D34
-0748FB4D4F886762140314F3F2D1D16CC6439A033F8068F048179605C5FE9023
-9BCC22B5D7B4E8E9A1F66A5A9D3A888257394C353C835BADDD00B2BCD94D46B8
-DC3619E4CDD01FE753166022055ACD7ABBA49BE217260A47843D3E7666A90ADB
-E3ACA94CF7AB1D73D6230446F4848E5111E03A5C7DCB1CEE340ED84F40660D75
-6FE5D691F5327A3314DE7622BCF2DBB738ED7C7B3BAB9A975CB2E739161DF51A
-51B1902F65E6E68D77F2ED65FA45B7338AACBC2D6536BCC67B965C8A2F32B576
-EA583CEBAB347A5BD4CCE61EE80200D886FBE41913390091C747D12372DF4A03
-A2B68A79007FB7A8A87CA0E7247F0B36717C95944C34932B0B5E758ACFCAA071
-4DE4E88E5B97EE25E3503045B366EDB477D362C34978CC1C66D4720DDBED2983
-A2F6B75572F935D08E16FCFCE23A32B9C4E8BD895759B96F64D4B1509E0F50B7
-1F2190A352478EE247BB65E5DC605436F58E7369C2A5ECA8744FA45B251FADED
-388F1974505305A520E2B39B9B390DF9170097D17F36BC0A52C59D25BB5D0AD8
-52A9430750B489AD524F7D3AD811617E37F3628FC6BF331B6A8A3C1A874094ED
-5C5085554A5B16D60679E9825FE8BD11C4E5552D5AC595745396E0AB8FF21EF9
-6BDF132EFF5804B02FBF46225B2DC521FAB66293B1BCBFEAEC26DE6BC7BB58F8
-746A67BEB786E5BE2642B24D93A46C31EFA288D7D0F3D54FE578F0339123323C
-75F1EFFB112F0A4D711CA88946E0CC691EDFC3BEC310AF1354817736D6F2D5AE
-D361466EBD8F52F0D4935608FB2F520A49F771A3A19BBE9AADADC4ABB9006844
-7503D94FCEC7DCBA66D258A76E8BADD54DED70AC66F0EBC6F052937A94C13A35
-734578911A9B39487E51B0F5BA48DC09591FD5A1D45ACC368D91C3CD3B4A9BDC
-98FF62111F1EA93313568A1162523379CF2BA6A240AC489B3A8963E42D08A8FE
-EC22C16D4CACA1B43606A76A9BD512A9DB20A40C3CBC9C35C2784E4BD072C04A
-74B267B18ECCA5F59DF84B74A361F5406C582BF99B99F69AC1A4F57839E37DE3
-B8AD9D537AE12C66BBFEEF8E7580273201FD665EDC1B594055B8D312C303AACB
-E07365CC0C78B98A9A62032438D806340D1BCF852924854C4E50CE53BCF8562E
-F632AC26B18AEF9346E29B019A19A2ABFACDD303AB7630CD91CF68E229F5EC79
-508ECCE0E44B8282523ADA80350D28B3646B62005184736B434FF29472B67D27
-27BF7DF359BF0B7A8CE5BD7B6F49126E8C5B429E57910ABD55CAD54BE35A0F15
-6E50601498CB9F0AF7C88BDF21E6D600638ECDF5F17AA25E25F4ABF98D91E1F2
-2AE15BFC7D8A57924F019506D82083D87A24291B1DD99CCA652ADBA3F08F69C7
-5DE09432CDC283A3F139FD16B3CA7B15106795D5309D918C2D3302548CECD9D1
-2CA6690DB242949D647D835D86C94709BE43333D81F800527DF0EE89CF11EA53
-C5FB7B0E2A5C97477DE8AD164228AD96A646FD9BAA1D497EF07760BCB2CC2C23
-2502F8BE7F8AB201AA730FDF14038E60F137A5BEB60D9A43EF3DE2D9417A4DFD
-136EC1709DB3871BA2287FAF13674BCACF09CBD5CC9050A06989740A1F9E76DD
-12D8CE4739CA3E15C41EA616D69B1FE079B4A26C45279A105FB53E75E0C49D8F
-B84EF948AFA24A920699BB185FBAA8A85282F97710E82AE77AC3F32174B754AE
-306DEC0094D9E4A48C9F91C2D6662E68B29C56C9367E7980B1359D3DF33A2D1C
-DFE766DB2FF85CDE7E591B991D135BDCFD8CB5EADB07E3519C921C6614D5DFCB
-1990A6943CBDD41ACBBD5BBC0B897DB3E0A89DBF059FCD9AA77B2E418A118721
-AADE7767FED3BE2929C192165DEAE40640040910AD1E205A86CA27D586C4A9E5
-001E56960B9D4905F60E8A7298D615FE09DE4218CB463A89908B6DDFB6BE54D3
-745F090F39333A06017CA640FF1CA7F09B563EA8FF89627E679294CD5C727D25
-86A4AB9AB2ABC2F6AE5D0C65EF16CB93C42866DBF5CA86332526483E49651277
-11A5D0F1E6A64BC17A6E76C8767A125FDE537D12FF13B8D274E35A3CBC2A89E3
-9E8C55C2AD70B607A624B0A67E0BB449C56559D23BEFF4C2BD99F67FEF973C1F
-90F938CD1981C7DF56AFAB82C7CEA98AC7216E2B4F80A26D68C491116A6BEEE4
-ECC054F7DA563F07C4A18EFCBD45A5FBD566EF722F5E71D5C95E0FA2A33ABDA0
-07EA5CCD03D569DD830BFBEB88C7D5DFB6B301555B2A14F15E565CCB4F12B60D
-E6860C297F90F9B8A0D39942888CA8A3B8200D5368DEE25B0C0432377598866A
-88201A65C0716A3DA92B2C3D05F20A0143C841E54279AC22DEAA33A6C75ACFBC
-E0C803F82F6E79D871FEF0F56D7B018172FD281CAF06D1FA247201FB1CE5081D
-3CCAC6629676C1FF1B0E64912311CF8196860048DF27FA097CEFA4C257C426CE
-9C61967EA4AD40E78793F4992E30D865257AFBE6E3411547CE3117868C7A0D96
-887582614E2D8A2543F9408B69BFFA44494A9D469722486FA1A8E84881443843
-4CE118ABB689CFFDB6233835669C2640A60C376866A9CC1A4846817CB26A2862
-CA8F4F5DC66174C7C62F853F8704BAF1B8BA8934451B73C9D23F7857F53A845C
-E937BFC1DC27451FFFE0C75008FCB9A372D1E4EBD771878BCD05D9B3C598854E
-33D19ADB2A50CFE4D82723DD4F94BC6880EE00BA9541069BD5E6A658F0BAB38D
-769C47CDD3FD7D664A35F9C0758DC060415B5514A31C6BC5E0038E2B4D5B6B9B
-C246FD9A961E7AEB4DE3C4DF0CC1F3D4CB0852EE3AE72CAF18AF005AD96224B6
-7D9462A0C747679B00D81AC906B64C5B8D3A500A8A1577553E25E1A7D91AEEF9
-FF84203A025933E56A0ECE5735436323D6FDED9B4FA26274D650AC3DBE4B0AF0
-4ED960E495203FD67C300619125257836C9DB76F650AE523401EED4E5824898F
-A1B77C521C1A070A5D20BB324C90207B01A0B86A6F42DA7ABB1B2BB2F8F99782
-4331894668170332E3894E80A5C43DE08AB3AC4074B1DCAA5B43BB354C54B749
-82D17D9B53CC5B4018CE4467D250B4F98036B0CABC0B149FC7B2172D60FA5188
-512E7801FF83AFD47B0E87ECBB64281E3ECA9728A30A3B98681FFDFC8FB161B7
-D57F511AC4BF30C2D548B9D38371EF4E3845C5726C8A33B20F2013833BB68268
-A326BD1C199E3FE776EAABE066CCB4C80BED3B558BEF58B6EDE92A692A8F90A8
-45D322A2CDE3EA8DAFB316B510CB1835AF292C30F58861B61CC3816DD5953673
-2AC0CEA62E52CAF6F60FEF21B726A41CB42CB7202E3C605DD481BB7072079903
-8F5A0DCF8142A83B2D746ED1E11521356E57C07402843B6F34D5EB212143B5EE
-7D49A9CD2ADAEBF0F3203AED4FFC99B05A05D74F8BC7E9A7E0F3CC73CA87CB1D
-F734DD7E6DE90680D3DC54739DA1783ECF3DED371BCDE79B86BE61FD0C25C656
-89BC9B059AF6359719A55F1E095558673B2B6BACA8087C729F7CCFB5570631BD
-B87A8BCD4B6E1BBE918A44CE8FA4694670DBD43D2D87A8F04722310F2893256F
-6C9F2BC39723FC1504FE00753D76554776E370385DD79F72322A8FA32F1052FC
-A6D8AC2807EB52000FA90FE1275C8876ACFB3EE0D81589920F00E00588EDAA3D
-A6F2C43E8400C13690D6120286A3689F217C6312F8ABCECA44B8E11DF75AD509
-0420FB5AF0E18F7BFC7A69C20C9E3FEFA7D951AD9724F425F38502EC29D32E28
-9407B9E3601773287512DF1D279F0B18B856367996317FE0BF47A30DC0AA3A72
-F1596681512189F0D954A454A16C89F0F109CD95E845CD1C06BB122E8D58D71A
-EF61CF589BEDAD6ACF19B30ED3431E93F73C9391D3A31CF94DEB212B4ACF956F
-B2A859BC2F96A5B52C6F5DDB104FFD2EE135484C53E4CBF8F4C9208B53E64C88
-68CBD15D46897DF78E2A0915CB550EA70103C6738124A0639FE3498C95A8A1C1
-3BA81BA5D5DDE68DAC731A5F84044D94B22462F47DFD7BB38B6AAF0DBA52DAAC
-086434027B5058AF07D1307D6350524029E226525E8FED9835D9D60F301F1D61
-8E458D0E2C7F243508B6ADA892224766897B70B55EB9E6AD6BB39B1B639E6B8B
-66B73B761C81CAFEA2EA01E1C3C64BAC284DF366B24415DCA1498377599D9248
-A5335694C94E134BBA10FA0B4B53D2ED32664C8951308966F5BEB37E110E2D99
-EB8752F75839EF2B602BCCBBC7BA8460332BE43327EC7DCC8F0F57CDFE262AFA
-EBB720D79DFD9319BB889BB0DE1E2E0D064641764390258215CDF0606855934B
-7C8C0BC1AF945AE45B40B970FF4713086769EB30BF30F272585F6EFE48525474
-0C236B1F4710977AFEC9346C8A920D4A8832015D401CC2A44584643DEC473950
-811A3B476B3D42EF845657E45D390B873D3ED65C8D9C3F6B0C189BCEB6B46A11
-E103B9B0A0DF61A899BA5CB68CEFA1297F156CD242BE975326849D2C21DE504E
-D4FD3CFFF53A29F671A5B3ECECCD598010C52CCD451620AB99A917C3DA3EE592
-98D726DC6BF96E9D73EEB778961242DFF2442D8791E09E80853A7F16FCD9FDF7
-DDC4186E54C200403DA07294767C219D161ED55B8752793C8FE1810496C3B855
-CD797C653DAB010CA1909584D6F42460ABEB8E04B8A472D177995DED8ECBD456
-99C7A2D42C6A64F8CC8B14FA0B06C98E1573AE19A086556CA062268AD02A3C2B
-BFFF7947BF44979A39149E124C564CBF1E782E55B219D13E87B790D90F0AA463
-E2107C5A76CCEEF736A73ECD38C30BCF527AA53CE75B6B9DFD35288143610D4C
-4954585EC5AA5F9DA22A5A9F0AF66BB8296283053685AF292FB8C891F0386ABD
-2DE33BB1F86D984DE21DB7129D28B06DD6752877F78F04423447A8D65255FAEA
-8A6AADA92D06BA150D7F4031639F3DFE149916186BC2FB0B6B616AAFEB7455F8
-78BD9E857EBC914457F1C2927BFED78CBB77401B776C698AE100116920383BBB
-598E41582E679E99DEF5E5E50EC75F20089C70209AE12D9A7A1F01DD7B815CEA
-11766F2B5B82D13AD78BE0CBD7AC82DAB46575CD90CE59B2FF705F328AAD4BFB
-B60839735DA8648F312AAE70AFC24CA58339630E430E417D4469C39328FCA6A1
-9BB91791521E7D43ECC2FD92399E250443C9C0D14AB1DBCE22076F81C286D61B
-136A956E57AA9BD12B548474134736DC80138C678A437BDF746F9140D39203B0
-C79F51F3E31F679CD80B1D98159874260DE5A298FF11B5ACC461A567E1F7EC81
-F4232A80CCBBA20F071F0BBD6749CBE8DB8724D14D4DA2DF0676E182B0C165D5
-397252C6DF93F7C2C52FBC3DCC24910929A0272672F1A94C03172994E4FAFB47
-76FDDF661F13DBC3E0D3882B5D576BE48F2C16F5CC10EBEA40CF90BDF4DF4997
-E79D92C92B4D570AA930F0C841144E440AF24893979008E0A8D2DB3FD81AAB59
-426A49E8FD770654C520289B2D48C14B35A069445324E37F66AE20BB0EB1C27D
-4C23AA633834A3193129BD9C9FFD8F8C152D9819F852A0522DAAA38BCF1687DB
-E22E3EF59EB2D3831261A88106E41C86490C32785858538FB9FFDBCBBE186DFF
-3964C03DF7FEB945B1049EEDC856C5F4D51A8C57ABE0F980FFA7E9BDAD21E476
-67976A0DC9AB4D84EDA8E9926FFBB302CAF28CC3FE6C58680C26ADDC361FA10E
-42FE75145AB186214E03558CFF881EFF28DFE535D612243C8ECD8C3C2DE54C1D
-14DBE7DF5200AB36C47064E7BFB0C554A5F6A03B6406C13FE6D724AABC071504
-F0C55CDC2F963DAAA255BA3F91208DCD272D395273D98D7A0083301D0186A37A
-F2D0385CC5B0698C21A197E57145B1D32AA873D851664DBB3B672A84A1EDF6CA
-C3EF5EB58023FE876BD25AB9B8AB1D4DC1966CFED8EB3CDE280D81FFF60836F8
-68D3D51813E9BDEB6F54FD448F6C6123615E12514DFD986532530DD65E84986A
-5BC1C1E3B0E760D88730E708270924E98890115E3927EFF1D8DC891314EA205C
-DB1F328C8000CF7BF21AE594840F6CD56B6CE4DDE05D2FEA79A1C037BE44BA87
-D9B4EEAC6D044464A719D6674B0249E512F4C3BA6E6CD5AA138BC1C1B0C2614E
-5CA4E7CE5773FDEF44A0248A47031B2F8D06EAB92BCB2157D4D15C93139A800E
-6BC273669BCAA825AC886E8F0B308F3E5E7B6F528D99A1B6858BAE807B162ADC
-C02397B3E017260C723ABB24582A414CB1793BB5F4ADD3762366F880936D2906
-5D8D0A3C2EC31C3B23FD7C5A92246E0FB2DB50236084CE103F56B00511CFF8C6
-5C695FB66A1003DEDC5BC43ED31DEF5D2320DF77D2B712C5DC53F32978E14177
-0E95FFD8FD13E8BBBBF030CDA5E4F05BCC50F4A7AFBF5510398A373FC34032F8
-5CD80440C7138DCB9A85A656F0474D070AF48198CE2382E92C855ACC69EABAD5
-CAF94D8A4D76EFB4E49953B8EEFADB557237F495B0DFA5C3F7BADA594348A88B
-973E5CFCA5783B20CD3DD05310B24F9539E4C30689F636DDE164861E8702FE25
-2DBED89160E815A617A4E7B1928FD84851B40EC28C8DCF9BD9D95C5DAA4DE46C
-EB78E0902B36B389DCD3DDB8C8410D684D003A989A15906A38F2E11F4CF42324
-DF9A1341ED9970A25C4ACBD73F8E68AEC9266C539A920EDD17245EDA202F68DD
-42CD0F2E1CF99E2537E4432546DB208EFC3CE2805BD937220A62E692D0B8293F
-7831E4E5C580504840B4B5C01B2E73C6BECBA5BF37CC2657A2CBD51A828A1D82
-12E7CEE63847B2A80DDDEB8376EE7E364FE47FE1B6DBF0C2B052D7978FD529D5
-FC880C219D892B1ECC5617D30051860C482B2D6EA24DD5B8959372DFA8D2AEB5
-C06860466A2D22891EC71BB7640449CBA679E67E6C71F44A68AE7739744AA4F6
-D4FB1F74C20B301CC545737F131E0DA3183F976ABF85B68BC4AA63FDC006DD65
-44A1C122539EE0A1C07F29EADB687C7AEBCC92FE2E245C330C10A9B2FBA8C9C1
-0DABBEBEDAC3B91FD3F6D51D653189152897963E8FF5EDBAA5D92381EAC86ED1
-C896B4379433DF5212C843754A3AD3F217863353C76153D102359D803776096F
-BA9D4D6DAF5E3F2CD47762468AABE5AAE4387C54C2C142E5A63ECB22AF0914CC
-32FAD5435E23F7395871AD8CD2C02873E7EC7900CFCD021446487A9E6820BD63
-EE0EA22F8C82A90D59246E110F696F2FD6314F65E209028CE4B211B7B58A22C7
-C6B82C5D0E0325A92123947FD8305924E2BBFA530C6E2C335268D2442D3EE9A0
-5453B3D87E5BA383071CFC4CFA7131D24004ADBEAA6A80040EE12619B7010973
-627EAA9C69322997E06B8F3E10105B9FB004089344F9604D50E9CB75FF6C1B9E
-208347262D01ACFE1A26E6B6A1724FC811A0B602F9C5221BD2359AC1A27D641D
-B1824E3EF3C6ED001DEC8328AD41FDF8F8643D5AF1EBA51CDABADC151A16839A
-9852BB2A8FEFB5FD0F236A17293DF1391530A9BFDAC288B4BBABA3E8DEBF68EB
-61B820678A2C5A844B41DDFC96773AB21207C7403182BDE878BFBDB02AF22416
-7FAD6A039256F0321CC568049E80522250E3BFE9D841E18796C108EFC61049E9
-91890A11488944BC18D63D911B205B8DE16D062052A7C97108CDF5BBA0BDE087
-E0B31781C257679FC8A18C945761528FBC7D8E61ECB9417D0AC43857C0B3055D
-F1C3DEFEAB3D9ED3B357926BFCAFD7796994E28799E0CAAC3464A6F8A2203D9D
-F006C837C8929EBB2483D13AAA62008D790B81D0CC90CA55DCF1DF78E855849D
-170D5F0E11B5ADBD7682CE233E26F95CCCE957E16C55EC3397DEF52AD7301BF7
-B8E6117415E7EBA61B9D64ADB3091AFAD3F969E8D28630538AAB1240EFB4EB66
-84766B4DF14C48DF117072E62AABA7FDD41169E098249DA39E884724F89C427D
-F60D85125F31DADA544BE2426690690B8EC4E3F97DA0F2EDC2E1E76F6D28BF17
-A3E1DF62C0AB685A0F22143A5F1BBC26EAC1426CFD4D9DF7F0FFE872E0C9A06A
-2816EF89B5D6CFD470F7D6E0897A27CF607EB99099F8883D9E63D7354E8987A1
-B1F995D0C38EB5CD06D62B26E1B4C14C59DB4C3BB22A796C161CCBEEC0BC74B3
-01F218784FAC50F1D8D735F623D8E568F17362F26AC3511DA3177D5E5C18713B
-FF1170C0FE3E1D71BF5CB13E09582A51112F5E73C30BFD6D7D40CA7973C4E98E
-3B503F6B9B74F48AFD91BE0018F855B449F93BD9D28CF4640191D4F8A2150345
-77C29EB8D6660DED45A25FD769AC5DCEAF43A62DE7FC6144F1AF107997F2BEE9
-0ECFD51B4EA120BD74D0514CF9F704FF7699574144B06A3C9F2485472A79DF7F
-9FA68A82D377F7870F2ECE5E0DFD5D0A182F8C5D9BB8280AF6DD3A66DF28988F
-C4E7BE36C95DBA103ECE133E869954D87FB2D955B3BCAB1F3D25DF55B1DE1D32
-145D39D8F1AC1B5EFC1F77E4779699E8C8B93A78B78BBB181A279631E163FF0B
-EFF6F7B04D4CF8873708AFAB622B2B3613DB434698DA87B8132E1F3E46ACA7E0
-B4C03EC12A51D0E8EDB1FB1F3633042E15E61ED677D4B46C287CFDBB572C8FB0
-64974618F5AB0945CFFFBE67C5EDE351258C528C9633F2C9743C3386ADD552C3
-DEAB08DB72C254EDAEA678C405DA089849720B68AD9FEF4DDB7AED3D21CEAC9D
-73553FE788D35A46F322838050C9846F4145C4A2B89072C4B00514779BEB8FAD
-CFBBBBC2448F0E9EC25FA43AD956274CB6CCD5A4FF228A61478DD68F50BEC3C1
-B580F32BFA52159F33B554510F29386289EBD7CCB63169C859CEA82A88A3472A
-C87FC773C20AA63DCC7C64BD6048A1343439A9B230C05ED126866A54C84FECE3
-87332796F8DA7A91ABDCE5F9FDED03B1E8DC5C61BC139F33D430F0990EC5D092
-B49D10AFE3F993569784F2EEDDAD5FA6E10762D901FBFDCB1997C40EAA885CB0
-52F4CD610296E8C297CE215C7CF23B873E67F6A12B495C415CFC27A0013ACC3C
-FCB54D840677F056886F7A0AA5DCAA07DCDCDE4252B9977D3CB3DAB09FEEFF5D
-B03FBCA4DD809B161685384599625301CC35166785BA66B1A18A4A9564139D16
-D33BC7C0731F6E0DAA9BE2EE103BB8C39E958C3F89E26C2644128BFE9A3CDD18
-1115429D6317BF9A35E980044E9A2D59DCC544D0B25E4FCA28046B71593423B3
-F9E27BF3239404626C495EDAD4053EDD0A601BA04837549232AF2C54B02D3C95
-2CF348F4FE12AAEE0DC4D545C935C8E0A8294B4CE56E026C5CF2B36EA1F2F904
-AD8D130D6105BEA237207209A1795F3D3A03FF1B16A7C3163B99F40F079D3970
-86E64A758BB2A068FBA3915E75FAD7D7455EE272C6D48DC07138172457213537
-3BCC124302C549A43F501A5E4230F8B0AA54E7FC3A644FCB42E12DA142862EF5
-1315E92F31A29E92B3FC3ED944EDE66685B1782238104FE41A7A039D9793B810
-639256B4E1229C87094C0CA19A16A5C5B6C648E57A4CADB955E162B82889DC72
-FB8B11A00C6885B23C0ADBE5C8FCE24DEF5AD7814BE49D547EC42E312D795D0A
-49C06F90CE9F29AFAA258E9BBA47FC2317F45CB73F246A277C0F6F85CD926CEA
-8B119C613F7427969A4D7241AA375205EFA30482C5ADF407AD692D5993200D6A
-A8A7DABF6F9AC7482F70557CDC7E09C3CAC4EB3FEE98605212D9474193CC151F
-43F630ABC8335B4C91E8E64283EDE6A46F92D66F1F25312B41B1254EB6A44BCA
-5EA1F881A8CE2756358AC4084C6311A41827D70F224272C5F0B78C8172E05E1B
-128DE2205D27D2EDA3CC930783879123520ED5F52D3174477B64ADF595C398EC
-6EE39AF98E5EC04CAB0BCC122E5DAB540EB9EA7387F6B3BB208A3281E657A2C0
-F4A215B2B1F5C5F08048A0A357F0B3F4ADE8D0DC91915B78BD6B1666A05C4985
-B3D45367A6B7BCC24D0093AF53D9FE8C91D7CC542C7AAA883A26757FF373EF88
-A79174BFF975687F693BD51DBA40E73FCEB8A18FEBD10E8200A29F475ED47F44
-ABC9F2A6F66D768508FD3FE078AB46ABD69B79A6ADC471AB866D326C4A20D9BE
-8A15DE54C80945554AED93AA561465178B6F38D94769D5447D1C267519059101
-F9501BD996B8DDEE625A74673D13A647148A9F11CE99E7C6BDE7D1D507017648
-8173E81909387A04A133CE42C4643F9E5D69BE24E48116B3590E6ADFCF02A21B
-88ADFB0F070F666E38F260F7A0F9A99D22433F8F0B436BC169868685E7A144F8
-DD4C3FC1D1A554BE8356A18ADD5626450A29E80101A8164D0A5A106B7313FBB5
-BAAFCE2240A66E18BF06EFC32A055120F7DB77B269C285C27384EB0187A135E5
-8F7E926D9C48A9DD8C2747A5B367CFA686FC1294C0DF48037492C1AC42241469
-CDC137863CFDF8CAF8B9C8FB9A25F4CA4D517AE0707F94E8184386E0138C9098
-CEB7FB05EBA48A2F10D38F62B950EE4DBB2973D23D8F2C36FD315ABA5DDFD03F
-BE64C12D18F9EFE17A0FC0CC57599826D09A45D3F5839CEE0FC0BF726CDD0195
-924583C8C4E5BC06FBE89DB34EC1E2A21D09A8D40EE8FD72F352161A25F7DDBC
-F4055FBE67201414BC725815A68740C1D73CAF7EDE42D5863AF0EC9F2F29A2D8
-26822706CA8119EC6D0D9468BB812F48F61E0B528F48730F65D755A78330BFCA
-B38406E441453361EA517BBF57051C499BFE502049F5B869CBD63A45B26DED44
-F4148C9F523681B5316B33F261D9F854D58F301B04F46631629903B5C6CA7C1F
-32165F3BF96494B89614E773E21FF582D2AC54DCC559604378E9C6E87655B3A1
-66D2DF34D531F89942BE2002903071947F9600DDB63772D73C3625C969E86859
-3BB872F0FF0F3102A043302117900DC43A5B295EBFF6E0F098694CEEAAEA8F0E
-336A33F31E7FC4836DFF317A8E5C5185B931B49F55288790B903C5F709AAD9EE
-7CA77BA4B905F1094126C8C2DB2BEF9D47D9764BA02291B61D6F1111571C48A1
-18D7A3F4C4AD999643E77DCF067D59442553B1933FA1C7ED31486BBA13E38BB1
-A5DB843011ADE62477C8D700039407E4BA7140FA57F0CBF1F592B0FE9B77EF26
-1993A02BC2A06C9E19BD0AB9BC6785DF07AA10C9D23F1F39CAACBAE7A06A9D2A
-CDAB181BD867EE80FAF7DF151B46469D39E3B146C90D0EA389635FAB3CEB30C0
-40CB74D4C6F4BA399FB084D3648AF356B956F9CAB3C3F122530AE112CC872B7A
-7010A34B1A2ECCF920144672F8315633CC6B50B3D3288A922C8E8C1482FC969E
-59060D86217EB3919DD8BDB95241A7B089DC1456965AA6807141F2448C50F8C4
-88BD54017534F9236C4EC812E2F48F13943C8B81273285BCE02FF68033B70CA7
-0F38511329DB041A8D38CB609B93A39CF98470975E9AC50C5910A936722EA880
-E840E82DBFC809DD5EDE3D9D896FF879AA47E89403E5E9078BA9FE3B3A2FC4E2
-C2FE85313B5D53A05DBAE54CFB25BDCE29B4F5D6168549750C2457EEB109CFAA
-A14D71A996B2CC1414A8F89DE240EFB5C3B13F216396ED83F09388DEDFBF2CBE
-604C08D8ADEC0E3116E33443CF68AFFA4513B1EB0A19D7EBE845D1A0516A9EA9
-03B7CC5D17CBF0E1965CF2A879146049318579081323FA8A13755D51C939FE1E
-7774653F6610F5A542E30966220E69A4650B00BC6BBF8A09C13EA3CAFEFCE3D4
-B2C4E1CBBADEAA6DE7BDCEE8795FD31E1297113230F8670CB316B5F39F067043
-E261567E08179748C47D32869A686B20F4BC5B78FDC9BA35D1D4F35987F357D6
-3BD1325EB529B80F88EDD4E0EAAA54F11ADD2CA20640A77D96F627179B39EBA2
-8C3A895D4806568A36CE0B589B2C29A962A8F6B6AAE4FAC50E424B2EEF4E7B47
-ECE15B865381E87FFBF29AD1D3BAB2F6EED94B874ED3A975A0A5FB54E2729CBC
-FC079469C3BB4AB361A7257653289BB9E353BFEFF7F8982162CB641F1571D0C8
-9530B1D6252C5FB1DDD8C29EF848D105126703AF7CE5DF4B87488F382426F583
-34021005B87B8938DA00725BB75F548F15E382CA1A57F8A27A81B5A97EE26244
-E739D10A43BB170D5C64BEA9580C3017CA5F53E8C30F129E0A63A5E9C391AF5D
-A1C4B5EA0EB4722F6C9D187CCD4BC71A063D85305B14CDDE969D9835906B0486
-5D47D6857E82A3FDF068B81C0A747AA0F3D5C4BC089373FB9E9C54802AA63B82
-DD8C82CF7B941BF0714E80EF038C1B25E0E5D47AB1BF04755F4C29B712D8B668
-0554E90DFDF8D489833CE9317C0EA6F23ED270C8128FC8C95CB187B283A730E6
-32D0A11357ED48C36D5B681777CCA3D56A827C5AD83F35469869A4F774B9F2FA
-4C437C95DF2DC13C8F3B69DB53F4DC0A1980762A9B736C4F1E435D92B92E7840
-B382109C02A5DF71DE910533E4925CA4FAC2B146E67817CEE6618F2C3BC9B828
-74DAAE72B6BAA987EC03CE66EDF04462B72104FC3941351EDA8C1D7E5273C8FC
-C3E4F2EEB29C2C8FFFE88579C1EC41543A55C6E9D5128FAF3414195A8C7A9352
-0667E7ABA457A75D720A090069B396D062200E5A2311535AA241CD8647D0242A
-0EA4B1F527C48F40D79FFCEA636D77DD07ABA26FD3F878DE004B03A2F95FF25A
-1BCDC1D87FA05B201A4874325D3FAA4DC787D8C595E3E8D11FDF381B92FF830C
-0AA70E4E4F65C7587BC5D6ED535A8E130B46D339CDDA5458BCBEA5D2243E4C18
-0DB006C0DEE0468A24D1DAC167A4D8174C296BCFB00439400D0939C7EFAC5BC5
-F62346A2DAE415684F1FABADCEB476B46D821F5E4A28A1F6F51B67320374379C
-5B73458575162583150D0B8BF816CB57E08682A3219B0446AA940D0CF43CC1E3
-7566EFC3BEF49273128E9238B31A9244C2001E38308ADEA60BD86A89E1E3C0ED
-D4EEEA31131AFE60827FBCFC1BAA348FD183A5CEEBFB472CEA0800FF18CC2616
-F43B04620E74D3AD95EA13E15B13BE3345409D3321397C77D2E612FF5011B90C
-3A51DD8C7CD3A3A46EC0CBC605D1484A9C36FBE3A18AC54DEAA2282F7C037856
-B6511E5C990E421C34FF668EBB8778FBC2FAC1DB3F88282478A52C9ACE31128B
-2491C873A3B765A204907B5EC4FC6A94AB9461AC8619AFE24C2F0A4BDEEB9D8F
-D8405A05F9EB13EEBD79B32763DF402E0FDDCFFAC142DB65DEA80B5EC6400B9A
-00A78E80FD3B9F909E953814958F2A1AAFE51FA01EE54970FBA5E41384903E04
-1440C92E2EFAB3E685D730455846D97C2DC7D25586052401264A31F98382BEFC
-CF9049E23208EBD952DF7D4A5F0AD7CB2688D77C2F3496AE263430000D226918
-E3CDC6C5EB23B8611A14747122DCB9E016898F69D4314787EED886123293FA5F
-01C3FDE4F205CAC20FD19471E9C8FA721A3AFDE78156DA287E8FF14DBF80315A
-B56E9E875CAF0DCD3A622134291B4C42E7921F6AD0FD4940066229B892E57554
-4CACC05DDE1F374CFFD453817EFA9DD7A6ED9079B32EFB148C235EF50F26E479
-6371A267FB33DB00F0766B00F0D43992386062F80B62291F623BD1245357B2AA
-FB3B27E7BA6CACF749C32AFCAD322510C8A13449277BDBF7C221D63B96D99311
-93F461C677AB372FE263C5C19D87DF70134CC0AB6B1FBAE2BEF9F847E30932EC
-89D7521A16AE1351999AD4D4735149AA2892CEA8519F619DC0653D01992AE7F8
-D0C5635C4BCD35708D454C174CB9863B83FE504314A9FFAE0D7535946F0C146B
-9D507E1BFDB6095A5AC18DC2635E1DCBEC393DE1D8D3CCFF7B0258CDD6C00469
-D3B94BB1E9E4397ED49FAE2C83103484C1C24151046952E3B9816101FAEADDF8
-8DD6296AE76BEC4B00B89D319115F5F95C568DC54FDE1E0A07AD3D3620B86C6B
-96166C4B9AEC2DA6D2B2D2EDAD08D4F58D193278A99FE28ECC676EDD4FE3A624
-3FE82562852B0EAD2A6FF707789799A1546326EEEA08A5AF24FC99F1A6B15E91
-CB13F53C90FB93669B1D7CD4882F55258CACB374088B0B01886155E2AFB7F3FE
-F4DC284C5F2D0C56135ED79D8348CE3C1F8BDD50627589E806E6402A32E69D1C
-D7EED5F9DDEB91496AB5DBF0D3698FB728A782073D64B0C4E28967DAB8087ED8
-491C3778FC5916953C235A59BC191B8445B118AFB64C3E7840B3756E02ACBA77
-D1269ECCAD63C3FA7C162F3AE317372686B1FEEAC57C8CC0637236CA01DA6B0B
-83C40F977F766962E15349F020BC048136E35C678123B4BDFF5B154E234CD0A1
-70AC976211A99B8CB8E131D85532AD7A72072F577B51010F21C6334006371A3D
-AAFBD45E1E76550DCC6060678F94E0C7D54D88D066BAB5BD21C254D9628F9502
-5043E9205ED0FC7025C033558FBB3784D2CED521EC7C9F7D6BB8D62899D0E52A
-A0E385ED658B1DC84DB76635FDCF0CECA2BE5919D0E63BA75850596A3CB916D9
-55F856AD3075D5C57686E65AA912F0A6E9E4A778522A630D9D9AD3732629ED47
-BE694C35221FDAC7E8CF5C381CEE23E29AA749B52E68D1CC2554EBF31BDB5CE1
-FBE58C5935D06F09B46B96B94CEBC92981474F77036F0EC33C2149E6D945F147
-44CE2B86399056014CED967E976EE7DCDB4AFA12F1EE4D486549C14FE1052324
-ED70C3A6955BF8CDCDC7EB01499126F0C303E64B4370E83D5687E957DBD1B374
-7600EE0E0DE2C57B37CAE46734FEEC0A2F3863CDEEC17265F1EE104BB143442F
-35329A81ABA8D5F1B7F8CAC158E4DBEFAE91C2BFD05389F048B3BCCF5B0F66D2
-4A40EAAA1E7D913DEC4A44A9A382F53EB1EE3966EA18BEB5EBD24C203B95476A
-0E0C8568E08C357FF880600C27BCDA5623C8034CA1EA2AE24701DC7F1ADD2302
-100F16EFA05F39A2DB15D091F103259FC3C4CCAE4A858B7F72309ABE6CA45067
-EF46BB3C4738E048C884293EA5882A2E6E3B3B3C100B5FA02EC334DE2B68F4DC
-2CD866AB8F83BB0DCAE954BCFF8EE7C3D1CF90CC51B295D02F1130F09B62CD05
-AB930D97F9875B9E65106C4A8719DA2C75A332C038E46F7E82BE4F69DAA8715A
-1046DCBAD2DB3086A1CE04C8904988F7A2C9891B3C2BAC759B20CFD5BC8FCDD1
-03FBD0AEA3CF53E7B1896BF003AAD60870BC9AD50F6D257AEE013DC166B0B448
-D56900DA44885BE5FB7F3273C15DFEEDA5D6E895773F4435C3F2A684987FF31C
-4DD09CB3B2CB9369704CE85FA266676C25FC30B98D74451CFA0A3C0E99ED6CA9
-D31D34A3566A5BA3EFCA62168217429089E61A231506779BC845BBBF085085D8
-BEBAC6370E595188B74C1CC2D9D15CCFF9220BFA63A2D002E7D7F2F711837671
-64E44FFC9B07E092C2C3BA99354F163FB87655EC865C3B2DF852031A3930A148
-9A1D29BF24604E2E635C9ADB770A13288A488F4FB237FB1CAB2524F7D33DE2C3
-F2C5BCF05F7C438B28296F842E86F8BB4881A3B4F89B4352AD50133E79A70154
-7DE8C607A98C696EE1D254EF8E5BE67ECBB7C1220C5FE367EE2DE9D8AC7B01ED
-47AEE18CAD10A639B038972587B10BEF449E7DB2C97F4D97FF55099893616BEF
-4DD08E57DD9262ADA201C5034CC56D9D34B34E2E1B6DCB02F3971302060EEF2A
-D942D62C270090BE5E74572C751A0A6FA081A6DA4430A4A069499A2ECD39FEF0
-AE78E58ED3A64527A70D5F8801EEC47BAE1ACF720369443A0B3D7AB4543C6830
-098F2E44D895F737B26D090F9706D9ECE37CE444F652A5CA5522B0F836201376
-89A28AB47A1291A96EA418DED49A829E62ECE80A311BDF5D1DCF070D38D9C9C6
-AF40F5D93824E089A7B95E4E4DAA830860F2F9A1E3BBA08E539CA4B54EF6E2D3
-DF247E11690FB99A7784D7105F0B4EE1509D657497BD054FCD0EBF0A9D3B5C39
-6E087FC344F636C26158F742D14A363E2130C0EA0DF4E0DB891ED797B63A42D9
-1FBAEF469B0C79081D2C0031E09A3776F862AB8BCBE8E80FC837AF15661324A2
-7C4CDEAC92310EF54B9A24E44B04B5D265808B3B5639018397EBE66F21829F06
-7D0E6BE0DE08E5961848E93669D607F60C25725B7EE8FA83011A5543EA5CE260
-A4
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/l048036t.pfa b/lib/fonts/l048036t.pfa
deleted file mode 100644
index 4ec846a869..0000000000
--- a/lib/fonts/l048036t.pfa
+++ /dev/null
@@ -1,1260 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiSans-BoldOblique 1.1000
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.1000) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Sans Bold Oblique) readonly def
-/FamilyName (Luxi Sans) readonly def
-/Weight (Bold) readonly def
-/ItalicAngle -11.3 def
-/isFixedPitch false def
-/UnderlinePosition -39 def
-/UnderlineThickness 78 def
-end readonly def
-/FontName /LuxiSans-BoldOblique def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-228 -211 1098 1012} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078990 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D9E671B3988AF5066E3F90
-863D5BB633FB30AE28A6ECF53B5A2F518BA91BAF2EE70FE3F56243BB3F4C04A2
-FC016CC374C654204EC90A7BF559178EE8015AF532372CE4B4B82E2469BD5401
-63B4CC74D7623862E31F62F9CAD70643A7C39877265EAC7B5D71744C4F83BC05
-E893365C941FD0FE135013335FA2213B42226D6B522A41C5A6C11780D38E624A
-F8BB54EE866274FBE41FF83840EFDAEB7227809D506507E8322CC5B16FCD97E9
-C441FCD253585347C705C556A3897EE543648265232A49B9D545B6F618870554
-03227116B9F656C288F9C0E3CADE4544BD1E749D80072FC0D0163DB84A4245D0
-41460C3566BDE66E29E0AB39F280C2F229583228198C7BDFD5C07F110E0D5CC1
-BAC768138F8DC9F0974EC7C2BB9F5DC97B5950A1A4E33F2B20061B22196C7FE8
-C82856D93A079270700B11CB7A6396A4E3FE6FC04D6AD49FF13D1A2E1FF8B07D
-FC49258896C83AAECC29610440D2BA2C0D19A4E8AE287DC0B8DA956F2B4F5607
-A04F0E366F0A57561CE1E06CF7F3A70E300CBB077F9C918B099FD178493939CA
-0D25A808F335DBF82A11AF2D6B2EC8E4456B60DA9F5B713568A34E66F4640C81
-69F5023C211D301FE810A6B6AEC197CEE2B0FFB4CE02B119CAFC5449D8F12416
-989A5A22633105A9750581969100BB65CFB052B5A3FA20A0B4F61A4B497487D5
-BE89F7D45E1A93BB28C6778B39FF708CD041FFFB50B640C93DBF1EFB2FBEF63E
-9292124E702138A914432C50435D796B22106A34C1BC3EE1EDF873F60367C580
-7A5D98032EEDED53BAEFEB69414B714E9EFEFF2B1FBA659081577F87DB8BF212
-4C0E77A8605C1C1FE19483320AE88A041EC9B95D10E89CE673E4BDA638184422
-742F4CEF3086B62F5873A1A3F8263EFBA4CEFFDA958521274263467B9C485EE5
-7D8AA17A8C364F517203A2D9A66CB18201897A6223F5EE5F7ACFC3009B39005F
-61095364ECA6DDE4113D8C39DA710A4716E179812E79E9B01C3D7B00ED2DC574
-63AE485A2AEA55611672E1AC489C6D09EA559B9E8DAE17DCDA80FD287DB8D742
-D4DCFA54ED2EF42A988D72A491A4FCB9BCD2AD4F225E23932C2779C3B008AFC3
-4D2B158EB9697B6598672BD99C91405B5CF668F3A4F21347549C1150B0FD3EE9
-6EBFFA6F54F44DDD229818D109E7FFFA337D80C83852B12597686E29A0B855D7
-D548EEB2FD8AC5585F458D60F8A18F33CF5CDB9B45FB4A8F61732FC5A2EE6F4C
-25C2B903EAFB4A0056764C4FAE4278535DEBF80DB8A9B5C8C471A62755CEB38A
-A05D0FC10C4136AAB774FEE2C6CD57CFFB88D9266696C390919F94BE439677E2
-E8AEED7B8B4BC2E422F6C9CD1711B496E57D31637BC0CD4D6001D0E38F54402D
-1D6B7ECAF0F454219AD6CBFB857D7165D1217B7F5315DE5EF333AADAC59C0CD8
-290FE129D720FE11B2A16ADF49FD140902FB8D8D33FAD0EF0A79AB30319A9048
-F7C2A38D5E9333A5F0F20D12A73EBAABDCE13D9B38CFBBE20408959E1F506784
-761CB0A7C72A220EEEA74FEDF0158F7F36EFBF9DC5D83AB22C8756F42627A51A
-03C6590FEC9DB77B790A5672158CB32C9ED1980C4CB369839DE47BD57CB4183C
-EF55A34C70996A7E00740D236550AAC8CC6471BD00D8E3F5BE3727A9029F60AC
-8B0C06076ECA4D854E4A1372610EF8FA0FF97D3E637CC8580098961C24735991
-349C2958B4E7C4F67625859390B9567ADCBFB334DC7FF5AB1C0462DBE72CA093
-0D7F43CC5230E57824ABF7857EB2F856841013C9E06D0DF4BC9171A75AFDA802
-4491D89CD7D2D65515CABC474AA8B9BB1177A502E4B94302E1E40D6C8FA974DF
-C6496A7C1DC202A79E79FF0D9983E48F8F66415610F0174C5C555DAD5EEEB9E3
-FB5EAE5F9B5307ED89700DB98C7031DAC8F371CEF716BBAB2DE3DA113E69EB18
-EAC7A1756A0340248142E95538BFC1AE4814585AE16E397C3D34736738CA5A26
-6E761DC0F59CC2C3DDC7AE6E801DED28695E7DE6FE9CD1E29FE636391ED78E0F
-C450839D27A01CAAF1A56073473A4347098007601698AA2872EBA4F2F32CE6E6
-3A9EACBDC28AF4E8DCBFD8A0ED978058FC9E7FC2A676500E19337917EB0FB8FC
-3C37E3903185C96C4225436A42C5495DDD49A9D072D1FFBCB9C2CF51739AA6EE
-CC537EC85C9F316B9721F9806F214EA9D10C35645C0A05CC242E668C9B60C2AB
-DBF148A8A1E8BB212A272FDD180480BED9988C9AA3C99342EEB70D7EF76C5282
-3D10C8C811418DDF1516660CBEF817DCE1BA41EA0AC8356B1573B9F0272472DB
-2112A2D6AD1371128E62FD35068068713F82E2FDDB721C253A378E284175FE68
-8F77FD876230F131878D76D91B43001821A4DAEC5A6C30742864B2F0A1E6B434
-80FB5A969A3C3D6471529E0E1972EBF27FAFA811808D374C5157D8A90F04A4EF
-34DF27414E217FF7DEAC000537131429842625464D0FF55BBE51B7048B964D57
-DA20A4F579C86D81B3186CF6C503037C83CDF97349E575F24BDAF5C2B16290D5
-805E88F22B22C59249E9F8CCA25DDC665C2BD937CC6C957442626EF81BFD7640
-78990E9071638880C0AECFEFE1DBC5D86EEBE3E8C181C3DAB690EFECD7C291B3
-882F31F29C281C21DC1C5EBF2975364992B3996E5393CB54C4E4A07EBC183617
-DE1739F62531F36C19404E395389B85C893F5F8BF72AA7CEB5BFF1603C144D69
-25D14B3D1C4565E72E0E64282C5398BB07F45EE86FD19A2C20792F06CB6106A6
-C4EBE8289ACA36D30B57F62A11F90CA64F25A15ED9A187D255E532490F74A885
-9DC77B2D12EF1CB9D5CA120B45A7C05A7945F83F764F5620CB01BFB6C1B68AA3
-FF860DB0A9A811A6D2D6862355A95DC11CA108037E03BFCD8D527A3985546876
-F38487881D7575298C274CFDACF1D190103A9906B08D6415E14857594CC90BDE
-9643A556543EABD0412C8BF1974F4A19BC80F638158D5CAB73657BD7395840EA
-458E7345E25BF1EEEEBD4CE7687934B5BA62D34E5102E033A9EFE75CCE2EC089
-E62093489C4D0F18F6ED577700D5D2C9A74561848322BDB46828E39618A39D32
-F13F6CB6E9E5CF8F004D6D37C02FCCFE227D75ECD3E4BB1C50440858A3CDA4D3
-66BADC120B31CA9CA8A42FA9853309A1AB649E61F45351E2946D9808BDC97875
-6F08E8C2931B4740800142CD15A25DFFDE8B2EDDB21FEA1F251ED643F08D744F
-F7DC5E26064B6A16FB4F5872BE9544E8CEAD0DEF9C52B1E16C7FCFA64CAD2B9E
-5AFCE93DD0F8B460BEEAEF3BDCF5660D99A6C9DF1138BC0DF400084540991574
-6F59E90316FF7A74B5979828FB02465D96354BA5757347FA0F92D41C5659196A
-FF6E24F615039D949E6FD374243708910E145CE8E2A2461F5A30A5BAE30D5445
-7C10BAC56E08289FB57C1D4C9C7A87CA8D24FE421D4189540B6CE0190281BA4C
-9F3CCC4C095B86F076BDF504F24E9B422DB680624D2E452734D17F0416586D80
-B3BAA3C782475811191B857C19D1C4C5192B33997E1368786F9A8D3A3500F7AD
-988FAC17371E2A74B1FEC5CC55F9E64649D01230A83D28FE63D1175297818C48
-29697A12F925F189D1A162AD1A71FA29D1706F047540BB4730AFABCB6D3BCED3
-4EC3B8C028AF3E09A9D30AE9BC82D8031D8E00FBC591B1101253809C7A733B37
-4C39CD97E0EB92C5DE19499051EF9FEEDEEA7621C0CE69DE520587D990024BBE
-87D6E8E5D59E66502FB01BB368CD92FEF24A618C1A987A898AA3D23CC543D7AF
-49C8D30AAE8B9434E491D98E8D4D68DC8D6B741FF66B9AE193AA685864D542BF
-3BD2C156D7050190A4D4535D5B840587EAA6AA058317CCB77D0471D83D1D2724
-3FC905BD7F771D0F6D8C3A1D8CDBBA2461A709C004F2953668FC3D0F4B13FE33
-A9AEEC634A3F9A0850D03BA733F6DB834DCE4228883308EC70CD5EE550E51EAC
-3D35A3AAF9340E2624683083F75EE493318188E58286F1A4B879C92569DC7960
-538921AD7C6B3C89F4D6C28F650C7C86688FAFA81FF4635EA3EDD855C3CF4DE1
-FE6C8D145BF56105E416F5F9064C4129A0277251A46A054E38E6ECEB327ED45E
-1BD5D272182A1CD8A8D0EF92EB46C55AC149D29A4B7000A7ABCEC1EDADFBE735
-213E93C0C251917221DD8926F3BFC5CC9493941B41787936FA077F706E8C48C7
-2430D26CECF90F6086361E3B09D2131963EC4A29FEBEDCDDFE69D56AD538D258
-C3CA85AB0E7CF62E5147038FBED9F0F834940D5DBA99D2E2DC2158BC1898BB3C
-57912686C5BC36A015228460F7F1A0BC47BAEBE092D69CA9848E389398997613
-5B5F1F5492A02E35585864CE24860C1647113B53203BE4702C4B09EA377C64C0
-2645A1C416E4551FC9FFD6BAF2427DA4D4853E4B2F9B59E4163FA3D5CF4B1831
-6C51A54BF8040D96BF17EF31A6C832D55AA3E61DCAE57F91DB30BC95A30F8251
-4919068E31C8A678D8FA6423911FF90F48F3225EB2E7CB6A58DDB1DD58AD1272
-6C69DDB5F50DE8718E58126289F883494343DBD4A215FDE54548464E8A6051F5
-6C3DA917300AE09ABA0EF4A4F079A63E1F15030EA41B1EE8EFE18D98D4A88912
-7A790989F9B20E68A81A49CAAC1CD91CFB9401F60C9DFF87F2ED944006432CBC
-2CFC078CB5809573CF15721E20D85EA27541FAA4949BC8FA6708810DC205FA64
-28B84176BA868FE351B87361F8832D742A5FC3BE6B0557AA3EA5788239D1FDDB
-0EFC4CEBD4D736054C77CAFD5B1453B65FEEDF7FD01311C2C582B6B97EA70687
-8E287CC3A451A190DAE2CDE4708400A48D6F7BE00704CB3F9AE8BD7B4B04A2CE
-3C3B8E6D34E3C3C9263122E10F32656166B2BBCB1EDAECD6500C4CA655ED6B8F
-037DFD3485443D4B789F3B591B350B9F411FCA0617CA75EA728D0BA4313FBCC6
-B845ECC9E23E497F1F955A15795F01E4A6BB8AE113B2F64DCBD2C7A0F87EFFC8
-994F130004DCC8F2503B56BD9A773C920D3D5A5CD0FAC00763E4E17683455C90
-FA36D8B76DF144C8BA7D2EBBA2E4D5751E7B4E2C675E37714A3ADBB0F17CBEBF
-518E3B60DFEFF14230B2FC48080803B9D05B13023B2BEF22311E91C8181355B8
-CA3C3680786B74FD8CE374CFA68A19E7AF2CB998E329A7219859AD23390668A7
-3C833BFA931829782F61C50E2F91A0B9D8EFBD8A6B2C024D5E8E10A4485F922F
-06CAF23E970215328465A347A9E283511B92A442D9CBC7B221990D4F679B04AF
-112B05FCC1C323CC94A73BB4267655DC61D2E57A0A013DF17D61D3E565AC7732
-23BC046BF8B812CF67AF115A80C8BEEB632B9E87BA2BB8FEE8251B9A4B4971AD
-B4982DA27005E24C78E5470F5664BC1F2F48E7D46F660E543BC2C985D2F2B5D1
-8D9C43B976478634A91027F47A5E6F5F89AECBB1C455225528E6A76D4E5E0333
-56C7DBE3A520C8194C27AA32C34AB0AC3F5326EFDC65CAB8F7A63100D0AB11E5
-F3ECFEEC5D9E39760F0B5B3F227B5675F6B782DC03AECDC1C94C16B4CDC1A1A8
-F4341DBC38524D47306D254B37B7CC7CF4E8A2006B7CF3E97B38012CBD63706D
-2BA7F279218EF039D9F2F1B1E1A59FEA6DB6EC02DF73061D2CB3C179B3BBFD4E
-2CC03CC26F4A4136EEE04F991CEB916FF87E1636740D020721257121F938E0CA
-33C265E3C1250D7E62ABF64DE8B4E38D871CB891AB19013334E5D91A744C9EAF
-AF9510DFBCC3D2FFE910C4717549E818056DF04A965140B505BDC08AF8A15F4A
-4DF3EFF98A4F1FA538B1F121166A5C250029861ACB23F8C619481982F6A6A5B3
-F789B519D504B8D94965217BFFD62719F7E8B8A8A51C6637DE5CBE7A2FF5554B
-3D08019194EA5C2BC5CEBDC53ADDEEDA4CE45BFFB9F16A92EFD9C8B224549AF0
-E77131EEAF05BC082EAED8CB6D9DA2A3746510F00F396E66A90C7DD34770F4A3
-A570BB3805F4CECE06731A46151DDD1971731049F57ABF174C5766CFABB72356
-50F03E186424F00A0DD7158429158487223DEB5BFEE53B4990E9DB0E26BEB6E7
-EEEC6CA0A6EE8A8AB949768B21410467A8ADC90E30DA2D8D0E8834B30CD25CD5
-210825E6AFFF42827C99A7E89FD9ED7D11F1795392BBD337320E4075855C5B37
-BEA02800C4F9D24B95E43CDFA3B4B25EF8BF41850C0A0FA8967F94F75627B6EB
-FE9751B0A9F14A4454104ACE3ECBC77F62397C7DD731C0D0D754F5D8975A2FAC
-2CC33806A516E9FD1DAE386456AD8C5D6D84FAFB2DC08710E285D8BC25FD0BC0
-CE84C436045C9DD14C34768D04D17D62A1CD97BA0DE0622AA0F01979B2FB83D5
-0814DA03FC088A4849EF6F85452629634B0BE5B306BA56DA0D95E8C120DAF5F9
-C880729E8971E16729996CEFC60E980B4BC0F734C1DB840ADE2C735E97CAD49E
-CCD3FB38A9764688A52FA164C08C0B9B614771B51AA4E6C95622562ECA3FDCD1
-1C1EC3B74515E9B5303433551B82CD1DAE2FD07DFCB96884BA912A1CA6253747
-28E81A26E46B3169B461943AE9273307E1234636DECE2E32F18CDDB4579C90F3
-48E64E999FC86B7361B8DBC95EB4D1B4B127EB81AEF5B86361FA83085F8F2618
-6AEDEB2345E69557E992535F7B26842B02FEFBC4994E6BE410137AD8CCFCC8AD
-76599D96338CC250F9AAE458B6A274EABCBA497DF7ABA3FD0C21DCF14EDC1613
-A0471FA5A3436E83323CD33074ED47C21EFA96B2035DED6D0D012B6306E4DE0B
-3CDA126ADCF1F6BA4C2B814A658668B44BFE5C0CA3355D738459FB7ABFDBB0F8
-786B00E61CF93ACF31B60707D674A1A0285AED6E4D640FF94A0B0B02AAF27F13
-5CFB88D3C5E5499A13AA520F4A7889331CA9B35A5D2958683E872AF2E51C1BE1
-7A7DE58700B791FB8FFA6E0F249681FBD10BB62BBF56B6A8B788171F0C72BDD8
-E55CADFA6E7C913BF5644CC759B59609756DBE4BADE6115B6E42A4E15A5D764C
-AF80ECFC52EB05FA03D4A87B9E6961F54491FBC6E4573C7A4B960BA6DB2EEDC5
-22742279DBE770E15ED5703D20EEC6E56A61C05D508A64C2DEA63289A8DB4225
-05E16B7D9B915FA7D94CB28426EF0EA683C543D173B22CA22E174A4B3EB88C1F
-AE3E3056F4A3173AED92601CE514C957C7E5277070A72169E9A58911678F9EC1
-3F39BB3E1EAD8390126F8587CDB7F8A2FE06B06732EB9FDF9625ADAACEA23A04
-36DC51D828A5FCB1F910DBFC74E1D2B56FD88EDD58B9F2EB0504A2F800FF3CB7
-502C05AEF78B333E4EC076541335C1E3EC95AC70943127B5632954FE3E0F9694
-9147B51E0D75976878FCC4AEEC2661CA4B19BE4F93B07BB7CF0E835FF18FF48F
-137AB9AF59CFE1C925CB0D548CEB2FEE5F5B7F25C730E9FF2D757391D1310E4F
-EBF025DEFF64DD04D9A06D4B5B84F915CA4810499D3B8F2E3065E5079126C181
-BAAA287430C555E330B53D21FC9C08C1D1822522076A247EC3C322D163FF492C
-39D0BBA3DD100EE943FB6E94E4C9686DD0025A04535538D816ED742D70BECF10
-0D6105BEA237207209BD25F7DE0A713B770CD0DCC988952F847BD8816E91CA83
-0BCBA7A48E9925ACC4AD0B1D1C03247DC912BE14909BC7961267BF4DA4DAF6D8
-01A1AAC313F6977BCF8232199DDF4243829130679FEF1431BD6C7BFCF2BCBAA6
-08F6F0D9A4AD5D04C9109CB5AE6013648394C6EB83ECE2E39D46759AFF128924
-004DA587F7A3D6C7EF7A7BDCDD0E1777A0265B1B4954A1F691BC61E2C008CE39
-F4AC7EF840CBE9FFF366A71A1940BC4D7A9AF68000485C49DB2DB1FC400FA036
-71C490F52C175C1315297D147784383759FC1A0029200E7C6BE31462D6D6BBC8
-3F5F67ABF810D460D157E94DB0C1D7965DA58683759800211657E3ED552C586D
-4405243E51052A55135B4DE1F10248ED310193E316E18713372DB893ED164232
-85193FF7C88FC96E091B565BEC36CD6A757B6FBA76B54AE14C2EF6B65ECD8420
-3D5BEFDBE6A4F71E52506FC18BA2C02F8AF58DDB285F1677DED6F10A93836A2D
-0BD821A5AB069A85D4338FC007AEC8B21FA8CE6792BCB01727990280A57183F3
-6E74CA7520341E95BA611F600D5056CFBBA755B302DA747B08208D21DAF7B7B3
-F2BDC1FA0EB5A05A917FD9E0834F0DA72A9D3AA2AB0A074752737C7A5A6A5312
-CB40DA86B9BC2258EA09B5F6DCF4CB791963D4570D4E89F4CDF0BCE26ECC79A9
-444447D97B32C2C06F48A963135AC0EB1B1D0888BBD1625C11CD4A9F40C1D27C
-E6993E6992E1B21CD0FEFC40BFC47AF469563AC79BD433E6FC0419E3564CD4C2
-E3715ED41E6166696E4CC4FF0C89F60E88691AEF06E800DA26151216C0FDDEF9
-F04F5919E3FCD1972F6383A60AE0A56ACDFA018988E01AF9D8AE9A8EE4B401C0
-1867B3CBA3D9E7EA775BBAEFB8FCC0C22F904421B20B640D165747E180C15437
-92F54D2EE73C22A689BD11E70B5A964C1C7DE8BD98C063C9D1348871F5801694
-06844033834CB512388D1CF765AC08824629B541F84E20AD3C5161A3C232CFD6
-07AAA25A6B71B17D0209EBAE3662041FEA4F315A8F8294A4036FE161CED4707B
-32D2B2BA3848FB1BD93C6C420F53DD1BA44DF7BEC87659CEF2FEC38BEBBFAE92
-392D2B0671FA00AAA30F06602415C8D67E5252E04E91DF5F62B615E71A46A514
-FD2C5B43DE43DF612C36248B8D27E2D7D390FEA0C56A396F591307CC5BF972D5
-E9D7AA5D65332F178F311A8E08E4911813E3D201B3FF4132C83EF21B5EE08864
-3711EEB51C401B8AF91220AC05FD576D8A1EE80C3891A8AA792699FF784C0953
-94C4E33B8D02D81E2F5E85AA049A89141CCE1140A9CFA4C78153531B1C004549
-8D9DFFD86A271DAF08B85F942D93037BF741258CA94DF4296AED020B131AD485
-DEF39C8DF7451F81ABD667E103E9FAE7F4AAC9D567192AAE7E8EBAE2E46087F0
-A83E7F096FD436AC87978A596AFE55CC09A0C329FAB21A53492A1C23B6ADBED1
-D369010199BFFB00FC6554DF5568F04460311FFDC67DCAECE1E8CA5710B0E8BA
-315DFB8C6276B8FB9CB9C14D42A2CF94CD54909E8873FE58D18C274EFFC29D09
-F744357EEE5E12C5A32AD69098A1BE95C6C3713C62A7F86C1874CD274589AC11
-40545D2DA1BF3450680DB402512098A4FD147D47D11D3E9157570586733D24F6
-CDCB0762FB61B16EE2C85564DA2B9A089CE4F12DBCABCF8DF177AF3B1A6F1EED
-D9DF8509AA1DE596EAC9AAA062AF4E52BF05E243C9536086565B71E3D9E78CC6
-430105D74B754836513CC837E26AF3423701EA7D6E816FC7E796B56522622D68
-D750972A781FC96854CB962B069377D094C861736699ECD6ACC998C1572775B6
-00E3EF63719E34D4950D1D674548248B7693866A4738F837EE8EBA89B085AD8A
-78E2F223F7872AAAB987008CEEFE8A8DC2A6F6C379569696D4B2FE9B174F3BF0
-27D331E30B15762F52F343F1CF85B237838A5AF84AF9BDB7611EE38675D76AB4
-AAE4FA7FBD5CE49A47F5F52F42702905B1B5E3C754EC74DF3F7757E7DBC56742
-318745C387EEF697D14E8013C25763DA1A160A63482F8462F806614957E0A5BB
-B32FCCDB28FF2C7C93EECEF415CBEB80B1C0A8DCFF21F6702ACA217E81294879
-AC7E90D9460A39F58D255AEFBC5EC674277B7971B7D272C1F8C1C10AD7B27F55
-90EEDD1F14087D002719742D7CA335853E8641B8AE1FAC60415B83E3160E3A68
-C5B2F117B4503AFEC26D8BCC0EE50750781175FD616AD7A4DDBFE60666F8FDC4
-44BD2FC4C5EC34D1259B578EC11EF75944D0E1A531BFEAF7898965F28306C015
-6D572FD61B31F35904CC6FCD85A598DE1BD812DBCE737DC93FD91079341FF963
-4432EBE341D447F08FBCAFB5C7389833FBA0F47E716E6790DFA1F486CCEABC78
-FAF007EB9686B0C16990AD09DC205662F51BE300E51273C543FB072EF77357F4
-F5AECD3FDB8ED5F316099B380B0335CADD78193F60C7FE5CA9C6695D887E4E89
-123426A47988C2B5F3460CB005C9E139C59E2D377F6F1760911A8FC2E1325B63
-C023F62AE8D2D3AC3474CD637403D341C50A3E380EDFA78FA0C0679DD04F69F1
-3D5F0C33F19D1E670D377652EF5D35F1568D2F3769214B3053005ADAB1C73FFD
-EE789CD271A8D8BB800DC4A2460F4F681F3F1735F456D8B9C4B62780D2A9F372
-665352E8D7EC353E7D81A6E29ECAC96F50700D8F1E618918ADEB06337154845C
-C1B7EAF769D54A3858D8E4F81C7B201F4E8BB74751B8EE4304BEBD849511368A
-D405ED3942A7CAC3E61B49EC8D32E9364BFC20A8072564D427E3892165F7B0C5
-9785EDAC494D590658F226E84B638154DA935AD664B9DDAE7C8344A157C36A57
-5752AD98198DFD97D942C38CC5716A1864270085533519FDE9C7088C7FF9E0B4
-E1511BB6291BA896F40E69E2AB7EEB740778442D57E4DF5D17E7C0F6BEB99666
-4695C52D1A884284177EA3EA6AE6F061542B21C2D3C87714EF5FCD5402E22220
-709E610804FDDFC7C9231D7E85F70CB274F42A6B0D2038613D7649C74BFCB997
-10D96D7E1C26F7E0D58CA6B79C7F709E8893FDF9765F4C53B8A13F28EEC8929C
-55164D25AE26C7B978103A593E17E49557CA642F72F529A5504C6381060C3EE2
-181E1ABEBB12B5148649F461C7643E1243A44C8D02711888A8726AC744140B59
-7CE5BE248EA280D802F0F6B7955CB1D4D0FB36CF8960BF0A718B91FD2D357DDB
-484739DD257C26E01C539C5BACBD92A8D6C97B56EA6DF85B1E4E384295BC5A82
-4178CC59DCE00C6C75139FF17EF33E4654F806D81698E2C35870EDC52AC05827
-7476C4ECE666C134CF2231EB498555248B1DAB1C4654E4EE3B5455D2C472B36C
-958BE6B0D1CC3C87EF568D4D2060C0FBC17DB3B8495660A47423ABA7179EB6C8
-7C746071C267A20E51E231A127874CA2517826A6A980CB51068BC30B7B3937BB
-61940B7F361C06644C1B2472EE1C836F9F9B8A4E33ED8CE8ECEE0F5E09AE4CDA
-088A34153CC840BC895D6D947A57B76A9A6C8F81339CC12682D4CDD18989F936
-3D00BB0BE992C50DBF82BCF62926ECC17FC680808C5E802258FB9EEDAF8287B8
-6788B4D3C3CA5F3CA6ED288A30902F3304A28F40B92A5A6F987BF98F777FEF94
-CC8AD2F86D76A7475348AD3D07CA6CE80FDB458DD8235B852B90950DE333A444
-0B00C47921B1E201D7033832ABE2ACA0495D0FFD3B22488552F43C8A423428A4
-021471B6109144E03B6FF5148B699DE67FDDE6FA25225C6806650754F82BD446
-40CC9FD2D90E8812A6E08CC935126C8612C71F4CAE97ADC75FD58115E212CD59
-6614F53AAA30D9C8A7DE2A6EA32395EDD26713BF8B6086225970D8B4EEAF71B1
-D3B6150B945878F806BFAC36C33B2344C5233F7C35B8D1264EA12DC081914E60
-78CD9F6AB21585D3297452BA7EA1CA2BCF3F39AB49ECCF8BBAA1A22883C161E2
-699D3A46B51E75E3D80A22ADCF6984B6B67BD11FF7E05C46E0516B434792FBDC
-A88DE35EE688D35ABEC1B8945A9A3806C1C214D80D0B60DC31496898B73E46B4
-8EEB7B9D2C3A8829E041663AA48E7378DB18079F4D76863FB08405EE7B8F3D9C
-328314A3DDB55BA7C28D4ECC2A4E23A701B88A80D82AA2BD4824FD90F47AA702
-014753CB1E8B020F9A3CFE47F6BFF747D257F48F3507494ADED3BF179FAC674E
-2A372DEC39D0DD73AE3F932BC5513947A51671365CB6032F86BF3D3D0F1E8CBC
-145782A2D8B27FFE77AC5E07493BF2C423A56A37FEAD71559A149637F8054AB1
-5F76AB661DD116FC5C55ACEC633447343E30C555E0042739B9629D712CBC22ED
-1B725451BC0217964F3482250C473C77286326EFF965406FBFDA478FF4E3F4E7
-A53CBEE24C1BB2AB8A79D88BD7BA1A7B86C3650D2D5C7F23119719586BC11C6A
-04C0B90489CC46FFBB2C6F6E8993DBBAFF62F63F79EA27C6D2B1FA55AFEAEEC9
-705C0A22B7E0E94CF9306452A854EEB6FB0032E442B5B3A16364BB3ECAE00E77
-2B845CAAB5966A5E78BE8C5440063CA3BC84A4B0A07BE880012DDA7FACE5482C
-0DE438ED79516FF924EB0713A68124524D74730A6318E359B27CFAD218DDD03E
-5EC4EE23FB7F94D4C88367F6299372BE29B5A4059D1F00C0C2433F79DE287A3E
-60A5F5B1C812F1E12809A07F9623ACC0C0DEE78F0981FF701AB187FAC2004BFB
-73B0926EC097237B301C311B478FFA455B8B1C1129FD2E4A62D43D2F79BB693F
-1E88E5DBD5705480519B874F502197C2CC30D8E716A5DAB4EC24298E7DEBEA5F
-095EB5BB78B4D7847B9C25F2D462C86A5033B7EAA136BE3B3993F479B76393FF
-757CDC548E9093D916A40045AAB54413B0563FD905451E2D0BD7815FD377E00C
-7DBDBCC6476AA2C82C52DFD027134D8154734342BEFE176CE8AC20CB16C173BE
-776D5089A4C080D07196A06AE34496F04C5B3945BA8403B2B408EE150BC0269F
-CE8A1C1CBDCD996D75705F6CFE6D487025D924208E6304791CBEAA62DF66C80A
-9557DF93ADABE4ACDDA1C18DAC4476491A84F8C8D8932E6C02FC22B7ABDC397E
-AC155EBDC6F8DBFC3A2064E99252D3122685753C3BB839EC743D7CDF9428CE6D
-0DC0CB52F218CF1D9C8412DA2CCF13677FB55F9963BA89A47357DA9957306F70
-59685DAE5D0A70D180949B206D8502489F82D89AD159B969ABFCD08A746B8ACA
-538FE5E148F151034B6A69F604AB09431787DD29C6D4414FCF3C4D04090F17C5
-0BB65452A3EBC75DE088201997025F808360A7DCE5C74F04617E9BFE06072F7C
-D3EAA6FAF4F5CABF9D87B851CA785CE5A675AE5DAE55C996D5CEB5F760051237
-F47CEDF612D326DF900C771FEF1AB9CF00C5B29558FE329E88C62FDAA94EA598
-FDFB4A27216007C73B14FB5FCD9AF42F39C0879080463A9EFD11614105469C73
-F38A92C4AB2290459238BD513895FD11B0234A17B303A1F55617EADCB41B7501
-0FABA82CE8A8C5E98308B5B655DBD6A63CDB44B3034A2E20BD44947FA1F52217
-01B16A2E6CFD35527363C5981CDECB886331092AE9DBB2403126BA0EA79C7356
-7AD019A16D9957B2617B5F4F9B7F82E75A718BFAE6EA4BE7D8561361DB470A9F
-82E7828B10C718536D6DA7155FCC1FDCCC2692BF147027F9DB207E981EBE36C5
-EDFC37B83290541EAF2514891728F4D3D17730396614874BEEA92FC26D1DD076
-0142E42962897F27700D4F34A946571D2AA7F5E9BBED708A9E1D0BB2F9FE0823
-A6D026E3C9D4D92320570B87D428F98BD20A395BD06B600B34E274A9FB42B0BA
-4430B56E5DED6D014DD78EE54522C25429E5F6FBEABD61CDADC297ED24758E2D
-85021DD2E900864CCA07616BEE37C74B379C279F554C4A20C195176787EAAE66
-1466F8126083FBAACF3E774843202587C09AAA172DFB89E26761A7398E9A9997
-256301DDB5ACF882349D99539BA40C38CD3E69464B76B5839EDA48508A3D7246
-FFA59703562647B680288D2944AA440599D0B9BCBF2E1261F3AD23100219B1CF
-3A1FBB617606892DFA5DE1D7C221C4A6C8608566B92C67C3044CCE7FFCBAE2F4
-100445E92F506306C2553EF320325562284B579353168624EDE9FB921A759BFF
-29F65445AEA413844E4C9E7448E47E7AC8E934D993EF1DCBD153537282E28104
-DFE7BF8601A2F1544FA971B9FDA521F228BFC95495CF5BB48E4DB9828F64769D
-1C7AA777D2F1B79E054C1E6A03D3D27CDAE3594D6F37F8F03572778058A6FE9C
-E8E9AE758B7D204A02B5CD228029C1909656F1A784A3120555C2705370C80B6D
-6F0F9A0DA15870FC79D8C451FFC98D8BCA3AD6865ECD906B2D8B9AA6F62FD013
-9B7D59E9F9C84976AF2F142B953A76748C078A1B32566CB71C808B4EF5B0360B
-60000145951DBA021F16E090FCC1137C613A5C488646FE8DB564D5686D49E0EA
-152390D5AED15FA44C71C4A829E250CC5B3E2B708EAFECA4B324FAD72A5FA2D7
-CB9BCF155F04EB6EFEF4CD2E38A6D435E09178D26B9879DE75B7E366DC829DC1
-A7E25E4DBDCC29DF8AB10C7FC617481FFCEF59B60ECD35DBCA03CAE19A9804F1
-758EA342DA058363A1AB7210A73045411EB5EA0C97C64C7D89162861C549778A
-F748232138F5BE892143DB15AFECBCC6E16646DDB26C7122D7FDC60D530EEFBF
-32F9050BEAE6A683CC7702866FE1E6D543FA8866CBC92D25772C79E823F6BE83
-F1F4F52F8C851F7F92C1E81A3FFAD932BB8A35C263B535B3615DBE8ED8770B4D
-84915C479D24345EBEE99B722DC5C169D04A908BCC3D0585BCB6C96DB29A469F
-32689E30797076DC2B096E1C92C8012E3134BFB2CDC67E6C389B93018B42D727
-88FAB5CD6F4A4262F4F45D72346645B64A393EB960F6BF1A26CA2FEC965DD763
-1276D5168664E29A51BD7B8A10CB6F8EAADF55C9727DB220749073D3E1FA31EF
-9F468511A80615D35F26A05FF01C183480D2AE7E729B9B04A39789730E5529D1
-180942E68402D7407419F2622574E55777A4DAEDB7CC9F6CB605AA428F28CA6F
-C859BB79A649578095243268D594212EE8A80BBE4DB720EF6B3695F8A16516D5
-6B6DB2F9D93EB1598E06879AB08ADCAF0DD75C0BD31C9B8F44041415E6EE47BE
-4421A95E6B80589BD4CBA6066C1092D76F97EBFB971E38B986762255DAFBF5DC
-7F3A28A028DBAF10AE5D8210285FCAF35E22E68A42B3DD8281D41A657DA2DC3A
-7107994D7E9FF61934E1F63186B9E28962AF5D783458A85A84A5EA3676AFD039
-F899DFF2319013F517A0D3F36EEE1C42DFA5B1C3B8E41A5BEFDEE21136F64A74
-0B2F3D8F2E64E4F106DB68C3FD4ABE346FD45B90DEC25D1B705EB119B08409FF
-3769266F3A94B030B57BE670BE932ABD17800AD8115BC513329CF65557EB4E66
-788C2481A74AAE555DF0B8C1746FCE0349BCCFC76120274B4414F3E860295696
-7A94B5BBCA7F31D3DD01A59E2E2E188A323F1FA8E1B9EC45589B444FC7438731
-F4FDE301422B653FEE01C38E0B68DD30B1B7E2079EAA2332BEEC840AA36BC3E0
-8DF770114A53A01DA1F4F2BC6EECC92160E3EAEB18041E2FE43891778A89A23E
-2FFE2A64DE61CC651CF2B1C44EE9677DEB492438756A31C9A3E89678959EAFE1
-B93A0A25B64712253BBE7259844D4988A574FB1219C96915A7BFAF654DAD6BE6
-B1A88AD6CF09027359A681FA82AE364D430AB261668897C5414511B9B31DC31F
-FFBF69F5C1EDBC0187EC0C658770EA19697D92D1A35E1A98BF60F6CCFC3BCD51
-EE602EC8A919306705D61579F04CCCF587C6A5ED9B056FFA9FA84FF41AB30EA5
-28D5498ED5207B7244EE46C84FB5BABD2AA6B136559500CB5BA0FD4BAFE45AFE
-9E0AD540712C7759078A5C257C1B542BE3DB37BF0CEFD0F18C336D5B4C5BA34C
-9E09B8DA0E388BABD69F7D1573A86E1C52AC315719A5179E7D986430BD34CFC3
-6110822B15779B121E917FAAB2510F9F280AE0D24F25D7D6CE64DBE1241C3CC5
-D9E14F5A5B8E3B16957E642784246850E3644C6ECB7954B469C1CD954D0557A6
-6F04BCFBA452A34A6733543D8321405EA12C1658EFE72CD0D2BDB735053D38CB
-C72446A5C57FBBA56345C1B00B4E0DC9BF4BD5403B1E1BD0A890A95316BBF90A
-C683E7C352E2D61B24E84C477AE559D5BB86BAA35F235AD4F32D7A9C9FADD578
-E3FCCF6BED0F7DF1E412B8A923F7197DB936E27230DF61C370318052ACFF31AF
-4709AA521D561A6F1B4C8C425F6638A138EEA6A8CC069559AA3E35C7448A1ADF
-7445039449B49621781D2D5E969BBC78A0CE5FDC02A7E0A76828FAD14330416F
-B79CD927968771EDC913E875C5D11C2F29CD9DE992F652DEE96685DBA857D0B6
-0A2F410B2B46D779B25BA538E0B0145ECA0B14BAD0927FC63ADBCF8EC10506F8
-282DB2D07172C19617F95235C7AF6E1253C8405F53839B54C55DFF7C46A16202
-BE0F0587471E8D83E8E91A3C9F3BBB82BFDA98811803945EC85607FFE3E94E6F
-7E26CEE7A306E4C4409DCDD8DCEA89DD1F08EEA1F0EADDAC133DCB1931255F63
-5A22E592DBB0C8949ABAC62402CE17DC7A18AAF815C6C86BB341E7444F878817
-1590AC436E3CEAB3FB79BCDF5A12F2413A82579DE9E5E36E92B47E465CB3CED4
-554D1E308769F56B2C55CD8029696786C0652D7F042DD0DB7F24AED531753E9D
-82F63CC50A1240F87EA74381D61D912C8711F6F6E9C0CD3A302D0F3687EBF024
-C97CC23D4E08514D6BE8394632BBA157A6606DBFFE884CB958E2F876525ABFC0
-F0370C5C9FAE209F10F91614475E9EE4972E95D8880F5714F0D414272F3AEEDB
-EA181B2BB43631C15A68C0CAA12A8B9202722EAE1D0897657A1A8C57CCD0DD9B
-F97C68EEAE1E098DB56203C994904A400D4750C150ACE554E7B45D4D22563D0D
-8879046FD0D8DC9EA5893D5A58C85E81C6B2E13A89C55ED399EC11B5C1F80EA4
-53EC27FAE17E582B3EECF86CF73119A8972F00D946ED58931A10586B6B51D39F
-72D17CC529105D5F8D74534C2CCFAE412A516CFD4CE923EE8072950A606224EB
-229147A8FECFD224E4158BEA0DACDF53654232A1B946711DC8D20146B4CB7D23
-CE3F199B1E2698D626A28CBB039B073DFB33F29DD00B58875C28C700A985B0C2
-92656881336BF5DFBEBF01FDBBAF1D86EFD6F6ABED59FFF6F6790E94ECC70B88
-B0CFD30EB7D4677AD2E280A65CD9D95A35F7EB0263EF3231AF61A1E81F2D46E3
-D84C94044861630FD92006B7C0AE4667F0D23FAEE1285CC1B9D6541349015E38
-8D57858099E69487015AAA314120CF1D2C23BA28CFB15F11C12ED21EC42D3E73
-80AF786BF3958C30AFC42553C77EDEDF143B6F05BFADB6089FB93B9BAD0EBB87
-8ABEA058ED232D3F24C48359BEB73EFEAFC4DC43C6A1C4ABD12FFEEF73CF2649
-84E08AA367F464A5E009D2BAC23CA90A1B3F8B463B7EB947A25C9294E188BCE5
-512207D22E67150459C694156A6AB56EFC0637C661E3ECCB5D5331BBC268284A
-8695461785F63473F18C9BE89D9447CE7EC2CB9AA325BB56A5C7FA6D03D9CBD7
-6520F3D07108DF20136AAE5C1D3B0BE03715C7660F767846D85548C3F6B5FB61
-19E0E43AA7FF6CC70789D3B646F0DE24AD23FF3ED668C6E7E25FF7130859A5F2
-3392D7F16549D755038CABCC821BEFA442C8079A33FBF042FCAE80AF0FBF8C96
-6E759BAF5913D55AFC923B065A752A6E47CDBC6DF8C5E3685D289220CF593255
-E509311E5D26BF43CC8B7BB2A519C274423089C5FAB6033E17625C953E9BE3B7
-FBFD85C879B64DAD56EFB9F0134E5714E8411249B0DED90B9AFAD6E40ACC3C32
-2FD398BD0AF07732302617909BA907AB22062EF8C849CED6C30A392BECF6383D
-E6A3FE99D6E928CDC000C08511327BA7A0AC713A78A3D515E07396AAB5147135
-86695C077F211101014466A2E7BD0151B3E752DE0D255EBE1D2D56C5D11F778D
-5FB60C8FD628814DA7F9A3B7F95CC77CDAD55477364A8306D2B28CD374926E57
-04887E6BBAAB59107A7B89C36BDB46E5704EA401C4DA6394D3AFC428F45465E8
-9D01140F4D783E3739AED22E0D871D5A4017D9684D2E55A47EE953FE22B75522
-6817F37D12A1EC0976441C94FF787EDFAB1E409FF9AD3201D73D24BE56C7CAE0
-43A73CCED4313542F4C1112C35141808CADC4DE6EC7E832A4AB4A580C4F26B90
-5B37051CD708D6B2D770364C04B7546244474FB9574E5ECE5427FBB29603F543
-3D41C97C021348F027DE6EB0A658750AAFA60737495FA80D6E1F61F1737FBD7B
-0007EE164DE9F5877DF68DD8CB10A8F06CDEC0EB86280B3EC29F9DBEB1B91357
-0A51B254E35A72593862247E85053B922581A1840399BB254403D721AF75E774
-70BA7AB160BD5C9CC6EC08DB9DEC937712328EE8811FC9C917B293575A6439C4
-8147D7586ADD5DC23C61D1511DE64AD1F5A93A4BE587A99DB617CC4472B1F984
-24D991FAEB3F6CC28A21ECE4DF9175CC0CF56EBE2D262D431D3E8E7A1D220FA7
-CB18F1493A97CE32DCE1D95149C5FF848ACD3B3B32C433064AC995006AA2B775
-5C4BCE15748227CB3673B7A09B5DCD00631F91CB0A157FF1710A9D56505CF964
-DC1901FBC364BB98385F009C20BB41F96CDCA2021E36C3EE59863D5298497915
-3BA4DA380C705B1D81E07187A3D4B4191E5F22116FCDD21A3EA286C53961ECE6
-BD7D029AC344E7A5A03823B6A13A763C946C41229697DB8EF67007A934F27F7E
-07BB63C5C5FD24CD241EE957F854450097D5E6E291812CFB9EAEE923711BB88E
-B74E472FB4112EDE27A893B34725C9DA28F91F4A91EBB54168E327C1F9AB7A80
-96FCDCD85BDAB9ED36DF209620395F539FC7184D88BA680389BA9CA51B9A5397
-BD0120BF40DE8B99D6205FECE2E509EDB0C39BD75F29D6D97E514C2E3683CFB8
-FCA479BD47C8E02DCA2AE350529A568F66A7733528CA14CFAF4E792F10A11C3E
-CEAA08A97CBD6D43CBB43CBFDC7FAF22E87EE9E008301D60083FB7002697B3BD
-EF38EB52049C00F157558B3A8BBE5361C82F049D4566A1466869FF2584F6DA99
-23AB74F19AFDC1B6CE4C4AF0299F6AB4E57AFD2EBE1AF260EAD4B46A79ECF3B1
-BEBA4B9154DC2390AE0061E48D002EEFBF44ED6BD59317E017C6E42B2D8283BD
-58B8DB392C511C12C72518A2B1C4D185E1D0E5068ED5F4C73E771A75F0BBEA45
-428E0D31C9083ACD4842EA136FB12094F786DE99956EC2EDE1BC9D3352E68CE3
-4CB3994988DD766F6DE69C5FA907DE7B338F22FB9377E20B7978E2B0BF39561A
-F526141AF262AB9C6853BC1A947D79F8A6930232F955C6C88484791460E7AF48
-B235E17AD4507948DCE6A29CEA6778893BA825CD9DB22F9BC36822EF4E98EFA0
-628F8190C1B4985DD9A11F2879AE248E2D4115CB01446379D9FA1820B39A4B39
-9B1FB8E33D9C22EED5CF125B37DF0B7A471A58E7CF6E516DBD5F54C609517F00
-D40B22BA5BD7D3EAD411D4373FE4BA22A93E2DCE3F7666B178BB881AB2138076
-87DC7077CB5EB50F0CCEDB1786E5AE3753C4023E9C6526A57EF2C833CFC36CF1
-C818DA36058631F2E7D76A8573ED0BBCF641034A35E3B7728BBDB3B8CC9B81BA
-71CA28E2FABB0714271E3CE86F5762B3975834692C390A3DDD31C7A609F3B850
-FC284EE819E6E6A4A8085A92155D502F95B9A5C7E5D02059D9D0B7D06F9D5ADF
-85091858CFE4C7131562507C64F8AC607AC9936C79C87DFDB9E6A4E2284A5BB7
-4F7BAB56A319EC9D70D184F789C5BBFCCF7B7C2B91C2581E8A5CA55C8EAC26F7
-CCB524EABCCDED72C187EBB1F6943A992E63C0D46206251BDC363362A7A37081
-9D58205CB308A33E290AED466DDF02B1FE375669B08B19376CE9DD152E0064DA
-EF925DA958D560D86FE710D798941601D996C655C553DF0AE6C0F3A18E54817F
-7B30DE1D156861C9529A281DFC897A4B4746FA7AB6A95461BCEE458DB6D05332
-677619D0BD96AAAFAB4EE63912B703029AB349AEB275AD79512DAA4D7212C101
-AE39F00CA8DE02F438686211D567EECE1E42FE13386314A94281F014440D59F2
-6E258D72363746144577C85BE389F65676AE3C3D19CD2CB8BCAA75969712B8F4
-7629698C52DC6001E32736214349690EF8E57A8BF50C9F56A4A0493FD66A919E
-9875835511AC63AEBEA6BD1753044BFFC98432A7EEC9E3AC68880974382B1EDA
-7E01A7FC78EBA3A38EE6BA20636CEAA56E3FE22FD60542433EE5CD688FF4018D
-307D893C2021D03C7F59C9F1387960FB843E1AFBE04A2F6F406C31CD5DB4B24C
-20739D6D74C7BC11B20382DDE8EBC1098E0B5521CBC13D346DED4E5C41701B96
-A8F8A382207C21582BEF7D04129B3AFBB97455EC964455C85B3C177C41675699
-77FA7D7C2E62EAD5C151965CF3B4184C3BFDAC859E1F096CB050BEEC459D7317
-A088DDD378A476D46F26C048BC4377CC1BC095F688B7B7CBD3971AC1F050714A
-35C81786288D82C54D86F5B00ACB50B0450A2EBB9DF94F0A7AB1B0DE394BDB53
-5C7BF36E6CFD410056591B94C351C1544BCCC77C06EF80A9D02026BE1D6B7889
-212859D0998B0B3E5DB66E75656D69D30104DC613DF83C7CB2C8F9D64646A7DE
-372AC87CE3394DDF99D86BD15EAF56B06593F04E47862141D81D66D83AA8806B
-47D3B43FBB79E806F9DF2288D9E6A2CDEA497B854C743DD4373017884177AEF0
-B44D4661C0989492EB7F9A5894AB8DDC93D21DA24338E7E12EF3314DF207911D
-B84D6CE001EDE032D12416286899FEA12724AB45497E4A0CB868E15FBC144CB5
-ACE3ABC1B5CB2BC13A220F93D9990DD9B4CA9726CA00DEAFBEFC2BA9EEC3D94D
-595582174CC45D726E8B961860CAB4C611DE70769926372F11492FE2D4693C05
-9AFECAD80BCCA589D7964DAB00C5E123933F6BF2331091E81E67F0DC0ECF1707
-0BB1C5E2DE5B1C88FADFAE9A6594B5EE9E9706466F750195D2D1539F7C80594B
-531DFD2DFC0BA2482D86F2C8C3EE068C3B8596742ED27AB960DDE361827398F1
-CECEE6F2C74F944383CF07C88BC80448AFB946C782FB232CC3FC17A93E7EF7BD
-3CE53C6EC2D3D25CF63A3CD27140B8D17CB74BDAA4BF2E76CB2AED491E9E1F70
-800B380CEE1A505E612E1BB47B07CA030F9E22C8E5B559AA42CBBA8C36E4A7B0
-6F1879675332B6EBAEE398CC34ED9E02770A3CE0560818B77EFC03B0DCD583FA
-CFA3251AA96C0193B195DE6B37E89F2279603E17036B3152A111C54D0BB8EA57
-32CC5E5EA68254075A7133AF0EEAA153ABDE61032E6B4DF6C057DBFCD5981449
-68F39B3B1FA9EADBD8CED34E625A23BE959347D92158FB083FD351BC4AB0961A
-2FDB383CC4AF0F4D841BE9EE98C60AFEDE729630E558D54477D47B41A63ADE7F
-BDEDED305CE9A874EB2CAA040DECA194FABDE66EB73F69DDC4B4542F035D26A5
-26ED690F92548CE93CBF174EF853217C93E25A68B7C6E47FDDE19627AEA88A5B
-5075A2EB5EBC4F291D8D47BF8B699B4B3617731ECD998002F003AC8F48B22EE6
-2326AB694E4D985154F4AB6F53E2023DF6A2705CB3C6E2122422A866AC481A30
-9B9DDCA04F7F5D3328AD58454FBFC63790F87C1947A987F740B02B8D19C62A7E
-AEA6F7F7C7D0B1EF9A4A04094891F1613D3485DF031D4016E52729F0AA3BCFF4
-A5AA7C714B957C6F20EA9DA162785C4F25C37C0EC00CECA092B74C9BB69B3CF4
-272D015F54E607FD3BEBEFF03973BC28EE73685E037CFAB19FB5000E16E05B41
-23DCE6A1B6C3C6426F675912DB1886B8FD8EF3FC186A4E8581267B5289BE404F
-1757296E1E0D67DCD01A0BA71E46824F962A5220BFEC6FADC5F3911B1F13829E
-41C92272767398BB235DBCC3C192136AFAF90729EE25933F761582FEECD8A2CE
-4EEEDD25A50F91DA79309E039FF2D1D8268ECEBAE56DC01E66CFA97039B96FCB
-7BC9B91B6349BC9866EAEBD1C3982F5AEA86D38C3690FEDC113DD71B5BAAC063
-72C28280BD462003F9B8BCF16B3221550552720741E85066694CA465044FA504
-2BF11776595CC01926639215CD1258F59C16514BAC7A0E0DFA9BC3E6465F7495
-882A0C8B8E37DF36F890A2C4760D38490C031B61231C3E2D8FF421C3E70F7F95
-82383BA66DA2890FB3B6001C69713E84587537C409674570DC75F041B3232416
-B0C3483A2A724ABDC5AFEC995C1F32722FB685388A162BEABD1EB092D1105EA8
-D7C03E271937FB18A65E259DCE716A5C0878A01ED4A275FEE7DBF6634F3F3BC1
-1364443A9AF6697EE9DEDFA9DD67FC0AC679498D8DB38816D3D51EFB75E9ADFF
-6715121DCF5B071661A9BE993CD9BB6E5549E528701702F13B5540AC1A01396D
-84BDACC73DA1B07CCA3D213AB57C4D8F1DA01AAAE6C92BF2A197CA39C992F855
-F2938A0C8B6B112FCA85829FC4EA35943B6CE0FDFB766308ECE21566A2E59A23
-449FB9BAD4CF2B6460FAF544FFD5A0304763B6D61D91CBC7BFB91D6FD3559F6B
-89C91F3AF46F9B14203D2813472065DE22D07D828FA2677C876652AC40AAF58E
-C1838D8A74D192964BC8127255EB00951148CD288E84F960867BC49FA2702E2F
-7C8023C3E86F10C63ABFEA6A328F1B9FE422488834E4295AF83BA1604D132A05
-6A68331BE2809C17345746B9341C97B014614B266090D5FC73CF8D2DC45E0F19
-EF046962391AD19DC55334C72E3C131B502A63A8025443F5DF795D0F2E99D749
-DB028C621902C64E72635E9A4CA28C86D59006A24A65A6BBDE8C54B8C433DF38
-9C93E3A0A3F21C223D300167C199FE2293BD5ABDD9F0B4CC092A6151BB6AD061
-D79F12F437EE38F6214A9C009BE720377AF0021AAF5783EA1511004B1238ECCE
-C75F2CF0032133C84981A7FE1241C65DB91D449618EDA8FFED39D3066B6BD0FB
-7DE0542C491202D694922F4FA4C4BF2AF72E4F74564F2AC3F54A9F72BF693675
-400F251F863683A1ACFD71981FADEEF3650B387ACA8846D7C57A84B5BF5AB913
-38A4BB4FBE788E9A856E366895E36329189BD5802F95DFE821C79B3B8841FBE1
-29DFEB3A465E36E1CED694425C1D700239DAA5723C916FAA77E91E781696C8C3
-E5A4571CEF70DBEC17C494ED46BC095486079ED8443BF0894B26C39D492C4802
-6CE5E89BA641066EE9993E5919207B12BECE4773591EF3B48EE224CF18843DCF
-3F346BBDF9DA3B8A85A86C0B8F498AC5D92146BF9C187AAF18E6CFF2420A1816
-57EE974186F63E5A161375A822C588E417746972BB1A31B0FD68B95EB128B7FB
-0CC33F2778C6236FF6B588B1A9D24BFE552BF848BFDC9C275F4E6FB1AF090EEF
-9483A7AF6A6D7D8C285F535669786F02F0AD230DD9594A351D72950E7633A28B
-ACF784F1E2CBD036EFDDC24E9DADD0C67F33D8F5C87E97404F718437D3F768D5
-DD9B9E81D81C0EA3445BACE76BF67DE5801FD0AF3AB7B0C40CA1412631DF8DB9
-34C640F23C28B0F44DBB92FD79C254F768ADFB59567D4341B339F9C9DE47D299
-3444A3E8A1392122F8FCF9B78FF2C2918A3FCD1D4D642BF89D2B12995735096D
-A4B65388D6D8E9500674ED399DB7A0E35F7A80DDE50841FFFC19BD7434320230
-4E3EB457EB7724138BD8A53FD10F5DA01176551136B004F4CB535BECC7C79B52
-1DFB022DC76DD3FC3DD114A6A42C89543196FB5B85B6F8B9C9D9EB55752F69CE
-2EA3C2230A67A15AE41C93D6904580A26CECAE69E12E7744CA7C1EB558A7F4AC
-4243014B5694363770DADDE68740C483F4740C97C861293B2C06D7577E63F5EA
-1B3373EA993C1C9BB452988A474D56D40D4B1181DCF2802B4822CF34B0FCB29D
-56255A7DF6BD8BA1477F786502F55A31467EA9011A71216B93BCA4032CBCF8D6
-73BFD93A21D8102E4CD8FE5B9039D7AEB01708BC4976A5CCE0C757138E433568
-1DF2E3A2CD93DC5D4A83C60011E7807F206E0C13AABCC4A2351BFCAF4AE66971
-75FAAC7162E84CC0515A448997A20878CD4092777668D3806FA0D28488478110
-CD37E011C61FA9F98F495DDBC5C43B6CCB794771A954FC694EE1CCDB92560F29
-C4EB9F2CB61543667B95173E1A36D50F448187D52AD351FE8635A95AD9461966
-AB6D6FAB28DAB949B79724912E910DD9B78703590C55144DA82BEB8775855C0F
-3C8985283167B473B3B2D495BB913B12EDFFA92889E5109C50244F3005DDBF89
-2583BE928EDE0102B0F7A40E4B0EBAC9DC01DE981BFAF286E04ABE3DAFC812F2
-D066DEEBCA2CEC8913338335D6297114655C844254175128C13B0831693ED51D
-C834E442ACBA7ED6A2B3887A19C58B113A7BBEC794A909A1B9053BDBCEFA2098
-218CFAD30A617246BDDE096F066A00BF81F8FA0551AF34D98F50A16FFB09533A
-E35D98AA6BBA9F845494FF985D83EA8B7888D9B058BA84F801BC9F78800F2CE0
-8FAE86FFC77A085603AE7002E4F6BE5D66DAFDCE2B355086B0FEF5A7E2A87316
-DA9D535BFD88B835C7CBC60220B6C546AF6F8DF890C9A582E47EA590307BB5E7
-A37299C66DA33CCFDCCE4E289E19A4DCD0ECE5CB3445EA37FE23053433FD502D
-6CB673425C5D9DB2B0AC5C56D6420AA9E7598381A4BC05733F6479F24A9DF669
-FA4C9CF602ADC5C4BEE77BB61D8A3260ED88823D20A9D779BE6DF977441BBA4E
-CE8E15F5AFA9ED9AD93737EB6BABB8B32379AD3BC714A6D1152AF18B4684ED18
-E46BFF0725B90A4886CF93FBD29246F9A79D7B41432F598B54602304E77DF101
-C414CADAD6D520FC84406FF20622E60B45B7BB3E353BDB5D4AA824CE42128847
-C11BB4DCE8A8A0EF76035908D50386546E45A1548124FC24607C397EF14C6ABF
-9994ADBE0C74129E63E76BC5BAA44BB4F42B875AE8D756BB8FE5153ADE5244FC
-784CB936E7C2FA1FD6E6300E423A4238DB8D658E8F1B17C39F5A1A33C7F44330
-7FFEAC4C1F9B8CED5308BC43E4C128FD8457B89BDC493B9C68DAF7E76B3DB809
-F6D3152B676DC1A1E103C465F33F087BCCB64583733E3773F7D6D4C994BFDB59
-0F7BC03897EB3CCF914C1FA400CA14CD5294B779B7BAED650CB2C8D486718876
-07B60CC3D111FB8E5DA6DADB3951595CF9EFE458EE412082A35EB390C9AEE0E5
-237811A13BCC85F07A245EA22650BDC4A9E8DA0575AB3269A4E40034013BD348
-44424AC74B1F6628A16533D8DB6D14DFF72E1845416611D45CE2BCCE3F34B1FF
-86BC076132556E6C65F2248E073825D2B2D0E3DB91EEEF5D33B12B0ADAA304A6
-6291DC109F87E7A92335767B3C711F92F105B0B6AD525A6F8F72FE2644F1E180
-4578CC1C66D4720DDBED3CF91F1A46A96F5619A6D762E012053D14A26A88D6AE
-87E37882423056FFB32531C99F2CA89175FBD95EC4A9E678B440D82DD77F9C5D
-4B6D97D1BF7B2E24038BF1BF4B8327091EE59491D91DA01D8756B6F83C28F203
-572983E6CDC9C1D5C865B753D9B8820A39858C389CBFA4DAB82E2D35B6C5B332
-66A239F5BA78A4EED07507D2FC075C65DDC391B1A93A051F559C832CF36324B8
-B7909C130D20CBAD9EA9FD1ACD079D7B95401F72A950D81760DBF8895876FBF8
-018587D37FA6ACEF2593364C21F8BDC34A27392145EB2F63ABA3771402316E6A
-2A30C48B7EA2096BF6E53DAD2C47CBBBA646816DD1E6EAF631F42B108BB2FC5D
-BB808F1BC7A8D3501B2464F8BA83303AF8C43028368E6C814541E17717B397F8
-72034E115CE0AC6EB5983237CE8F604A9549373BDD938187A39F6418A8461705
-A6ED43F775595C7A756D9BC1501A440E6E4ED43B01DE23A206A654E2FEB4A2A6
-4A2DEA86708FA9CF218CF933DBD13044E82A7CE60182F6BA33519BFFF275C2F1
-6B6692E841CE26752200DF632FEA9C93BFE0267D4D5A99566C1AA78DFE8FC63B
-2917E6DB430CEC52D19DF490FA7015D9796282C3FC78F9CB2F2D1CA2A1302CA0
-C6A066ABEA6C871D69B5E5EDC514260193C6C29C8D308AC4A6D38C962FB7FC67
-EA268A9395414F7E8DCEEF611D1AD784E9D56A4F71E13FC7B697408C1924AB70
-A62BBC66F38ECEFD60BDDDDF85F849BA956C3F3BAE422F9DA0946100221556D8
-404BA4327E9ADF31B4AA708541C46717385C3F57C3D7220C59AB272AA94C4F1B
-62136AFF190C4AE70F287D2336991886EB3F14D2F2CF9451CB55C162F494A261
-1A88690D9308B80A3BFC92EB48FACC0C7975FA1F262D81359C88BFA3B5F91461
-EDF3E9A7764304AD3EA1B51DF695C915530389C7DB27FDF73D37CFA666E6CA37
-389BB54CEEA60324D68423B33B2A03BC00E7C890FE1A276A3741C4E133802C69
-8BC3692FDD7B0F837AA060A0C08F8A77976E0C5695D16CBB07AA95E8E4355831
-5B43B8C5F9D351826A537FBE9B5F89DF32DE754A3763A75CF5DDFC60258C044E
-B4AFDA88104390CC2894EEF40DBD766A481C5428592FE68A6530F1E063F013C4
-950A3A30D2F352B6E547EFD81AF86ED43E0BDEB8A0B5B7F61DABC796A21F3990
-94EC45D1E229776B9357F339F6148EDC74A2DB064745749A936E1028C8BED9E5
-5EEC197EC2F23457A690F377A544648A9F151917046F34B672C00C2CA89CB8E3
-26AE54ABE1ABE6C6C697E08B90DDC90F54E32C0982299BAE9A7753C07755A6FC
-CD5F7FAF5BBFB9B93032E1C176E568CBF93303F38BE9D78846AA1384A047E530
-E7497DAA12D294DCCB1747411A94EED2F231C5ECB8E8A43851F4840066C25E51
-EAD18EA9A3199BE80429EF8298BF6D473F1407777D857075A3CD41AC7E62060C
-54F97F65A8EF5CE6FEBCAAA7223E2FA0C6A2C86AE5D82B0C80A20F16BB8768DD
-E778337122FB7DF527B0E9AA47BD792C2484784C8731895528A30F7D1B7429E7
-3AD1E59232438BEBA5D065C8C4FF2E6B0A84233EC5BCB2E2FBD7031F1B74AFE9
-E4301B662DE9B6E27F62BDEEEC1A7C73ED4CC8E4191A473728CC5A0A35D2F3C1
-0F743792A11663F871FDA8582F7EE0B7C4C2CEA0AE1AC74A73314469903488BB
-DCF92439A3AEFCF1621488D7BD8BB25318D7196D459EA3ABA44546B649BA0CC1
-9E29B9586D948282EB1D8DB89E4CFD6DFC16A005922A7BFE071819D8CBE15F41
-06217264D10450784FED734EC809C68AC760007A333E4132DA48201C02590D40
-BFC91E614F145502C9B27DD7950C46E6B25D4470CE79CB2DA192336726253512
-CAE6D87ADB60EF451A507CFEA57914F241A8C81DFC8AF788963F2E2EC722F81F
-B2E1D28C07CA64D5E9EBE8722707CD91021DD64EF2700953D590A62AD8AFCC85
-30420DEBCD42A684B5C527BC149DDC14C4FFE9B350DB04B850245A1650E749B1
-B0C094644AD43AD83087930CCA240ADDC2975E05397807DBAB4AF30E6CB15F7D
-014771BEADB55CA911E29A38D7D2DB1614DCC0FF899BBE9FAAD2513C27BB74BC
-A225AEFD85DEF96AFA64F89405572FC5C3A40BB24160D7F274ADC4DBB260EB87
-BCE6390588627BAD6B640100D58212467736FCA465A4EF71821C6D765F3FFE41
-A030BAED3FD7DE667BA4479D5316588484F6317B88B6E91018F3202E8625B837
-49A64AAA69B7B00FE37413D1E632B6404167A439F9F2140975891FECDAE0652A
-1FD5FFF18973750883207300E4CFAB59DD7C7394F173D0DF78DA3516B44B4D03
-C6761A6CC49608F0CBDFBD46FBE6FC6E7BC9558F281A8FE32C5AF888F3241AA4
-BDA43506A22A091D67934D138642141EA39CF627A6A2A5520634A9DD05F09165
-C03C0A3CBEE624E4F59BBD2201BD2CE1981F46C53B6F2D91AD7839579FE7E7B9
-A29DF2BD08EB5A218066E77877915B6E1AE372100DA1BB9B8D0B229DE48ECC9A
-5404AC224521D9F648DA7E1C1102CD514F4A4F8F8AF5E90BF78A9E2D90C93248
-D39A5560AA0BA4035EC7B45EF7015A9A97E6A0104194E6748C11C5DEE3FA7431
-267CB641D551529E89571B9D701D1FEAA4F1ED1BF17FB532EE6B6EEAEFBB6764
-4CC55E7C8CCC63C7E4B93C9D0BADDE09B1EC8F31477D636F4C2CCA1A817ED12D
-7E2A904EA8888C20333019E235870FFC51A17504DC9AF8ED6B6A462B7D3AA186
-CE76A233003D7A5AE162B64BF90AD0B784E1581E5AC17CF6EA2746B4240D05B6
-FC2D4E068ED743E4CFF9ABFCF73D66F2671978C6E8B440B08F0C18514039EFEA
-02A14A8839A203C3A921015B5DA8EB9688632EF87CF933F558E466FCA150DB2A
-494F6697334380AEAADE71CF8C532CBCBF70172341A0AF65CAA5D39907AB6DB6
-061948AC7487B667FD546F155E09D50252E2B24C7EBE334527851C8D5164D66A
-56C0502EFA0884BDE703668BB25449D1AC862C15D434087CC14AB94788C34ED0
-2390D067D9D13D4D6E7B551B1B3D494C77F4B9576213835A221ED022FA6E3D0A
-F44A85CBFD09D8E6D68B43BAE4CC2325DD56CB01A93B84FA68336ED8B2CE9473
-4EA7715DF92EA71C434759638A29738C84C814E13D858D0E23645C8FEB660603
-93EB19647F84B481CC71018766552BA16BDA1A94943EA464E99A0230B67E92B9
-4BB6DA4AF80D8C812DFA55CBFF4AE00E2EC16BA3114FE8D39EF537B4A982D893
-7B25BF1366C271B509E1C16E9632A9A64A2BBE64474D9500E94C21D2C0CF9258
-FAE9F7BA3259EB2E279995C2C7802CCB2C3E946B011043A4D7D2067EE56B77B4
-213289CF677C8F7572C95F2A03A6B7EBC64D99BFCC0615963F33B07FDBA894EC
-D1F17EDF503D5BF1E5646E2C7995FB3F15168A518AAA7FD3FD05B21EA5292E95
-BF48F0BF9F41820FEDF9F5DF7BA4C396E4C71DAAD3F209CE8EBBCF5F053504ED
-407FAD8BE9CD2EC265524575069CD2820E516D133AFA55CF42B3332BF53DC45A
-ECBFC8F42F9A34E5663A6694E48B4EE0C5FCECAA33E19A125FA8831BAB9952F3
-51020BF0C27F175DE97ACC64C74929701567E6CD99A0A9F4EEC88509E2B2E93E
-16BE159A8AFA0121AFAD45675FDDE7F795CC8EF9D41202CD38B148090FFB520E
-530C701D3CC82A19E587BBB5CCA1EEAE2687486E1AF28A20E1C4C959F14868F0
-B411134AD1EBBD9CCAE1B708772CEF727D92FD864712B96F6B295849968F484B
-3DB20337EB5386325B127115487425A5D474766075BA04259A6CC75B34D43529
-F41E37D69BCB9A80F8F9B8C4EB2E65CBDF1EFB70844639F347DC5BE018657FBC
-F34908D7D2A25766F1EB5209DF5CB00709321B02E05C48E0363F0E778E0864EE
-E65A17394FD73435E9F4523FB580DE5333B4EC4E5CB09F53504CEC5289B18B94
-76B8166EB1AA30A0512A56B675C4E9EAEE695D82B2D770DF175CAE19AB19E0E6
-E195CBDAC59C6559CA9C3620632C0CE3A380B6545D58486080AA54FBC5C4A8FF
-AE0D6BE9F96C8E489C0E06224FF96E35F16B94EEAD8368D470E5100A0A731B69
-DBD7735712DD3D882420941F5EBEEBFABC28C3086CB238DCB99C0DA005FA85BF
-4E5BD9578C0CF27395D29A94FD27584FD96F0ED37169D85D8B85F5BCB5ED8E9F
-329D4D1A337BF1EE62628A3D3B81C759AFF5F6DDA0D8742044AA18B93E32665D
-80E3DE0D2332FFC076A76F5535592D2ED1AFD60805D10798E03E8E65C17DB19C
-425904FF83587A0200B406D3BD3965844289270ABE86A5D7A9BAAD43CB1AA363
-ED87682CBF19B2ABCF8E4C9AA701017F06A4346DCF7A000E40A00BA37AE5601C
-AFE7D8E529259D1F57D7B00FCF5F246C902E920AED62751D94FA41FB9EFD25DB
-A86F9B85B634562E96B8EF8CA5F5B77FC1CD168EACE9B19CE7D56CD99CE70197
-D80A2508F3F31A5BA5A8AA8F7B833C2481BB9A6CD8826475814F0B74740CD443
-83C3F266BAE4BA683636FA0BFFC57D71F8D13F91F33D368810BFFF77D9710902
-BFD32D9DD2E94C1C06026B3BFBA5F8A71518CFA31220FD245868729B88390774
-EE063923474CE8D18C2D34AA77F9EA37A92F7530DA0F67A05B2C11C3D9942AF4
-386DE7FA1BC11F0028D5EFE8A3474A5ACA8C1744BBD24EEBAC3BF7EFC12DABD1
-C4DB771E7617D4F5C4B759E84F40426E8AEE3BE6E334A378A3C56319FE296114
-047945896F2B8F8F925F86CD4755CAEDB75017A9729187C1941AC6A9725DD547
-197F636F0025E63FDC74ADCFAF0ABCD64DA1F7512442EA2D2E88726BFBBCA2FC
-AEF3D4B56DB882F20ADE74063FD0AEEBF62AFA179E5AFCAA443663B3E8594DA5
-F4C4454B08C461F85142AEAE2BD3FF04F9A89C9E2C9519A856C2C32558EE6A1E
-63D565CB3746C9FB6C9BF7494099ED1BABAFAA9069BEE833D13F3ADA35B1605D
-2368303ABA5179DE23EDD6E2610BA46BE4B3CFBED8D80A0B8FCB27F93287D3A2
-33B9C13577AAB8B77BE80C0466255A693FEA8F2D0FC2DC6951F6431DE0F8FEB6
-659C8E985D3E02378DAFC9DAFDEEF0012FCB5ECAF17AAB951E0C6D213724B6C4
-E5AC05B554F814499271F37A4A0924D4AFC9960045C7E4D7546FA355016D5C2A
-74B78E6F4B92BD1A45D430EEF88DC034CB01905E0C26460D401F44772C260759
-8A716908FEBDF9EC4DDA187960DFD111B73587D5B8E84014560A14FE1B46C152
-DBB6B7EE966712F3E8F27DAA9C758355ABBE19F067F140B522DF95ECB66264CE
-B2F6B7A1DC8B3CE934F8E8B005DAB5D9CE71ACBEBE51FAE0E689429B3C0048B4
-9DCD4C933F249085B0EC1281A3754456CF4224329151DD2CD391D35ACECCF6EE
-B03741D088A36B09AC5100A068F58D71E71050DB62D8029AAE834DBEDDC3C012
-C70D090A3A4F1A77797E73B93779928B824A882974004C16981AEF1FCF6DC7AD
-34E68B09E69063B253447D6F461D0FD38C91EDDB5496040787C62161643B0B8A
-B40873BD924BD5C3EFDE93964392B2503F5229F91C5B6BEBF6B977FD1DCB5EFC
-EE8AF1CAAFA81EA2DC1B77D565C69001DD20295D5C4576F6EF44CBFB13601118
-F55B5763EDDF93C0994720CC32BD01AB5D50CEEC5C3E762F8E60311D2487D143
-940802637DAAE0CC3B892E566BAD6DEAE8A9006D71233C4A1C9E96ACD5EB7056
-DBE34D18C2EEEDFD73C771301B9C2EBF0DDCF269E05464790E36A6C124634374
-CE6B8F5D046497C80FB2F4390AEC41026B593693A6FF9E7196192FAACB98CA5F
-BF6F7A10F8C78C07030D3BCBF0DB0CAC4981CF3550077183EA1F6C6C093F3A3D
-49215A00FD60254AAE82C26AC7E2B74405CEC4EFC19E5C84595E88817AFD9E5A
-B3D21F906F757F037252337BB6552DE24B4ED3665E588CC9C3E916CA1E2DD333
-85DBF273ADB790E1087E8D4994CC038D4F5C203539D1F5B72FD4B2396E175102
-82E544BE1AAF2045777071CB4D0CB8B7999FC2DABC172CB5200D01EE76D90C85
-F5BD6801F07E825D94FE5689C2CBB18727B84C0793F168D0EF39EFA0CE317D63
-AAD99D61D9A953A60FCD905AAC01232ACAC04D0F164E59FB59445F4E9C9206C4
-22BCA0F75FB6EEBB3AC6DD055D4751D6F93424E030CEF9ABC9E9C4792AF2A3DA
-1F1D98FE0971C2B6B828004A58FBB2B4808C8BE492F636B13660839C5B6F9B94
-6457A0DB83D0FC4F05A993F6F70FC1ED418F6279DD339790006EC4CA34B34011
-8F4F922033AD1A70D2A3CDE0BDD6A0C0F48ED3BB61727EA6FE093E393C8E1A7E
-D4B58BAEDB50B5395BA7D95D8921A98FE44F6D2DA73259560D815C82E435325B
-D633FB6161FC6F82B0EBDFEF76337EF416952A7AB4FA74090DB78F02DAE15CBF
-A40AF9D8BC81C164C581302E70040581314E8FAD7E0EFCAD384D8A7D21A18C6B
-ACEB44932A14F6E5D05CEEF88068FBB44D81F2149ED7C294C583B3A32AB289B1
-C660E734972BB390708A87829D527A1C9608A16F6FEC6BDE309CD440A0197C79
-7682FDDECAD867C49BA02A0CA7652FED17F411F5DBCC61A910C094DD249FBB90
-8D477DC7F10C7D03157D0C2822CD3F3F7353A7FF200F0C20C04A395D66111E6E
-A6EF63B509624BBE57A17B0AF22E67F33E32FDC20D24906A5D1A698A675041ED
-76EA377C33CE7530C501F1161DE10A006ABADD053F635408C51E91E089A83242
-B55AE77E0C10F6F11B53AFA57A14B7F23BE611EAF1C8C3981AD7261A7AE81F0E
-D62976181C4512FDD4A397E375D37E2A127AA5B2856C82AB99D770623F36EF3E
-DFA5B73D2F8C134DDA82FAD11F791B3CE3455AF3E4CADA2977F240740D1CEE12
-5E60A4A290A8185645D0F49D05E5A59909EEF7C87D87209468CA51C352845C08
-77B816FEA743C2BF5296DECEDB5569EB87CBBED1E2BDB382C35ED191D451CAAC
-7F93A34A219E6752E5ECD3F2CE819CE9D46E5509AE8B5F18D85CE2AB87273C7E
-E067165BF75291EF6E744D6F5C7D199AC1758F2FBE9556CF9ED6245A2A9EE591
-E78257E36BDFF553B6E7CE515732C152A436EE59E219FFFD4D0CF148A5919AA8
-9986C04CCBC5D91B180529575BCADB7E34F94E2E1528C7A6B602D4418FDF1265
-9CABAF85FDC831CFCBD1449C8CD48E98DEFAF3BF8DDEBA899CEAC532E30F6D36
-B891F0AC6D74393034D49BA5F96EDB94ED8E1F10EDF985EF757BDEB967959038
-C18C05EBD2F27D6E47F4FB9602679AFA54E5F2810D69DAACF96DB0F277B8CAD9
-6C0E19D9396F94B1025C4DBF871C99D579C9DDD4DEEBC28A01661013CAF907A3
-4FBD2F019EA42FC201957DE80C7240B799FE4B199ADDD3C8078BF40E5F052CEC
-01B7D3993E2E61B89DA8E539A09508576574CE014B530D13EF43FC8FFF1EDF3D
-BDD344511B2486FA2D4DBEA3D6E57796A6788F396939748A957E51F01BCBCFD2
-DF91CA7FE81A054BB15C1D3E3A1062ACEC7EA6E4089913BEE42E1491DDAB0BEB
-1E77A608F72A5D43C10F6B022695448C76BDCA33076A02E5AD60C7C247D2C3DE
-85C878805D882F452B782B3D21BFBE54CE2961759F8D71C17F0C952F8D38AD4E
-6B6AD1F498A64FA52524E62F37ABAD12E6D5F7649DD796E031BBD951973DA19D
-C6DF66F38F0B06783B4DC6DBC15CC689D80C3822D5C3DAE96FABF9C0DAC880A3
-6F38992EF13D0C3AC162C9AB38EF2B8A4F176D8AD645E982CACEEFD28947BC07
-BB233FD9ABC9F4AF612F691F4A52BA5BD67659B8DF5D68894CD3DAE4C724B238
-8314DE16D901F3B63D8D11FC1BED822294527CEC6F31DCA780031F485A906311
-9D81A365928EA38CAEBE7C450BBA19FDD76AE8CD81A1CC6E38312957776A2ED8
-CF258CCAFE221200A03F07627ACF8B979F361C0A160E1E5635D0E30BE18EAC55
-DEE7A21FD8F9B6A53333C8F94DC6C1A1F4DF0518116402255CD84CC302991A20
-789689C51E8FFF3D868C73E1FB042C30C1EF54FDA77E03F04B12781C572DC4C7
-8D60E506C6FFB6422AC0DA6CFB438D0B5687A1FB63C9A96267630CADA9338EAF
-B0F4433F014A7D37840496D8F9AA0188F558D87CDCAEF0A7F89F7400AB143F3A
-7268A871FBD6010CBCADB1ADEE40104D9BB6DABACC4A7F45F155A352F10C8057
-B025F9435A77DD3BCC4C131B3DFAB32706A46A9ABFAC3E5C30CAD28F3F9D1ADE
-4060EBC1F26BB60CFFCB06AB4F752EBE4D00898E99ABC6A77BD31E0C74E34F2D
-268555785724E80B9CCC165673D2F4306045720CA41C606E9C33611C8DC681DD
-0E8AF0E4BF73D39374BD5D36E1E2A95929647FC82583BD962DD149258510DC76
-6F03DBCC2E142EC8344964C303AC4EDCF7C1821623A24A1DC88AC09B60E1970A
-312EEA27B9850401C1FDFCAF3A9BABE622C52268ED778475173E1BA15CC5FD07
-C1CFE4084A5C1374FBB7ADED6B89AC09E9FD125FE728CBBE52BEA25B2B0E0E76
-A4BFC50EE334241924F6A9750731736139FCCC3BBFD99875E2091AA8F9F33109
-7640F7A0CDB5B1783FA24E5C5434D732318A5114BF0080649C1B5CB4A06122E8
-F592101C09864AC1FA6F9DC9DE816B1D6D7785A6422AD5A5CF997E2A5B683CF2
-BFD6B12AECCA317236D4DE5B8E11AB4E0C0A40ED4D7F2F29D9D5D6F97C79A6C4
-3B626C4B917E2E2144D7A9F043B8180E45B433838BF44F86ABF22E29E50C1551
-36D56E3D89ACEC791CB407A7959F66A0272FEF1FF4ED642EBD735CD954FE2C01
-F0DBA979E80EED581BB0E1E643FDB205C86E89C19A149F4F978460C716F38749
-0027EBC1437B8B37FD4F9D7BE0720437E61747D2F16742076773041403D85212
-294402ACDCD82923E24860E0F807FB0D32298F5FE9076E6F07BA9BB380F53F3B
-39288A33519FEFCD75F540B597324FA43FE1A8DEE64A756587419F319B8C6F1B
-A2F29F17750953CC9DB864DE2CF3B5164C093769F6FDCABAE1F6D9616D8EDA82
-DE6BA7F8D24B227FC4AC0169F80D0B2B1B7BCEE7ECCEE7475E7201164C8B45F5
-31FBD954BB31D060E6E32BDDD035DBDDB5ED89FA955911D8B747AEAEA01327AE
-3C2D04BE4DE78B313C4414BDE5F06FC0AE5ECA638911F691A1FC86FD8BAC3956
-C1553875B45A80098F377AB2DDC3549514ED658A557BDB939AB6FB2479F98BF1
-8157AF4D86883A19E9512F87AEE0411C1B08BAF29549F663AD5476C50C96FB5A
-356C85B2C52995EBAEAAB8096D21EB470713A567B58D680A37E4DDC3C1A52BED
-E01ED7897410EF6334A75217FCA97ED5E299C5FCCAB0F92584FA37A1EF03C7B3
-A2E5A3A278F3ECD40695E55F6072058BE81ADA6E096276E250AC662BCD562763
-863C4E7A7B357FF231E5467E76394FC47B591BBAF322FF9A94B2C3F2975C08C4
-881CDC4D7035E2385615B35556035791A00758F33582153874B3E6B05BAB6D2D
-659351CAB34569B8025C7C51F915E30AF7EF8D48F3D42411AC8261AC04216FE6
-B543790196A571B4D28EF60339BB05BDF3208B8F9D1BE9E50F9EBAD04DFCE8C3
-8A39ACD81C40EB4059A9FAAE9B422536D090A4E2F757D3BBD8AD6536F000AADA
-EBDC6AF9115E067ABB4269791C40A0C8EA696E851867186DEECDE350E0121003
-60563C43AFAC8315BC7D87DC949D09CC36FB081715E959FC914E931D80D846EC
-44C3178C212B132BA2E64043963AD0C20D56175D57D4FD4BCCD30D7944E613A7
-BB863764A6AF5EBCE17C1179D60EB17B9C4E61ED6DE2C7CCCDB6C4493C8CF326
-A53E07C83A01726A19EEFF88D46EAE48FD5FEA1024D229BBE7B48332DA245FCE
-F2C1CF78F1D92218BC6967ED2DF365E6F47FBB2BC8E9AA0014155348BDF54A91
-471FD23B5F75C270BD3F654F3815C43C4860AB4B8984829B238C614D7CD7EB6E
-6ABAEB392C23196AA2ACEC2331FCF813AC4D6B5A076E6D6F5C98454C78135384
-2DE08F8E66A983B76B526C42C243CF15852CBAB77BB11A7EB644590254C939F5
-CD4FA3151B7E12483C75DCEE22A88D9A1F1E0F53E2579116D3FD82F6A55BFB92
-17E173A2D9A3FA4CD85ECBF1C088D45473630EDDFC84E94C36041E06D68D0184
-DCC03474698ED646CF7C636B2181CF5BD89C8E939AFD0B11A233A1CF2A7320F0
-D8937D68D03579E5C8CACDE90D37123944D7247E4C4440E4D29A1872928D87D7
-6A10AE04ED4053FD0A11DD5F588C4147E3809D071305A3CA695E181948CDA1F5
-A30F95AAD47D95138683452EA8A9867EA220E9597CA78B2F8CA09ECB43E9AF65
-2590E87F1A24AC721A9CA3AA88F0FE23A2263E279DAD980D7E752BFBDD172BBD
-162741DF269EBBCABBF7575BB7C9E7B42777DF8F464D85245A5EAFE6E3D10C27
-0FF95542793833E95C8089F4025A8BA1E5E884541F0B33065F93BF1D30FEF287
-D7C73908A027CE521B7D6ED4DC2E77619854E10451D4ECADE3BC7AECB72AE698
-4E4CA0ACEA0836F87CA309901C67ABBC6115110F2B8C7433C4A248052317B283
-DDC1238D40E3D00E4D236112319F872BA3288AAC2BFE2B4C723C0C3239B7F95E
-626EDBD4EC068FFDABC261E02A8A0D216D5686B005E243C95360865605316BCC
-1A2EE56693C7B54DF2E68E6288C0DEE652E76F3D16791EFE6B7FCD744384311D
-31527E20E4E736996C67331CF78A08ECAB6B5A720FA6B8C8FD80314C4793502C
-9EDA72FFE0F66F303E84495B00DFD9F8F1748311571A52A1D965EED5B0DD1CB6
-003B902E1FACD61472980C40DAAD23C7D35D0CB00BB80025467A421E36E3FB35
-DA936476C87ED2BDA7F9681BF7050BD883DE8D9798D3F680CF983941FDFA3129
-18D0054964095C068B7A2E520ABC3B88F079A90AEFF5441256CC06D169A6AD8D
-84D8D55E99DF4D756771B9EED972ED8A5B858B429216ECF433D4C9901B0AA14B
-A55DDF1592764567D919988F21BCAC5F6E2823C374BD6150410F5AE77C3CED4D
-5AE61BF4BABC795EAA2816FF42966CB2FFB2BD2CEEC59930FBEC3731C5BDA5AD
-32B4A19586248AD9D3422D987321135DD57FB8939EE3D3AA7309FAA01F2474B3
-52722950F1216BE421C280C1CE4F5B6F2931E0D723E8908FE53A955EF5D6A6E9
-4188AE3DB1FC8E98E1946B882F27A4D6D46442DF31221659824FD9A68340452E
-2AE390724AF5B78868FD734D7812FAE570EC1254C509153DA4A58AF3B6918F0D
-CD439CE41A00234EBDC94B9438C2D541657DC3F840F485B2687BBECAF841C0B6
-C8418D6B0A342FF41CE90BAD8F8BADA85BB5EA094DFCA987AE5269C651A1C4FB
-853F5514439C159CF16CAA9FE135AD70E5CB37D76EAFFA880E8B0B860DCF2DC5
-AE4A04FF5C9F3A4188E992DD1C25BC8ED3011D4E2E1A185147DD98127B37330E
-DD0091373135082BE8B0AEF51C75BFEF9261D6FEF8B61179CE5DC17D12F1D202
-437E5B60EE9B2189464BA21E4A1F44D82A97242B74B6BDDC0144B44736C20B14
-238F49E81C75FF6585ED339D47FA62D94B6AD30E803BA4BEE3E75B255B2C0FCA
-CB72A26D596C70A43C5DC401761FA38BAF249F2B9862A26045C122E4D27C08B9
-1E476E46428080D75CDA97A6FD21CC573F9B20FCDF26D6EF973000928FB4EF6A
-2899B87F867C5E588BEEE781E24B670351192E4C479A66DAD5176AA8287CD1B2
-C5E81EF0C515AFCCDDB657FE0B2132C0910954045BA122A58025E616C1B90BEE
-3C46C5D48DDD251B4E545271E4BC8133BAE3F601038D5C794EF7710CF561B19F
-64426B0789FE6F8A3ACDACF5628E10A1114B447C03E201958404F76ED151258A
-1A2FF8B5702C702C01F89DC17F7BF02BBBA8F78DFF03078C892285CA880A0EC4
-D27AA9331C674E04D085508D69B448D1B54298133A680CD67BCB80C334BDDB56
-1904CD441027BEF374ADA8D824F54473B7A090BA6318728E077A84989A4A4C91
-E8E648B51A68A39E16E4A2C5FA61AFD63556158F9DE92107B5ED054E240048A9
-FED04273519548C6773755222059259601C960A8D06AD11AE943D678BBE344B4
-C05CE0EACF18130D7470BEC987BEEF661DB3B5360B822D898EF70E5320E2D8FC
-7D1E8B8C4496F2166F30D5D8C607F52FD5F12349593788B09CD9A0F3ECD80683
-956EB208E3B8E1FF7530EF6FFC96701E7FEA61D8765C7D3F1212416166DDBEDD
-78DA095B29636A9AE2F854BDEBACBEC7AE41CBDFA15DB3704C46122EDA7F4170
-C26A5F3F26ED74E21A50679B40CC077E2EFBC78F3ECE60727283EEAE9F0C7396
-F318863C392AAAB0A24473B0801AC7ED69DDE14DB1462E4F988CD6143E9BA70F
-C2BA50189A83AB577373E2DED9DFAAEBB2494C738B006C40FD81209C09C5D25F
-65B94F71E4B12630C2651431F32C7B3D9681FE19089221A15ABD6701A2B9D345
-11915E70E6C18E0AA0C1587F4DFCB904A75CA357C34155CA5C712CF5BAEFC795
-0F95D60D91714ACF79756DF293D5E0557BD076DB63954B714D498E8244195173
-0F59833143EC98BAA06579E7E3015EEC4E40BD440211563971328DDCDC3537A2
-EF85F45EBC83E00B7EAA3272C16341E58E82BB3560E9318B512A5CE362FA098E
-30FE2696E03B63B47B9D06A1FE63E336DC7B7FBA04422CE1EE9BCE3EF55FBB09
-4476FAF98151B50828F2E894D83F0A28EB417622AD150C5800671E32326CFBF9
-C7718D18D9E787C0670CFA112671D93A6B1F7BC1DF303A6E40C0A2F409917E91
-4212953AA6E5C67F3C4EB25E1B71A096414CE4C3455EE9A596A52473964E02FF
-280A5037244294582F7700C06C5CB5E36CB4C4197DCAE062ABF1FB454E9FB4B7
-8205B1E7EAA27F177FBA6D621B8B75DC81594DA014B3864F4B1DC3E1C3FC1FF7
-F1528F63975D949E5A64479F408B24DD7A46DE3946A51EDFC4AAB046CD2E17C2
-130502B2636A631844D6E659BDF0CF6B180035F01F710F91F1573FEEBF8BB630
-506EFCA96CC5DD19AAE89054E3F29F964E7C6CC48CA3D98590C3C637B4F98FEE
-BD75D9141D40DBDDFE318BD5D6BF6EC9A95305A959C34ADF2D9DDAC6FC6A515E
-0B23416C1A7FEBFF8BADA0F36FB7E61342A8658E15CC052A94494F60844BB93E
-6173C2CD93CEAAD8CAA61F53E70554AAA173868FBDBB7EF226F862C9EC437A48
-853C4F4D9C95F1A5FC1F6B25CED0DC33F616A04AE68BB9C0E869DE7B5A70F781
-E2991EFCE385076FF7ED839E55958D9A687E50ED4D4868B3BF5D92BE8F225F8B
-E0DB1AAA3ACB072A1040A66BC457187648E7B668577DAFF15B3C2A71A5FC8786
-5DD8F0B26C0B51B3861B394E31C831107E9DAF2A5B4E54DE859E9D75FCAA59BC
-F9DE63491362749EE6048766F2D4E1CA725A1194DD4E53BD0D42E0358930C81A
-AD02BCDFACB892D098A345D9FFA8EF971AF3FB0F41FDFA41D9BD847A6303E83B
-14B340D14E711CDAE7D42FC7A66A7FFB6DCE8554F607429010E81AFB8A970F34
-D5E1BB28DF0D6B23EDA7370BDE6A30B91E9F87E47663F89D83DB820895552B4F
-2B9552C8069D460ABC93DFC88A6BA2495308089BD374207A3DC3A620099FFF24
-9B6A819B6C9063C17C4B37E875A144415E8457E422D1DEDEC11527132A8039BE
-C5331ED90CB75732186BC48E8A393DC0AB95A14E84909B8FFF82AC15026D9AE1
-F4D644425E1A4919996E28567CC083AB66E7A1BD2775601C475D4791082AF0D6
-BFF7C28332439B20C50D9227459FFFF3F8A4739175E0D069B6EDB24E45A86D16
-13FBA0DA2C89AB468C17D2AFCE9BB04C4784C1BF76E61F7E934DA7CF4AF3BA24
-8E5CA0D0E393A59AA84FFD072123220D0523D68B3D177AA7B9055B9D08F2DE06
-5B466DA58A134276FD0EADDEBD6D594D62DF588EA65A2330413F7B143C3488E3
-73FF170DFDFB4878E0E8AB55CDEFD1A70873C56B28742A10FB55EB6ADED70A30
-12396A6BB42062A4713E72C4742B2A879A9ED91BEDBFE68DC1A934B2A1DEDC15
-1175DE769C11DE05E6E97F7678988274CE2AE0C2793393D6ECB1E6D64B72EAC4
-F8B487A1CEA2C817BE6E7E5F6979B5CCC836BC0A9D74D67C5E18F35CA43F1903
-F0A5B7C1C9F2FE48269FB582B57DD89768AB8C7B55E96CAC3CC3D090607152DD
-89AF7A767AD4CD3266BA6FC0037A5CF9B08DD8747FE3D33F8D99C89123BFFC63
-A514AF6B08F6192F3EC45F62C2FA5D4F3B80E99EABA309BD21DDFB3C46ED8874
-F227278F654ABF4F935473898A36F306DFEFE8876AA51FAA93D43267FFFC9499
-1E1C9385FED5901799078E2FB3563655FABE1933F1BB5B4A876BE25A924777DC
-D1D9C96C8D4C7CF260F5375AAB5262DC78E6DDD6CEF9337A3E7985C0C1875C6F
-C06F4BE4E96C8ED6D805D235A1177778FFC894400464219584CFFAE7AEA5A184
-BA6ACBCF04C43320D2C7176D3666E28FEDADC2E73B9782597E947127DFFA9ABF
-F8C8A42CC74290E30897D999818BEE47E68A4F672A4AA1225879138375EA0804
-C02DF75B8CAAF2971FE31F69155E56746074519505DB3879BCC50F9216CED99C
-9430B4983C1039466E8D5A721BEDAF43368611F3E90C3BDB8B954A3F5A825EAF
-D393D5E3DFDD0CB757B014B3FA1EA45892775DD3CA8D176697FD9478CD55A436
-8E62A63F84DD5A26271B502E96A74BB52468FF918A5F54249FA552DF3BC1172A
-EAF29CAF5FA5E58CE9242BC04A70CB0527F554BB8F3E9D8A189E6D8BFDAF0383
-20B7390C5263D6AC6781A500A9D97DC8BDA3E156F63D3DD8D1344C121EE6FB16
-FB54B5CA0B7F74B32A32D55415AB5FEFC2E43FB4EE8B3D019C3FE29CE0BB3294
-96C9B4AEB0F8B1478AB7C9E4D784C25187A958A6EC1EE1359C3F7D3CE4577904
-CE2B8B18448ED83EABEA54CC0B5B092F234BA2A2908A15BA4A60851C5B1A336D
-7387499E62F1AAB27AA9B071B849F35B99E26547B07A943D5F0020D37AF09624
-9552A0BAA86C49FE065A5E7056E100E84555604C9796002BEA168CD516C0A8FA
-46A7329C7ABF1BE99191ABA619329AABECD308088D74C8C47F2E0772C1DFA1B2
-391B53A260A1E28BA2BBAE063BB88B2E7F90E6BC03482B23F3DBFE9D1B3A0097
-7CE9FFBFE770740A19A732CE7BF3314A8745D71E9F46002E1D38947D4BDC3A55
-A59D0149B0EF50411166E00111AA63F4A595F24B52DE94BC85F0535192095A0A
-A244B0A292D30EBCE2629765155713E19521FC7FC3E10090BFD1385AFE183BC2
-E635EBABEB69C737C1562670D9F815F28B5FF2ADCA13BBCE2E8B719EB85D52A4
-FE27A62B7D8032BCB6E0C43E184C8B864793C272EEC5752A2533404AE5B4A2F3
-A4178CE4C2404C71BADB724657A956B6AA8C7DDCC3411BE0E49362570A2D39E8
-53AB4CEB466C10CAF6C38B3F3C4084F4C9F9197A8625751037EA5C2920B002CD
-413F5F9CDA6FE303AFF476E88A14B90538CE1BCAC35BDCC953EADA6C5C36825B
-853797CA70C519BF8A3D1A538FE6E16CC84D2AD7B1F6E5E725EB772326C04E48
-5E687A44390A99A50EBFD4A3D81B7442AB1C8D5B311B051C3B973AA2F2A7A28D
-8BB32E72117770CA92293C9551E7A210655243F3813206C84C8569EDD9002047
-84AF2A18917F46115EC82BB96FC868A3E7058D7EB655FFFD15899C00346B970B
-0BE63FFDA54A50A5A6B0054F2B9D1C9FB94C6878B04DB10A7478E56816725F76
-CB08B9DE852E377DDF83EB4F822026060D5C517F0E62A6EEB9CF13EC90002B9F
-C2212C697D91FA63D619E863981E9F27BF5C092004D54E367A8BD3BF15DB2DC5
-927DB805F25E05C0394B7A6A1F6DA3EF3A480A6BFB6CC63A856776C630746D08
-2BA98EDF1C1FD7F7FD05E38D23BBD6F4493AB0C6D69749737620F4EBB458C2B6
-D8DD2E634532AC2F7BA37CB284767DAFF3330B7E69971AC6A3C77D5C515CBF0B
-A228FAF9AA6A095011124379C61FAC642AB282E4F190C9E08F0ADB8DEBD3EB71
-3B12241BB3D2684F59DF02CA0F711B83A888080849ACDEF5682EBFBC62A4501A
-EB2A59D9EE46F33362C13C15811B46AF95E460E93B3F50BBA029E233BF1809D8
-B845BBFC6AEA5AE7C83755281FD47F0C3B152FD8AE4B27DF7372860C9A09BF4E
-6925ED9D6B1AC0533DD715B68C1B27D8B4DDCE201C111E681859B1BDE65CE007
-B3734F7B14FE748B840F53453252149F463F12DA0C87FD03E900DCB2567B453B
-BEC6A42CD0C3BE0AC8999DC889576351750B944B49515AD9B3394EAC6B066996
-1FECA134E160D99B36D3ED88FEFA777ED7D0BA66259CC99C60495B6B8A5F19C2
-C957848A8E2C05698748E50A77B32C223C96C7A28AFC92EBEABEAB453AFFAC63
-DDEB754ABFA689697597A4C4FB90286A715CB31C2E59E37E23FB873E2488F413
-38EB42D55521239BCBEB233068CF020DAF179896E55B5609473211E7E9DE50E1
-65F684134614C82F5F7C163D43460A3B19A88FC1A14282E9DD649573B02EDE52
-23B3073A3FFCDE1395C8302146FE37C3B9971C428ED2B48AF8E120D1CBF06F6A
-F4143BD5F8E0CFDB333050E13BB931C9F579FB333B177473717627FAAA0D5892
-CA4A59F46CBD2CEFD5A0C7A823139D3C60A2687B1E0EFF201F6114C047D23F17
-DDF63EC251069EB083C9417F07D0C344DDDC8DF928DEB6DEC372102FEC938184
-DAA203C172BC62111AD329BB1BB1A0F44CDDEE22B1A998939333B1A841AB4608
-51DE28FB8FEA0015CC89BD43F3E37C2CB48F1C0BBF3C5B638E6EB2162A10D6CA
-1DDA501B6DA15A33D2D141A32F08D43AE66E23AA41BCE9111707B72E3D39DC83
-6BA1B18178F3942E269C12214DD8557EA6499DE01F74BDAEF75E658FA7D38A0D
-168DBCBFCBE04FECCDE6147DCF5D8A577B7AC4E812260B86EF88F13C1B2F9D38
-331667BC7598F4B138CA6F295F565302BF393D67220B57881015F28169E12BD2
-43B4752ED6904574F6C80E5E1679748C4697358904D960DBEE2BFA35CBCD8594
-34346B184F1030D6500C5FD4773525A91D4AC22783B61434D417C9F57B848CEF
-E90B0B243AC9B9FB37245F4178E6E305FE7A45859DA1EB02C024BA4784F39E08
-C4FE1473828248409CBDF74E42AC80B446B5455E74B75F5FEAFA8055A3F1E01D
-FB21C1D9E8BD1BA09C3519AD87B54F27BD9DCDD18E9F7B2BE7B1F7DA396117B2
-821383AD37D76ACC89AB90D24B43AF386308508F14E36702D86A07AB2F0B7E63
-AA0C1A7FCEAF0199FC99CA393FD44CA8AAF7B9A1E820720EC4658EC8C6D68C5F
-101FD9B8C0A45AE5C2B4B8682DAAEBEB686674F828AED86A8580E9D4982105A2
-3E91D62A2E9FAFFA2B3AFBCDEC4DEC3491526066E2A75745775567CB84F83127
-76E426BDD8C1EF9B64CB5F3EB256007935A75E63D5A90F5946D9266E07CB4354
-F6D2A89E2D1C332F3B1D9DE24195547DA0A5A674A50D9ECB92BE482630D37061
-A094DF9C31054884D4F2F89651FB8E1BCE6125AD240C7AA38DAAB1EA0C57A681
-E1352460873893488DA2FAF208E4D511FB2E2E44C8E9D7713A805F9AEDD79074
-632756250E9BB42FDF32C989F81373B75758C5A00167C49B5D881ED5B2DAA746
-EAA8DBEBB0AA0883DC30D79D0B99ACA9C47CD0CFC039EAA053EF194F5699397C
-0F69920D974EAED369D532F3BF706D35FA463FCCB5C59BD3867A70CB295ECD3A
-DED42339E6918F0226FEF5810EE2CE5FE9994CE4957FA626F5A10732AAB59651
-3776FEBE368E3F24BC27DFC528098ECA5DFD3367CECC60F5DBC2993B1740FB4D
-A0E7FA89553161167B1617F698DB3DBB6672EF5FB052332FAD4FA5822C96D0EC
-03111DFF00E76129690FC5A7C6A5DBF6E1BEA4371BADE2304923EA3C6113DE18
-7353D433DA5A81959828550A30D5894AB3FD05811D2BD0345DDA38DEF30DEE17
-F63DADEEE286E488472BE0E167DB4475E3C3C248E425D6E32B18397247530C48
-FA60846D3E477C0433ADAD9AA0B0A9AB1C258537415E05CF354C6217993F5AF0
-F89996ABE0EE4D948A42EC554FCE412EDCA1C88C4A171AB881DB725483A62B2D
-D042621DC2948648D07D8C9AA493CDF26257E0E38CD820417E61F0C955E648E4
-7B884CB722E677D5DD4100EA6F948A10346B904510ABBB6EC7C5D3E194308A2D
-E44821460563B65270700BA3ACB5D712CFC2DA9FE3094487502518C1634ACFD4
-700DC4BFCA3155484BA579C2D2F20C147B60F4C7F55C80A8378A241E83D67E2A
-037C59D5E7EECC35BE2BAC0121C44B40AF04881A35F6AB7AB17259B027C56182
-61927A1C8F6CDBF4075F725286C4F1BC8401CF8596511352F310A14C790915DC
-E503D88685CF1BB91AC27245F9E5D91EC23A8729BA05ABE5D9EE7AC81BD289FE
-72A6BF35B6C2AC895F17EBD812D550227C06991271CFC565E149E6487D1499BB
-6F4C93FD408FC31C2065CA1D85A2EEC8858B4ABE7836BF784C0040C1BF3E8175
-75FD8812D699F9BA551C6FAE3226DFB5B2F372312F0081B9531DF453A54E3ACD
-2FB15B2CF43F2D83E004B2BA9229FD048B63C6A4311E3DF32CF57572DA953BBF
-A38593F4B293A0C315888DCBE6F93DAD0980BF5B0F2CE3878A65AF744AEBE350
-22FBED4A11039F57CB7A927382A9C6F625B5C4B96C17D9741A76B422DF68FDFA
-13C670B6A53BBAC82EC45BF1157DF3DAF8B766DB30528877BB8DC77D82E16C16
-3DE6523F9E660D2C5A8A9D5ACFB135968C729B68BF04879820B8D69308458421
-6199052857E16C51E8C1FE965C93CCB85A876F1CED2B4D6428EB830E3E63BAE4
-ABF42C9D77855A0A9ACD246033302AB74CB82359BE91FC947F69CC8738209580
-ADE0948982C8D30AEE3034546E087EE180D56AF4FAEF124D5934FF3F2BA88B40
-AF3819D1D9D2EAE8574049BE8F8776A3F7AF6BCD4F999506B072589062154CD6
-AA7CB677A73F201668C5B355BA59499A0F93BB904231FF29486E60473E87E00B
-094B51A4790694507237253F121BE0897A1EDB09E37F08C399597A47FD47C0ED
-7A4235821F72F021BAF9EDDEF1E15D285802AB6EBF721DDF8E6A85264A5CCF87
-1B5DE9EB24AA3B0A50E0FE2B195CEC0D9F2B9D12D9B68B5E4E5A8732E74D30B7
-3FC9FB783569829545B6984F5B06DC5E2CDB95F409C328A608276D79B7BE5735
-AD90FF4325DE84DE077D4BD77AFF7345B8FC52A8E1BFCE9CB5DB7186717333FC
-6BE58A7CE61E4D13266320102AA06589BF00D01E884D9FF87CABDF4E12F62127
-DAA725186B7796A1AE7CB37BB6B164932404F3017E132202B42599798C1FFF82
-236711D98287A426C44F9DBDA9FCCC662690649A6F4D6DD932AAB5759EF6E481
-FF6F40A980DAADC5850E948B8EC0A60101CCC339F93EB829704A843C79686F6F
-F23AFC0D04AB902B602B7E1C4A927D6C752B2BAFBEB8D80273CA0395EB9D4312
-A052AFDB82613CB29D8B9A5DCF2BEBE5606F6E32A577DAD1FB9A9903B92C0B84
-13C05ACFE23AEC511CE6FAAC235CCB47B598C11183AD8713091D65D3F9FE4918
-CB4CC13F25A2A6991C9D930DEC24730637487EDBE1634DAF1DF9B9024F38DF1B
-2B44FEFBCB4A64756FEF1E2791BAEAC248DB8946DB44A5674171789701FC2393
-E4C2192981845C5E95834E60EB49BA90C3869A8497E99B3E676075C4EDBBA164
-DC9E9B3414443FADEB59F32E39C46439766E1E3ECFC5C197E031E645CCA4F970
-38266A4F21B6B98A581B838DF1077D8C3858FBDEB2A3A16D8F5847BFEAC138DD
-D73ECA92B7F1F5A0177A4C2E899ADB7F2218979D6BA217D8E117DFB2BC7E7658
-A81BDBB92AE722C326065EDDB99E2378FE2EB426CE3402F254BAF1C3115E4ED3
-18A05A9F129B61818A54D0EB53536359FEDEA8D409F36E08CFD272EE7E376F13
-16AEBF9AF354D20FCABE9819643878797FDC9B784FE700F35C60BC70CE72F3B7
-D3E1ADCD69123BEA6C6E17174847F62A5867CD674F60D8EBAA41A019429DF304
-57BA5BF34142F11E328DCD3BCE5253074988DB4AA42FEF1C3B5430E44F08E0A0
-DBBBDF4776E2CF9DD65A42188ED02C62520B62A22D0DF2B6C0D819D5ABFD72B5
-C716BA390B682875CF80AD1CDECDE4E9E57204445D71D55EE6DA675FF56B06D5
-8650EAC74044170B3C822D049E295138E0F327C93A829E70BF3F0B5325D8B65D
-12B3108C53E594D93339C1CCD5028EAE72C2B755CF3F069BEE7E9A803AA5940A
-5D277F7AEEF43E1A175AFE4D95F5DD641724B3BBA43C131145E3AB2A8E324E0B
-39CCCF9E30929F711436A1B315BA636F38FFE73D25848A97099450F1DAB3CA99
-783B23590EDEC75A7BFDFA4C1D70D6C48C57BBD08D6E174270C09933473A4682
-8A4F59B3F501D92C730B7C883826F8E24E201475C4F17566E8CF364219BECE93
-268E339B4408ECBC5B415703FF37EB4896007FB7C21F79DDA664E32A0204AADD
-DD50769D15DCF9D35A749C7D8672B8B06E2C699D6A378F43675E92E13EE42F5B
-AE783261BDB17CE63BB928977EEAD46770570DE46B302487322B089D5AC4FE65
-E826CF4ACB665CF3847596ABC4D1F36958C0C00FB3D4C6B0F130760238DD2649
-0C5A735B0B4DF8E609698700A080A9330CC8BCED0AF170D4E791C64EA44DE301
-9ED5D59F24CA9987034EBFD3FC3F829232D690DEB685BD5C91B4C6A3D1C5DE80
-DB6CD484B4114EDBCCD69CFD20461F6C12CF347E45D9579C9AE4375C1F00877E
-D3A2F2B6051D09AB480156C6A9E86A559469AB63C218F51BA72397E7C8BF37AC
-A413B505A11123BA8107A2B40E883572A5A41F2FD07D7E8A17656677A6FAEFE2
-A790C3D413670B569716A1248BB0C507C853225308B6AD39DC014EB034CCC13B
-315D7544F5B8FEEF1DC4028E89AEBF12137F9FA617BDAA2298D326A4673C4132
-719F7FFA1C065D5EED1AF32FE1399E48E370038504DCE43CD8F45977032322DA
-5B7297726BD995D24BDC2E3B0848E688C157877AE0EA411B0EE5284AC6D223ED
-82E6AF4E94FF0D5D41BADE24E636384C8F8261B8E9917154067200EAAA09C6E8
-CD4D9103FD27BD24794A012A15B9C5F0EBCC16ABB05E2EF63DC3A126EBEE67B0
-460F384EE0E07514DD75A6B7B17DC6DDA8A2BE32A9D4864EEFE67EF383EB5FCC
-8D756A08DA6601C4C4F6D85252A199B29D61690CE7EE89BCD84ADC9B4F067361
-1B837DB712E904CA57A1A3C9A0F18FC457769137434CFA34F64A976D49FB46C2
-A533EF92E525D2C880B17A935D4C34EE30F41D3D78D1BF013421462B2CC74DDA
-F16A48920E6D22A59A6B71E65A8E86999635E9C24145EE1C4BCC54B5D0B529CB
-084E14058F56337822EC46C77D4A7875E60E1862598C8EA5068206134E978A84
-7891E62D0545B381CF984A445426D0CF7953C32F36C32BEAAC1D9DA343D5716E
-308270DBC4F48DA9E32727482434F81452291D8353F974F5F370A5672B2CAEF7
-DAAEE9BC8ACF114D13A44877B44F87D9107FDBAE64AE9241353203C72E41A472
-53347A67B4D7D4D65B384058792AF2C2ABC08B856628F8E732D208E548C4C4BA
-2074697982852DEADF2EDB80DA4A396BFE1F1CE044CBF92ED2482799AF9D81B4
-9050957E97437DB07ADDE068E6815DE3684D6BDCEBDB112B450BD160A63A2B8C
-4843D232468361F9B15C829B0628E3DB765FFC1EF181991A7A96E0432E09CC96
-6CFC5CA74BC71089
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/l049013t.pfa b/lib/fonts/l049013t.pfa
deleted file mode 100644
index 947a31c50b..0000000000
--- a/lib/fonts/l049013t.pfa
+++ /dev/null
@@ -1,1598 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiSerif 1.1000
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.1000) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Serif Regular) readonly def
-/FamilyName (Luxi Serif) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch false def
-/UnderlinePosition -30 def
-/UnderlineThickness 60 def
-end readonly def
-/FontName /LuxiSerif def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-203 -211 984 993} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078991 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D9E73F44EADD0D9361D465
-3748937F491E18670189FD0D6858CBDFA6C4D794959EF9FD6996B4BFE7447FA1
-0B99FBD717D8407349457E126F430570E461A06CD1D4022BFD31D3140B4F9D44
-873A31C28EA941EC9D76CEDC1A71BF7589E11A6026F35F47E4216D7168D7E0FF
-7C75BD48730F67FC517E7539B16B14D61185D9EF8D13F9398E4F3881BDECB05B
-CB62672DC2C80ED0A24278927395F6C5D99D9FB3F3A1DAA087C609DDA0583474
-E0C5C9EBB773EA16786FD1FF2BE887147ECAA6B69B261A6A61E8E0DB8AFE70D2
-4069C33DA1AD0763306A2860A870AACF636654291C3BC44893FD9358616A1D47
-B3C79598FD22290D57AF04F3C192DC67611A2C2EEF144F80E0BA04888A5BAE0A
-AFF6C484103BE288EF75F74A81B453A4D3B3BA25B37C547091D840C1356E48F1
-80E2FCC0C091515CFFFC446F99945BA70A6F868F4EB9F4ACE8AB07B64CF9B7E1
-4A8D5C16097D4ABD16D3573FDA57A646D3DB6414E5F3EABFFE30F22996D0E4BA
-07685D5EFC2E97D9BA4DF8A1262EC2AB3C74A57AFE467C7E8130036360EF8D62
-4A2B6D8C290AA2365EA095EEA4EAA7042F747358A9F6151AA6F82F17F9A48ABE
-646A9A3F1DF12E7729658ADF3111E52D08E50998672E884C2AE82B893364675B
-9D3CF06B6DADFB13C53452730FD0A61A05A44B1FF1C3B0CA05756677C3D262EC
-6A9344B80929A6D456F8708C03D4E0B4AA29320F7E3E9FE420397D103641CACA
-87E1F114F525B6AE34F61327595648DF8FFB4FB09DC41C0641CB8EB349595ACE
-3A65D4E04735BA31E1D613CDD02337D460780E22CF8B8D7BF1BFA8896C343E85
-5791AF4BB99293E9B4E239A2A1C680099BDDEDC3D68BF9F2986D3E0E51834478
-D808353967F7D861A900DF206C52BE7267F70928102B914F39E001632154BDE8
-6626FA0F69D81F13BA8F561680D2C0645BD17BF5828EB43B6C1C443E8E3CF346
-50C103FA53A029A665987560D17F6959D9FDD46005A1EC53E443D89C7DD4A618
-3A114F733C87251276B35BB3A03FE864E0FFC9AB3C8A1686FC5605F5EF9DDB2E
-B9F6D75B1E1BA5710BAF346CA720318F32CFCD405C006E4DDB6FFDC97067C0CA
-394C5EEEEF2D27AB9810AD25A421FA7A4095D692F802C83CA5F8B2D6AB83AB6B
-45469FB7C8613F9E7DD094F9360435D624C67E7306D19FF80424B75968A3D68E
-39215E86F1ED20ACC5FBA87E107785B48411A9F5A8250D0E561FCB1DA12B590B
-9F0FAAD50D548FD78020FC3C5EC3B7ECD9CA58E88C81FCB7B2A3C3D114E7F327
-220D436632DA6EFDF722D4C99AB2880E3CA577DAD1FB9A9903C5FCEE69C65D36
-DD56EEF77CEABC3BF495DF819FA518194C03BD88E1DAC75E51F23765797A999F
-4405E08AC251FBC7F8C462EDA4768D668C93BCA47E035EF0BD905766ADB2EF24
-EA82B9C97A41552F70B0A1EA5172028A917EABC78B1E8293BCCCC03EA281DA0F
-9346FD6688D58DE2B14AEF2954A70B3755CA545F4E0C460AA89E4A9C3D3475E3
-26F5133DC36517157853FA680642587B62E71EBB8422B6C9E1335ADB17040561
-50D94FA4FBDDB86C9FD3812B90EC8A44596F9C683A5119DBC735777DD9D33AA6
-2A33CF98754D16B34D439FD8995E625C8250129701501346727F51096C407615
-F7B96061C2E733045C1C3A427F9B1AD26ECDA119C7B38E682C5BFA7B871AC397
-BC063B129FE54E9CF58C6F329390F8F14172ED0EC22A11B49787751A5E47340C
-37814F52C05DED2F8F17A4F53250634B4B54D675F2776A867C1AD96BEDA842C9
-B8077DB381AE4AC283554FEE875B64A37FC3005810B42BD9C1C1422B7B104DE7
-D912C5BF74B5D0B4671983F41ADCFB287E40AF8BF69686E407E2E97D4CC14B6B
-172972FA86ED76F43ABD480EDCD3437005670A2E785942CCD45023D1B3B70E9E
-C8AD2ECA580EEE06993FC79C3B44CA5841ADBC4378DD68B5A21E570C88EF4016
-CD5A7463F1829F1F761D719F770AED1CA8EAA1FA7D166C86EC3C858D8E76606A
-EA4AA03F3D3EA07CFF90CBFAA0E60B26FF57AA395AB4225CC19217920E0CE8E4
-119FDE73501174065D1C0DEF1AE3D6A9F0C9E2558030E8199E99662E767D37B3
-3761220EFC66C81205F64B6ED8EB09865046A89FDAA0275D248179208557E218
-40EF4FFD2B18CD1B46E7DF16B675C3C3093141BCF45BA70F31EDB235DE3DCB24
-2C93BD4C3B6414DC7C57383F35D1033E400DD0FBF57ED73514E1E186F08F8E7B
-6F836CC6702047AAE17175CAEB08E20D06ABB02FF72BB9839F34F27CEE5BA199
-D9DA8AD3C6262E0B467F9A85E1D84AFC792C55E00156DF5A50460D259353F33D
-505FE3ED16817DB13AE355DE90589F85AB977D09547996E06A8F123F655D4BA5
-E188E9E86CC31AE6B817DE4D90D7055BE09601F7CF4306BA04295148D4D42EB2
-E03F73C682CEEDA8C2862FB309BE14C96C256084D6DA1A0254EF1769877EC2E7
-90D0E6A37EBE7680FC0C6325F6772D2516FBD2F71EA193B0D96BD9303B746FFC
-0D9456B7B66E849477F4ABB1565BF0F95D6941C6B8500F9AFB561F08F71CA6EA
-0FAF63400979CF3F29EDEDA7041C380A0D3A086CDE2A1212FD6017E8E5A280D5
-73BF391BFCAE1F0CD3E895ABB45C025940C489F30D38B43E5506D57043EB6C90
-9798823F6AD59BF33E75467BDD309210803F24EB57E2BA92BB25200527C66A7A
-1D20D092637AEA5FE90C8BAA0A75172470D5C872206450164E702861D50FF618
-748CE14BACFCE06A869720517549082B5FF664D27CCCD7920A5A70724C847F33
-E893F9316FF2CE0C07E55FE095061940D12AA04853F444A664E383DE510AC21F
-2EA065FA840618B89166BC69C6BA042714A6DA420C38002841A2BD31C35DCD5D
-95D01CF0F4233065B48CA98A9F078EFF2148CC0B6B4601912B93F26F1B2BB509
-A89B6AE424FC9FBC1506D8DF65D85490124FA0B2C19D4AD0FB0BCEFCA1818474
-806028D9362C308A707C001AC9AA9E3D604CF91242901AF68176C70122646FE0
-3489B2D0AB026B5F14FD4E8B6DD4983435F8C1EA647C6EC3A30209332F5D9E81
-6F5F1D827D05995B996C589C6365E5D2EB4922807C996EE7D653AB8E6FDFBF2E
-450740A9EAC9D97EC4B05955B35992B8FF98065B126220D2FA9FD5361F00E7D4
-FCCAC7D0131097F55420F2E723779B33AFFD9A439B80D2B5A70CF35D9BD62E5F
-EA17E2B6911BC219A7D1D62BCAAACE9FE03A28780D32964E25E5ADDB423B67AF
-A377AB0E9E401DDD8CB82BCAC58B26DBCC1174FEA59A311B133F897ABE574040
-4CEDF6110B709AE16E63BAC2ADB18B30918A83160B2D3BB8EA25930548C69864
-DA2A4C23339B35188599EB5668AD8F1D5E43D49471ECED568D45BD02A38006E7
-ED0CFBFF4C9E8A9CD0ED5086E663D880FB388D04E665F154E5E3AA7E658376B2
-C37E52A54EA086300039929FAE313573DE586DC6864B07914088A75241A9B955
-B60FDEF10E7C4CA62F04A0DEE650DFEC8CB0C31832D6ECD00EB8FDD4752F4376
-965F0C7318C152697C688EC0A9DF0709F4D98FE9E8ACED5B47FE2E640C9043BA
-535550F55C945805685313E95F02D503DA1F68322938A76262287266376C9430
-34A8A7E9A1E090FC84F0942465BB09AB0E885772BD34D23C38655530F3266C6D
-A8B703AA8584D766F3140B468CE856EB0D46A9B7660E9D41FD90DADD603D43BF
-3E573959254916573DCEB05BA14B58785817B26AA1FFD03527F11068079EBDFA
-2C97B82A7C711113561EEE00C10424F43D5E3A7E6A71BEF9B8173A6C4E26B827
-664ABB5F5882369863CC11AD9F67CB687F1A5D9D554962839BF4DF589A5B0627
-72E49732552AA9886455050A00EFD580BD616A0164000E54A898BC9FB14A296C
-17ED96A27D3416956AE0A7B8EB477143FDE8D33BA0C2BE89249DBF625CBE983F
-AA6763CD284D0B59099390BFD0193881995A522B5B3E689CD7EAE3E718DA40D1
-C1B6B67463B2B885DE1E9D0ABE0ACCEFBA3D29F7F482D393F988A831FF3A9688
-085108CD2BD75DB01CE94BB7B4CE3674937895D6AF2F6659C4A612EB65F8E81E
-B9693701AAB54789B2BC251103528FC0A7E7700CF70B81230B65C0261A8584FC
-F19B82615DE07D894AC4CE2CBBEDA4E79CA2438B119A8F0F596D0C605B3BE598
-AA3B1B1F58B6184F0904A73640E466164CFD0D0C1948BA56753520F144F1AE1A
-015F1402E25F26B0B462F6C4FF977C7561217862A5E91E1BE2BA5E5B5E045B07
-163CD0DB3279C6D182DDDB43C1E15C6A96F0BDCF32C4FC497837321A05ECDC03
-30943D2E7A81A319C58BD5C78EBF72ABB8931921DF1474A67CA2E635FDD45C19
-1B525141980842058B8F07DDBA38D0FF3F17D95F833AFAC787AF090ECB75DCE6
-155969189C4A05055899D6AB35C9B8F1EA2548B596E799876C8A1A1CF5A2A26D
-50AC0F7F93A4816A983F82675AD33D409776ED878420262521C373CA48D01CB5
-BAAD873A8006CD8E74A9CEC86FBE4964497D72D92A2837AE2DD223AB101F8C37
-8E2565A1B6FE12208A05B60BB09082028FC3E1924DFF5A60525064A7B004B75C
-40FE50FCBF3CAF6B4E2F487C4778C5E6B105DF2962391EC856785F6ABFB35896
-8C5C7B4D3AF8AFE4E6114D241B943E0ED2129D6BFCFE863AFA58F207A654F9F8
-689E53F795F5A199E91F8F76D4C2495BD307CE3B7669EEA5C46E3BB4CA096420
-D4EDBF4044F0E2C79FF6DB09592C8D29587B536B189DF331336C72EEE5C96FD5
-55E4039799465EF1678063F2AE4CA788C89CBD6EEC9DB3B22BC19680CD130FCF
-963F30007CDF0BFB436F34B87D59A807189B1FD4015844DE56B7B5398794412B
-1B406C318D5AFA5EA90ED303E3FB726A7F83634341123E5CA48FF30AC16D2B1C
-6378EBA79DF54B6989FAAC13F076D88C92B1E485060D5B5703D3FE55255ACF02
-6A94FB7EF322798E945E24BBCBA0052FB611E9451F86BBD9E1BD6A143A98CC89
-A9C82B0993432956E2AD3A243CF7E81E23B770F5B576593EE0089845046259EA
-797B171AFFBA8B4A2712175CA836D750B25289872538ACF8C3A51E62F18C5E91
-B6CD6249CA9448C071CF2B9114696EB0A0DFF0019DAEA8399D679D8484823000
-DEFF6B14034B064969CC05E0B5E34FE6F414F876E2809AE3B09F03492B5193B6
-0D358C68DD6A3C48FE6318CBA17BB3FA9265235AE417DCEBB0380C30D04D6E93
-B414575828679719D85B9B4E5B56248E52B4C7841AFE7B7C9D6E844480C7AB80
-5C9412645FBD123919936859F61D815D105249DF52687F31B2701321F8DE91F7
-A88A4E8D5C3926CD47F8CDBF8DED8C5F24C5FACB2138736EF67C5742B33A12D1
-2721A47ADAC6AFE384C2066AFFAD2F79C9FE60FC11A7B71C972B897B12588196
-93C06D7A79AC25F2D9D2BEE654AD27D454D4F28E533A6CAE0C9863692E406A53
-C76344151CA587709CE1BBC845340FCC7B3CBED5C421944652E12506193A5212
-A3E384D7A63F0FC0927B2EF40AB4BA66909D323E6079D9DD5A9F09FD1078E804
-4D6633D71CBBFC5CB1E9B3BD13F9600B1157E28DD3226CDDD358B0878503D954
-0B43CBAC43A14D5034F44722B05D12F6EC8ACC66972E3B9D5DB270988E8D8E88
-4A2F92750ED6979ED5EFFBCE0731FC34213ED99F37BC31D0BFD0DA1D55120C58
-1167AE0D33E8F190A163EC437B1E67DBC254331CA1C77EB1AD6B98CDBE95CDC3
-1C7D04211BF48C8F86E34AF2CBFE411A12BDF382AFBD63ABC1A42BEF2825D07D
-1343175C428704AEC8C925ED517CE7CAC954BC556690E61278079241FCF33CA5
-AA04CC20D34B12BF04BE34848FEA0015CCA8192D7B6E166025DE3F12B4FD08A8
-5833375528FEB9A4CC7739AC1C6988B21F3CBAED01DC535A0999B5200FBCD961
-890288CFBF06B0E8B55CFC0D28A3D660B9A79A4A65C2E0F23B54355E41E5133E
-42990B4B1F4925AD1DC6176919F37122D5B783BB1A18E8699F8E3F48EA0B9415
-DE9376500F1C31AA51B98E9D5012476EA6F89D93EEAB943DEA72DC6B2734CAB1
-12FF2C8391949455BC5749722D280CF49B8FA5F6FBA1D55B332E0BC935E9B33F
-F47FD34619FB0E217E0B5D1026D29A3C8C33CAAC9AA86015B009B153B86215A9
-BD54F753B708FEE773C9A040F23D99C941707CD0200BEA970319E669907017B9
-973BC93F89E7229F4185F95A70537935ACEAD61E7D458C33307560B6D0DA4089
-B40AF5C8E3F428116D5D616E4B0DD6CC7FE203885B32931005D517CD021B75DC
-A4EC6FB5F0F8E8C43067DC7CC99B4055E45F38F8D411CCC80514814CBCC8747E
-DFE0FDF457428445D64F5E1D0811BCD103E6EB290E363BF1A2964C5FBD63A405
-D0394E066E54774E7B05CF3E250FE7E5E2782B06BECE8D97C5CFA0BEFCBCED02
-08879C6B8F93460D1ADBEDB3CF5EF9469933832A83088D6563EF6982E5F1E704
-B0387D5E746D708B7787B7D7F91BB5D99BB4BB2C6646D5AAF8B1D70E0EBD2054
-492EDE6D5B226E2EEB6B868DFE0DFDAF858D7239520824943413105CEA5AE042
-D9F12A6EC811415A257FF2AFA0FC15F64D7C7F21762238B86EDB5AE4E4CB4FEE
-9501350A8EB10809B265D5B52F1C10A89B5F5564C8C077C4109DEBDE36F5456B
-F6B4F3889DA1AA3855374A39B9AAEB76E26FEF4683821185A8157B392921ADC3
-5782BF866461D525CFEABD17ED262785013A628A017E50EB70444CB1A9E8DB22
-775040FDC83D38CB5C91064997A88C4DCAAF340D66608C4A28A473EEC0A08785
-C765166D9B6C234AA35ACB7A3E676E756C13A67D80C148A2BAF56432F0AC012E
-612851ED8B16B2C0673B11BF65904F7B9718E12179D36023CE784FEC7B79D0AE
-8EC3F1244A5D293CD4E67C7B58076A6DC8E4168398D4E3653AA7C0B44649F372
-58A5B2AFCD59AC43796B6971C27EEAD8A4E645B78559FFB90A0D2C4367F25F7D
-84EF76B89D09855FA0CAB5BC5088C220E2979FF17AE67491C77E229B4668001F
-DEFA0E5B581E24AA93CFD0A21E453FAEFFD82A27D236FD5913132FF54C925EB9
-F59D48E16FC904AA8C498AEE94635D187C7FF354F48771A3B730A994E4085077
-53EB73692AE569A52EC4F1FDE59E793357647277C96A080FBCC9B95044FA71A9
-359225214796A4C58C90C47682EF714B21F8C289E3870EA06BB9DA82227F7ABF
-DED110C7307B86772F538A937885873BD0D427966DF81A871F1D5F5A2105F25B
-C2BA884C9C3D8342064B7C6979EB116A6077BCAAC52EF21BAABC0AC1BFE8DFE7
-3BF35A96077B78E47551BD07A89A2353366F0E3560D495BC906B40102AC68381
-642ADDE76FAA8AB2466D26B4A322288ABFF4AEA43A5DA09F32F3B6ADF22B0409
-3F16A8CFC70421613B04078A94148E47DD1608F1E262884D8C47D856C1DE30BC
-C60933D7BF141A433AB68B81BA42326E2935E37217932DFFB28C9D8580886C3B
-DA86AA0795BB69DC249050FB9434C900DD3E97D8C7556834DD3F66EF47347B13
-77E60D03674E47CCA9F3D19B2AFF6660420940EB68A843E93BA89131606835E0
-4EC6CFDD92827C56A07DCB9B7C6FF016D3500D1C6F62ADF954551C2C072B0F7C
-86CC8295CC7BBB42CDB70DA78807C2C0CBB3C5369AB2BEA7DF33281A1770A562
-A19C5FB30E616743248AE7D93F8ECDC1B081F96F2F52ACF195A86DAAC8E53D80
-CB8883F37D3BB12CC0908422CE4392CA1014A45C7EB35899A8B7694C2EAFC62E
-F69D5179D4B6E893C2CFD762CC388C6356D941E89F1B0A8249E8A701678A86A3
-AFDD4B74C16633087CC14AB94788C32FD74B1F01FBF8C7726DBEE0013E576CE8
-F2D2B7E3CC723BCDE5ADE760D387EAAB664A6F4043A0AB6260755868BE302157
-551883035BC8D73366FE63F7BBCEEDF072224B01DEF7651E0CD9EB85BC58C7BC
-01DC0E874147E9A1F9A9116BB60A1FBB7FECE53F802BF95E3A52C4202C89C99E
-BCCBC7DDEA17AD7672CF9AEF169B20FB20D7F76B2EFF1696674623E01642598E
-A86C5365E4BA709777AAFD328E40D3935660CD986FA959451A5D1AD43161CB67
-5A75934F7EC456F55822EEFE030DB1AB048A2E69AC59A50370763A5AA4E11C4A
-DCF9B23C9DD7290E73E1B72B179138E514E99167EF94FBF4A97866EEA33828A4
-275804BD9DA8101E6F7C78541D05C2B9513C7B03A4AEB0F5D5646626E8C81486
-610F1EDD9748BC95F93E9D0C859F270AFB655E2154494FDD83AFAA383389BEAF
-70A4458D0D7CCADB3E4310B29A262C084F4D3CE3B0BB63A271B90AFC60EF2EB9
-EE6D7F7AB4ADD46F243D94F83154333ACA2358E4F6D53E633C37993587320978
-F407155D27463A47282D27D50C22B7F38BF34974D60A361BC6F26565D5CE5DD1
-A48B580F5A1379231A8B6E90D0F0F770EED72C9D9D4B397455C59A0687CBDE0D
-AF1CD3AE0B83ED3DF977C0DDE3E7537C8D03AFA3114D7AAC6AC5870D0F4F03E0
-06579E9A7308BDEF66E5DD3FADC07D612E6859AA57D08E6A4D118BA7DDD45DCA
-2E003472B89169CBFDDF8516C43851451DC5B37C32A111D9D7AD1323C708EEE8
-C500D1E8F5D94BE9E6F3FEA2BD8C5A3EFBE1EF84F5C95BD6CED21C8E2218E513
-46BB8456BFBBB143CC7F0D11F74D53BC996C5D5A0A157B2355768DD153DB21D6
-C2382318562DD4D1745DC04A3941FE0176189D8B041FDB0525A24BF5922A5E78
-420ABD3B2AA5E5410025C9F65FB43D0A68262981DD8952002F7B12FAA9D62011
-3AB3A84C5F720AC7D53671F33477E750EF4F700B2DC3AB8B44587E9BBFA1D67D
-276FFE23F32EE806D3DE9C138035E0B4893329A3CFAEE28E6992A3834B016328
-D3B1785119741A71FBD79193EA6EB20EE914A644ED41BB29017A20E534256894
-4D9A5DB399CA943AE5351D842154542016528ABDFF55068BFEC1F2B4A6689CD1
-1E416FE8D5B150FC6A8E68EFA4478BF8931F01E405BE2531B64B4863AD649294
-C0391ACAD1BBCC2627F52FA1E07D77F0A35ADAD416E837963A0E88F67C827C15
-EF55E915BAF4E5F3E4C0CAC6E16654331B3ED0991A7D01C93C60F6961A73E72C
-A77434491DD87F8EE1401583D48FC38F63C1E2A35492F93B871ADED0348EF0A8
-437B033AAF2C3C6234A1A451C143CF926992ECDA1F1F3FAEF13C6B1040A202B4
-27C545405D90F77C939C3199FA47F647B482B7DEA16DFB1B36DF0F70446B8CF6
-02B33A96F2E81416ACE4D1B53B6EC5D96C1D9D43E501B989580DB90E83A39CBB
-E699A7D49F993EC3ABD780632810CB3CEF816CB7501F38D73106C838BB1C8208
-84382C1DB306315AC4662285984F9D431DCD1F2C854C4AA95CE08C33A99B8B7E
-6AA0562D554DA18FEF39DEE068E60469FD2DB23428ED0EFF075A9DF7EF3F92F6
-C73E9CF760FF0523522747F7FA0B9C21B9E4826A900B5D943BDBE82330DFB8C9
-C1F7CAFE80F7F1157EFCD3E6398F77CEE305E39C876D42BAE82F5078E894B112
-3292590F08D820E61B6F0454B47A23C78A5B8F3F34D7DA46735BD26A19EE0327
-E9D27D29AED59C044068387BC305A558A13403C9F713F6C5C2D9C6765F8B824D
-5C3DC4222ED8079BF0610C8CCDDD041FCD67684E66682F8434A319E48BBF7F01
-F8BB5FA9FC41902E7285DAD8DDE62B484FA5DB359668E6AE0805B48D864B7C82
-DBC81F4CEBAC5A5108391DA129E11C12138D94EC1A407371F70C6B84023DF9C8
-EA177A087632E3EB4ACBB13815B604140285AD93D1E72D17AA685EAA7886B5B2
-E6C3BF45F83594C841954B58FA051B7A9A94881598929A8C8310671932CEDA2F
-6DB1F7F015F8503EF84B19E059E8124E4843D09890DE094EA6EDF792630EB0BA
-1486947D0A0B484F4E223DCD215EE78D24C090A3C76C550B065225B957C47C01
-9C7AAF1498157177EF2A68BFBAF50A3D221B4320D71EA261C59A5600B55037A1
-8BF30F7479E036D463341CCCA9E987C3B87CCC44E383BB5FF98BDB2730C840AD
-C388CA6480B85A9AB7D42A63F9F4B049B45AF49637E9464A2C9B709A7DE3FE85
-10A6842FBC7B4C56D14F998D6D382D31892F7C066C77A6114185E4A573F9C378
-489CC8551D1102C2052555F93CA134FED3383AA3F28A0E11F5D471819582BA7D
-852CCB06FCC3CFF6F99338AA046BE9F96186F288D3951F75449C1DBF650965B3
-3D1030CCDC4817BEBD6216943F2DF5EE8B9FEFE6CE4D38DC52F3CB8A7D29722C
-990AFC8CCAA016181A26C3EE67AC35FD6119E23D689EE78E05E2FB7EC3864120
-860E8BD2EA388508327C46EC8F895E24998AD2EC0D8CDE2A333719DC03F57C3A
-229EC6CBEE7FD13F538570C2DC2F1031801BE075A473A2A2A7C1E01F74B8500F
-DACC782033DEB55C23B08368EA6C6AD8E47AEA7119D76D4B9F80252D66F70D2E
-6A498A684FD131AE7B22322009A4870CA2C684C5FA7027E1D98750B6BE292FF3
-0EBAF205FF0EBEF7E1C322DC79971EDA361E0597BDC717668F6B1E66EB93EF2D
-62CCCA7BD345104EFDC72D1FCEF328857B84439A811819558DA11DF635606EDE
-FA44B2AEA013F1FFA384905F5E32057EEED1FDDC33E3672F42425E8520999004
-51EF287E37D33E8F2A6D33EF933A9A1B1B6472889499D5F24BBD442EC57A6218
-2DE6452AFC09388CE79C10C09562307B117171AADBC4583AC258F3525534C141
-6A85CB591C56BB9310BDBEBBAAFA8270A5A179A368EE401D36A07075F21DEA6D
-B1A64E018F87AE259E98401E87FE8A808848DEECCE5B9BC45F44A621301E0D38
-AF6B9042CCD89445F09FC971F94007E7CC558F81080A51B3163B7E6629AC2162
-A410F477E9709541D6B4EEFCEA8D2208427D82F6D46A6DF1E180F621C5B44EBF
-D262084531D95974D7BB0F098F279BB04725C16955BCD5CB341F14903C5EA661
-7752778CB6A73908D89835CE1D302733EE233EE7099357A243E77833FE9E9178
-5A025A89882C9677467821A7414D970B9F7C0BEE6E0D3F5EBFA3438640E6630F
-916E9523D92112C2FFDAD975FC3D3DB51273AE8A250288AC30F0C63DF9C98DC0
-87EF8A135936A2F060405A4B8E2B597137E9C0B115B91F67A7015CB6D895E688
-45D23AFEFB6434789178094B15F666DB49AB7DC74454933692B36DD82019CBD1
-4EB94D1C042285E9D76F95B80FA4901D85BD16056ECDC82F068E794CB4410D65
-4CAE5E1B495D1D14647B4F3CA8EE5ECE7081693A7AA06646594744FC1AE4723B
-49EC675530C977FF95B41B1AF51A84E777F1124602DF8F5684F3225AED18B990
-EF1150946A5D0888BCD0C79975A631B147C627514406FCC022DC0875CCF8B036
-653B15187BA94DD8C5B6127AB5069CFB9892C6CB64848D4637C523AC2A5D4B5B
-611CEFBD818A1E06BFBBFDC00EF8B2602BEC466D996811B2B424406A29718C8C
-F57418415DD2422065C2CFFD83949467243264B16DA0C1508E597EBC4B18EBE4
-4A4354E8837173AE628FD5DDB5610D35F96CD42386C234A9EB05C71322847C46
-ED113F60A988110CCA6DAAEBDA7155A28BC035B803B81F0FB6A05DB7EDC4A880
-80DED199A41F62EF60D904F55160EBB83F40D7125B66750C881F809F30E5F72B
-26748422CA9BD09A8FF4D86F1561C3B8AF623DCE26C85BF643700759324A372A
-B2510533A3B8D885472BA12963E9C400B81898E6E116F4977CA724E782834A56
-D45F67C46CE5F9C0C267D39ABCCCCD1BBB002B4F7F2890B868ED1071BF8A5B0B
-825DB9EFAE17C7BD9B887D75EFABD94EE0B52FC811A8EF3C94EE93838F4FC793
-D38929D6E0AF3F6D624F4BA160BE513F683E7751FAF422AEEF111463F6B889BA
-B264156139AAFF7A1B64790F78A9168AC655FD94FB82FAA0828F1B284CC2D027
-CCA9153FD60BF80891AD0B45F0A356A3F7B90B0D190F1CE69398C1F2C5B8E99C
-10A2C2E97C530A8614E9203F424A431220A4F5333DD281FC1CAE2F2C0E6EF57E
-CB9074A7C7C0B355A1A567CC2D6CFDFEC64401510F29EDFB0DBDFF88D4FAF643
-8E721BAFBEFB4E1E5B2AAF576027CBB3A2BCB8B26E252CCEDFDAF8740104724D
-020CE168B39A12E0AB7F4E3BCD05C30C5419A9DAD1C3510CAC11EE4BA2B74818
-88A1320E5FA1D6BCD4B58877927878D9D3A65C38CF9314FEA0E37EDA580CF121
-FCA5FAD167856A8588BAC41CF25B3F9C0C158A253D40B53AEA357806A3D0D706
-BE64FD7072267DE22936D8CD0E33DEAD240C795750299728D41532FD445692A9
-08D8EF48054B22F12407C5846ED8F14F24CA348FF9760008D2F85FFFC514789B
-63E5569E73BF23A6413C4C077A7471E7275107F2C7BABF43696B746ACB2F4D17
-A4194B4660E7C797D3DD3785B92EEC1C7C9702F5ECA5BECC027FAD6731B49E0F
-08F0486C25CCE8907B68C18DDAE8B42655B46B19B652670790CE1C9F3C8ECD3B
-C88890676121A2C89D464D9F27B3CCCB5C5C014D198B5AF358699B998BB61488
-59DF9D0D706B84D457DE5430E8B5B6BFB5124B16C626E9B3774AEB27B3461E73
-0BD7F788F60264CBE30D39CFAC48FFD28ED12D55C7D0F2CAC21AF25FD25359AB
-817F0320B766B414547B565B52DF5702B5957A0FB9D7058DD7F803715D122859
-87517638A22E700783EF621F407FF829E19C6B379AA448407D79FD4F76BEE1DA
-71F6295803F0E7F2EEDF22038E3EBD6D56A1F0B72D203AD1A89AA7344ECDC16B
-83AECBCF61F07C75B07DC7D0D5824281C08F0372762047B3E745C58CFFDB701D
-2D35513F4EE938EA93D7A1FF911C07EBD7AAF2151869CA572A225D305E4D2883
-FD885BDEB7876A89AE4858FD2354FD4E347680E3DE3CBC048751600EE94C8DC4
-A64C4ECC6BCBB494A8B5DA6556724CB090FC00BE670E7D023F843CF23D363BF9
-36960292D6FBA48B69330631A12A871E56D9BC8772897F6492EDD55AD6DA5117
-3937DDF370CC6B366555DA1A22700A876F6E535E07F76C28B864064D5474A8D4
-CB2455AAEE25F2CBD6CD19E9B91D1380B73E79C7F852596B97B3D1CF32064594
-42B96C2FFFB054647CE2318D4EBC68EAD9DFA5029ED858DCAA0D5A972B0F8DA2
-2E080D507304905ACF3943644BE25757DADD2589D77553BFDAE17CD50D3431D5
-1CFAB002AA9A493F305BCA941D8CC78B61AAED56E4771FCA6D29CB0B9DB7F542
-AA16E37E647A3D71D0DEB3F18D9E19DEB7DD26DA826068554445E54144B6FDEA
-949D5D03EA3238916260DE4AC2152200977C51E5693616977C581508ABEFA156
-B0767661AED9D47675F71455CD143EA30464077398E8835FE9057C6FCFFD6576
-8EE913496CB05D8E3AAA6478685A5E03093A7F62BA5FCED32040D00680141C48
-01DB98BEC6F83FD2B395A97C0EC0617223F19486003374A38147AD0AD996F6D4
-9E6B70187368A368C84FF0C5C2E143CEFF967C279265FBB2F1C5B94DFCE706CD
-702C0792DEB7FF682848529C6B7A40BCEE5F7F2A868452665E00B8140C1369A8
-133B5114A62C9983FC3A13537C4D614DD9E513FC9ECCC001BA6A3287D82E9E17
-FF5D88A373023E0A34CFDE64113A6BE7C365D68A64D44F74205BFC5914D669E9
-06D94DC90890DFA84A169AC8D206ADEFD4A281C59B49F12DCFF9D9A2A4B42049
-1509C1F929D2820803279DE83D0A2B20887FD3026604DB42716F32378F996CC0
-792CE403EB698C865C21D26600E8706BFDFF5267F7D9DE38449AA71FA2C3EF9F
-5CC34499FE2CC522142C8C1D55D7E6DF5188F9263F37F51AD78E9279A823433F
-5755D9F95094B7FCE2F2224236585967CF767461380E28A674E831DC73F979F8
-935D6816947EF70D41D5F64DB5BCA12C184BFE59EE26334C7C9EFA0DD1C6CE22
-D8315677AA321A9B470F63ECE4DDE11AA3604E8B0E9DCDEF721138EDAF421D7A
-09D9D6A74ABD55112FEF6593C062EEC5AF3EEAFC4B9C831C7E8D56B332E9844A
-FB85AA1EB94C1708592E5E7F3266A037CA3AF551F3679A0B67029B61E9D20190
-2209D680032D5DB92CCA9BDA51820F2185C5678E879176F4DD7A9D64328F1305
-FADCC214B9BB8D9AD595EFFC79D6CD443C2F0B7DA981FBF696A43D4B74EAC3B7
-0441144EEAC59F52FC83D7CE750E0F9FDAED943D9B67BE023367F920DF5A220D
-C18432A6AF622F53D0B240D762AC25137DEEEC12AF276246943C4C804254BB04
-9C2510885398BAC62E2F67961B2D24F00C86053BB14200DBE1AF4B9DE0BE615E
-127F1FDAAD1AD4E939C1D3DC71FFAD3B9264AE547CB5F11B4E3D93038A95B4C5
-5B0D4F249B20FF04922A1158DA5A7C9B99971AE16FE252C76C21475165CA356F
-1F9612552BBEFD2A020635B7E0159E37847CBF22B9EFE07FF1CB9E9129D1AD19
-E979E52F78207EE4DD64287C0A929FB5BA5AD68D395B61CD12C545C6E88DBDA2
-2224BB1751E82014F2995936B6144509AABB965D9947B5B5D1346C1FD14DEB6D
-36A559DBE82A31F2DB8830E260C9069613B8DCDEF6E6A88C7B0421A4B99D4EDE
-F22CAEA7D7B519A2D12CED44B4F4DD63E3011779EA4B44DCC803E062DBFB6BA5
-098CA9E78832C1E6C6B7C0AD47350BE81377EF66A93134CDE2CBDF0EA9DCC5ED
-E38F663F72B1810DA8C23F287ABE369C496902E3D18B718B650324FF7D7434C8
-6B8FB37E30DC7C5B59DB7B8C982194F148B26914447FA86CD95E9781B3918DF6
-5FF76FEB4C8F0084BABF786C5771ECC6F9033C1528C4F0C5008F19D8608557B3
-9B32BC80BB28CD3C9636A8CBFDC7C3ADEED9BFBA9A59904091E31E7AEAFBCCE5
-2DF80869EFEEC3E3B3A5C20B49720BFE300F8D0C807FE3DC3615DA21501AD3B2
-9F602644E6CFF34AE0E34C8DB132643D7EBB7E485F9EE658D6E5F2474A0929BD
-768056CF7A4CF2D42B3ABF73B5F9CDF68BCA4753CE33DCD014F646F02229F9D5
-A207A0CDFC782280B8FA180A8B0D26BA629672E6DA6AC08F523C030747C7DCD1
-2721543837EFD203912078F1C21B4C12E1D3D99CC3D41A1EB4BC7A9C7FF233DC
-56251E5951A62BBA5164C4455FB7C420B1544FFEEDBCE126AC7BD5259C877732
-5F434F717210DDD55C655AD55C94A81238FCB7B105DD2B13BD30CDF70CF5190A
-6B2C723EDBE8E171EE85CE4BA5010E254C217D8A110710DDA85C1C16858D84AA
-6CCE64E98F873104628594126EF0B15489D651D8E9FF1EDE0F7147C3E1EE5852
-629A2851B69CBE14F784805C22AE7C9B2CDC7EBA0661DCF803DDF353E2A1F5F6
-8AA7CAE75B44C6187180B7FF519208887DA1C895BC7B8B1783E7EB487D02D234
-4EF2E529CC10CD2538BE4879ACDB5259E694675BA50DB78A91347A4C0E58573A
-055A91E73E3A6AF81E890DACDB9589EB34E061E8936D1DF638B35F22FB3EC97E
-DC0FD73913009B9895E4C95CF9D7719D9D63C25678C45372667AB85BFCE4C77B
-A37FF8E0E6215A718E1A4CE6DD6756BC93A8C1722288FFB56A4082C530D8F47B
-26EABA70B663BB51AE64FC03543E7C3F285A38FA416B20F4A73F1442648EEEC2
-3611E13EE34250A248798A2F0B9D6E3658EB1B97389A66C96C96DF1E41A392DD
-F667EC2A88C557F4DA7F708A33692B98A8A75212231B395D6785CDA4297737E5
-13C16F5FC9CCB761CC3618C75B259F46C45926F3BD3E4994E6DBB890997E3FF5
-D0C9185B9D91A54E6B0BAD88018DB6466492608DE79791EC93516E67C7C52977
-F9E27B153910EF29F9F24B0C9DEBA4C3AF8C59098BCA325824016E26EAC228A8
-1126E6D8821B379F140D2ACFA1DEB12D434BD0383E5BD448FF624D8A9FCE8CF7
-D843B625CE6ADF6F89794CE54C5B6049BB95EBFA62A296515688317FD1E7AED9
-97A2E7FAA32A4849114921C752AEC2C52B98C69C57818EE73CBF916A235F34C3
-3E05CDED2956DB5B0CB7D51AE40E56085E5EAFB0BF29DF9B04BD66B030BBFA1E
-CE3C041E8A175033AA4B4C592575F28775102F8A45E15E3E2D550ADC06CE6514
-B652105633B5E7876059C81527B9512C40DD586CA25AAD144BEF5E587C97E6A4
-45B9772B8D54C2B75D4A716B83617CE59A1E52889613FBBDF5680E676F430ABA
-8D80ED90B8410AD5BEDD7599306A8EBDF90107594F191F927C6D44BC816652BF
-95C03DC365DE827A1AE756FE769550AFBC535CD3F92FBA42098B2613302020D2
-15F884D51ACD348FF9A0441F3E4BFC2C02EA7CFFE8B388BC0640ACB468F3AF2A
-CC50955F7CE335B7E7C8E16F03A9DF18A31B257B6106C3578A343F16ED459E76
-43FCB7DE1E9F7EB80E5D21B7D4BAD5D628F55E1DE0ED07EA926E73FAA6FD190F
-796E75D43954E67F8ABD25A6414F08AEE76CE48B180CB1D3458F563A3EDB63F6
-C9C3D9078D20914B83E7A9DBED2A2CE6F0775D3EE4405148F15A5AB53A4B0626
-E24322A78F87041E956C655601CAFAFDC6F3C75B919B4E5A584E9570B6F06302
-99CFD1B95C575E45AC1EE59C798E726F129643964A47283088298D9ED6788B30
-D48341D03C2C1BEB4F31BD92ED5494A6B4039A88DC8C726E053006F9798E9C5F
-BB96B002056FD39A7EF2195335D04E67EEF12E0A16E0FE37FDEB37B925144A7D
-DE388DB0B4782BA6D48A2084C5A821427F97D22C1938BADC908C772F1A578179
-4FCDC28D435B6BB443C31C4C9BF6CAED51370E133F64A53D0B56334FF57AC964
-B6CBF0D85791D12C68A7A8BAF82CDA61335057A1B8FF0746F94C93D360F4B0B1
-8FDACF3610C902BD03E23FE6FEA2E5935067D10AE5E83ED6214B0BB2D4A4BB49
-F05E89CF47483357C676989DE740832C4E004FF1F2F3BCA3E34DF760ABCD85C6
-95D97A55885031DE77C16B89F18648AB25F9774E495D4751ABAABE7A25CED555
-60CE44A39581BDA539D4733919B9948E2257DDBC67C14E6CA051AB6A2494A818
-93C567A1DC8030900555C28AE6D1A0CC6513C7B31A3F4EA137EF925CDFF3F5E5
-CC9C88776B12851525A920456464431B9385B6D1508FA472B3DB12979DA517B4
-1568600717B7515DBF20E33240405655B3039B7B8C37BC146967C42C4548CCC2
-50EE136F210442A8754946C8DF57016D0109AC569AE4675E111A7D14CA742BEA
-47F0629A7EA56D657BDC06D84E4B248A2628123D100F5ED185DBE2BC67BA6F1E
-CB72947E8C47E53D91F3A28C0125374D2D78FF3EC984B3EB47A5B1B0421F2EE5
-4827EA2D74EFEF8427FF88BDF27344A82B622327EA307D805E93ABC2DCE0D457
-46C2463F1F5FAFC898D6C7F64561E385646C8C71CD624F6486D9EBAECF04A0A5
-ABEE1E6495CC0B1554C0702ACDA0CCBB7275703F51EB6F10D955DE95727B279E
-9F61F19D9D54A638E0BDD27FD15B7DE67A06C31BECB0C800DBB1AFB099CCC2FB
-0BDA829E02EA8EA8CB86E97F9D074A99CA8F0E464762BD1B0F41B444BD6BB73B
-916DC811EDAD9F9775890D9FEB5337AA6EAD524C1E293A78ACB15BADA0BB59FF
-714C43A89459636515E61E73C2F4C648D2916424B688896567E6B53799A79697
-E9DACC8C43A3DDD425AFA8B542ED9614B482F73DCCFC20C4485A67545E241B9C
-CAF58CF1811D639E6C79D013C9CA124565D5D9FDFB2044198A41CBD6ADABE1BC
-F1B43683A55E7D67E1E00CC18986F446B1AC2FCC22B2A2F0EB7B78E567C3987F
-6619BB27788517FDF9B5603BD8BAAA894CBF354FB6F066144931F91D1D8EFF57
-F75B1ED60F4204CF0EDCEBD9252EA04F29712B3907A7AA75964C8ACF7D216759
-931C517183D319B5218AFEFE28F64471C79447A8C96A02D2974A67778DFD3409
-BC4415F8D17B12773192F7485B93E6CF9C99C281514C1E1BDF3628A5F093520A
-9CADA2D9BBAB43139F4D067BA7B1D799BD3ADD62EAD68A70C6CD5249CAD7BD87
-C72EF01DE59557A3C3479E36CC872062034B67BB60D8EE0B703443CE7B982E4C
-A6714F3333D6780AA342A9FD1D290225A79536F222F2393C5FD6EDBC1325C4BF
-61D3D3E5B0C7FD0643DDAC4181FC223C1CDF89A44E542F2AC67FC46D06881683
-4E611D1993F6353E65086553C9D8C415FC809A289795DC5CBD74FC1199E0EC66
-C984180B57F710E59FC74EBE76A8C2CA96AF6A7774DB9879F9A73958A8DAC26F
-BD6C2CBA67E3AE7AAC3AE51CEFD4CAB980AC13FC24683151C15E83B23565214D
-39600CA55C611ACB9941F78B5349B51B1C489119A4381912AF6D74508A1194F7
-D825C41B88F8BBA571414C69A085CF400D4F7B88D16DA3D7BF554FB6A96BF754
-238680BFE0D23146EEFA3CAF7ACF4475DC40A446758F5FF8FDC0BCEFFE4C5D23
-6DCFCFB0663B70BE4BA681C5689952A7A26223CFEF28D76DF18E6170399EC32C
-14B40821724CDB09EFCEDCCC932EE90CA228D888B76A18AE6D94FD69B7BEF356
-13EB8599508321F0DE786EC7A5CB4D6A218E8A62AC044EED391C8F6D4F657C8F
-D9E5E8ED382685556E5FC2A8214F93D1AEE16A49CB6A4FFF2EE61741EB41D56D
-282C083DBB24FA25D4C765E336899B10EC68C62358CAF2CE6B21A74F9E554C82
-221E8A0414E5397DBF86F54FB355640CB742DC10CF865E0C2E16EECF709B2A0B
-908BABBEE0175F8CAA010031CB98818494E670DAC8DA0ACD46959E51669420D4
-128E38F2251F7E9F20F107A450E23A658F3B6058F63D699B4C5135E348CFACFC
-58BA180FB43251958D72F2446C6DB69A17BB2416B5B0975C5F01D4B1C29455BE
-538BA23611CD5FF3F06278641AF5458FFBC44181D9DC7D4D6188D8A506D61035
-338C78D5B248F2812B3493F890F397C1EEB051D1AB29050F1E1020DF89E192D0
-930A1EB5E35E0844ED2B7B39C5982CA708A33E5164CF14B10EB890EFD606D80C
-D08206B43A60C21ADAFC0A57A392B40CCFC7FE02AFB2111F3A20B18AF2F8D64D
-C511FD613492F116AD08D2F6E8193F9685568B83A08395331CF44DA500C405A1
-58D1E63E6F36CF298C02D2271A27C9A454329882EDB15736CFFE070FAC32ADD0
-9CA8FEC258CAB9B80C0E4688322B87D4AE222B574C5C599DBBD24505FC00876F
-7ABCD94C089010E6DBFCD033DA2476EC01E7D0EEF82D6C761126C42531CB6880
-7D7D887817FE9B688447A04B38709197A87F4C0DE7D26877E08E53F68354C2C2
-492B3F3C82DE586A5BE477D2EDD5A8FFD23B55D05BBAE7F6D6ED28BAB27092EB
-C859930DE9BBB54EB2DB5452302F46AEFEAD89721FADA13D5340C7F8CBE0270C
-A8861D53170E8050F5C60D72D85E2767D42E7A9407D6864A2118CC70A16C80AD
-18A214550E33B636BDFA811DD05C871E9BD39F80682BE56F0E9D0132D5B92958
-E4DC5F4A27BBE2D2508B6B66322C4D2248F09B1112E63032DE8D750092197808
-262715C12ECAC600AB628B03732E6214AB1E2CC952B4BCAFF89D31D186079AAC
-8D18BE05414AC7D3433B95FBAEC5186269E8C4F5D01536331A78A3D405DD8311
-8D46FCF30F6A339CA1E0C12BB42BF4C46612F3BEBA9D5822E3978C7E7F24B019
-3F883DE1D353C6BD609698251802B3BB06AE88AE85CF069C70AE3029A66DC96A
-2620389074E61FC3FF708B5B9AEEDF245BAD27A66025636ED25A38A1BBF095FD
-74D0A25EDD692B863A29E3F224AFCD67CF5FB9EE9E45C06702CDF81EDD74E000
-653C3CA9A8674A8895FCF6922C77EC3B63115CBDD52E8859A7A2F736C9CAFB22
-5A62C420FF7E6410386290B35DE4384DB00AE1077CD28CB6A27392F0353260B2
-8964096063D8E225240E0B357FFA444FD04EFB5B9555A7AB653C9F81D879E718
-E408609E458BAA7F912B8E8587A14B27D38792CF0B66EA0BF6FF28AB27D2F132
-0C4EA7DD61F4619A5131828FF73B622C8136E2DD8516194FA86B91A1FC11DD19
-315B3BEEF7BE8856F36C5A41ED2B8FAA5A35C46332174ADF029456721D204003
-17CC6CF3DE50601F8DA6A943A1A5FB4EF6263738B2801F5816E171020163C3A7
-4A1EFB474171B8B54A62E29A84B8025C0A486BB5871AD62159C8C2C2739BCB3F
-1C22F406E26F311AF6D6E5DCF9394BD6E0F2271E9347150B6DDC8E6EBE12BF4B
-4FA1C6D03A1ADFE14053F1DFD4086EA3FF849AA0CBACC03AFB2567F9A4A5E3E2
-4CC1DD4DFA6281350643C771672B4E8141593AB7CC1D684307274E42547239BC
-1A66D2F9B88FF19774F77A29DDF1441094DD13FE8B60BE3D172E2F03F5642995
-D3B4EA77D4B8C2A5B95E17FA3F4FF3BDAF29D8FA2A1B269839A961E6D5F05079
-7914FFA78F79641CEFA7C1E7029B45CD3DE6289FEF5AF3294DD287F8243F4816
-6963C42441B459C2E47C48D465B3F73117A58E45F4849F7B84A3F7AABBB67BBE
-C04E794FA35C3DCB2EF8689864AB5EF05CAD5839A181E6E558355A212B7858A4
-B91DE81B88ABBA4DD07243F9B7E7616F28A294A7A6BB6A91467ECC40DEC2DD68
-C46482EF44B79EC6726318CDE1748366ED8A46995C1CAC6AC2D95DF400C565D7
-8995FD0D12B5059FA90DC42F97176A89A6B77C06E89DE6AB4647D89733F5CB76
-8CD689C40B2BDB5400914EF8F081423A9865060FAF419E3CA66BA378985F9DD4
-FE2A90B6B7C189BF2B9530D43BD54AE78A4E6F6CF1436B5B09165E501F5D03DC
-4921066327922289B1642CC41DCF873219055271129C7A1B573AAE9EA60E0072
-DBB3FF4A4F088408012F3F6AA8C85FD786C1561431014FCFDC04D9EC154B14A5
-3FBD7C31E281C866EC9336B78531071144CDB99FE5D9411EB5A49DD0DE0270A4
-03394B3129890428232C45D40685C9741CB09EE1F1382216B1DCD028FC1E0F5E
-AE9E6A1339E911DDAF47D74ED9E46908672F505D44D5B96674EF2943F17710AD
-C05FEB120520F8E5AD6293FAF919A49051D2B7B0B87C9926512401D2B45B1F7B
-818BDCB0F26A70F48DC1B0DACD6A2E5CD23483F545BC78941F5FE1008B487193
-B59180C93EBA03BC0DE031C43C172F4B2FCD30B2845ADE4C96C662157B1001F2
-69CFC12DE72A3901E825E11F5F7B1B1DC9F8A783B840CA9BD21D082F6A9CD8C5
-3CD6EA5E2E4ABBC4AC276CBD9AA1E73FD66FEB9262B35C637F8392A92B598861
-FDCAEABF130A5C21E646B711566EDB6803F1012CE88E0771F7001B683094629D
-04FF9CC28D2268C22F8EE75AAED16D4A2F95851E46B9809CC519DB0E39618DCE
-C22BDDD8BC151BF4BCB0F7CA35786F6B68F68E8AEE4032B1BD963A83CB00A249
-1878844DB4DB27B7FA585622248E4FCE609E4521602CC6AAB4713FFC6A39A396
-7C2A1A82EF4D6E814B6914F24C5A5AE2952875EBD6CE5B7429582CAD0D07DEA1
-72E65642AACC1DB37E1C51B920BED00C4C6D597B5920A5861DBBAE3B43BC09A4
-4BA3B4C52B3930423C6D2D39C5249F6C2C0EE21B27534EDEEDCFF791A302E5D6
-2D18005FF18C046714B9938AC93B5B8099CB7DD3C142F3BDAD20CF23D7CEC7AB
-C64D591809E95EA1788036BAB68B8E4CDB12A0CEF717BEF6340C9CA1092BF8FC
-C30EDBE372B3D640700717F98E9912B814D1668A1169259B529F3E12DF309B92
-E0BBC7B6A9C2D4903BD44C4B0969E9E5DDF3B8CA44B8BD065C77CD2ECD3A946C
-AEDA6FF655D5F8C94509F27934B9207534C98CB3361D8767D22360F5C4419E52
-6A3A861A6C56AED8F6871DC5671011DF104E31B3D5DE68F2DE00F49673BDA295
-F03EE38F4F2BF2CBE7274A6A6694DB0AC0A90FEA1714F798096B0B47453B9F9A
-6E7A4652CEFDF5755A0C9F17C5574FC5E5623874D5360ADCCACE26CA2393188F
-A81CAB8D3F35A3FC81D43D450A073474A391A31D7FC994416AD2DAB64AA6D4D5
-9AD3DE4132A10074BD4A27ECAD779F66C3711BBDD7AC92203583AAF0E70483D6
-FE5C76A25FD50101D6DD76C9898E8A996F6DC34F1F22085EA743F966D1FC36C3
-08A4CD8D337DCC8E1DB190750FBCFF37726FD48D1E3D036F1556B755B3C11974
-9F81BB7C7B6430235FED173EDFD5FE81A1815F1A424E372485321BFD6D92ABE1
-C647E7A18A0CDDF2CBDFBD5BC0A1A57855D4AE646D27063179B2FD6E2A01367D
-95D63DEB069446A7AD2346ECD9290472E4D057BB82F5B2F86C8C81FA765FFAF5
-937C8EE96E839472E591378995354261EA890AA0CBA33CE29A7CA6BF1DE2E312
-AEF2DF4F66B742C91BCFF17635416598A0CDA87D2B94E0AF915BE7EADAFCB9B4
-5BA814C81CE08C377E448EDBB082987970203A20B2BFE8B58EC3E6AEBC7F0CE9
-DC5733F5A05CBC25152EDEAB6507B8BAB2736593383FC9FC744EDA54C67726B8
-199A3D9CE9DEA371CF1B47FFB18951D8F350DE7FC5D45BDCBFFF8005B92DC257
-DC098528B4AC8BE791F5FC75068506C2ED97CC77204E2F37248A2BCEC9ED4FED
-510A7B9603779B68C57D57A94DB76839004E736177752A2A63BCE0900E00B493
-519AC8820D96F9304034D948C8309E4D199A5BF01052C9F807D27FC0C1C20C55
-1AFDC48CE6A0529E32AD7C316A4D313FA9E28D5D68E4692C48A9A030BB275DFA
-004B19FD59F6ABBF58F5D2DF093F0ADE1EE44FABEDA97C775643F4616A0F5262
-076FC11E2C4607EC5AA475B89BBA1117182A9CA235FD5BB9FE9B15798658B285
-6C35315A41D5DD6BB6021219DDF2A30C7A695330AACB6D180F53A2C5AD703A8B
-41256DBA79173524A8020675CAB62E557CAE00B396084BA76A734E1E01D46BFC
-25AABBA5FB4D48A1654E1BCB76BB5E792B2E73F6E7006B6BBB435979C8218585
-C41DEB66A2B9152FEC7CD454B4EDA06A73F35AEAEE33016A2142CF0623E93969
-F86E81D72CBDB19B4BBAFD70DBF0F8EB16443A9987769C532B2A5053A7B55910
-50E459A1098F5467E8175AFEED1354F1C50326CDE9E761427F585DEC3C9A4D36
-A76A9CF4C0EA0B8712E890F81AA6C2A9A81C8D9B061931F75A257B93723BB6C6
-19CACD8CF81536DF0D2A466463EF195AF59B5207CB52D0902AEEDB39D79EB566
-F647A9138A81F7B3300E8D1CA514B6C481904879AF3C99EDD1D94CAF56C61166
-CF8D8663E452270BEC6324A17F6893F1447BB9A3F086E54FC1C2AA2D7F58F66F
-7EDE9BE293ECD25F74AA7B10E3DE10513B13333A4224EDE43414EE9F86978C1F
-0ED1C404CD511F243A1632663BA338317DC7B684A84C1D4E022D567821331064
-D16F76253F14F91DF2A50E2DDBCB6750D6A75DCD3356AEF7CB5A9B699DCDC80F
-0F530B66BBF4A60F102C402DB836D29BA43941AF05680AD51D4F3EC668E6AFFC
-CF0D36B5CDD912A6CAF2082B702EF90E16906596E4BC20CC979080CB78FFF0F5
-C928F5EFA8914DF3E56D33582504840071B2FC38CE433A6DEB63E6CF6E808E87
-9866B05DF8116F0972DD25F2FE5232522057A095E311C247336F669BF10020F9
-45B9B454DAE2423E0E9B432B1A2E3470EBA9CE177EF28091EF444045CAD0EAEA
-23A3B620D0903FE4185340014920AACE478E93919FF0C722B77A448424D0DEEB
-819B8B686125A6D8CC719711E108C6A3F9EC056C4400CE3B5D209696A45F5CBD
-913F3A9AB9A6BFEDACD7C207DC01DE4554EA63400489918123741D1AA8843EAE
-14BDDCE827785FC2324CE7689B0B7C2075A87520B253AC1C61AE34F5AE34866F
-9B68061D1C1D4E4C5763DD68801ABEAD6967F056B8D934CF84081A6A82DC2B91
-2A0F350A5FEED1C1116E3E94A18427CB4A4D1A6935532FC4CECF43E10497C190
-AD3AC6C300A57715E3FB715AFFACC30D4D4EA325AA52DD9BC29FFFCC3646A7E3
-F97A12FFF8E0E355DCD3CC5E68CBC9FBD67DEF5B5157161BBFF5B61C401AB639
-DCACBA6C3F09E9683F872288ABFA4176CB69B8D5E61AAF135B7019CC8F6AE07F
-573B897F7AFC0A5FDE3A922DFA3529B65E62372F2CD8F57B6ACA0FC382C148FF
-A6CB30FE9E9891275705FFC71211EBB0E7307B00E629E2CD9F4BE16C072F3247
-51ED89B8B087D69DAE1D6EBC237AB8D3483A8F9D48C2F6B465430E12756CCEBC
-1C5E3566359B47A0AC0B5D4A5A1B1712457FA33FA5BADF1E302CDFDF655D5ED0
-FA9C6666022302D1DA091F8A19CEF58923AF8996B4A5AEE228D166812A6BC684
-9C89B9E6F07B71454B91F5EAC87333AA9B29B1E83A3FADFCCE5AA5044FAD8167
-F6511E27E444AF65D09B8A7A0312BF78EB35CC34545F9BB06C88A074EBD5BE87
-763B3EB1EC2A4CADBB704F7A2DDA34B013390F0B63B0A618C6CBC2A7156608CC
-332AF4C93466EF7D18E85DE5C5B3D2AE50A44DAD39738274E4B1E8D350FA4ABB
-0189273E99A3D9659AFB5C29C68FF969D3681D28B9322EB08214CFF9289B52F0
-74E74ED0F1DDCF8011A5D3BC4AAF6D8EAA4643C347B912544026D328BA2BFB5C
-ABF3D683F2A0AA01EAE0DC9760DAC0EDDB432415B1221D35391FC5BC5A30AF20
-79469870D85F59B9BA86B928A0BCE261D4A2296BA7AFFBBE7F1AEAE1108CBE81
-C2E5C9D7F0B64E634268C2510EA92E10C1CF3AA7FD146106513F7C1F63823DB7
-F7CECB5A80ECEDCB41D3E91CB4F3FA9C8FBF3F62A0C488933D55DD2DEDAF0947
-0D067211819598DB2CFCA285E3A8F74E7887265847DFE8353C428B253EFCE70A
-766A823759D68B665CFF11BF62071F2F8879D076429DCE282C36ABF335E2DE77
-BB53D459A024B61A5CCE35ED62239410C0E6D2194CE14EC54DEDE8F86BA83FC5
-3EFF391C331C78C5C9C754F81D1FE358D76E84F470BF6DDF6EDD643E62680098
-03840FDDAE498DA27306296B282E76A03EF8D593EF0764AEFD4167C98059FCFF
-CBB638E477D6FE42537F6F7BE5957B0EDC591363D434D1C60F46ED853E8E343B
-68CC70D92BD90958345DE0CF9F345AB7641CBBDF225AED9BF559F6D2CCEB3D7E
-91A0211CB5628CDAD748F37A8E49369425CEAB98C9C4F4F0554F263371D2C9A4
-16466A96356A3EEB31C362478D5D6B849E02F6F1F7095F9A7CDDEBEB00524F2A
-3191A5B347CD1C75511FB605579D6D718723D3C1E26862F78B5803AD3E6958FE
-6777D6E374B40F799F13514A7DAC43DCC6B68B7A5A0F25A57F540FD87AFFBEFF
-3BF2D62098BC62B9F111E663E753347E7B40B2430E89C4056C71FB142DA00204
-6D59F1053CD6A1A030B6EA70302114E4480993E3447C926E208226375ED723D5
-B18698957750DB23498A960066FE6FFDF50B97B7C46960DEA0170CC19568A0E0
-371359569055135B47AC83242238F42B29A460798E246A70185B30A026762C21
-B0F1F1EE8F3F309AE8CD042DADE3E36151B3B7929BA6A14D90D924CBA141D1B9
-8DDE94E46286CB6BC7604D84389890C0AA8B97D329CCA87E5889F695920588B4
-582B88B39CE78B8C35836AE8BC5C66A86DA1267E46BE9F20186DC3BF636FCC29
-141302F57026469542DEC1E8EF2B54814EE534C87A1B4699D58D1CD95EC4B957
-802383A21B8CFBF29FBF643E452898553CD5FF01F7D73E461CBB43186A96C66B
-BE5910A0F78C730FB54611E4EAA909096A77574AF9F481E0CB8D15AC003F336F
-F8FC934023F37DAB1F5E0FD58575440E3FABEC39851905D14FBE4745D11246AC
-2EC21E7E547F4E0620EC4900C327E20248F7F6D60BFD8564FBBEC1D36AA9C27A
-5796EC4DAB33961A2493EEC2035BA4C49FE459BE440562DC1AEAAA6330732146
-CD7E01AD940744DBD87AFEB4671A0A0ED5CF115E3F4AC466A741F086DB742965
-3204FEE04DE803F0A0F53D1EFC1A916EE0EACE7476E1C173EBBE0B560E95242C
-5CD33B424B8BA6C9A26CAD4B4A3B37C6FCF2EECAD1E8227203686172B25B376B
-8B03F6B7C6D6184CFEF80170C1E8B97B77B3E7DAE20A8DD97B04FA0D2B955F92
-8994806F6B43944B520F4DDB8B0B6DEF2A4AA7E427F6524B915FE5145C055915
-D2753FCCBDA11C598DE694011B929475D5A1855934B03118D52ED86419047DAE
-CAB3FC969D072D0036319B517B51679755B7E5647543BE8C60387800139D5F8F
-1002D480015EA8251624DC1442E7FC84B46356200BACD8C99F1A581DD42F5798
-5B5FBF460CF1F10E3125211B0128586D65B73107E32FDDC354541917310B1467
-D92B15C317576BDADFAA7334C14E32C2D811B22E6ECA84BE80532D5FE222576E
-94D6950015F2EACCA793406DC18C427864AB6F4E97EAB9BC634DD0B3179B9EFE
-2C496C1AA898C2E821E23B5B16E7C3081360CCA50D42A459FB603475EFCBE5C8
-8610E9D856933CE6328DD3EED0C2EB4497C9D7622259AB0CCC303901051C4136
-4A235BF3CE520FC4A6D4E99937DCDCFB359D15FB1830A434CC01FB8A840D893F
-79F38DA3641419DCB90165FAF459070A2C4205E1772ADE564DB3E5AE47045EC8
-83FBCC23CC6D41C71E83A01339C2BB9A4E8FFDF67D3DD149C13B8615EEBE0963
-21F59731B52B83DE23808F86523F88464599EFA1E726D3C080D13752E18AE05B
-60CA2052E559B00E9F055C692F1EE98A0C0B734035A21D59FDBAED45C5541A8B
-839F9757C6D3041144879185F75952B2E1A19B01CA1665B50B7FFC911C4D9D1D
-05B0107D9FE3961A5B4A447C1CB3E8E88836D9096B656FA15CB9EE3D19A5833F
-A5899996A26BC047D0F69BB9D243328FDA3E9D9975DA456946070A48E641D10E
-676B14F21A2610055B5D7711620A201B465EDC837E661D4633AF96F60CF1808B
-D32318CA59537415287AA572AA8CE82E522ACA934B9AB564E1648E3378648C26
-01C8EEFE576BA9A308E2C0EAE7A100F57C0DEB11623C6FBD57AE045048D4D1EE
-81622AE08EC95179E21AE1C6D5BC9A0463BADC098E282B18255A0414270E41EC
-B98ABF908114CA425B3E4609F5601151B3AC79055A14E1A2CD87ADE46CDC2047
-C4AB59252E633EBAE216F9EAFFA55811772ED0B7A75CF4AFE8A7E59EDD252CC9
-43FC4E60B3E47606760D06E3C22C599856D0C5FDFF00627484E77DA4D6F51460
-5412849807945C28B25A0B684E33D02EC26401708C1DCA683C85FAAF9F3D74BF
-66C485F3D5F73B785F0A2CE231538BCC1E9DFB145152768C84E32F33CD0BA1BC
-36D0B9383AB4333598627553202A39EF3E696C8BC58B0446D514822245D888CC
-F013C52BEB7067214029B943D7E93FD42BDD589FE1FC0AF049E20F60A8B03B41
-5E7D4CE78FC1229D48F7D751407CB8ED28258B6ACE47F74E0EC4BAFBB4D3327A
-6EE3977D9643A67CCCED9D34A563CCFE8BE6C57CFA39B90E5BF8AF85BFC30B7D
-D6E697AE61FA9633EC1C7806636A916B30073E4C215280F73B6BC10DEDB15202
-827659B00933C6486E67F96D81FB80CABCDB9F159937989AB3E55878D53394C0
-C7D5E16C8EB90551B1F0DA4F06B911CE34423CC2328EE5E43292D03C9A41D13E
-871EF89008148EAC9C5CAF24729019609D114CA82FBAB5EA34311D5710EBD6C0
-37F9D4A31AE64CA73B1499B39512ED67B605EBFBA6682D0DD96E23063CE3830E
-AAA4CE2F1C6BA52DC2523DF4B3EF1F97298F2523123FEDB43F295D84E9F5AA3D
-E6F1D4F813CB884E940A216A0C6658D1E69D28F2CFA4DEDE60059F4E919D2246
-9984DAF8A569DB04FD56E11116BA2296BF63ECD1B65B3391E6D8B8A8A8B95318
-8F9C9B88B7171D73E0921E5C9959186A20D01982D38CFCC5A4F91D31E0FA8503
-E05950007B611CD36D3D714BFD49F6DBF09255535579D0E0E01B540E51FA68EE
-EA6362213A0B8572AB83BC8E533B63C6FDC4FF52507C34739F64C528A815B8BB
-628BCBFFB3CA3C2F501182B46DD1A72580E91BF85FEF40029BA737438729C51A
-BF25EBE3882B8351D0F356A6648ED0F11174EA948F3F140FD7DE1821BED2FDDF
-8FBA1DFF2786C0015EC2A8437DF5F02AF89CA383E622570EFCF2895E3CDF60DD
-A64B152E2F5B1DA795F50C59D80FD35AA7A2CA4B55C3A1E046C3C84882EB8D86
-AAC4750A3A786948FEC26CCF63395208DB2DC2DDB6310B59817ABDE61C856183
-500C350E58D4847F1FE95FE6068508A834B4882D863691F3DE33A9953000D8E9
-A8AC105E3486CC974E06351B1365D157A6948D49C904B075C195277F943C80F3
-786F1CB9D118766439621C23095FA5749C945E94648E70940DEA20F7BC66AF49
-0D6BC622CE00143F979085824A2A1E850D68204BF44161EACE7F8AB0E8097B9D
-C4ACFC76E36776BDBFA4F03424C4E286A6B925B98EDE522B21641C95C0D2910C
-6425C3465AED57BC4ADF0633D0AB3716F5C0EA050C493D84AA1E0903A20F0E3E
-04F2BE6265DA7D2E5D308337E1B50D361D0BAFB054FF5292C58E12ED0A095870
-D39C50CAC7B0B010DB79001816F7C5EE04AA562E11F87CC6006B9396DBBCD9DE
-4D25B032C5419D85D28306FB3543971B4384AAD68824D78C4E30C945B610E315
-013151687496006EB9D8E867B82AD13770535C982DF8F84EECA2E8382D1971FE
-8C4D0F28D8CD60B2EBD10550F51B3DA50C7CDAC3553F8530D596558B238FC24E
-26EFA58FC455D2308625E4ACB5A954732750A03D25A88207AF626534D73D7086
-F21936FEFC92FB0E1942DF5E43A52DBF41595BEE66DF4C66A769D9C3B316E332
-F1B94E86370C14DCB944486E47A0EC71D4169ECCC072BEEFAF645A4CF3B8AC01
-1543972D34F94639C7CE00CB64F522BE3053BBB55E8E7470680BF1F01BDFDFEC
-06C3B76ECF3D8BDF4A150ABA5455ACA30AFB5F63998B277BE7EDF9268C07A751
-9DCC7CAF54B1F615F1D03CF3E58A447C377929CFCE75A6681A7BAE4FCE70281B
-7E4B69B0288633D39EDF2F69BA310ABAF715E9B1533EF655986811EBF695DFAE
-902D7C4F1FCE16EADC43529513B9DADE8F0F4DA4053549A930D311977C6AAE0B
-D5A74E1F269D484A3A209B8F87C9D5A1E4EC5FCB83A2292DA43389FCC2756007
-EE9FC95E4072CCD35BA378DB6CB79CF7B27F017F1C78CDA81D887EAD7A9F3BE6
-53A80FE9B5F6B159E32BB7C927B069B0C94524F061C8D05810481A44A6F12846
-31FDEE232C38AFAAA1C81BC3D6DE2A4563A2656B0978DF8D53936C728C3F78B2
-671E7F22CDB339E25111E66AF44DF414EE12268DBF4409B84130157D861727CC
-259A9E95B9BEA0D98F6620001C3912E22C2267D7EDB65E2C20680728C4043D5C
-0DD01B294BAB0A5AB7936FEA9879682F48B1C39CD600BB8CFEA75F04D937E654
-80225375EF6F2EF5B77857FD79D050A2B20BDDCD94A9B455A09BBC746CF8D5B7
-93D5CEDE3997B1CC75634E2DA7B19788083B68F6B8ADBE69276F0E1BDD33408F
-27497492E0624F96998FCC221F8587D30D45E56E5531A730CB08345B9E792AF6
-4AE3EDD27A5C6D8E0F523AE7C97E8481C775922B48E3C91F09DF62E1D41F26AA
-F5C72265B567BE0B283D6981EF0AD941619574C4584CF84D9693E0CECE14F76A
-594D849968EEE1F0984C7B2A37544FB2EA102B1ECBC8E48113579EAFB12226A6
-CBF0C0152DADAD834A437A3A59D6672E74DEE4806A820477FD177A8967023B27
-1291B58E507B0F68FBBAF99A963E9F90F4A846F627FAB4A2E11507689C4B5EA2
-D0A79B352E8722EBC3A662C84F6A163B64E3CF96C59AB5FE04201C0DBE426AD8
-9C7775FD046E1F2F4FFD1CF5820338C5353506C34D99D474054EF9BC265A260A
-630CDCB706D2BB45C343E8918FCC8F65FFDB3655F565554D1D451B416EA838D6
-59A66763C9515B66E20932B41650E01A27E3A250CDD40ABDE0B7DBF60FD08700
-6885C8A7DE9F14F7E8DD6CD85E4370C2E3BC26AD2AA416A36877507DDDBA6832
-58E0A4BEEE2495BE6DDF7C71066FFEDAB5FAD4ED9B4D6D97B70468AC407A9FAC
-EA45B5F501611EBAE7CE46F9FDEF54AF912E238315325F664BD295E53A05F73C
-5318EAE8D4A34E472776F142C57F34087277308336A511A3A65B4C4CD419C288
-F6E5206D62CF4364C478E9F4C6B64E51D2457CA950B9125D22ADDA4AE08AC275
-8C2399EBECB69E7A5D0E31726E520DC5CF7492C59076B3AA425383A04C653C50
-34E222AE91DCE83E758C1C6DC3005CA2757CA73102F584CD2E799DA49C77FF12
-4911D74BEE8DB74B1F0298CA0A9EA5BA2459056D6D6CAB0A90A68986D492F5B6
-DB37630B7058B6161926BAA0D62C8511000BB7D2FCB92C5922F0519A1C1B3977
-81329801A5702540D4F84385876DA07CBF5D648BEC2030473C5FFDCC29ECEDAE
-C3901C5FA181AC12187415086F68D913CE9993D40411810C505DAA8613C80EC0
-91336623D5686BE49074CF8A39E1EB7BEB212F635ED15C0CD1653E692623437F
-91314D34CA09C3F66C6C1F11BBDF5F720CA4787F2441B7B9AA47C7FF9EB113F5
-E4E57EA7040314E093B6729CD3ED11D18FEA94D60E1D976C786EB52475293FD3
-C0DFB12695BED5E1562D3EDF6C9A54120CC23CD025D0D3DC32A37C5BD00D6263
-5D2808D9B2E2666CF4CF92002B9F1BD2D3E12DFDB18D40DD52CB427662ACA883
-1190B5A2F9860B20D521E55129E7333DAFAC54ED4783F40A8A7A69F04D7C286C
-A52B8F3F608BCED599DBE28AA6F69A0EA54CED3B0A21D199363622352E8898CC
-9B5B0355CBB533E6B179220872212360EB718BA0D9EF404E4FA7439891D2370F
-BAF1CAAA2802FBA445687E743200FA6B9E85266EFA88D05E3B2720979A43E724
-64F79B714FBCF388EF35E9CDBA1B8DFCEAB836395907A0EBF22D285883B1B3D1
-772E00B255032ABDA52DFCC0BA366CFBCD081156072DCFC3CCB903C305FEB7A6
-D16B59AADA73E1A06073D20392DD17D1FF43C4E01FA6D5801BF3C61887658A72
-32E319AF638CA3D03BE51F832F9BB24920B4E47D0E3C96FB079D771CA5C310F2
-B8B4183CB714383A50E3948F6977B16F4A368C086B2A0AA57C66B30A895B159D
-CB63B0FD7990279EAC00F0146D58282A8EA7367BA2885660ECFF69C64F4EEAA2
-F357FBF8A514D1002CEFD82AF39D461E2BE59543321C7A991B9576778C5A7EE6
-34703E9842983E2580DF60DF6EBC642EDEA4A1F1CC34E754327A02DF2E9415DA
-08CE3AA32E1A615A484E69E6BBE4A64C2784E27626E017DC0DE42DD71EAF55C3
-E3D15BF87E9727FFEF3A66512C9458E557517BCCA1A2E92191259D1EF91D6E12
-6454380986B17C55A4E631C6DD20E5F87208D2045BACFB6AAF14129108A5B35F
-41B29AA518D795C955EB247BAD1D1F03FEC701BA6CF3261EA985A932834834D7
-DC8C65409644E7315D66109D8F92DF5F42070B97A2DE3B69EA97CFFC71511DC4
-24A903C704479F445BE051E96AEE9E220EDFD0934CE793AC43843D88EA12757D
-52C10F73BD34C812C1B306CAE0F18D7D1B095B9F5EE76256605E312AAF795609
-94D3FA76A6984C63809F0EB8741AB3AFF516C3D6F8FCD8B1A43F5912A2D98019
-EEC4DD105E77EE0EFF0D69A6A55370771E21851B58AD57332DE44B5B2B2AC29E
-B58FA30709128A9862C3579CFD08D85E8188D26EDBA5901D510B258531395FA1
-7CD5E059CAD028AF5AF313AAC4B8BF60966CA2B53DB31F0659898D105FCF4FD5
-DD2B78C838EFC626CB81B32359CB11C5A3E9F8ADB8B1201240E34009BBD2E23F
-C624C1AC532746372CD00EC50C92B576AB3D5F086B64119510DB8294D48DDCE4
-49FFFC05594275C796DCBA291312159CA9EE7BDCF3613EB3D962B6967BFE2BB2
-5A9A441DB81FC861B10F910BCF5E80B77F506EC8A64E6ED10839333BFD7E25B0
-CF6FA7AAEC17251811C44031C7871669C3343CCB0D0921BA8A9546E2C052CAD4
-BF765EA279DC4446F1D31ABCB9E6358A11DC2C1AB1CC71C244E57B4852A9CC36
-8309D3B5C0FD91CC6086DF741237ED81F847897FE5CB939AF97C1B9022CCA3CB
-227B7C49BDB2FF6AE381E282B42D22BE5C6326A8602BF364BF81FB7367BCC437
-DC971EDB49E8C1AABB29DB90839A1A70CD20DC53DB0CA61133BA0571D00FB797
-13629C59658360CC0472882E8E6F085057ACA3FADEE34BE0832241EF68242F90
-AB650BD7FA6E8EF0DB539346515580E57D3B08BF7F9846911C6779A481D1B348
-D1D0A1265498F0ABCD04D50581ECCDB89117E4889C4BA30DE7155F6177E3F40E
-1E9DE1367427C3A1F17C27AADEA655D59CA7B6C2FF4B833442BE50A87B2D4D1D
-DB57A8B5C3201433E00728A9D9511A46C3442C3E29F6D9554402A516796E60D6
-23E6D61F0ACE1B60D45CABED468523416532810C10DF9E7C711F5356970D5FEA
-FE5D366722FA3F10E097FD16DAA5B68614E7D29636019C4ADC916AA6F45E592B
-C429AB5A668E1795DA4F755D74126B6E230587AA57E3F9630715DD6F224CC236
-A5F67B3668261FB2D2550F16A9700B1D997D2801EBBD0F113C47B8A13960775C
-6FB40EDF6D6276916BE3198448E020A46BF782B4F02F3B1C85FCBFB2B2F09578
-F90BE57A53B596E9499F9B3E23DE0BB1E159BCD9828A47B3B1256D305D879517
-E172C1E3725C4771B3C03C9AF0B62EA0C5AF7C0D692F94FD1E554E3E52A0E7F6
-835B95866B7F72514098BA1CCE2C3613FCA568C3594534167648E2AE52BE3F9F
-E8207FFDABC084BC74DE49FA0E8C61739C28C78CC994AB707C2C04860F0C3F03
-5929D056CC4CB6FB4BC1DE83D2FDF9B2128667B6A2FCD13626D3889D83683715
-131AADCE22BDFCEC3C9B03E50200BCB5321B42D108DEB519A5C9992B2D3A87AB
-4725F5DBD2094F8D9ED8835777C2793FAE8FE40F3EC0DBF4F1362A148F890CA6
-FDE1970FF1CDAB096D9355B755AA0D93E6E11E9D3B1F5EAF537E48C401A75C85
-58AB20685E5C29DAAA6A9F90B066E991968475ADEC1F946C522449C0CA2A38D6
-A8789A6871F96165AA3EFB39089D22EE69BD05B4E0853D3C33CC84FA7ADDD576
-639456DDAB65EA50A3C711F78E8CACD7E112035D5D1633819EC419BF5AF0CE9D
-40EB6603A55A7A2BDE2D6E9FE476B1ABBEA673B397F2510066D0D5AA650E3D1D
-BCC93BF8585AA04228DEC13A6082A5DB015A70FCD1D3EF72A1CDC6D8A9705E02
-662BF3F0F8B318108CA4C9621C01D02EECE3817F9EEE14D30C34EC262CB9197A
-377828142C04BA679630C281AE4A02E65604DC7FF73859163F0F0640316D079B
-D42F807A41D0D128E010C3961B8A742908ED989BAA0CE2BC9E9C26DD73DCE3E4
-7E31D958F4DE4E3A1B161B2C5DDDE9D1C693745D146C83F807E5BA7E00057959
-F00E3FB89781B4F084F5B24A42113E4B74933CC32A11877B4499A19272B60985
-9C936AED3AF65C3156C8A705AB51749F99263FB2D2DC4F21F8AAC6C9168F8D28
-414A602824BA3EBC3FBCA1A8D29825680FAAAACB6D9B357B437774E6C6A1BE61
-7D146A9BB073E1903B9BE2CC9CB5DF888C51B73C8C5674B172E4BD5286F80E8C
-9718FFF592B56E1BCAF33BAA26F5FD402710D27A0CCB1BCEA92D9BCA09983B1F
-56701305AD3830A74CFF0091BEEA6C706C3433977E6F3BEE52E77BD7B09C1D68
-37C3A5ECCF06F8CE25F105CF88FF3239DB905472E10CFBFC4A0FBC8F587B1017
-26A6080B364D6C3D7D8988AB1B4CABF6EA6C5531F8A82F99E5B111C81F9C9412
-0C54828BBC82865316FF0D9E8920BF00E1BAA976FEF21D0A10E8FD9837799623
-E4CD5E216ADBD1D76518815FB49EE4AE73AEF9447255A99CCE4EC068959C8D9F
-6FE965ABFC53DD09C063BFC80BC1E6463DAFBFD673262840CD9BB67AB5CBFF2A
-383079643499FD42FDE13BE2FFE2615152FD8457A547FCBE2C1CE0691023CE42
-3409A9B2B8FA9C4280856899D1590B36596B93282128E6AA6552B8BA7072E603
-FE13711746B110FCDE142E497CB2B623682A60F888B1514F7CCBBD86150B9DAF
-24C9B763172C14BB79AC1F8AE60F9847D9223DB0ED5F3B74362F4AAE3D466311
-79D35B1C81A2C48205028BFDE7BADFE708F104A2C41CD32BF8348E206E251EBE
-FA68EEC9738CF3D3462CBE7DBE7F725054F08D6B9F1235C525F8E84287381A20
-10D4AC542CB292EF20A215A3BAD7CB43686DD5675663BF23D89E860D392B6FB4
-6D9021EFA0FAB6E04999DBC8CD3E84D1C751B8D24B4DE92C8A80E23488882F09
-D62FD350C636F73DFF5894861281974195F6BCE45EF55DEFFB318001CA8EF32F
-864DD1459613772E6B23AB6B68769846BEABADF07BCF11D78E26CD09E76AA9AA
-F5F88F95AD6EA652C8E08D1A7BDB31E60B90F31308E223B6B8262A39DE23BA43
-EDCEC76D6C8D82622F980DF095EAFCC83B79C206A314D4D83624B2617BAACB58
-304274ACC6BDF5D2F0529FCB76E9B5BC43EEDFEB149D61CE36DD4672F80A8659
-331AC6DDC433FAFD85BD5A0E404B878B2A34BDF8EDCC7E9E9147219C37C4CF50
-1D48B7F84E95074412BCBE0C060BB8FF5AFA81D3D8F0509EB8D1B2950F5CEADE
-51BF7B714B9784C9A6A91AC635C09CAC5BA326D1F5C52A636F2C6B61BF079DE1
-47815674304950E4D724D68B4CAD2B8E641DF1C7B6F7587D258EFE9CA777E2C5
-CF2DE3D47D6EC50B3094CB30EDDD1B31A58E8915A4D92E89D0550D1630E7D47A
-5930E1A7F582DB33E1EAF7B15E665BB214F62D336F4D90C6B8F467460BFD411C
-0296ECF5019A05553316BA7286B4B9B4D892AF6906FCE7241AA12A18C50B6168
-F299DB45B7DFD3AE5DE34753A0E497B0D94B0178E66D38B494F850BD820D668E
-9F3ABC7142C364D5E26345C6BF93B08B0CE0AAF87838DB65834DC4117B3CBD59
-5D315844A0CC89757EEC0204E2CE0F2A2248B860FF1DB439294E9E107E2560A0
-B804AC0CD639E314BDFC7A689BFD77A81075EB673A7C818FD97009D0BFD4B121
-46FC748FADD2A1CADA10A04566049FB6E00FB8B5C928989FFF0AC4A102D00693
-0FBC36B9EC7098BFCBE62E49F317267F5C8FB541B73DFC277DF4E8A049D09835
-ED628F1736AC2E6F4BFE40AB17554271671A348C4CFE13F58D0A5B2A7C3D83C9
-EF2ADDD7A6B674AC1B96BA31A10BE2276F45BF27344636A19E09D78E56798DE6
-774D7FE7BDD3C18770CA1DEDC5C035E4623BF5317F724BD8EC0324BC1881C437
-4EA69508C35BFD66D768A0AD744D8978DFB3DD210D5629A19D6A70DC8504C49F
-CDD35E164B973CFCF36DB986C6C618AAE4C58D32E21188F8C5760DDBFF24C3B4
-F0814E471A0B76950A8BFBE86DBEADD5A2662B56A078DE456FCF8FCD25164140
-694844E5ABF924CE7CEDDBCF7F4492AFBDE34610AA5B54E6E5A44AF50F0E5464
-877D6855416CB8980E1B114B6F6597347C432F2D29E4714A6BD4F3FAE8FEBAB5
-551802BF47867563FEA5290BCE8022DF9D293FA792238B7F00F84E0F99163B06
-744A2EE93224CE855C72E1FDD0E52767A30CF3F0D451081EA69D0A80893FA79A
-1D25E6F56DFED691E90393FEB1A97061FC3F2BCD4BEEF1C6F56A0514EDE39BA6
-BA4583B7FCEA404149425F6969123B3119AE25DDFCCA3F2F672B98BFC0C56907
-DA2923A73A30B8FA2377F36620CA0392651CEF036AE31F1E5FA9B2DC87F2E8F3
-B1964898A76BB97DCC8C63101EEED39ADFFAB3BE571AE0210309DCD4E4346868
-DBC33FEE28431EE6FD3D64D570E04C269F6D905DD391D40FF03CBEF98214DBD2
-2BB4638F41793E842B07A9CADCBAC476A6FB9EB23795150785AE1032FB16ECE7
-3DFE9AC0AC961CAF16B492C79B669A9F0FBC7F365BFA02C3981A324E047DF5E1
-41D2E85D6F472A6BA1D1CFC896E3DAD437689296B2DF397E40A6102493D09D29
-06E359254F761F3E1E3E66938270BD46C6DD1EDBDC60CBB35C47D6760B17B782
-76F6F472D584A07146C19846AF187267E7E1635FD04F311B7E70C7A33018C6A1
-943388278E04542E454FF117491AE7B56F3FD5B01A31A89F85ED680173087E8F
-CE5365E1CE48CD62DB5AA71F4C2369A09BE3B0C134E550E72AA7C299FD3B26D3
-8D3D744758A87ED77EC946914B8EC92136FE4884E30B545A2CDB474FAD36B557
-509C986F87D992FA39BA7E8D85D5EF322ED08B1EA8D90B9E391D47D3FB2A3B9B
-CAF230B61E0F987282BAF6B10CD07A23E3468BBF814EA995AD6224FD4C919D96
-A228947D0F2BCBF4B189F1BB9D2E1D1EF59F20CD6A045251905C39431C548318
-9023A4297D0D21E380F93C9FFADDCE951D0ECC25D8A4967447438DA572CEA724
-6B7743FB7D68783CEF142E50212C166D2983DB08B1EDCC59E426B4D73716B920
-A14805FF0FB04DB3F7AB70A1068CFD39DFE12443ED4E8BB832DF520B0A750139
-57D9A8F4CC6AB8935A3C01858A8ECBD75F740652DFDD752F4FFCCD4278ADBF75
-C27537AE1D759AD75B7BAEB3401925949E4EFEB1C20D441996D671C51D327FD7
-FE05253BAB53DA22FD071BDDF4DC3A9D7BEAABF49958249B5AF68B88D96FC333
-FE7D8781FE9EE147E162B0F0B487272D44522D8FA39842C472F9D527149CACE8
-AB0AB0E6E2D88C03E62AD7F6BAEB6E67C8EBBC94F330EC8DF632A5AD89FA1E9B
-D953CE17AC117024A9E4671E5FC05FA194D38BCA2737E73D079881BBA8BB78D6
-0F72C39FF3F87C4161458CD8F6E07FF06312B5FF9F157014B545F6F1F58488F0
-E64494C390A6CEAAA53576A32D53CB5B51563344002931AB82AEDD0BDAA963AD
-902B6AF937798843B5DF895CD487402ACD82BCC95D10FFF93F71FC4C93B737B5
-FBDD6DA8BA8AC357620F0395252BF8D626AE942B759F18D26C4667C67BC43ACA
-FB4240AD7DCAB1A702E3AD59138A1B958D23DEEDC8F24D46CC0FC6B58037F447
-45A537C7B8CFA4D8494E737358151FF023B729C6BD069F980F33D5DAC4E278F0
-FFD91D253C9AB617CB9546F992615C1647123D25E8DC34B257FAC60B9B04B7AD
-AE705AB62C31BB5A17E8CDB319B7A6601E8D3A5D144479AD66ACDF016B351226
-80ED7942FB3E3CE3EA9C19ECD870DB4B1E616B0B8C5DF42551FAF463FEF88527
-0367D3C5C0B8D9CC318324D3722F36E62EA52C1C7340A4756C8F79CF1EAE7A54
-66FB610907CCFA40C9DF6C64D2AF33427AC1E44A843D417C2CE47E768132454C
-42BE3CCB830D5BA1D535E0E0A58D1AE992C552D3C0C1A468C79438247FE04119
-7D8217AA8E7BD66DB305893269F99E48A3248DD33444CD317B6B13BC7329F9D8
-50AFC5BBCD7F7E8A625C70ADFF0FCCC913945B53DF83468D72931877B664595D
-1189CF5E16CC19A1C4B0C8A1B9861593F722E654DA0D166DC93C7DDFC391F223
-A9AF93757B01526FC9737C7DFE7258614F23E9C3FB8DAFBD8BDAEBB411E6B106
-280A4CFD7371C884D1CE8710704751B639ED78043DFD06B0CE0EE061E7CEAFDC
-C442688CA7341531833129B28B6A3F012A60EB39FF5CAEF433C13C60A6F1DE5C
-C2E8384E7708B86EAB25E29B10E46350E3A0A01F09F3A1B09E79627A2B66F6C2
-7E5F1C526FCF92AEF1399BC65C6D6C9E53EE1676A7BC66F41F6C97A8507615FF
-4DCF870DE5CF27265693C26AEDE7684882F920B5A37C98F5B3963013AC586135
-B5A5FC99B222CF400D777EAED21F3B0B5EB3EA34FA5333EB5478D17AC7AEEFDA
-368AB0CADBDA738B602D1186D3CAC6D79ADA72D2E1F2EC7107D607B663A9EABB
-ECD6DB66E5EF29F60C54928B28A0BE531AEC484EB6B43237652F9756C8C14B64
-FC229E9CF2CE82018A7F05694FE9234D5886366E342384ADEDB53AFE5CE37222
-F00C4B60A4837F6D2B04798360D2E84ED5EA7A8EAD38DDC0C1A30595FEA4F2A8
-E1EAA5B4AD4C4931B17A971F32A07B9D48DB35C083345DE2F74DC9ACFA988B3B
-C909264AD0E95EF95E475AAF7D3681B4298F24854CF9E93915530BBBFBBF715A
-0D6E9C83FD5E0189D714E5BC01BEA29FBACF253A0A2C07D5774AA8ED1E837452
-1DCEFCCB4D39FF3B748F1EA2A3A02E3E9562814340CB4D01643745A795FF68B8
-7A49AEAB3F795D2887E1339AB5E58E97CBA70D62BC844EBAE6CB0D9ACCC55D0F
-22CAF8510023FC9ED3307A31747B1616A87026AF5E8B7A3882041AA8F98C7FA7
-BD28891EFAB5748F93C9983ECB6EE46C525699FAEEFB24BE1226BE84BFF7C967
-0C2826527B4152ACFBC75CA8AA608C83E650D1915292D51555311AC9AE837E36
-1731A90FC77FDF52CBC5E3941188080B792B57F98317B1FF61E92E6B023F531D
-7BE4F036DC3DF11711ED1FD118CEDACA9A550CB846E10C93BA7037676CAA105B
-33F600DE469E5CD1768470D8A136B0FF623931A8E0861D3A35EE733B529FBFDD
-924A21B496489112F6D210E0E4C98EF989FB07DB5B5FBC228A164358B3F2411E
-3C2F24585AF5EFDA32325B466010F0273C2FD0907F87B16BE8039196B28751EB
-F6DD29A4F455CA05496521A74E3138987C1C2615E049E3E5AB14B54D6E2359EF
-DDC13608EC4B7F0713796C312C08775747D2275EB26FABFA3371F05DD11BFD74
-3512C5FB8E8000D09E05F6871B0860FA88E24A7C5CB61CEA9E3A112C53D117CD
-6B89CFE96BD9EF0A6B9A24261A8BED518CAF65F0797D6CA6018BD6D5598ED7E2
-148431FA40639E8725FEB6E10B48DD8B035D57CC0E554877363DA6205FCCFB5C
-718323B7CA09015029F7C3253FEE03D11022673319FE9FBF54A2F5261C4DC16D
-9ABE661AD52A63710EF6C546A3EE8E0493B7B5808169F2D86CCDD826CD7769C2
-65C9253EBDA76C1DC6A431750B69BD3626CEAD87323BDB20189D09E1740A63D6
-C9F027088E51A5EAA2DFD8733AF1870214AF25EAC63C9F90A55E379BEFC17EEE
-61F31ABF17512798EBC9B4F1C96A58B15238D3B5BE2BA97B48D27160110C60DA
-40FE2FFD4DDFDD4161A89158BEF42CF9E726D5797C91F9FC76CC90D24AF59CBE
-60A97A6494F32B95ACAB0D59F24703A2D1350530678B40D66238B4BC48110DD3
-A880FD437C78AAA94997ED8A49083B9CD843937F4FCA9739F940778EED9413A5
-80BE8A47258282C2337E630F6473CF9022011F683B87A8EA0B02A343AF7C896F
-F4B8CDDCD917248E37C0764BB1E1DD0FD406A0D80D9960C6C32A81E209E6478C
-ACADC1404FB84BADA418A5F950EFF6FB47B6FE500752E1E5923598A97B96E48E
-9417BCBEE2F698FDDB9F5CA45568234525CADE3F3EBCA7D1D36DADCE085F2E12
-B6C6B26E3D70892486676191C73A7035A6E4F8124548332A0354457E2B931A67
-7E15A1DB1C802DF3D27208B0B1C8553ECFCD9B0CE1C2F950E26708CC128CC965
-4420238882E48BE71CC52707EDC8DBFAE2563E66503E74F3B71C0BAF3872592C
-AC12D490F998E2198C8859342B3E769281EDA05289F8A3A4C4399E6F427ECD18
-A8C6281497751515282506477A9E0553B6ED1AA8C89F2EC6D244267BD358C8A7
-27725E0D288A0344D21ADBA5E498898A284B3A5F2494E4AD056DBE7461FAC6EE
-0332E721A7F7E2058C864E02EA3DB74E476A1094F00BD5CE8D85E0B11E150C9F
-95D584C11CF6B285E4EF068C533FD49017A51291CE497F6E336577EEA1C39E67
-A19C2AE6E8EAE3A8658E8174D98289DB1AC6DBA0EF27F2598F35E47D6B94C8DB
-059AA1D803A9EF242F88A7993872A141F97D76B3572CBB811F34E066412C948E
-7B7B22AF31C9030E333A104DCD5F29E649901D9168E330C8BD4DF7E50141408D
-267AE9599099CEBBEB392A28F74CB75802B4AC5DC979A0FCA75EC11F25DAB3FC
-67DF1AF2291A93D469B3278A2DA9397B018024125A974FD7D79D149475726085
-02F30E996960097F6CB908C90E5EF127E5D2543871139A7CB94CBB2A5FCDAC6D
-755A60F53344570C9846812E6766F1E2C952AFBD260D252129CB7C19821AD057
-2DC1737D49FB047C564C4809EE21B6899F02916D50CF72DC0174BB5A75A3DDA5
-74F578245AE90CEB882AB4EEBD1A4533D922197C400A2F651C1A6C5F4FFC17AC
-7AD689F45B1722BECE5F648584C778C96FB1C606DE7E7C6799964BACDFF5B239
-A7D25397BDBCA2DC06B27246728A6A6DF1F5EF6D8677E6DC2459472211A35500
-C8315B238FA5796C2DD19716204C9D6FDC7AF0419A8C3A927250192E85FE3D95
-924C818C60F4234946EB58C7CABDCC0ACF82601468F963C968209AAD57296D8E
-92797D765E68C6B64DB292C1AC7A779FE7B671D505343A2D32D0898A1D90E000
-EFAAAAC89A3BBC3A92B7224E831F2132824875BDB04C318B018B49009FB4D0F8
-A41C484ADE005751538675AF75314008C6F45FBB3B6B73E80D223935B9D7107B
-3D2B8F2D967D7DFCD9F2F9EC3338844F5D1F36E2507B2AF6F33A495CD6701B1B
-76630A10878911FBDA1E8590BB83D5A59A5017A0566974818686187205D6C1E9
-4B8BC41BD5CAAD046F99F989F3FFC38FB507ABE17C03B466E423BE3D38B5B659
-4115B2527B2D3FBDCA1A2944F5C107DFAFA5B3FB0BC6536806F5D9BE46166CF0
-F84D3EA7F0E5A904295F84E63A3A08BC02B75C33507C5F09412242B348EBEDC4
-7DC51DB5D49526AE4344C51EB3CA8CDE0F11F9059E85CA54122ECB587BDC5A3B
-7EB1B5E4886F976037B0D1131D9CCFE5656DD9F88D7E5B099D4862F78B30A7C2
-02B3ACA955C31742B0C732D84629D705F3C40ED57FA05C368EF688D075E57718
-6DEE8CFA86CDA31277ACDCC66A23D0656B20BE6445021E16DC406BB68D548F3E
-1D2CCDC247B2A9171FA02878C108EC0FA6AAC271A82B8444E714360681676A9E
-2E30C41E9A40FFC67C7C9C7FBD10AFA5DA7C228A1697A090F6781F2E75C528DC
-56BE079C98DBA4D248DDF9AA7B6C52BABC2B66218AC0DE509F08A4FCA26C646C
-9972C2CEF664ECFD1D924B5D5D7566A6B859499F6758CE7B762CF986C0736D80
-0B4A4298E5EE920AC718C5B64D5433FF3F9F631E8715ED604D708556781B1539
-882DD8627E2FDEC4B216C62D4CABBB2F115CAC56A5D93EF98E30D058EE634DD9
-95D5D1AB4C42680B3635639EDF9A52E29B37FD0BB0478E6ACCB4C7DBB5F9C428
-755744092BD250A8DDE731265A110615C300DED7F143D52417377E90B91FF8A5
-BAF6324B3EFE85B2AE0423DE309A36A64E4369353E6C2603E802ED31B56E318A
-8F6D19FFCAF6627099C0E3C190CCEC20C4A7DD4B47816D529138E2694EDF54F1
-867F0143A444024E0528325ECC148D779F4C98C06FE9E752C366416044EE3FAC
-72D8AD35D89400B4F00286191C16E16979D5EDCBF4FF9EC868D6E3BA7D98A83A
-0710CD1AAD878778C0A4F0C9829723572B4DF407490D64B5C49FBC047DB49F33
-E824A4343825D756D894B41EB70093103C35FBC09FF55931B81340666A0B50A2
-7633105B04DFB6386ED196F7D540ECAA058C0B44E89141B68CC41FC21BB2C4B4
-4B13E070FF953B88A70B3880561FDBBF309C68F5C159D90CAB88B04CFEA0F33D
-A48D289473545DB928964A1FF97B90FB16C449A27E333B56A1E49386AC738A91
-105C3F6DF518A43C97FDC345F5553842D8BB735C33271A8FC7E3BCB3C662A375
-53B8450229EDEC6156E41584971A159960569DE8AA7A959D328CC8C8ECBC0B11
-DA239FB55CBE641B71150154F8A9A8A128F8B58409791B88AC57AECDCCEC9893
-7B3363B091289345EF59DD66D83982931E090B8F2A8CFE8F46F3978A67E28047
-48A7C711553E9846164FFBBCBCF505F953132F546583ADBB7F0A9EF02A6C3163
-0057C83CE31709A61F2B9B09CDFE58F02211CA00C0672CE30572CA53BF75538A
-57C1DFC3E44012F882BD50D4A3ADFF64D8E09ACDC5FB80CABCC56102C59C5B3A
-8E7D70F350CEBD556CF6055160C1DBCA6411579F959C873E4149A3FDE8836252
-FEEE3A2F3E8BAABDE53FBD71B074FF5F26AEF5A6663E2117BE561B21DDB5BEF3
-73C1365F9CD57FD44C29C00395B7CB0F5A4BD22AFD390421EB238707C3D18BA6
-C7A1B0B95ED985D208850AD1BB88103E7A7837F707F0B824BD1BA350896BC3A9
-88CE5607050B136104344B3C9E999D4299546B7A107E5254AEA34E3DB09AA599
-CBD028178511FF44D04C530ED6AD10EC5C41178CFDC71DFD30B1F856DC2A4FB0
-CABC0906E7682033B43765B5F59F7604BBB01A7D660C3E5BFA8651CFF42936B6
-22059C2BD479060AB78AE53CA8B618F1DD65DB73F507951738DDB94B1B2898B5
-9724D93F9872A79725B86FD72BD7CC1D53061F8B55D3ED5701D99CB24F3F7469
-5D456C51BE9D32D8F101E50CE4BEBF5A8E97EA0580046639EBAB22BA25A69EF5
-D80A9854ADF2C2F754C35F380F72528D1142EE6CE628942F3F98C26EBF5A75BE
-C8F6DDCE438A2BCB35A51DECB444570E36FB2C4AE1AF422C91AC39A18DB9AFAF
-BA33B7C945743E2EECDBB82C10510C7D8EE5CBB80AB3036F259FF0053E1CD954
-650C4359157167A10C67372C068DB33982CB1101757966FCEC872B24CCD65E0B
-E1CA44F1CDB5B42616DEA1E07FE6038A0FBF4B1C314FCCCF8E2C8B96389BB33F
-978440D27041708AFD22E3E2E3D944D152F9A5F2E50A08BBEBADC84A7E0039BB
-4651884B79D1AE90EF67AAC2A94BC1EBBF38F7E4B3FFC5A421EE7EEAD34CF658
-C89D114027B859850874A5FA5620D70BE94D480EF1D2069F64C9E70C669496F5
-918606F17D2B02178746BBD22FB088A7354A811836B7AC7CF69964B01F7B6C38
-D97DDCFF7F2A5BAA1D509D5EFDFB82E5EEC29F2F12879510790882D7A6554A0D
-35394CD4CAB3E352139B4DCB9EB2AD2CD31E9717FE5EC1A5D0CCD89D2A6D9A55
-B0DE096EAD34A9170CDD32D058DB6DA9DDC7A20FEAC9A351B2144C9CE7CCA732
-7F13742A7F0D9A1736A857D465EF44F316F8B165E30106CC22C5255EFAF1C02E
-0AE0B448B88CD712E94BE503D0424B6D2E42CE266D35B246D9C92DB1032E372C
-FEF9CEE8853617CCE04505671F6A2F421B8D86C775BA10ED922C06950EC3F162
-888C5E240F3A4E2B8A1F5584EB8A5C86EB099396D209DDDDF6239D612330484A
-7D1578FD98F395EF6FACD488B64C4BC127C129260C4577A5FEFE60FC476AD32A
-FD26A711ADE1F32F869172C4B770C0CC0456730C5090A39B81CDDF7F43189A41
-A830E3D0875FD39EDE7BE3A37C5DE8BD0D53B2AEC076E977835BCD177D55B487
-ED28D26B3CEB6D86BE909C92C4EE1D7BC27BB10439A27F35C405B76B79C0CF98
-21A58E3E4015E50CE027AB45E1B1892AD44477D37E09AA6CC12065749339D505
-D96A72AFBA6A6E1390A6F01849D607E6DF07B928A490A424017C9E7199573F6A
-8CD3D62355CF57FE164D79903F81679B4998AC7A65DBED69184906D6A6AD7618
-A93DC4288D72AD42116CF3A527E6F6958AE02E2AB2820C4C8235DA5F8C161D62
-7796C9FF711917AC9023CFD7BC831AA847281DA84FC40DFB8532AA9A6E24118A
-F6F0E95313894F71754ACF52FF8AB3C9E48C811D5D19A0B686B8E1DDB9E3DE55
-7669F0BC5BD721081891536D9FB45D5FC6058F768007EF51315A619EB93AF0D7
-74DA6F7C1F0C419A0B623A2DF8AC5F81AA66CB8EE50B69CF20B7CE88282AC1B9
-6A758573DA78757BE583FC05245BC6457EA6D1073FBD3F3F506139D493E56B05
-EE5897161C99CAB23AF97135F18C72D6B0F9802A339E3576271AFC00F077075A
-3724F96F7D1904838BD92DD6787D86763B553822D81E63ACB53EFAD31981B71B
-BECEDF7DE2AA12ADBE30A544CFF6883A0869631F70F36D931E1077F8788627D8
-AD4868D51502C35C0C3697C811AF509C526689FB4F8139772964F414C0F5B120
-37C04E77902A09414406E447EF46510D80B5BDD17B712A5137869B813F673C63
-988A772C0B49D04118B5D5E5F8D07FEC3E8000FA1FCF06AAB49BB73791E019AC
-148BAC5E4269A39347ED188848E503E0C04E548D4C5E0D1FD132A3EB91A9C92B
-9218A29580F6A99352F46C747C29F87EEFFC7912B6A60426BEFEAE7EAED1AF22
-C757AE1D228A336D999E620934AE9D1C124E4190BFD280B24A40E8519854D386
-8A6140A79F2C1621D94FA49B4B869DE236E51FCCBA2600BC7BA951EC067E6759
-C4C616BA9F1AA22C72DB3759A24F77B63DAFF16785F0AD51B92DE05BA3634D4B
-941AD4E19379CD165BC655EB7519B58608935196F2DA9F17CC2BC1238781D29B
-EAF0FFF3CF529CF48890C17CB1D97CE95AA2BF2827B43B39C8C61FD91E7BFCC3
-85A92AC0528C12123EDBD7E9B1FE798EE0CC8967CE01D19276E8BE4014A06868
-6CE0F5FCDE2256B8D2FD077945BFB2BC23342E4EC323FA864567F8867AAB0196
-3946CFA77BD98C46666D80D4C67808DBD53B407E80CEF7DE3E9120E2AF3B27CC
-4F3201027C39A296C1406FB76BCF9E46537DF1D3409812DDA774C146E135BCBD
-62E1EBEF09C3472DC0DBB9CE13B31D15516B50280B3C09E9F6EDE5B05B8D0B4E
-C7AB274068D129951FFE53FA5F0E85B5F1DC12382F11B5225FEB793A1EEEA45C
-458B1EE64C7E2A787674140AAED80C0521469C3469EEC92430A9E3ADBA3A094B
-73A71FEF38E2098E4B882D171524BE3B4BAE4A568846BA996347E728580F6AC6
-EB4CB545123E55D0EE933CF9CB63EB60EDBFBD3E972B544477AB4D68826331F0
-4F8AEFC29ABA9E1D6EFE807CE2D7E8BF254F153B3C9BCB6507E89B97158EAD5F
-4224068DA7A1686B8DFBAEE60EB405CE71F71B4872D396FCDF472EA4CF3E6E61
-7F35278F1E7B3ABB2714E1723F5472821674C130E7301D598A6D1CB33FD3A94D
-35F73E34AE11BFD6070CDA2EA1C994C0AE4304785A70A38622C09D47EA08238F
-7E497A635032592C8E28814D114AC8D1B9FA512FE66C692F75E42B67E51E18FB
-3F642D14C8DC0DF74FD81A594376BB9B7DBA9B4930AE048E4344476943D31F24
-35FE5CEF1A0BFD45EA5C43BD6700A38796626A1EBB23A3BA4B7C64E1B145FF89
-E1E3CD5F27844E66E9868F13526D31B87FC9DF2676E7ABBF3176CB2CC698BBC6
-23D39533FAEF149531AFB05826F48BD2CF8CEFF48FDA67C72EE1F32E41745A79
-C96B8264CE368E6FD3DAD0CBB224F8A9525C6FD720DEE0FD278EF36886ED076F
-EB24D1D8B69C456A9543F4543160B6BC57D0F396BCB5F416EAD863C35BB5DA81
-B218D99B5CE34FA719E6C67CEA1B25DDCE2B019208C1DA5D9C105F47A382797C
-A73AAA78B4F33F509E60BA34B4D5D55756639BDF4761C9F221B09866291760F0
-4ED5CC9406061F7FAFB0B6F93796F64BDC05277FDD466DB850B5ADF5C6E293E3
-A6AF3C0CE77608F2027BDEAE4076B776AFD67A7BB7123A1F2F1F95609779BFE2
-9C1E085B68A4C444EAD8ED8E3E7F08CD5F90D12C96005EB144157FD1A85F7176
-3090740FDF72AE20B73733DB0A0A9ABAD612F6133F77DB8FC48DA198D73C1CD8
-797C02A00B9A6343D43D1C0B392047C71EC1D62B5308B76936F64EAEC52FB0AB
-A53516E6BF2189E657E6DEDF0C680A81282F877B0DB2EE045919FAD21BD4153F
-1E3B07E23F7C13B55B47B85E99E93C6C64D7132245FD325E9FD9C6760C01C8DD
-61930D6F4BD6C59F880CF11C3F1588E72E98F80140F43DE93ECA43931919237A
-2450397829719ED4E34241D30FB4F5C8A85B1A85FAE2305C47550BBB555EE76B
-DCEBA951B61B0D3A7240B105695337170A9A56468EFEAF599FEA0CCF01A2DB84
-25319E635B3EEEB2B1A6ECFE58E2E387FA5996D311B87ADD09AD373BE347B291
-140162A7BAA5CD747ECD0DD86807449609C1B86BC5CE2A087AFBA83091CE4B0C
-49E6C7AE1306511A1BD1D4FFE475FD7501461D782745128DEE7C1BE525A3B04E
-5208CFC6600196DE9ED2E7A7E20E20E29CAF5019130609E1D3AFF1DB46E12579
-1BCCDCDA2A43E93CF68534225DD7CBEF77AE71AA22565258FA39AB4D9448D462
-326182601922932B23CE0E2567E30BD47772A11D59E2CB15B0BD340C0657B465
-733E5D4BE23D731F0AF280EB827526F9050776DD06C6CFC96318E91F821952E5
-0CE9F613F0C595C55F7351D7D4114D9611AEAE733A45A7F6645166307E210930
-0F1E4F7A64B77EA34F19A5F52445EEC38EE28EA988EF3478F03929AEB7ACFA8B
-12AF9CD3778F13FD2ED625B825053F2E8532562AD65B4BF0C2631586E30FC27D
-D2B5830E9EB43090370C658E1FC9606BEF5FD9CACF8FF8C051EF770B95C419EB
-1E21C8D10456ADA6BDAE7069829B6760DAAB8F4772B7FBCF8A96F691BFE6802E
-F9EA5F469758411B191623A09A49B22E042310EB212894282C023852E11D1001
-225FBF626AE3FEB4F127D055FAA2F1D6533FE15F30ACDB50FDFEE0BAFB1D4CD3
-FFC9A8CDDBB834E06F0A2009E96E82EAB4364D42897631C46797394A1745A3A4
-45B2551DC83AEFFAEE4B19C824C88804C8789EDC04A72079561B851853585AE0
-E4DC3FE1515E0751FFCCB8747E05B3BF7DEF41CA3B9D17D8A3452D965E7F1F0D
-1770F771EF9B8CEFC746F42EF799828CDF99643D61F02064D472E5CBD1F01AE3
-027615C852F4F2455711D642C5AAFDBDEBB87BF4389897DD96F463964E84BA09
-75778F0201C395B006083E068C1CE5EA1725AF409C9A0C9AB1DE481F85511594
-79A3610A5D62625D9177B7DA0E2345FB16178DB9AA58588732C48BE70A5DA581
-EF630C04C61499312B2C456A5AD7D3EF4B6BA25A17E8990B9351A5232F783D89
-CBACBF1100EB449EA090943C73CBFB94AAC0D8C675D84284B83B4871F7F1F37C
-549C0F4194C12B2FC3E52D8F89FF2A8D18EBE7F270B786500B3238D7D8100CC2
-613EA077722458508F6DCFE09A5479D450B795A1100FE3ACD3BE0EF191BC1625
-729369ECF1EE49693310F8A241EA75CAF7E4B2FE14A91E9F0C13955496FB03ED
-E8FAC0DDC571FCB38B006A186E9642B6EAB0A7CE39B67112D9F83651A6E9DF2B
-9F6B6046744A77788DD927DE5C22FCC918C93C7B42C834391F8D9AC89A2D20A2
-1D979C7D6238D4D8E28946FE336A43402F67BE9FEE64B7AA3F4624358C09EFA6
-99FD5B78AC68D5E3F1854767BBD97701ECFE92107F6E51F00D0245484732150C
-C33E963DB666494C895F05BECA73B88B7043828D0637B3986372F28F1DB8D68C
-0CB56793D0FB42444AF9F77A634923A09102AA77F2A5A36330E8B946806E57FD
-47BC5B0CD1605E564AC173D7F3E1E19870DB668D87CC1A2BAF539925C1BEDC28
-ED5870BF8BB79B0D31DED055AAD85A6D8EB98D1DBE04F10FCD01932867FE787F
-1CF53587378BCEBB146135335100E2251577F42387DF4517DECE711E8A65454D
-FAF19EFC6EA9CF50A4FE3DA6E4902F895702F860AF0A82D47FC7E7C4F3FDE9B5
-091A7AFE227BA45E85679CD34B38B14BB824C7B499590C9DF82C7C11B36354EA
-F2A862100807308908B088EC066B2B20410914056F121CCFF70EAAF9F8C37D31
-9C09832C462EB0315DB838D2E2816528FB8391213B9CB687ACE34E6055512C6A
-543284441527EA2AB308D7FBB8BF137D201042117527E548909E3951A68925A8
-1F741254040BC520FE89B7F675EAFBCC1C2EBCC6F55BAA59D211572056ADFDEB
-3CEB28BA5B9987C4E5CF15A23D558815AEBA5D4EFF8B04D2B9A07F9EC3195A8C
-BC8E5E8422BB1150444C5683471207E26BA7B42F43583DCDB2868337362887F2
-8947C359480DAD443D473C61C4AF2E6BE2F7BAD06C79C102586C325EE523F000
-334B1AD5F85E52486C07D5F2B88CB36D7C5E61B421A67F76F1705CE79FBCF403
-FD73DD06D579EE0891AFA8CCA2002D031A2791B5747BE3FA9B7053DA6CB943A8
-8FB3D8DF855C16A641AF1B9E0FDABD84A5074B583202A8C120405C781F2A591F
-F44D17300936BF3C77591752E3F3FDC5C448910A7DD21F2C84F1D44BAD9C7EA0
-2C29193B42734103C2EE5A6A0A6B3F9A668D0E58B7450450290C4DF4AF6BA8A4
-EBCFCBC4363ED8209DE73972FF2DE7872AD38ECF92393023354BF50C918F84FC
-8EFAC13B94DF583EB1F6E02ED73D73560DCCA4E2F1CE8A7EFE29988616867139
-FD6636485328F32F2A9C2D1A26306936ABA671225CE1685FC633E98F198AC865
-C0ECDAE559DC639FA8D0D9BD2191C97317C07DDF2BEB1B8E6B0A2F4DB30B11CC
-FC7CF4D9EB529CEF39C017E332079C03FDCF16EF57F51CED595ABA70EA35E643
-88C4313F914D6888DBE345B1E5B97DAA93CCA097E330D3CEE75B91B36DB308BC
-EB676516AC72507CEE7469A7DCAD6E98000B1E3C77D8A4A4A1AA3C31AA384F2D
-2BD50F44E9CBB4B5FFD65C4E7931BA8930920680537920623C80A06AA95EA0A2
-DFC56A91E877CDC9E57A201BB933B4B15710CB4C1BCBB88AD119C273D9238020
-24DA817F6E77BF55F12E9F61A1E0D2A9DBC432E0827AD7F023F1DC6C82984F68
-F6F778AB1DA064EEE453A2C148AC1FEFE43E20392D59BB8898459A11D71F9713
-610A22F0DD1797E87854B0922FF58FADA2AB26FE02E9D6838D4470B8E16DC017
-874787097C64EC851AC4BA343EA6D9D1E0442F0A8AA1D6AC71C79443563B1BAE
-B4B159333392763A0D17962080B8243A4A6F11FEA2C8D5F4BBD4482638854019
-DC1BC660974B96EFF9C01DD2797B1E1C8E0CA2905F783B042959701A74AA8023
-CF44AD6A3C0B7414D41BF9E330C0EA9230853322C41F8A40E782AD8F4587E647
-EC3943D77A2ADE03D8FD096408B4085690CCDA8AC71C6C11AF690D8C32036AFA
-4ECAB5C1F31B05FDF26CADEE15383EA1BBA59FFFE6819D3155FFF76BDBFDEC24
-5BE59C61F3F0D704DD0862546F77DCDBCBC313B354481A9D529C4228E0E43EBD
-1BD15B94876AE370FF835434A588E4E8757025F2B1F82CEBF20AF28ADB8ED79D
-2412535DECFFE25B2109229C9BD3AC9A06BD241F9284EE8FC77096DE5EE21BB7
-7A7162D9AB3D2CF6C100D66BB240E43992444151A9ACC99D10B232B4E400DCAC
-BD38E0FABA6F475E6FAE28448FF34EC8C1656A1CBD27CD6561F9BFE0FABB1444
-2C25908CB3D14B664B3E9BDA6F0EDC8D933FFFEC2CF1A4074FE4CD3C8E72EFCA
-925FB57C53202E5F89D8CF63DCB5EEDC1AA68D11F263359B84A3D7F9AEEBE5F1
-4FF089AC97F1222221437833F33C06166B8CA011A5D2F9DABEF2750CFC00DE12
-9D26BF74021ACAE3AF901CAFEF6BBFBFDF7A496A73BC1F495D0F8AA6979EB23A
-0E4936B95B1636788C8937078CEF6AD30F0794115E019D187C11D6DCAA187303
-706FD91D652D41AFB4E012DFC5A0F78F435FCBE98D433CE9C7DC248106C5C763
-AAAC5FD1DF5367B41E004489C01C5FD3AD98B8EA7FCC66E1B552A4B6FF2AB13F
-93AFDA81E74C7304650C1CC7E0162AEA22A754E413C55D571349758D8AF0D508
-9324F516E8D4FE7CE7D0C2A574E959AD1DD3CD001E95B429E4FD1A6CB65A6133
-EC9893F1A7F476481D209843208146D10F9A4F0AACF2A6DCD4462CB4FC9D926D
-D5AC6B561BC9B0CEBC0CA2707AA010C66299C1DB237B020DED71DD7D80C47732
-9FF3A32D0EF7042C4021585BBC826038D69CB48982BD348946F44D80C39C26F7
-C15EEABA258F8095767AA5447F6A9CE1D43D6BB3A6B205B8B9E8CA81089CF71F
-5EDE578C4C244D0E35599CD00FAE11024952E3ADEC2ABDEC90D2FC76F9ECD6AA
-A6B40D16DF171738262230DDA062E9154DAB0A506DC761E79DB40C7F389C6E8D
-71B5BFBF82B224C4113A8E4580355E0B80D408B1D34F55E3586E9E680C689413
-5D584DBAD8258397EB0EC2EDA157621F90CF742E8F98974C36E2B1DA6DB71C53
-02A1E09A7E162F6E9B23F0CC5CF025CC9D13F55F787B2B565746C2AF129F0F4D
-3E304C56F314EE80A250BCBA45112194B4A3D8EDE0985F9067493F095520ED4B
-7F1CC08F330EE6F17DB5EE43DDC75AF55B1EDD1B41833FCCE5E842516E49BE84
-611BB71A150B44FF998B5866DA29D7DDE99D9D63F862EEB7C935216E5E60B772
-43800ED5868AFFC2CAE01F16B50902B292C2BEAD2EC5F7AF059BB8EB0CB73C0E
-EA8F144F716F3565B3CE4B9597B7C0257BDED508A600D3F1968CDE4E3F773F72
-C1AF5E675E3AFEE289515A32C4A4038E0B01410B58AD63AB537FC501F3470514
-A0AE66FC127777C616379F2DA2307DDEB634C5968C1EF03BF7981D9D90C14E37
-AAA1A0C76CB40A95B77D6ADCD43281E3F680AC687F859ECF4AEB35639E1B04F5
-3C88A52BC559DDF82BDDF076E58368AE6C8072EEBE110683B069FDE3BB0F5E38
-A3EB4E820CC8B98E2716D27925F5351C3B3ADF3D60398813106BFB474617EB33
-12C56B1BB2D743E2950677BB680C01DF42517D0E7C7F035D968938CFABD07E38
-A86BF53ADB0CC8715B052FCF6ABB0ACF56456F4F88C8D0E17220D88C82DC5087
-CD762D2538E309B6BF33C1F9B449BC0EFA035DDB9D4ACDF95B12FCA8BC429A78
-FB6CF03BEA0D047832E23A3A3215225CF76F2C213C92D706AA96182368F64173
-AA1D106CD441938A5BF7218EF0E1B73F2AD3AFF7C87C580B7643BF5994FABEC3
-CB362FBEFE73BD731ECE265093411559A49A5CAA01C4B55BF0E4CD7EAED28FDA
-8C264B62682DD64D12C7D9BB5119269DB43239AF2C80AE362D7716B5E49197A7
-F25B759B90DE0A436703CBCE72C472C53D842364D3BF567DD3F7615B29F2D02F
-C4A8E4603F76DA39138CF8596733947EA65F1B8A55DC91FCD08425B2DCECD526
-5DEB615E7DEF0155ADA336A523D0974D4D441FA925CD876CBE1A85D644831ACF
-705ED79DFEE14D519EC7930E4243D38E86CF01F355E675E9BD24529575FD4A6E
-2187DB6C8AAD53613FA7FCCCC6146E9F99DCE7B10815B49659D24880A949E036
-C849783186B13EA91A595FDD1FEB4DBBBE58C512F89537B27A2BDC4B568D1E38
-02916E8B4AF4A537C19453F94710478DCB89743D7EE30E15C165C0CE881CA43A
-E18E3E98BCF0423223E37C9407A872A996901E03392F8CE81A928727FBC9BF85
-6DC374D2AA3B2D2A82CA328E4F1A261B3EBEB470E5001274F564115691D01E8C
-A7480387E7EC74C5CEE5BDEBC0250108FF13D87C71EFB1BCC9C5B8028D70A79D
-0D2161380357E0E96D15597F673722E535F7C459F2650AA6403778C64F74F10B
-049AAAC72E6A409ABDAFE7C2778154D6E920D5E2AD710CB4F7CF7B52682EFB68
-FBD7DE55B4B5048A5738A329842AF53128E3A9E89ECEDA65B2B1A634EECEB846
-6D7C0E11933A5278BC377C5A1F50BAD2DF04CA0AEC47908DC12CBBFC367448EB
-7FE9D1ED7F2E13E35CA8E6FFC9734CFDD15E5322ED7D476A537FC691DF5B1CB7
-9C8396431356B92F4DFE47212F403D0A60253C0F0E7BD7768B157FA239753729
-CF0C82DC68EF1B83B56573BCD38C5D97A3D3889C650AC889046FABAC4B55856A
-858896E794BA81BF7D3917884F4989C120FABD9D82698DBF7ACA6FA03B7DE0B8
-DE93ADC29B8FA9DFC15D5B6578AD6CD89DFA21B2E0AF7F0FFE862D1839882472
-809FC43C5255790B323AB759EAFE0928391A8E87F2C6E50D7A7B87E6464EA553
-A1AD7FD38833956A136AAB9BF20ED42A2972FB4BE9186D48C3759D0FA38DAFB5
-7C4446C3E4D0743817A361984EB4CE36EA8837008484F27750EA45BB0481B07B
-CBFCAF075117CEC9C612DCF1F281C265177362A12F586DB66B890BFE45F0A5BF
-D0F433D8C3AF860D3423F6D7515192AD9FF0B5DCE2F50074BC2FFF95AB9ED49E
-73EF0AE628B503E7EA97A3B3FBAD0FAC2857BB8219ECBB90CCCC74B111A74F84
-2960056DBCB65504628C56B8E5F887912C80D8CFAA2226E23588AA243C14AD88
-BB92D576D161A3C23D065EA003369BB7E2DC0423609C2591D4AF74C86D998620
-B7F6BC6162BB2D98CA81222349BAC8C5E6A3F3170713B188FF08B8C40FFE0B2B
-DF51D256BB2A08D1FD0890BF51EE599578E189A99787022E19B8F44E8F0CAF54
-BE711062BBD9A270D1FF131D69F1ECDEFB84CEB2CB1AA8A6B474683911C895B9
-8CB36086B59B54B4CAF966749A2D395FBE6F4DF81F71E37E6A0C5AB70C65DFED
-CA21D87FE11CB967AC0E11B70CDD98CE389DAE41F21C429D57482B736EF9CC09
-16AB1D0E877AA92557D24375804161A6C1AB7C8912512BA2E0D0B1288A6C6784
-9EE2F3573B32873DDB0AF81C83B9097C0E4E5A62B6E324A02E19393A2A344DD9
-C6FF7B8D8405A6985F1C82FEB248BAA43FA630661F9708A1EB25A9C8EB93555C
-5878D5CBA73FCAE33DCBFB998B289E2204D62B8463AEEEA2DBDB450D6DB0AAA3
-A4EB5562F40D56A252C5D76E71CAC523C34F2A3CF56745A909C79A1A202D64B9
-EF5F98AE02CBC7B9B4D6CA1192930C93E9516C7B8491A38254EE14AFAE4C5E3E
-CD9560356BF0E1BC7CA29753C978394A4B06BC0807323267A97E6AEF0EF163B4
-2C92A7610BFD6257188892B55B5BFBC1802B0C648C1968AEC2BE35CE5788F7FC
-9FA1A42826378BA3F5142F8C9DD8FE321DB0553838FCC28B2191A5A26154CE54
-AF61C72B0867FBDF822FCCCE8E08E9BD728A7D063E3E9AF29BAAC110B817B34C
-A5D9B8A61CBBB74DF4FC0A490BAD78938C4694B26F84DA7A8A241FE91471D2F2
-0F1228907E852BC113205EC367D43A6BC47DC77742A8C0117704A0BFE29C1EB1
-8E35DE45C4FB9B4E48AB4E9EC0FA0F0A33C7197C19B41D2526E74040E6E7E797
-E18A45E86F480DFA98164CE339EAD8533F95274C13F26F1433D7FCAC9E28CA00
-5CDE03DCC7AEECF7FBF442840845EE1E17B58D71E9D58456CEDEE36A57C37EF1
-7159E3841F282ABC7E1C66594051DD8C7A9E7BE73C987E1640F345DF66E42360
-65E4D30006179A3355B7F0C54CED3F577A82D30E99617E52C0CE533016DD5B10
-211A47C3FDA4F9F7B54E61BCD46F7812A26D127EB37C047B67D547E644CDCCC9
-97CB89F6FCD4B80C83F15D5D280999772613A4F08F3620894C7C594C115A5FC4
-A0699C5A13F5D846F2220FBF86F2AB4C209F8703659389AF32991377A3E7A38F
-5EF88E603CB754D88E536CA1D071BCB9E9ACE9D737B8430ED73A1642DD094D87
-CB2E636ED90ABB1FA9612DD39C767B3C0169FBA67B3946E1E852E33588B8AFE5
-D593AC0BA2A92D76758BC611F252B7B0C00E0274BE5FBD392EFA86EE49473788
-BB5C80A82FFAF17372F480A08459D6E042361ED54CECF42C88523EEBFCA805E1
-E59A1743234BB6775AFD46BF07C533588E38634FAD480E63002927F24680B547
-6C63D3A937F4830D31E7689E6D422662651CFFCE6EA129C04F632D88FE43EC27
-CBB4BF4D4232D3DDD19599026EBCBBF47DA6C805E38AA6C11F1E1857A5E8F1BD
-4CD21F360419A0F3E555DE7EF68DE7E081573FE845402365C846F1F6B58477D3
-1259A60869E4B93EDB66C10D6B0E46D55D0842CC47DA05D21C8FEC6CB299409D
-7A1BB8B99EEDEB3C4F10A2699458F19C320F3FAE9CC6350CA383DDE889047279
-0FA91175252A42834BF9BF5D19AB0032B8383AB056BBDA41480F476835457F53
-D1083B641023078AFE58B2CA0FAE3832ABF70567D5E5A0EFC39C3FFEC8A3B2CB
-3624002DA2706BE3AD3DB339BD43BDDD9BF9D336F25E572289F105F319A4FEF4
-60E799202F759DA96C6489A228EEB3E975BA1EDFE6BB1A13612BE4A5B690C615
-97445B00FCC75097620CA90F06CA1C58AE637D12186D892295FD5FA126CE1D76
-011AAC13442F1DAE04AEC3E7A5AA6DD27F26ABC69EDCF606C10D34B0F32CB8AE
-2B0D21CD02DD3456FA3BD023E4E92233AD9F24146B7EB0C2A68C49FF71A01FC2
-2CEA9C5FA57F09147C6DCD8D3A4A33C1A70000B334527716C12052092B10E905
-9F22B1E3048E68EF2525762163421C33A1CE61D0923C75E738EA9A37DD3271C9
-AF4D55786F5BEAD707EC8AA26DD53D88476BECA54403293E8CDB02A083294545
-D4BD7DCBC7A73C480D4F3A903AC85AE133384CCCFDB357FE6B6B341FE71E4A75
-D283D1511423A2596D7543A293B4A6C26FE21040F0A3E8BBFEACD0152EC3F190
-ECD74D3CEFFE9C3E86402D8B5923CA46C8046AA3C6DA39983B645808F97F4332
-D66EC475C8B93982A7EDA2BDD0792B332A9EF932DCC11191E399900EBC05C3E3
-8AEB4B4CB9539D6D209EC0BD5C49AD675409BFF8EB2DAA5E425D4E65E06A2458
-F0C4149361EBBD54708F4B4EFCEA571DF325AF6835652E7C493DCCD8C8C2F01D
-382B800240082986A52D925D6F804BE8F048CBAB7C60DD389F7F3501121E1752
-AC0606E26537356594F6DB786ACC6152D194496812C20C5310970505EB0C3EE9
-73C5AB36FEA992F2ADF54BE9CF51B77D4B1E3E63B9A40E2D701F904C5E0259A3
-14C12EDB20B2F5D534ACC7C3AAB655F58C73659C9A177FBBC40963B6ACCEC0C0
-8BEE4D7EB45D68FD74C3E8AEB3D432CCBED396C3EA5F7EF4E40A8BE9353256A5
-25F88514221445F3373BA7FA3B3D360E533A17FA74D1F63EB847F313EF4FF04E
-62E3057E60FDC0DCE1E8DDAB7B45678F68D90680E750DAAA3BB7DB64E938D89C
-6246C43EEF4F68B65B0A8704B41882495F83742E12B2EE017B1A74DC8E1F4761
-576DD2027EC0F9C65F94E887C1E82D403879FB4DA7CE46B6B64B03541DDF3788
-6B417F4557B029C1A5CA503ED1379FA986DD2ADFE5D1CEB12F1B9FA0B4404132
-FDCBEDBA2693C41F999E5FED058098745312F520189CFCD89AA7EE42F2BD782A
-FB595F059CED0AB8D0BB55F65EBF29D89E023070E8A35964F7D8A8D5511941EC
-65C5BB39B27168C392FA68D211056BA38830B5289B399927BF79BE6733395940
-DA32538EC63BC1435F6500BBFE3641B96B52D46D4051E393D302672AA30AD51B
-E3E6E133CE80E6E9A7D979C63F324C99B5A6FA7B8555F35891AD9F60942D4085
-68A4D12E945BAE908F2C71993851A616D4E69E27F30441466DA68E16C74BE058
-C8920C64CE03667344F9DD28EDB24C5062BA27BC75B924029E5D86636A0E347E
-1B41D41B6556EE350C0BC921F11232DA04D5387176DC11C4CC64E408C164F8D2
-2EA268E517813474172B3787747D4C12DB61804D93F3ECB81A52329B87294C9C
-DF2AF75BC8AB538565E066992E8F6C2BA4B89D5DDE0CBBC202396D31227C777D
-60D7D5905ACF8E02AA26DA2E49BAF4464701D01081E206291FFAAA45C5087028
-AF59353DA8569D6000ABC1B744CCC4C0A8A391FE1FFC415EB4901F950D0B4E7A
-89C6F634E5410DED1B428A87EC74BDE51BB5EB54AEF68C385BDD5ABB283D390C
-02BE931669CB603C063191745F913756B28E81DF6B3760804300B01C4AE126BE
-C558B85BE08C2787A930A944E9A6F7DFC85E7C243E4BE99B57E2B120190708A7
-60138412969D73387995B15583B8C2B3BF6E14DBE22599859EF551E741B04DFE
-36E53F1D04E091C840C1A9D43835A12F4244D4D694D46B6D3376E824FD3C50F0
-D889F2D544096385C982B5004268D199D46E56051B2C46BBE23F0D1A3DDDEA28
-1E1B0A24C80A82C2FAA2732A5B9CE81B6D22EB77ED0EE9E3E1F89E2C07167A86
-839255DEF07653976250EE4839BF800EF371ADB3B19F92C34193399E6C2B005F
-5CACCAC594DE4B92EFE30C6E891C622BE799804F691EB54BD12E95F8CB57C618
-8FDEA75A9FB8B65F3AEE065B9B4C545AE70F9A1925A0D7BA9187E559E85C317B
-F1FB71EAC15E75E1E93AE8D29A56F4DB65684D6CD4AE9BAA74E1C57914BAE369
-17C403097FC47954DEB81B049B99B80B9B2CB80B709FBAC869077B9E5279888D
-987639D5CBC79C8102FB496E5387450808238930AEDC3F2A13558E56C9587723
-4F9FD604CFB9831A34A560E2F24187FD519A3F2DFA87541E4DBF75642A4044BD
-B62A47799D79B6A6341B2741018FE8640CB8129AB492355B0CFA3B4C7D0B8794
-E0BC808057F439C71057A5E15C1008793A9733A0007D7C95C408443F851CB1AF
-B2D2DE86AE8BDD6234002311C81AA07E10B58AB87784DC665E498DBD1F19C7F1
-7B3278AB45C358DD71821ED3428296EB77771E230F82933E71A99662199DFA5B
-2A7988C4060180B916EE8EA9F4896C0975AB0B33928BABAC1D7B08C4C80984F1
-3E1EF19F0B8B61ED8AE5B5325EDB72234C4966B0953C463CA79935C22EE21855
-62C316E3C26BD4CB68482CBFEB2BB05C353F1671EEDE4D30162472879F82BC96
-F9C32CAF2AB2ADE3E14D704A1871E193BFE97F3CF8BF9C5E1806446FA2207B68
-A1ED6B9EC3C914689F2AEF2436792D25A7829C2E7D53ED15ACECAF1E79B589F5
-90D80E0A25DB1F40F6C1302B33DFB91A933B888EBA3F58D267884F0A4A0C675E
-5CB0FCE0AD0F58B692344E2A3A20D657035046173A346C1ECA438BF92F75A047
-89AAAFD72B7FCA447146245D10B1508DBAC840FA1D52DC174DF2E64D6792E4B5
-874DD42DA10CF5C2F83EDD54DF2045F1E40F50F529CB7F9375BA7F5A57D0A5FD
-D958183A252FD7AB88F9E2C099F587E716C6ADAC29A90619CFEC1E9E6E63046B
-F688F7DD7843A1216917A0146C248FC12126E8DD38E27D05E8014C7D5614C661
-F102BB47A24CC223EB05E7F5A7F33C554EE4B5E6D16087884FA939D3E56A0B7D
-1E3C9E7F6C3CE95369FA6796F24B5A11CF30FC93160366F5C2EF4FE1D6D1EE9C
-E21AF6B09F1FE1D076353801D4799A38DEA9D323E8091F591884D471336F0BAA
-8B353ECD3B7E2FC36F5F4C49B6ECA8C08078F857F919BBC14A2B51B239807698
-37764DC6C7BFE510F180C63CD0E1A9B001DE2C50CD99D934B71D9CD633F40341
-4C0E56063100447522DC53346428F562E9F6A2B4CE6644EFF13BC5A1B0C1E75E
-659F64B4C5D31E51AA2DEA57882BA22D149145FD316F928DB46E680A269CABDD
-196FB35A49DDE6F4CEB9D61654CADB3B9314EC1C0DCF0DF00DCA92A944BB40AC
-31F94EA1FEC6993DC4E8203E6C850980DAC682B04D2161AE3F9E22F34A874A5C
-3E24B6B0C44CEDC23380752B6EF7601670B58C4C9B25728709C322DD98DFA48B
-C965B6A283D7ADABEE1789A8BD54E14E6B2D6FBDBA6E19A7DAF45646E036FAC6
-B761AC1BF621780B92CD97E068E50308D5BD6CA17F8BA70AE30B9C5F07C2E8CD
-9D4DCEB6844CE6F2241B1D19BD6A1FC5F28848DB10FEFA1F55BED0283AD14588
-7051A33C3854718059920BA88259032FBF481F0F0A2D1749A867BAE63B0F6E92
-8A4CE00F73742D6D07DC31932D8526B78A806B1F242153AB3F358ED69BCB9A9B
-EC008CB67844D943E1BD3512F47A81959D74397B05AA8F412A5DAE4F657B4738
-A8B77333A3FB07ED1BF72DC0BA5CA9BFA3E74AEE58754BBDB7D8A898C9B111E5
-194BCEA1DB2035C3B1F6E012D22785F9BA38FF027B3B622FC8F0F256787FF91D
-FC4C9F64020219428302102566BB6A8D572450A2647521DBC714D7C886125239
-1001F1C8D9E928873665E89A043BFC9F4DBC8DEBC04E849B1D52B3A9A108FE6D
-09DBF96DEB165F0521B90C4DCB60A8187288C400B85E6013ACA8227AE83A8DFD
-351D6C8F863197A4D44798FA3A292FC2B21750B077E9B9670D25E023B2A6C14C
-A6DECB08D3C3C61FCECEF890F02B6442D0D7C0D419DA2889E7FDC3AD977C5643
-3E61C6793A2729CD435B3D4CF67A92DDC450CA6F4328F028A962D0783EE0DAB2
-4E9D496FA28ACFB0693355360E997D3177640A354CD8DCB8263F18D621218201
-D1E7F6C31E8F08ABFDA261B7A3512C784931514773B16F92D04FC11B637B8BA9
-BAA804CF55C126CD35839A50A81B00ED35C3D32AA64BE73E2D4587025FF23A5D
-ECD93B1298492A4FF326E74042EB1DC3E98B4F041F17F341F4277AE117D6E4AA
-BD76023649042985D18C3C28C0FD330D6F0A74778787221B325C4D810D6D87FD
-8EC7254D1AF3AF46C2BADE5D292225744945CE0248AD303DF4906E0402159D5D
-BFC58DB629CDE8E81B6EA2E0D5B50E1C455E7AF6B3368627BB3FA73C2A72AB31
-627AD18658C8BFABF0D7B2E40A9E1490D03296AB1792E160FCCAF4FEF84B71DF
-E284C03E87F17D3A440990652A9503B2C45D48D9C8DADD9776238E22BEA1C4A3
-AB05918672D6EC5426E06F688C42F4755635CB0F5C41694DD9B07C5945F6F7C1
-EBA7277B32C92E6754970F6821B217944E09E89A81F325D78AC5AB6E1F9A1FA3
-358FB78159C333EEF87541D46247902155B6DF41F1241C58197825D3E2F8C1E3
-9029904D5203F7120AACB8C012DEE6460257727E259831BF7CD658197343C8CC
-9832FA2C62D730D0867DA1A688C38436D26837794BBF6AD78E3A8820867CF045
-C9182C904A87B9F542F4CD87E315C0ED1DC3A545D043C2F337312B0C70144BC1
-29581023FB0C7E114BF72C0D010B3CADFC79E87F303F0AC7FA0CAEAF0A927D5C
-A9672235B9E3F4DD72112C1273C8AADEC3A8ACEEEE81927E3F314DAD0FA7F412
-D32ACF1287D1A500730D8BF20E290B2DBA7DA8A778BB9F206BD31E2989DDE5B5
-D5CD2DB85EF2834448364B7EA6DAF3BA0088D9D9260B6A44B0E4C2D3411E3F64
-A748ABC0A8E9BAAEF164732816DE572EA825D945F4E894D7D2E3CB36961EF8C2
-853D2905F11FA8AF17763C31B7216A8E6EEE28F8F3E8A7E9345D27B52EB6AFC9
-33462FD5A6DC850EED8C4F403626B1381AB6AF3D6E8BA6BC7682095B180043A5
-6DFC2F7D7304C905771279E71D05ED597285452E06928E3183F91589774DFFA0
-7344946AB4081EADDB102E205A17F49FEBC1702E33942F5260D87DDF65473622
-8218C9F68106399E2AF3EBCD07B6B58284CC3F4661CE7FBB21073D7A313CDCAF
-A15A05658CB96154F2232CD57F183153BCF0DF1E96F1323D1C45F23D68536C23
-D2B141AF03A36182DCB872B6BE7EBD4423A5C048FEC8A6C6E92434A9E1B79921
-333A249BEC6ECA29FA4FCD627DAE3BA8F6E123D95297A9E2D1FCC426BF7E50CE
-4842D85C3E8ABA8CA9241DF6AC71240BF1B73F0DCB13E1E9D2D1F9AA6A081476
-6CCAEB851EF19ADBE584A7A50109007AE42D3C3E29971D04A0F5FF1890ABD460
-C0F9C909685D097583ED09EFC536285F752B16A55E31E6B34402B6160DD97563
-1AD5F56A8F1F76A3EEE62A6108C2FA0CFDC25591D00F8896A8DCEED9864EEF32
-23FA25110F6E78C8F18A55A3EFCCE0922A3C733FB9D4C8E0F5952904DD5410B4
-5857953647FF97355F9CDB187FDEB54E8A6E4EC0ACF4F3C13251BA034F5DBD7D
-C0F04E856E49FBE5BE24D220048B7D9AEA6689484EBB50AF1F7A1AC4AB251404
-8F62BD7993ED8AA929A029FA4A33CAB57BD9A54749A796DA9A9370E1355463D5
-4E158E05FB99E2094C3B273787D851D433AEE9AEF73FCA873329ABE21E5CC531
-81E7E9B76F347F43D36E16C10C709FF9E16695EAADE5566476B70906B2F93838
-CFEA62C80D0A5FBA21711D45DFFE3AE3F2CAE050648FB91C87EA39757D7D6885
-B7018BFC81564DE44580290F53FB601701342AA22C825C566961EEB9F886D550
-00079A5FDBEEC5B00293B784C5651C747D93149B22DB752958992E64AE87C919
-D97B0DD0851E105E8D4C9FD1792B94E7EE1566A482A55BEEE5F4782065667E99
-FC0B355020548E10A5D7786D6FE53589D9B711D0DBFDE94205667092766B8351
-0CDB4B715EB701B1BE4862B18FC4A26D3A8A680EEF001C0EF439972FAB7F79D7
-18AC641B6D1DD5A613868D67121C0B67012EB27B920AAB6FEC1B5D067B7DE813
-FF1F3CAD1C279036E0F2B02C91A32339E1AA011CBADBBEC510AC628D85273FC4
-956EFE7F85BFD2BC6D57E9673AA1402B0E145A2ADBF33C3567BC47B9BCE16A5F
-A049899A532B554245FB468A6024E7F1D6BFFD3F0C63AACBF8AE866C0504DC23
-266A566F4EA034458C160DCA0D860995C246DCE9B8BC76B742AFC3A23E15853B
-242CA55B38B3F1AC192CDA70C873363D4F6912A4B6A9D691A53BD33F9AEDB1A3
-0825DF6D9C57254666105DB69A8CD29522FA2F4016533BAE1B75031836AFD5FC
-5ABA92E8588B152AAA2252EB8BCB5F5C5936E6072167405112A10DE09EE454BC
-48DAF59774DFB93094631DB0F2C97480EEF0006C18766AE1EB1A16DC6C0B52D9
-9ECCF897B2DB4D0F690749F8068F82ED159207E06CAAC19EAF2FE95CD333DD6A
-1DFD3F3C2EDF3C0734B14814BDAE8331BD430C963492FF6E7B0BB14D56613FD2
-C27A6FF7D390C13286DE72F5241AE846120CE1DDCC827D00678A3CF0E49CB7A8
-6B09DB2A8072898C89815C8B01240F8E7AE7E20589959FEEC6470089F8415C7D
-1BE0D344166835AF7717016826D627AE4204D914A318AE84C6439E4A9E8F12C1
-9D98A1D5E85D00C536811CDCD56640D44C7EFA03E6FEAB29636210534E406252
-A99D75C077CF99D8AAD43644EA16DCC28C6F885A041E0B43981F09959A603ECB
-19F9ADD4D4997A07B6317C731DD429A6F0D1D99CDCBC475FAA8BC888EC263433
-0BEE727E2E0B6FF98F982C1B128D097314AC7C696F84F19DAB10DB5160A59B26
-CA44DDCC9284B843425A302C5B21A829BD261FA33A44F339D51B2F95C949D37B
-D75FAD32FFF3E76FFB7713FAA9F15FED09094E476382531DC9639FECFFB3940B
-E7DAC4BCFA633EAD07643CB27D9CDE05AF6ED670D74760CECBF7160F46742AA8
-FF962C22E1EB0E492C75929625F6839E6190E81E477914979837A9F165B13B28
-C09125D9659BB596B0E8B165DB17965AEE56EEB46022390513F395C2987742F7
-F141E45BE948632B3272BFF43934C84950649B0AF418E42DBF71B4098FA8079A
-5F26F81922D97866F8183783DE8289703D0886A704CA6C2FC9DEF3DD9B116F18
-23A11A448F7D8180E1BFB2369B2DA3E6A09AC65A3B7AE63EBF4E388855F85A7A
-23E90FFC6965D9643E9FF8DEF8DF0DFD552126E19B92394D93A492B27E4D49E4
-36CCA1D51783E6A2A2ABC9657D5B8841A2F99E6E89F29C2B1ADD7C4D4340C3F8
-AC3877D3D11C28D6E1252E690B3F94704C9FD6B64BF03A46E1F399830162F5C6
-CA081A12E1592D9AAA6103A2C10BB2CA96A7BB2A141385C5D550EAC392EFF1C7
-FB1708AF908BBA2F807284B87764DB4BED8B26394BC24F07D731790A1775C909
-68B17ADB0F4A37B58F55E514E85BE8FFDE0D1FCB02EB75990A9BF953A88FD966
-801A2428593E86E240CFFD0F5A9481BF3E64AB2B3CF8D8A7C6DA10E5D4F96A05
-7E207E4C6F0CE1FE061BD6235AB57F568A664604D913F35AB9B9F693A4B93EB8
-19A583E1057E77BBB0FE596DA83AD659FCDF9F793417643DF22C12CF0152A76D
-E8A1B9C890235D22B81AC5255BC024FF69A8CBD1565CF30778A80B56D31CB253
-0C3A1AFA5B912ABBE79D1E84B68407359F72486A6EB1D5095F8323609F0BFFED
-303E9A448C3385521D9C6743DE00ED69C1FA67DDE59FAB55738EA5E48FE3165A
-6A64B88D8B1F6E033C6209D2BD3FB040C0523A6D0C266758DB2B43B556A6E3D6
-2384F9ECC1BBF49F0A922FAB1E1934B279C7E8754E1C0ECCC831B3A7BDA34090
-31B9B02B8D514E21AF2EF6A66B248EF1F50CA646FA603F9591D4951C22472018
-B5D4C5822247FC61E4201B55CE9B76C0A79FA05A15B85736B7CB5C8421147314
-499706F303606B3A0F75012CEC4A1AB0F30802CF0B5769172FCCD3E057798E91
-CAB106C3B1A022E93DBB6721A3B1386C8878EB7C342D8ACD5C86A30DECEC22C5
-55C18C1DDFFB5B15D1A81CC9A9C67649B555D5BF07FD1BB5DCC7ACCBCB7E8066
-5635FF4F1DDF308FB2A2FDDACA60FD88387821B10753D7DF0AE56BAC14FAB05C
-0A38D450C22F13F00EF31F73701F38BF229EDAFDE8C3F6D41DBD51616114FB8E
-631C8D64DB1F5C0C359C1C46AD245ACF45734ED7D22A397333262D7268453D68
-B8AD396C05800C05819BC0794148DD20E6D8727CAA6F167F5888249C44BFD95D
-A85B651D7C2732BD1FF349E7DFF7778E28C88516C04AB1C67CCD5CF9144961F5
-93A342144450258D359232F11FB19A4AF79A0C046E845B01FB7B5B5D62622D67
-DE1D52D712E1D1B4ADB8D5DD51309F2DABA84D38C1ADB4B31EFE80FB690605C2
-B63BDF89D1FDBECB2AE4FDFE47EE5C122744875C107954341113B31BA1AC4D07
-2166F69F1386BC784D82F69AD51AAB6C22FC8641F1AB8989307F7643782B3FB6
-FC72CE90B42A92156044413464F8634A5B4FBC48C347E8D2CD8A1A407C44ED27
-677CAB77EC2ECF29BD752544A69F46
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/l049016t.pfa b/lib/fonts/l049016t.pfa
deleted file mode 100644
index e47d5bb999..0000000000
--- a/lib/fonts/l049016t.pfa
+++ /dev/null
@@ -1,1582 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiSerif-Bold 1.1000
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.1000) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Serif Bold) readonly def
-/FamilyName (Luxi Serif) readonly def
-/Weight (Bold) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch false def
-/UnderlinePosition -36 def
-/UnderlineThickness 72 def
-end readonly def
-/FontName /LuxiSerif-Bold def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-217 -211 994 1012} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078992 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D9E494BF284EBDC8877C4E
-5D28D2A79EA7D5EC25EB01F73826320B565BFED33D55B5D2B4128ACF57097B2E
-BA8BD7BC7EDE9E6C636AE6FF86DFEB5E9BCD723BED1C30F8B20C4086BCF5FC74
-44FD8939C7580185BA7BF311E1E56D7C53EE70ED83BC1615501895EED5042083
-A5A0D8CC28978C5DAF869CEC1F15FBEF2A58A11A3417D1527AB511AA9B6746E5
-5798FDBD24006F12521FEFF4284ACEDA2A6FE84D9DD417103B4B1FE7FC2BC351
-2564D903599E253F6F4BD11D7B3BFCD01EA9DA51FAADA5F18B9F5E5DF25FA0D2
-A1BD84D42BAD716CA9303DFECA5DF05B26EC60612FBE0E931112268B223FFC37
-FA3ABE4C7E429354DD82D7F24B6A342F53EACEF4188937778E2F037B002B29F4
-9A4BAA19E878E7B0A6F326E3DC7949DA57D84E1098506B0B4C1BBB57196B597E
-310BF7408315F69854ACD0F8E8640A70F20D4EF409AC0F891554643BD8040BAA
-6C11008AEE7BE22282A1328C271E30817386EACF45542EF2DC63856FDD867C3A
-4408FFC606DD5937B74882832FE9D3C806AB1C6594AD2F95B763919345E37202
-5C3474453ED74E5344ABA7A92101A287E932E8900F7CAD3083D38FE1EF3ED4A7
-E6C2A0A8A19A2DCAA58F823D354994C9BAFF5FAF8BCE6A50B275F8958E9254DB
-32D7BFB3A1F3739B650B9704B7AE03378D90E8432A1BEF6EF20F8F49EFD919A6
-C9C90F60822299B0B50C0EAE5243AB66D9573E257E99ED424D4F7B284B779EBA
-1B47D49FFB539EF6D3CAA911911E7CDD9E7CCE13F60F2C698A7E4AA8AB3A2B2C
-6F3C86B9EC9EB8A8B8687FCB279B9B2B4B5F838FE25EDE772B77407CAE3C5840
-1EC417A4D627AF14F5E8D5D45EBBF564279361B871A0A142962BDB83EB1673F3
-CF7A34044DAA42321ACB120827402D43CB17607D9C8CB2BC726B8D06AEF513E2
-72CAE380EC17A1A2B0F235FC70D479A606B3360E291426B0C651CED104A39B26
-C4B14949E12B160B048969242BDCB760C123FC89DC73D8A628448CF678C9F679
-99EFF5E798EE5E46F41D1B84A38631876EC8CEDCEDEDC21038F7707A1F4CD355
-81003CF5E163C1DF8E76B1C4BADFC4C887A084E94CA74AA5314BDB69CB0C5F79
-B80DBCF17D95CE7B1B0E3C68652158131D8B776C368203356AEBE5DA210EC561
-8B56C1D5BA9001CCFF14D7AF2CE1175AE66FEC8CFA4F1F2D2C2FCD5C00FC62C9
-98F5FF6209542EEB45BA0DD8ED9CD08DBD58FF8A70C7F1578AB22E25136E31E6
-DFC05DC28A66C6C852092E56590199B2394D5B99D466EDE33EEA357806A3D0D7
-06B658A6528AACEC3682044D37A42E960E1B92E7E064AB891AA0006AFDE4D8B4
-0E61B0480EE2879F3C8455785EEFE3E8C02D9A5EB4EAC0AE01C79C44F84195CC
-4724AB8ACC2E93B1551E750DB22D707F1BF8FE2E9A751E542F347A7E54C91D69
-25E99CD65F7A348E6234D1933177E5EAD802D3907161E7A19A3AF41378FDC8CF
-464A5A87EE4D83218A9CAD27B1F349E55379DA9640739A502427F52C6A16CA7C
-FB8E3F19E256918FEB39D16B6C4734B058373BA35A222B58A6421F7FAE124E40
-B11A646757F60DB2ACBB0E8EAC910698C137FE9149DAA39EEB195ED3823F0308
-A8BA9E889E618458ADC62C8F372B4BE51B66FF0E9F9837494E1E04077959E166
-C3654872114BD6A703746FB31E330BE538EC7C440F0473D5983C86714E002205
-7469E7C388E390068A302F16F7CAAAACE00BCBEA71E1C58E3B59C411965F07FF
-04C2FDAE9FE2D314E85C035F58440DC004366307A9173BA9342B0CDF58AD1980
-5C38795CD0967F83E13EBBABC37CDD0155A49FCCEB5233B0031BAEB6EDACA49F
-E842B25DD5E791DE4908C94E372B2075F9615CEF9275316080AB9F5E678AE30E
-CCCA7B2C9E71571B42A5315849B08DADAD9ED58120D77BC16019006704D436C2
-B36A8B3860A5B63B5864383034B6FF0252E29B409D01BFF9752D9A845493EF2D
-2F1DA1B6DA9933D24729E8002E4507A15D90E0CBC40FB562E4C0CD70A95B5D7C
-E70186CD14657AE2D308DB650768E9B135E24A82212A99EA217EDB93D1EC03CA
-2FE7B4ADE5FE28A21225F39722E0C2144536DA5083965642FFF7438AABD30710
-94D3F4B1118179748A71133050E51C94D9928885FADDA8383EF01BA234BDDAB3
-273FAC0D86260001AD472BFD440009C19EBA1C212C581888FCCE590516767F4F
-A17C7F5BE71A2262A34673DE3CA11EBFFC1A971EBE827C4A232E4C6CBF65DA34
-A1D231C875BDCD842BF21E1C00E28AD90C73571F040BF095E28B4F4AA5E3833D
-D050545E8B5A04A2F67B7C0EE5B49ED30B189F0130D544912E0CBD25D09EAC0C
-334B30759FF0ECD7FC05D11830F0ADDFC9F84028706324B903AA963FA4FEB4E5
-12756E76F8A55E130A14866983058A7FA9BF206924C0C7281E7EFDB384F9F1EA
-EC120F349CED13B2F2FBDB930D1A66B1AD1C10B9E66E7AE2830B9BB5A51D0DD8
-0A5A0A0729571B9DB76123040AAC7E791137695FDAB0639FD2F994107145E1BD
-A539BA84A3DCAFFCED2FA9A1642FD8123D65E24FEA77CBD299D22AB1DED3AB40
-F0DC657EAEC450B1170CECD360093EC0CC14E2F50E141B8F52A3F5B9D7CFCA92
-30D819A34BC303DB080E7919E573B46489BF79691880EEDD6B992CD63374DAD9
-2DDE4B0DA61C03CB953ACAEC3176B7C474A1A5A351B259098FB2425D2522018D
-98C0CAF94E047EE130438CC2AEA2AC11AF18F652C53157DFD31F44261103DE0C
-4D582D29B23BCC137849306504F3CFE49EAB54D05FC62754A3166AF5CA301F89
-A1016CD076761A415C900AA958F922C6881BE652F32ECD8DCA3059CC335D3D95
-AE5C4F0DD70CE9DE75407AEE7801B9839A56C3E372F126A22A779D949E4111A1
-7F2E1B2D884ECAC744D2E78C1D16A8D3D67A6E818BC347F6E6DFE71ED0A7F45D
-F37653BEF6DFC90D98629BD09DDC53EE1E2227CD0553375AAB4A3F10ABFC38D9
-A55A4D376D18148CE67C7D0062AC884CBC6500E646C84DEAB420FBF64E4B4360
-B2F5EB123D42F0BACF232E9F3392FC1704EA390941491BD97D191F198976EA7A
-8FE3D14141E1BDBA8010266CF791D0E700C1F1C1FE69709712EBFB2136026E84
-A246F78B6B713D7DDF9E01745AE071B8CB052B54D5545AB56091E3134306A532
-8729EC3FD25AC305D3D39571C2AA50D4FFAEDECF998BA46AE033AC1D5DC3967B
-C846E475352E0468C0826A8E040332D9AF6975859E069F70F624E8A646A65DC6
-1852339A3857C96593FDF7F4787E5A7D691C89396F4B5D4DF91A092863709AA8
-F7D8BC7C7739EB060C3BEECA0631CF9F47BE4854248EF5E88B79FCCAD7C19BB0
-1B745E6DCA8034363F4C5CC4B305FF2EE1B2B9A234F394EBE15B82B5F317EA7C
-39183B8D590DA62B3277FF00283C5F5DBFE10F29AE99581F6A9227009300BE2C
-2B0E509BD87D96AE7C5B198C8FB02DF8E1E5A648EEA044A5AAE0293BBE43D2E9
-33D55B70F8BB33CACEB5DB36CB9A731B3804D859E020E2FF49BF121A7950B984
-7B0913BC2139A8F70FF6DD3C6DC638477E4092F1179D540CD31C349CFB0AE55A
-B0E772894CF02BE0637692FD6574D4EB2A76E93070556665128B99C20296C550
-8BF29B1EFECAFF31925ECBFD147490E3898A98D374904CB7BE2E7C752734A359
-FA107535533B4A97691A242FBB82D66C006A19374AE8698647CE8FE951EE2B84
-0E5836F8A3CCFB6F95FC009F8B5D200C0ECFB0BD6692A8644BA7DA5CC2E80DA1
-10ADA3FF7F79A40AEFCA4B98CDC4EA9C29BC1E901CCE1FB466DF65233B889C24
-DFA2E161FB6366CFF3AECE89C404283546D7814B254798EE928D74FB9B72B709
-E965F4369ADAFE799B4510CFDEFC772ED5516D9EDD5F1AF0410F5D82CA9DF5F9
-5134D9B9BA4984B5A8A3D8320AFC0DCD6305CDF582B08E28C28F0D137F73EAE0
-800469768BA91CA121A42D04A606D1722104CAED2731D73C3304F7C4371A1319
-F9ADFA53A1F7A7F8EE4D7B74E3473EE3C11AB66BB43756CE0D57AB36B5278E43
-B860B5A9C51AF0BE85CFEA6C3D114AC0AD68919A9027DA7C80D5C3456FEF5824
-1447D68ACC05CF272C0D0E62548DC9544908B9F50F5804B83C229F5E9B65C3C3
-CBE220648DC64EFC53C40473A421301F19E768D3BAFEA7FEE49FD3B4EC279861
-D9D751F4D49A64C463EF174D0F7672042E22BD2F55AAF7F531809A541D5146CB
-FA4D776AD1AB10289B6EE3E01C19B8A8F7A282AD668D5F8B76C45A68D51BF56C
-56DDA612D9E4FDA940D2C4B75593834F882AD142E6E39FFC70744CD9F3B7B19A
-1FE25627DCC832F20296F2B4608AAC873F5F7D859D5BCC5C0B83DC569264102E
-50BE5724F8F64CB35C8FACB12F460A311D57F4E52B7A08A5930BD56951C0C88D
-6FFF6A6A18553FA7A2731F001C28093813676C4ECF8FCCAD89D94EFE35996AB1
-776298BF7E1EC9AB0FC95D6475A635B89F7E0EF16EBC188B1FBE3D105942CB47
-0A4BFB9FA132E1AC19D544423081ABFA1AAAFD91165B378D3CDD2734430EAA36
-B070A780F90863631E2C7CA2079B1EEE7666B975FB9BC62C37DB28EBBFF3FC57
-5356BBAC08A908976DDFCFC1664927E69DD7713A47B1A4150EA0762E9D30455B
-F840841688DCD60847AECA495F411656D669AD3168F261BF9C31821EE3E8685F
-761276952DCA7E4F21C16D9EF197AE2FCE0D1E85263C738E1CD88D4147ECB87F
-7C232716CF20C51575BBB0C771FFFCE3C08CE867F426FC4D1DFEFBFA1618ACB8
-ED40168DCA837A254EDA92887905BAC603606E427256D2922D6FD43AC3A18781
-63EAF11A9102411AA6CEB7119688C106E71364A973EB54F1869B419AA6770383
-9D2F9E5C0DFCD9334CAC426FBA2AFD070A0374D65FF2C203516D9E052462993E
-DD2C77E9F84B8299B2399045A09E37744EDD3F3DC1599A2B8901C84DD5640936
-8938E43B662ACBEF2279B10F44600CA2C61647B67C8909097119232BB82262D8
-8C55D939A457E84CC03F2DD9215C78CA82EF556DEFE179DDC0D248A933E9F906
-70850D991D72913C554BA1E71E71CB773020D452247B7B482370C8B190A105F2
-6074F9E154E9BB43CDCFF610B2634061614BE281B1809E7FE0B60D308507465E
-13F424FA991810117D147A9D68D76170C75502E60E95D19B30081969BDE3747A
-1CD185820B4080697411DE70ABBA838BC6AFF19E11AE35B5284B2AC7A96CEE55
-1D9415C7FB88CDDA4958F9C9892C1119B69B5E2B47B2896F31DE83F6476510AA
-CCB73E9E3ED534D7269C8FF23B4AD964AC6A920C20F0CA0C469EA85F6D675436
-CF22A3B92B7A4BF502AD1A94D0A575A82E90ED3CDE6E422B73B6B76C23B1CAD7
-7E246CD8C3FD6A40CFE5E955613118FC584DF75CC434F8DFD05181056CCF0CFD
-53BDD45E4F8A9424C3092C42FFF19D59AE1C003D3FD837882D6B0B2A00489F23
-518B48040D40CBF9CE77733823CA610735CEE4FA8C907575F0F0CFCBBA4D2E50
-04ADA5DEFC707A82324D7F288302C99D2ED5009D20FB875AA0F861479497643A
-0E041E76CB10B898E1EC007BF8F70444474A75D3C005ECB947B8F8DE8356771B
-EF4052F1D5CB3B19853804BCA33E0EB27B418E75AC398E79B1A621F85E4F5C26
-1603C789437477357A69A585BDEF24F8F0C9246FBB04F40AB6498FF72BABC3F9
-2C5D9476A87DB82859C374969A1016D0068FEC4AD30EAF10E871DAB9564EB600
-8EA14C41EBA75DC1D4B4EE36AD57CBCEA9E862542627551B530AD763BE607808
-5441ACFAA3AEA5C6DE659B15F522C10F7719A4F868473883B8D1BC1E40F7E525
-3C1196E9850B6D58F7673D6403BEB6FEEDE3105BC4F7CECB15A3BAC37E77D83A
-D802F77B9A4B4014C1FEFAB1DED101A0FE0ABD220965367F99DD6E4C34C6F47F
-040B8A1924E7889DC4A131408D8BD1AC15B3DD07315C4A30BD30BCB9C03D6C90
-ED4295840906E3AD448FF83F74257F0549BAA5F0D96FEBF943F07941121908E5
-AD6A27A33BC555B602F72F067273270498410D2089C3D1EE95D2C423223CA83D
-EDDB1552B6E121D9FD1D0F5BBC1E9E8269C0CD6515B1428D61704FE230AB513C
-AFC088CF436E7121630478E115DE2F5157D244B6E081FD74E5539385F6FD056C
-5824847358D38BEF8896B93424F40ED6F485CDA0D9AFD896F921750E331ED55C
-B58A93CBF1F74F1B11DFE0E35EAA56580E949130C6D670271921C65BF946FA75
-1B9472F92BDFDA5D71DDC5C3D03260B67E2D94773961664EB4FD4D23D49D368D
-F2D8ADB7F2D6D41A019E20654EF4B78D35F26A159E48093EDDA1FDABAC484D23
-88EFF39E0A4C2A64953D53B6039BBA748751F4B6C077C9B66AEE9127E646723D
-26F7E288365818F30A38071AA011E67F0E9AB64F4A943BEFF67BBDEAB4915B31
-FB6326BA1EC27EC9F525CD183D97015750C17D2944F793407DB6ABBB72AC2F85
-98C449326CEC03227FC767470A3F102A12C2A8122396D00025D84A3778A50869
-FBA49AB1AA1506839DDD675A8AE2DE1E44E83D300CCC1561210A23D1A97CD590
-FC257FB5367BEF1BD15AB855D07CE21771EC8B815094721A1CF7306AFB4EA421
-DED331B92C7481C683785A92B9E213B04A2E07F420ED9B9C025DC23D4FA9DBF0
-B11D6948AC62ED02298B8F1C6B519364B6140AB89B4B53CF1D05FB954FE7C185
-4C63616799FCF3492ECFE06D0D1E00712756862C3F0C1BF21FF08564BE0A3AAF
-9364F4E7DAE16D828E7E5A2780BF6A9EF1CFCF680B4A96CBC4EC5DFE7E64E140
-31968BC00CCE67789EF5BB4B1E7A57D5FB53819CCDEBF38A555EC145FE2F607D
-C199E3E514EE3012CDEFEE1FD70176F39B5071EFB08DBF3FDC2DB6E89E2CB41E
-5F6B9528C7EDCBC41B3C4860CA7EB9C469BE1D5D1A9E590F6E721A956CC53870
-9EDE2D930ED28AFF92DC834913C4284847CA619D27B68CCDDA91E7BEB15F44E6
-DF8B38AFA1C63C6F484F0001247F6C60043DA83C802E0116A1EFF49EB943EAFA
-01412A0D518E2E860F61B649D2AC312AC6D84BD5D7DE93A13DAF1C4336105813
-869D47538CD56009E8BCE20243001E87020BB2DA91D83EBC9E9C98171F1BC02D
-56CF45AC7DD7358ACBF26590A7894CA6F99AD01351A384540B9615C233ACB22E
-519CDEAF5A0A975B8B6E7C711DD98603F684259B9210E8642D955A4F4D977291
-4C9CA4F59C76E598F7E48DCB42A331BDC8D4427A13468B735FF5D2F58296FF65
-180B22485EF5DB6838A5C049B1371571D7257701929CECD5E1A315AEF62E2E98
-2AAA70C380E40C3CDDCA85A71558E3AD0AA1064F840FF75334059B84A026AAC9
-DEDB589213D45C520F8BF067BFF0170BE3120A8F6E3BC29E4D1114DEBCC4626A
-96926AA20AC4396734C91808EC5DC632CFD69ED1D517D9ABC261E00815E1F3CF
-A4ECC31B5B0348F96BD4AF2EAAA634EC24FD310F86E5C760A122ED44D2962EDF
-06104A5DF36138284743DDDABC2EE689499333EB31347F488311A93DF9AC358A
-BA157B8898903AFD6CE2FBCC2A558360D174E2A68015A676EF8A3F0A26021B55
-AA27B65B2755F48A46920C0BAFAAE72E051085538F6C60D0A77295754C755BCE
-D30F94627DF2AD3311767D183A22D64480ED1E06BE21162BE345CED43DA52047
-3975C8647A025E2411F15A78368A2689E100D692F23E0FC660D321D55ED4AF88
-01532431864B03835099474C36F1C39C71173A04965719A7ED95995AD5AB40F6
-E8A33CC915D25C2E9EAB91107E89DF746FBC96DFD6FB7A9F020B0E3AC7C81150
-C21D9E5D9EFEEAB4BDBEBBDD705BFC0F3F52A77044831A6A0397DDBE135208BF
-1E86FE2830A8311768634E62B589921D1B5B1347ADB167FF9B410FE902ABE465
-2E0C320C3B5F7CDE7859749978D7C2C80E5FE38901EB75FC166287F5BBFA6848
-C839C5FF11FB245ACC7B6C8A74720BAA44625D84C721AFFFA310E52EFA782EC6
-96014134479A15A5C6DC7D11D8256DEA0CC645D9F0B0524D7885A8A59A2638AE
-9DB5273E3F3302D1C94C96CFC9CA768F3A1F8E41543A272FBB3D40D65D82EDD2
-EA11E127CF93E345E87E41401E2699FF0BE4E92814DD959EBF4FB412D768361A
-7CA5399AA68C6153C77FC080273FF4A987EB649C9F5C4FC18BF106E13BEBAE7B
-8DD477865BA85C53A797BEF5F177C053ADAA1EA2804CF04692817BDD0DAC9936
-C63088AA328EFB1B4CAC4079C2EFA244605E362EF8058FBBCE41C2774AF399F6
-E9949214D2EF9B899B5CC5F628BAD3FF2054AFDBCEF21A29783732F56C52D19B
-12C2301D5C525099662DA96E0E07CECDA9A2137655A3BE6F6F828C85408913DD
-8F31D8521A84FF78CF44DE8619B8E922CC7313090F45860C5847A50792518480
-6CD5C1B6471F14D10372AD4C7CE4FF0E6A9B4D2F627A74B52660794691F1789C
-BAFA5D38F92E492EDD7A0DB2D7E860250C0812522FC5B912CF0A39620FCFD304
-D67F4F79FBD079FC05E403651A30489B717FD71C42DD2CFE0B970460F7D12C2A
-04492DF55C523C5E9C62318FDD451FA5CD0B7325172B5A07287DC2653BC5EE83
-0B78FF312012FB0AE605575EDB52F2A1F16509C12EFBCFBC070A4F9A90E58F27
-30D5CEBDD6DA1D2D740E0EAB4AB226F245C743D2808C3D843722050ABB626744
-652B3D3CCCCB276343C1BAD5C4D307753FE781FA7F47B3D9FAD9088586FECEFC
-E0977B68BBEF19034F53FB1BB7868EFCE3F3FBF89A26FBCB3F8FBF55C12017A6
-4743BD2279542A3B824ED697B866609546A4C27D97DB532BDE215CF8AC0C5E97
-059A761A197606B6285D936096EBD2AD7DE53C8CE2B0D0B4F7E50D5E11FCDD0A
-2BF4736B7B9848FD1D4ABBD8A6F3903F1EFE48F0034F9C888923EC768D4DC7B5
-EBE32CE269396D9C198BAEC1076F842C503E546705FD1678E7C6B8C3F5F431BA
-1C63CC1198893BA77CC79E5829E39B541962F6B110E9CF545B064E46F3539A1A
-CD080E98DE474EBAD440ECA7E820C145955BA0B6CC80E7C4109185A3877DAB6D
-4886FBA0D66D6C3F619ED6A81B346F5A196D1CCB4D796E02C35E5301E9C34A58
-3BAA4CC1BFCD6B0906FF15F200FA5859E6CA7F2A21872A51B7E75FFBD92C3048
-9297C015A3BEFFC5B5D13A988AAC23AAA4F0DD4F86FB5E6FC8279C43A10D5C2F
-624E8CDD2C03794CE1B2246F7BED4DD4564395FEA490A41E5345C6F86D847D0A
-7AD58C606ADBD3BAE5E649998FAE5D0257FE2878CADFC7581C22B31CF420A0BA
-A3A76624A582909E209E53B462BCA38014162605977B87FDB8ED67757CC363F1
-A50E5DC6A8441B9406D874A756D91B978415651D91E8BAFF5879235B830E8702
-700D5A797B9E1ED4E04123513DD23604951C26C892004DF6B8DCE876430ED7E0
-56BF36ADA204464C0789A18B2C8F9B212BBD5E8C9E2925D40AFA394F8677336A
-C406534E239292FED55B20E5A8F986EA761D33B46BEA1A37DB3E76FEC6A5EB04
-BD38F5B8DEDB095993F81BF12936932E610D72CDA00A2D3CC2522793B7887B23
-0FAA526C9D42B6C087A936EB98B776EBC2BE5E2A3301AE9A91044DD21403B2F2
-976BE40E7374CB47148F8CAF85C16D7DE4CF8FFF13470B2E6925099C3C97219F
-5F967068A9E82488FD591A964FC3169C38AFD8AA352CFCF35D3E0D6045484475
-4EF4EEE6AA387768FE9767CCD9F81818BBC7046AE0C2B7B42BEA5FF70C65CD66
-2ABB14F1E1FDE651C260129E2235FF02A7F27F1C948CC500657A536FACA3BA8D
-8C3FB591601310A2315920555BE054BCBF4668DD8032C562EE12D2C7ACB9C50A
-11CC8E3B3EDCCA00A5067ED11C24E5F0037FB82955F242BDBE1524583D2B676E
-12BBD3C0FBE80DB47A23D4EECDD1F6545860A415AC6BD2E852A39DDB12EFC723
-D0EA87E1A454B661249959DF54DA9DA50970BFBE0113821F1CE71670827B443E
-6544081B2BE1260270A23E9417E4B0155A1302BD9845A5D62FE9EDF7D1172353
-85BDC4F2DB55CF4FCCA18ADE873B53FA4FE0B58EFC867599891A165631064771
-5CA76573ED070A85B135EFC0B619213E0518F0D4A95490C32535F66695C84124
-A1413AD30D918BE68A3335E65C2BEBEBE4E29DA17A0FED672F3B714F809C157F
-006AA925F96003CBE7DB7C7FD7BDC5A890B9EFE60E9915EE7AC3B3FB9EDB2CEB
-581E71527907A1E43FA1A06A12CABE01979FF0E28EFC4965BD7ED592142D9F82
-47BB2417B528590A116C791E19A006F274035B74C8401A35952844F22DAC9D07
-EB2F28E3C9BC5B8E1373F1538F67686055D1273C565F536E9F35225A67D53E86
-510F371B7E6BEB04027216BC50AC67B2C0E9F528CD55613195C351098FF6F9A8
-D713269EE95CDA3CFC786F8F28DC3BFA23C6E3253E4E5CFDACF097B862636CD3
-B7C78FF990ED9B7BC27AA51DDCCF408F0EBECC40E555250C8077DDA1646D8BA5
-00697705ADBC54DB525A131A1AE59FE8E7C3FA81A913FA5C6BEAF2FC393412D2
-685F1AFB5C1B6208AB5E4900E29036832E8942550F206D721A759E994814974A
-11EA5E5A027C3870A06622FED8632C3D125ABE15C71146A7FA4179DCEA8BA117
-E6CE9AB0DA1373933319CD27BDD4C69CE672491B1F15BC249B7126F141FD1AA5
-30121588773D42E0070723427DF6AFE7FAE3DC6B940EE28A8195489F1DEC2811
-A4773B6594A8BBE4F439EF76D5D4025BA7FE822A72C5D7DAEF0F1C88342EB016
-26203272584C62E26D16F6E1A5B37A65C51553F93ED4EB12E95D6F39DA5204EE
-62B52BBCE5F29A47D942F247A10446672FF26C6F710244A237C89A7BF6D86F7E
-1889103269B8932632BC0F0F89FE477C24133D8F06C1C74325FFBFE82B59923B
-06045FFF59B25B50897E71B8D94395A939C9319190F0D891C24BA6186900F8C7
-9824B378C8570583C5303AFECF6D32A4AA96700D915D0DA70DFF8765D44740B8
-518FE4A6A8049E3CAC9589A3C0752F4E0DA6AAB319E1C21D0A760867602A9CF4
-CB372F3F4B7B28712FDEDABA55A6B24B533FB96701728762B2F7FE2DD070CC3E
-7FAA0F6214500B495F5D986D13C012310BE12BF864B7928BE4FDD9DB68EE7C9E
-21D645094A676809C455F8AEB85E5B5B33F9AA13ECF24E5258D49D2B233E22C6
-F9926353011DA6B75D17AEB6BA6EC8E4A405181F04A656E0CAA13BD463BDA234
-5F4692AE9FFE0C4240B7F260AD199668D27C07ED34E69BA9C3E09AF0F18E5731
-71C576C4431B9DB7E83D645E7FD6D3DDB5AAEE00A9A3C806FBFFE1D8ED8D8A47
-4F69A5BD9747B6BFA7EA057DF540203AA6030B5932896D1E586A8AE9730B32A2
-8F6B27400E4F0773262505F37CAD309D48B02FDBBDE883E0DA5CEE4AC6B28AE1
-7C7663C7B4AF5EACD32EFC8A8910A3BD514B8E19820CB2741BED0C03DF65DDF7
-ADA651E232059D9AD05257A8B271BA34007E8E2D6BE190CCA9992011EC455E7F
-1443C4DC5BDF1098C399877B64E02DF566B5CAF6B8BE73CEC6A2651305E32C91
-2670B1D570CB8F2CAC29D30588D7C6D3D810F660F7BF30C18609D72D60FF745D
-D879957E4542F5877A05D0A281BE84656D3D9879FFCE5F667854CF00DC01B8B2
-38D2473544E81D8ADFE49FFC6DBA711AF38BE51897A42FAD78DAC2D1D08A3780
-50C9B002A9EA58E0DF5F4FCE96F3405C9BA1F32C91405CD058E9EB51C43457B5
-62755B6FA91CD94C22297FEB48DC03CB78C0EFA09C74D2E7A8FB253ED4F6769A
-E54731333C9EDF078829A58AEB8C1D28D1D7C852EC574B0E2ADB99F2A0CDE7B8
-4FCFEC125944835A8E3F1FB0C15FB669E670D2D8DBE24886AED75A9190BC52DB
-BBEDC221D68B88FF825E69DD69E61FC2E37459DEBABF7BCEBC179D4082DB17F6
-12408DA590D1F768F630951D7C72A74E5172F71C97624F2F4DFB37E4913BC382
-990F61400A362D5AC3A29D64F1F1BB24E572832C8A1A8983903D086ED747442B
-EC2DF2DDE41AD05045AC4BFA77F83342BC1CE856BA2359A66612962A5A2E0635
-806D70FF2F6FA279F639E5C38B0360C33A170362F5EA48E096CFD7BCBC43B49B
-CD4801CCD9E9C421F24B6CB3F793D4ECDF9B1713E7C141934D53EB8FF655273D
-810ABB04AEAB956AC369DCC11C17D10F08BA7F1BC47A45B3889068A169A22761
-52149F3BBBE409F8C28FB89460B55FCC0A357A14FBC50A396512CA588A4B2324
-E557EC51138CEA0ECC37980259DCD9E01FAC43FB9D7AD36B1D17656A932FE69B
-3D224B98F0E562368682150C9D9D4BA2907E4439BDB7A6B8F0D18F8CA351B446
-96CBAE1B9EC0C1BADD2EE20443E01570A39BE38FFF7A2329CEEE5EDF6B2DAA05
-C51F9F75B21E7ADAF05591569AE0DC92F469675588F12A28E84D178699FB76AC
-D75E66C0F26F4CFEC9BD0597DF10342033D0A2CDE6DD2576A651DD1855DC61DE
-FDD8BF33FE487AB7CB0FBBD811F413BBE9E23F2C832A654B37BA922AB7F6DD9F
-689AEFB8B49DE285E7CCA8EA94A0C45B5431732E81F5DD0FE804CCA7C82D5234
-672B3670A16EB11024C31FF89A5B4C03B28B2B582315307C8CE8686557A644F2
-65C8C2A9CF1C9A2862BAFAEE0E94AABD856A183394331992EC764A3B82EE4306
-2B40848D8D95D0CF561911797C9A2C6D9E334D3F6E595D59F54017218A8E6376
-39235EC929904AFA8EA42EFE54D294768DE0B68B4C1907F61662FA6710682673
-AC64FE11B84BFB0BAC6D1F5F90FC91AA5954BE48868AEEC05E19117B682186D9
-A0CFE621311708B56EC668EB0BCCD9E9837CD7E957D72AF5B562E51378E8A9A9
-34947A8BED94C55FC7A429E28DFF9BEDFB3F28E5D1A2536B84DBD1677320B132
-27F8A8DCBD4AA2B971F2F02817DD7753431BBB210216F822CBAED265C55B79BA
-D7D5FE873E093D62250A27022D63D7C0823E9FC09209550DD4BA413E50FE2DAA
-8D60AD9AB7E6FCE79E1B6CD6FA41F5C723DBBEE00FFDC8F614DE64DF40B45BF2
-84D3B6F96A1375CFE96E446E6757F31F8FD2E34DD88106015037F4F5B5D381C5
-AFA0D5724AFC260CE676DE70C666B34520FE2E2515D2C5194049F89EFB0D1A4D
-10D40A12986228BF3CADEE7E8C9564F9F2D61E094C44310FD5295C5AED950A23
-491431F3EE071FC38FA803DFC580A7F0FCCFF19F3D8CBE0D503057E95A2A7D00
-A490CDD1BDE01EC8370310A869793E4DB867496094D4B54B3B9AC440F304906F
-AFF32EB87AAE8075149299798E681B83D47935D93FD3A26302E5EAB671BC2C7C
-7E87A4C1789A772A9643C5737084462AF596F23DF9F36A8C00488FB78C6ECB64
-60A22C5D2DEBFA17E2A78968EFD029A29CC04B6E231B58ECE47CC6C93074F701
-65B19F77969B4DE3A7272E769CA00D5C481F5791E559F61A68CA64D4FF88D513
-642E82C48019C5BDDCBA0246448BCB765626462BA0CF6DE0E55F5C4090DAE3C5
-15076B25A8673D89A4DB9B5EC5B133EEE44BDB76AAED2A91FA68632997927EF4
-EB93C9581DA7663A24CCB982D1BCE9315F8F719E20C9E388907555FD27ADD8CA
-81B8A4C5F4F7614F15F5A6D3A542E3F22215F0DACD6D78E22209AAC0036AF039
-12045C916E9858E2C07B20B13B4715DBD513DB1003D256811D019BF84EA41069
-53731364B773A23EC103ED81FEADFF565BADC9B698819BE95D6386980B13D678
-A33460A92BDCC24FB6EC68FB73A8ABB4D240DA5146F04B1529EA28B8C47B661D
-3A27F5E03DFB5C7BEB8B1E6AC63E1CF7236198487663AC00BEB5F59EEFC366AA
-C9FBE97F8EF03A80F37DB7F1D98D5994203FC3DAD6EDA29CE5079E09D504E360
-902FAD0E67257EADD77A989756B3F1B866BE530583CA81610AF81D516A78E37B
-4AD1D27A2ECBF67AFFA6914F06CA73AFEC79921474F3BFA2D2C169A7666BD668
-821FEE767FB326ECA936FFF52FC87963027983B23751956C9780F1791595C91F
-3A5B497D8107667B12CB2D31A64F16F51485CE00F376DC07CEFD4DCFB7A91C27
-CD8F3584B14CEEAEFB824C59FB4852C2F285159BD37CF3E3880F47658D3799CA
-E8DCCD4C79144D1503EB5492670440976954FCF0487F54EB23A1CE0A139AE7E6
-3F34594B7F85379745113C0EE8D05E10A6E740A76CF900F5EF056DF772B07258
-A3206320647253786225D4CC14548B1750CD034CBE4FFFDE56CD84B07896D08E
-2EBBB9006DEEFE45EAE3688F06806CABACCB255915C695608A6C99DB3AF5A6E2
-DEF0B77D903B0BDBA16C66541905C737FA79CFEC143CC89C4CA56857096E7A07
-B8A0E2E16C778C5C929066AA567449553D2824B68EFBF7D7184E56470080D7C7
-C847A46A9C6556560B86FC1F82B7231742325E718990E81FF7323084267F46E8
-9F4B6BDFBF811CA84296216FEBE788EF20101B48EED478454F1B238C03A1E0F3
-DA386922D1A038EFD0555799B29712FFA294AFF0312793F2349B1DD00E16240A
-6AFBDAD7B8AFFD1AC1AC380F35CB7DBE92D517408EE81517C04D9A82E1A6DB84
-EE4A6EB49650B0F94A64500A771CC0788F0CF8EAC76EA80437DA23D05651F9B2
-65C5112FAF87B2AAF4A8E07DB8762229DD3C2D74C364ED6F41E853DB2B6DE3F3
-9AEF626535EF31913165796AFC6989371B04BAE091F9980448315E43B29AD252
-5676CF2B2DEFBB0702007DCF4F8E2BA032714676CA56CC18BB378D138075DE54
-316D7F4D9C73B08A83FBE43DB11606B0520EB9C929BC4BA925680FF37726F65C
-2DE1D25B9500C2C2DA7592A5212290DEE61552175001675E3258903873E9F3F3
-C2D5F7F57B1ED253596425E95743F67145FE18B80AD5194096E10EAF1329BAFF
-C5666BBEFE818C9F88ED0A728F5A791C297C97B4B398621E921419358666B69A
-63D129C875A930087A889420CA64CCBF0152CFF788360BF88A42464C40D03B1A
-1A342A89C26CCEB7014C0A5A1669331D918604AA43AC4A0FBEE0A39DB47028C5
-44074EF228719E1C3CB91FE9F053148F3FF3BAD16CB57DDE5E3E863D40632D10
-68E72FA28B258913E38816D9E0A25616A8DADECAF0DD52625FC5BABDA943017A
-3B36959C495A114346E805A9793D2F30C5F7AEC8CD082DBE1386640593ED1E97
-63A98310C1EA703BE2AAB203095ECABD48D761E92D614233788E4FF98C154A95
-15B460EF33121AC9EF0BBAC00683346CB2586ED0D18A62CB0D6DCDA7B0500843
-B07D9C149678BE81FEF9AF9BB18D18B5CDD59188DA9FD6A79822A69CBB9F0A9F
-731FA4955946D4363710FE1AF278EBC8792158D431B74327017814D69E5ACDE0
-2877824093AD46C7FE256D4615B6A2EC4997310AABAE4F3CBAB629F1522D5B2E
-5B43E931917589434F5731D5418AE96EBB0C07573EB153A6E5442202BEDB507B
-4D09872458F184159873E21F91F999DAEBD2E29BE8E82C6B796345B715693703
-CD412195D1F170A2B2C9045A4D3451752FC1945F82E92B07F37828F44EF2EA61
-77F614FABF81162CC1ECB0676E8C121CEE5B20F325993CBD2AEC8B7BB1D8B1FF
-85D6D33B75BEF89146FFB0BD73DF334DD1A9396861EC67E447477A00A4276652
-F67B8FBB2AFCAFAB9C3A14B0F7BD3F0C54CBD763EBDEC129DCD7A7DD2D6760B0
-460EB2E5EB3414C87365BBD0500C5FD4773525A9455BE7954C616C3BC0D892A9
-AEBA406B14B5D5340785E7EE4C2DFEEED396DB448F20E58725E213DDD11DA1F7
-000EDE41596161C72151B05D902FE2E3203C3C6458F3B462E07FB0C40FB83FF8
-375942B9C7440A0EFCCA65322797DD2401EDB69D308DFC579403609DF855E29C
-3E35687C40EEEF2D02A2239181836DD51D99A366D88C31AE289787211A3D5FB3
-0BF10D01299C451C4DD869B8BF132018BCC45077647F72889EF81A5BB63669E1
-66F5EE6FA504C44096F7AEE1031A39EB8CF7902D881F6AEB66CAECA514618719
-2F4F459BF2E7E6E2462318279F15B1B20005AD6137F3A4F2A810A7F08D3E0BCC
-4710DB79054C4FBEBE5AE07CB156BECB6316065D24C92272E276EDAD21FDDD29
-E1F4500E0358D8933DEA0609C49DC211A7A592EF2CA1AC5108898F9532311CCA
-37C83333689A12AD0B185747D23E12EB86B0753311DEB69F6F471E0F0C99AB14
-CD4FA8E882FD8D6A17FCE3B2301D85F0FC49ADA6A508FB36ABDDD7A8835CE644
-264A62708CE1742A26ABD8CC7DCD1FA60C856B96F84EDE061B534431E012AB5D
-93FAC0808CA1629D45817ECEF15B78EE77BA22CFDF620AC795E4FD1965976657
-DC97A3C35B513C8A31723C902D38F27714D3CFE6AC6F107CBD8B2E99FE08AD85
-811F052B6424524B1C049EDD48BA6F8D98B7C71302ADF601C3E5BA4BEDA0C7C8
-C1BF6E4B8079B303D30D0434B7F2E47FDBB7C46906AF947E7B5DE1E6ECE052C2
-9935D2985B98DF860982B3D044D325306A769065576686DA5F2E552C6150F5C9
-25D0AE2009A796D322521BA3329467B6DA1F629CF9AD82F9F9BBB30AFC68CC30
-97440AE12F41C7E4192D740ACEFACDBEEE4EBDC3045AF2E1E188FD6E1DE499C1
-E1B3EE148659DBD3B4EA6215791813BFC674D4CC8C066771F82DFAF4C5328AF0
-6292773E07A15B213126F96A3634CE70FBFA7DF4067D540E0C951F919DE5E0BF
-DC2E1B37EDD3B45AC9F009412A6A237E7695AEF028A8D9EF4905EE593FAB2BAD
-EAFDC2DC8455D087E72E9AB830108A138EC1D55D38A040C1A81A1E1E8B95F381
-9B44E42D55EE9057010BD0F7E32AA87D636CB9130F4793DB86131B9B2E9068FE
-E8CD989A94FC0FCC144CC99B52AFD4976D651C0F855068753303593FEAD53AA1
-2CAD243638618F68068005C923E681D214597570B8C418C5F1B606D33C0D0C54
-3FDA50E8CD52D8ACDBA45C88FA875BAB5E4690F866E154C525BF02DD103A7567
-70A307E5AB1EDB318E5E32B6B40A6995666657136B18F9D45E0BBACAEC4332B8
-606F8473AA0971E2B4654209B2353A94C5E698519567EA54377A533DBE6B0ED8
-FF2D5BC21D0EBD7E1FFA597B59826271C18D582692614A48A433A3ECFDE25400
-C4243D260370C6D23EA8EAEC41B3561AA399C67F1E558A192B13F258945C318C
-8B5ACAFF5793CE0FDCF1AF2A05152489398AC405F24C24C4B377F5D44EA10C71
-2D9BFECBC713A9E8CC834E52A5A9D58E9964EDF7BC4F1C0040DECA723C0F5C4F
-1287CDBA5314110299A1CCDFC00E55759606AF2C52B2C47BFD3FF62D892723B4
-110D26139780B49E35D77D3C5FCDC51A3B3E2C64AC161ADD295004B271A75823
-D79AAC2D931232623409DBC3224E61CB529DEDCFCD86EA583C4097FCA9DBF18E
-19700118D65A186F94C261762E54AC0A6FC47F4877236EBF23B0E497F6138D75
-0E20474E2D11E68F7CCDEFD46C5D62E81E559496AA830960F6DD379BA16BA099
-D13AA5FF5DA079A7ECA28B701CB49297C5F2E75A1F851008A0CB290DD0EF6E27
-5A8E785398374156FCAD3D45E704C6DB247CD56BCF919E836DE2E52C9FC0A8CF
-052BAE14101DAE8C43EB766806E26BD91F48FA455C9269721BE8492FC68D8AB3
-01D638D04856E5D203D28CCD8B702B90F32870D104787F8EB6D61648417840B0
-924C38AFC4B7CAED1F08E34E1A3D46A545E86A4A4542ABD6606672C07684CE1E
-D5F2CC4049DAFA3304817E05C5945F70A251873D93DB4D5912CC4A3BA082A05E
-1BEEE45050212C93EE272E8C33AAC196B201E6345FCEDBF5143940B5D9263C31
-B8DB7ACB464E0C3989A8AB68EB7DFF28AD666AD3BD003C2978DCBF5602107943
-E5060D5CE3E42F27B65F058839099C2CF9B7F045D1927C7168202D39C6DF70D5
-00CBC98EDFF8837D6CED471DFE0E7F84AD5BEEBB25F619D672D9EB812C3B0FAA
-9547AD117E6E27D7979151B2512884799AE8B4503308345680D61CE8FA394EE3
-4679989798DEC5B494EAD4C0ABFA713281DA98522810589A2CE473C8C3E448E2
-57BD26EC6DE17D8A9E1847795597413B1D80675B79D0AF56E8D4031300081FDF
-1406B9A2952EFC0F2D086443FAA4D96EE5AF3AA562F67F9AF495B0F9FB438043
-4F955599A04824F8BE5CBC825EABF544158D99FEDC664150D66CE9C85C08B720
-7B33BEFAC455833F57C43CF481DCEF552AD267BB90D0EB2662BF6CF1945822A4
-4EB709E8DE26B4858A75CEF9689EDF05F91BC2BFDF73CEE6B9090A001D97ECBC
-7CE94ECD059F992B608A19FEFADCE3B5270A8641DE821FDD3EC1FC766F0975BB
-8DC349EB7D3179749B16832C7615DD310F815B71717495308C3902CA46C044AE
-78FDE58FADFB233DE8DD6CC412CA9091C02B44FAB96133F0F617584DC2D5C51D
-CFE828040673A5114DDE42228F73B42E1E7C9296C51BB657773D8F15B0797AFE
-E846B26599E20C73E1C9620FBF224446A7FF87ECFE64DDB0D45875B5CDEF1C8D
-36D20EA6F90E09F2A3EB423611423370EED5DA83D5E845051C65755A24F7E11C
-DEC48C78F1FBAB97F6306FF2982E3B61C3AF46F2CA65BC15EF35803370FB787A
-0831506C9FCAEC8299005C68DD453D2107EACFDBFAD9F861BC46FBB3802901BE
-1C6D99EE609C7D9712D9756749D7E8E1FAB8231A9897CB4D7C95A19B734D1631
-71532C43E1E247CDBD404F33B080A3202E23B6F7549C7E8A8F0B050E3DB2A89E
-1E30428EB2D2476F5F275DDA324CBA55D3772B0C460D711FED6D6ADC43CE821F
-683181028981AE66EC16BE2D7FCC2BA13BFF93F3F1BB1BA32DBCCBEDCD9F793C
-30C078A839C27CDA29CB694C74A70C86008F4F2B2B8BACA49ACBBAD11B0DF198
-184A6F107BD42D6F129A7DDFF949288AA27C916694D62C9AEFA24BF172F43B68
-930F7E369000656155A593BD360E0DDF160C273A4B3F538955B11F25846146E9
-4CE0A3DB78E8BE770A7B83E0043B3BBBD60C0333AC55BFB8E1503D03A37803BD
-841A19848AC9AAAF32AC249E880BBC04CD4396DA8F4CFEB6BE6E9D261A3FE54E
-C3BC8A01257D032E916CB34C9BC20263DF0828B5F94FB9006B09A00AF195AD03
-8665CC1E7A772D9968D35B5721163394D221147232ED6682CF081607D82E933C
-DEDABB994359350A95AFF6153F29CD96E4C3FA1FF186BAC26D6B41E275D2AACC
-68FBD05ADA7BB1C68EF37508607C9A81151D88FB40E78890E76795009CD1410E
-FAB3DEDE1A0F2E63B8835743AB5582F45EA40C86469A140B33BF721B936FD1C8
-56D1D571B04E8CF1D856DED27BF608FD3286E827984FABB52D7579BECD5CEC42
-A0880A44C230C6AA718EA897ACFD482E0B79C46E54F6338EA5C58BCA595D735B
-4C1D3C851A2CF846E86D685E6667B8A975F38DC802269CF7B1B0626E5E435448
-406913DE4D10772741BD203252280BB13624C2C56E861FDD9F1E2F9522FFFE42
-AC2E18083D916B54CBA60179AE3ED01FF1792A17DEEF47731BDDAD86ACE50673
-1D8330252BB4D8D4CA0D617B0064FC1F13317F799C1A9F368A3E0AEA888E2BFF
-07C78C6048718CA2D0D5D1A20686A7C44EE73F6D749A9F0A6B978A4A522D3E18
-C4BCD89CBB1151324182605BFDC24C6C450E79EB69E79A420B2E271CC1F903D2
-8C1BD054304250E41624F1FCFE70F0509EB8C6D0530E1D6BF45604FCA1FB7D44
-FCB548EE92CC85AE335A8DFB27647879D0BA25409E4066B4F708D3B0C1FEF15A
-80892005B4CDF4DCCB2B62AFDB72B1E1B1A172C313D7CBF31BC56C897E8D266C
-AC8D30CD36BDBC6FDB790FF6FE1658FBD3244B447404E98BE65368F48B349003
-3E50B4F6F048042CDA62AAE7C6722BF80D56F1EDB47B87028D85081289617129
-15B21BB051833AEAA4BD415D04208A562D73F149543DECCC768AB03B0EEB3CC9
-59C09134821939FD322DA9A66B4EBFF6C0D10C0A973DEEF572AD5C92A12AB745
-84B1624E7200D285783930F51ECBF19AD8E48E709893EE0F1AB7CDA6CC7C1864
-F16EC1D3FFB6B4FE4DB7C9FB1620C3C0861F900FDE317599B4F050D465A662F2
-DA6E93495CFF5DD8EDA52514F3F8E6AE745AB86CD729721E7A3CCF64B0F6360B
-A4F8158F4B952FA4CD3DAC4F5F81C4C93710BA738F96DD57595D424F45CED71F
-6F35820FDCD31533FBCDFB56F354935CA0899CD8581ED5EEE2F85C135F50B43F
-3725DC1EDE43BDC851AEA1AAE8520CF9DD760A42C5D0B3754C7B5C44CDC502E4
-E74830EC45840E287ED7DA2E98260742740D9B904E975F3F8E80D7AB57085C76
-5EB2AC9DEAF38B2E1BB7D50CA137D582B954FDC797845B3CF623E1F243E9B65C
-87077E67C43FB6258770D604E0DF9FD9710B6FD6AD8985A07820C47F85DEA767
-F55210F70BD45DE7E0F3D335BC978E738F274593DFE14D6489366974AE4B9286
-EEB9A4C1A712D6C2DFEFDFF7921BC6E31631390B8132B6E62D6EBABD4FE38AFD
-DE7E0A7B6F783786976EA8402DED90B067E1D85CDBF13C991B4CA2A626A3C8EC
-21B13B0902AD8389C71F14B810E40394EA7D41CCFD4D13FFAD46BF4EFCE250CF
-B6CD0B203E3CB540390BA8DEEB217755C284C824DC9626F917D119934061656E
-6836B119CC894064B51B9FF73B07C559C366CC952531FE858C3B77706BE21A40
-BF0AF668CC376F042E965BD12B020A06D44815327D9F24C8BFE5D4949EA85FFC
-21FDA7C58126B3F5CFDAE27A926E2E45DE062650B615568736B10F7CD8EC20E5
-19773FD4B559D45A18B152315D45FBFB4B57A969F81F42FCCDC15AC1C6890F75
-A87877B75A14D38E37CEED9B5AC39D4CB8E0A5ED6BB09A94E32BD33AE9B894B2
-9757CB08A99818058EEE75EC2DBDDA97A2425754D9D31AB87A1D64700D28DE3E
-3748BFC11DC5D134090B50864981DD72F2999191AA0111F9A23E62B37C67FB9F
-704C3BA150E4227774487A3397141BFDF8F6DDB22AFF40F61E05BBEA998A2A7A
-553071533382226D9ACD4748325C9A90663913F9BD84C40C83798985BFF131E7
-8B3F8DD7214DABC6F29D83E336C337F936CC5092B8064031C5C67AF2563C19A1
-99E220085C7675F59AB67800B82C287908180C25229B856AC5B8A63BD0F0342E
-E72FEA35B9EE85DF933DD7FF42E7FEA8580ECFF435B8AE058DBDA697D1FDAB45
-50F396FAA4AD315A892691D39ECCE620EFBDAC6FDC6FD387F3F20038680DF50D
-9C1B28E5CCAE7CA4F11797B03A39192197F1F89E080270EA3FA549ACC696102E
-3D1B1E762A061D6C772E72EF6BF67293A80A290575990CD2A04A2277E23A29B6
-B0936111C343C67998A3D25E726444CC87E187C602074699801FC24ECBDBFD1B
-E9DD025C51EB2B93387A27659569A2E0C4DA2A7C3BB16EF63FCE6BC8DE27D058
-A323AC3A394005F31D8900CDECE02D3DADB7C5514A6AB69AA7041D75927C0FA5
-A9D40AF9433D103DE31E080F65D1D3D2AAA482EE9432F3CA84903CC621E1DD58
-72CEC6ECF9C4C4B3F854777B65215D7909A15260D3A39CAE9DCFF36B6B341FE7
-1E4A75C5F8702378CD5926103A2192FED1F469C2794C0B6C0918F2A85F512C69
-4B2388B7F553BBC5606C4CD3A23C34F60C4BA40904CEA9D7A82DED088E2127B7
-5151C37145DFBE0FBAF3EDE7828EB3553DCC7CAC41B4B4FB522E3EF6153B9275
-F71917D930792C63680E93C025775367346E04C4B34FF74022A327AF9349B223
-DEBD0AA515BC86E247AA4D797EC20564D1CF0FFA853C60B0AFF544BBF6E82EF1
-6AEF5CE96D05F66D650B4722569C2E05DD039F91CAAE1473E811005434D8D95D
-C6A2071D47EB515DDCC5D9AC58F36ACCF2BAE3D0907CA43FA58DB14AF6D5BA40
-020E8CFF4AF7C80851FC81EF583ABD9B9ECB4D7E8981EB6D4FF6272C7AF2940D
-53C6B3FCF4953344C70616BBBE917A295B491CBCBA2CC73992BBB1C037ED48D6
-CF3B80F5E08EC3447D297A8214872A48FE10A4FAB74EC700B71F2F6EFED27FBE
-243544882B39F3808092361C9F7050943AA4F6D569B67E3436C004987FEF870D
-1CDD98CB5F2ABF72B6E78719A6A6D95E6C918D5BECAA0C23FC99B526C7C8D0C5
-B9E17494C0995785EFAF555907AF23ECB761F47AE1B27ED80E988640D8854294
-5296708C4E9D46B90231DDBA9A15D5F8F2CD7D0E1DAEBB91CD3A6AB60D16024E
-A61A84032B1259BB68A3E8CDB78B5C67ABA884FC908F0E0D0B46F297402737F4
-B8B40A13C9E2B987BFA3C1AFDEE7B962BBF7118E8063F83CFD19107A5B28E0E5
-FB38E0E26BE4E46A68BF0CB2515435A3C9D3A9FD61ED73B3CCD70BDEA56768FC
-7E90410470B0087F9B123D986006E729CDC571DB1EA3D713AB3CAC52C42472F8
-A7325408C9416DA581B49C709E1E35C3980E9F9D86E292D29C24C169A4035836
-749A9D5475AAB3DEE92D6A0666D176D9D0C2D28183459001348453241F632A9F
-E4F5886355B548B13CA7E9766263E70514F495EFAC23DB6F5970325D079F63F9
-852EFB7B135172F5943B51294BC44CF215D7DE2BDAA35FA62F2358A8307D9C1C
-7ECEFC0B93842A762AD1F8E6488140331A7DCF8F85A1364390E213FCDECDF652
-803860AF5FF323B7D0314EC85BA7CA22D6E83AFF66C961C21793601F3D030BB8
-16EB9A3E7C97041C6BF0D15CEBFDEE1C2B48AFB25F7F588681F9B3EE2D5C010A
-52020C0899CC36A1C032840171BB439D30A9D6B0F739910D8A90E43EA370CC16
-AA8814F65A26CF0F7492D076115E91DAF6A118133AC18779FF3595A42A12BD3E
-B61611A23E8631E780B420EA0944BFE9E4E97F5649BD953E8E2981F3D043889D
-F06A4C62B5B90F544BD3E98BA2639AE0AA2190693F4247A91FF8B227FE3FA527
-F11EAC34057C446210043E19E2BFA0C695F33B2F6BBF4CDBC07917E433B4F5F9
-CE078FF709CB1A57851D117954315C893AB0A2FBAFE2290E8AA09ECE87887717
-549876185C50621598452F23CF40207BF4B4171B13E7413379748716BC624AFA
-BC6C195173052D303AF74F95499180AD2D76360521F090C99C675AD863E46B4E
-E7F7E6F0B09B4DDD286C3F9A742C8B909A8545957D3EC324D04E66AF9F8281E7
-6FDE2A7A9E1710B452FF4537C19778A9BB296F4AB176C617A6F1B1F9076E5648
-9AA802B68AF5A81208EC0F7B829039C5C6773EC3B80479FC482F9050079173FD
-9AC1F6A89862DD56EDA4A054E7146975EF106222B6267415CDA5EA2E8DCBD1E0
-ABE3A94DA67BB6F11C66FC5AA8EB61E55792C18CCC945D16BE530ABFCB14DE75
-8DE8D5154E6AF9763FCC5ADFFA0D25DBA667BB614A05E3BBF945B294D64D1266
-9579A4BFADAD351F343B529943CE554FD40D52A44A7180CF894B0781E63B8E44
-62117D0F6EE4D4700D903A72676F0E876939DD77B217279327D372BD4E69B367
-68E654E9F1A2D11EEE90AA49B462D517F76AF2660BF7282F4C78E1536AC5C130
-0C7A4C6E0D698D372574EAEAD8F979312D648177DD0C724CA7400B8729B0003B
-CA47E02E1CE0B32F3A80AC9399517175C47F26E5FBF6AC5E73D178E7DF67EE79
-5EA60CE56EDBB227694AC21A0E8771B516768CBE2836A00A14D608D9D32A27EE
-E2ACC8CBB9D5DE7BE40B680A7FC804F7B9A39AF6E829D112BBF57DCA2D408240
-9D2B89107BDEBE8F4EC1EE8CC6B1F89E78677B8FF2FD7384EBDE659875462F99
-2D4E62D18C0A8ABD3B87D806FC514B0E5700E83D16CAD6EFD00C79D624FE841C
-7F98DB4ACC86ACE1776DF5439E425CBC1C85D489E4D542F504D384B09209BFE4
-D3A008E069B0FA3A71CF68D097FDE55712C7E6A5BEF6CE8BE02A4E92EF5231E7
-0D8905EF4FE0D5198E32511F945E1172182CF690D7A769F8C4F76754E5654BD2
-A9F9F23B6C230B10E3AF6CDC745538D174A75B97A3CD3697814180BB1373B296
-203E523EE5B64F1EFA979AEB8ADB60CAC313F117EF8CC53FCACB4883E26B0927
-7897790E4AABF9667F9A91AD32AB1C5CD27C26C5BBA5DB8AAA7E7514A239227C
-D798DD6AF110481A99753FB9B3D570366DE14F6C0AB4C31FE068B1876934398C
-EC2298CA0A9EA5BA245907DA786D901579C497C3739BCB6A4DCB2E34E21A53F7
-6F673C1131F114C05FD1D3B37BB435B726AC2389DF866200A75A151725788CF5
-69C1BE79FD6FC36625BF73CE46A4FE5F12E5692B47F7C26376DFDEAF5EA847F9
-367997E05255C7EC67832533922B997028AB8018F404ADDBDA81BB0698AD69A2
-B4C217C392BB250B58BC4FB901F2912EE8EB6703DB24AD7C2CBFAC12F8D081D0
-A700C39130316DCECC18E64F3994E2C6F5E0E1ECF2EA4B18FCB424D9B8DDE8E7
-ACE87FA17D11158E96FD6EAD04B12B8917F420BB29F4471326F54C896BF1A475
-3EAD86C7968818F95E632A852601C07CE9AA698FBA3043D86168FA27FF43DECC
-C71581DE33FAEF3CEACC93F5D626FE05894F8FC2B8719A92261A215929127FBA
-BD9157BCD9D4C5D62D08E7E690F1DEBBED0A839475B1427A7C91E7F42C3CF6E7
-80E8B55B90566E21214A4AB708383F0A3E0406058E26A1C34786B860EC597A56
-2E33F58DE6C6850B71E88A2BAAAA6CCE519055463B468E49B2FB70CD32D84B8A
-8EA3077E49E848149B2A46AFF247D80A42CEB44278A9341B4ADA55162F67933A
-3BE72A237DEE6B9CB4826D4584623FC93882C543D173B22CA22E6D8D5CCB02D1
-25EDCD56559CDCB126185BF4128C71F228D7CDD7C617EFF12DF100F64925BADF
-39E7DD693362ABDD7E17C3B21A74B31D05C9F4F067BCC1D0AECC6C5DF33D4C77
-04DF0394656DF7F564BD7849A6EC8A2A0007E6D32FDA98F7903CD8DB16D85DBA
-47416DCB4806AF61E901490C8DF6A42D050C5C07502E7AEC9C15DB70BC015E02
-9696950D94CD0A7E8D46557DF9226B1369975F6276182B92056065B2548F9717
-05D488542B6ED9CBE2898A37C41F3093C8441502585D607CF07E8D1473C48D29
-68D4217BF4B16F8BB279A9E7F4F4CA461A9E9FA912C1BA9355A4261438E9CDD9
-20B0F7E2C324A89BBF23E8973783C2367AB9C59693E1C90D3466130C0154AF7C
-008E052A63DD8EE001FDEC48EFEAF1AA7A7FAE4B10D79C74E0586CB3E9809DA8
-E1946A3E2EBF15DCBC950914B860ABE6DCD273FF45D57246F81DEE176B7DDC9D
-C5359E1291B5671AE9FCDB06DDC08FF46607E784084547AA7848AC30A32B08B1
-3FBFCF2829821733FB2CDC11AFEA7DFD97B8D278DA3A8258C69532DD625F204C
-81ED8DED59753060C83C4FD0B9B4D09E1C6483637F7C8EED13DC01C2F477DE4F
-5AB6D45C17BA5B2C6E8219B46960E39695077D2770AE34FC50510067B89736E9
-D172161F0F1E2A7FA79A400F54AE4F20E673A3D91D892C7F88BE4237F1A3CD55
-BE5D1F91FFBA4A88397329E4B62F9170AA553B0E7BF2ADA42C4AAA6920F8AC9B
-0EF3425BA25C2EAB8DE2940857712C68A12B5D56B9EBCFB4F19F63075CFA8E03
-4255EC777F9FE32E47905F950BA371B539D7F9F55C21A04F1AC6D9280E8C5780
-014794256AD7B05A69B84AE84337B5C678E43BEE8445C0F79E621DB4AEBA9188
-2410D0E6720380755B4AC748301CEE5A235FD0C1E2D675C147F3C62037708EC8
-0DDB1C349FC6ED24879F0202ACD4C881DFF4BA4116060E65F17F07BCF2CEE0DB
-9E8FB76D0F8BBDBEA799071F08AA753BB3129FDDE4D12B32F5D566D8C9D6A35B
-4A69C077A6BD909F1BAAC2A2C62A6AC64E722D1985CE4E8771F53170A20D8543
-29D11CB175BBD9B632C89E4A12663C0941091A1532DBD59A65CF6D44AA4B08E9
-7B5BD346182AD70A34A2527E352FAB0C109AD72EF443A5AC713C005564373733
-DAE20E3198295D8DC532ECB3F98551F84AB2BAB805F2EC2669B01F1F5F9538CF
-F6D20E05081178581990783705E24E9C25E2E82D45541E5C16A30A72E2E2A168
-129A688F199DBB9575345ABDA993DBCE8CF4DF1128B0E74B6C01666CFF1A17E3
-DFF06C8D3FB42097BEFB1B33A25F4BCC9024C29B4650B43D1CC0B79665D05D1C
-751F94FA99175C257EA991E6B704B75714FC7FC9D5A34A1A3019AC5D9EA8AD7F
-6A75CE3ED13ACE632532BCC589F8E94B8E08805C56E3D91A6C7CFA23CDDC4767
-BD735DC2A7FEE4AF8FB251174C1015127CB8F7C8BBA872BE416FEA0D359CBE84
-D915D1E8396E1267018CFFE5447CDDEF6726F47E499613589B40A72EEAAE768C
-9FBA53FE832BE227F605E4D9E67FDE078120869E5F71E3F05A31CD37A8E48458
-6BF4BF69736DE755C90D6B88D5FEE096ACF50F5FE5523138DBBC095DB9ADF46D
-BE0384A02C4ACE11DDFC5FEECD1E0C4F2554BD6F1F235C8F980D87059DEFB98E
-411320060518A16DF3DA0DD8313C305E5355FA2131E16FF6A19EBE17619F5773
-8C626D6BD2B7A95CF9FC6996DC514FF0915A585AD3C6746B694CDD7CFAEAD58B
-2F842D764F3D0B6AA582D3CB96632C6A1AB14BF49BB4F3CF59612FC40CF63A5E
-E1CC3E2FDB2122FB8822F3A85A4AC58683CDDEB72C34E6E346DDC00FBEB75FA1
-3E88EC10B348E8D8DF2053EF2921E8BE24A1CC861268AC66CC4647FED7EF6ADC
-287821A9B3AD7191E9733FD34629DE60C47417167ADB5C3B2ED7BAFD2278E698
-6240EE28358460975D3FCEED4C2065CD0FF3AAD547E1C63D37EF2A94BABF9B0C
-9525F03D5385CABC6AB58077F2AF1F9FBB419BE35A8980178C27E4A19F30AF35
-A48B18A129B900CE280C100EE5A40C4E6E393542472014F905C266CBFC75ABC4
-FDAC0228A9E73BF3B268D9736A3F8560E78B48A0D7DD43050A0D7757A4BC7C92
-6C066B399F71CFA5BF090EA459CDBBB674E03757179C43CC5B0FDC950D6C801A
-F3D07AD30F08A6D299D1E784152103B54ED264156A97D64AE4FBDAF8D5EE20DE
-1B80A4E6AFB427A0C18DA8A43ADBDE1BCE9DD46A75C1A1D15995370F792BF843
-02D4672D4493773F5907A814ACB139498953B52390D84EB4474934713976B9F3
-BF26CF310A682FCB955682E4699ED265B520D5D7800F9311C6AAAFCCE8E92435
-E7681D56C537A1C1BBB1C2CFB94AC92D816983C97614E26B062646E2C8808D07
-5E18B87ECCE3A0213EDC73919F7C9D80536F98DE0B9995D8EA4A2633D2E05417
-AF3DB26F9268647AA646C4AD12C3146745A411ADB2502D1ED58E46B7FEEC303D
-87065F9B881907F127E02DCD321CCC580C89FA6B3095F607090B2786E5848D7D
-273B36207D75A008365C5F1DC4F748E78A6F791ED81631D7EE1E6D79049B8F2F
-B7F38FA45B8809B4BC05CE91FA3C2F6F6AC323B3D304E8EFEC54E20045B6AC57
-D08055CB193CAAA5C53454E279BE8F7F38F949EEBF62795AE7B5DD0FCAD1C3D6
-4AE4FBC6186C750F3F2DEA0BF8B65491EACE7DE5635470EF6F42C3395D7BA0F4
-A0DA6BB1A99FEDBD90A551FB217644CEF9973BB90A7FFF3318499582A93468F2
-9E766C2906BC6C4BD7E300E48C997C474C03E2A34D9B969ADA9AEF04843367D9
-AC4A08FD88BB672F2DFAA2CD0B871DF62A43A61AEF77AD88ACFD112850940CB1
-D74CD733FC4DEA77C454A52ABF2BDFEB9EBE3FEEED53CE6D4B1968F0B2BE90C1
-12F96E7AE2CF62F7C2601B589A92D8B024E00D4E8B1F636884803554E9B82005
-8329EDA334D1DF5EC7384418609A8D89909245737689B1D108186F4C53237559
-EF42502050EFD6E7F822F835517FF93411F08B5FDF163CA1A19945FE51C31F9C
-9B1EF8AC79EB037F1E704243CA1F33FA130F8DCC3F56219CF6987AD73627FFF6
-1CBE6C8911831A43827D5505C1289A62C7AF94DC668300057993FCC20F752A75
-5E79244AAC3D790CCBA8222CAB05A953BC9BDDCCC59E1AB9F2CFD3480B836B79
-5C74D384C53723CEDC5E42212CE487EEE190F6B067C322610A6C17E0D84A7DD4
-C3171856FFA19470F84E207DC9BEC7B44C3EF2BB5B043929A5E900750D117A20
-EC2297E4E6AECA011F3D08B06593518515B495DF8D64D3312AFB918985A3C4AF
-173ABE8C26318ADDCE1C262B03000CAC5B5B4505B26B26A028496703493D3AC7
-E24AEB4F741A6E4A68EEFA0D156E58CEF880E0C41CF6291D0AD20D299026B9B9
-D09BC425FD7D7EE59595CE14CDBB36CB4763AD7AA8841DF5C17FF3A4099BEE95
-CDF6DCB8F9ED7E118BE4F2D2F5B4D67A2781F1E2C1DE8CA03022C964B1337830
-1E20572FEA296D9FBA4FA416056378BAA8A86C165A39EB148B255DE0E7EB6351
-EB53F4AEDD8D411703A3F01159BD148796A1FF52666D962126FA863C9811B3B5
-ED20ADAF32EA3BB018EDE34276FF46A7153235B2E9D778402952F2C73CDB0290
-3C24E2BD7C74A77BC339F7B421983E6146F64718605DAAEA2914F3C4AFF5E078
-63B7DE54810BEE9F140B9F4B0B84521AF90C462914CECAFC07EC0617A189158F
-B4EFE2DD47221780D87302E00B139F47239EB174102E7304F6B83B71DB890422
-CFFB05C39ECC0EA883849178EC773C3F0C6413FDFD1E1DEACCAA89FD71FDDA42
-B206A827F434160AF34813CB02BFB13B08ADFD7A0522ECAE1C57F0B35292DD55
-213A2E2D4E7BA5971F46C438332D85976B7D2F15425CF626FADD7F0193C88B8E
-365C3724440FE3A2A3C8CCE159F7508D23AEFC92EE92B0F824BD9A5C44FC96D0
-8126FA6E5F23A6207D079E24E4426D0BE4798B9DA83763734EC13292B5FD113D
-D5F83379F86FEB25C1ACB394747D34F0913B7BD34FCFF65AEA28FD21BEDAE94F
-CA631856987B7413A7F7C5CF8DBE3C900B7ED998A3141702EC5B86BC12FBB132
-24608C6FCCC626F19871A87B5AB45283BBCA5FF6F1A19277D7DEB93EC5EC9977
-4F23995267034A21F92766D7CD17F573E1017AAA96A61DD36C211DD20AF3D34A
-340900F1188A9547FB19761E2AD2E0FD506F17F389CF9EE7D8BFC1106195199F
-59FE361A39CCB0EE0D9E3C5782AAB7B6E5473B50E81EAC6A46047F110B155079
-9EF8C17A6BC2575A28D2447E3F08742F4BA6205B5C198BD5B9FF54FA07000468
-19A6A54448108F6F80CE1A07F2A6890AAFAD3CC15E8505EA2E2B3A3B35663B5B
-FB6F6FB1492DB5DFD395F8703159A8D5EC1E73F859722755453931FFE63B8D1C
-7377F5B64B3BA3B854C245569A731BB6C13A7AC4C6A2EF2374CFFAA99CDD3984
-7BC0A101F49D0837B84BBCC374B5FEADBC644FD8A5E66450AC95E28BC68EBBCF
-0E594CCB0BE38C6B50D4958B0333E568BEE976DB2E19A8E62EDFB683B7331EED
-3D67E0C0015948B07F6529D2620FA14FAA23A898A32360B5BA9E21BC24DF15E8
-669014A32F848EC36E63348B0FCE5C5035DB8C2234E3164DEA3243633046903F
-94EB81AABBAE58A1D2A6EBFCD301BD54F49A47670CEA8E13013DCD9026201231
-CE0687971DEBA09310443ADBDA9E637C2FEA83D73048BFADA322E72F3C577C16
-0C751FBB90641C66042E4487DE1954A2448ABBEB51D1C11B312A3D5A7E1C3D71
-521CA8F0996C2143A0685CFE49C8BCDDC0E5403823122076A1A9EE3CFFDFCA31
-BF6A4BC12E03022A8D423A71FE46E17FC03B333A7F09E879F533D9BF149D1CD8
-B7A8265D47F2D63F6C961C003250AE33321BDF8488CBA52E2AE5924CB1A96482
-C5BADBD45C8E2F6794E265FDC9E5D4BECA1748BBAB6A6E1D37A5902238B5676E
-32409C3053B8C8F6E6FE3C4CB1F3DBFE8A920AB0D4D5903D877ACCD0B367E912
-C9C00CBA8EF9A3D9F7E042CFC3ADDDF9508895A9B4C61D6BF0B76507013EE065
-82241B0AA5B0EF9E30A2120E154FD9E844FA1ABCFA468D7B3D58A4C97E433B3E
-81CBB8C498B11D75A2E818EBC52EFAF545654E2B60207B986EA905F4E16C148B
-CBED6CAE4C7DAF3EA41B1FCD32BEE448325DC5DFED2585676CEE3B057004EE9A
-1028F7D0488443BFF30384C88FF25886DDC80A155DBFE1DD0A9161F5E9AD8DDB
-9C81A53981E6338E822372062488ADE96CF40007E4AFC7F6602BDEFF3B5DB602
-50D1418A90EF6AC7A630EFF91835EF925CAF67C2DA09A1929301938C5DDA0EB5
-4DF4FA31BDB196091A0B171113FB3E293255F76A78195643CF930776D2CFD22A
-8E991888FC446ADBD613AC37999EB3E14B860BD70CF6B77538A8512F1EA8876C
-F68BA5C67BDE3249C2C46B91D1C86E153D774B9BDE31FE310F24C69857D7ECFF
-AAB9BC4A73FD94851CE77417ED982BE376A21AEF2C167D5858534EDA58F06509
-1C21F5D13F23C76B599873E237A9D0F13F4E93342F601331C93FD12EBB6A3A96
-2B6EC380695D00C55DA40F6952F557450E914519BF6441279EF39D7EDBA95112
-F28213BA6CA883E68B59C546484F76BE53CB0B6732DD19DE6065CABC0F9F9627
-75DD538AFDEBCD2363D39D89D0A3778F7FA728CF375CE8029EDFD0A068FB5CFC
-A13E5F2732700EC4060B28B7D7C1252A7B9C421AA6CFD0970C4C29596EEAFE13
-E8A8DCB6749EC08D9B25CA464B7A7F94E518B269AF5E5E532A215DA9640B6E04
-0DD104E93D58236D0A2C481EC119FF16FA1E0F8F3349EB6B0D347AB5A8723D45
-348F41971756CCD0BF3FE5F03EEBBF78B974D1D6CA364C5CE160C8FE154B3176
-3ADA41D6A7D2D1F0003489A7DC354ED43CEE9F121BFF9A85F65225CA38C7DE79
-EB9DBFE2471AFF0F8407E5B8C64565BC219C22AB0F1480908E1B5550EC510FFB
-62433B1B36B30861E183E5C2EA573B54F35F2512CBBA49B7BE5BA2A7F290ACCE
-FC7DF2AA1E5882A8831F9F105776E9DB60DC0DEBBD1D1E8403704E246EAD6286
-454822A957EAECBF31AC200EBAC45E0D340FD8587DB953D3F9086F082487D2DE
-771D52AE8CA7416FEC9E91AA0DA73F969498A9A1610DF691AD908917EA3BDAF3
-78D5A705B156A95002AF6FA3BF3360B5DFC67F1BEB4EFE9933562BD01DE2529B
-E044F351F50D51EA139828EDDAB0CF0194BB070ED70B68008258150F5CCB185D
-92DA71065C20C2807B3CE00CC0FB725440B7BF52D0F9F6FD58AB3B0FD89CEDF0
-1414D83D25F9D2C91A5FB0EAB5DCF3C51902588EACB5ABF77736EF39DBFE403C
-D0B13CFDC488D079A86079978DACD3E4E5CF112623DF2AB161E9A8387A523081
-51A836C2240D7FF33E113BB6F72843B7EDADBEB595D3C0EF5C55C5246139EB79
-28E4FEB7C216B4AC7C8189CFAEFCFA919284893684890F17910242704CABB4CC
-D805F4C67DED52E59830BD569B19890B527BD916847C951BEE9652E602AB3DC2
-69B1E2972ED868219023805692F80D83DCD99B5B454FF9C52C46AED905140F10
-AB71305333855E1E8DED599F4824BCD118E789BEE6C260C99CEF1EB36A10B13D
-7AEF20B6FC8EE0436D3C4344AE5DDC7018237B440867AC459C5A31F9171337AC
-5E8807FD64462C64C63A434B82D3C0BD1EBEA855399DC50E7CCFD487097A1561
-62F5F651E527FB70C0E47FE6680E52015FE2399E25F00FD38AEA37B13EB42435
-C4A6084C618A12651AB94A09793B7B5633C350CA69EA9B1CBEB45FD240FA6D24
-58A6AAB28D6F6C97AB6854A0B04230DEB18303C2D77B3B7492D28E632AB60EA4
-DAE6441B7DD6804C47314951870CC30E662E9FD669CF37E4554474A6CC593801
-E8085F0AF185FE7D8CAB69969DA62A37171FB6EA39487D2BD5F689E6C67D1EC9
-4532C8DDACF164CFC7AF6850F19E199FC0EA6AF11078F873719A5A10DF16CD1B
-F6968D78666E0A12B0E8AEEBFC7E523C37595A47279F1AACD6D7C832DF6CE944
-2896FF8F09714D92031E48652BED4AAFA55A84F5F06CF37095B37C6EE05CCCA2
-08F3D27C885B89F62B68768BE01AEC18326634C4EAA7BBABC3C9C4DB5CAC46D8
-85A79A180EAC7B74B3DE2F1FAC1C8BCE424886FB22F1F45DABAF374C7EFB8573
-A9E9BBC6F6ED8A720E174CB8FDC75B81663F4B85E472568E5D5B19FC25976FEA
-8A26B417EA52D4A79169FD8B9E0DF0AC600642FB694621007248589923F2DCA2
-2265ECF240D063D6A682B7400AEC39B965CF6522EC807897097DEA226DCA64D7
-36C85D0DDB18E290CCE3F7E1301D04E91DD624D2F864CDDCC77CB34ECCF4AB87
-D641AB6901FCA513685515B023100D735733CDB77046B69C08AC0A0F65B65634
-437E9689D09878191F6BD79C0487EA25CB34724EF394FB1053BA4E6201162CF0
-AEAD889FC81C60601F9B53F161DB6C9A8BA9ACAA7BC29E489122667C9A239466
-59CF8981E1CC278C158D7AC2B25B4CAB265EC46477E7E3E69A98B3EAF47E48A8
-DD27803797671AC9F0290BC23AC56649B34EE46C97533DE11E459115149757F7
-C8050300EEB391D6367C048B5B48078265B5F70C57A9B8EDA8D242FD220EB33D
-73FCBEB3E29E36C37D59A536945B1F47FF6B9EFA81F230A29403A2932E1D3CBE
-DF6EDDCCB02F4C5243B3C43A079F32329BF852C894F7FC9B4786A16CA9583D4D
-5ACC28C6441029FEA945FCC358999F6D7CA5418356A4129B98AF5B2066D141F8
-07F7036B51FF49CBF6878E89DF3B9F226A9C019DECE2FC8B7CD2F7491077AA59
-8A30A25BA74134B01F43F282B121498438AFD69D7618C77F6CED9F0A3CE2ED9A
-64FAB7C69498548C51B96FD7F3DF274E399577491300D4AF7956C851A8E058A1
-F49AC57A5869A46BD5B51523361AD82CD3252323899058CCA42EC1DEDEDCB53E
-24E289D0095E37B4067FD051414E4B06215350F9FEAE5FCE1479E77BFA287857
-9A9AF5F7BD93FC5A96908208949EAD6482366F796A88E9AC15B6F24558C58F14
-565C9CA8EC72373BBF2C54C97C8FFF8442ABC8E25DDB4FFB20EB229A4031C14F
-FE32FF67BE4A28EE0BC60A6118EC3A8D0AFAF472323B0065C670CE41FBE92F54
-CFECE8751123AD3D51198E5EF050D8C751345E5AA0E578F4703340A3EC431557
-51FE351A355FAA778F3EAF00223A0BB03A7DAC11F58EC64F89B2A1C249A9F720
-7C373942CE60666CB9A988E8971E31CC706A9516694F1F968FD0D902BD69B6FD
-5E04755A10C8DC057E60C71DCF9D6666FFBA80ECA59CE185AE97F8CD64CC7949
-76FF8D9C9A0FD74835A67F2A34A1229A7D9FB0B9252089BE32C320D28F22C93A
-358073FF58864EB4E9BA5C83BDB879C67DC64F591F1480445AF304F6CF657265
-06E758177CE96259B3B2AC1429D549E249A8FC90444E6CE1E96D7D57A5272278
-076C2055BD26144686880FE76D0161DA226BE79D781DE33EFF4F9955C928BD6C
-55F16E14A5A2B8306164D863C2537CFC05A7F1B9E9221321924D33E29C95321E
-D5603A85A3F3F890204BF7745202DD217CEE21BF45514B8BD3D5018DB01FAB56
-E5B85AA57D26C115F349D826D21785FB2B14B16C3A1C3D764300C6AEBCBE66DE
-4D8AAC6484D20857694BD65065BF4BFFFE35D86D6C4AE1A29E927861D180A339
-7476FB6DF1817BC6A077CA5BFB568F6CB759FAD1DDD86F07CF9F6D6B8B320E01
-D9DBD04D0315ADA0A2F8010DA572EE6AB906E55CE716AF7969A3F64097210C94
-7623AD3E0748DC9614F27C4E5F614F13770A7C5B49464AB0E6527CC6FBCE4794
-BA32DC1099FB73AFF3EF8DDC33132DAAA7546BC6359DE8A49254AE44963830EF
-7A69566BCA08FD8DD4C0982A38625EE58E39BA2762CCF85A27B037D34BE5689B
-880D9446476613BD98CD3DE649117FEABF6156BDBD39AD05F360488C3A80BA3F
-C764F11DA922383787A8E93F945C8E9D1FD4CA16AD0958B21EB36B84B524A9BD
-C8434B908D4CFAB46411E997E75D9F48E140C50ED2B56723BC43069B42554850
-2A73B211D61800ED608891BFF059E8C49C52BA719CBEA6681A9BF720E86FAE4E
-04D5BA274046D9B103FF247068EF9B3F51C22F518AC1BE20B9A00CD21F341BC6
-FC8C1FB5072C69466CFD1F1085A92E517883C037F3A73658CA74686F07BF742B
-98C121BF9888160E0DFEC324C208409D876B887E4447CFC4416C9A4358D7B1CB
-769BE77537BC8E2771F2EA19EE1440468925D41C01ADBF2484D8B5321EE18DD2
-A0B1F570E0BD0F8B0931E1C6DA0E71F1E995487544B22AE91B8C2B9AF65224C4
-BD3E3BB227FA37121E31077601FC205EF5E5B69458333784B42D07CD58AA73DE
-8FDCF30351D58B586C9A6116F0CED2298B7E6E088247EBADF24DD85DC2680BAD
-D217DAB604987181047F426ED848CDF475A9D19D0F00AB7DCE4E3C73C8B666C5
-37C09106A440E2421E94D699BA881B53D98395F47808FAB1D594561D46E82175
-0FAFBAB8F8197119F14D789B7E798DE37D62D2043EFB8DB3F819B62238D62E8E
-ECFCAA92C967CB2FB089A8AAE36AA54C43C8F9AA5A7E8D88B178BB878F4A7073
-1D6BF3309D05856F4AC65191EADBCDB22982431C86745C3E01B0F563B2405AEE
-1E56370F1835559BA096C154626D36C090D3F32EC2EEC0B35FF492A08E61DB6E
-C234642691A4B214E27FED0D420254C5502AB9797B273B8C6DC49DD29CF1C65C
-CA61944460CC2ED03655E713B63DF538209FA69DAE84B4A3BD89F7834BE5AC7B
-F3C6CD20E8762AC2E365548F396D32FDF7349DBCE34D93E68C626EEA8DEA1EA9
-A369A6435B000C4568BEE6FB00BFB2553D7AA6923E3A28B131A135920A43F5E3
-D692FE12C30A2FABFD2047DEBDB4D9037D87B7FCAF0DE6EA92596235FF5B16F5
-80D4B99B2F98B51A350D8609C9A65D0E6BB6CAA01AD47912D72A869122A20E76
-8FFC5353BFB61600DB1851169A8B0CA7461240A1EC10351AE38DD223262F5F1D
-C00DED1F9AD9F805F8C13E34E878E64D2951DC05C2F95AFD57F8C1F0316FDF5F
-61809B7AAAF7CECADFAF70C607B77005EEB7073BA88B7D6FB714C10C313EE3BF
-82D1BD536D7271F012ADE21C41D2D4BD9301305BF3FC46323C0F9F58C3229897
-F691DD00E9C538DEB7532019339406CEB61DCA9509DA08B4E5ECB4966369BA10
-739E73F3A6C527D685900E6A592D25D01EE3803EF8A741232C8B48C2798474FF
-03CB68F61FE1065A45C00E86E339580EEF6A90545B04EFAC45E57F0B5E9BABCB
-E053AA4FA0C593C1704C58858CE462891FDCEA47411714BD9F42CC66714A1947
-5637755E85F7CEB3F85720CDCFC6594FAACE2E49864514B00860123130D91672
-549C4B4A46F3488F41822C30C927430207BCD5BDEDD48366A1336196EE37CB90
-EE3193289796DC165A51E6C01FA7F87E6028A8CA46E90A47154BD95412C803A6
-97F35D80F6FF9FF64053FC3F67E182A3AE7E72F12FE7D85778051CC8BC847FCA
-CE8477994CB78628DE7F366A6337AC42372E54F5809693F631910800B854C832
-090D71B89E09D49256B84F5B0A2BC26AEE76CDFCD9D58F4D739B73530AC7FACD
-B66DDD8F3E601336999AE1D93AB261E1A101DBE76C7C9C988D4FF999BB480853
-9D366BC1F0CDBAB25214BC5D38D3383C85345662A65E98851321D776D34BB6C0
-F7E3367D7329714A5B8524213DB65B36229AA4794ED1B8B9B735B59CFD4136FA
-ED923B234EFC0F1B10E99B4778F1616764E3FF5EA5ED64D7488DBCDBD8D0327D
-79E703E5FBB73192658B48A6E3A50D43ED6F9CB14A0E1767C1624258378BAF01
-B4374C36BCCB1EAFBA373538844F5D1F36E25046722DFEA0398FCBB80B1509AD
-F76C2C452C2A3668231F46B8A953C722FFA795A9B25F34FA0484CB72DF2A9E3E
-AEF724E2A120B9C9D3BDB7BA2F1688C85BC8B4F3AF3137C3B5AD07BDE5E6DBEE
-AB93BA821562CEC2F498A406932E1571A1AC323C894256D19B1256FA855DB4E3
-E2B7B1F286B3A376ACB8EE51BC3036838D9C5C6D275E92D92FB3A04EE15DCEA7
-83E772D8F2EABFE039652049758504CF3BB46846C071E1C834578ADF50ED6BEA
-4BE184F0DC7D792825F61FB26B06E8133A0FE6A5A50D804FE19E3C58CF1FEF52
-3A44C7DDAC8C9FDE076125A5E69C61D7ECE569901764FB72C9FFAA7AC49358ED
-B49A2F27361196F608636480F5F59E7C501D77BBFF424DC90FFB76A98B10676D
-5569395477FACA2071053F0C8E233F6D63B5690F30ABEABCFAA4BB42701332CE
-B2E3AA23501DD5164738E9C7649E1B3FEC004775BA90902219C5418411CF3E6A
-964C79F23EFF5867E97CD07ECE28E017105A493D1DE4A4352FC0E82966F1323A
-06719F6C7982E802385193DC4644C80E0F849A9A9435236C9FD97E7E444A8B86
-531F89DAE02563F58C45B8360F38101B5F27536C91D04277C39CCEE90E7D3889
-80AD6E6377672F8C3D9157BC6883CB6CA46F48E2A2C9332647B8C6BAAA0C64B7
-89D2BD9E096B0AADAE3067BD9789A7340C46B398F4CA1944AF01A383875F6365
-63D143B3944E283A23D54AB91459EF2334FADC4D4B967A8B415841DBA74E7437
-0A7E38218C574189FF14954F1CD8B2CB642F017AE7F226A9B5D6B1887864BE11
-B36AA442F8493AB43CCF30CCF818C93FFB2148EC95F4E53FD2B203C9DE6C1335
-08D0CA053B70CD72CDEAA8C808B71B14BEE9B0646CE22C37B1866715238B2E77
-0ADC53682451FDF6D89ECF1C0626E41AAC7E279AE8335140BDA6FB0F617A8E33
-9D480F774DFB91528FAC553BB0948B94DCDC3EC4082EF3549E669A7A49C83FED
-98C6C7DD43634C8321CA5A3BAD048442CC9FAF839D7647B744E11FC9DC7ED2B7
-1E2BB9E82308703FF7C7C8C123D8CDA3631FEA47EEA9045D6DE5BDFE87E92B58
-E5404906E06B417F088F9F9F5BBC78FF369CA8D78F3AF16C21C8FC2F38E559F9
-11FA7F88FCA559E319D63A6EF43CAB1C7E2C50736627674ED172BDC507D7770E
-706DA40D79895E339D3DE90C2B95AD62E9882D9C306D58F80666A419EDB2A0D6
-0841DC59C6D652343F31BD5FC75CCA2E69C9B8495C9518AB83E95ABCCF6C5475
-94CC30358A8533ABF1D9A550076A6652C0ED47B6B77FCE29B8CBF2A7A9329089
-9F310FFF1F64AD75CD3ECDFE4507AC92C3448EABBF9ED97FE3D9E10B1EF3A0A7
-D692D0698047F685E6401FD72330B7B5736D285A923360C4B6B271B74544F855
-158BC5FA3F971DA2492E6A75F7A2F0C3871FBE4D4B4B326131FA1FFD6360F34B
-9853376D4E9AE399DECDDC2BD6D790B59A0090BB748EE0EC0D459F203604741A
-3FF6D964B3BF1B72881924F6FCA5C778CE8CC8513B99DBCEA1A8BA6E46DAD45E
-9A6EB90AA1B02FE6D857CC50699424F559E976FCC174BD5459884F8A723FBFA9
-9C7DBCE6D0D6E426742F6AFDD4BC603254FC4A4A53E54352A79E74EB198DA28E
-72ACAC529BA702956D1ECC0DDA91F64C822F3B1D564BD0EE11D26642E12DDD66
-9B2FE63051C59415F42D597690C369CB8CB64A8E3EB300C5DAF80E6F9DECBD78
-07AAEA84633498558B623AF42FAEACCD8D4FB005180CC5F55CC4DAC3955E222E
-AA4CD5BAA529080F195AF80FDFFA970CB01B9AA321274A8DA701C9A381B0F21A
-977E59520496E965447F88873026BBDAC1BE01EB7060674A656918AE89D6875A
-83A4A71A8E583F09CB7C7146AC9B1CB5866DDFBA9F6E428A2D315F73F9C4049C
-32B630F243AA9F62FAF057BA3D8C042E93414867D6DD3DFBBE9FCC4AFF865449
-B3A7AE8B3665B519CDB7E2372BA6DBC0EA2DE31B04C2A16353A29A760D409CC9
-F5DD03E2C11D29E0D545053A6AB7EB57D556E25401306FAF915968EDDB542D62
-E2F2D772CB09B4723DC936C0E08189539972622D8A2007A3DE1972083A902D7F
-E50C882272691FA11D0013D6CF4DD34C6D2062C2F7E62FE3467E665D77A40757
-B16C6136E7240CF39704F49E8DDED8A5D60011C24177467763373E93730D04E2
-235768F2FAA0615532EAE537755434F130B1F83CAD5FDF4092FD20A324B3FB30
-80C9F16C617E2F13F315ABC8B2094F8C768277D629E10A6D0A9ECCFA0821ADB3
-D76C8206BD399FB5AC93AF557E2E982777B6C1FB0C4D74993E6084C1D4F50F1D
-F0F50BF8B5658FFD4AE0C6C1275C06100D2DEC016F809CD8D9FD3FE7A7EF988F
-8F0427880335F024598EFB33405D55C44DCB1DD147C398D0335E22AF9A195D53
-4AF6189CAA57CBDC5F08272D7CF1B5BF92BF3AF8036EF848E437B50688F49D49
-46F11D87415FD9ECDE418F452EE6FE7A3DEED95A0996BA0862DE216DA08858B7
-524A78820B2A5BAB4ADBC1BE71D69B02B149DB5CCE6C859A38A810C901CB845A
-F9873F64E986CBFE0B2D2146DAF2366757C8FA62F7DF8959CCFC78EB605EB6CE
-4E5B4BCA9C64258570EA229276FB5D417CF1B1B315148693C5EB6996CFD1508E
-67DC8BE993EF72542255F7E323CC182EC88B844AADBADD4888A8C6DFC1C39843
-0C19767F9883749D6EC9D065C88DBAC9D87AE9BDE61B8950A51FEE9E531CA3EE
-CB14C95B7301CC5A7A1B22FAA9E1E956EFFC9BDC1DA96A8910E733E10CF2EB61
-B7E324653C797D1DA73C2C081D70A14310D0588AA6915B0F05FA2CDEA0FAAC6A
-FDDE41FBB23B5CA3D0CBA1CCA54C6C685F12C1DB1B4E8943AD873691186C7A13
-C29C42C86F1E46E1307CE630DBE4332188CAEBFBD604252EEC001BD89FD79563
-D79B17FC27A5506496576A62D3EC8DA2EF2BC0CDCAEF707B3A18978DC99BA0CB
-3D6E611BC0E27CF54D8478853EAA6F80B3A698D179E8660CFBBA117EC0694457
-44D6DECED3C1DC219D63D1EAA09BF546A16E28EC76B7EEC8B01C4EA1DD332503
-8FB779A7243A90B4A98201B51D27E02083FA278BEDB9FBFAFFF82C4772F2BD17
-53AC2A75D9101249F2B0C52F0C565E6D084C1C6C50C084EFEEB5E3AABD25FCC1
-339773BEBCD4671779FEC8A1DDEAA73D2FFA456076F4D3EDCF0267A48E72D2FC
-F658FEA7563E4B10908358E5FAE253C5A1A1F19631F1821C3C80BD048CE166EE
-F77ACBBBE8F2DD4FB7AB2692E8C25BF18EECD4F0FECF677860CE50B10F3E67C0
-39F23CD146E0ACB5B6D2866594E6AD5A482D864B1A94E0CE45D4322AF6F3EDD4
-015504E7AEE530A5283FD5A934524AAC4AE9A2FA647CB578FA7E85016F97C906
-77436277D984277A329961807060D928D2065449D14FB75B6EE088C7496A0718
-0796B05E1C228EE7E1C7C50106CD49AAB88FF7C5B94658E3D2D8713C061B5105
-44DA4C04D051ADB47161510B9BCB4D18542A0EC5EB66611BC9DB1B4EA90995DE
-19F86A76565445D112DB35479C7E70EFF4C6BB3E45307CE48BE52A9BFB818387
-9A0D04EFBDBF9EE973CB2808D9E75694E9C77BCB72EE07943096FEC011FE7435
-BA43B5AFD8D0811342DF88D3C50B9D001CAA23DB7F88894D58AB56B74E9D6E45
-9220790C088D3C2FB8304C4032FDD3129C0B52283AC284F36DE8F89E9E4505E8
-0AF4B25B6342B8DDCA18497D1C741BDD00ABCA6161682D75CB20B3D4C6CA560F
-BFB97A5268A8912F873AACB40C9D7E6131BD2C2FB99DDC95A104AA4DD69E531E
-1F7BEE6A10F0887F6DF15EE64F3B65061146BCF0F46B5EB53A294960E291A552
-0400BEDF61D30D4E937691414B8C14DADF3D4DEF27EC9CDE862922A8F80A0DD8
-2C4CCFDCFCD568EB78EC96FB946CD704BC73C9C07A239DFD8824F52E22C1184A
-CD4BBDDB3E2301C142A6C21483E57A9BE8D060D01F5EA23C22178F3EFEACB76B
-45C46C034A27953B14D9A2F624C47668B8700B5363F5C86944A8DEC84D382D56
-0C6ABBB75031683E20755612736DF206D313301FC39FAAEAF05D483C1E93E6EE
-E1DAB686D64D959EAA5DB319812177546027092595A5002B151F433289AE5B87
-43767F545F3FDC397C02DEDF76AE6462D4A2AB55867241C8A7EC2293B61AE39B
-92B8A82B3AFD65A6AF2B4C7928B4022B9B944151FF0936AACF2269FBCDDB31DF
-29358B779C7FE59CE4FA452F0987A6026E0710C4DE0DCE081FA2602D01EDE3F1
-6C29CCD38E9D8207504BDA0CFC49517FB02E78BE3C70E4763B58C1CDD2DF9F2F
-BACD21EFA95A59D67ED2DF67366B64369B696D1FB2717089B7E7073A6C778127
-2A2C3250B8FC0B5D8575997D6B8AFAA761E8CDBC9473B29C10BCF3E16CD9B555
-18124E11ABFAF29196579325B3F6C1DFC9AFB4B1CF54A40605D7B1A39A337C6F
-4B3E724C02BF2C1DE1B5B327AA0F65B9581533015A7834293AE558277F7E78BB
-0EB225997B0CF2AC95698AF7CB0F2AE6E297A7176EE56DE77CE18E6DCC988011
-C51C80DCA3A6D6613D517DCDFBDAC2936139030AE78D70A579048E27CC418600
-99CF1DB94EDC280EA97768ED37D5ADDF09F26FA9CD7C71FF71EEF05BB8F7AD59
-EA1600BB67F8D32408617FE38D3F03D23E3A9FC3921EC9C880F0A08E051A337B
-72ED695E9B00DC820E7EF062596B651EFCE085DB5023D14713710BC6E2E98C7F
-3F674351BC3200F448459590558A0F7D1FC99B33E69F920FEAD378ADC6F2FEEC
-542C45A265AA21A7C5408102E0618B0653CF275D78D13DA3866048521F937A45
-8AF2EBEE59DE62B5AA226BFDEDB8C7FA92DA2A277141C1DE3301618DB5DF7EB6
-AC5BD2226122C26E0AF1A02C253D60052BC8768DE3DAF4BF58FDF5E707347558
-9431C7998D3FC3E63482BF8F31AC6E0630B4127E8161FCAA5AFBEA9649390F18
-4C8E16117FB1AD2F5A125A9C24BBC404A2491B8C44062FCF8A6609338052D3FB
-840A905FD9E94E54E6D1EAE195C3C635596D9D284CF7776B2BBD7D786A9E77C7
-F868643441E41CBB50E2294A007668954A0B33F47D470D72654FA58D4622B8DD
-90C3CDE66C691A4584FF2D93A6360B274E0E3739A12773F497A6FD980DEBDB57
-1B88A8792964708072AC880AB3331E8625C6010FBF9EA04F3572C737AA1E47A0
-8C5A40B1A3CDFDDF7314D1F06978B3FCCF751E0DFB25F830FD684539AEB02DE0
-856D6FBBC4372D76D109B1A52C8AAABBE455CC37982BD728EA964AC19D6D6C87
-6875A653799A383ADE551C3C55C08840D1C4479F1B97CCD8E07201B4E66726AB
-B5FC0504C4253CA50C538EE93D952D148C6D7A1F99EFFCE9C9E066BC77F2C85B
-5BA9474A49850FDBAC35F97EF5783D647E2F6B238F7D77B8F494D6D04687B8DA
-9179A7AF10A1BFBC50141AFD6FAD87BB58FD1510FB6167E2955AC7336F2038B9
-7AA2683A32BE3DB233F3DBA776AF699305686785053DC25682B734C93F2725AE
-5C82CD88B68A7C788D774581085BE2E4B467DD5C5C7FA83D3B159CEC68FF0F91
-5ADD33BA8CCDF3D93E96B0F9CFC1F7A2F98585AEF0DD14481CFD1DB73963BBFF
-83BA8D9490FA120F6E4E141EEB1D14F29DB08AE5FB636AA1BC7F46EEEA33E8AF
-334F22650CFC2F3CF73BFDB769BD34C3A80694278440C8C7B6DE03C101701365
-06ABF17546953891D8EA0F75E8756DDC267027145042C2817910064AD0D2868B
-622937ACFE34406BCA089A50BD5D40CAD02F22BBD892189D94D41FFF3AA8F3A7
-DDE098C2A5C23ED877B7D8016709D6D578CAFA069A3A50AA3FC11AAACA58940D
-D88505D217BD6F562C8E435F4247AE9AE65BEA57AFB21F13E546040A1A51BE21
-1D2706F228150F97BDAD799A4823C7FCCD8DFFF66DE7AD2AA661B6C1BDE91D8A
-2625DDA0C9C2DEB214C9C41DCE148A5A805ECE8229A9F33AE5BA7A99DB32F225
-24E4C3D639EFB9EEAEEFC61E8B36C2092F3BA757882F94FF7DEB36127E272527
-AE79F0F55F9323C046708C4428389058F9C67CBABAA779F84A3EB8540179513C
-75BF10AAE036CEFAB476729A8C5BD83B4C212656163F91FBE16384611069E2B1
-AA843715DFB594523904C3135690350EE485893F3A51CF2A72366EB840EF3CD0
-918D839BB55635BF7EF6E9D3CCD2158918CAB7C9FF74AB701C17E07F2F04A19A
-F6BC970D90380809A987150EC0C8AE2FA190759B3D669DE4894CF4EF7F32E3A9
-50BDA5A1B083A21A9B0E1BA8A536302EE71A14E8778CF1ECFE0ACB592563EF92
-D2E727BEC93B5198FFE8C0AB9FA44AA3842B6E070CB4BE0F327196A6CF1F2D47
-A7CBAFD8FFACDECAA76F87C26E561DA20B49D2FDB81C42BC36D52A95BFE3F2C8
-4E4644D6560E0B5815DC0751A92610BEB4512A4614D0406AC8B5E5FE05610143
-DE3A38D11BF9A3E8B0E5A76FA18E99B559DB6C216938AE9DB50591E78FF9FB13
-67E89709CA7AAA17D20D820CD1BBD18B904436581FEEB2D9E5C2BC992AEFBBFC
-7129948DB03119F6DAD5339CB950EC410B1064F2E8D471972D60514B9037DF21
-6F42C03932DA11BCF6B8896755D2115220E265469B3601EC1079843E0D27C207
-0D0624E118EB64924154EF01FA65BD93331754D469E61BB34DA3401A8AEA17FE
-92165E1BCFCD153617DF82582CF27B8E64BBF919E183BD0CB78753813A01CD5E
-D3ED931E4670B05C39B66CB35DD93E934B1239899566EAF7D7524E8105DC2BAB
-6C43CB4BD23DF98F3CA2E88F0E40A3BB65C1D0A7CE7735F95AE5A86495C3EB27
-8AC9F070FED1E50936B0CE6E9D3DD56FF394F45646F02AD19885072FF5DF07E2
-2E7B8709D23473FE3E62E0150DB7233D69E31E4AC822FC58DB253EE9737B9237
-3000784F4883FD2BC7C7646F48BE10DCED395D7BB6DB8B1AE3ADCBE3FCC23EB0
-E7BC01AE7960B6B18B65A2820E788A4B47177012F5AFA3E5FBB8F593EAD2229B
-0CB1474FCC2039FE2DFA57D3DE16C6612658F7B7C27B5F3AD36739DE073DFF2D
-17A9351BF25DD24B4434C5D1B6277EB9BBAD895DCC727756DD588B65875304ED
-983C5F664FB658E0DF6D79DB3AC1806EF4D5F73FAF9651E738564CDCDA5BEF19
-53AF4498634A841D370BA07863C8B579466D5A329C8160B8695BEF1DF28527A9
-6DF41EA5016705F903D0A0D2268A27965CC888A8BAAABB5D4FE7EC8CC7816732
-2AAB7557AA7AF336BFB6B298299BB7B5CC89797B7A71F4D61F0609822CED2EC4
-85EB4E6FBA0199D538054B212F095A49B77F664E749D0AA899A877151669E89C
-EBEAB8A71BBFE65242FD53244194B5763260B87B0857072B0155000E5EBA5DB1
-68C21BED2AA9B60506E6873997A34909F6C8D5F9AC3B241A1496A2CC9B6FBB2A
-1D4084500426B3931F25B42B1422DB5444C4CCE842B6FCB545CD0357DFA6B867
-1CF9C7FDEFD67867D748267BFF9AEFAE4BBFEAF3E0F253570F84D5214B24C335
-947CB1E1C56F58B74F48103F1F690C543791BD85B5DF6344EB45EAAD771A4EB3
-1F0C7765F6BCCBF583371F56120579729F58322314C5C5746C2944099D7D38C8
-A03C7D64532B0FE23060EA277C1D71321D257FE0E07592FCC8B23334A92C4646
-E5900FC9EFDFDA95B9E183C582457B032F0878503E61CF24899569B85B194466
-412E10123D6725395A7BA8EA5CC88C8CF69F5386C0E615B7A33ADDE091348CB0
-966F9EC34A7ED43CAB8E50E6C454A36B96DEBBA1F7AF42A21572BDA70407A985
-6A1F582EA78A05DCB2E80D58B526E6473E3688143E8BCEF811D1D02F7565C564
-E8CF7801E98451A7FC541542F9490B5A3AFCAFE0C0C3989B7899045CDF262D24
-7579ACB8348FD249234092028397C92B3CB69AA206A94D70C2B78ED45534A65C
-07C396847EF4A6D9FE1590515C29B2A8FAD4E831BD2E4AE07F1E315CF8DCE669
-DE3FCAAA0DB0A2A518753D04F8DDB7129027BB94A0A1EA990F64FFA543F90FFB
-63944FDF5F6E29E821EA00A71912C9B1AA9426939A2FD08CCDDC1DE545B5B695
-09DA575BE8A9BA6D51584309687FCDE29128D7BC355CD03A09D1091C156392EC
-85393381BA2C006949DD93CC39B7A58BF101E0117E88B3CB4D954B79A86C632F
-38F5475C8559229155CD210AADB479F7FA83797FE211E342DBB6CF3060986C92
-9F946E65ADC67950903B99EEDE3E2EFACFF68C4BD90907ACA26C96E4E5A28101
-3517DA551C963D6DBA3B2A0B4432A6D364CB2BB2FD1B3DDFC1F514D4E7771D1B
-C4B406372269021E87B66B81D4AFCEA1316B755D65F7DEA5AE2FD2264CAF1B28
-1DD4764FFA33B22D2CCBB7208D7EEFAF36B86C0225535264733E237E055B58C8
-6FE717E4A6613D049D39E64A7F517C14CFDE8CACD53D96908B9DDE9DD88E5BBD
-FEA1DD01A0CB0E8C417EF1473183F39EA6FA2B47BB27D37381433050DF7C5F0F
-3FF6F2DE3C7BF989F617AB16AFEA89058C5E325FADF9B37E0F8565B433E82EB4
-F949AAFA60BD424FF49115CA76543F9757741A3C10440B4E5F0CD73AAE7F22A1
-13C4DCA7D6A55FDB020D14BAE8DB2600AE6CE26144CA0F83C82DF67C4E89914F
-4C4A89DEA5326DACE14766616AFF2E89FD7B25148819141D464E47D178514814
-E14C9A8A796739DC99C1220CA086326231E9136F61962303686CF360E9E5D058
-915AC25E7B8F56CD1C6092252091E4E25406C5F4B60C4AD01482F41B8DD29C91
-015E19D94A0B39836722CC3F19CB46D73930D06BE314583F6DDEA56A2B6A8B5D
-1C59BBBF8EF768F9B49B1BBB38B4F828BE4A73EB9315636DDE3AC610D7E0B65E
-32A8EEA63B1C734CFD0B52D09B418F6B33F03EE08A886FB6E52405C0403177AB
-A63EB20DA2865AA6441957F98CD7D64857ED614D59436450F33DD43EC7AFF4A2
-D3549DD174338FBCB4BE975E8CE41B34BE93C770940575AA1288F87FA400C650
-A4DDD573BF1F45EB97781044691B78BD64C3305FBCA02D9931EE3B8B7667777C
-1C0EFDA7E4E247DBD6C5D92737170BB9A86D862C0534A8436B1295861A7A2BD0
-CEE445EBC7F8251E4DEDD7173A82A39B8C3055FBB90FC42B550CB5CACC2D2972
-886E7AD2AE11626F4389AA07995055AED5AAD317FEBD47B498EB52AE15DB8440
-EAB1D16A826CA1ED54F20A990EB564FE9FBB2784EC4920FA479244CD24C7A635
-574DF33C73FCB1D2B6DF0CE6D214B464761B8B9B2EC88387F6E99A64A0B52271
-2E57D454E5B233F41FCE51D65BDC26C6BC18CE1B901048833533CC08AD60FA32
-FF65C5E06A710C206B78D6B9EBA4A81031BBAA88BD3EBCF1E795170EDD69C61E
-26AA502B47B8BCB9D9CE8A95D81BE25116B0B84A92BED585B4248CEC62676FB1
-2C6CEE3B2BCB5F7D6EA35A5E5725958DC772DB3E108F3AFA1CDD4586014A1296
-F92D49A8F9E0D19C80824733CDCADD36E8D6BF728A7EB38EC991B3E4F70BEF0B
-5F76DEFB25670F3E9F8833C015B2C68AB4C6D5B490C2A295F038E2A8706D243A
-1D4B2228CD1A2545EEDE67A85FEA536C9C32747B45CD81D01767FFE9A8F70958
-409C07CFCFA3D102707D1D6AA5EF7A8B25DDB8A7E416610F2D558BD3C9F1D3FC
-A3CCAB935FD1F57D42E2D32610A3069A15A31CB0F5357C00419F152AE3EB3CFC
-4B3FEA9ACB01F180495297B4A8A60A4D2EFFD3473C1C3AFA2221C67D90DC0DB9
-43EFDC47484D08335438CCE06EE75C7571007AD9E39E31BA5E2CE8DE96405063
-13BF3FEBB2AA0C997F303E056ABAE3F3C14DE8F472D60B6BF7B37A3488717BCB
-C6A20858B52045A7CBF4564806C1D71E6422839222C63598B7EE67A4359869FD
-C56BCA71E147E87F9F9D241F06EFD688A268CF0189BB9054231AF7764317C10C
-B625E4633DCBFA5114EDD89E44AFC560CF0DD1F8ECB356174BFDE7322A3C257F
-F6B9089DB9726AA7313D145A249AFE7EA43C3F1CEB9113C568D2162A515BC112
-7AD80BE6EB2ACD39260B65094039B95E1819FACB18A92E98F84E741409AAE641
-AF35BD026EF7140A7563505567E974A43554883949123C29AD3FDF20602B35AD
-3100F85FE00E091803D9D14037635C964A1A92390886B6CB72A915CAEAF847B9
-1ED0F1499BBF1BB8A906538E7F709F962DF50143B649BFB2C5A3719F95362BD4
-A892BD6984CBD362BB1261C5F0C1262B57C441B9349AAEA2995C87FFA20CA0F8
-E7C98D842026CFF8DB2258D7DA536B3609028340A0AB13D4371BBBEABDA877B6
-1551058522BAF2F47F34509275D422FBD83F51BEDF0D94EF10E95FD1A8B488A0
-0A81C7998BD9AF86C1A8E2175ED1AB40C96243687BBCDB793A08A5336F911834
-247462D693993386ECB467479997E7995AA90AC96AA68B78F21AC59BA618D886
-ABC7F0EE019F4146755A55BC38BF5461B1422E62E320937D056A62D7AF6D3F0D
-B2A2D09BAD44F46E97316A685CA21CC455AA8A061B88E3E64C64DDF93950E236
-B49749CEE474F8C38CA8468E6167C94B3678AA2E5262B69D4C04E5F36CBEC4A5
-029807DF9AB3E4A1B5360406EC39D519504E165D129B978225D2DD7BC4ED5982
-D67B4F1C134DF53B19CA76B00EC04967E7D057B246BB248F4ADCF9D4648E98F4
-4AA48C9112808A0F21F816E481543E5873AE2331E1B5256D027C48602EF09590
-18602EC3843E98554D304B92E5F1A531E61EF00E5809784C16D44E6783230C58
-4487C0B9DAFBEE1362F65E4555987D8810B49CAB8D53DE39DD0D49FC5C3BCE39
-6D4A8461C9F0B0B9B320365C7425D8503690204D0898EC34BFE37FBB5B6C86C7
-60AD9436D9331FE53A444F78DBCE00AF3CE5C80EDCE9A65CA837F948EF672280
-94FFFD6B176B98D66DE818E27E80327866936389AC4845FF059F996B83FBD151
-BADAF79C95CDC5375FFF1211A6C1C490344AD56BF6D9665B2388FD4BABF6EC3F
-3F1459DC589A99A7615D64D34FFF122770812E0E1C5FBAAE90B72F8845A996F3
-3E3276D41462DCF43C02D046EB6AF4A9101EF81D357FB21FC15D075F7BD67DE1
-26DF7DE2E6E21D578051967794B28592F27271AD34C9B81034D62FFC442DEF67
-77D174EC4335CA3552D85B0AF9D4A4011808FF1EB140D12491217C9C6D991395
-6581C91545A69417114B70FC4E021FABF564AB6D1DC37E456AFED772A1441E66
-63AB194A8D94A8FAD64CDA23AC28ABD8630D3B19CA93AE46B6D7F229E36254BB
-822529D754ECDB3989F803451F30793F0A8C4CD03F8A82185F484CE910334DDF
-F3376FC4AB870851E6B7C1C10337DF7865CBBF77B28A1189494313CD8D112C6E
-ADA1ECFDA1441E2F107DDE6BDFE74C50B89D6238492005C7B6AB5B77563F3209
-B6D5978E09ADCE0DACE3990764127584879AC061ED974925252983280A596AC8
-A0E581D4FF1446D3E25DEB2602680C4382605AA1CEF04A5231220F54449620D6
-E6705DB2D554A34B4A51B0243DBF506577753611F28C968AE743A7204ADE14B3
-6028881DC1AC19923B6ADE9DC01706ED6E635AD5049DFE52103F4411829E5F25
-B8DBE813719DC80195FE3707181931D1DA3D58F101E34205A9871C9DCE6D486C
-FD8A3764D1BDAA95C2788192C956F3514D28F001DEBF20A7802AFC168C1D3F83
-B5CB66DA709C80CB62E5BDD5094AFBC09AC43A6993CB587D79C1CD2ACA5D3904
-683F7AAEE380181F625CBAC1000028727EDD6D1C96A180539B4DB46A11D55FD1
-9BD5A991EEEB3125C8B022A4CBD34D6AEC5F4582731651D4A1C593EE4DC547C1
-9FCA888C406D3C6FEA0C398D91C8D6B56AB56737158C47A90D5B8311178D3170
-4C00D98282FB34C636633DED7A3D8566D647F2B3EE3C095CB0239B48C4A1C1F3
-BBE15C21A63A9E779738FFF6AE49081703B5716939C90AB9EB4E1696444CD60A
-4EFB17AD7FCB2610A9E3F903CCF938CEBBAD41DC25590B35F50A2CBEBA8FBEFC
-109DA0559B474A79A5DB4209D63D727EDCA5EA257143F90212E7D57BC1CF6EF1
-D1A1954A4F919209447477DA90F87FC1DFB199C117A434BCEC1BA10653A2C9B5
-9599AC25838540B3BBBEDFB597206DBC2A894D077F095C073733C805E045AAAD
-9442ACC465300DB1BF50C14F31F80769EEEB8EF1AC8FA42E123B7F98BE4D721F
-21AD4A9DAD63D515AF0EE749497EC58E45683BBBA63D7D06B717D9AD0A593B45
-6948F70A99A42B8A6F2B5CC578389A7D971B21C48571BCFFB16061A43215491A
-66BE45983EBE2E37BCDC7DCCC507470FB01711105EBF9578664D855434DBE98E
-0BAD017F64684E21FC3209CA6A02EA74E6FD7B3710CC09AC0C213E3226C0ADA2
-8EC7F6A960D7D75235A3B6CE240AD4101855F00748363F98A6DEC3D785F99377
-827EC9B43B5B7FDADDDED1C469812A5291F00705AC26BE98C5E9EF813C6E1438
-FEECAAD277718900E4F5A4B8CDE0BFBA1E0AF5E324CA9B4D9C06A2900B7E3029
-9A19D23E58BDEE72438CD10AACF155FFD0BA3A91E18B9FB23585B76A6D4D9873
-3CA358901612B5D7670B1B2B8911BE871853588247A647FB91C3E86A6F642EC4
-528A7A3C63D6C9C59B46A22340A887E9EA8754F3771797BED0A2D2ABC7E87886
-FD5D1850FC4C525A5CB4354C5F600F3DA2015A35A77841A8009796C88197D9C6
-7F4BC939FE15D1F91DD6A62720E90B7153C4D77A13061F9F6D732E05CAEE7E7E
-2EAC05082F0756507E7B6CEF9B559A5CC7EF7AD02C54E5DE6418EBED07FEADDE
-F28A240D66F004ADBF2B4C9E158F0FCD9950683ED6210ACFA65F2071E6B72AF8
-92E19D97ABACC701B24E7CDC9D4D8C0D17EB4C64A9DF75B765B1058B485A48B5
-3A92C9B0A1D13800EF704824E61C8D13E64ECEFC2321CC2343A9B59E6C8A0244
-E3C1AB84080AE28A51C7034F3EBF2BF8267E293F61AA10128510CD26C0E54C1E
-6C2C7BC8FF2F52AB1A603BE177A6EE39A5D5F77E9CB3F37B46DF0A134F0D47C8
-0B67F71B5AD0B206D3E78AC8146BA70ABC216F4F5CFAF55FE1803E4947297D7A
-8949E54FDB2A7246349952A2B585AF440FB9BA30C4A85083E5EA80E134A611E9
-E0275460E58C4680CDACD85D38938AD52D1CCD190D2D87241C91C75802ACE899
-2844DF49F6C532D4BE4C5CA2386BFC77A5C3D49A2D691EFD56C5EB2AA830CB8C
-03AF9B30D698BD58C43B20BAC134A895FDC42A0FE5C8CDD1110166A36CDA9874
-4FFA0D573A1414F05CA1EB5551FC456486A72A1B7853496B6F162E6A881368C1
-7C968BDA6B9DAE96801E87FB9D987057E4837E7450ED0C41E1AF1A14109C8F9B
-F20152D9E0924BD9723F73E23EE66FB01E2013CC83A25AAF37FF923C089E0F46
-EBAD3B42FE036F94EE078C9CD251A150E28578B2DF64720E7BA84F643CF8E500
-2AEF59F860E7EAD664E614E489E9E1DFD76CCE33702F25F5E6D7BD2734B0EF97
-4B13A1B666CDEEC6B1058D8951D00FFDD44D910D5308135B088E5E2B0B44F684
-82AFB0E87F64251CB664A130D6685DA57DFBAD8EE271002476AA8E0895E283ED
-970B130C0ACF264D8314E920BF308A44797572AF9B150352EB261DC86A8BEE7C
-92E4C5BE76E66476FBD2BB1B6079D4291F03932E92CE53DC37EC79D946DF12EC
-19D5E914C67F883C42BC5FC28FF200DE5A10A3B7308983880A5E5E37C457D515
-58921D0ABB91307DEBFC1C157D834C5F8FDD85589F17E28F99CC42E8AB3A7D2F
-0965E88C78AFAD9DBC56B76E85B707321D760580252D175DE28F46E2130EED6F
-3101D569B0C2745813D1D8F3C6A30AB77610CD50F5C8574DB097FFBEB2EC53D2
-D4887560B23710BC4BE049749C98CE066079D31AC800091119DE5C45673497AC
-1E7BB1DF4867C5098454A98863F196A20C74B8CD778F24AE06E92C08BE0A6A58
-EB7CD34A06CBFE6268A01E8360725534A8DF5F3F1074FC4BAA6BFF579DFD1E5A
-3C914F718EF07F4A1EDEF0E9B4B0188CDB3BC478C9202632212542C5CA144F71
-E76BC68F3C110742B61D20307AD2A4A0527A3FD8FCD7819B207B9037FCF53E3F
-C81BC00D428CD5A5EEC788BA2C974B550533A30A646FCFAAAAEAAA443B09510E
-A9D5FBF1E5DCF14BB0A116C91B4E760DCAD201020F63718AC3A8BE519232CF57
-1D2A077A95A5568D12FE61C78D6C1198D523AB1D604D92D0530434E4A5059F6D
-DEBB5AB57D473DBBFB3B1D08E4C1795658DE4D6106A746ABC371D90A6D31B36C
-6F950EB16996CA13104C356A77B7652471C811893A359E824BEBF8869EA13989
-3133DBEA5CD1A7447093A4B6500EBD5F434B7736D3BC909E6B51489A79F2D8B4
-6F8863EA0560F02557175460037899DFAF5A93871468F56D341680C0B8D2BD21
-709F35B66B57DE6B1446910F4EF5DDA5DDA3A4EF486354F087449F231326E4CE
-6E1019BA41FEB775ACFAB6CFB841FD1EBC0BFAA6BAAC3B72605CD8ED100643D6
-6FBAE3DA56F5B6CE1F66A572B71958FCCFA3D1A312FD8199CF30BF0383EB0802
-2824A093336EED72111148C8F94113DA68C6A267153171B00335B0D7927715D0
-7F372D2F946AB65E1B19CA318F04686891B6E09F0536CF77C24A8C8EF7A5FC05
-61127667715E4CD2A547CD92BBCC219C40F4E6537036BB416783D54CB182380E
-87F7E8D7DBD023ABF937085F12C81D92D65F97F70C017FD25E7A218D484D6A1C
-B490BE23B603F763C260BF5EE4F9D11879421C14801948F4EB0B613219FFB121
-A477496AA5F5C70025E15B198A54C38E32A3E65B5678944138F4D0FF07970A81
-B23DE2CF7B248E8960EA358A3ECD637F779EC73B614B5AAB0B72ED62B1FD5B7E
-45B9C587F327D28B042B31045D641D5B258702019FE50AC6A08A8FA828829CAE
-573F6084ADCD362C55D539C5ED40AB1468D037F6756E7C004514A07C4A4205F0
-62324119A96F357702B338446F1E338AFFF143B8CCA5ADBF7BE0A2A66C40FEDA
-15DA022E7575D9073E10B9F7A5B1A494FDE2826071EC40BA22AF17275874BE93
-7EEA3FEC5253C04B6060189C710FC7C5E2829F53B1746590B30BEB6C8C81CF15
-688A72C2A05B4D68FFA010A74E23B5B0B28C622B1C8D266100ABD3364AE21CCE
-1B3701120B83EAE149792C87D4A074C7F8B4EC81156FB9ED3D0246E2A8A8D418
-24308FFFADDD9D20DA7CCDF56093644F425D8399E8A3A06B571D7C80753F840E
-BCEA835E4094AFC6DFDE191E9045A115936F50B97DD73580D3B6FE91E48AF6AD
-0F1B8708CFCFC76712BE2079AA6140C830523CE0E58148B36AA7827882AB0ADF
-F5734E2AD66088AFFA6ED6A8582BDA670D979F8C23042E07502EB4A8506307E7
-B62510C729590B73804DBD2129D7EB17E2164FED0389E458BA053F5B24983019
-20D09AE5948A159990D9B47FBA323F2DFB7B782FC963AFB083EEF4C01F614ABB
-5F588236986323FAF367303458401379CD8AC7F7CAF65816FA4B45F98A875F10
-86581706C369911B1AAFC70B1B1E7D30F71C55C030E5FFF4FA5FFCE97E16A269
-7982CF88E407BCFE450DFB0D0D8270C2B5C91B4523899C637CC86D1542F2DC37
-342D6366195297B4A529F853B5F910902BC907BAE83CD5522F5A0F2E4666EB9A
-40083B1AB66C9BFB1DCAB26AF910B174AF933326AB131BC080BAE7B4FA30AB1F
-422B0C17648AB95E8188B76977DCB7B2D041847C82347BF6D2F729C9174F1230
-E8612F98D9EE77EF7898A449A7DF889D137D1691AA315E9F6F08046BBBB5937C
-529EE7FD23AEFB04603287FC991638FFF960D07BB5FB14F5B56ECD782EF84741
-7AED87F9E4D76F6CC4D01FD39D8AD05757C9B5B1C1775410F9A7BBE4D9438994
-BE02A1C81CE0BCAB1B080ADEA7DEC8EB2A9F5F1F2FCE0EDF006A54A6C1FC70A4
-51D3B2EF67FB6AFC68171CA31AFDB5B30C6D86E4B584B885EBE66344D499185C
-7265595A54E3AC090BE89424FC6ED53FA7C30A417AE374E46476169C0EF5A04C
-4D87EEADB08CEB3CF5C26B376461F8891BA72FB028B2088B81BA74CE27B2C455
-7DEC6A56DEF3406DD71AD214B9529BC80CD0AA95DEC7A074B785DC2192713A0D
-85D6A3017133F5820912523878E2CE0614513137B1D6A0E1CA1B31870AE10F48
-3DFA4E6FBE782AE1E7557D157F4AB92226C4DA3F70AD4EF49D3A19FAF0169B7B
-9464EAFFB3270787A6F02E86F8E3B56D00863A00C6C68C2AB375F08DC006FC97
-F060316F3385C66A7389B31DB5D3B7A5C5B73FD1C344ED9F40BEDFD82BAFD0F8
-87F6155F34FDD9BB4E928E5264B8AEF216C7D00EDEEA633E543954BE63A7A3D8
-34468AEF3C79DB66776E4C75A9C61C482B695F6384A7F8E8AC68913BCCA20221
-2A013A388798FD878DB9AB8802504236DC8147443D150D3C85F16E443B860C8C
-1D9260BA341471BD866790B288D08A643C3A915AF31CB885B10EED89BE07731D
-7936A1FF37B92CE6C953A9A6D2070CB9D1F8B4409E25F0D1289F445F2032D470
-A4DF4FDECA4AFE4656AB302CCE0DE4D9B9D665F56DF443DAC8E5A6F011C77811
-8D6075D72FFB6AD2E63FEFE1B8DF761DA09EF42D73EE725003628833E010CA9F
-76D69C341933ABA225A1D448D1B02A24C8EF54917559900C31CF4CF96AA1976C
-B75D49A191D647CB4062CD5D6591CF232B1FC7A1792787E97BE5F9F8BA3D4586
-5BB1D8ADFDEBA915CFE0D4585B4C7296B0E0B307DD245F8BC357D3700E187D75
-17C6440BCF624C8751D160BF9D351F49E1283AC4280DB84C36E593AEE0AEC473
-0DAA130274B8771D318283ED32165F26C31CA4602BD138DFA717957AB25423D8
-9D454DE676CC9A16C264CEF9B4038834762014B65AFA9841234FF8D6FB6CA9F2
-F719812D43D78077C82FE60B75CBA75B7C7E664BD116A68C1B92DDDD5ADF497C
-0E7DB07E3FBF45298FE4B9C994E55803FB965BFAD4C2BD156D34D79B41A950FB
-7DE8B2DEEA4440C93E94C9D3369C7DB4F297555AD10B1A8B003DCCCB94AA5232
-CFD2BBB5C223D8CA488EA15317D8284F97AC5E46144400797544EB86C2F7FB1F
-B806596973F2C8FFFD6C26E14C13DCBE138C48DE544CBCDBD16ADCF2E28D5319
-0DC91310740BCC46E657C806A1E3DED637C488384E05615E78C96FD0DDE0F5F0
-170A04AD520E0B9BEC13A133DD976794FD9A63FB22F495BBA2DCC7BD11FC8D65
-8A1D80B2CF25666D444FD09DD1650B542D894DB7547A03BB60A9F1C673073A0D
-789A66A3B41678579F42B2421878DDE27D4873D4FEC825685E90BBC6E9631A4B
-A5F6149B7C16962139338DF54857B590E9A39926B11D0DCEA8388E7336AF455C
-F5C39AB40504792DA3193B21BC793A63870CB7F6BAB8D0D51FF8125FD2BC72DE
-A210AAD804AFB1D41B2E8ECF2936E74C53532775F21EDA729AA902B3C8B2ACDE
-0578353AF3E9177C7906041C9360740841E64440F5815BD40FB1C41DFDF515CD
-D47837C9654689CD118714FD6D8E4CF21A02B01AC9AEBDC75341741DC5ED3C73
-1DD0EAFF35BABBCE1CF9C207C1DC79F47EFDF0EC07D6E85D7ACE2FA8F5AAE916
-C80B1010086AC1E91B957A6A61D91113C98F95BCFCECB3255DC548A03C37612D
-F9F47139A49B7236758A419D57E42694B0BDFDBB42EAF30E7F49421FB9563F72
-7036DB2C85AC91A83C37CD2EDE94B3EA82C45BFDC7E1696C76D15EF10141BBEB
-363C098591B35024AC9D304B348D028F573ADB949327370A0F6EE2B8C9EA50A9
-9BDD725A81BB626CC124E522E9D164E10671A93BC36DFBE6025C34783106052F
-142845026D6B18BEF2011E0BD47D03417EBD88F1D31FD36C61781735B5A1EAA5
-8C8E13BB206A6DE4584EDC53D0CEF8B91B59698106B9535D62BD88D80ECC85B6
-1F1CAC049843A88150359315F12D9940FC65DB61D8DBF588C707749E8823A53D
-E19F6C060759BEE9A19A7536599754FB587751047B3723001349EE3A23851B68
-C8F5933E766D5CEFC618C0E551069A00BBEF52DFC94A3E5F0E5391FCB97A21AD
-CF73E4EDDCF179730BFD8429DA97711A2A0B3853946026E6E8FD8F61C735946A
-25E44B958697B722B52F4DD3BCA1358E2AC87A81840F05D76AD90DFF2756E7B8
-79DD5D43F0CBB873F11A9B753EA79F44F62BCBDEE84CFE171AFAE64C236CFA05
-521638B4F8CB880491BBC67B7C84268106D74DEB6A1BD035D9E4359C9417C14B
-6EEE4AEBF574172122ECA13C800E178B7045C2D0B1BC92C07A5351C15C50BBDB
-E7703FE1BE7E668BC059F62533786F36820D2EC57668C53B7DABFFF06BFCF199
-268B68430F3FF275EC74EF46F991B3EBF9FEF1B86659F81809DAD9F0C00718E3
-7DF1DA8521316FB2333305D58BF90854C5A9AAADF7BBACAF0CDB9B687CBCDDAF
-30ED6E7778E4922B9766C461CF3D336B629980C3BD2CBCD246C0B21D0AFEAB5C
-B44885D1F82796B6B064715FA3FC41BE38D338ABD15B7C627FC2D067F96151FC
-8AF9EE0CFC15F16F4C8B6427926F17E612C2225274248B7B0809E1B08380FA9B
-DCADCD2D1B26D1BF6FEDCB13C54489ED3558ABBC9ADC7A6610C411AAAFA94367
-7452F9260211EF5CF2DDCADB27DC0BA52C4EE8E6F5D98CD6B495755A4B52FB65
-67366EB69F16A3530371944BBFA0C82AB9459D718D08F50C60DDDF5DCFA64B1D
-71DCCD8AA01FFB9387DD26DEFD30D97D5F9EE03F5DA165DBDB0D2052054DFD60
-DB8AD8A389940BA24F7F44C0307A9A446E3D53FB99A6E51A18B4700DF8F79D96
-1F3996630D3161EE5D119B6C0EBB57A1ED333DC8F18E35E5A715AC887257D37E
-EC3BF6DFE165B62401C3BCF3752386166372061F6CDF94689070432C283C2277
-A5652AAFDC83461E0B5960997AB5B7E8F6CEB6BA0E2D9AAD4506ABE0E7CB5379
-77CBB9113727093B1160DA55CB2E6F2727414E53D8F7F66F45F1B7191AE7113F
-FA7E11A2D144F27D3681258866A2B8F9C0BC12782CCC83AD847D5976FA7D4468
-78E55ED04B32B63B2324BEE7251FBC9C93223EFADB8946A267486F9863CAE636
-C602E5485628158238D5F6ED59D996E41A563B5641CBA250BAFADF44B4959C03
-838775AFB5CA6755A3C7DC78F1CB1154E63BA7370C4E0279CCED6D2E34695243
-6460A4F88C11842FF7B4BBD73711F2FD06888A02C0C5759C581DE1716C80DD56
-5C2B0223A20C56196D67F7A6D7B5F711743AA31B3D8B1CAFC649E1A3E227E32F
-8A7716BB8E919A4F14F2630FBB1662767A1348055E48050DA6547F2B45FCC664
-8771E58CBD281DD1070E045FA81DE783F831C50ADDC4FE239FE4FCB231BE3F4E
-2B6B75C719C88E69F8B3B38D25EA42F2B6A71B03FFB204076DEE53EB22812C36
-62A077A6097FF9687732C4B69F686406283AB883A2FDF4C5FE70A5472359E372
-DF28BB7DB8DA88E2399EB61FFEB037E484264561BB7A905DFDD110C5B110FE4A
-2FD2FF3A1E3E1FF6CDA888F2B27522FC367999D7DAD58A29DF8EB796F15487B5
-11FBF4A8F7F6C9905C1F4E5E18C9729EF6C6028D5AE027CA67C1DCAA4CCDBE44
-A7D74CA0F6ABEE0BAA08C4A5A3C35FB3CE59EAD3480307132D25522518FC2331
-A46F67B236C4F51C9852562BBABE2705AB619C4D4F52675459F184FDD59AFE95
-30B97EEE211D690643BE8126130F3FF6EAD41FD9B760139FAD1BFB429C8BCD66
-0D504B64A7C502E476FD6237A1BD7CBC187AC7A30CB39614573B795F1EC2AB5B
-47953B145DA8FB5990A80B515B4F9BFD32349F8F882E9BFEC8A321E3830A6379
-7595631C3E2E9B6711374532A8708CB0B554648DE5128FDB4D85445661AC950B
-ACE8D7EC9CC3D5C756EF7890041957B2F625075DCD762A04442C0C5EB983B820
-22E64D66C3974D031D6789096E7A7A0D2D2A43FD1ADD8BDC80F9D1B381D67E3B
-28B421336DD8812030E13FE79CEA71A9195BBC10EA5BCF2A446099ADF23C4310
-A7C0E296A311ABABE65AB2AF49BCAEABFA09CFDFC6C7B001B9CCAF252D6F76D8
-08DE4E08DD78DEA1FC92A5039BED5FEC5C276A1130EA569341765CC3EA94A4B0
-442244D7DFAA37B2DAEB640A4F014015CF54EA13CFD931517E3CBE786A6C4559
-182EA384C2113DE85A3EBF2B9B4E8356AEFB12FC9CDC11615CBAC7258A3D21C9
-F26CC170C3A3E774273032848D24267D0E7699445061B05BD5BBA4EBE4FC22F1
-9F0279CF940C39ABB756CEE674528B1E78D514C6D319F88B02152A425D4D2062
-7E798DDEA2149EB6D4F35D435C3777F9C6257D2A82930F540B119C7C3D0807AB
-E383C37AA4E09F708DF1FDFE2CC8A3BCCE624A0E0DFE6F7A8D76CE50CDEBBB1C
-6B61F75DBD9E52B8209495D00B7C01568F13AF0B5D812DEF37FF9896F83D7643
-A6A84920820A22BDCDBD9D5CB31A57C2BB67222ED05E71F061D79BF09A2651D8
-FA6ABE2FBB465F4310F1BF1BC5856984F5857398B636D1144F75202A4F9C4022
-0DFE3F18FD6043C381EA81B70DAFE2B776E88FAC1D482775AA6B452B81F5B396
-21A97D7214B5C1A766B62988330ED4CDFCDCAD8CC165CAD046278163046BF696
-BE49C3AFD83A0D6850CBC9FF1751D90433C03F373B89C31A0137EC9428A9C744
-72CE4653AB8B1CD3EC345C90879BCBB7C89B25AFE08A9FD880B78C9F6FD42186
-6103F6FCCC9E0FEFF506D56B5A98AC79F69DD7D60BDE46D29956E47396C7A15A
-76887359539D654B899B6C0FC8ED736C5DE7199AC10FDD15B4FECE94E4CFB473
-0422A29427D252C11ADD2778C3777254F58EC33BB24C82F559287F92083CF708
-38A9CCED1E5EAACADA0B4CF23D83F1B257DFBA2F83883496BC1D8766A4FEFD11
-A320AD84F04C029DA40E51DB8E0F82EE343EF7383B29786B90680FA8A108A94F
-E1CA201327F0E17C392C706CFB7515873582A090F93C9BA2BE6774B810FECD10
-01CDBFABEA808363A1374672AEDECAE03C783F7E2C85299E40F4B76AB7BF41CD
-B01EC583140F30817B5C9B4D22EA6D4233E7EA1AD32629BBC513F79E85A0EBB2
-1AC59E7BAF8EC2FCA88318C1DD72B1E1D899354DBD8AF5C39EF980CAB38141EC
-56C01860B90DCED2175947096C6D5AD7B56F4A5D0CF8569CCC1E0EAA454D696F
-1652453ADDD38ADC336F2BA06523BF8DE4BC77969135CFC485313118989B90BF
-B00E6A34AB57C871767EB52A9B970CD5D70D26164B6617F4D19C5C3DF977989C
-687CA9F67509CB0E261E9A8D18FD6F0D7C061212B8BD3CD876CFEFC50BC6569D
-5ED1FB4C56B4E0D3B2CC1117A90DB01802D36929E28F84C19ED6C83E65A0782B
-F5EB4A9F9AB020A1FAA6B7BA6CBBE0C071BB1FB61B2F9113042C5A8E2E131FA2
-5677554EC8EA45604BF7464C5137EE17634E8434020D90CB88B94A76A100077A
-21E031DFF68439EAB3381D1436E31452CD4D2E69914FD2E82E6D9AF2FBEF031B
-53AF448C21559598865550488FF2EE2F88E3027F6D1840D52497EBF96AFA6691
-64F0671E2E29C6EFB745ACDBE97709FD452FA6B2BA43E1B21320862B5019F8A9
-52B68BDCD53B35BDA09F1FC4C480CFA3B92719E360BF124D9A9E728BB8D4AD56
-3D1CBF8EA793F509CF59585D2443DD46F15B8C86BA6438272ACA57274895771D
-637365F5FB3361631F68CDE33A8E8B5E7FF3CAFAD3344FE57FB79115E2E67678
-B1ABFF4CCFB3540B6F7AD4189088EE0471DE1207E97945B4B74350A71852C0C8
-2EE1BA9E58C467B3234985794B04C91F6A857D5DE23F7B71CAFC182C7153EF1F
-E353F897E22851A621E1D60FB5BA7FB0FCFFD4032F714F30B69609C9FB9B1032
-CE7F88EA8C488D55F9ABD713B603273830D45026A5A4D6E8E235E6772B43DC75
-59BA22ADC7382A89D5EC83D516B6B067DC0321FE435AD294787DC7A736CAE106
-FE2DB1162B182B1C9AEBA01BDF7A13934F796F7D5962D53C90084E5C5B0F54B1
-C50BEC8A2B11841E08B0B3E4F57ED0227298F2FC5F7553B0F3D522A1FD5DB5AD
-261D7E37FA8AF178BB9F57531D728D266335807E68D6D7BA036804F0CF9D6EF7
-E024A3E3E2CA30911E6F37352A381EBDE15276CC52A168FE21AC6F8078CD9E80
-0E4212AC2AB968B339C7C55BD52AB03A3D0A65A10652149B4B56687105F6B51B
-886A944C181310A86C7B824508A4614DA7EED2E942AFCA91C8685D9EFE369883
-021C308CE882836A5CD0A87C8F255ACC770B815F79EEF626A12618EA3AB0BF52
-AA35B2EF24789BDE3C8EF3E282882F3B7256CC2366A131AA8578FD14B369E5AF
-B6C94E61BCB7FEEE9AFB30FCFCC9BF85B0444056614F18F99E4D456E50B977BE
-E3D9996B9E817010678D3B6F733C4B3C48DB1E6475FA6E0E5C8D6A37517A1F56
-93819C842B090BE09DE6BC7E5D8BD3351DAB8469A27D9F5DFC4227EB534E8750
-695FBBFE39024507D5B7CFF063435E3EBEA0702CFEB563B3130AC0810A3BA1AB
-4597EC9A2487D8EF0FC7827474ED4ACCDE5F680CFD17651A21E3EDC15E9FB31A
-F9DC51FEB169A884F15732C1BF3948E8B96CC55563AADA8B3606B17218D86349
-470CC300E618135C404A8EEB551A10571A922B920945CCCF0F315D1A75F8C4EE
-1A0641A8915BFBCA53162BB40F6AD8E8FFE411E2FBE104EE488385551FB16217
-D7784722697D0891B966CB4019037D0F96A1F57EC50C4B27437BB8763A79A7B8
-F1F01F5F4BCC48F7F642C6EF1CA4AFF92EB674CF99222EA58FE888B737ABF9F9
-2D87CDB282F6A5E8C02DCA4D76A2913CE31272387E21EBDEF0D9E2F24C79A7E3
-EED0A7FBA3A8BBD9B525ADE096B4903D120144B333F0D702E0B166D433E30EE3
-D3B0659FB70A2538DF137545C312665AC28FC49DCE75DF71FA1FCA37C6D0E879
-264C6B9D2B218859507A648A9FE83A8785079FD581CCE122B918DCC74A3A33DD
-24589EE13017DC330385064B09E2C9B6E4A0E9D76A2ED29B68A547ED185D23E6
-730A46A85F80674E1F804216C1EFB747B7E9B8703CEB50C0206E0145969EF2CA
-22F2604DC3FA86B795FDBEC57D4772AE030923BBDFCEFAC1A516E5CB058DB83A
-BF6919BEBBB9B309E5E6263D6837FF36FAADD560BD7F2429CB4A5726923A683C
-DECA1F3583E08C77AA81FB8D8623187596489A8894E0A7D562911DD7AB819260
-CDE2C4EA96901F92B2BE7ED14947B9D2A949C547B8A5CF52D9D15C930DDB4E3C
-5E3B274198C2C80DD92CF75C28C74CEC39EE946A6047F6C056AB6E029A6E9654
-4A3E162AA204BCAD3B221288ED33DE3DA6095E85675A8105F5CC88CCEF4C85D8
-45F829A7EAF58B6B5D3DFA9FD708B82101C19895ADCD390B6C3723E8B3C42196
-F4AA43A125A1FCAFF10621AD0056B096C21C53D5C9B29D359A568F66C1F65A42
-7B76218410C0D4D47F64B3F625519D5443CAF0ACBCF6E45B59E9D7C4C6DF3545
-6D01216FFC11EACCA0FB29DC997CBA1E6B4408AB95CC3340C7BCAB683B7E62A8
-80D5FEC00070DB68043F8B95CFE064F09E62A2BC0C99138A5069E27C70F7FEF0
-DF3B98DE67070E05C0E3680DC1BFA10025DAF449B5E2FEE824B277DEB9489E63
-C27D82358933C1B103EB95AC38EA9F52F3D437C59DB47AA465DAC7EC07F731E0
-7F72C3868CD58DB46FB7839DE77F8B00B5ED53322DD03CFB2303C2CC1B26C78B
-B6F7624596B92939E8D6717F6C75139FCE87D549D311B8EE9A63EEB766D68A26
-689DD5EDBF8A9B8695EA4226437620AF7ABC90A5E19A1BCF9CE1B38F99CC6626
-651ED6388A1CAACD4CF505131B97B27F32F68E2F83882108598140218BE26381
-8C32D7FD29852913C5BFE5C65C0EAD586D801B0E5BBC6310FC50A92E18151EEC
-FDDC28F39FD1A323A3B5EB5DC12D263DD1D7D8B9A69B5CC156B041CA460D4055
-6B2F44057BECED5CF64C9DD3E5AF2B13053841C9FF55E28E21EE767EED5E16E9
-A033C6442737BD02C0BFC4E2137951ECD3C21F6CFFE5394D37DB260D5EA02F0F
-FE200F25E652110134711CB66547C6E3DEA4684233B3369CB975761CB81F91BF
-F6F1E4808276641AEF2F9D0577E8A6D4DE2AA8BD547A0EEF761E2C62DE6EE39D
-76CB24479232B1DCD7219BA499225B533791BF358610ED296656A3F95A44D564
-DAE42762CA32419A67501BCAAEB2360BE431E835A00CB7BF1B6E58CE1F6FE01D
-191A9117CFDD9AC1ABA5B616FA4CFF94EEBE9F84BC4338F66F86FC04EFC73548
-1F6D884F7A8837011A13127F58AB3F47F7C301F872550F558B462205726683AA
-B9AC359D635C6B7733DDB204D23AF4279CE7F5DC8BBB352B4B2F50E9721DC89C
-EE6CE994935C74AB296589C3C47F624972B7D92E0D1FFB7F5A30FD52E1B15126
-86D1595E064FACF2BCD55A5391F9AB38C3913B008491D7003782F95668735AB7
-56EFA837275E42856380E3F5B9F29C1F3C2EA94440A8C5399771065EB26DD940
-12C34F5DFE5AA595249CD08EC2B9C2E387DAECDF0E7878B9888D7630DCED1C9F
-D341C61C57B47C12CC7DFBC5AD8F2FE583A2378B0E111CFAB1891794FE65E2E2
-3CD1F5DC0A2D57F2B6E4F88B9298234756748DEB13AC2163147EDBFB9D44C614
-9606533420CC766AE517630E0B7BCF01F2B5A092CE86F3B0E69614C2E3867B9A
-99E05A128EF55B171C869616A1B4AA03D7EC61BF69D36ECE84BE11D888FEE73E
-C91C03CE9A752EE81E21E73E849931FE57D0AC6180D9884E5BBA81EA20B9C879
-31AC7E8B3B26A27D510E69512B9CCCAB31F41ABFA92CBC9972AA3B8612CD5440
-AD0C1FDAB86391E2358F209D7D6EB419D18BBF8EBBF13C7838B40625FB5461B6
-4AC315A975E6687D68504B1CEB3C507CD015A25689614B379F7EECCCB5EA7978
-DA58CE5562A85E0E5FF07FDA3E08088A8A0C8285E8B30A95FE7ED9C5C80B23C0
-F696683A43ADA8F6D1AE93AD9E95E05AA639EA487E19D2BC1377F611FCF62647
-E21F511B70CB659A0B120F64F98CB091B751A55376A60E34041011E5DE6C8ECE
-D124DCB9FA45029064DE7CA36F8CCE8FB149A220A29083CE2F7F56A665940958
-1B1384039664D4B1E3EC177CFC6DB6A98E162D89FEA3CE1C35803C4CB7593756
-CCAFFC04F2F41743D684EEFD4DB4B9B2E9C8DA8BD3EE4539405F2B1B2BC5AEEC
-F6B303C32892CDAD9E9F7B2B00175F9B45133D3317D87922D268C3CED1CD1C51
-FF4604002D6AEBC8E4784BD4E87979C9C5964962D6AF054DBE2B00FD08419C16
-9F3D7B2C70723BC7B0B5273AAFE83C2D0B1B96D7F0617FEACC78A584DFA8D253
-D71029C6884E70033922D3E2B2DD27231A0B9A9FC83A0D75349FDE08D60B9F6B
-76F0BE5614C22C5A3810DD19A8AF131DF61C98D739220243D6136A56B6ED09E1
-49C0CD780134E118D88C5AE22CD15128E00E5E47C27CFCD1E8201AE916F4881D
-EA3D220AC1798A571B4BE179A5BBB474508A1BF6C7415C6465602FF73FA78214
-D20E6F79BDB768C2F0AADB39088359DE6A5412885C21837E7B97A20BFCA2364A
-1FFCBBFD3FF10936C80448A2E8343247E552A5F082A5B2E44F72DCB3D0074D48
-BAE6C21FF654953B9E0A33AB9B33259044BDE76643833BE8588F50130087356B
-19EACBA029A1ACD80CD0DAB61094A8BDCE989D7B6BE57A58698079245DB6857C
-ABFFDE2F20116A134E2BFBFCD1A4790FA4B723142BB0745C755CFA493C33EF54
-60EACDC2AA25704B648E7A4D03127D49C68F79A3A6E74294CD7BF78C4003209C
-CED18AA524478D46D6286061E69975212175230477A59A6342A684A5955EA108
-98C38DB86533C293B419E2D7E5C4E15DC47BA14478ADF01D466DB7CF41E34196
-4A64
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/l049033t.pfa b/lib/fonts/l049033t.pfa
deleted file mode 100644
index 1c7e20513a..0000000000
--- a/lib/fonts/l049033t.pfa
+++ /dev/null
@@ -1,1735 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiSerif-Oblique 1.1000
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.1000) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Serif Oblique) readonly def
-/FamilyName (Luxi Serif) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle -11.3 def
-/isFixedPitch false def
-/UnderlinePosition -30 def
-/UnderlineThickness 60 def
-end readonly def
-/FontName /LuxiSerif-Oblique def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-207 -211 1088 993} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078993 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D9E5A3EA27312D552EF3BA
-D64EAC97A2E691AD6D6E5E444CB2AB74100E0BBCD168621F404A2C17DAE2055C
-D93986BA853006BC4334F74072DB02FF011FB0F56FA0837770F4DCE07D798EDE
-1F4B52091BA76C81A45FBE15DB5A0D68D7A79A8DEA9E4CDC55A047442208C135
-341BDA8FC13603A79D99D9727F1E4DE02E48C52B5CE6F5562616B4BC9B244567
-46D53ED8EFAFD8C44F4FA1999EFB90044F1C32BC1F17875428F1B9282238D5E5
-F13485FC0BB836C0B07591955B070B64DE596BDBA674A31380AAD2387FDA4077
-F0C99DB67BC7E0D2F4A214F0297085D898A0B1B8F87EA37A22039BAA041A168F
-9A09FBDEF76C808DAB506A14BE209ECEDD52561A881096E9005665CD1F34B5A8
-CAA535FC82F7C2643B07D7A4DDA492AF2B82FF073FC79FCE68FE8BCA2C899AE9
-FD64352D010C7CEC4853C29EE8E9E1CFA01A58A75D91F09D51BE3D56BA37E8EB
-161BB620977C99673D3CD1D0B268F9CE2D8E5B0F95A8091634DE5B63E112F25A
-2D794D375AD81A716DFDDAAC5B40E5E127191A098317223EEE90186101A453B8
-4D60C9C1E5FEA43CBCCFA33DBD3AF962D9E9B6963667C49BD729B73F333BE4BB
-5009B89754383FAFEFBD007839B81AFCAE0661A3237B01B83ED6DF684272E95B
-A01B989947AFEFDD0DCD5E6A67D331EC60BE9B77C6C0586B6C57113D304AF5A5
-07C5766D0B19C4061E59A3EF4041F8E9CA4EFFDE2F48653B5EDBA25DC74FBAC4
-D6736D66890497C37B4DFB51CB2D7B6CDCD1D691548209BF599E149BCA092B1D
-2E8D1203CB0851C714FCD6777BCEBB26318D5C5E2E439C5CB17A93EDC9E48E10
-92166DCA43650ACBA389D3A55D38ED21951504CBD551FC7EAF5D3A8BFD48FFAF
-DB31CA6E7D0E1DDBA18569A6900A20A11A9B4B8B3383900B369A4A1C9859F828
-DC8BBC1BB653F92C1C78D24EB7D3CB97D6F1D5B63E099E68D065A9ABB7228B1D
-B6D17A5C3FC4255972A26B54AF5E9973BAC93A9F5E84220CA34E3C531D23DB43
-50001FC2BF3F62049435BBF3AC2FF0EA43B63EEC52D3AE060018CB3331882A9F
-6B05A69332C5DA24457DF7F2AFBA0FC7E512A28BF6C638FACBFFD54B90CF0768
-E5F2180D31C651B7F58EB26B484955D1156CD7F37BF812224950615DA203E923
-E07250619C784672066E8B36423A83E2BD4970F894AF6F52B2F0A6AA1A85137E
-056051067F2979EDA3EABF13255A3CE018FB7EDC0D3C7458FA67E63AB44F0E7A
-770E2D2A8309285D6B04701A53F44503AE64B9D572560E12B102ABFD762F3988
-AC2B39737A18F9A52A0BD10BE37CF64F5198600DB70B31F6A9DA9FD6B2AE82F0
-C745B5AFD6C2F650D5273516C4130052964AF5349D562BE851E4B604F60789A9
-C673EB95E8873A695BD37549F0C6F1CD390F5DBCD938320A0CBBC22A3CDE08A4
-F8D15B484B34DF6971A54B8F7FB1CF485EE80B16412EEAA55632C6148404D293
-2B574F96BC9405DA846B02C1EF69797A0ACC13E42BAA953827E28F17D57CE611
-683565E3627DC24E3B67D80E2C740E5941431F816F60249DBDE5755BC004157F
-7ADBBA7F7ACF01B405A87382189BF6540E6B53E52F772A05B23462D1E6B11F1D
-8462B8474CE66638DFA39DDC6BB35E06463312D4858418A49C71EDD693348F23
-E3B6C4BAAE2D228D1B45290A316721673C256B03378E998594847503606EE7C1
-5276590ABC466729F36F907A0B37B5F1BC381A115A65DC2B2C5B8439F85901B1
-BBD6EF263820E813F9E4BD65E9A29FFDD9178D22EA74552E22DE6362E465D698
-3795D8FD2487B2A624D5C535063F1B2BB3DEE07E7BA4A5936BB0DFA4377BA2F1
-FE555D347799403EFE551EFF30BE7468A471E902433EFBF02E4784B583B1C255
-BA90095E37CAEA6CBD0BAD59E3B9A14120190846B8AC02B9A6442B78E68BBC0B
-94F8E33387523D672BD366106A4BB62B1CF022364D011CF340BF08021FC70AE1
-D2B4714002FAD60CB843898B731FD401D41C25AC996A864B4848C0DAFFFC7383
-95EA07BCC6A7BD093D1ADB6E3D220AFF5669883F5C01B2820C82E07411488E7F
-66CB3CC2F58D0F867D9370FC82B6D231B37E5E6FF413669ADADF2264586D9E25
-AF180F49B79416618FECFA641018806471B0145DA023FFB1FC61A51D03B86C5E
-4EBEB9F7F5D5182C3075474B9CCE399CA11C9FA17EE469FE0481C253253FC03F
-A4562033ADBC19505B863A444C23F07B048A3DD044E8CD9F0BD77C9459D61FA8
-1AFD906843077AC6F878B099F776C0A4BB5460B3D1F81DC3871F3BD4C8379B08
-8309F47A42D923C153F7581EEC85AB756075CB465CC8F8301AC6D00764992DE9
-E0BF8A4D9C6B4B0EA012216797543DED1CC8AD8D89B277E586B1763F9004583D
-CF1EE2BBA82FF768EFD891834C0CED284F56580A4BBE440839A53F8636B1C99D
-89D65CEA7FCFFB44F9CAC913A52C81728800031F240A502B588F487AAE219D97
-CED1BCD34096FA682B335FF362F87FA6D8A307CB9D796F1700CDFA3D21C5BB66
-FA221D737EAAD02208240E4B882CE67D19AE089380B0FEDAC4F97E7ED7629A20
-C7F8688BE4D5C0AF3326A66C1403E968E8963F4DDE599143D8C57CCF85B7887E
-980D75A2DD2B7AA28202635645D768C7121AC6D6FA7A6DDB06BE3AB1624D36C6
-C0F31E3B9BFED8691709D747DC2550915DE2A2486B7E74DD1665F350D2FFAA8E
-81E8671F67776964ED20C46E2FCD2CF7B3E0B559FD8C9A24C39611E930D0EB7F
-B28FAA043903F3E4A0E3C1856CF7EDFDA670FA030C2A78A99F4FC80207E17A20
-63C316F77D88676C3FB96B680B1A27180087FAA1FB5CBED05EC3BA0CC5566CBF
-496545871367621CC713131BD73F6C37064EF652DB3CF175AE9636ADFFF84259
-25A185AD1F4582845C8D4B095B4F7628F1D44C79FDD16E20638698C2D3AE2797
-04723053FD9ED7D54F2A64C09CA1FC60D3410E42196E42BB914E4C4A04C39599
-51BB33559A9EDDE6FD37E9876659831E92E1FC5FB389E5C89A0D59F792AC9D51
-2A27FD50F713B97D32D83A216241DA10B43928565CFA592C54A4288118B6989C
-8BC97A4A1E3C8EF78B1E17C18B4D36F48067C9746CE3109914324B9FFAB62B27
-603ECA751FE7AABFC5E38DE09BDE9E575EA00E8726C3918DB505D2264A510EFD
-117D3F834DCD09796193CC5D6911FC7BA69DBC8350468534353B20E8EBC077F0
-9CA9090C11E7FB960DF3596125E52411C38A7E5C36F88313F84FEA1916C5FCC9
-BD772A1B9DDD67BD21B117F9F2F00FB7B1EBA1B5DF9CD89CD46E0BFA65199E62
-FB5C7F1557C60A36D87898E8C2BCDEEF99040B45585C0ACAD8E573901AAD634D
-D2F69B4CB22412EDA3C74D5D6098E8BAA1D25A1B78D07FB93A58F84EAB79ADDE
-E84D39DAA5C0E94FE8951AD145AF05E9A2A4432B7BB6E853FE441EAD4DECD57D
-D8E96957622DBF00DF38825C428ADEE495F1CCB5B25F08CCA276DCB042A63CC8
-D610CF464BB435CF4716ABB81A7166EA48CD9855BAD9046C898390441B7435D2
-FFC98669E81324854E750F49F64FD19D69A10A92328F2A4B11DBC02EB1F7CC46
-54FD66F66A32B02C57488F8BB468D73DAB1B3982DF8405BA4F1CEA9C76D10F54
-F5481A0C3DECCF250DF79F6B614B3E7CDC0571E95FC4478A20CDB3E4D4B83ECD
-3C747CE9D175AF8F8E0E435A7D5C498BBD387D9041DBBA0EB62A5035838D7E45
-4B0717C5CC75BEF851558280983D72DEE80A0EC3F685A2467C6D22F4E33C4D6A
-494589594DB320011E40993D0942E3D26B507E61BFA17A3FE55157225468E2BC
-6C63EF000588FF08D4E0F8D244152FC03B35FA6C5F6BAEC28D34F3FDFDBDFB8F
-90DAE0DFD3D284A3E859AA4F79091E373D27C04A82819A2E91AF7736AA070F56
-2429F1077B9F32E7F1700AF99146863A82481D0E78729E9EAEA3C2FFDED364BA
-D88A837491D5A6428294F60C608A3483A2BFA25FE5E0FEA30E984C46E25D98B0
-28B708C01494CF33D00C0174E18E52F9B2EA7F921827505A980BCCDD191E1B8C
-D6BEDFA50F653B88CB0144871B2AE58835B15F7CE53F731CCBDD056672574ED0
-7BEF33FAC905EBCD9D47B82F749B30D14CED4D0907DCF3DFCF0185BA1CBE722C
-49D7186BF7981DFCE6B2679E177569941FCD563FC3B9B75610847279C1A01341
-AD3C35B4752799789DFC7D2A1F5F0DFAF89C498DE1A771DFCBE9816971C5313B
-5AA89B10C8C4094049570C394A837B031BE0A8AED0A74123CCBBCE2DE1671841
-397237C7827A5BC42574E2AD0605F84B77261DD7DEF10EDE93BA9D61FF8174BD
-3BA0A966728BBBAA807DABFC3108209752FCEAD24BEBC8B22603C9E7B158E86E
-8873BB01E6D25A09F5FDFBB6EDD3FAF6C672461644BF76ADFDE82DE718BF11F9
-A75433926E4B37556EF4BE8110D82A385C324DAEC3F37D89434C5EC8CA3286F3
-A0819C04DA7E4E48CEFBA97BCFB6005D3B3DF4A8880D3349FB15EB7A614FCAB6
-806ED53B9BA76C02E89D161E8A880ACE8E4201029C62DF57099634EEFE3FC7C5
-A755374ACCBCA10435F24D5F649EC05D4CBF39150A893984A177ECB0D3956D88
-798954C873DFCE8F57D13D6652CC928E9F80B4B6D47C5CF9B17BF89456C7B91F
-4717C990911E19C595B52D19C4E5DD70AB3183C4165A4217ABCE21EBF6115E53
-8A1774E1A998893F0668FDF637A05178F5F1CC675CFE42E67D56C3365A762FE6
-DB7B670A60C81104B9237F5BE835B38184D56DEFCA72130240A2C543035B4418
-384ECD8189CD5B7966663EC5B42A83406D06210A37C65D02F7C6CDC3C499C574
-4A4E719EB0F14EAF5786A385D9BA4A04D3B7EDCF1BB35D3243264DE8AEA06AA7
-28DEBC7B95023FE76C18E9CE32FBF3AB800F3F8C9FB5211BDCF93469DF59BDD0
-662345D4D57D9A56BAB5A145DCBCE29521E30DE7C6637A812E64253584D66BD3
-83BBDB9B8A1AC464FB53009D543B74F07B234B4E1D523DAB41EEFCD319465AE1
-BEFF3DC939164B65A06C6F60AFC0126E093166A842B40F8C39693AEAE9BCDAC9
-758B1163F4AEB042E8AE1385672B62B161D83CEDD0889080CE8F76900B82F82D
-B84192D470A0C3C80C5E15C1E3ED8FD582825FC18A055C40FAE681E1EC4B16B6
-53A1723815E7D7E8C65553F97D7577859E4E63FD7EA4508825B75FD8FF0F49D8
-03047786DD59110FB7F422C6C625992E86C719F6932ADBA81CBE1C43C63DD43C
-50D79466C8AA5166B8C664D8F6E90F1A807E8EF26A1B69DC6314B72F20A390A2
-98599D640CC42ECD583F6405828CA8408EAEBE5997D15BA79060AD9C8E5FFF57
-8B64D12E6AD37373570EDCD19FFD63951EA8BA780A2D01F1B9670BB636088C3C
-4B1A8706556D8EB05F15B34A549905C330004A66083B88D6D6D3B538B93F7090
-4719658F96F98FA64F2D8773ED8BA488CDA55ED6D75AD2B8E9AF47AC86FC2FB8
-29CF1A792379143993D9E20240DCA56D3E7EFEA9466B0138175CDF149DBB6872
-565A8D48C7233A6AE4780373014CC5CD045CA08EB63631A50B8C05AA893A6128
-FAAFFAE38FC5C81D9320B116864DAEA14ECBF347953510B494993E459483D0E7
-7699A329D0EF527230463543C583EDD4D5C05CE0E81D1A51723300EA987314B2
-3352F4D19439CB60D500EBDDE5B3A293D4771A4AA137E76DF5688C50A65258EC
-DD90D1060DB86A881F858ED21DE81E407FE74E9904E98BF659282B89D9ED0240
-535995B68AEA47B05601AC9BEF4735CF94BD905324CE61374AA17FC0AB3CE14D
-23D28C1DDB70E9EB283ECBF96BC601C7B16810C46D996DEE582A41C995208793
-F88378EA764446F9AF8939AF830CC14D62345B40264362CAC8DA7D59953FC1EA
-6DDCF2142D534C0D3C3EA587503BDF46F76C459772A60C5CC4716235B0EE1576
-690C4F6E9D1C6825253BDB9CE0C710D1F0BAD5193878AF0D3EE7D51D54C7E0FA
-AFC54104158E7D0B6B9F7F83E7371AF8D278D861B91974135818DB29D89F1501
-A00CE9CCCA2662A93B447E9A5EBA74A719C811598CB09AA94CEE7D9EE8880967
-443D806099915D25D63021B4E57F359AC43911D42E07F6E8E3CBEC19B6C0496A
-24C383E14E8CC8B664EDA0248B047951DFAF98D8D8F2FB531FC408FC123606ED
-86788DBD7D42DA61B976B263685297224FEE5BBD981C5A45194046016A8B26E6
-F54EE7FD496AC4DEFA514BDA54EABDF41F1619C4E533363C5CF5914B25890331
-9A7F821F784004AEE9D10D4B47F75D0531F80AE71097B4DDE3B8BBD360EE2727
-3892959E0C7480895DDFE0A8999E18302F60979F5B2FC794F5AAEE205BE8FDB8
-84684F7B35DD6F88CF8C5AD2B982E6EFACCBBB7A4700A67CE00998252AD0B287
-E20D5AFA935A49B1ED106E71FA16355F1A54D64E0F8D2545D98FD99690C40B96
-1A9162AD79EBB7B613A015EF486FC56F2EEA41FA772EDA87137606EEBDB64E04
-E24856C6E819063B2CE246F7223C6330A36D624A597707D2385F43CC17D529AE
-4997634BA6BC9090AB520E2C45EB729612B12F9D3FD91DC4C9EE74CFC552E56C
-4D672D1306407D690974E5B3DE86C7EFE946DC7ACA248718FE3B2F699E01CEF2
-B70DCFB81F24AA2A2C220E14006B8D6E09C5101F6724E9D75BA1F465E211B1D5
-177E9F83AAC3F0DF18EB7454E61F76CB700DD59D8ABB42B1AEE8FD5565F85D70
-240B724E6D3C5935D8F42638DC82D9773CA3B78954ED6533F1D0BBAF1BCACBF8
-E0CDF3032CE880780EE8F56AC2182A46A319798C9C60D398BE16E654490428B5
-A480805FD3E59D75A2E154C1016D210D4DD3E11639E9F2AE510694FE5F7D9733
-F594EBB8A17B5A2A2471C571D481E8C04D072511753927376F97F1E3009D3B31
-ABCD1C6DE64D19D471E39E7FABFD7978ECFA08E611A9932EAB8AFC7A4A1AB516
-6315B8363C62D112A9FCE8489156E6164BE073C1FA98E9D55E975B86ACD9CC87
-03542B3B79EACDDC0F525ADF9922868CF31F3D83D1E392ADF522E46D9E71EDF5
-25C3FF53ACCB292A8604CC32E8B3051AC8BBACD05948612D337DED7C027E4EB8
-F5ED77D4966D1A6B32722613F9BE146E5D7A61ACEEC0B8472E95B4E8266DB146
-8B1991DFEC19482C9E1D4058016E0EE9B2545B07CB4810F564B10D0EA86BD066
-41F027E003DEC79F80D11E9452035B4093FDB920B535C18EF20305534855287F
-DCECDAD9A1CBCD79CCADBAB8F3B55B0E59001E587A81B5D02EE45FC1672C411E
-FBEB21598F9FFCD05C55AAAA281AACA5193DA116B1F46ACB96F728D40476BD89
-542BD47C984849AB998D6DA2AF989EC1BB9A26F4361C610919969F7DA2771B7B
-055F44BF8DED74CDD91CA5609918ED52354ABEFF2DA73C1DE643FA90FE4FF2B3
-830743AB648D2A108FF8CBBEEC1DCB62A71490A6D574AB2C36792CC00CE631D1
-984014A7B9508C3FC71CEEDD417F6E31F5BBC6F1FC0AE55155F9D56A1AA196C3
-A696F91CDEA58317BE9E8B37F112E6076C765B1C25F0CC6F671428C91A57C63A
-1A69F5931B1875664D489A65698A2BCD637965FA5001F2AAE617BD5AE2DF9B9D
-0E230D097AEBEA7551245B5F6B4D98EBB1DD23C6ACBE887FAB49E9F271051F15
-E6EE147FA3B91FCBB5F0D571D69E1C942BAD057F13E4D44B4C3BCDA1A34B4A1B
-FC1B3938C1A20FF5F3C2F479FA651F015C4BB08BC019A692462F15CF9DA72D1B
-04DB4C99E145218840246E4337700D009123F528AB89469B888C9DFA38E032B2
-7E2256BFB68648EB06197B1DA3F73AE3DBF313A8C661499CC0693C8D3557F0EE
-B9479448E1A85B014F1D178C6BE2B625EE25EB51CDC71B9510793AA5D823CF6D
-7328E54584076DF26B858C9836077C4A2381F4A6EE19F4E801772C0DBA42508A
-3D92EA34CD0921CDD2C56A1D9ACEC3CEB200626FE3CAF033E24800DBD51E6C82
-FA0F7E37F3DA97A83227358C5B20549859645E819C193B303A957229F66896EB
-225922A128B1333C3AC8C616D348C1FE225DE03782E6E5719F13DB747D0846E9
-C3C66728C9099069DEF69A4F254188C46177757DEACB597E8CEDE41658FA405D
-921E8F71F91F455C0A11B8B517BEE363690C14FBB31232239F5A095CBFC7941A
-95815705868B3BE129F81BEE586F90983A28C04543E049BE4A6CB0EDC3EF4929
-D2499DD08DF2A3BCC55CAF2AEB42695A8016A4A1A52D4688AE0C4867363AFA12
-3EED7AF3200320C1EA166FBE2A42BE3157AB633610FAF827666C239F5E6310EF
-BBC01419156AB3022DC29B5C64E8F676150AB1A5CB91AE6E9453A60A5A24607D
-AC7F2B5790429364E4E6BC6F3731610769EA645101C3329C77CC30D7E7742FA9
-6E47A1F4A95E5B9A9DF448B03C764390C74B6CE38FD8A43E0FD49B19E5508491
-4A47FDA43F186BDECD6D9FD0F1D592FE384F09D4415EA6FB9AAD57F11465E56B
-CC7CF0F78A498F3B63985EE28F4E18557DB38101282E3FF5827569B33DE8510D
-9ACB69C2D3F13D791A4E095B77A92081D8943E3027F6A8AE7DF75A8946CBCC5D
-D397485BF27B974A5708AB8C06AF9B9C695725B49D670891EB0C87A4B650F117
-381EDC200C8172A35F37542F207FEFE29ED8337427230C2B16536FAC2C89B550
-6F714AC7D8870775AB79A072355DE4A5B4D1B4520FF18D626A8BD3F6BEA2A17A
-8EA40E7A82494F7C063830B6B81779212BE325569F482C0239E11CAD51B49207
-012F36787400AEED36BC61A6DA3B497E86D4BE1E849E577C89A72EF77A6E252E
-153E83DBBBE61BD4AE74D470F8A729E385628C9B60D12A999C345C19348A0F95
-6EE4379A54C267466537316ED4BC409483351B747C91241C1CF777B72491D418
-8BD37616222529F07681FE0F43B3ADA4847A612C7C56B5B32D8011D13A9DC226
-116C53C017F2E54C5D2EAB0047BC9B01A9A414D2EF9F51D9E9861615CFD729B4
-FCADE9B5C9EEC3D84C9F97B2528CDE18C4B461FD56A5327771C977B13E967091
-B8B375C0E7A63D93681104AA2D00161D1A9FC91457DEAB8114A9EA93EF9AC7CD
-B292CA7EB423DF2EA9183A267953D4B431A5C532B26B12A4D2D681804DB2A908
-4E15E30372E42740E3E04E044BB9E97252B95A7BEE944E3840A4E9A327ECD640
-38194D75C20F80497DB572929D7B1DE23C5150A242A5D042988C83F39BB55958
-E3BFAEC4582969F5690715B30A44B6CFBF33DF363400A52191EB2BBCC599F2B2
-F4FABAE2BADBA0731D59F1B2E43C97769BFD3B9CD210018080BB38A06DE7A42B
-D717CFA65D48118E5FFB29C2DC85E1D3068261EA15CD6F851C4DE7FBE2D6B4C7
-A6EB8752F6B4BF9C5DFB7C3282D56FD0E1036F3D74C2A96B4D308D91C1D83F93
-E59BB92411EE3CFA1169E5C92A94A32CBAEC1B570CC34F14B1810C1144283402
-F6021537D75F7B98DA7459921CAF5DE5323C1C1400C79B1E9BAFE971F7F21268
-4AC50D4D0DEF6E15F2DCB9541C04FE993AF7982AE5F9C4C6CBCA302B76EA1A6F
-DFC4D325A8CBF550FFA5D9298B4DC9D016A66FC44D3ACD5F26C980F61AC2A49E
-B738EFA01CFA1ACC7F251E87195F70385CC3B19D3D7701CDF9E4CD52FAB6AC67
-C86FEAA4A793FBA499A7601F95F9F934495FE5AF5EC8CCB8F1C061E9733EC0C4
-845364B1F0A232EAF557C293EE11704617B82DB310FB50B152A711EDAA13182F
-6AB5B07064C07CCEBCB7ED57669150C74A2E72E95CB979EB18E439D8C2C55C23
-3A66A30F43B2C40B939592405EACE804CF149A667DD795016439668BF538913D
-A46FE03F8A45B348EFB1F5A454BD392390225351099E12068DBD8EFC37365FB2
-899734B4D85E0AD8D98F18EDB76389713CE43C0DD27D4E0AD99BD3CED8359325
-CDFFB957B75D05325AF1FE0532260F41AD9C37E5533019AD8ED57A1D7214A0B7
-FE158F9A5DB18CBDB2CEF1829C6DC6CDE3A14D2E7BE72648EE28C088EE03CD66
-EEE9C566F8380473199F069C73C621C8A8FA0A3E606730A2A6E3B0C72C09B0AF
-46803CA2D1134E117D38C827AB65BE4F5F8B1E43F1294E07C38924243796B797
-4F27F3124FFEB4609518D629C0FCCDF235363A523C0F6AC3D37BCEB1DCD10231
-6ED57B4137242BBAD3F625CB0D79AF1A46DFD85232CC90F5EAB36E950CC5D7FC
-345A443B7F1CCF0028A6759F37F7356EBEC1B1271FA22BB0A72DE74EED1F8E5C
-C9A20D9D2115C7FEA8EC01F15FA28A2F4537A3C21EF9A168017327BC03FB37EE
-FA1E0ED6BD673F79CC1DC21B88C26550A14AEEEBDDB1E61CCC504157E461E29C
-7BDB3D919A2986B5EC8EB2D732B0B4BFF561DAA1E9618CD256E219C4DE36B69F
-4B6DFCF81B78F00D14145F21FFE675850CDDB32D499BDFBC1EC0D35787225CD3
-DEDD89FDAEE89501C4E5850F06BD948E95FAA06BFD2556BDB16259D19086598D
-DA982F4D7593DC56130F818CB25DD92F2388520E730C8B3ACA4E03A3CF8CF205
-FFCF113E4278F0B5869E37AF3460C9BD1DE520D277AE1A09F85E276D6F16D7DE
-C04E12DA6EB6FEE8F9285E888ECA6B408A8EE929ED51F5A7CAF5FF5F87579604
-889BFC328A4E43D308DF7B6F89C059DBDD4458D521A4FFD66E8339D883E1B7D5
-951E32532F60D1B75845DAE58332BDDE7A72A8FAD548E31202130EE23E730ABE
-C9007226F3C24AD929158D6A266A045C715B293A3D7E8447CBE6062BFEBD7956
-9088865031AD88B5329D104969A1FAD918F828208B743B650ABA1F345D9D6227
-5E4AF25448CCBB425DAE77E2CB9B73C73E0247C3DBE67F7BC3401433DBE53E08
-561295690C9F93A07D10093DC2AE953174ACA5358B40F3BA9DCF0710C49976A3
-C482B698FA107B25B246789B91473B63B4C9396997BBE4C8A5821E9F6C48598F
-41FBEBA01C031E5B3107A5D20839907D62D51F721ABD116A40692084A06818D6
-19470FE3BF24062BA7E62A27841DDC319496790E027DBCD4EB1B87810F936D5A
-D33212E5CD654BDF7E245D04A555640DBD89A6A998A6A2377CA8AC615734035E
-44ACD5BCBDAF14DD345D8D6B8A34AE91A6AFA2A7FE4B09761A732DB70692691C
-774659E2768D84943091417976A6ABE11095605C8269813BB4811F0F47A8F669
-34E3168FA6A02E4DA5335ECFFC0077F7D3D4573BFDE1D22E5FC066AB27579763
-422F27362794478CA59D87E9B4049F7CCBF47854774BE273A6B6F0638F897E92
-741F3144F7BDAC4010929BD605D3C52234F5EAA239A68FA7C52CE2B184538C06
-E0A90BE79DD5FDAD372D95213E30F9C2A999E21F598BDEAF6315F5C3BCDD6044
-92733C0B012F610C25E146CB6F17AA6CBDCA88116E7B551B3B882179441E0568
-852F3E714BAFDE7ABDB93BBA3F1C04E4FFE87D786B38CDE07FC9797AE301F3BC
-70013745A652EA5A8DB0265E846BE240D4A456E3B1953553D1D36781FBF11C50
-90C2236FC2CAECBC91C0FC04FC9F3B86BA31684BE56309027044EDAC9997EC57
-247D28A677AEE4B0844EEC683A2227969EF18F52D1E9C926569AFB482CC0C475
-E0217037378CFF3B701A798074AE248751A7DDA18EC1138BEB5E57FFED63B920
-D9BE59FE503DD1EE2909A7FDE826B40A419CB0089C91D6A134EAC709CAC514CD
-DA21620C37994A81709C97314C1A09BA6AF7206122BC143310CF7D9CDE96AFFD
-ABF6B7400862212ED910F90C9E9B90BA2F7AE0364472576AE09C193D7F327016
-D9C68AF2F55C13FE4AB71C2B4C7D9A9A58AA097B69447DFCD98219A2998BDA74
-00807ADFFF265B30D1A9A2D967856C911A15D89A147016F70099D7AA84E661A3
-64EE3A3E379ACF29DDE519099453FF94441B19405D7C873F6DDCAB0EA55E8271
-ABF2B29FE36B9D3B2461D01DEDDEA93EE39BA85B6424D70A72AA4B05B19B6D42
-D46298C7D23E94A88FACA6D476DC37E379F537B80454A61678262B39B84E0530
-F21082CD5EA2D11623EBB27340297A0311BC422690758E11E6A2D14668C3FED6
-FF932118DCFBB0E4E8B723A2EB58367A96B16B9E3E466F9ABBD458C866CEB4EB
-D326D8BBAC28163105F537220F240FFCDB3CC8D35F60AEF379B3679ACF3F86A3
-C0E32746EA9F67C084B2A80866DC1564CD4118E13D0E3842B623191E849EBD64
-8E89ED9377F700D60B0FB5A4248156A1D5E8400C21A2EF623730FE9530382652
-705E3C9228D9963BE6AA380A98574C52EB657B6F2E142AF3F0250FE04EA1E913
-BF95A78EC7A6A68FFFE15FE8128F3EAEFD692A17CA5F779C705FD1896B1C9BE2
-09E8D23F3BE13C3761DCAC7D89679EB558BFE8BF9A03B30D8790B7247E0C094A
-A0E14581C633C41987F33D225F9ABE5E1547310A2F2C755CF580485D7328E451
-95D7C240A674262ADFE530034D164B066204358E87699216995BEDF3C437A77A
-6D9DEAA3B088DBE3C510FAF44F92D11A9795B81682F992318675B181532BAD48
-7C30BFF33FFC7B0D756EB2FF171DD0FB853178FDB08A48418A8494C4538D8300
-50A48E926152E47B225932AA491D20754B115C867C40930F85ECF5D82F43FD4A
-E1FB09A16485AA8DE8481E2344C8BD2EC4C3EE82BDBD4EF12B793B74454BEB72
-10DE166D7941C0AE41D9822B8B1A5BFF31A411A95321D4B3F81922E711C2C594
-7C8D17D535A289F32F573F5435EF81F7A6E15D2A27E6020CA9602DCE96520A5E
-91043C649E41950750AC2B991524FE956D3A5AD964D1313C2EA55D4B5355F7D0
-49C8838BBF2C970A150F272805E66AAE44582A5840D7F0E206D82A411E7BFDCD
-8C52A9BE758D312192DDC8FF3C4B3900879307282815E4BF9511AA1810509CF7
-14AA4025436A8E20702E2BBE02E0060C875D1B25FA984A3165B00F5CB82962C6
-6D2C2B594AC551828A416536FB02BCD49090FA6C7AB58AD771D02F6895374768
-4FCFE729D2827DF513E1C60E4716CC859E4D87B049ECC8986B68E7E5C0FD1C04
-AF1DA089D0FB03897D48E7D4F2277B8AEAD3A24147D0936C54D487B434C48B19
-E38A0109C9CB131359FB2FE6DBEBDF180CA8C12C2ABCCB46931C662DB2D3DB5C
-0CCBDB6F00EC033C9F923DBBAAAC0BBBF4A35ABA8F2D4AE7F868213721F10D51
-42BABD11720505345566C5E2594867DE91E81DE20709BAC6888CF96B4728E2DA
-9CB5032F3FA434B95F6E55F484E1570565C0424087D1FE65A7BA94459FDECB20
-02A522FE8ED23D6EBB943F185E966F7F027C183AB1127A0A7EE43A9EFB4A127B
-43FCE7527CA6D3C753626DD9D35137B7BEFB4D0C7A0428D6E12512E63BA0B82A
-D8E22C7D40477131568FD5B9E01F4C23022190578DF4B596FCAE21A6CAC7D573
-BAF887E02FD103350C0C6483732E94B507718B8A9A378DF180A41EC67BDA506E
-4D8FB98046D97A626284261FF30F456D211D5C384A16887706B8C659B2281B9E
-AD07F74DC327C12AD6B828AB0CB757A83BD9D135BD0799B5F8969F5E00DBADE8
-5A8D191228CB014330CF17720C5C2B8564BF78F396B9F518F96A92CE80D9D64A
-4DE45FA6DB005EC8CAFC6C997E9F3B1688BAE40F0FA54A7F5E9B7AB6664F2E94
-1A653398F4B3E45854D3EF1789E8F769BA3816D5EF896A997FB64E0A8D06365A
-ADF839A43899B0FD2411D851E273B4B0BFB5A1174AD6D0CEB05915F1A8229547
-F9220EF578AA6A561D949B48D1B6185F2058F800BBD758317E4D555869BDE73A
-A5B130A31718C787A4302B76297F94C503A442412CD263F5510A39E6F9494664
-724329E58CF259950CD1579297B9956BB9435B6D44801C058E28DA4911C19CB5
-368397D382C4C6BED80E1AC6CB7716E9C83CBACB87173CAF0A7B56A657BBCEE2
-8D252EFC0FF59ADAFC582146D2074BC71A3BC55D2B6694842C0AC9DE6FC0BA58
-C67AA00F8BE31EF69343479C04F1E4718A99EDEF7C54EA07F6FDB1673B515CB7
-90BD510B6915016564A3C69C7DD10D2896C21E1893C441243AC3D3223F878DB3
-D98A58573D71008F7B5A574AE8AFF1D9BE4BDFA755459A0AFA87EB60BA40E9E3
-86ACE3DC9C8C83CB780B705390EF58C22AD86E3AF8AE9EC7B098E3A4CB7A20C2
-364844C91C9B092F3C80E5F0C0875C87CAB85005893837D2A84288F50F595A2A
-C6F7524DA556249A48B1D6E407AAECEC725E46A22EB1B0CB8A03D1C853396D14
-8135A883BF18DF240F8B19CB176B064E685B60B93B16C74B6E988AA18E610FC0
-150AE778A8AC1043B75F43D477BD8B5EFF5BEBE679AE42571C7A8974CF07F55D
-1FDBE94C2B83D8D50C6B1FB66178051BF1C42EB489C0EBC39DE09549DADFC50C
-8140F04C4D065549800E1DCCFE65BF708B09D177C19D3AB5AEC42DD4CB645A7E
-C52A360D67920A2F379DF0796DB1D31B2BB681E759279CB093F545262152EF1A
-EBC19FAB38F4649CE126E4051AC6258C6C301A2285DEE5605FA2B337356E0B36
-2D927CB3361B895447EE897BADC86B875E28679DAA7A23C71590BA5F59BE94B1
-18670F3934CD9A3402A4C8A154EF6A8C9A0238F2F2BA7C4CC5C8CBB774923CC1
-2F12543FECCB1635680275A48309AA322D43CDA5109EE8E6E7E8472EF199785D
-9E84A5D50E433A860494349B55CF38808CB51851F21281959CE4A43781AE9250
-54011F5849FD5B45940616AC942483A87C1165D191B856C9D8479501E9A59E8C
-13B9FBF1083FA716AB4D7FC885186C551085354D17684BB7B0F0E9EB9C4A1205
-3383639CED121ED2BDB7A52356806A46954A06C00894DC228F22E704FA3E30B9
-204B85BADD5411B313F7FD01E02FC927682DF3E8EB3BD0EAF002448154C8DAA9
-8B2691D0AF9A6E6DB9DFEF0FAA136AE9A99EEF6F3A9B55EF49C85A083EC02514
-05C8B5D5FE8A273C8FD656ED257F11D49504F91CBA6933DA45AE47F7AA3013CD
-23825CD92D445B052A383CCE81EFC50927C94D9C1C29D6EF54E5BE20D876A751
-32339988D4D440EB7561E5B90F4EA7586010566272E81FA73289981CB2166E79
-4FB33F7CA98FD016ED602C78529173B3B976F11A9CA86437F942ED0AA26B5EDD
-D089AFCA5E3285B85D390031D1A942BE38B826BA08E36E6A275C87DC5477FC15
-1ACCA330651DD43750D3B0332C55197D91345D491DF96764DE969F55E6612354
-A540402879BE16BB2A08E45EA16DDF58645B86F3884E5A2669DA970E01156162
-D74A3AC0104DCF86C11C4F19236C586FE659844F0200868570BB4BCE1B529C2C
-A216F27DD9EC638F671B049CBA7F96D0DC3402478CC833E3CE19D4B42C1FF119
-39268958A932BCAF36DC99B83061149B18C800E4196291DAA2E5D6983353EC41
-966F9303327A7DDA28D041555320E4B3B5DEBAD49CBC043DF4D92C2E5F82F3E8
-5C79AAA7C3B9CAFD96A39F58914D24E1B815EA03B238FF763763DBE885E8AD8A
-C58A31E220ED192C61D9E1F3C5C13730744A2343B9BE703EDAEB42C9A53B0CA9
-BE6910779D1F94BB4789D3611A1D51F555448B8661249459CA515AFD0640D3CE
-A564907F819B3752DFDD134FC5978398AF0C57B969D5B24A92CF99F2A0DFC447
-751F988B3AC1E5E55382673EDEB9CBCDB9825E7998F332A04EEA0BD207143EFD
-BA2A4EDAFB487EACF8B4753A7343915C0EED8E9831BDD37BE699F32F0D09206B
-FF1CE2BFEC49DEBD085733DAEB2720E03CC19A8B995FD2FFAE293C720A59DE13
-D7181515582AF67F9B51A1F8531A5B0A63BBCE4BB6146DAA1CD4281CD4166F38
-012F72EBD053D5DB3D2AF3D84EF7B38EC4E6845395395DC12F97526437F7B839
-F6633DC3CBAEC03D5391314E6C2B94B8392B1848527544E28F808A50CFE94745
-B6C2E7BEB710279420E2284F37657B59248DDE57C149E34BD2B9BF6F41207188
-22D28A609D2EFEC2F04B22DA370761E1C8FB04A7A132A157F25593FBF6A62F88
-4697C4E6C2E70B57443D08F5FAD9DB2AB398D2C47B039573C85546FCDBCBB5FB
-453B9CC6D93DDA6D58B495099B5D204AC291074CDF0319957383AD958390FD8E
-BF768029B92022E9E7CD009620AB491330B8270FB8B94202C94E41397357167F
-5BD8BBEA013F3278EA0A1EA4A6CB25527C92F5BF9A2F67A38FF2488B09C89B8E
-A5BBAF61E672FECFF5511AA05A3AE001463483D86B60C7E61939FDF6306093C5
-E621F084D993ED0D4ADD7F58F9D0FD05932E2E4DF4C2CEB1B0401F6254DD0899
-B87E41C1CAA87981E7E2E94BEF85F5FF3C260710408B536EDAF78189E816F2FF
-2ABA6F132830117F95DFE7C0CFD740E20826E875DAE1F6E7AE8333B1C20ADF8B
-B882B45CCEC42A6EA5F2A50F100987D50A1F8E5FA9C00AE132D77740F48B6D3B
-E6E12B534A97663A3695491CF4E42E66DA66FB2EC1531AB292E3D8238BDEEBE9
-DBBBABA1498310DCE5B1B7B99464C463637218A766F1B731CCDB17AB17F4FBEF
-47E7FF5962EAAF1320C667A645E25FBFEE4D882DDF31C9785628D32988F00F4D
-87FF88DBCD2370661F85A16B82125D753CD02688FFF8FCC59D318EDEB5E56010
-16BFB2A8E8A151898F548C6C69BD17857F6427DB8102711103BDB2BD1C0A8F63
-31A1167EFF41E0E5B814AEBD022E941109E8BE0987FD33EDBBDDD203A18A3FAB
-2A720481F15233739E1E882A191ACA4B051BF6549A0FE597041B33DFA55BC396
-A3D200D46DEB2071C756FC050132CF58BC768224387C4B53F646EF9972266FDC
-210F24A85881F5EFCA127055FB69324B377802CC1CEF29C1A5D1C894337D0ADF
-7B5EAB50B40D91D3B0A2C3698D1603FE27CAB713502ECC3BE3A543802BB18627
-1F3148A1F9F31C8905205B6348E39498BE0E24B558ED3D061CC47D7544FB10CA
-EE4B5F5FC8161C9A341AC7CDC83F9D506AD6704554A31D20C26DBA17B6F011DD
-71232C8BB6C1EC2993160ED28B5C15A330FC1EB37FDB83C2B7FF9857138A1F75
-3D91CEB5BFC8CE44159EC17B0462D274D75C4EA3C7A519067B8B817A9C6E63C0
-33989FAB825455369FA87EB7BBC8E80A9387E0772B22B2AE50A2EBCBD0E087A8
-18026C8BE1110F88E341751A56DE4D00B3EFC3207488097453DA8FCFA4A551E5
-5CC41FF1571C73BC0FD6ABC360E406713DA218331CA552B23B33F5C689DD2356
-17D4A4AB5E0983DBA0287557E477CBEA196CC9D04D7F101AF7D15EB52A3B8F9B
-0BAB6EAFE12C85DC36A106DBA34997E9C669DBA7F2FADBE2DA80725736E5D681
-9E03E69A866ECDFB07FF17E0BA3F9270C633C1E8FA8C259DAA9407A9C8EA2208
-E0B22230BF8A84CA23386B55C5DD8E5DF685541A0BF372FB76C9F65835B339A3
-74E10EFDDF2E84872899B3C2ED02BBBD466EF25660E416575F8D01B6A191AFFA
-51897804456707B70534647A4C09D849309102336B5D6F66CC544B2A37E1D8A2
-01F71DEDB222D2A42D74C99B14C8E834F831BC6BDD4348A514D35B666CA56ED2
-D93BABAEF353159474732E67F45199411CF000C7D4B1AB7BB569DC5F3F9EB893
-13FF595AD8F1A41B50CDDA27778C68BEFDE28CC79AB8B94377919B318E32F7B4
-7B3850320E1509452AA99F6F65E1C5C79CF67B4753528D07DD8BCAABC5BCCDA4
-76759D0343C3D4566270EC7F2665BB459A9FBB81A85F7343A5E14C7B7D262072
-FC37886F1CCC8F17DC5122F4978DB35E157310E6C355414DF6CC4532BEA621F2
-14426EEF4D7BCA2BD46419AF7E01B659F04F3C663FD10B4F09EF9F9ADB946319
-EF6C61A97667B2898256575DC116363B892DC5509652A1166C3D235A0CFF2135
-60675E209ACC3E057A38BD343EA5C01DAA61AFA53584C3E76C24212FD2DB65E9
-B2D99F97874228101DD2F38D85AB8E394B0C93076AE8310A6370BD12074EED63
-39C6160DFB49AE01E384825CABE01674B9AD61FB7EE61BBEF839C40E0B9E1081
-5F50BF8BDB6244230F2C06C421847031E5378874BC3CEED207DF0DA572FB92A9
-24C312CC4FEBE8AC67117837A6689B9A4C1CF677EE4B74BC60C12C3796FC5D3B
-259907D399538B1E207BA2170472980AD2713092513D67D8A475410884883A96
-176D772793DD06855DEDADE128239C387D36CD8DB2E1D3174102BFD70BF8B2E1
-7F68744226293C8CD39C99D939EB6A4E635C19929FBA4D49B3F576B53FCF7257
-EADBA531A9316496118352BFEEAB3862370148E1A20E07D93C7958EA113DC037
-5A99A7C8658CE77F01C1B769618205E86D966F5D0F3A276732CBA6800576B5C5
-F31E739B709D75526F32B6E796E7F659AB80AB86A3986742441EB99B8EA3614D
-880F9F37671E5BC3F8CE19B38EA6EE0693CECA57A6D7158EDCEBBECC70E1E429
-C1CBCD515EDC5AD996E877CA88B290E342D82F56ACAD5465790A46DDB20C5D81
-9C70A24BFEAA39A9155532380036451E1CB48ED7B7DBCCB686BF9A32041072F3
-3879D310C2E50A6646271800B2422E0C29974D6A02337B2BE484CA0D266F8F0D
-5B5E13C2595509B03FC95C8E37A20BC8FCF0A4B6CB6AD6C1F9FAFA02BA37B969
-2E0E8036EAE531074039D62ADDCB67F7A28B1815C04EB22F8234EAE30E773A54
-5F04842B429034472097D2852282BD77A39101904B505825616B09A9F5BC1377
-678FCBBF4689E4A980A46C83AB17E2AE5C222BE8A967D448AA9492C106D259F4
-17B5AC04797F36B2BBFF569CB8F0E48CE727F7741A1B57A71655E77736CE6D26
-4A6B86E078016BAE886E069F6FD040315C89C3A441EE0A92EBFDB02D81AD44DF
-F4F29AEFE0390448CE106B5A23143E9C34DC75C157C759CBCCF87E47CFEC0C03
-3148060FCDFFCD94B034DCB302FE796F06649C209DE276FC313D6A10189862B7
-D1C21075D80C30BA1F21AF907F0A9F38BD87F485F9DF469C8C9A9ADBB85F3679
-9839E5403BD31457AB9DB726DAC9CFF72EE7C3DFB0DA829DD28F50701FFD3B3D
-7203F36E2E5142A210B695BFAEE814274CBA880DDEFDEE86FC499D203FD205E5
-6A11E5571369718AD1E56508C161A48A059098E7FF3D2BD0898A17F591635391
-B81544B0FF21B57B5D6507F57EFEB2DEC894970513304FADF02D78747E900164
-56C90030E3E8F2D728128C19410E0D2CC1A34257F371A856D0B5DED3C887DCB9
-76C65ACCEC3089352636F977026767AF681F829435E68124FDC3F4F22C1A18EE
-9501478B1627E6E8C9E0F0737107EF242AC54676AB4F632DFB1FD1DE937EC35C
-64A0E35DB72A5B524449F65AE9054EEB9315971A43A48A12B82B81258D355979
-F50E3F34B4BF541FB2FE7B31190705BF86D1B7DDE8B8CF9433A6474A0B82CA9F
-03ECA76DDE98DCC703EC6ECAA8589374B9B58C648D0B644D652EE872CFA2B9F4
-767DBC4D8DDD8E69172D8FC9E12D4A30380EFDBAF3C0210B881F1069D17456F0
-B6F4A005A1E9F8B5C673A91F52FE95FB8BE9DCCF76465BDC26BC7C29FD2D13D9
-EE86AC85C3F1526FD495A120FBD5AAC5238AB1AD736206128ED0D1755A5F7098
-8B91636223E9666726FB36AAA4B02C3FC1E37CDA969175596B571B7D792EE705
-F72DBC6BB24E6D5E592AAF9B9D6CCC2469C389D25549A1E9FFC3B549C12BB96B
-66299ECA3C0E9E2AE6DDD699E07A59593F8DD214897C22214C7300A517F7CD1E
-D2144B07851F5E38E70886C9F06AD8CE90C35BBD91334EDE8A627735A4E8AFB4
-843D624A11113B8EBA95B1C55452D5A1D1E37532DFE8004F021A919AC07C5906
-090BB1AE3AD8B590686265C5E73FA528D9DCD44CABC78A392967031A08E12F7D
-5E70778013B30559D74E4C6BA2B551500CF1071B722234DE8B4F6EBABA2988E9
-B67E527FFA26B606977B273B6555CD0B9DDDB4913B1D233933B1ACBD74EB59AB
-BAD67D6047E712C4C144EC5EDC74F53D94A790806FACBAA02E7E2F3CFA6CDA93
-F337ADE914C9DC9937CE95F823931CCA1DFD7B2BB3B4E057EDEC6373F8B6E3A2
-2F547929D2083E6795A032AC0E892EA1E4DE0F5A97785B067CBF04C86BFB4B1A
-911BD9E498A3C3E11BCF09EA0CB1AEB8B966C7504AC1FA2765D172E0A026F215
-4BB374CF5AF876BB152546EA55BAD5E3ED4504AB544200A703EAC71DCEA9F09F
-B64AD56380576FE8F72C4147AF39BC522C9B13E8DBC11EEE1B216FA638604D49
-5A5417B6B9BB23A006983E01BF51884024AB44C8A0426FE01A1428E70478DD8F
-EEA0EF6474E3F999F3F0BDA5B3C2368A618238706D1B4732E6E24368AEA068E9
-1345142CBD56044541347286877D92CDB2E42426F59D405791E7A17019260769
-0A0BF66417658C49261985D15092EA239DCDBFAB358B37FA22D6C91E34EFAFEF
-824D6FECF0BDAA2C2FFB1ED169266318AFCA0509EDDC9F9F41C5ECB18A2C2BFC
-824F82D4FECA753CD4A07A11BBF92A19525031F8A01AE2D2DA04611C4DB764B9
-39DF94E9FD03F0074840DD609F1058BC2FD065828FB587D38C8447EFF2FD999A
-341E1F3201504B3123E7B19DA117BE5648B03E7964F6652148EBBCBDB3B5F167
-0187A61C00EDBA395538CD1C92D2C0AA9AD68A2BC0881E8F2A025E763B0C0EE2
-3E3E8A9E02DB95BCF2326CF8C9AEB14BDE8288D8992EF921A947970657F605C9
-E0B90DB7C5D16EC535F5830FAE43BE9488203705041635645A2A958A04FBE6AA
-47CA6AE7952B5C944734178C9B86015C9D440C6D1A2D45834CDAAC19120EA2C9
-13C2790137B35075012779BE0249EEE679FFB95FBD04030845803CB299080F51
-BFA09748A6708C48964052C7D8502433AB1777EC4328140F7784DE3614C5024B
-5351C63AE6DC3C064E126335F968067DE981706B3E907EFA1A73537F0B268E33
-521AF616B2B6EDCFA9B0FAB31B7AE7DC3A870D1968D0D4D1466AA7C923A923C4
-F86B6F4692B6B637322297221C69EEA47E9D7B46E726EE2FB8BD9866153BB505
-C1ADFB6545B6EC4E3ECE12EAD2B0CF05A0EC1CA8188991E90E3BD7151C234F11
-0EE146C0B9383B1FEA8C66D140EF9B4CECDD3B92C3E2633A0F6218D42A60CBB1
-01375E99A55510B06E4C307A91986A70AC40F11BAADABFEFF1E2D11AC9F791C4
-4AAB4546C037AC8200216F73E2626060D3817596C588D86D2E1105C0CF2845FD
-8F1E084E431E651B5C90DC97FA78DF49F90AE9F923D889047FC7EFD70399FB5A
-3FC6A2F5AC4C6BA217CAC25F0E01C65ED9A88A58429E396C9C0AF8D001EB1E1F
-5E7E1CF6C5DCE293F84E96C6D004CB0D19827D5AEADBEB37E818B664381EE6D5
-270A60FFFD4857A695C480F6F2EA24E37A69B4A47B9D62A9E2831999C590E50D
-7716AB8BA00DA97889DADDFE6D8AA93668C03CACFB051C8BB9226713D1E9BC75
-86CE9BB8059900D038CD0B31BD8230DEBF34FE8B6C9DEFC531B21D90FE4B6DCA
-257C9410BA9CB32711BD79A11EC587921FE57B095DFD07F051F2892A1B6AA72C
-34596217E819502427387BAA7E7C324C8C36E0E1EA3F3A3D16BD71486206FD5F
-E881F999449812050164148E0776E1E84A1901C49BB4AB89845DC1082EB048C4
-1E8300F8474A3F5BF28C96AADA6A3AE3EDFBCFF9FF44254B41C9AAB0AF34E0B9
-6551C23F6371C135A2F6EC9239D949BFB5C27F3A46C5BF6E214CD9A24FCCE358
-E3DF152004AE936538E4E54B88F1A8D02646DF74CD50E205C68B3587CE090EEA
-CB287AE009B551DF09FB77FCFB36973A68383E92575BF05387DEBA273ABD7579
-C772FA8F32B221EFA1A246EEFAE8B9354FE5C5B0583D37FB53B839BE68E80D91
-DA146A6DC4C8BB34D140EBDC678AC25B79B6BBFD37C9D73E57DB38ABF84C9A1B
-BFD558468EBC5B96912E91FA3F4205F5ABFD7246D749900436B7C4D9D4C6F78B
-7695E53781E9D7976937D21DA26F4A4C4EE02565AD55CC77798F86DC49D6136F
-88182A88FD5CF4FC3D0B4ABD7C268C1B90BB850DC034C5B32B3605A07E9371A2
-B750C4F8B3B862221BB0F4AF1DB6AE3E77652F33FE9D95439F536B4EA4D4D226
-2A8E09AE1C980DB20855283DCA5410A62514842388A4127E93D304C350EBB09A
-DC693B1D90AE851957DA25E06C795CE6C3090F5AA6AF587CB39405FA90316AAC
-F980CE1041C8DCB55786D2A47C499B5CE0947546A588BBCF1149206967B15CDC
-355EF3E9B9BF4ABE679EEE80187FBC57B317C194C9DF20BF344859567B8AA537
-B92E5196AD7B7F2C427EABED44C59FCAAEEAE18C3B518A39A1CAD14FEBDC311C
-02EF80CCBBB3B023B5708920C91B2A835775D0E7AB0A0DF2E249F2AC0D2435EE
-3BAA4A853E37F80C7EFFA56C6DA23BA618C5B259618460923EA12527D779BC05
-D3C20C410AD476F416D04489A2F4C82A4E583B3C5980A33BE766BC84CEEBC1E3
-FF77CBED10B8534A7540522E1D1D92A973700053D51DA6F89B10EB0EFADC289D
-EC8B53E81B095B5599E77EB443CBAD4074FDCF7085D7645980894419447EF8E1
-945A692E3721B90B580518ABE6BEACE7BE71B920A6FB704E25321624A8D1A37C
-9B01D6BFF2689A65B237ABAB3114112B7BEA16B66AFBC9E9D89F36CD4E638F18
-8926101C2B86A60EE12F6F432AAD3F5CCF22981DA0072DBDB1AB687F6E7ABED9
-84308AAA4662C8B9BC4A630E5FA5389EE050A9E4DF53B35D86C50150FAA3C0BA
-465E05FD1CA77AA3E78B19A5DDD60E4CE308C0DD115CA303D7D105D33F9F252B
-1D6C5764BDED6609EEF2400557658BD92C650DF037B7733FF5F5639E1B2973E3
-F673AA2E0319B4F0399D9784A25C08EED747CE2FC5AC3A8DCE5397BB03943E50
-866C1BB1FB0AFB847EE73DC3CC6B93BC7342DAC3D88727CFC0284A8FC2AD8B99
-DC7D6397043E8C5340B31E0568861EFADFC08212AF630E015E24C21AAF77F259
-089CF6C8D1E2D0136BA22707D9959981981CDEDEAC3375C1C9CFF0BF91785B8D
-44EBCF873DDE5F6A4C590156BDC278B6910087262BC808A4409323E465FC7BE7
-847A33796D20B116B205C2B2888E02957520B5034EA2C4644F2E99CAB4330924
-71D1A7A65290E8D13D37C7A778116F16FD8A2B93F78601EE0E28CEE0B83FAFAD
-B52146A221B9F011D167AE9644BE125FFF4F8A2228E21CF447DE42FEC6810352
-6C7DFF028D84DE6BB86C1B62A062A969B5BB1333D3E3BD95DE87E756D7098390
-2AE560996D9557A0C1D19F901A324656E3AFBFA1AB348FC923264E744954CF08
-B799CE46F1487B3188306BAAFB8D16B07B8B4AC37E11A6A5ACA1D5C7CB5FC3C6
-212AA74DF2EFD557BB3664366AF289F88FDBBADA3A6CD43756AB8DF2E30E7704
-DE96DCE521E0F9F23F2C5C299DC1345DBF1E9EB0A50231B02C53230131B67649
-B8422865DC9CE8CD2345FACFD59F8A0A13B4B4752DDA9258232C3BB537F44FFB
-A39DE8755B381C88D94A07B561879B3AC97FD8AB89953516769C44CCB5EA2CC3
-68156538A8F8D46EE1DF6E42B31D283868E5716AE0A9DBC518A2D19826032C05
-34A8563294BF6B4A5657CA7440BFCEA23BA55F4DCE15A036B0B30A4CC283CEF9
-056E9F7DDFCFF1BFF0CEE33DDD1BE8640443D2E9A9193A55D17766E6803E6C00
-57646B20920BDA09F080FD41D11B73CA536CE6835BCEE1D7ADE4DD4FCC849CEB
-3A4F4C808B2A1EDA914D469BA709AE3663CE715776A3C6893023FD59120FECAC
-2BB5E1A0278B4804B8A5A08ADE396027120D4855DF5408B7CFF13FC94981D448
-4EA46332569AA8A6121DFA55FB6310E86C95AE03AF0656317CEE6D8ABE6DED51
-140070B89F8FDA351D7520AEF9331649BC4FD2B96433951290573014594AFF53
-E1D59C2257C38DB5F89C2D84D47F9463F6B79D4FB06F4D994D475EAC02B40590
-A2A6EEE9CE8FF2A05ACC51694AA14E9DE73E688099E5E4297322399284EB456A
-0CC3EB28F470193CA13DCB82B8A72BF0DA06843DC95C17AB25512CF75E410B53
-01D4470B5910503400E1FB0088068CC4A753DFD5F725B0883E667185DC04DFA0
-22721F7C43F301155719E4AC651C0E9DC3106AB600C9F34408E6286E265B837F
-E977906953BA864E3CEB19BE1E7472CD6C0FEBC2F552A1EC207C1DA42B88E271
-3C76D77C01705EF06D90918E9F02A8619AA10100D32636F4DB188EFE516A3CED
-5BA74EC79C63824BC1BC0A8E7914AFD6BD14DE2F5A6FB7F3D0AB1B991D568760
-B056BD18C1967E6042D161C8F4A9E536B8EC49F1AA354437662332203A574906
-2698C5954EA3842D8CA8EA5018C64B49C0CEE3CE8157D1A54037831431073FBB
-23BDB5A15B6936D772C5B9E21963BD6FE868BF7174DA2E24FAD983B3C106864D
-E7E6540574F1FD6CD5C8442635637676D99986DC0A810709C3D3BF40458DDBFA
-456DB2EB44FA75C83AA70566C9F4A95DC1DFD8F820F1161ADBE4FE65CE040E65
-864D5D56F4D93D796493042A5EBDA7BCD6283DAC18DA5A87342C165D69118843
-0E8470A2D7137E4899DF3DAFA8A27D2273BB401A7A5C24A6243D1CE9930B0D3B
-4119F0588F822318FA154E5C882B677D8DA3359E0EF21BDAAC9262504C6D4714
-5426139CA31164F05FEDFE85368A8E087D65343C75EC07CEC25DE4F0F95A127C
-29C930F7ADFE463D8B64DE535E77F36C4A84DC6C0B158C3B0E1CFA30BAF3D834
-525DD3D8F39D755B95FC306923A9771CC3161B72888FCAE7F62137B030F6DECD
-1AE4FDF62A5C586204352359C639C9DF7D1A57482707EB0FDC5C687878329AD9
-1EDBB83D3E373D5812AC6B98DEB87EA382F10CE7E282360236EB97A006967B1F
-1BA105A48DD051FEA8E9E9DFC221549E71216EF16A28469BB9A296E6061277E0
-DDA7500023F51C416ADC9AFDC0A45A94D568556E9E25AE3383BB89F311F316F3
-EF7272EF3BE368B0ABF145AE097FFA7BCBCCA46CCF460916FD0F7B4840D36CAB
-B47BF1CC0D4E406ECA0C3E349C4D7443855BC48D56F5C7B53F69AC2602F02AA3
-A430E9215121108C6287012D3079969000DE04D0085B7BDC7B3EE1F16D659195
-7E695E20D5AC8F2D32CDD9D88E21B23B5E2E0A776E35F8EB759DD20B01D3DDDE
-77B7273192442C270ECE3422DEA9E52EE99542D636AFB83AA225B35DDB5E6384
-8DC6B5FBF7EE518377B4B2A8E01468E568B20DC79F2AE5A178E37FE67719CBF2
-C0C1F12B06F646E97998A5D6A36447BE87C94533E04071DC4C818A46C98482D5
-5F557B92F3B5A592B675F0395CDC05349F49E0B2878A0AD4F2C1473AD30DF752
-1ACA29B9520EC066319191D8B14DAE7685B5DB3C85C10685EA0C5158E049EBDA
-B204C1F73E78699268C9C336B8C0D54AB4B6D20E34F5F3CD6AEBB3CCA179689F
-8DFC5B4973346B98689E6AB25D251EB83CA6DD6DBF8EEA0AE66D7957B15CC773
-4F9C26A5BD0BCF65D7303AD381963B584E7CDDC6DA9B572BE655B7601BF1482D
-CAC527069E33038F77639810D403BAE1ACD1F9CEA544F8CE81F5D78582A24F54
-B1AF188BBE247053D3F09EAB56A65214432AD104E1E588A49DA1D26E5A31E7EF
-68625B55F1B366292993E186142FF99862DE9AE40032AB70A053B003D3C19953
-0BEF3A5F6C16F8FDEEF0F2303F004EFE8E3DD7148D0B9D2C393D4226CD841E69
-4E131E7DCB3FE6D2979ED1DAB5BD7A91F97AC79FC4FB82C125B69AA9BABCA9BF
-A04AAF364A4AD81E33626B682BEE85A84D882B9C0713FF7CFDACC4BFFB6B3BB0
-E9FC25F52747B88D33935FBAE5712461093EE2BD224FD7A85BC9704F960EF2A1
-60BAE279B5EA1076BEAC60905D07B921A8F001B9D287603B04EB7B02DBFC1E7D
-132FA456CD85FE50509DB3549013A8F88949FDA83275150A58C9A6E480D5A8C0
-DC7C88445966C9DE70CE6A910628883102C1A56B386039EEF0549B7A78120649
-5421D166460E4B21BE9415E0AE0BD368BD0B9A90DF4EB85845F26F7A32E2C37F
-570F67173339084B317A22FC9157DE2B384AD6363AE9420166D72E7313B10885
-75BA9EB86C588374434557D10D456E6FCE7F024721C4C2F8E4EF9CAAC22F06E5
-013AA1026802276A8F4E1724740943AECD35F6DE0B9B229541A3B56B08F30998
-D4C5AABC03B40DC85B1F5BA7C6F699B3E4891FF8FFF91B77EFE1241A21EDEB42
-408D18E39A3C39604BFD2C5124A79AE7546B176F22BFEC91542D2F83AD5981CB
-B02B8C521B5E93236CF74B33F1262E1A504AD22EC8F0D2942121AA8C627DE60F
-B8E290A73C446BA83A97BE7ECCAC79CC97F574DE7D15C7424F6D873B367F3C59
-754854D2F0B183A13F28C3EBEC1EF32EFF18930BC635783D011A26D4B3F1764B
-05C97B9B681EEAC6B8F3922C700279E12E630497431706790100EA191C81B146
-0B412CFBADE7A563CF37E48DB5C7758CEDEEB96E25B9C7B28E8507361ECB3D08
-FB007AC448D980295DB91A8817557E4CB0E6B614C079FB93062C95470D0A32F6
-D281F0F9C45F0FDAC9539B375C2B9C9B0B5BF6CCB2D9AB8E80E4549C0F8E5A68
-2A0A246C81C9F147F9F21D98F75EDC6A3A293DBA61A8255B3E42999E281FA099
-12062B882543AA988E743EFE5311A7AEB8C51F5E3A13C935B4FD1A371F8FAED1
-7794722BFC34883350A3FB39BEE9C5FA8C6A59D8652BA6C34DD958A9352E7170
-711CDD510350D910B2BE3A9771C191818C3E81582A8F6DE8A01ED72462EBB883
-718E75731C2CEC9BAC03AF799A664D62DE91ABCBC8BDF2B39177D18B5DC26825
-F73562547130271B8C1AACCE769778738EE03B74276984BF67298021478D71E4
-590B9AA09E0C6D2B59468022F86CE4C6ADA15C3543F48F380FB260676B6E8488
-97E9884A3F3682D3E7086E8CD1484DF32C5D3DFCF0FF06B245F44A03BEDB568D
-86893E393FCDB7DF54D0DC1F5E628DC9B6FDAC156FF3A8C7097D1F49666E4400
-FF3EF4CDB5BBDE55A39F0A67854518CABE1B1EBDAFAE5FC34D1D45FAEA59D992
-716B91F73AE51DFDB14E1032F68CF751AF805A41C99AB161EF7DB88DA4B01611
-4779DD94D5BE1D8F9554D21649F5E18A5664A5F4638F939FFDEC9D65BEEB097F
-F31C13D001DDD0F94C33D2C7BAFF8681874CEF7C44D75A691F15E3D90EE7BF19
-3C9F447B2CE43B95C05D54B0755B676228F094045C56DFD70F70F0B1A04C1807
-3784289A1FDDE55B751AC021A410FB735AF90D1793F98D7EAE87D3330C63A85E
-5DCBB8E087B11BE030023BB83AD994D6C54FDF104508235070E96271E643CA72
-25002205BDF49DE412FC2DCECF3D1364090484DDA5290CADE2BE843CE0C726FE
-C54419F2DD1307E2742B115F4FA7FD8EA222CCB89B6808763D60EAADF8529B15
-C89061F75917B22B603EDB02AC709D6E705D2F3D84C31B09D08A4C188E1C8A92
-1062A38AC7F4CC83F55B974F1F394362B8D3E8777BE3D244C53856BF373727AC
-618C224C5B7CF8D94C9674EAA106C3F30817AEBF0386D3F07D6A9296417867A5
-5B9B9CFEC845A461357685A95AD0630B2C0DC9EE8963128132B4874C861DBA02
-1E1D7BE9259713E343989E16859F5E4275DD3BFAE96F382B8F31247EEF86212F
-0D577D0221B9B8965D0C2FC396FF5F38FF95B56D071E432931CD324FB790FBFC
-C6CE521D85FF14E8815E9D4425909D6C312C7A2FE077E4B1FD5F8ADEFF72173E
-9AEBA065002EEC149758F3016625256F37AD2055AAE3FDCEA074A8DD0311328F
-5CBF4CA5D62CBF21C9A5883685B8F7265F10AF6F5D464CFD13C9B40A620FF21B
-DA5F4801C8D5357C49D5B401F51DE0923D0D96ED6DBC57C6E77569FB69FA198A
-2029DF8A5F3CFABCCE3A5FF87E5A4877D0F8887EF0F4F0FEB51091894A946A18
-84EFAC78A32C7EE6082A51BB01AEAF4FC9066367AE9B5A5B74EB4A4231F1FEAC
-B7B76BEF33551AB4893958462B0CACEBBD48CEA3174BDB86322383CE32D8EF35
-BA9E1B7F4994220250359EE3C5AE78C1492833F71701D0C6B0B4B46B8641373F
-5193B8FCCDE73F2F56333AD23422273ECB807AC49D9A79DBB88FA987F34B278D
-39AE097E8D664414FEF8C2B0EA3F7BD43D38E964AD7709BE0923BA5DE504D56E
-7F8256969F12A9149F1C9D7DB5FF20425C47D68C15F0F1F492F0FDB01C1EC138
-4F3DF82B0C1BC7A8FF3CEE5AEE3992586A2B53B425118546D9314170B3877D74
-BCDEB2790C9EB08C21FE6A3FB8D567F39429F2DD066754C18E026539EA88A94D
-D643E27E8F8E071AB6EC8A30951504B93FC59CF0E801D3F920509AC2E6823635
-9ECB917546C50906C3A2F61D6BEB4E887C6C9272FAD0AED7ABDF73EE841FBE28
-FB5DE55F4ED965252883CC567C96DE4EDB781EC82E4AF9E04ACCC2160598C2BF
-60140942123DAC1D457F947CAE5E0654D38117D261F4EC69ABA52543D215C011
-F72B148E55104DD3A872B9C01B47B02398C0848FB0FF5D4C9F557D51449CD16C
-9D7AB623BC300CF38DEE6CDF4596F5B288C577814C19403220C343B11AC0770A
-920B257185D738BB7CE4B535EA0EA8F9446D8D7A35F10ED1D98F1DB7771268F4
-4ABBC51CBB2CE7F48FEED3446467A9A04A826AB7688F8525671BB3A5DFED3954
-3BEA36C1301291EC0784D413A324237445E85FABE6565A058A89E19C25CC8359
-3623738C4292091CE48959C0ABC289CD0CA5316AF2756B31B5218091D094331D
-CC294D876D57E3D5B36D96C0F444D9270B297149FC8C607DD5AACB8CFEB91704
-3930AE21ABF7C4E3C524BF33F4F4CE4EE4BC1566342BCB5B7C937902D6C4CAF7
-62539819195853646B73E749B06C59109B4EB288FDACC61CC962CD5AAFC24B15
-FEA2E8286298F767ADC5D1CE787B26E7C25B20765DD831363F228099E4125168
-7C3E64BCAB5A40D1D17150A8BC43E66D4D03712C370DA6128784F1E15BB3816C
-F38C845066DAA046C038D54A3FCDF3939D0A39123854C93F1E635E0EF053B84B
-012B3F64398194A21A5AA2A15CA473EF99F8C67DEBE79C747E5CDEEDB6AF41B9
-511ACAF55ABA8FD1495345148A34869A0F52D647C861D22E0F03EC217227E270
-8FBDA95B4F70519FFE4371F2187A70E9323E5671299F358C02D7CAC76B0C253D
-269A43C27FC6F4132E8E8F2C0FCC103143E21A4EE3E5D3E6062FA1E0054E4E49
-3CAC42D8A9B3AF467F9AEB84E0C12AC9E0F529AC18C6EE1D02A29A0D86800884
-AEE0DAAC7890621BB42E531BC53BE80439093EE80A72CEBE746C4D0BEA66A685
-E56FD9378BB056BE0DD465A145A8148C3F5E54E5B9F11F4F9202EA28EF9396C8
-2958636AF404023AD5A9D4A19163A285CBA7D0FCFEE888268D4BF46C9DA49AE6
-DEEBFB4B4B2072CA7B0B8E62A85CE2ECF876610A161B76D43D67A73C67C70124
-6BCE8FFF02272DB067916FF0A5F157BD73BAEC3456CEA84AE21A4936B4983780
-4D7116570CFA46045B4E98E65931DCACE943C83B7BD30A60575C9D34F480A179
-CDAD619F8B084FDE54EBE09D95C0433109202CC0E32BB8AD1EC3CED55DF0E3D3
-4DB701AAFD59F6D4BC29F3A533E34E45E0613A6619BCC9300223380440FBB8B3
-3BD3FFD5C7F76407076E4A791528AFA58926DC581F5C3CB53ADA019813B1FF1C
-01C14DF03B1F77458F1D33A59889DFEE4E1C99BA0CF4B04F7B11BA530B154E64
-F5E4C2BF964C12A5ADF102B4EA55D46AECC430C1162DACA9985BDD7910F446C2
-C41DBAC7C809E2058C2CEADEF4CC7BAD936B660A6E6AB17B5F52F2346171B63A
-5D642852B7046CBCF7B2E9B8CCCDCBDAEAB267A48E3C8218CFC5129BA1404253
-1B01C19EDAE3092F99BF5864427CAEC6A3F7C00AFC4328D3732EC4CD4A051F2A
-FC6E419DAC820B082C7CEDA6F19AB2CE97BDBC45708798DD2E38BC27D4CE044B
-85323D6BD9141DE647AD8EFA76D21B899F28896E73AC9C2616F46DDA50B17387
-F5CC63F90FABD2716E5548BDC01BC6D798F7311169AC071B2326D156A66BC649
-7976BA04BF4743442CB5898BA927BDA218070A5D03E543EEFE4C93D1C9503655
-10591B89D07DE1A0A3B57F1651701C5479ECA1D8C9B7FDB02CD351AB975094F5
-D4544D0712690DEB7DDA59998E13B656B38F57816E8E4EF2CEE0D3506A1D8D3C
-28AB4918BBC3079DC7436C20600EC9ECFE4A7424BB3299ED0E9E39B977023DFB
-4E1FA6007CA8C1D86D7181E078DB2516CE3F18011E15E436940291808FF64806
-8AAEEA70E5FC56A02F87E38C7CF06FE80DF9930F63E633B67EF6093296CEAD28
-0B150EF111A6D20104AF1746CA1CD02BF2DE14546CECB44BF33E239FB7185A9C
-738414D921AAF0CAD72B2425B19A0BE3063FAE017C404DB6CD8A2335B62CA1D8
-9A742A632035DB0132EB2463C9CFD4F806FFA93EC90AFFC4F6AD2852F52F0F6F
-1FAE527B45679B55EF87934A396B331352920491B04F9FC364C0182E4C693885
-DD52CB9E6F7BBBF49066852F9850B1E071372B6B77D4912B8D0299C314E34638
-C079305798A0F654EE711F28A4917BE210CBD0614329FBA0B638E6CFDD0E10E8
-64EEE1C52F077F43ED14AE2E87FE3163C3DC62BBAFD7DCABABD75F0229858FE6
-29F198374EE6E28A4C729688D7D345D95DF513F85319F7ECC40F6477E8B73EC3
-5437C673F57AADBCC35B08A271288E1DA43287140AD1AFDBBD0F7C5A0A761178
-271F0E587F04C5A2F9D026E0B92F942FE7BB27A9605B6924545EE82090FEE9B7
-DBF60FD0870068A2082B5B22BEC698460E3D452A5F92F0CD727F75317A528635
-F883F3EA161BAD1CC81820A36978666899D28126C1BBCB4C08121E248CD1D0D5
-DDD043B58012277B03F1706E8313BBB4142A10F8F775871B340C83378431849B
-E4E8F4A18BD703409EE58DD8618F94D70A57D1D13188A16BE8A5F6383C1EBED1
-6CCDF1B01EC33E4C57ECAAD2E292120F2CB157A3C6BF62EB41B9A8299728BE8A
-E03A17183E7C2B3BAF9864C762A60C414F693450F952B48AD049527468A9A8F3
-731DB86A622A3C2E5BF3468B8A3115BBA8170FDA23A6A0F1C38DC1FE1004F7E8
-443EC7E4474E19259072E47AF8771288D76EDF91F8697595B8A8C08AA5C4BA35
-2E581250F1A3610EC9D5991EAFF6938C0EC16ECC43E4CFDBA8BA42A7BAC738A1
-B29563E2D7283D106F4AB176C617A6F1B1F9076E564F67819159F7D3AA4123D3
-B8A7E922AB52D0C63819D6A95ED6A3A63E82A6947098FEB9A2F1221F962DF9DB
-5DE56A57214E4B84FA855475BAF474EC9A53501BD5542CECCFE81A4136A78ED7
-12B834881BFAFAE2A890E598EE2E11D1CBD44B6B66DD384DB7F21F30842673F4
-50619BA185CA3925AE1D922430FA6B3EFA985E50A3371A6B8C2D7B907C63FB81
-6FE0CA8233E4620050EA197E05A42930856FE8FC0257C1FF4B6706E4F9BC770B
-987BFF7CEA0EADAEA356B750134819B4BD68FA0C36A65681686E5437E8F09282
-E89F8990B705E5A0C215CCED16CA5E663C46D5164AB439F73EE640D6DA70C155
-3F69C1BE1FFA5B6FD443F9336DE031A4C9607C706B7571FFFEEC8D8FCE91FD5A
-C999821E81425432805A253C573F614895CE3570A39753B36A357F21759F1498
-A1236B1D1790B12D471D917699C19A963B866FFFFA37EFD74E0B811AB6832346
-ADCF181D963C812F18E141681EBD36482E7D29853D91683B9ACCC3B8055EFC55
-E4DB09030C38C5520E4562932C9E9AC675CEAAF41D8868F7A4E1D38193669EC8
-62E2B2AA3E597455D3FB186205210BCCD1E9B3A3564AF82997E238669AD833A0
-D53B951CB550EC7FF5FDE4A5E7C7499A889EDD8C453D99349FC4F65130849E4E
-7D76D3C9A153B8522FCBF0E8C80F6C9BEB419E501A891D9E03A807E5D8C9EC9D
-AAAD2A86F0D360DEA694784376800E32EF4DB045B32B78988CF798EA7CBD3351
-CB60C6C775B0E7B4D8C1CBDABF6841618296A94876573E9693A39DF47564C29D
-27C0CCEAC55E0339F134B45B1403D2DD491C81BD3F1127164D6DC4DA058EB7C2
-50F8C910A005CFC6990D6C2911656677D26E557AEB420B8FD91DF224F01458C1
-0E8CD85189635A3E237F605F5C8A751AFB0E8FF920B1094166C152C9AD7F4D5E
-D3074664ADDC3E807FDDDAC2393FCF48CC76AD84ABFEF4DA6465008499EF0F52
-37B408058365334FFDC0AB15C8988D58E62E7CF50A199481832968BE04CE1301
-75BD2CF84588645A9123982C8E20189D264E1FEBEB22605B20082B37502C7F2A
-BFC371277B10FF89AD4A78405E76D1220E38F9F2FA8CBD9115C11B30BB9CA9C7
-4A996AFD108D2A3B860AA8C3E9FF6676597AD9B1F6F9AD92CDAEABBC510E7995
-6BC046674A9EEF946A294F4A1D4F0BF8CF73ECE930DEA3DF887EEEC94B5526B7
-12CF09476D5EE9D7E9F570D29D6D4CE9507F26E7EE794EB9AFEFE7E89EE1E32F
-C48959A2FCCD7AC5C5C15C81198235E3C0A216CEEF1E6EC1267B74DC19498B25
-12C869A068D9E94598923D7E63E336BFF1C40025548AC0EA3DD2BCCE0B483631
-6ED3545427FF3E9E9460789BE0D6A9E39ED20F8BEC133EF4E5F4F577FE93FE35
-0BDEF6C35B34D3A3FD2815798BC64B9508A8B86DA0F0424352E872B943B6A8B7
-C0631B9083F57EE7D0D2BA76FD3AF87CD0C0F106180EB8E1C50840EBD968ABD1
-4728D49F9A4531B890E97F8BCA0589248B8E7F60F7B2CC612EF540244E0DBBEA
-828F57E5E5BBFFE0E2AA7E46FA16A45484BA795D4862AADB29874C4EA6CA5EF6
-A61306112EB3023047F31E1C16DED2D5600A1A30F7370BC707672CA411F3347D
-734D41CC60AB436577659B9C256C56019FBE476CBA18DEFE9DBED04334E9A6CF
-AFE56EEC626AD03ED98E488E02ADB02BB677163255DF5D029636C4D077583725
-B60C7DC3F886913B8BC6738C662BE0A74AE9F94286114AEC6A82E824C468570E
-C3D2514801ABA14EF94B9470FC684774543F95701FF7C6EEC3233DA5DEBBF56D
-9349174E5D0BF48986D549FBD758B3D123E8D694FDFB95BD9B94417BD070CB8F
-71992B2BE2AE0C9A36822E4E8D85DD3B337B0A9E13DE07679346C55145F38012
-AB566C38CAD0C63D0491EFAA2CE1CD8FD4938331CAD9C7E87149B8E90E6EC1F3
-55D5DBAF807BF2482A99B02BDC8BF10EFE5309D54FA108D379393BFF8AE59C70
-0409DB0D558A48892A20FC6418F2F9F56CA50878146F222A656B0E9B1C346577
-5E2B5F79094386CF535C145B5459158D74845BECB76E02D53EF9FEE8B23BD8BA
-59969C7FAF44CB5E5D217DA9E19634DF2E2A653A50F7D4C564AA875454612BD8
-B01356EF6F620D202612E424A1B0FE9B0B740C344E96F6F9EC0199BF3B3FB4F3
-9330124AA725E21021B82B845B25707A56D25FBCC138EBF0FE757DD1DCA7D3F2
-5285256F32C2BF27FD47D283E44D8BFE63CE9E9E9DE2288E9A1BBFFFCE006201
-187335A534958F32C1999C8D75FFDDA244B5A530390897449A4AC5DC6D64F5F4
-9D32AB0A9376F819356705A799EE20D2196993BAB8A58AAEBD0CFB2D9477B162
-0BE6BC4A665B5AE6E1765CF427F0CEE173BD948D2BCEC5E63BA15DD808AC37E8
-27AFE857EE793FC34C1989560E809FD94A462B0E4A5EB5C655BF6D45BB65EA04
-67ABF18D255B6407510F1D65DE2F93F2349B218DAFABD923C937F1BC70B9DF64
-FDA4CED24854859D721D78E8A21BD565F05E8179E3BEAC804931EE7499BE55D6
-0EEE411DFB1705C1D0D7AA13FDD13235C649506E111045CABC12BD36A7409923
-CB2A2CE48FF0DB470A746348F2F8B5AD886298062D76ABC0365195E6926D123B
-414699E9BA9783B6792C284146448D785FC8ABAEF70C59740ABDF18DB7B08203
-8C9684A23C234ED1C7C6315B7F9F517A2241534B1DDFC8B7EBAC878C3FE542A7
-013DA7DE6E70927D5B47F53F90BC5A580E3AC286D1062FD4653F070A070FD397
-7F88828313821C2B1FC062E544E42F0585115A6B19F32C2EADE89E31D279E54F
-8544054CA49F7368C94A1939266C344B012EC9800955A89E832F9E59E50DAE60
-AC0364A43C400B8F62815FF6CA864E59327B89A8BFB5435B0F0F5BE4F9F544AE
-332C19DC75CC3461F388472A5764ED36FE91F8710FAB141022883091894D45ED
-294BEBB897D36694334F3E968FFC4EA6B073493C32827351FC6F323D0FF9380D
-804B12F01BE6B926690A68F1F9ED129C390BC240DA061C341F0D09D9210409C4
-3C5E9696A5BDDFD5393AC9D7AB9F82E919F808317679DB70D674F46877F83C95
-52DC2EADDDA7DF9AD79B9BCB28C2BE897C9E9378657B39046A929D23E7ED0AE3
-7925F1B184573115299AE2E11D43FDA75E4A1DFE14F80F05EC57303DA964AA35
-9462759CA36DDFF3B43F3CEDDE73BCE859484AF34F6B1EF90FCBF49D34722571
-A2CC337ADD4F4EDBA0C20B673D68A3150E378BA0DFA81F6ECB97CD9BFBCC13BA
-F89762B850DD34A51092D9E4D39D6EAF8E5B401F34F07D2CFEAB932A066F220E
-869F2D19EE55663BBA117EE3E13463FFCAB2EE730F840DDDC82C5AC69C64B203
-675F11DBC40186A2E5CD1B346DA37E8D3B3C518D9480201A9C598DEBE0035A14
-355C3D66F06C4A7ED75A72DEC787ABD39FB77D3CC27FA505F8A4865117FEFEB9
-98D774B3268803E7D586FB8F5276B405680841C7EDBD1AB4D055FBA696139B75
-D1839E542902660144559D613D162E217283E112CD4B11C13A3AD04C161B154E
-AD5E2EA101FC279B83B8F313F18FEE59B20876FB99AA1587AD45CF9E294CC653
-C0128353B6644F5D01339143F692EE2DA2C640EE0423E0E0C524407387262CA5
-728D9BF533A5DA8B4B24579476FE77B263A611DCCC6C893CDB7FA087820DE632
-A7E72EE945AE53FFB7FABF66C8D7A9E4FE5FC76FAA7B8474C6DFA527032EBD00
-11742B09CF9364FA679CFC5B7751BBEEE7CE5983C32AB245884170697841CA95
-9B781839232EFFC2C7CE51FAE5C3117B6C5A6EBFEB8CD5C17AE1F50F322325ED
-2C42751E03BF9C602FFE7651F8EAC796F22AEB025024EA9D3C6839C5D78446E9
-8286E802ED412857CA42FB01A78B15B908F7CE8BE1C419254998C35C790368BD
-8B8CC75818C190AA8B52B75F2532630CE54DF5D40C04EA7C764BA3F54657FC55
-390A118C2B74B34CDA77D2B4808F068FF11A3C3DCEBE799FA2CA3D9B7AA54E48
-2306EDDD3809DEE1CB37EBAC8AD6419A27738071492B3E89E32052CD2A3516A1
-E742FAD7E97F019C0A3E6066F6E065ED5152C0C078D314C3BE3F8DE49AEE7D71
-3A53A6D2F528499F10B2D0FEF019FD05C4F57F07C1241AE208DCCA9B74604871
-4C6C13C4CAB543F890259BE362AACDE5B69BDF373E7CFC60FB3DEBD243F2626C
-793933011C0125630471B7AAF3839AED975EA581558B53BB330021054A7784EF
-0EB98D56C807A4327FDB846E51725AF217563D6BFE0726A3FFDFA377A3635891
-F3A8FB69F1522676D6E01984ABB5C655964B00A05A499EAFED034513085755C3
-F54402B658E24D4A57913C4C4D1CA2335FE0A4F658BA773962F393FF5FEF8BF6
-8D6166014FBEDE0287BFCDD725639BFEDAECD06E57488F5BF30BCC2B3AE9E878
-F2AD3575FD043C6397A82F27D6E5A98B9BBAF8C78279D1A78809FBE9D56FE7D8
-306090DC00DA55AB9624FC4E4A279849AB4D5B7E7E125ED292B125C34FCE6C5B
-66ADC813BEBDDC1E91CBA09751DD13ED696B5629234AAA990C467DE668CF1D29
-556A24B3D5EAD78CC38A3282E46C884C802C0C0B010840CA8D454034D3E479FA
-F9B9394A89924F66E106AEBE1156337BA80303F111AACD622F9B0C79E463F1B6
-E7ADFCE41A9E7C962A96016418824569861A8B2A426AA86A3BA4AEB5CA11916D
-2F6AE0C03BFB90E5B6081BCB7348C8B74A20EF87D04A91B5EAED48B7917240F4
-EF91A3A1F77DBDB81D8D95080E4EC1DC67AE3788ADA00E8CF885A13DA34F525F
-9552BFA79FC0967C2AB66E42F9245CB380EB196C927E3279DE96FB8606FA9F13
-1DAC5442B25B461C586203D9ABE024569996131F178B1302624A4E78EF2F82BE
-E9A0B83549FE5275E85C176B7D3F44AA19A0025032BBAE7B2BD928270028C866
-3358A8B2058383FF2FF7A41B4D90F4425F40557BBC907D8C8F835412EF0DC6BC
-CE6FE967D55770C0EAC8EB190D7B8D355EAD9408050795BAEB5149114CF377E2
-9A6E11C422F51705EB921F95B548C79775525D0C4D6CB5F9101B99F4C712ED50
-ECB12BC53FE3C703B505A12C8824804ECC3F66F8BCFE740E36CACC94C7E76B50
-A8C037E81731F40AA1DEFAFE6673BAD83EED23B4D1829A6343C1FA7118CA9C31
-C08EECF55F2E5682A445561D7EF396239C25C013AB9B0E3CAC0CCA451846E611
-8D17C7ECFFAF85013BA136C056381F4CBFF31FA4A30A19FFA8BC4F29A8C4FEDB
-670E4B65C5FC2AFD7B12DB24B6B26E9A2328AE47204D35E8D981B2D90C47F768
-53AF1FE5A271FB05C3258A280676594255E53410299DF24F4574BF72FFDE081B
-A1D2DDB7E42C91C7CF3E7AF0A28630BA772057A39265A74CF07790257403623B
-755C99198D679FFC403886A1216EF0DB21BC39BA11BA1910C4599641007227FB
-07B7BED0F7B334C4409CA8E46414996E89C99A848AAAF1BD80510470BCB2E5F1
-8D2A32099AEB23EACCDB07ED46641500E3577C561F5834F90C353B03A1556DC1
-355AADAF4F16C5BABC1126699459018ABDEE8117A30F1FF0327DDE29E8F679E3
-F44188845CC71A694285A0061030DE452D5EB85B0286D1CB19077EA18FEAA2E2
-493910C0194C37E859CAC47FFCA73FEF03C42FAD09EEEC4E57647B8A1725406E
-1686835E81E7F2D621D6B2FF972904B7BC529DB1912C6B788869E3C3578A0B6B
-7A15160577F1545F50294D006AE862A89CEB65DB36E68013A3B71D99CD45EF05
-942296CCC7338ADFBE0C14E6E800DAE58873FEB18428B59298C6B6331AD79F1D
-6E4B8F925E5497E4760EBC2AA946DEF442FE076F75D96497FEC6E539D7EC13E6
-368AFCCCDC03A73C1AD82B3BF06D294EEC6908FD9C1E2F8935ABE200B3D4EB33
-A76EF754D2359192B75970B235FC6F59CF2E1B99F35FDEC3309C0978F597EED4
-75655F2533DDF000A53E02630DB8CCF0CA83D305F1CA78428B09E181CFAB40DB
-AB63E6796CBCDD7CDBCDFF14A6934BC5C02073F0A317DC0A6FB9C607B9B49FE9
-E102DCD3AEFB7ED4805E028AAB641D0E0EC6AE09D7FFF3A4F594098D03139D61
-AC6DBCCED93EA94E3142299CE717CA0D77597801CF5D01ADF5304D52750C4EE8
-66804AFE77229D54649931E1765BB9AAD54DE84E5E8A49A1CCC80E94D009EC63
-F5CB056A88A3E2D0E0C78CF31754EFA654746F33236478BF53B8A56FE0B51A19
-9D1E51E21B92C158069A59F8AE0F11ABAAF2AC3394DE03389F538958CD709639
-26086A53C600E8D4B2A1E9F65A9982D3FD0AEDEA1272126EB2FF08E06C5A14B8
-263561B5192332798EE1FAC70F4FA20E9257A186277D80E2325A8CC9C650F374
-9EE7200AA82D05D7CA5D4C6D7ED6D38462AF2EA35C1F6679B1767EBBA6F62769
-383C4C5D7A3C0924BF850BD0EC1FA16606A973BD45A0F2AF86018A4B57AB4334
-82FFCF17BFD39CA87D25E36D028E7E35B6FC3DD850184BED63C2E3843A6FB26C
-65EC1A1F562591747AC1656BE602CAAF7D24E678A5834D33B4F25EE8EA40D88A
-C87860F8F6CF38B3AC16E525C7CB7B19183FA62C6941CC8FC771A5C87BD45F2A
-BEC03A4FC754608A6CB3AD74F88327B260914E0B325C246057B013E0E8018FD9
-55FC00A741CFFF655AF36098211D7756F1BA8776EB391E73B8AE402814F8824F
-571C0255B878A0CEA097CC8732FBDF57F56A3C36A4C792D16875E88A03207B22
-49F60658A2519300C1887A8C3A64BA08603860DF48302E54261ADD2F23FDFFDC
-DC8D44DD1D24B7D0C693263AC1CB7793192C5BB7619C3FA526E3D44832676038
-B2AA7E7F80B1F190E83534DDABC07D4A8C312C25080FEE4AA75F17616616E53D
-500D0A9EE43DA70ACCB163A463BCF0255826DEF676C383C5137DA065FC1FDBE5
-AAEC7415E6C5309AD238C4B77A809BA02385B03378AD562D1C3227CD0D376CA1
-57818FA2A81DFA677865A17880B66BE988043AFC0B431B238508266BC074B742
-5C2118FEBC282096246631E897ADB907DFECD2C7569293A5EF0DEDA5B8B287E5
-53017E1CB1FF124EB57676EE5CE07467B8CCED2B63B70E303EE474596F3D8450
-C39893423406A654217C1439A7C4000946378A3504AD3F2C820DC818B48CB651
-6921E0A29A0BA2C332690BA7626451E234E4DDBD744DD801E335D9DB4EED3F87
-7C4347F874D7F15882960CEAC7039E1064E7C9A264A1C6D966260754736FFC04
-B3462E87FCB084E2FD1F53FED1E493C298926B26855280C154A17164C32F6079
-046A2CAC71FFF007E7B84DBD42DA2F4E15209CF8194383B5F0B47F47A6E95EDA
-A161F214BB90B548F2C1458F1034AE071633A9105C09DD9EA1DB23CC13611B3C
-D3B67EF45E4057C865C0A271F974D9615F0AEDE45A4AF7B1623F725A7A60EBF5
-82D0B59987C89D848F6195788ECDA22F9E39400615C8D287E75300A295431ADB
-83D0F4ED026C188E6B57C9A90E5655DA0F56A65385A46DE73E7E1F7482BFDD88
-4F4570C318026366791AAED812B4BE31F3D130C46E45A699C843E09C24945C8F
-806F3DBF476D3DC8D7261570C54EB79905AC4F4524C9B3100BC5470160BB0587
-BB04E4C7090B090B769E654DE50D771EE270825F28CA00D86B6814DE04D02304
-9742A33ACAD2D718843F882D06755E0FC71B5B92A1AAE92E1167F867E895BCCF
-A5BA73AA8CFB9BE0BD2E4A16523198B21B664B1D41E4BC0E18BD709923EEAC97
-501C90138C493F8E1E229481B00A2A1E4940A8002A2401DBDA64C86B61C760EF
-DEA4C7A8EF665E03D0FB63939DB9B6D8FC78B20D882FBEC7A9EEFA6A91E0322E
-387252FF8770C9A2F5E2A3818EF6CCCCDCC5F5F21B855F489898A13080983705
-977416594B8B0428FEF03A554CF07FB3B59E5F3E027AD38799533C5960C826E9
-95C6F25B15B802D96D975D8621AD10E0DE65C3B8F09CCFD12CEC98F71EAD2E69
-2AB13A9F2183C9B035704EDCC8930860B48DBB68B8E3111E26A8FF216E80D082
-F6CF064967B1233D711C076D2F3680D9586A87694ED8FCD0BEE0A8C338A11728
-D658C224D94045D9528BD888275E17B50F9A72005130EE5149B8FE243B2F428E
-81F8F5602D3E3EB89395E590A1253A9C28D4140DB9769A5F986325A29BCFBACC
-9ADFBAC34FFA3DDB5859B9DE3311790882EE64EDD02B79E15406D945E6B454CC
-9E658F0ACFF0D13B58C75E395E0BEBFF5317C0610DDF07D18900919DF6F7AF17
-7FBC6BDD3488C1E140DA40049190E4F718AAEB9B1990F1F8FEB61FF5EDDF3055
-4A747292CBDE3C33372450568D371D342F8371E7F9DA016B5039810D053F7871
-A211EAC5AE13E808F44711906806FF0284FA51F97934B41B4E320DB211E33E32
-64321927CBB5E97A82274EBDA4D88FB255791A70A0A2E651F141D3CD1DAE553C
-94AEC8B6B2F4E337A7074B7E40BAFD0EB0202C9F77EAA4183208D539A15B94E8
-127C767800748416332A9FDFE6DEC86EE0273FEC43152C064B7C6C24A0389ACE
-95DC88E06E1ED02B277A4CB3500B6822E969E36F0F0709ECB4A53949965FE907
-6B9E95142869B12750FE639B9B5AEC8C28F70722049617EF0BAA248D559AD505
-29C89B1B14E68E3E47427A636090A417A74B2FD20C209ECCC88C1F93E75568BF
-D1D32921C4BF2B1B999C86E331DDF26BE549161C272235EF9A62E2F04BDEE6DA
-123C84DAA783A4A9A179C344DE77CEBDE3291006D04DAFBAACE06FC66FED9259
-AC036F7554276923F8CA84952B8524F73786497344A8210D72777A3F0F402461
-DAA6FF1C3918B8690C409A718C3DDC9326D14D27FA35C25CC13FE4955AE7F19E
-FA40A395917DC43A1BA33B7A21DB8971D5258BB07B14E587C3B8C0BF6D186719
-BA375629266754D560240F4C642A20DD6540283828B260F7BB04057D9773887F
-30E3D0DC8F26CAE5BC74CF2599C55C7D53A866C9E56450A0C9E8F295C3956F04
-62944690147B5098D87C3315972ED1972EB3681E2141CA1AE9D54F1E37EC8EAF
-3B7B27D54223C95CBCF3F200694343771860B4C59B2F74BD3EF3C20A3361824B
-C178234D9B87F2831726735E054C48B57705C254DE978FD66B8FED99C179E3A6
-CFD55E11231275614024B0CA241EA4618430F62E93D5702AC09472BF682EB92B
-F83B7B99EBD3736CD543F7C02E7F42AC083B75F5C28B4D0AF596BDC1BC90D7D2
-58DF44752BD362E7896C8A9C0320F226DFE7400946754A5F518596BF0CB2A307
-00C276C5A4A7DEDAC773F40FED1463FD62CC21CFF7CB7A850DDA434473866023
-0146E94958A21EF632671B71FE474F1915DBEBA6F6521A2A18382144E3B4CD87
-AC655DACF75CCC795C24241C851A05FB942FD8FD05E434EDDA3EF804B1363BE9
-504F346D6E23AF4193A93930B1E605FE73A96BF9C6778BDD25980D671C75FEA4
-700186F9F1F54814C73B69D66FB36B4DDCE39F3E5908B9E73E385EB116C21BCB
-2322A225EC338C82C422ADEA0F8605A8F382D115B1243B0A2CA19EFB2ADE474B
-6641F564C6003FE42639E7D862F8F3B691F566D454BB781B45EFC163969493D8
-857468480DA8967235BB2DF1E4B1070DFE9FEEF51F3BFD6B6909E0B19DB09F09
-921E9ADF59D3C3ED0B3383A3CF17A4633738A781B55E43C650A79CA2B2297867
-EC4A4C7012615840E816AFE169DE32DCD6C91159E97C0CD550DEFE597596CCC1
-9DC7CA2907DF60E74B7076ECD61345A90993D198B4442B42103C6A0F7BFF05A7
-D927C4452D15A983CFC306A3FB4D19A5A54D581409183CF749F58F64749AA350
-20BD27B2A702F72A98D584DF32984302EB1804B4EB5CD2BAFBB482E3DF8129E4
-8F4F44C221A1F2C862CAB51EA2DABF24AF42D64DB8829E30076385677719564E
-B5658DB1086E0052BC1FC562F7F9894B46734DA15B142E7165F3519B36D4FBE9
-4220A60BE1E30FBFFB67FD2DE4286276CC9A341E21558A3BD8B729B667784C8D
-97981ED0612FE2DB733F7E46CBADDCC6A3BA7AA53C6CB34B021FC4545C1EB139
-58EDBD8D2E98A9CBFA4B72F52F1C1B72AF8A99BF78CB6E2F19F5458CD4A538DF
-17C18A80F62BBCDCD5B789A7DF3544F9C6DA2C22C580C41EEF179A9E9514BBE7
-4F15B7687C5ACEEBCF6D2229238EAAE66AC13027D20DEE7FB7652731200B1E21
-B2D72B3053C47132594A48501C9BFC7DB924B4810299B3581C1DAFF03B0658D5
-BDBC8E7F6C15B26FC872BBE0595D1A0E764C632B766C33D33F5A423AE987ACF7
-974B18F39F85F7A063D99B451B7DDA3C24B0FE4E7FE6FCED2A231B27EC109962
-EB7439AB63D48FD4813CCAE4D3F53B0C3471ACB52A5DB323FF4E1EE8373FABF2
-6D844FC2DD98598B9647BB4DBE12454CE24FE162C3B4583D593E67EEE093EFA3
-B8EA96E3D20B182F8C836B676B1CF4CDA0B5C283E2E2A7992453B9C09684C5D0
-9FF000F41DE580FD799E7663F918E7BCE5CEC8CE05473B660B343C5564BCB7E5
-9F4DA3B7991EC910F0DDE4002D54D459AB33770ECB111C25B0D327194D3DA61C
-2CA2BDCC78DDA1F3A51F3D7EFF922D3C9A7D5E88D3F718D4224A0A34A4B91A12
-EC7AFA2472E8977F1C299380AF7D02E2423D880CAE31A610E0158C318DFF3802
-9BAEA372D8168F5D631B7CCA290C93314D3B96CA1EAAEB29D308499CB4AFDCDC
-49429DA85225B0429998746B2B2D4A4D45BAA8575416631386AA7B620FB272F4
-69ACE1610BB6F651B154ADEF7F8EA3C51BC62A081F547181A3A18703D01E020A
-5DC4C1C934D2AC4A0B67F545B521D9B40F3255E5E9DE9322FA51652337A405E4
-5F0CF9FFD3FDD10AE339AA2D91BB9D3637E72738620E8CB14CD87363AA04D4FB
-79B0127EC187E8767D3C06404CCDABF583404809EEBE86DD8365E5A61BFEB1AE
-492423B4E5F9CA962357444AFB75AC7AD2F387107AD76171F194606042072B9F
-18B341BA7D01A6EDB28297DACDEA900F301D95D33A89248EF42C3264F8A1B47A
-5CFA54118803E5B57CE7C0068C6732B60A741E20C981BD7C4BB1717F5774AC58
-92CB5C82DE1D1DF4A9E4B945D7ECF90E9086BBC455244C51E7F6A9AB801CDD0E
-7E5BC63515FEAFA4238F4765AC04F3E09F1279FF3943D77A06C0EA2E52EE75FA
-834963A8FD2929735CBA89073CF651DFAF18FA8D91BC1022FF345C3E6705899D
-13A63FFE22DBF6AF2150887E12D9C7C55FE026F763D3D15D6F5DDE550E21ACD7
-91E9F7937D3F2FFC2438EAD533076BC5003E4CF3CC4A98777B0615A2D20CB825
-93C60EB16B5BBB653C91B8DA49BA774C81C3AE8F12D5E84D49C431055B9442FC
-27BAF5F30D341BB3329CFBCCB09CF1A2FBAE92525E9D3CF5E099C0A72E1629F8
-D08CDF8A6B50CBD76FF67250631D13EBE30787D2B912AAC23C6973439C1980A4
-676D23FC0E90644BD0FB6176322D94EC8B2C32DD0A12065019F0E8926A14B7AE
-C9D8905D9B79EF23446388D9005CBF63EE7A197BC4C5FD2E3470DA7D46DC2977
-B4C6FE57865E1C0448F393E0AE7D44FE616F129D7A0EB9ED1B78773EE54032ED
-1DD3672B6923D188014A61F67ECE29D913F6CE37D014AD2FB1CF07CB8AB70530
-FC5D413407B6E01A3DDE44613B8A7AF8FBA104D0E03DDEE4684F73E97118F4CC
-F74A503462C96F866366C2950BE3F19CE061EC7834C0E732FBE592DB5AC2E088
-683CEBB978E109F198E2D39FD2E690C390DF290F7709DEB6EE64F8B88D3993DF
-03452F2C314C04807A63AB766F940667FA3B6BBF887EECB96B3E29424B3DA03E
-80E7045A2578BD70F50E0F20BB6C3341560A2C9D5241936269C36A9C1D71500B
-9C048AB6B9A5E0B50E4D3E0F63B4369B7A0AF6E1DF6C8CF5CA4111DBFFC325C9
-41F28237A7F731F99D5CC15F3AA14E5B4B4E6F7C617AF408275091BE72E98AF6
-456F9A83F05B21CA0429EAA3BA48CC5CD29A087D96B1279B9EF5551794BA809D
-6927420E8DBC16CAB46450F1C0D5C8C8B3041C22390F9F6390067EACFC174AF3
-C9782CBEE35675872C4C68D3FBF78C8ADFC284E82C52C64477D228181C8697C9
-5E98D430816AB96DB01299654FB097DC281F0A60D9F03F84C973A6AB85EA5889
-AF3E8C64327D25D06B766F88973D5C75449D258D8F7A8F1976867644EC49D2B2
-AD765695B57D3EF8B8ACF005EC4A6083E30406C4887134314AF75BC66239B2C6
-44D663071AA7858CEA822B1F1DF09F4099D3B0F7A40809E08C0417BC05AC45BA
-30776357774331D19C0937E7DA9B93E490CD9E58D68B227579A840563DD0B5FC
-A6FF6D2B9DDE5A86AFB467395A2DE7F0F17494907B5658E29B518078C19D6E49
-E9FA0BDBCD3CE2579F20608BB5E9F6FBD30BA9A9A7BBEB411F348F69680DE209
-2D450CAD4AA515EF0744A9AF866BF129E92C57D523DC7FDECB9495F3CB72DA82
-5C3C50BBFA161BF93955972BDE0B44AD8483B519388A72717F6CF2D96F806F5A
-204141542454453EA24A95A4B7BB7EC8530CFA497732F57CBC4F6A778EC05F81
-4D479F48F6CEE8E893DDF75B3C6429D1F593659E55267744E046627EF474337A
-996F2FD56F2109879BD8A98B4C7EAE060F1770DABFA0973030CCCF297AA2B3A7
-5AE3C82E164304E43212390C4BBDE2606B124AEF5BF5DC9405F39F76C7448574
-589A6074EBC89C5FDE3542D723ADE4ACAF83C617D73BDC4CF4670E414A0F7C17
-7C0EDE2CCB0D5A10F0EED3CDF41CB790BB8EA61CF1AD9FF3EB39CEFA61CB13DB
-378DD50F477C9A5FF24448A750699CC73739254AAE0E26886195B1CD7501DE9D
-B60CAD2D5539BEABA6FA7BDFEB572CA0FB6A8FE46C6C219834BC23B3E4DE6BD0
-522028E9B7EBC83FF1E17E28A3C9C1BE0227536B3E917E6C2523121B7A6D32E6
-A007CCAFEEBE1633D1B8ED9C0F2C9D6E23141E75707FBA37897E4C0CAD0E1BEA
-603DBCDD7747690BEFF6314A18186703C62FE2903C7D782C677AAFA105ADD4CE
-C91EB6BCF2D327A3A6406C626A07A18473043F3E1B8038F873048F25B228187D
-7226BBA7763E9DC0B43895C088EDA7A6A1E367D905E477F41ED43EF267B86CDA
-481C8FBB1BAC6E6E0AA4FD2E979BEB703BC7366ABEDC18F71942D87928155C75
-1C8B4EC74C2CD9ECB7B19D9864271F8A4AA5F57D5B684471F273095A07892C91
-C946F615723E17E8025FBBFBAF16687DF65BDE23B92BA8FEDC894427C91AC4E2
-A3605B5D49E1C13AE8CC26902E92378104577A188B45EBF878875FF1B574F34B
-9C2BA7781078F7A9CA7228E781D70A9FEFBAE5AE8319AACDA99A2E368706A2F8
-D068FBEF3A103ED7D71223DDA428F36A07DE9A9B6C26F3728296CFC3272A8E1E
-7B372F5D9CA4FB010ADB189075DDEFB7488F481E6BF8490DA0C23DA26E2F582B
-1E0433F5F019AEB91C663C7B4BA4FBDCD53CE9FEB02D5261CD78A1C17C30FE54
-EA8455AAC1204908C191698FF7E1CD58B6C766A6DD9E68AFCB0D2EEE7FA1338D
-E0D8072E2838DC80FF6A028581CAB8E03A59B1BC7280EF55B97DD4365A28905A
-5D0D198E6930333FA1013A152F5DBCD8A36DA7B52CC1BF296D768CDC7079588F
-407DB466E7B70BFFBF82FC6751B65347A9523823E992354233DB98E838EC8933
-45C0C3181EA91C8CEFF04937B63D0DFE2B46A421820BA8CA5F5499D481868E51
-CDC4596D648F23F5AD603154996304A2C27EA1CA6E415C2F15BDFC6B01D2FDAB
-638DAE9355FDF19780A42ED36A33E9D6A216D455253BC4EA831C1419F5DF7159
-9772F00CF17AC084B10C4F11860E31702C911EE925B93D994F67E2926B73213D
-68AB7A0B7B42E150F3CA1E30BA0ACDF4DC74931E6009334B33035201C698F185
-57B132858F43B7A1DA50415E3D883342665118C3CB952B74BFC7BCE4E613A0C2
-E73A167648E282D8235FD84203EDFEB2A8899B4C9818D91483715F894657C032
-A5CBEEBBFC10B7C5AA59F8883FF4E799E0C4728E568F46CEBB4AB0929DA6D001
-A8FA70332C827535F8F05CBDDCCEE7178C007E60CA1AC783741307D5CD9C3199
-E673C480D0BEAE9DA98ECCEF3BC798AE5286FBCD3B9C0D4BCED845E41BE0AEF1
-763D293C78622EE9818DA386CB77A060B5296E06A44661F1B2289B7857C73425
-C28CA50441AEC8DE567D8504355E34ACBFECAD86A95E82F0D5A09C402EFDB239
-2A499DB371B08634CC07C592CF407738A667DF57D8417C4CFA790619309C5179
-82160A93C4841844CEEB8030B65CE23CFFDBBC0E9A48272A53A9DEB47C991A44
-5600168B35F73748C7EBB2460CB56FD313054E15F564254B074C68489BE6EC8A
-A4C16F287CADFEC52FB61BDAD3E1AC87518DE6CDD7921A166B800C03E8F1243A
-2B094B68EBE2691D726CAA51E554F96B8ADE6D019C24DD75C7A4F038686C45A7
-2268359BC73D4F0154DED87B863937AFC3EDE0C56507256C0230C43213650D07
-93BADABD4A9C066EB2B3D9BD43FA8169D87791C3A9287DAD03CDE950FBB3676F
-D3605535B5D7C9BD0118308F5A94C4EB29E842D1FBE49670FD7AF78DC31610E2
-4EF86FF61693FAF103AA56DA7A920A25B394A461423EEE8231A1DD3FC34F927E
-26A717BE37CAAD64E883E2E22C1718C1E9A4E69C977DB13411D427AA96569E9B
-D7522FF889462400293E2FA2F4100340578D19519CD9ABF77EF8CAC1571FE000
-1080AA77E574DD6BACFEAC54A1FEE5CF9B6F7E1E7429C4E3B20C4F492D8B3B91
-9FFC3B6FAA8AC36FC882AD4BF6171C5147177DA06295A82E24C3AFB404C200E8
-6103733C515894B0FB2AEC498FFEB5A20A8E020D29A807CBB9C3F7FE0CBC7175
-89BBA2230D6013A3C42588DC018714BF4FAADADFA6E31397FBFBA428F91F79C6
-9A757C636CDFD43E3F6214CD4FC2B56F10C542D7C53FE0268D8D30AC95A2AE51
-3A6401231B8D18A9C57571086CD8F58FF109E7AE7BEDAF804A6263A439D4BE3F
-94CFAFB9848B4903970B58DD4DE26F629AD2E2A2183CB3054ECC4B9962A89661
-64F15BD83E84AE8AD4958115B00E557FFB569EB78EFE95042FC0D73CF577C624
-ECE57E45F135BC904D5C6722D791040A426C9766C4607CD5CA7AE54298ED38FE
-60ACA2735BDD35A88F5B394990BF320D533CBFEEEF0FC0077300E6FB3D808EEA
-BE8C4416E964A5D673093480166B503E7C86431DE792F71B0025541659E26667
-BF303598A53CA0400DA9FF896D6114F5293FB6AE8A1481EF79C044AFFD1C3DE4
-8A06216AEE80BD03D1C579767C296C49A9B4434C3317A19268E3FB8162198D56
-3611EC062C551FFC5E17A76DD094B1BF2DC29FB49E08537224389B666D105539
-091F8CAE03B5C33AFCC39F0ED3E0B154005BB452E76C73BFC3C79DD85E11A59C
-95289C023A19DB7F061AB2A39BA47E1A9E81547C73796CB226BB8A55AD2268E4
-5564A217DD47C2E21AB9D1D816E47A9D195022251B0D82989D0F4DC19CD954DF
-B1B5BDEC1D7DFF81988967A834D6236549F4D4F484A7E173B2400CBD6E5839D8
-B5C5EF5DBFA5717F8A8FD61B0319067B908795C08BE68961161D7B898A80D9AE
-9434D738EC57737E9B2DE0A7CD1289629D94F21F872442EF3D0267A4424C1398
-309295B259BCC8F2C37A1894F347478DB2A7D4A4505942CC5F7ECF884C5D885D
-ACE1EA5883050D0FB58AD394F96AA583074ED9BE783D6B7C1B12A02DB2CCCFC4
-EEFA4E50C8FA241CF4BB972C19900F5B0FA8E6CE6F2C2B1495C996D5B8D1C4EC
-26100C8E5A4338685050DD2D2A8E5395BCAD3D9064805E85AEC31A8B90EE0978
-680998678A2D5522316D7D1F5B2EE30353CB249E7DF0646D07E0202DD1B7BD9A
-66B151FA113C809DF13EB798BFF29818C2CE867E32EF3FEB32BE7299DC51157F
-CD9F9059E4CA3A87DADFAB36F4881BD781EC929E9A728C9FD2FE76B839E84F35
-4B4353C08F1A95BEDA491F4379235C4DDBCBD70CBB2BC34B563129F506293EBE
-C5C516EF82B087695FA0F1DC412C3BEC7142E5D19368D904F8D2EAEF62FD0570
-DA36CA4EA8B866F9B017E7012F4A8AF1A13FEE0F9C568A7D6A92AC54679E9451
-D7BBDA3C9EB65A15BE4EF37F7C60569DA22F0BB241D7CBC4BCE3544C6C78AC67
-49226B987356C108626B7F07169F2B2CB49AF675AEA691D04496E36875C1D8E9
-C4E792D5F617835201531BD533CEF81C26D754A63460AD3927989ADB385BDBEC
-347219074B8E68FAF8D5EE8A26635251C6A59D1122C7FFC71C2D459AF4616E82
-23C0FB4FE06DD91ADCB2C8C1CBE7B2E7AA01414F38E93651A889D4379CD4BE45
-F709055A8BC91BEB8345A56ACCA76149A699E21AFA6F6D423A4A715D77DA669C
-51884704E172744920533D18E877EB348010C909946A2507E22A3CA3E3041EA4
-60294E8F205528062DDFC3562733BBF0922A87CD2D5F421FF9FC94AA2D380A8A
-BDF33CB17415CA97A74009E70B0A7DE15BF1C714C8D63B72EDCB0E8AE1C6986B
-208C9AA1D0B6E9453DB51E4054B0E4E4A544F713BCAF55B90FA84E5DDCE1F132
-3FC5DEE7BA419E006677D2ABC0E012385A049C3B9C51841FECEA0ECB262A0CA7
-CEE05A69BD5BBAA0F8EA06D878AC3B81829D3891A456BFE19B0D9B06B5D715FD
-1C0BCC3D304FE9F1C830DE89F6D526BDEE9E886621C13BEE2ED59169270F686D
-01A7440CB9165022FF6AFC8EC4FA7C17741FDB6D2FBDE95873DA69A4F8252B8F
-7978F7314A143F8C0414F532B504F6A6A42ECE5C0F09B9B3FFCCF68EE81CABD8
-0DE789A64AE3F3F7E3293411B15D1BBE264355F096FF90250D0D2D43C3016FFB
-2A59F70FFE9636208054ADC08C8D02F9DC2AE567FF26A95D67923343C169CEAF
-F14E4CC9FAF053DA5155520CFDEE63169924357A5C3158FC3D43A7A42E4C5E2C
-9A641E6E25FB2115C40A03472C5B06AC4D65A1854985F782B387EDC26ABCAF2C
-9837E7D331E57EACD575B3349D17706C398A79BC015A0B01A1977459B86ABC6D
-BE555CC7776C0C7DE01A158608A0AE3A3E9289A5D8F2CBA9D6C63EFBA892695E
-B7534C0453EC26B7743143F2F1002AD757C177F5D7F16436DFF4ED6AD12CECB9
-D9271BDE6ECA276C3B2AC065029563932B5D7E33CB1B71B996C947546900987C
-0E4490EDDD6EE78B6DF8D723C19771D36656F3ECCA752ADBD68951ED0E79D35E
-D38852D8AB1496E0960D14C1C8A687D31913589A491EAEA3D18696AEC361D483
-4FFEBCA1FB33A8C600EBC456137A7687F4DF40EDFB9A3B080466C4A470457538
-3823E06B9E6DFB287FA7BD7042203D0A6ECB0E47EDEBF97016D831E0569BB60B
-F2DFB207C631EA5AB58FEE4D5BDCBBC4B41CF0BB1F4ECA465242E509D145538D
-949C0233F71C27407E75B11891045C9F7801A973EA41AFD742DDEAAEB504ED4F
-64D6E0B7FB9263BC65823D51D593EC42CFCBC682CA4770C0CED5B238063DA5D2
-716A9205CC862023BAB6937D2A18FF5D618116B45623E06172EC30280C21388E
-4D53D077D5EEB77F2B300C57FC3ABAC1E89AD317B46F1883F5F83E7A8AB1891E
-8110ABC7FEEBA203BC9F2EE2982D77BEB0F23904EE340D6D6F72B1BBDC76FB3A
-8E69F3C5C04F29E2AD924C390DEEC073AFDF3784DC26B85B7F0528E3B61339DD
-1E341DF261CE097C3BB1769FA4C6E728D678ED7B928FB44E6BED81890CF233AD
-DF4A72B95F85BD95C5645D8A049E89D0F94AE88ABBC66F5ED01EE9141448C37B
-D47FF55ECF86E13B47EF1AB27C5CA26F7C2DA5841D47B3E602CDB2125DC345E5
-74A8E293DBF4032168983A6B439B189FCDFA5FCBA97E166C65FF0641E0B1A7D0
-9AF28005F1CAE32F1D95A27BCFF98C139911199AB6CAEAB49728AF2B0A0DB6D3
-7419EAD54E2EC55808C6C176EEC97477FD65C11BF88BFC0CC39BA742BF841FEF
-AB317723C3F95445BCCD5A3ECF82C78C262B200894C983AF871912E47342C0F3
-13AE004F1E05CD83125AA4AA5161B1DB9D3F1A960E682EF93123EF53145A9C24
-EBDBD744307F6AE52FF1D6D43C3F667360FF48673C59D04F12C3AD8FD361C4FC
-8F2A902193D4EEA3E9DDFAB0D323E2E49CA4B4FB691F9635AF026CE1DC94506C
-49D68F5899BFCD1B947C77A77B1598CAEDBB7AF0F13221B59604E91140959F92
-8C49E5AEAE03C019BF6D2FC50B5BEE2BACD955319BC969EE0FA1752BFBDB1380
-042B1C0FD79AC43B5452A1BA2281982E73F681FA76AF1C9C4F4FC38EBBEFD865
-4648D27D218C40BD2C1629E1DD79263FB7FC2005BB3D06C9EBFFB22F67F356C3
-D20EAE1DE1D11ED1DB1D0E6F2F20FE98A28EB737B6F5B3307620A0199A076B49
-05F16F4D4A9C39E1B806BA6ED58B24657C2427AA6C987619D213AEB93B3754F2
-E247612FDADA5F5AFEC1512AC93181F8DCF831DD78271F12D28B0250440AF081
-5C141B11585D8929ACE6C79BC97C804325EC5931EE393A7B964B14B376694460
-9C0858E833FD66D0DE9B7D6BA33AB8FEEC15C99E3E5D329676F0EC2FE5E539B6
-4957002C77505CEE1027AF7F1BA529B45942058EBF4EA22F1F7FE3C5DD93AA1D
-9F3A228EC45643CC629AF5EDF9A4A33EBDB7CDC0ACFF4A4326ED51BA05C88118
-ABC356B35D4DFCA057D8BB3D8ED04DA0CA49210F352E589748E63F2B3CDF7281
-6C3E8F46B9C2DF790FEAC41637366274C88DC4C6297F1501436602AC7CF94F17
-17812F8230CBF820885C3BD086289B845ED8F6B8B75015744DAE3981E8A1C691
-93B1D66ED2E41EFD86C74E12276CDE05A3A929E529F7781F1E49550B44A26FBE
-DE59A39FCF8CBA8F05862882D6AC13EB83C20D6115D4BF9509F8A506E5ADDAB1
-ECE74497A17AA12D1CFE36672C2D1A4F2DC52DE56E8AE6CD1E72B8A4F850D3B4
-1551EDEDA4FBA36379A26C3B3928AA8AC63B5FF9D24A893EF019E6FF0735FC60
-7E95D2F29AE0ED922BA57F85CABE2AA44498C160656779860006AFBC4BD6685E
-ADF006A4936E52637ABCBFDA6C8ADEBE083845A20B9978A2592F98A8E92F2541
-A84F2AD2DC12A81C071C0864A1510CC6BA44226B03E4DEFB70112B4EA34ACEF0
-0FAE9A6A783FD2911ABF67B974FBAAD4CAAB514DDC66C696C003E728262EF4C4
-4AF9AB3E23EC019EB66269B65CA53271B20CB71962FBBF8967293C1A81369021
-E89CBCFE25C124BD7A8A1F7C84DB681A545692C17C5A4C3D036B7E61C7C8976D
-A3071BA77FF9F7C9181AC0B09D02DA041981A7FED34879CD2AA43695CF8BF01C
-A92100BDF60720C5633E3047655240DFE1E96A85C1F021FC237F51318A9E82A4
-563725D2267D7ACD7C78B228D5A6114D77F9F055B885A279F7198F0993332786
-A3A6459FD9BFFDEDE996C0BEA951C2BFB14F7753C3599F630B00B6A44C46B2D6
-94E02C6E3CEAF82C3F730DA6486A47C2EC4722963ED34D3E982DB93A891A0789
-5CD8EE15405EC998AC29D6374356F8E4D8125EDD844183FE31A2E00102E276A3
-7F138310B428AD8D3BE683B8525524F14E6ED10AFF68127B617167F1CA432732
-081B87D78B6667E92BB1F5794C6A66DD830154311C59A43BF96100AA8A84BBB5
-7F201F4F25DD15E87F6A9BD20A34402E5757ABA204236C00541C68A52B8C6666
-FC3860679EB3C085B647796B424B598E97F6EDD31E1C1FDB740FD735A614B4F2
-93EC1CA3ABB24E4A2FA853AE8688E535FCC99160F55E28D542B2C48644ABF948
-168DA7AFFA42839CC7EBEC5068A78AD0468A6697D0848A6604CD020BD92F5362
-DFA41E55C003B702655FFA0315EEB6D622DEEA18126267998875C2F2CB9D6A0E
-4AAACF51EA44074ED7D625572DDCCC20982B43B7BF9488A5CE852CEAD090719B
-8C6A97257123E8EAAF13A06DFA4BC20801079D7636DF8B8D5F5B3C75968C441A
-F17903004DE8DBD08022CCA7C0CE9E0D784D7F571D4BC3DCE4AD4B4487CD7ED6
-7E4DD4516FEFEE7FF9D7190CFE093423D9FAB6D03D8C7607B9C8491AFFF1333C
-C4A5CA33C669A889D0C0F174E9AC7B2B81CA532D70F86D820A8E0BE35B21F16D
-C1099AB373DC1EEB63CABB00949B38DECC52B236AC8FF44E0F35858ACD325E14
-4A21CEB8281D10BF798F2B3E460E89E54A8B255A50623743E7C0797644C92832
-60F30A5B104827DDBCF075872DC910E480A48D73118D4541B19AC92B1086E48E
-CBDAA0C4BB3600E546D538145C6C449658ED66B292CB2B10431B5517DADC3269
-0652E4287731B70785C23D0A5A7BF2FCECD6481CA92758B74487C3D50FC8FF29
-FB973E1E518130D2662DDCDD6199422FF55521E0715AFD06C43AF2A99999A5F8
-B6EE78F74BFB8F845CA9FE3A03A50218495724850CC8A66C92A3C4827679B4E0
-02B86A7FCF82248A7ED56D5034A349F920FB25112CA8A84E7EBDE228DB05D009
-76B948FE201D9F56E64CF491A7DCE17ECD0EDFFA25E1EBA6A5B5F8B9D811F559
-9A341D65B51A32B2230FB689F0DB5E70967A2F333194FAC528AF2CBE72C31A47
-0902B69CEDB8BAA7BB1381A4D31EE1198324324E2373263CFBF2D56F7841E493
-90DEDC910506EA457385BD968786C753ACB24820E00D74F35BD07195E2959044
-0BB0B53AB9B29D14D0EC5A35ADB896440506D070D0341A5127241D914BD0F82B
-A8BE9416B728BA2BE4E0214A4CA7D354E229AA83BC5BBC744C811A5FE4994EED
-46C0103C40ACD7C5772F22EE718159A80C6ADE365F84E1327A5E8725D8618176
-7F331D3D3EF56CCE69F36DA9E620197E52CA7B818D4BADF758380F5B10764C7E
-C3B3ED839AB620B9555A2EA838CF5D2E9F014B9A3C96BB0EA054081EB07F604A
-E2B1A9758C336FD7EC9C7C2A1640725485C5C7B353D58FE00259EE1C709E07CF
-FD54165C87CFBACA6E3101C23601BF20C689BDDDB94BD6DEBA876E981CE95C45
-6543A8BCD8BCF2549C97401442E3ADAC213C1885CCDEBE8AAF47A58FEB1B15FF
-F2208DE4F031C8415E83CF7A6611464B491EDE2E9AC7D9AA84441F9A6532F44E
-3D142F77EBB3E8033F23C93923F0CE6848F5AFCA7AF0EEF8B8DE8FCE52CA1C92
-1BEDCD239C712A1E6CECD22EEF42A99B6640D59C848F9C630F52EB49CC6E881A
-0C2104A3ED2DB85AA79874C5072389A73878C01D45AF07B73ECD178FBFDA6EDD
-7380E9FD555E929D92876138934B8434B0774E378C1DFC1AA1E65EE9A4C69ECF
-0BA16C2B96CCC0F22C8CB492965A8F6AF7322E4142D8A40A9A3B291685B0BA10
-0EAC0E2A92B955B7A115FD3F75B0F081ECBBFC40B4E81B76BDD5F7CD3255E4B3
-2EC25E35718527CE70470C47D4D160871C8F7415F80EC718338E41FACFA607E3
-C29F11193EFDC1C96D24D9ECCDBDBC5A0541FF5ED2915623346D61A71BB2DDE4
-A273CE9CD37FBAF6903058C7FBA3CF4507DD723C983BFA5C2CE4651E2B3ADA8C
-28D1525C8A184140BA42C0B1878C5883581826D7F0C02E6753526FC538C0CE33
-CEFA24C86414F785D2F31A5BA161E696782396E117E6B3D21DF1EDCFF6930A8E
-4D8AB720D67F93D6F0FAA25894208574DF575EC31451CE3D196319119BD46767
-9E7B1C7E26CCDDB510E19A057209D1F8DDA77F830752735CA95B8B46EE230338
-F37D528BD533640FC7AA6F4CBCDD5F0154EED7625D9BC57ACAA90481BF18ACA4
-4CC17B1FA53AB188F6D4EBE0E89671BF9926B8B87A6EE17F782E1AA5289E1A12
-F791CF64CFA9BD842771237FCF330478A6AFE0D6BF9A80CE2CE48784D0F1FE7F
-E36517A0AF2778ADB4913DCBA5CCEA8F423CD59CFBEC56BEDDA8B3E03E048CD7
-4D670F5BEA7A44D309CAF775DF677EF3E6B5131E3F28CEE8F506990446D077C7
-8293B4F57F7FB2D175EE6A12A0E050802017311C15CABA6C5CC5D56F77F93CCB
-A25DE6C9DA9C304B98100B26C5BB88542CEC07C1C1AAC21501D933E2B2F74E8B
-5153D70756AFD54C0D1CEB3E70CB40270FB03CEA23CA0AB46BD904919A931769
-FDC333FA2B2D55CDD99148CD555C959BB511732A90DB1B986A3EC1F3251925CC
-985228C6BABCBEF2C59A590F22E1D1DF16D6654B35FAA7A1BD7ACC0EBB529437
-408628F19838384635676825548558554D6CF471178B8C0CAF16CC278F58AD3E
-1524989C16B63834A76133746B1A306E2F89C52A4209999F0E63DD7C85058894
-98C18F65DE1E03297C51BB581EAD46557BDE7155DAEB76F74E3F00A32271F5E2
-E7E909D1826303032047F61130FAF8BAEFC77D524C6D1F8F2DB87D1D36F1FAFF
-5030AF4E0BDFE670712B3F01DAEDFB76C93CE59B766295E1C766C1BB0552751D
-EFA83B7080B6156FCCF1796A68CD83B6BCD4DAF3353361F6A79DE994F0833A15
-638AE470FC6672593006E47301ED6A1C8727388AB31EEA34613CAE8E8AB07FD7
-6A18E36309FDCC4834F8CEBAE4AA648754D679DD4BDD86513C851A8102399740
-7792F8FF58081A0B4E84058E4C1A2D6BF680CFF926DCBDDC05D73627B7980E94
-D5E410848B1B6FC742315A2ED6F25635EB0D734C82480157DFD2F383E6508EAC
-EE70215C509B0B2A4DB87E6ABAF2E1AC115E6E24A55815703E0E054FC445CF86
-C1E0ACEF9AEAE22EB5D627D7E96701F93D080DB33240065D31745331D210830F
-DD0DDB83FCC6E4645D54012254EDA717ECDEB5C114D826D8F2E95FFC67948335
-2B0E77D7541876CB99594FA3C629FF182A7BDA378C823826AB0B24006F80406D
-5DA1BDD296992542E75B74CD79C2B4386016F415DAD1C183C3330252B1CDEA5E
-9129274519705F35769DF987B207CA0C68F3E6247F6119B01802A55CA056AF0D
-E8247CD5EE363A61D10855FF3A495861993440F77301477FB4EB0EFFA5D71568
-D708EC717428323DF6942FC660961D005CABA2388F00575F4649F9FCABA1779F
-88F964A301A6D5D1FC02B327B55730031CCF60ED2A15E6039471FE70B9C83C32
-A25E93184F3A994CCCBD2EF04491851D59DB819DA46DB076C3ED8230F0AF49C0
-A2224E5CA6ADEC27C15D0642EADB6A63628EEC98F6E941394C71DF59846ECBBA
-E7BF50E44E3D78994167B63641F8FB22460867CEB24CA37B08C91E49F0C47D13
-10F05348092FEBA6250C635FBA5C5962AFB24C950DFA5CDEDF063589804173B9
-EC2979D26993378BF16CB04F4EECB360182CCA00094A7E6C9D16630A1089B6C7
-B3E3FC864CFC613F2742065D4A57EF6559FA02C397AC666B8C9C35DBE5ACDC5C
-9624EB9A2219385CB8C83DE36D78ACB2B4A8A84D83C4DD8700534E00B4C4AE0C
-E431200DBC2C1BB217159174CF4EE41B6AC8746598A999F9F1CB98275D6D4CA0
-16C45FF79EF527AF3DB2FA45CE3BCB2E5D46D6A8CA3B7D81DC5679CC7D949CCE
-7D3F61F0FB9313FF41878D6C7058D8B2D3525D65C7FD7770D119E7C4E93898B1
-6844F80F0ADF8E84DD888594153238CA44CD3BB791186B47C66F6DA75F5E8FBC
-A623B5AA758C66F72C6E908E5490E95C1E73E674CC58B1ED4B385130382A2C48
-0D815DD704ACD6A68DDF70D5DD361ADCC1FC831C9680C02E77FF1413A025D992
-27C683ECDA0447F1A027DD1A47CCFDBC30AA59D35F731255609B509406D8C22C
-CB4A0BCF1654060D52EB4EDF21BE9F53CFEBDF408C5EA49B22A7909193FDD3F8
-DBF9F403B961F6412F2D27D7A1CF7E18F46630A0CA925CAE8CCB10CAAF42A5BD
-BF21F7845DDC89B892349BA7B4BAEF3B85593FB06A267075BFEEC3A857CB73F4
-402EDB98A70D15F48C2F61B3CBD7BF277304DE6EE36E9A55D2A1805B37CA9A13
-B37F00DF6FE4F8508305C3FBF257A7884A7C4D95B6A7DA6B2C4BC6465E0B8054
-77160504FC1976456543D6AA5B521E88A74E5B2FE7AE6CE5BEB4BCA8683AF38A
-7C6059764A7CF8E688EEBA0CC520F2AB06A61A07CD0222D2270ED4E17CED6C77
-565A18155B38795CD27D7001E06EFF2C41C80404884E878B64E60F13A901CEBD
-B0AB679183726D2808497859EE701055276F2F0F36763FD9F58FC1190A59B9A2
-65FFD2E0278ACFD8C6C575339D8B459C4DBDCBC4DD985F45AE1C7AD96FBEDD80
-60AF0F7FF0FB1C8960BB4BEA08B115BBB2B3CF7CA09B56622D59CD9403C2B2A4
-4E6A7E47B8CD864C07648D07AB07E8CE9173BB2B9C349A282AB8BA11076E1201
-69CC0C54AE2E893FA5D95E1A9440D9F991E29CAA259220DE5F3B99AC86DF417C
-0F50FC176CE4A0DC9EE549D2FA86D80629225D51F289674963CC78D11F8F7406
-85E67DD88CCC905FD02C0C7125D7F7C2029114E399489DCE1490EEE5DD8BDD16
-BCCF12ABA0D8E5D016874943E64EE48A0CF3B544662F1C107F8E75F32FBCB827
-6B905EC3F579BE9AAE714BCA85FE11E8B6E29DCE0044AB28A9175B0CF183A0F9
-A43D9742DD8E1AF097D3450F83D97855265B9F612D8A1C6165C339F0CE092652
-F3843DF0A898EA13374098110F461C42A17A10F73127ACA85EEBD115225B3FCD
-870CCF74E7103E305AD55C8D77B528000001B2593FEFCBE9014AACC6E83581FE
-E0B3C455B02970E509EC1C54120688DACB24517BAD30395B4261D3E266C55FC8
-5CA30725C79DA01BA71EAB826745A22DD24AAAA048039BEFC549538CCE9A4F3B
-75A50AF2F15BADC785E37D65A772D919482362A3E7A0EF75B61461CFBCD6AE1A
-7941F680FF7A0BD04182C21CAEF966A52DD4CCFCC22420CA5433D148A0D88EF6
-32AD0BF5CA6F3E031670EAD28609AB31E3EF73A4DC62C984CB953274C53F4F9F
-165ADAFCBACDAC894C0523646AC25509E65DDBC032E798EC31CE2608F1D89B9B
-3413911202DF9C0B291BCA78895AC01F4523C7FA4174E2747032E38B32716E23
-00A6F1EC49633898D4EEB694DA03E2E68E607DBEEFA851F685D6EA3F242140B0
-FE1C632CAEE6E741B9AD5D1D51C0D7D6DADEFD3C084E152F8D3341C3ACF52469
-256FE1C5C7ADDA51B355DF0CF42604C9840D6C01EDD1F5022BE5B15E1DB2420F
-44DE5B6E7D1CA024F1DA52AAE5F2B3E080B95D6B65914F1A8D7D6B235ACBE85E
-61493A5EB7C06CE2C3CE32A42D9508AF914D4ECA8EBFBAE318E6692DDB02C811
-DBD168004760E33BE0DACC8A5E77D7850795B7FBFFDD85A7A12DA088E0D04CE8
-5946CCDCD41C221A1E9729DDD097218CB4783DE0AE30E333EF00A8AD42DA7C06
-BD3BD7716C10EE6F801D3928277AA87225AA33E8141A47FD9BDD64FB6D29C60B
-F91DF1B8BBF9154811DE01AA799F5B9B1683A380429550192C09F052F027CCC1
-D42CC5B2E0C4A0FCE424D50AB5B82ACB7A9B1C7838722D3DC7E84A84BCB67061
-B204E8D1715A8EDDAD4EB4EFC2973EB418666C7F57580278514A6C5D0869AF3C
-0CB1D99BD5FE72A665380ED04AC4BD8379A1D5B2894B82B8A5EC319302DDF62B
-ACDEE383614D564D8FB8A7C6E6D1FC5C5B70C893ECCB540540C23EFCB7BFA574
-10D7C828495FFE4D7FEC9FF1F727F9CB0EFE9536989601F746CAD0EC97778E96
-D62380591A4B2F38CF1CD42A62B1DF45C760753E0E4AFEA5FB90309D412BBBC8
-6A1FE55FAF842BCD90BAD6D491061BCA6D8E589675B9418723FC18D3FAB84CEB
-4956C5868435D6DEE4D4F9172BF165C0C22BACE30A0E10B54D49B04AB0FA95C9
-921E11B6F12913966E2488EBD830CCB05F02AEA26A0E87C98ECC85660BA28C1E
-F9C2E577F087D8A844537008C8AED065EEF36CC3A5FBDACC6756EEECA8356873
-47EB1F955743F051D9FA4F51AAB900F7A8F656BD967FA52CDAE022EDB5BA2673
-C775BA4A6FAFAA1243CEEEA4414A1B2ECEF3B40BA6262135301CC62A355331FA
-1EB4009CFFE5CFC9DF8391D9BC92BF3E666A3B22696C567F6680ED5C4B5829B4
-8A6EF11B93D084AAF2DCE69B39BA46F28131C0B45EFA3BE521822CF75A528640
-661CCAF1B95560682208D24203D6DA466A4C4260AB717BB1656BA8846C4DD7C2
-5E8A48DE389DF43DE66BAA55789B20360D143F7D89F5A7906DCED9F51F8F18F5
-F1C5B170B883F7C389FE4F935D9EBB68F3EA8DF84E501C1F280F8849BC476181
-7950935420C6CB6C7FC4A470966C7762FDAB91FBA0D6DCF03CE97660B3F9E054
-A63216C80E878E319CDAC223EAD23BC143A921C6619B7E522362D6F37F5EEC98
-F7CB040FE694AB48051612955CCF098578AD99B26736D99E3792508507625070
-12881AB347B1ED8F489D4FCA2966944CBE0F62174E2B76E613EE541E940E8C49
-92AE79B2FA6FD6F5B16CA72F10CAB2A322A217C316E4B4CB99E888987BA0658C
-358EEDC1D85BA4486B479E2A2E6030786CF13889278949EE21B21D8F023B2CD1
-901FD514EFE94982A0C1AD2BD1C98E19848A4E36F4039EE0F4687FCD9C65EDE0
-5CD331D4BAA14998B24C0ABEB19CCEEB98611BA87F7BC01CCBD1AC749DECD76C
-6D3BAE9B89AE22653BE4482ACD59A35DD0DBE43406E57AC36C5307AF81CB00E0
-3E545F943565D0D925513E85041C16651313564518F604AD60C7F24B14DB7C25
-34D8E4C5A0121FA194AC14E86AAA4E14305F6948C6998B3ACF67CA8BF1B12744
-5E7EE111CA04335F78DCFC440E9A99AB34E60F9EFCBB233A9D20458DA9405D56
-57264169160682DDA15B1B19A2C599C1671D0702D3AEF14B2645C6500C07A7C2
-D4B95437F1EE7D8D0DA247F54D4E68399487CB01F031B63760511FCD2858F1BD
-AA7DDF5F3D0E4CDACAFBCA0610BF6DFCAF0046DA73542D5AF1E8EA8015D76A07
-7382A7B4F7419DBCE79A551D7A7CD12B1A8AB09174E5A3548BB56C0BCF4A87ED
-18B7B5A9B8375AD8535785C2DB59FE934A4BA33E8112C6FAA92CC683CE765D24
-6E6152964086CFD1A6CE9191D1C59521E98CCAAA407F093AF076F250AE02E0A8
-2835EF3FAF19B53EAB419E2677E1A58C742BE93A55D2E6FFB71144BABABA674C
-B972E811BF7857D3BDB809C0F23A51FFFF2E9160FBE2ACE2793EC2A381210CA9
-BFB1BA5F1576584EDFA3E904EF4A208350866A1CA232E6521018F245F33A9FBC
-BD3B09FACEBAB6CCE610CBDA6170F0D16E477CC664BD4FBEFAC52A887A1FEE93
-C0143336EF77A46748F464F1403791CF0EAE32CD4DDB4F298A17E9EAF1885666
-4E467059DEFEF575A9E0C4AFE7A3BE402CF79B2D02B79C42B06684CE5875A9DB
-DB64C03D668BB381B816A6F9813B2F5E2CBC194B93791F3BE0832AAA705D51F8
-1C0AE8829D844D5A1C5B9BE2519C921C6614D5DFF978A762B6D2F974B29AB353
-94166E26F6D86CBA714E47F84FF0A0CDF672271AF9E2AF7E2E8B743D7EE30E15
-C165FA7EE181ABED7981579A2D9999EAA208C7C8B33B9C6F95FD586CBD9354A8
-3B390D280A7D8FF96CE8A5C8F91DF9935F5A684133534C99A5918781F1B26C17
-E2436EE11DB1E3F104F7B3EBACA254B1FCE4B01FDE4183805ACB425FD8B46CC8
-04C1270FB3055101BB95EDF6E1D076A2A7FD3C2F97BC65802962E7EC127FB969
-C07E70F4D2F53AB08970C61BC6795CC95499F1A2C4BF9446FC4B65B123F81A0B
-60C6488F593594E6296844C0959E0AB0C386CC76E769C7D325E1BE46926DDDE5
-1EFFCC709F7998ABCF24DD1865D7C60C6527D0B06A4B50725D1C3384EB164111
-70D637D76C3E3EF63D0057B1A0F970EAE0613F3B94B025C1CB733A4BAE995E99
-3C1D5B00419B2AEC1300C1FC9A9E98F5AD5B92F11A90E07D32E8D6BD040E78F1
-48FFE3D337EE827CF632351057B0C568A3413ED28343E0F3029F76DFAC3C738E
-90B243F7D6039F6115845EE2EF471336C4D50FC48BC09EE001879FEA9B5BCEC0
-72EEC9FFE66C377390A5651677AEED0E1AE6800C495709B66C7F5FFC9974BF9E
-9DABFD11A00F87FC7861180133E09A718D7685953600600A669247AA8F25C483
-0C72735CEEDF3BF9BFA88C178994AF71A16D84630B0FA21369F5AFAF22527409
-3DF33589BC9C61041C8AF4879CEAA373523D99C34801809EF4160416A13F5D38
-14C0B9B4C95B5E7CFE6E70D61A8C847819A9D2AF78C329DC67C123E45E2E81B9
-A0EADF7B66B5D7524E6DC225BFF4364BA9DE24CBDE57667D694D6628D7841AAE
-49008D71ED25B845FD19B440E6AF9B5F140558AEFB89546BBF3B434E8ECCD005
-E8311C43B54F523A04B12D9B68400A6433AF4A8BF56A6E9EB36827DD1A5AC4BB
-724636815C3149AE97E24C03D9B7DF5F88343F26A7335F47265201ACEB998AD2
-AB922BDCA39EC2036EC2721EC4B4180257C931237635B0C395A73C0441C202DB
-9955C439043F04AF3125BB2FD696884E3FED05EDF1F5303D6BD60325CCED537C
-0995E73E9F2B962FE6B8816C5A68FCD4D325A6865FC7D57A992EDBD05FB6E92C
-C9725682A0CDC3214BD57988D001A5F62FD8A7C180C4F699A6EF7A804DC3863E
-DD7A20181CFBE117109A793F1EFBD99392E400F3DDD6C64BE64BA05FF710E605
-7D564C9BB7F666CFAE8076F2E4209DB688CD864BB58965B33CC7AD08A076FDF0
-3CE533959C33732D444D4ABCD35C73B6CDD1CD70CF072BFB175A0B5476B062B5
-3A637FC14D8DFD7C44DCBDC78EA108BCC4C8E094C4EEC35C9A399850BAAEC9C1
-C73E525076AB7EB6F5388ECD2962F7BC6137E78CBABD857C035EC03272BD12EE
-46692B841ABA2A1DCFCE4DD3D5E6883917D06659A523E0D3E3227516FCBE9AEB
-7F28DFF0707E0AD6BB92A9210EAD45F69A1ECA248D2883FEDFE8C52F75A73B7B
-9C7F07C4AA92537A2E9CE45F39FDEEA6C9FF6CA915E3D0AC4FC67BC6F0AFD108
-4810D67B320ADB50D4D37AD0C27A7564F6FAF3E6DB1CFC47CF9DA097AA269A80
-947043CBA10D93FFC7033C60A672C9D3F3999222D57492A97D5A4D10D99E437E
-0C0289A1BAA29D449B2C17C24D780E68354D874CEA9EA4E02FE0583A18C0667D
-4FEAB0CF5286FE487C95C969ED1CAECDD9F9BF5EC8A36C864190C73473C33162
-20296752CEBD6EB43144764E6FA12F60EA605290CCC3C69994BF0780A0BD9257
-A09FB9A9D3A5272C9FE2DAAB7975A5DCBD78A67E4F981E4EF224986C110F472E
-F86E07EEB1B2B8325D4DF7E4751215C7DEB987CC9662B92590889D64EA31A1CA
-55701D52590B3BAB4F0EA40D32CE6F98D6193BB6F843FD6FFEDFCD9C2CEA3A18
-917842BE0C2248B22D5AD817421748C36B4A10B6E65BED5686FCF26F4BA1C933
-1ADDBA36F99AD0F880DE81FA0C14AE93074C0D2F32AE2197ED43E3490C0A8FFA
-0D747D1622CFA8CCBD48E8DC112A1743AF9C7BCA93E5B5696C46A27A8815B167
-BF2896574824B20D9C1CADF443982E8B8ADF1F705AD3FD030478AA79D12DEA5D
-F5E3E9C309D9F3F360525044503A563F06AE33FC380C3DA0E0EACA854B23D030
-11897C208EFB2EFA86EE596420DE71B3ECCFDF3678888606031FDD301429AC82
-92CD38D8DE1C888EEEBAEFF6E5C9AFD6B2F8FB8B283E68EF1E12AEC79FA23D02
-908DDB7755C11E7DD339A1F2AB6AFCC27FBE797D03D01DFBEDB1460274C8BDBB
-57A48FF118324F231274183E0C00064893021BC8F3B52C7E784881A31D913F17
-19675260415F19D5CDBE742FA47668A6C3870553E3FA0CFE56CCF589767DDD20
-D4540E734169D2E1E1E979F74369EEFD66777BC54361CFF22291B76CE36FC987
-D78E9A4D17C75B8DB9740B72859A51B65E0985F1280983F224684E7300191D62
-D8248056727303B6FC6CB175EC5C6E372180995A44680EB012A97AF3B770BADB
-40FB89E4D1A48C46B1F56250382AFE36A674B92D132A56F5929260CDE410A744
-40E8B4262891CD7EB6CAF8DCBD3C58B46A5F0E9494651A2DF23EA1E3C80A2ABA
-0665C9562DE3719F15473F9138C66CC24BE1DD07C961F7F64E638496911F4FAA
-84BD95000B76D644EA13B94A73A1C41E1B08ED9A978AFF4BBF6567ECCB823D2F
-5FF935156F79A00BB188BCD617B6FB2541339E4CB82D196BA067DCFF9DC6D401
-3114E16A003D4722FAAD466AC7F0F932ACCBA5A7BCD038DF0C39DEE32E0CE33E
-16D59F60B06DC9561B40E328F8CFFA55042FE1C52BFD8A3273CBB02044CD01B1
-029A457EB8C8AD1CB1901140CCC5E8389416DCB7639D7D0A608F20ED96CAAC89
-F73DCB332055DBD161936E6A1EFB24CDBEB8AA69BFC7E2C4AA083B55D431235D
-21B65636385C41EFA278C440D24743FD2ADA13B62D53E7235A54760771C50DD3
-608ABA221A0724063C839E96306FF87344532D03EE2BC70A223CB6FA74964687
-82CC44EC76EBC8404A42644852197569B1711946ADF595E8A6C7789C7D8720B8
-371059305ED1ADE8B01C494FC1342154916EAEBE3F7732B595A840C7A0363839
-0977D1EB502C15D6FE8A368B398C4BD7977914B072DF30C4BD7DEF9EAB7AB5B7
-0327D5AE95CD10F79DD6844BA1CADED35FDFCB17B8C28D55EBCDF54FB943B39F
-0F9E98494B1654B1CA280350A03A9ECA8B00B59BF0D7015EF79C48A13662B7B8
-0547E2E3DAEDC268822F6DE7CD6F14AF71F7E546E12B4E11AFAADC34AEE5BDF7
-1E90DA341B6CD373009C6E774B0916787F637F6EA5AACC162582F1D10187FC56
-39349AB0AF7665252B5403E67686DF0973104F5B193D8CC9F673B3D9176A4B8C
-9C31382EBD5C1979493FAE6EF2056A346F656EFA5B31922C434BBFB892EFE8C0
-6230451A3F26B98DD8E62ED4757460B1F0F5C813901F351A93A7E11758798965
-EBDB3A22144A7782238284780A9263B561FF7F1CCAA4D24DD2F37B177FD24EC2
-B372252825D66DBA7941B096D85BAFFA5C2B9F8AA4A31A30AEF5273FCE05F36A
-75AC322BBC88C6B7D11CFD48D6D70408C664145D81130A2445D643E7118C6FB8
-48A01EECC93A45D37FAB6680D32FDF09E25481E18C388241D5ED823EE6FFEAA0
-90BA7638DE302486DD4F682CBCB33871FDCE16B67B158816960B52E75A1C28AA
-F4C27D521AFD7E74A51CFDE38340A368ACC89DE2FAD37E34F3858A5C2DC7BAFF
-F4CE85374EA40E25E959A9B74834DECBBFF9FAE1F39FDD5D0E8863D71D27CF04
-4AF357E77B565F5EA577466FD4138A5516E4624C7214E2BEDF1BB484D3425BD9
-ED34FD792F2F2B9BBB40FEA9D0056FDDBAE1CCC72FC101AC94859A9AAF2E37E2
-39BA606FEB4689E4E04642B70E58DDE5DA6608E318A70E24B6C7B88DD7E5BA52
-8FBE8B99BA85C5444FAFA046574C9160A0A920DB544419993BC4A1E9703A3D85
-A97827D2AF45C8379398A4D2A9DCE175DE7008A138BAE08B4B9A6B52D73D1B24
-6787C31875B04E35112F6A8AF5A2F8AE9155A80C36C6E8EA83642397717383F1
-EA877B01DFBAE379529D16D1E0CCCA4B8C8B94F979251914B958F0713859605E
-6DD76A27705012B089059F9490AB4238107EF9AE1A556CFE69360AE47F66AD68
-CB48D08CB5AEE83A3A9D77121D2A599746E7B7C839B4C5CDB41EA0ADF56A1375
-8BB21918F49B70AC01273EF2C388F118806FAE2743E1DB3164F4D5F7893ABA6C
-B5C122C9290394F2A216261845738E66B7650C8CEEAD7452BF6AFAF54C8EBDBF
-DA5876569BE294EEE5B54F23ABACEE7FD554998C84B6450BDD689A10FC20845D
-89F972F368648CB8CF864FF6648AF21FAB210BF101BFDB3B354C6659E761EEEA
-31892585C32A18FBE8E4883D9D5CC48D84EA2F9FDB73638E10CAE3F75C3D9E57
-6810FD5239352AF7DC7DDB3704CA7EC8FA4FA3EE75FDBBE9AF058FFA17A32A17
-AA578E1A1708E8CB257CA968EEB34140804C224B2FC49643E5B3A3F7CC5E6C75
-6EA9BFD9FF9067675CF025636875588F8C7CA7E41654D7D3BD7A388B8F517686
-4DD89A12B204251AD96E3FBB73B5BEFAE355E5BA81EA1A1F17DC49647224A9CC
-0CA44F3D25CF352E184544A710CF6EEEE3E73DDF1366A99B07F47E452623FF61
-B2D94549A80ED356E864D58BC00DE620D39A41C8CC18B5301CE74AE512F6B8A6
-72CD753E7161956C6BD11D375787797BEC1B061237307B0E1E08BBA7A94F422C
-A77335BEED64C6AA2E850801FBF083E1DB91776FE9F7C6EFA3278AE93AD6A58A
-193AAE6FDF8B15B529E7A5A543609E3CFF4D7CD3A121E0871CFBF0EF1D6E39CD
-552A2C1C3160D13787E0F01B2C405B8D46A802F8026C5CA738AADDA72AC9B78F
-5957ADCC3BC0A3C0A201089663D1FD6B68E1D2020E83BB50327141534336F1B0
-9B264841F663B1BFD914522EE29C20E22AB6141AE15090302ABAFF5CDBAB2B26
-84F3BEC919127A72C6E1E35A7D69B367D76481231A33AF2FEB9470F35872DE5C
-50F82702B55FB3BFE33CB165015BE9F7CB928769DE116F207DFB5F6E1EAE31FD
-000D15ED943A1A30C4B4048AE9E7D91BC1B1CD64EC2C24DAF572BEB3F0785AB0
-0D74341DB2D399B39FD5A6EF44DAFA7933EE532E6D4DF024EE9D4D27C88B25C6
-5CBA87237B30917F6F7D7EEC1BCFE774B4D7E0859EF5E07071B58EC2B074B288
-E0FE19979B84ACA7E6E7FA1889DEA18A119E2509CCFCE53D0AFA66020624CED0
-C55C31392AC12110FCB8C81BD289FE7B6330D7A5F9B07994AB79A494F370A732
-94776A8C2B5E557C2F5CE0CA852092F2181C4EC8ACFB01D197AF975B5DA482AC
-59BD5C70267E811E80525111D17BCA8D53EE95A843F1000BE05E93F507113ED5
-751D6970485082915C28A673008B4F9398EEE609E483D001296F181783423B9B
-7BD78EBBA0CEC7D10F35C23137BF69AF40DEEA478923AC289D554E6837D380F1
-5C3A29F97B3C2EADE26B9926D2B7F83289B723032C1385AA809D0B23B093D4D1
-A0A9087625FB595C017C1B0C1029511225AEBFE7A52AAB58A9BFB740DEC5AA88
-6F02290D37B03E3EB90A821E4BBDCD96A01A7A23FF3BEA2216A41BCFB63AF555
-8A7B9D2211DD290DCDE2A28BC6E1F96048CB9DF02F0471BB1F9E5EBA85E035B6
-3926CE1E1E97DA841FBA83D8C95717A23664FB840AF1DB06D0C47A989BBD5B9C
-3E710BAE7A7C5BFEADE6F96EB056E6E702AE6A84814E0043E61B5A03B7A717E2
-54CE4FABD79B8F2CBFE163F05B717A76BE430F459AB5EC6BE60F6EE1BBDCBA1F
-5DFCADAEFF23E029C48C33D5844673334FC54EB282C76357D93593A34E099E27
-0D29C79DC8B927266DC6E71FA8B2804AD0D00FDEC01917E7499F2706F6FE9EF5
-EEF6E24581BA11ED1E6405394C85E81E3ECA373279306298078DA538EBDBB62A
-62AD89EB75F19A810E7CA9C745A8910129B1DDF7C70B5853B6395871DF37E468
-73C456D0A83C17DF45B7B242A0FD09D2157EBD8B14D4B852766F11962EFD1B0C
-BBCD3C398DBBDDB157F80CDA579478A9689C720C026372B13B363CF23BA8D2F0
-0828BBE088A6DF3EE50886D5D79282B82145D5B1FBA13CCABF9C4E94F66A145D
-F1BCCE4FDB0AA925E131B4270A48D25365090B70EF23F92ED72E770744059753
-1AC58E87A3A8B5F75C39DAB382E14AA485194E650C3F268EF6DBA0B1A604DDAE
-7A151A21CB7D411E77289EF01A99A4332EEADB57372D43230B804C90FB1C08BF
-201C3B7ACECA45D6A1DE107A9E231BA5CEB149F40D71C67F1F7ACE8DE1271368
-FB5B447454BD37B8BC43C65F6E8733323AA43FB5F83C4FAAB164C3C2DB7A678B
-6454FF9EB6C0A4CB8186B895D1DBF0B5382BBAFBE484C5580CB354DD40AEF365
-E1DE1638E582CFB5C1E58EFDF0D3636C95BCB4DD9573F00AE7149371E0CB0969
-B3EC075D3D7ADF61E79E29F83144CFFBDDEB68DAA5E05D30508EECFC43B8B625
-5B533DCC9149E8770F4EFE85207CFA8C1E50D8B589E090DC84EBEF2360B5F3E4
-479E68779E5A24BB722A37A311F3AA39BB04530A2BDEEECB3BC9FBC889E66949
-797E3BFB3D1A1CE6A62CBB5CF5DB3CF99954F5D0CB096CEF2F5431994738CF1F
-97FF3260AD2D89FD819B16E53D59E9E0FDF6B56BAD6E0AAF557EFB6A48D029D8
-F70BA32DFC0779B353A4D476B86CF02A505D40815E2585FD03C07B32B14D2B58
-13BEB639824A1FC04E7336470DE07DADD4D25A641B430DD1336F3A1D0F1DB6D9
-453006DC947ED4F2D528C00BBA98BEBBF855AC8C133B68DD62E292063FCCDC1C
-0E390165DF8B85C94DEC13270D824E029046C892495BE1303C44FBD3BB36745C
-63ECE2B67D2B303DFC22E2FDD140E40775A99B1A8D11DB4ED1C625540E3CC640
-269F338D8B04A713CC3063EAC34AEA0AF725D31642877042C6DB4E7950DC8C0B
-61A322EA288F55B899F0A08F49E22791A2D55BBF89CBF0F1B97317C04216D616
-FCB5D100126A49DD94338D4DC08EAFBE1F08AB6B1792D358C50CFA58B5A66643
-6B801A2267C9843F9C06FD9F137AF780DE55D83F949F1B8CD025475779471377
-B8CF89B2765C0A9C41C186C586629C36C879F3A29D7A9F4E8B8919425F3B0C98
-45CC7A7AAFD70D88E2DE69200ADF0D263951718B2289DFAC4A38311519C07933
-9627F52FBEEE5B9619DE3BAC9B2791BD888B70AFDB75A1999540A1D16E9D4491
-FF5D3E5CE027E7700F1CC85F0BC64ABE5CADF8059C77CDBA5EB1AAD36B1C14DE
-1B30ADFDBEA34650116888C6714B1825E56406C96C06B1D37000AED2840743AF
-BC2F6F95E7917B32C3A5C7D36FB9F34626C0E61231599C2EE02EAB2DE0136081
-48A65E57FEDC0664DD2934ED21FC98BD568B4DD7BD55A251D16D2CB99C53C96C
-0A44BEB44D9714F33CEE323B0ACE7923AD307A8D3B0CE768240F0E8C15C2693A
-70BBBD740B3C410DAEFC933B324A3FFAF31C3D03516A6EEA22D2EAEF4D607FEA
-4E865D7F6A47EC9034D23464715127986B704A08EA781C5DC9096EA7A95F611F
-AEE6BF59FC2F3F67B20C70C7B187E0ADDC966BAB1258DC4B7C64E317BC97F2AE
-B07D61A535F51DB2C0A058174EA194DA4F0E44326A2BE85E31A81A2D1032BD4E
-945838B571BC43768226FD5171F01C24AF9654A8846AB32147D9E6F43F03DE47
-2E515D0A300BDE126FCF69A4C19DC8F13641C89A674E5B299DD875DD0CDADEFC
-54FDED84A2946C4992B9EFF20C93AB2EE98837456C5BE2D691E5BFAD21A297C6
-9FE7FCF5F91AFE1546DA4F96E0F437460B044CD9BB2CAB9422FB85C5E131866A
-B392515816F305001A0BBA51343572CB7B81356A0B45E33BC7BDF0F507F1A316
-BC9F6563A5BE869CEB87DE1051F1BE6AD6F267AC18B6A8289215D968BD467A24
-1F5F5233230CDE952ACF0B776D919520E70DBD5E1D5DF82C89DFAB421F98FB62
-8CCA29D0D223FAB23AA37B3609D1E15ADB7F680CB67097444672C9347E47E230
-B7A8E5D4FBC1C05DACD6CE17006D2150F6D378459E4BEDF9CFF363E564D63353
-C2C609C19DAF27C7DE9A91AF2F0664ECE84CF7A8C288F94EC8033A9176FABB14
-2B41009D02B6DC09CF9DEFE893386E3CD5E7331A35F481E18BE9CBB04951C4FF
-7F08F5A49566BD7142D20E1A42C875A0EF12892F404BBB128174F8979852151B
-E67D2D84151BF68E9C6427BC362CADFE532EDEAB49BCE2E5009030151BE5D2B3
-CEFE4F215E91DCE7D407FB57BD0FA8BED720E20E65FF4CC5BA32C867A1F9DCB3
-EAD136D0F7767485A604CC97D47A2320560D95E9315D04D72BDF9DA3F9E4836D
-1D24ED2D707DF128810F218425FCEA314852DD80D48BD08963976ACFB9C44CD2
-BAC78BEDE35470512463B5C6E877BA3AA4749680D05FA3959A0B2ECE7171F1EA
-9B963122A1A72DFC9E6FEC7E699A4C6BD742E3D4D570877231AF25FC17F598B6
-3777595305CAABA3696ECFCC725EB41E222403D84DA710D690C155978D93F389
-0F49E87EF135D19682BD2A2EA6FDF7CD3A2BEB6C087643ECB69252BB8678B21C
-33F85002D1C82BC7066BFA02EA5E7D671D6450E5297BC91B2121BF46DF58892B
-14D581DBF322E89E6BF24C6532CBA0C3897DC13C907EFA52142A018CA820A079
-52D7541D59D864C597D7ED9B9714A4422BCFE03AEE1EF4B6B565B40FF1EB4BCC
-ADD77668A46FA7CFAC18AFD4B92C8F76806F81A818663A4DA845DF15F6A2DA70
-67F165013514D26B51D958A57EEBA06114DA17B3A930FF23B0DEC464C8D2F915
-68700C34E684DECC3639BFAC26B22E277B1AF59112FC783B887F37A730766AD3
-F50CFBAC08E0B4050C1434241EDB33BDB3F97E1CDA67721899E4A7EF1DBB3E3D
-4AA90E615D06A805EFD26EB78A6F9FFC12E53D5E0FF49909F41E69D10C308EAE
-707F729147F4D375E461690B9DA00A94CCAEF8C039B1F6A911A2AFFDE3C954FF
-DA1FDC3C137433AD11A357F011594CCD9D1EEF0B976378F8CAF292E67662EF17
-AB786E90392DA9618E9D8DCF87C6C51C3B7371207C66D0B692FE7C290C0B51C9
-EE8B2670B63946EEB7FB9A7F66CD72EF1F890301173FFCE6B8FFED59895DAC93
-EDF39170D6D906FD2A462A1D2A85C1F19D77EBBC4CBAADAF49CE9462F23E1329
-8CD5B445800973B978A460921E8825014983943BCAA4D1019AB6627925B03E4D
-DD70D0A1B8694A0D47DE8DF8B89D079C9C14C6B804058B43B39780847D746616
-52ACC4AAFCF918C3D3135F7B82A38162BFBD112D581157A19DA30ACB74502FE4
-40D7EDC6EBCD9BB458F2668D727CBF2E53A9F0121F62678D113EAAB36C24F3FB
-831ED9761D907C5DCED84E6A9B242B041D26BB25A88136470F112DA1459657AC
-AF399CE6FF71A7CD29E40A19C2503D08372C2A770118ADFFD821159C067B98AE
-1170DBDA9AC3B3C31CEE8F6DC8B20C27295F362B52F1E309146EE975F9B41094
-BF28580EEF0DD850CE543A5D369676D7BB9AF94FBECDE2AE3F09848107BB9A89
-97EF34E79201D422622E36F78FA2B80E678FB154FE84D934FA7C8D9AA1A1AAF3
-33D0A40D2DCE86DE6380BF617ADE6C6E5C97A3F056BB062A9097293FDC0BD70B
-987E357AD571971CFF01E913BBC1D05F0A7205F1ABAF516E38C02CF41DBD399C
-E4B4648049569DE6DE43170DDF91A4BA23E398F82EB411194147528312F04F35
-9B8A36719E8CB6094DF7E2A14B1632CBDB2B1966B59CA5A778ABBBD66FD53571
-CD8B761D8BA11C0BFFA71C58FEF39ABA40A4D01974403D5076CB826315A24ED7
-3D207C528FAFB65B4861BF8AD2B53C748B0A4B34E57771278FC24E98AD52F34E
-04AA492C9815EBE676781D40239B3FB7E462DA782BFE82C1C43BD937D6C260B3
-29D6DF902006EA10A63DC2090C9484C6234AB78A45957087E65F0F8979D5A6DB
-C952E8721133F3D88316977789EB8CFCEE5085FA4741AA4090B920CE7849F9CD
-4DB2FCC872CAC7AF5FEF0257B4A0AD781B6B4F634F370F7F61DBF8BB66578E34
-4DF73EFC1C23CA11C7A6C336BAF988B37E55C20F4138A7B5D8FBDBFC70BE5D37
-AF6F7E6958E062C6344C14249958E8566571B9C79ECC
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/l049036t.pfa b/lib/fonts/l049036t.pfa
deleted file mode 100644
index df2250f90d..0000000000
--- a/lib/fonts/l049036t.pfa
+++ /dev/null
@@ -1,1613 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiSerif-BoldOblique 1.1000
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.1000) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Serif Bold Oblique) readonly def
-/FamilyName (Luxi Serif) readonly def
-/Weight (Bold) readonly def
-/ItalicAngle -11.3 def
-/isFixedPitch false def
-/UnderlinePosition -36 def
-/UnderlineThickness 72 def
-end readonly def
-/FontName /LuxiSerif-BoldOblique def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-221 -211 1138 1012} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078994 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D9E237CD60D35F0FD179FB
-1219B605B80A36CDE0BAAFFA5D97DF370655785FB236544DF1E7A00B7E8AA37F
-C23C6BDAB4E3F9BC5EE40602171D028423D88D16F57168C9631090E451FA196B
-8B446947EE6233FF652CF41C03ACCD60952FE06298CA4E207FAAA38F192D2D8E
-E528AD9B647706997722D73A9203CF7377792AE5780299EB8DBF2C0CBE5E1572
-982D74F81C32E627DF120AE53A1BFC783FAA74AEE3920D208F8AF826AE684F6D
-CA41AED94655B6A9E0D60C34C318C7E76F5A52F373693DF3ABC03A72E8DB5E66
-CF5DAD37C9CB9EE42DA592D9DB876C6E62DAC02F1B126C59D1703D3A685C617B
-F5A8FD9A630D8746ACEA7B41E9DBD4C47B30163DE05B34AAC3337965660BAA0B
-CC2BAFFC0F3446E268C9BB27CE08456549C2DFD8812DAF308024973D7C38E8D1
-30C198D253136F3478334600EBF8C0196ACA6E350182B387FCFEB559F62ADD64
-D9B3C78A9832FA4EB023B07719B4D8A173274C388446C99C63F7C6313DCE4118
-8D2127184AFC17D5651DC1F2B7A763052FDDE142C714658009F5407B20F1D30D
-FC978A2FBD8CCE7523A2A62EAF38D6485FD62C13D444DCEC7DBC79CF9258B502
-67CE30E2032F03718CACA3A28F71B941923F52B6FC4EE1731D9BCDEB5F456423
-52BC72B85C92AA0A7EEB5E7BD6470B7FF3C9A68EB479102C6F790F27266B67A8
-59AD2EB5CF5A20B6A39274BAF31E02E1C487F59EA0AD622DD509438C43E7F935
-C21E6FE887846ADF1D3071DB5C1A7868787F92F46D6AB19D56CCC3742B646AEA
-2D24DDA6E00C6EC895103BBFB6D67B0C902E176F84AED3A0999C2C99A65F1A64
-A362CFD2DB6885F1EF150D828BA5C685A3A0183963102723AAC166BEBF18CF62
-D0C26D613CA8AF740822182523B26060E255124B1F9C70511B9D338A6AE2D837
-2492D7A67A371CD3E757A8130F8FC9D6B13BFF690257B7D41C012CDEFF5BFCAB
-B511D068C9183BC0983E09341008C9717C20DE26E61CF7CA45E59433E58FE1B7
-C6884418C26663988693B995BF1EE3842EFC3E33976C988D6CD724D3B81A942C
-2B0BB08F65A08BF768138C8A750A892DDAEF502823D4D6706CCC05451652D896
-38C09DB8EABA368FCF8AAC4E482942DD3D784D9C57675577F107594C0D2E07EA
-36553A9785E0FE26534DF886F2B5A906018C48F1A0CFAB7E373476BCF98E7CDD
-18A11D8F2FD16699FAEC22754E53EE9C972FF4A3901F94E58E23823A78F40439
-B709D90F48348B8B8E78569C77326B684E4DE7AE9192877076BE05932E8D3FCF
-DA09EAADBDDBA35290E3FBC6AF2FDBD178AC051807027BABD733B54DA6E6ADA8
-350D3FF874041333CF88705C96F55CBE46A4D6DB68FFD447996A124603F3E29D
-4673137D87A8B33A430F18ECA5DE4ACCF88AA16294BD9A3A98C5081C2112E3A9
-FC7C9FBB704BAD222B07D0D7E9F52BFB316992C7ED6AA618163D2268734D7B22
-3991A8C256CC17087E844BB8FB806A66B9EBA4DCD9FE4DDA936CC61229492253
-2922EDB5B12AEF0F77D693C51D616EA252BF6CF515C5CC737495F33CA41D9F8E
-34572232EB422CFDAB03BC194E42DC669948235E0BDA96E50A3B78FD24A8F859
-61B560D847BE4A63E97358DECFA6BE9B86E026176DFDAFB470D57AAD803FBD38
-714DC319655DDAF6BF3E085819C456BCA734BC479A22BB6E8C9FE3E747A5E47E
-0FD73B4AF5A80AC230DCB02818AF68A251998462E6DE10AB7FCA5FED041B32A8
-382B480F30400DB936DE1665D9D7592110AACF516FD0F68026AFC371458BACD7
-BB9F0A7C5B399DF9E7B02249526C555137B5A2B8BD3FC2A5055ACF2A983C54FC
-5D4862F8867C39DF18824D457F222918FACD5EFE01982CEB5E75643EB7C61F77
-5ACFF22D54B58EB7F0BB14210CBB8A8B562B188E04164F46DCD915E428BA6137
-08420B83F3ABEE130C92EBE3A7C55FE7AAA126F2E9D450350F6331D4FCA8554D
-2A0D48865FFB3E0CB9E97847D82F8EA1218B5DF5A9966DF6B7622A0BC06531C2
-54F0589991E10C95A5D1CD2BF64E248D3BFDF25F88A405E95FA254D2E4B70160
-9C8153A5504EE22BFB83C771616044B55E0B9676CB234B0054EB8B3B073AAD22
-B7E7A89C15A80E3344ADCAB949955641E1785EAB2D62B843DDFE4D5974FB03A2
-8E9CD8E6B10A98611126BCACF813843C92AC35DAFB9F14055EEC42E01028431F
-2456598FD76BB66F1309B1DA0F7077D86BDCFBC6B628B895011B8D74935F5419
-8902392C6D35EC29225CDC7D49712D1D9FDD66C24C5340C1E05646631902B92C
-516F67ECD172F882CDCFE2F957E4F6395D79E9F08E0EF64C7FC0B3118E3BFBA4
-FB752619779BC1645969558BA349F8868B3A3CAB48ACA78FC8BBF33198F03AFF
-3862063C0BD73AA486316E28F948E31B89CEA0A0F9F10311483EC0676F597458
-8943317514B3B0D47274A499CBA6F76415D22ABF9AF5AE9A164D3444BD3A3CBA
-17682AED8A11DEE04EF6965C07849C06970829560793B5E422DD801B4AD94CCE
-AB73562530310B79FCD6F2F93182C05C509C0B2163F9F24A7BD06DED8D50C955
-1C9012158313AA8A548B79D495DAEDFC651D4A6110B98A88047A6893FFFCF00F
-03D6848F15412C9200C5AA0525397806CEBF448F92E9EB110EBAF17CB2856DC7
-8C22DA7487B9E55B6DF23F345CB478689FB8522A1FEB34EE58AD8A4805B7CABB
-58EA56D1FCCEF7869901EA0229908C74EDE80E2CD07B0E33D17389A434C54E07
-039EC17E27A56847CFE4FA04D65AF20650F8C58D24745FFD76F443843B7ACF94
-01528C2F046C2F8598C36367E9FD009B2B73F52AD9DCB49DF76DF74597AF9AE7
-B43E4988D7CAA34ED694CF0D3F67B9C21680DFD8E925FD4DC6E4458939C1F5A1
-1F0465493E0B8DD3F63034813F557C9B321E9265F4467E1BE3070101675A40E2
-36AF9F1D37162176B4B950A37EB1EFA3642B9E8AE6D5CC77DDBC6E5C0A172BC8
-4EDAD45A7502ACE290A9AB4D56E32245F7AF75D540485611CC79C813CCC61FCE
-E7C773F74E26BBCF5EAFC476AB031A04C1BEEEFC881843AC2438988CDDE7CF53
-C18FD1A9E1F1EC264DC2484BDF4867933422A75E0EAAD1AD55A408D81ACF6AC5
-D93D12EED180D56666BFF3479B7EFF185E39D4296C7C87F56A6C1B6B0A99DCCD
-F7032FF77585F4A1A22DDF46171A5A0C0601758F64CC10DD4EE4EAB0BCD05753
-76ED93EA50B176B36196DFDF5345E4BC934D9B6CF7ACAAE77A9B0BC66E460402
-87AC5F4CF69ABEC05B6DB517FE1059002B95E4245297272E552E6DFBAE1663E6
-1C37C0C90916037DB040BCE0BC1FCAF881461E0B5960997AB582942DF119F00A
-A58EF89B9CA549913721521F259B135EFA1C7E1A5F87550621E31BC7DB07FD3A
-85F024F2943F95D66503E8498D4B7038FD7F938950FF22310D1B49E61E395426
-B20B952D57983BF33A707C794895B082DBB035705F8DAE75EDD15A2F75C9DC04
-91A59777B2953CB4A1C8575C4FDC2DECE1737E9ABAF62637B0FB6471378E942F
-1141977AFC8032A13866589CDB087995F9F78EFF5713572E6F3F7FE4467E8313
-44D994CA7AE974124CA93BD83C9E8451C956BAF993F279AD7044ABBE7BB826A0
-2757ABB1135A21C9DDD3781A589F9252C51452458CB5C94C4FCD53D3ECCA36EE
-263C1ADECAAA22CCF6CE9DB923000BD7FA6B6B12032ED49A469BDE95C5903420
-CF275F03D3637C7A65A872F462F19C6EB25EE8F4E7A49C528806EF56ABF5468E
-BDFFAA111A3B5E5DC9C46340DB0563DEC9250C603439F656ECC6F8A5E344BCEC
-DAE02EE7F349175C35D8F8CA7715BEEBCD45D2980B707B3B2EE44FFF846C8B8B
-8A7C02A56DAF16192B3823283E9876E8079FA3EE07BC1EB30AD14DA63B80DAC8
-D1311AA303A9D56859A4169C20C7F279B7527741D44DC6AB31A2A048C2CCD362
-BAB152807E3F73A621579EAA2FA7EB2BD45AD89E170D4AFFE6ED94A395965E32
-09C600D9AF322B870B34068FB0706EAB341FEEA668275183D38C641A98EC2BB3
-0E6827F3A764DAF871DBF5D27D254FD78E5F99432C405E92178941EE9B1999AC
-3BC5E2D10BE76BC555C63167A0408A69A3B37A4D263204F6401A3AFF49398862
-C685EEB99C79D42A7859211B6C447462C894150469429C7E5315F575F8AAA66F
-C2DADD013A304894E50EAEE124C86E1AE87AF200C8DEA35027ECD102071F8FD8
-F3EFCE1A14AF5910C6CF5A5A8DC5F09A18285D0384717E4FA0232443D12130C4
-EBAFACCEB4A8AC281F8B4CB5136740A15E7184A2BE166ADD3B307E918D326769
-F99E923C3834EDBFAAA5A2BBA1CE952CC01804000E1BF0A4C80B35E0474FC985
-3F852E8AF570C542ECF37F4CBB940E278FD2AD1249144457ADED44359A90D3BC
-9022B23C46F25C74D22A61BA69F1BBDB4C5AEAC64AE8B6AE975822C08E416810
-310EA856B8FF8D17BC79AEB42808ACDDA673BE0BCE980C6A98CD5A0455A1A234
-BDD559C0B31A798D088BA0AD425DCD904E8C3013C388770DC9D03B6249E8A4ED
-A49B3A2EB11723B0D6FAC3BDE453E1F8DD6531BA42B6359F47A61B5762AFCDC6
-5AF5130792FE98C5FC024B1DA4887095413C6FBA16EE59F1C8CC43A9FCA40344
-2ED9359597B991AFD2D94BADCE1E96B676A5910BE322CA3BED9120062740AF03
-7DCCF5793E87E7C05D95C4F65466C2D1867518BBD4CA2CEF4F6299E122C2EF6F
-9301DE754D842D32BF4FF0C61001FA3929564A3935FF2C291B7E3B4425E9A0B8
-BD326EB5926EA0AC4FAC6D34F2A0715A68D38EAD576CB1FD774C30F0CDF2643B
-2DFDBE58F38F0589ADDB6BCA49E1280F5219F45B0FFCD574ECC51BCC8625B1D0
-8A710B796113F13B8115B3EE0267F25C595CDEC16A6E7A016436A5AC93783EBB
-443AF8DD342F6BD1F58C315973F9FE0B6D85C50D9BAC10A456CC83D8577032BC
-FFEDC71049EBC829D6A419DCC22ED0A3A2E230101CEDC64C67E4F442E36AFEC4
-EFD6AF959D4341CDD27830F364E85DEDEC69E1D375AEEA5805D45B4507275AC3
-95575B9C83CF9529A9050997D5235ACCEB4E79BC37515C7C0205D8C9B827A5F0
-04E21177207379699BDA9805FBC4CF0A9B6AEB09E1E21DCC693E985DDD79C45F
-A33322BF56FF7B91ECAED3E0E9C92729CE6894815DB7FF4C61E9F74AEFEBFCF4
-56FAB1681DD80EBE8D418B6B7BAAADF34E87EB5CD4AA2FFDA2E4F238035FC14F
-6239B152EF3232277E9AC710AAE11C310DFB02BA392A026C661EBA5669F33C22
-B850CC57351F9EF0D6237C36753FE0A63ABE7C6E11798C9CEB6602D8E33724D6
-CF700E1A9D09D6973C99EB520C3034F8B38EFD43FF71313950C1D44565EBB204
-A614DB50EBC153B59A366BC76F01E5C3E5B8BC09D2B68EA6C154F72D54AA4733
-A4FF05C6A82B0ACE40AC70343FC83133797AE8C6DBF3BE1F6E441D6BF809C71B
-D392A0CC32F1625D07869950F857E4E2B3B9979131C4432C44D8F6EFE9D01F80
-86D60FE915A474EAD180B21A24FCE69D511C011A8A6A39DF30F87FB2EFBB376B
-7CFB1EDA2447181948D01C49F3795ABCD52344B58ADC8A8DA554849C97E5ED97
-E42F571E5F2D060FFB9E1B012FDD38B53C3AA5172E280B319BB3AC47E4BAF2A1
-4F891DF034AAA2F2AECCCD8C23182B5535DAC76C151F7718C39D549B6610DCE6
-9E154606D564619BE796F85050CBCF8EAB4EABF17FFF4ED07A3BAD022C523621
-DE7FEE8172910DD5448D8F7456637A17ABE96218AA7B1665D361B7FE4427BA75
-8F9193B7B9A52D4AD3405B7DFB1FC79D235DDF354D321B293E5C269616A10E58
-722A50BB356379CE744B3839E7822455300AACB0AD45EC8761F560B8D1073C9A
-5BD7ED1BEE741282A92AF285BE80C6C65B2448E0A4A359851945AFFC91C9E578
-2C12D27B51BB4500CFB533051D055E7EE47BCC23D8F8DEE569A1FBE3419539F0
-8FA5CE4D8612AD404EB7E83D4E4A547C2C347D217979AC48E5C081CDE3671319
-7DB36C69C2A31B0F633EBC046CFE969448FF2A253CAC2B4FFDC14FC152BF83E5
-E517DE19FE1BDFFB7A3F276293E761C3B39AD3610E442AA58A7C25BE41C05141
-AC500ECB657643CB128E8AE36F4B37E8EF15CFEB1F8E3D334519A3609CDFAC3D
-362933B5A55559CC28DFA89182F89B2FD5013E08A2C583FCFF9CC53A2D5CD13B
-1C9786D1F39A02106517DD191D9E5169363FB01ED68C4CC13CD9CC257A2EE802
-C9E40E5C0BE5E65982AA15FBF0F04118EBE9DF64C279AFDFB1197AF62F6E18C2
-3E95A13D6B6737C4579B24E33A0A14DC922EC4C7202A30A06A4596547A791955
-B3902033D6047AD6E44A90FAE4333D0891684A9B1895585D9E91985026F72BE9
-C216009AF01806AB043E51DA494644D61AD7379C7F93F17AD0F164D794DD82B9
-077118A0426BF267C12997090821C5E01202BE01A1BA5CF130557EAF84E2AEC0
-C83C03CBE7F14C63884CDF25E5248C45799F080D281E3F9FD932063E7EEDE22F
-0B2F478FF72D54E68FDBF6AF5A8BF8EE06EF6C30A5E061D14A512075A873AE5B
-5DF02D81390DD9597AA8E902459BDBE5A6A61BA2E6CEC7C563DEDB2BC950B307
-CF22643E985DE1D7CA84881D19CAE2A205FA5CDE59420353F3EF23FDBF391FB7
-38CE81218276B2960C3923B47EB52A8429A50E28A607D5242312ECA5536916E1
-8624CD1482AF8AD52857F38E4E689F774B55C3946C2012635B911205A760F77C
-8093298C200E220697E6F3D210C88B3E46F2B2E931952D42F51FB5426DEDE03A
-05004DDA3604F38CD65473D13877822CF615C299308395A213B5D666EE06B0F6
-C1ACC344BC1037B5C95D78BD424522F051CA1C03F9FD11EA355206230ADB90B8
-E274770F8DDCDA7C3910FB07CC477B04205A6434DB34E69F3B69EEA2ED6FBD58
-C6CA944822B44062ED2F5B0AE86AA5F40E0B171D158CA1A57E5C3240A1A721C9
-92AEBF5D4075D78D772E1364F9BB631CBE1086D4EEE58E6B4D6BFDD7581D2075
-EC0FF81EC590A69AB9EA6C38D91A3D763A1A85D9588741BB657A7CE31A9D8C55
-9AA83C9DD8321EAB44CA22827230A11FBC9CB12992204FD936401DCF9A71D190
-C9C7EFF35FA97ED1EA2DA3584CDF3D66C545AE37E2403C3945DFDFC3F08A6C76
-C6E3F7C9238492D7022B904C846CAF40F0D571A39FB05B7F359C869081274F4F
-3174CCD65045AFA181235224859AC3B5A708301033D0DD449D0F3315C59EDF26
-94B3AF8F8FCAD728C18B55A9A4283D0A257DE2C36F2066A31EB0E401C34A5861
-1E4DD5C81288469B625BDE1B3734804F726005071BED0BC518D0A1CB8C45CF5E
-01E344C48668D815DF1B3087DA5B063E9C6D1232D3337DF90E71D10A306211F8
-A360053722E799E182D22CE80F4B0A7E118806F6D99B4456C539DF049BAF6694
-A9EFC7B847D0C45BF90DEA76CC68BFF4F733D246715976AC5BC56AEEBF3783F1
-15A79B960289C4BE778BB63F8C46237A84D9881B40B9562E460ED08BC770F6B8
-97A739BC2A060A76F1F1280EB07487F42EDC0C9510388CFC618A311A3987F4F3
-B464489A974B2F8C2375351E70C95BE7A7E25777D78FE245195F9920C14688F2
-05F350B893547D619300D36C58A8FA419F310A38AEE84A714BC8D0ADC2166D13
-80BBCA7400C6AF8687E0F9690EE1B71538EA3534E43F035B24532305E07133AA
-F43680AAC2EBE60674F991234FCA58A01A4BCD9486599B2AB70FC48E0533CA06
-C2DF386E46617AF45A810EB56C610168AC4AED960EC344187934EAFC3E1FA3EF
-F5010ACD71A7A902FF0DD4CC41107189041A71DE11A6BFA37CB035F1C14B8161
-9D70DB95AF381AFB800C99D56A366ABC81B4B463DAB84ADFA5272FFEFB1DC405
-11A92D7CEB4D54CC1C682E3BE2C0C2E671DF073A96B9DBF014588B663BA73768
-A7C3D4D546D8B59BF7447DA941A52D295B8002E5F1C31ACA441F6F55DF69F515
-19212E4BA25B340E9740499986A387E9B379F341B3A2B4C0D0E79379C6A2606F
-744E13D2E415FCE686A2DA21195AC7431C9AD3F4165C7635DFAEFE5ECCAE5372
-BF7B107E6363B7C97CABF67A141A2B7ED27B415D2CD730FA62CA1C8900C673EC
-373485615ECAA7C4C7A187BA60AE6B4E6200EEBC4F421689E5578A29F16719AB
-154C41FAB20E9D262C2BFFC9F6C6394CB841E9AF84A48376BBB637EF6BF45330
-346CAEE1700DCBA3C1E0F2E75340B6FBA1721AB007CA80EBE1E66E785B2C9568
-E570A8101996903075E3E9816741BAD2A30EB96430A5710348109270BA7CE860
-C227023C77730D5CE4D23CE0D48707AA4C314D6E065EF55B5E0A83ED927D68A9
-0421AD3A6BB10F27DCB22DAFA033F15BBD985E2468490DCCBE677EE57061184C
-73F22395323818EFB3D0906537F0881FEA258E8ABA6F89758F21A47AB72A79E6
-59C9F0737C23D76F95B80BEF922C62502C533ECD80C618C1814F112EBD7616F5
-D9D42153E5DF0B4F844B66F5985A345E26E93C259D36FED6C9751BFDCC82A233
-6FA4A91926D768AB042278F2142C51997A27CC08DCE7985FDECC2F99C25F5F04
-C48C0C4F532256581490B27931E1A472C7895E90520ACC252E55709DCEB8D255
-45C0B5526F339CACFD8A94A1D58958B239FAB094424412FB699FB5A036BEFBA0
-572D5738B2167771B29D3ACD92667C57B07D7AFC1AB676E600823FEC83003E43
-49F0D3F7CBCA7D7BD764C70247299783EAE00B03C09ED5A6330F1516600BA52D
-E1832F3268D38396776D36166E26BCA5252A59D3A9DE42A84969092761BBDACF
-6C5E83A69C03B53B10FCF95EF76F91F7A8EDE6E450CE253F373FB9382FC84BC7
-833F464126EFBD42A486308AD1A30680F7C423EBE1597FE234E510FB4F2F0F65
-E6CDCA4D2C5BF86E743A39BBE78D0E4A3D56B04588EB457D96629CE5AE95F268
-87E3B49D66C2BDDDD27E9F1986BBB313E33110F099C9F176D188B7594C965EAF
-AA4FEDAFCC7BC9E7BAD2E1C983D596844DFE6F321EE15F109150CAA6DCDA513B
-78D6D3B8260041367FA44C058C3EF84A37DDDDDEFFD35AB50664F7DD9C856D37
-D5C6569718DB3A6C869C9DE6257E06ADAFE2FED0A544F5023A4452AF73771AF3
-06B737395348ACCBDC9662EA92616D197226E424520F68D38E80537926DE94CF
-13DCCB715204C3DDD69DE77BB00334FD3086F8B961FD7FCE4B565BA524C8EDEA
-84EB69E3400A075561A19AC5D2AC8786A68EBFAC2860ADF804AC53BDA205AF27
-37D47F05DF295430915591AFCA00CFC65B428CB41EBD97F229F171C8995887F9
-8F99C0B45CFA0787C9B23EC73EEE85AF1ABCCA5DCADC9124A41671ADD3C33BC4
-2BF955421C3D563B1741C5BEC1F28D2011FC1FFECA792B31C208A9A02C950397
-74ED4874D55F2EC1655102672BF26012D747D46563CAD7C0BCF5D194B0EFBE73
-71C1D68F3AB20B63D083F45945E1C5B21C0FBA4FD11597548062C967CCCDF68F
-6578505652468F71B803C9A4DE8093A4D0FE29646D7F8737E565EAA3D9F6846F
-5AFAACD20B44F58F143E8CBF9C236938CFEA98EC19AC08DFB881F560A2ABA6C3
-45E6E8499338F1ECC0B7AACA6634485468C0BBED3F99D6A304BB5968EF8345B6
-AC1683C7E9D4EA6BDA3BB7D4EE9E819325D0BD1672B65C0D213DD9B988476936
-7948106DB8A26C2F6A511B771CD57462181CFA3B086CBB508270443C48EF7EEB
-7C7F0CAB757FE1A1E62C26C079AD2DF5C2A1DDC919F59D7AFEF92DA0B1B3A34E
-9B142C92E8EC6A370DB976E3D112458AB0580EB79E6253D01E59A015278698D6
-38684DCCFE13D476679E1CE55D565D5521684B4BE62D0CFD7FB961989C011660
-E79F7A051AA75872D48629E5A1598D29E8AE353757DACDC027C8408E3E027B8C
-2304B2F54CA64306776A2A82017F5C96BAE8DC9D7867857D772DC9F4AB8B45EF
-F3CDF3D58B91557E6D39CAEBAA8F3D81023C344B2471128BBB0632FC6F05E9C4
-95D16C636DB9858D1359FB36B301929881F09E5F29B0C2D5D13D4E598E1C086E
-70141315351EC33C15AEF4FD6519FFD5352CED5E5A878FBA466F1C0252660F79
-29B1428E9D0467FE26A3E1D22B7B47EE8929F87D906923BCB7192DD94E22DE58
-A49D4BAFF8DEF1078DFC049BB16420F6F968B2F6AE8CF8FFC65DB1AB9A6EE972
-C89FC33EDF480124696DE3FC43BCD111108C9FE08482A3BEC819FF71917C5118
-B38040F48D74E224B495B90667A7A678A9F55DEA4F70953B38F97FB2D3EA9B9A
-6E5B19CC035DCCEA31C8FACF62CFFE9DC86DE87815BBF5B7F9D4EC7322C3E658
-BDCE94C84A4D747531AF85676C5405242865E9086E77FD8C51C1A5984C9D8C1C
-7B29952094DC47D9062C89BB7AE2279B1B92DE43BFC54C8D236E546D0A3B9B24
-A143F5B47A70FDC724F45AB788E3FD7228D4991B7AB0DAC1588F290FA1884EDD
-5A895972F0E76446925A73E616C93E0DA74520929A053B730EE97CAE5FC04749
-18F8E2B87C210C799CB0AB651AD24D9749A2D41DAD03E94DC779312BFB90883E
-3628A822946BF8F81023F2C0B3DEF58D73B11493D6482FEB44DB9BAE0FFC52E9
-0BC04A6E50FEEE540E4E8C8BACDEDF32A3F09FADF274150134AB3D62AE0A711B
-0B30F3419615E7F6DC430C13E976246B470440E759117045A4CF8CCFDD9F0E2F
-E1EF1170FA6B80D192C34F01E472F8CA8978EF531C13D5BC6571F7C3196584E9
-06ED32F98FCF35B50BD2C4DEEC9AF9475B79FFB95024D3ECAB0522B19786E083
-5B86E984FF076AA82F707048BAEF3106EDA9317B42AC8D3CBAF0B9E21D0AB84C
-957D20D768C903AC512A947DA6119F151C1247B23CB1B52B7DCB17C5A6A5205C
-265B78795B1D00B361778BC7351787B9ABC1CE5E5A58D0B7EA5EEDC3EC71B1B5
-BEE69671010F9F22067E99B01575464E9F34574E1BB7464644968547382BE1B7
-891A84149F9A5F42CC21478EAEDC5567A0D430A296EAB205368B068AE66A1B0A
-78A65BD2C23B4039CEEEA7903B1CB11E476C1384A332FFB687F661A368001C71
-722E27B624DA1939FADBB5BC7086FDA5094001B50895C70159DA51BA742D540C
-2216A1C5BD55E2FEF4E71561612C02809C69C21A072F46FBEDD83935A9C850D8
-EBDA855336501173E29F765129023E86D29D6CB0F8BFEA01229DE5369B143A5A
-090B7315D36169A8E4704BDF62F93B949662CD574211CC8CEB59C02E1A061A44
-0CF5A59A05BF9D4E71F5FE55772FF327119B585635EA460B3AEE5965DE139421
-BF947637683431ED8EA28BF1FD43F8AAAD8FF22669DE5C867E388A30D0677B2A
-8168BF8243E3E7D7FE9DEEF929735B1708FD0685C575E96A621EBE96EA15C3BB
-888D276E8923D2F7C946B11D5E7AA212219475D90CA4114C879783235D636B29
-02E43A52803BF524F84603DA0D27C8A0EB4B3B84C66A0F270A49A0BF6E5148EC
-EF7C6BB67144ED456ADFF8EE21371FD8DEDDEDFA42B0738DB69E1BE864CBD632
-EBED5E9C457FBF80B2D1DADF31A63C86144A1AAE498162AC4DC9E04329792111
-C631C12CDB2281987C5F9E12625B8331C3355490C0139A306F7C0E8D9B3FD198
-D77A0D2980599D64829F5B509C5E88AC242BF2B0D6EABC04E8A25CE812352A6C
-8A5EA0335322C561559BD1172211A0A5F5B70A8711B2C277E668A47C1E254047
-298EA350947CB275DBC85B531DEB739A78C504FE2D679AD7D3811237D5349D6B
-454A0B44051150C0DDA3728510A321DD25BBFCC7CED07D88298C30225632C5E6
-627DB302E9AC30AE902B82DF0ABC2CDDB55EBE98D1213C397780931F58854D9B
-C355F7EE7BC6F526A5EEA043FAE8BD740D2713BCB352811DB18A253291A8D465
-EBD45B9E21447B5670D47815E7D04C00EA15AB089EE92683E6242C8948A3FC16
-50BB0BADA960157D20E3AD217C5DA1563A86FCFDDE2D274692A0EE47D41227C9
-1188D534C7F42858D0087713B9829DB97B31EDC82BD05AFAD4B4CEEB3554CDF5
-56F79FC410FD577693706CEA58F300F8158EAEC1ACDD7B0F2DEC83EFCF850B45
-40A00794BDAD3C43777EC8C9CCAB480D931093495BD55F39BC6D33DFF3ADA062
-EE643B9B84086693BB70A7AC9B290586403B43F4F930894FC0A3A4C9133E84D2
-7A144EE9A60A6EE3AA5076ED1BDE8B56AAB7AC243E8317343FC83ED2AB33D0BC
-6A130EE2087C0534521954E77121B2F34D00BD2C6D7B29E6B96D15CB1BE9D144
-6771C1CC311CDE1337E2122076006C84659022B235D597551AE45287BE7CA489
-1B0CCADE0B548A0850D29B6C1F38ECC3E534E37848032818CEB1962A7AD21DFC
-F4083B75C000F0A5D0FD565F1737AEFAEA0083F3066B540E93EA4C32BDC0D5C9
-4ACE4E5131877B46D2BAA122680620903552D738E225E3D89D41A391D7F492DE
-617FEBB74C31F3193275F2E456E705C0126654C36C9243135BED4ADBE26B01C9
-7366ACD0DF11A3C4DF0771007B319462E4396B8F644D67A5DAD7F747B9FBE502
-02D24645EF82BCFAB980F80933ED035D6E31549503126EC31B8D205EE4EBBF82
-56CC51748F061A4322593ADBFCDA9A704BE5FBEB0E733D025B4BD81056ED0A03
-4EA60DC8B3853A5AA4B3708F0A9786AABE370627C32A82E588C76F8DC6D99CF5
-ADBE29DA22EE31311031FD37408FBB7C160C2F9895DD2F2E40D498D25BB3FD71
-A28B9524619B60E7696833F73B5A20078A6330A62456C15EA5EF488094536156
-4ED0B6A26E6EADAAFE761BB8494E33B4D87820961BB5E38BC45055C5921BFBBA
-665611136B7400F3271A865138B1BDD4E6FC6871A4E9AA7E447DA991C4A894B6
-B3D2A552639CCC2EAD55A6367B500F7793F9DA332D5AA3B6A7DDC903B1E5C223
-A5843D031413ABDA79FC810E408C352A0FAD6401F612F78FE6601A45497F67A0
-E4047A1953BD656FBF31FF37789EDB624977D7D7EBD79DFB50EEC4EA3F89CBA1
-B88E2BB110C1BF48EFC58539F2E1B36A5B9CE6891B0DA32BF6CEE62DA5B9DAA9
-B9D6AE4D088A536F7C4AD89D079C9E4866073EEFC46C46C77255420F786D6AE3
-A8F397CA9C3DEE47594C109B794AC7E43001E6CFC374C415E62095C7FB05151D
-21675170547234C3B3EE974FE929C1FB4BB2405C28B844C82004F533F4BC6FFE
-F62BB9F778F81A3B28C7D26527ED751763B8FCD7EC02F565533433E11C1869A1
-E427023B1041B70252EF1C68758BC8EDC2046266EE0518264C8CA97D6996924C
-0EDB3446A9A7CB910CD8A2AEB08B1E35F71F9CE07773F3D2FBACB7D9A4FADEE5
-3B51F1468EFE1E9C7B51DE91BCB86733D77B9D11828F6ADD68F72B405C41CACC
-98076A626DB8F7AF19B919834DCE03391B7274D1B1D9838791D8276DF09401F5
-B130C9E744BCDB98D02A68BD1D860A54D8E6564144688C0B43BF0D56917A2AB2
-989EFA8F599520F2B19EF6D8D92138EEB8854546DB669CF14CD5ADC9C8F01DA8
-20F8C5D21D0617FCDC8B1A7D7BF6D880AA2B410A98CCC8F96AB191EE1F64C9E1
-C9AF753B04757489881B2D16459B7EF2F612E658C62C32CE17767209C5FE65DD
-38D736E96F29CF8F8B6AB28FE3D6F6F48FC05FDA95BE564B762B456DC4B86575
-014BA2B041B05FFCE349DA27064514CFCE004DB9E05F6C1E516B00A948EAD74C
-D2F1CEC1E150F5533B662CFCD8AD232C2666401BFB7679DC7530204AAF2FD7CB
-8114E3A2530EAB6F7C75EC5982B8816C7AEE1D69E567C0934EAAEA4B09604564
-B2F5416576945A152EFD7B85B0D1F53D4431524AEF0CCA43EE250C6FB1A6AFE8
-F92C3B67EF9DBD5F8739B064DD4826CDCDA3673FC41C521ABD1DE23EB0700C50
-3D202646191A6B031483AAA52BB73D98F17B361B8DF51B984EAE2FFE0B1F4D5F
-DBCA6362C76813086B3296D1AC387BDFAC50164525AD253A46F52792316FB237
-45EE6E4B3B4C56C2420AD3DE65421E5A90D4DA797599905558B336C01856BF9A
-F77354104FD93CB2E90B0E5D615A2E2CA4F12C3501D0863396290DD285DAB35E
-79A8C8DC6E340A0F32CCBA90FAE28FD3FC95710B0D0C5757D97102EA269A0A10
-652E8B9F9517ACDF09218926563F25B6151D1AA8D79732A403ED88ABFB0E7889
-543FE0D96A0E1245DB8337F8EA21EF2D948C0EE666B4EA53836B33359085AE96
-1709376A742AD8B181DB35FD583EA24A5B43B1294D9A144065767659C9DA490C
-29FF12165AE21AB10B49A5FF797E3F079A645648C687ED6F44EFFE79464D5696
-875EEBA4AFB09F3455EC2E0122A7E91DBF828906BC05E6DA2ED9D9BCEE5412C7
-3B6868267C29BE95D732BF9FF6CAF6084159425D3CC6AEDF7E552BAEE821A9CB
-1F806C46A138A2C5F6765F015C4C27F6521BAD1A582326333BC11D14F7F5C83D
-464109FC2BBA092FD6DB0FFE8C1408856DDA1D6F0A04F831CBBB9BA91D700396
-1F3503C4898EA49E922A556A085B9D50D1493176C9C740FCDDB1A313321B86E1
-E5C5A295BAE5C271D536FBF8B31C95B6F648FAC4DEDA02318904CA443DC63A16
-BFA0CDCA75245A4AE420CD20DD780F2AEA6388F84A8FB42BFF09F9996DCC5844
-FBD0850B5E46824C6C5452E34A39E0A0BFD082E2478E0A0B2AC9253B4326B21A
-DF20260F9E9D36004984C074B1419385A1C52B3606B9BFEC246E26EAF79C9964
-C34DA47CFF84D27DD210251C784578B1BEE835AA614695107A4CB67298C47886
-9FE67FEFBEAD028894151095F8D728CBE7AA066B03518E2EF6A0180D050F04FB
-12E9E7F3859A223303139EFA0CC71138FB807BD816B8D83AD3AF3B3F42B73F61
-F95A647C354C384BA91BDB1F80B1D756FA5C13BC4AF763EECCA28D2627C81EBE
-A34C6BDD97B0F3514F9B1A0E3A30D2B07CABB15EB3EE9E3F530019F5C749D314
-5CA78408F38325F93B97F5856445395F7C3D8B98AB1F11358F2CF97DD723ECB4
-7D9BE2DFC6C0E44AB939F235A1CBC300015BB9DDDF9A0AC9B7EB1EADE2E947DB
-BEEA69328ADA6C95EECB9FE886ADF89287461853571EBB307395E2058B2478F4
-703779C0516D8F56B021437EA62B26E57E6A023AEFBC3C263A0DE6F365BD527C
-531072303C7E6230266C34FD2C0041839B11D2ECB7274E7C30CC584C8C591F5F
-C8950B9A2CC207711B3045796B08C8A43D7E580E8089D0B63E4EFD0F188F26A5
-8EBF298E304C8C104E150950AAC8D6E2EC9F7926921FAD5ECEBC0FBA4E0862DE
-4E1E1754BA60C7C98DEFCEB707F12CC44947007D3D645F586A132A3A7228B5AA
-79081C76C88638543806730012023A16535D0FF1E28E1DED9989E3BED625BB7C
-E4C52162FD31C0540D5D73AA9EC196D29D39192BA969E221FF021DC69F379B3D
-06357B828D205E2C4D37DE3B88FECF77B3D533CB93AC8FFC16E8E5822433D678
-931FB87D23452D49ACB5680A3E7C3543D728413168441D4BFAAB9B7833A46023
-D971EAC42B2339992915C854A53C62B68F867122956DE5272FBE60C742B6E5E7
-C8821F723450B4579DAB198FAE97E500ACC86D78FD7248876ABF21B761B9E2A1
-7380FED4EFD79B47D3E1A31A7FE648301DD9F7F4F58784DF0B54AFF457AB34C2
-A493CCF0F735C1C9F3203E59348D53D65FBDB6E24B552DB3CF8509DF3930F641
-E6FCDB4A9F970C1FA4CF1A0F4717338835895255A1E3737A588A5EFFB8FCE73D
-7EB9C0908DFFA40F8723A9319A39548E8CA5533794F50F3B6AD6BA01D48A9929
-65261FE523320846602F4FBF5B4375D70D8BDB9A559867CAD2D047A8680B83DB
-0DD38FDFBACF3678E77CDAE128A19812625CC1CFA9BACE39E6CAFBE28098C380
-17225012670F963056EBBB2748634B343C0677B09C0ED1D4B33DEA7F07B03E87
-99E229A8364F326D8F80ED4A9095181FCBDE9BC4FA0104B28F9F8CE994F1B6F4
-1316B3B768C81CF7C38BD55AC7820BE48F949730167DE7AB0B62365A9F5A4E0B
-2ECFD6F04D3652B9C1BDA8176AF1146B91789BC2BE3664D906134D7723EA4EA5
-6DEBE02A75EE93E24583B1217A61521946F7BB69C2371151D2D44E3888C50FC9
-E49FA7705BD8800AE067630191AEBB2E78C4E3CFD62DE90683910856B7FA74C9
-312EFBC58534DA5656239BBA9E102D33D2E76DD8D170350C83663EFA6D07C076
-451AC8F5F034F69855DF60EC8A88BE7913502E562FB9B64FEDA4447AE1BF6F04
-1F366A5FD382142BA4CBBC451B5470EF3D51B57EAF791499A140BB10FA70A06A
-E0B18701CCFCCFA2DCBF92BB59376D462F9D59FE114D3538880F32B7F4140E13
-F386343F0C4074277153D61460AC6A392A0EE67F11C411D68E50C9CD2BC171E2
-E4E73A231FA6311B3D0062FA73B5F5563C0357EE52FA4B5CAA9B5EFB20617661
-9EEC6C742BEF43DB2CC2626A76D03FB70C959A24F269E1FE81AEBE54D4BFCB6F
-A56B6B8BDFD3E69788A32BA3072F373DD1AA6787704CB0F7EC710FEB08A82825
-50859DD1DDE613BED2F9F0891F5533816ED8137CBB3D7EE93D723EBBB3EB841D
-A4EB010D20B870CC5C2C95E722E77C639B189CD44285870666494C2C00639F56
-D91A6C2A45F4C45D7D904F1799EBC44720410E1A0E32F100FED8D696A7031FEF
-CF56C7774E4E568050487F1F78A86C968F82579D9EBEF42C500B23BA00A7099E
-275C9BAD491D22755B542FEAC98C1B1C42EABA3A39C1C312767820D264438F67
-1A65E314A633CF3E2FAD7F83DEADCF62117446FF4A4B099A183342916F8BF57F
-A3D0BF61D2DC3726FCDD3A4F7C723DAAAA40CA0D68460DC2D990B12C405FF111
-4F5B07278ABC51A7DFE18ED1596AAE6208F189D8CBBB50AB6577E2A635205E16
-F78C97714783DB67D467EDD804B062FA8463BCA130D5A0727BDA392C22FD94A2
-25C674C3B4435BF4436432249C48347B7382CAFFCEF88BEDAA614435269DF406
-B9D5011315265A9525B4919218D9B932F3043B3B2B4287F04F12DE69080CBB54
-A11A3BF8D59EDA74DD90EAC521976C7882CD8571E764B4FC566E3E08B1E7A1C0
-7F16BD8A1C1E4677415E9547DED46BC202BC1FEC8741D71E285B87F8C982EFD5
-C201155719E4AC66CBDC95012913031421A36455AEEAD59F24134B2A78C93812
-12B1826E250AB1987B31C6A20129A2EB557BC85FFCD1DD36C678B5F39388E7C4
-1D4B7BD640ED5EFEFE063C9D91308850548BEC011A487B9DDD5E4F032CE0F094
-D548572784220981B268A932922A79B9B8C16FBE12E6D7EA801EDAE92079407E
-00312D7BACBEB5C45B62BE9532A4C81D39658A187E1EA1F4C16624A6AD1A56CE
-5077F62EDEF7E3A07084B37731A237C746E6D89167EE41C278D2865055685107
-CF73CE1A574A47AB40792DD4A970204B8498C154CA1CBC5A23F270D44742EB64
-5A7A385B37BE67CC817019EA16BA310A19CC3AA2A5DCA5C010B76D985D4524A6
-3643492A26A249FF85944150DAA4343B30D77D7639F4076350D43D7E33C677CC
-8DDC7FC142D1D376E98C8E2AA0310287D51168F29612C4C421293E23C5F120E5
-268BC1932C4F9DD29CBBCC08734EFE71678BCB5CDE4B5BCD8635F3009B631D3B
-C2F00A38CF023D09AF6A832A32C7E78F1FB9232FB9AA5FAC477BEB54561F25A4
-BE1C23C41A6B1A8F49D4057050D846A50960E64246361DF2B1F829CAE8A81556
-5DF1055F9DA935D01D8071914AC2A89223C7F14AD4C36512B62BDE4FB699BDD3
-FBDC8628B9430467A2B79C4225F060419087B0CF614464F93AF3165A5366250F
-72778A1C0BBEAEA0DB639FD61F5680B6A2903EA8FD9F056F77A68D10B2C7B4B7
-C772FBE5D7E3DA169257F2B6F9E3A1F2ADACBC3A10E1A47E26A58B07101B541C
-E72012DEA2E1603BBC157C589791FD069E7EAD5EC41061B8034D22FF0EA7EA79
-87139328F4D74C18721E4773F841DF72B3BD044A7FF1EAC934BFDAB2ACCD0395
-B8635FF543B94CA4151C672719E68D1540047B466EDDA89D3FB44E2D75602F6A
-639D9F99EF31C5B04299DB9F3B51A574DDB9346BFF5C978F81246026991D38CA
-899CAC9A9E91BE864BAA95C082E6A89C7514FB6518341AAD562C3902A8EA5C9F
-413CB578D6712BF142F643FCADEF165E7ADCA15AFEA3A330CEAAECD393DCC91A
-75989E3B6D937101C344F859D53534B5CE55BBDE02C4DA5FD1B8350AA76A887A
-875ACAF58CFB7B1E755FD2011FEAF1DFE43928AC8E01C09B272503DFBD21F115
-2577A6C990FCFC9A42B020EFDA2E199613B0552B7765928F2EB3C4D7ED2B4D6E
-978CB8E88E1DDF4E61A50F34CCACA8DCBCDBB2CB1C747F70071ECFA1F31C9656
-22D28A21D48AA970CA6DB819810006C3037D4637E26B9760F7BB016EB4FE8125
-0B9D841ECE3D5A3704D93F448663998DE3FC8EBFB76CDCB79454DEF45256CD3A
-2D180C96F89882EAB95A97E5EE721959642B176298959B934141D00B6C7CF1A3
-B1CB3A19E4BE96C990CF77832C665E6F0828867F3859879D83FF45FC5C4489C2
-00A8FDF187E6723B23F760AFDFBA6A4830611C4755DCCCC43F8DECD983275642
-1BF5B6230D3123380AAD3D3A8A9A60F67DDE88254A13CF536A93B326329A4EB7
-BD5CBCFA582DAFF013E2A4F2A909A6DF1465F8C1DD7649C2222E0DE04BA3FF19
-31A0D71EE85F748F964D6D57EE57DD800F105282409FF2E27A08B059AA17A4B4
-E2D848EBF8C8FC23641E2B517710012ED40350615AEBC5C115D4777117440A73
-C4BE0F4F6D73EF7B35140AD9BBFAFB43FCC0764D82E3AA81F25794DB6ECD7A3A
-6B72ADBB483D979591D85D3002AF1B4956F3A7E083BE9D6ACFDF409852500ECD
-886D3C4E51169ECECE6297959B78B813586F2075701F256137C9F92399F3E5B1
-82FF6E10B5C4CE5078FA4A71841D9C3C01AD81A4F9D80969AD249DDF63FD9505
-6B152B2AF6D4CFFAE20C111756204BD7BBDDA81A9E3BF3024D31C90D1CBB4B7B
-BF83B8C033868615017CFDF7B2FB2DA13A7D65834652CF604DBF9412366D4823
-36486DEB84980FD65C2875281D0AFDFA70EE5011118D1CEFC78FC4D4AE20AD45
-AE7E74346B8897BD97630888CDAB0461B781997541F1C74E240623B1A7FB26FB
-C4FE22401B8A4A6239B10D9E897191D185270FC4F2DC7ED13E73F9B0A1F3F0D4
-31C739380EDC495827B4E81D7DCCF8BE6D384ABAEB6447B65FF319284F0DAA6F
-5ED58695628330CE770F62CA16248B1E0FB657214115DC760182CF062D97CA40
-BC683C923DF12BF39E725FAC6411359FD71DFB26E8FBDBECA81E03CDAA5FEC26
-07A5A8F6C925582E6C516FEA20488E24CD42A5DFD29DA96E6C9A12EC451D18DD
-9464DFE4FD5AB577FC667905D9BF08C7083850C3B3EC67DB8CAA3695DF32C256
-D54ED4483A53AD3AD376590BD1BEC8C5AD3E253B3EC721F4A71CAA6C906742D0
-AB1A043660F7679433F7354CF1A36E59B40ADFF929F87B03B951D1393F50387A
-B3E7185DD68CEE7C232EF44B747356D3C81D0A018CA61E48EFCDA4EFC203AEA2
-838B2885F7B626512C631538384A58C478AFCD28F4FEA7FE149D850182A270B8
-D899D8CF3730998BD517CA64AB0A9E40956D4755D455F5A56BE4DE02EBC29B49
-7B800445211A9150A9D09F8C285D67876F5C5925E12BF01A464049BC6BE89F5D
-807E9BE5B8EEC3E1EAC7CB602C673D0E2C64F79BAC2E963EFBEEDC5E1C6710DA
-290407E7C4B81E3B8BA1D40245A1081FD81E2DEFD90944A67EADAF922C269175
-99CFC6962F9409D9BCF1CB785CFC2B59B8E059CD2A184FAEF63A7E4708F82785
-E75B8EADD1C81D68908B09B9FE30E8EDA5AC37E2257D5C689B1AD942FFC30273
-2327B6A7A6F92B6BA207979CE10AEFA56075103807D6BDBE7397A64E9569C36C
-CC6AD742DC9D5E935A8E28101A68DA4AB6224BA4544DB47247A30F98B50D7211
-229703CBF5410F964A91FDA6DD4B0A603361C3EE0B65911A79DD7935BDE86032
-44A74B051ED27B31FBE4B501E20076AD67B32A6908D7614CA95B06DD64B01C93
-14D813CE0EDD0F2FDBCFB731995201F07483A8C5ED79C56CFFA3BA2EB734689B
-D0BA4DFE2F46E9325A9E7B6EE2FCA7825AF486E0A4606D4A1E6B8C8439AE7AE2
-347BD7656CC4F48DF8EE3074C98C3777E037E8E26C6369008778C331A0601077
-14EB598297507B9F2ED2BDC03C3E29EECADF0F5FFA1225DC5F27CD8EB7D7199E
-F496EAC3998FC12515E0E75A7952C6BB951C8E782145F445E917B19413C1F702
-AD9E0180E4941769351F4DED721C0089ADD66BAF9417F5CBD78BB53F12F14CD4
-71BC0BEDD7FDE799A9306D0885FCD40BF15DE837EAB5A40EBB52CB6B4ED299DB
-B12A2D1818F135706AE013BE70F3A60057B5A82D661ABAF018DFBDFE65AA8E47
-AC6C8A798D2F3C772C0BCDEF0A9CFB8BC638AA64F95D41715353D25B2143B4D3
-7BF3852091153F5732DEFAB4D4BE6199E13D1D9258142FAA82F3EA57CDE218C1
-41CBC59F5951625C556F6D38557082F300E341B0EF1AF38FBEC6BBF6EBD87FF5
-921FF53B6C78217355B9C1C17216DD5541FCD35123EA68D57904FB1BD7B9A7E7
-3BDC01113118854E5FD8E88712E1C916ADCB543B264D9573D2E96376A03250D5
-700A0CBDC1143FB85B69CD3455E5CAFD7AAF3D2A2154E2E19E9CC8C233AE6E94
-53A24290D61A03F7CD038D15317FDE765000BCE92199B728DF17AE8D540705FC
-237F527B4EE8EFA5A870BBC588090A087B108FB0ACFB705103D027DD942D8F7E
-CA2293C9C50DC0CDC960139CC4D6384A6BBAAED1D50EC10A261F22EBAFEB2876
-76BFE0D228A14D6DB2524801192D1F0EF49BFAE7667188B4827008D05406539A
-1AFE0979DE52C462D998F769FBF62A45552C6CF1B30059B26F3336DF19093DC8
-2C75A5A9022EA3A6A35C35965A96C673FBFEFEBC0EF188EA9B3B31036CA56634
-F7F89E88C7611B6007BCEE35E423B73A63028078FFA84E73490DF2F564423647
-8ED87859266AE96C56883B6AFA0A46AF1BE64F7A07F9B9A8A69BB47B83E904A3
-A6DB8B582311AA9C2A787CBAC2EB5823F6DA66D4CCF5B5016D179BB50D691517
-130D77A7C3205F27D4A15DDB0D2062C486B59C70D0969CA5F00687A0886CADBB
-CC06B136064F97A43BEC08811EA53CA13F190FC6F8F07FC498BFE128EBE6881F
-1A4913BD395DD85B683FC2A4290C2EA20125ECA194846444811B0F530D16B29A
-6CC24D9A7F3BD5888CEF45FB9BA8598B3F5032ECF39E2A1A3CBE122F100C72C5
-071FC086C9739482C8A19195D2CA3D041EC36C93FEFA520E94E01037567F0A57
-4CF1102DCBF9670740C273E2CCDA3553E267EF8ECBF31F1FAC3B1ED824DA935E
-9E52E9586ABBE45F3B5A6409C5E779B6A0768AD6323E76606F20F40F401AE6CD
-44F2F88CE5DE95B9CA1711A877EE203769B566E263AFD6360F1312A0AB9CB6AF
-2546F112C20A703A01AB255739647E46451EFF522204A0CE985A609083F52A1A
-9ABD0B01910B4FA3E4FE3A060791E1986BEF81F9150C2AEB6391AE1F09F1D94D
-9BEA9ECB59E7E9B116128DE2205D27D2EDDF96FB50F3E1CB742CED4FDAC545E4
-9F5B5BE0A88FE7B227332D171E14DDF89EC0BCECA370EFA73C40EBB1A20FAE8C
-C1B7EAE158B5BE22AA16F12952628B2FE8F086ACBC5F778A18E7B67963975550
-735D4CB5ACA7279379D2381BC97D1F2613F79C32742750006973C036BE035C5A
-BA17EA7BDB9A8F098B733DBC954574927A16961C2B7DF2D0ECBCF742FFD781DA
-3E0A3A1278178426F4592799264BAFDF16CB96EA4D1ABA4D806C9D264095EF6D
-1067FDF90690EFCF0146A1E143798F104534FF17AD762F0355DC69F821234018
-A042CDF7D7379DC718E0865FAA8B0C757D0A19498CEA30513FA12003629455AF
-B115BC2DBAC68D4937314FE10CBBB96AF8B3F4CB26CFDBA604A7865584AC0763
-BDA317AFC9906AD0B8DCC5A6A88A0B1ED4C6CBDF5F2BB5A5037C1999CCCF507D
-AD3F6E4ACDEA803B4104BD05889027E00B027715C1FFD9DE303C2758CC38AA7E
-9CC9AEF43DC69027ACE2AC9CB078FE8290FA53D3F6A2AB73EA241E7A53806998
-8ECC1327E41B13C1F5F79A1C963EB00EBAAC27D716206FE780323CA86495C3CD
-7EDE7B2A5753E0FD0E0B62960AA8CFEB2823BE0371EBAB60C6FE9F279133E88B
-2F2DC40BB446D7C3E955243C55956B7AA576879BE1EC0F2230796408D654A069
-A93FC77990E9C0D437535FCEB32D61DAD9EFAC776FF20A7110E1F3B3C4D89AC9
-759C25536A1604BBC08D52CD8B893A50C0490691960F833E421739B7BF232BE8
-2C53D766D04FF056E6AAFACA416D25696ED97D10175CD63BAAE9510FD1CCD8BD
-06A32D6CA296C24AF84692D043E5515C5C261D8C49306AABF81A6D6977EBE74C
-51A79CA47EC3017088019301ACAAB074AC3870BBCF2F7A24760CBD344753DB5D
-83C3CAB511E2BE890C2EF39DE85FD5778B70C0CCFB18A7717C794488B1D8D1BD
-1B23DA8388227ADCF12A251D7202928644FB9F97A97A48CEC170393E8B261E26
-99635A086A8BDE8DFFF1AB3E25F1A6AC7DFB45723AEC5A0DED5769F9AC15A4FF
-A951E7D42EB97247257479E3DEE9E695C3D544785B5C1E6BD0B5F4D1619BA7A1
-623A55DAFC29AA4502274386B438F23EF0A56561EC3DFA3F85A1011338B2E5AE
-40F075D94A3EF78CE49D514A237A459E4BEAE702222377581FE3A5A6EA51E701
-CDF405444E9CAAB052DEE3E7834DAC8988EC4558E03CD0D9935DAE536CD28ABD
-8BF2392B102D2DA4FC0D219DCC8AFCBEFFD823B324C539E5E8B76E006D596C46
-BD79ED7547ED1DA6E352FE2221170EA158E6717C745BF178252CFE4C75801C86
-95074789408C86526E3E872D606DCB4E37B035482471101D8F75CF415BB55E2B
-AD747464B5FDF829AAEE09A6823BAE96F66B1452FD4C25A88934F12F448177AD
-135818B74EFD6F812A11CD02561938195F7126DDB92455434EB548A5E1B28511
-DC14E3A398F9D8C08F23B2F89370594F0E6544DA432B9FB693F1265AD432CE20
-8123E5AAE03AC7D2C9D6C129B0C3B39CD79F035754854C2ED206791498E26C52
-79BC4C326BA7053582745DA47D6F8231CEADA2547CBDB6BCC2A0858758D65522
-8180BFA16671793B335DC33670B4C7C99BAB013CEB0913B1AA5D0288ED9D527D
-FBF2D7F780292D4EEA768D04580A1BF6D292FC886D00009EA6CEDF31D2D22E89
-4382CA2F0FB37686D30898A9EB923F0A181AC58A4A519DA05A5F8C7151F38709
-0831D20D980FCB1B760C636CA2AF619E226DBC0A68741B659D52635E0D1DCE57
-165B0E2ECE8F37B58AFCB15CEF1E23E0E71CEB8AFB3B5E1A59C886486FAAA210
-71B222001AEE2CE52CA68FC3E8ECD1F4692015206665088B3E52E6C33E31590F
-17A4E0FCD13A761752BF155A22AA0E1ED55B70BC00793756AAD810A10CA9C4AC
-A3804A9C4D27F10EF567F9592731C95E7AAB6F6CFF2E9413036CC9400E00442E
-05EDD9B298BFAD4834737E37910B74063BB1E3D5B0CB4CC774FAFECCAD9ACBEF
-EAC03D8EF0141885A587B64C83660E0AC8D9B2BE4BB8FDDE306A625DAAC314B7
-B9C359AA51715B2B0DFA7D7F671B1C5EC2B1BB5624D72B7AC0483F7F2837FF52
-2899193863B63E78A39D926940FC71F00FAEFF9751C0CF42A834F186D3549393
-7A052E9CE214054A6889AC95AC408032D305B1CD6C89083763722860F875F4FF
-640556DB2E770A449647988FDBA00083BEE2303682B28C8C7BC163777EB51A97
-A20A3F99A01D5B6F2C183048B5DD93A8D445C5DFD41C909B49D23BE41A60F01C
-1D6E704C8C5F9D783C224B70E56009569C54D5F64423D3BFF8DAC962FC050128
-965B9870AC96D51CA8420FA8420FD88F6C7B963822BB292F2B00297C40507A70
-2A32271F34B164F772763415FADDBE6ACF6EF3E791E69EB0557AE5693DB0A20B
-1DD6536F9D74BCF1C0265A4A88C31106E169732563B2EC5AAB3C0768AE2DBFA6
-4B2C5F7DC339B4BDBE3704DC48633BDBEA8AB3195E9C4677088C47F074D28ED9
-4ED5F03A635888050524C82BAF1087764A217B1E9585C6C38E41A7A26B355130
-9CD809919F9976192C46D2581F984E71B6BE7E626202B45B414A97BB4963E609
-DAA06B99E772BA4C6FA7DCFBB5E2AE2E8E02358DDDA48EDD8B46AD558C1E98FA
-D23EFAA66E98B1C49C08BE57FAF9DF8F246DCF7FF9DF21C48DADCE837A503D55
-BA201BDEEB84553DCE5A0C3E2EF0BED804315BB664EC9B8459E09A203AB28903
-9850DB3898EF211CB25C20ADD50EF5439DD13CBFD14000B15424054E0C2147CD
-02098784127BB9411E4C96D30C16706DBA484D3C2AEE11D693ABD7079EAD3AB1
-61EED1BDB6CB6FF66B9FF26D4BD79AFBA78FBC53E7F6AA1E103155B980EEAB9C
-ABFAF83A91206CC20932DC36910AD39DEB52E5C0539DC99C056A287AE661B13B
-1A2DDE0AEEE340A727006033BC6636C743D310130EDF6383747CFEAF9BEF1D60
-8E851A71F212CB203175FC6A58EFF38A833D588A1AE6457E269045C40E432127
-ACA54E03232ADBE5FF45C23E025665F43DF522F20E776163C6B7D069B0EA8D46
-FBE3A12ABCD9F5C249299B57ADEB9B9AB1444F42837B39B1BC6C4026F788CD51
-93E52D681F719ED741C7C9FFE946F665494F17C17501988A509EC377AEB8C87F
-8BB6348134BF9806C11669EC6A43DC9B8FD334416DB537D1AC9311E69417CFBC
-1565476D77E4C3A1C96FDF49E1F6D62302B571A6FC3037DB9C2ADA5CFF15A110
-83FEFFFC074621E9ABB9C62CC3969B6C0864C41B757F23E189788F0A0BE16026
-D1187D48AA190E42BA6ADF00B80E44AB5512DDD195C376CBE0825343DCA082CC
-411E26E3A71EFB7BCFA1B43BCE6F86720E7A0D2A60DA0ECBC4C3A0BF5FE07553
-16EF96247BD1BEDDF29ADEFFFB4B355ACE88CC5D4A37E7D7817B98B2B1E4A524
-C54434CCC39C7A5869BDE8C5D9E3098CA1B65AC57C9D81D1EAF711423A9FB92E
-C20F18C80E22E7731C56F60703C6604EDDEF15F234A46F8659C724595980259D
-35AA0847B7E96F0D3B3F4D9D1A82E8742CDD1FA2058770AAC4DDA727C506C700
-9A9F93144600628C46B6E5904B7CA98D21F4E08E6804D920AAF68293C4F0666B
-1742FA95AA85FBA95037D9FF7E65F6B503D22180437AAEBF65FA8901C1903EC3
-896B213EA46EF7B5541B74F72EFD07C752BFFD26B8746019D131ED8B94E23794
-A5973768AA9FB961394105930FDE07BF0D08218CB985079BA634D8029FE54CE3
-F758E2C8841D7E2D1D8DED3D2D69E437597B28CA971E8161949BF5B71BC1EC15
-910426E7C2855DC776AE87C7482DCDFB994608C0189B7E24E2F16269068812BB
-6F1E98EE8DF82468763810DAD7CE08EB0896F7D5342BDE3609522A4D6670016E
-A837BAFE7CA0E712D9C68580B5A30E544C25A956EBA242C73DCC40209CC0E557
-D16ECE17D18FEAD279B4143B5F3C69F7F5087D5CCCC6387CE3745FE9FA4FBF24
-A239EE87218BD2933BF6FDCEE282EEB8C709303B35D6A8D9279917E28FFE2CB7
-7F7843C0D4BC1A5A85818F3417B85B416A3EB78C00CB196CA920155690D58079
-33290BE8EF54AC6653D30FAA959DAE3D153426163119BBE5F4D6636AF877D304
-4E74FE984B62E07CD1BEEBF56A26B5B2CFD7E622EC2211DB6368086807F8CEF2
-259FE58C1AD88A982DA8CC8E3656769F2BEDC9B1A1A26985BC3F4AF421DCA42B
-2F70334F378D6ED76EDDB59B3B754EBCFB8B35FA47E9DF5CB209BE0518F9E6C7
-22A2A537A3209892448DF436370F0E5DC5E50EC7691C720B26B5027C2FD0DCF6
-BC303E8D72FAC731E2EDC1E2A70C0E51CA0103E7F97727583E65ED760FD724F9
-D318F10A6F16A98574ED667E810224241CE1E674C20EB3DAF738ED6BBD6360F5
-2BE448328D5279BC25C35F2509B2B77BEAADEB4C8F915C73888C953D40417510
-684D630CC51822F84466E3BD89BBE49D4F01D3A8AB9FA1A4A0095A76E95D6D1C
-222FA4123029FC4CF44F1E0BBDC820272D681B7540CB096976F01DB1F8F42B59
-1954DFEF62F91CF5D72849B987118BA52928C213EAC75A50B61A7C1BE41B1AB0
-0EC9DE839CB0657A17D9B40BFB7D1A9E101C359E27168A641AC1821760EDE5B3
-53BC6D9643E68F49F87B75AFF41236A9F59F9929BC6BFBD4344A325F5C6929F4
-B1B977F84ECFAD8F885A3D4CA3C8DA38536BB5B76ACBBDA57F882F372EC4220E
-1DE5276AB135BC50ACFE5080E281D2243CBCAB5465F18682B09942C56456A432
-7E6C3BFB691FAD4BD032FA4CEF24C1B06CB560AD996AD5C9DD766FD65D3A9C10
-534B84AF27525C7BB98302D952A4469A17F850AA95AC91962AED0C8FD8632BBF
-73D29C76285F9733EC29D5B6C7455ABC96BE7F4A3056364A329158F29A1B69DF
-AF0BEF221497937A09FAB0C4870C8EFA15303E8DF5B1451805AA50172FB1A797
-02EA9CAE6D6EF65020201A5A0DF800F80C02FF591D1BC9A4E504BA01F48CDE72
-EC8D0FF70B703E749B60A1589B1D80F9E71E8CDA61E7580C12F7F1410353FC3D
-0B1604AC55094DD12433E043D958B66E72B718697A209BEAC588407D4F89430C
-DF029CC69D52297D801E441FAD734ED519FB78BBF223A60624740CD10AAB1C38
-56534B7525561DD7776393CF031A5B71344809979D150E08BBEBADC84A7E0036
-870490909D120C9614974B2A06D30ACAB28BF9F812889932DEDD470BF2D1874A
-106489BE6CE558BCEAB2B0685EE12F7F8099854ACACC27738BEDC39F1034B1DD
-08B9D6A0EFE43CE60FB97E9B4C0A2DC5B9B61944ECCBEEA72915C03FD7E467CB
-FCB568DD452C729492D0ADB06452F78E8F619A6D4BE8FAC82B3F3BF301830D6D
-2773D4E95DA7FD8C38D69AC9BDE1A779AB5B170120F4B8BCAE745FF4F56266B6
-ED9D14509CBD0CC4DF264613B1B021E8029CC0D22F06074E174B635C4C0DD15B
-1C2BB2B53CDE374E4E6520D38D8664E9EF753B1E4D7244E071912547E0275504
-C0266420D5F18027CABF3061B054AE9127C7D13007B03C0A4FF7D71ACB26D732
-FD54BD1227C94BB259D8AC8B246F666D3452BC92CF4264664A28C6A744C13AA5
-11BC7801E7956F4E5113500AA535BD7B5225EB693E8A0A8FA7038F789035EAA7
-B5E227C1CB68C3A4AFBB516DABB82592D5FEB58529BED646E3A0E8C0BAFD87EB
-CEF8B46FB294B2EBF7720628A3711AF55CDBE85C92A7B0AB3F1820D6568B0FDD
-DDFC91A440CADBC88ED53DA9E7C408BFBF59CC87853203E3FF707C55BB314805
-C0E9695DAE783943C37CCC94C7387974A5C88F1B9FE40CCDC5535A48DA86CBF6
-A6A155F451AA39CDF4C010C66ED11E3F4AC9FF5F78721512E8757B77A301400E
-6FDEF7FF640B85EB573BE8D3CF834E45B944B22A01DF1F657DBB58A071584A08
-D6943D1E1A712EB23E749BD181C8FDE4C27CA25B9EEFC1BEDE9E99062D83C20B
-8CEF0E7E7A7D40983B8C09871B41CA0B3D414E6B503DFEEBEAFB224D1F129914
-67889FBE3BA7C43423D2851045E70369EF98E0FAA1DAD562894C6C93D76B3A20
-B73E4C54E735613973E6E19700ACFF7ECBBDC340EAD2AF295A2F070AC4433E32
-5678B6F710C5545BF2721D3FF8A895F05F7F5D8BA3FA244CCF3EE68544098667
-EF8DCCFA2BE9DE5342D1FEBB4F074A1DAC4CA2DBC82EF2B85E7C1C3E750AFCCA
-1FC22A49350D891C052F46D2C04C50BA7260B0B975C0996820BF66F9DD100B26
-1BF9CAA3DAC323CBE5BD11B75020AD3932499ACE1C5350EFEEACD5334252EAF8
-04B2A70F1027AF7D0CADC3AECD739C9CA5653426CE0104D5A1D5D5893EE0B068
-D5F6AC8F6413214052045D650997D30927FC5283F35F6ABCB5BC05D92A241271
-52E1293BD8720727D530A4B368DF0AC5529CD334BADB1F8677D25593AA974489
-2F9F548874FECC35FC83814651A33BF12C79C53A35108C45AD8B0C1B1EE0333A
-61F52F2FD2367D066F3CCB15595B21031EE2C1AA1A76E103978447A34E977FD9
-664B7470201E0B68B4206CF910FB57A357DC43923B0D7E29E7B4B2245097D593
-DCCD25A270E762567ED47BF94B6301D7A996B13CB258872DF5302FDF7F0E7BEE
-0BFAB7FB65F0DB0503FBD7C66371305DCF168797BE81DECAC68FF3942C9ED677
-427BC47B7AB628A989B8BE079A81B2CA513D69944B03A21C59E99D1B38E65AFF
-392A9E10AE8C6094EFCCA5B4D2CAAACF88B6DD46420FE2858794BAB331A31466
-28D371C206865FE867912F5A7249AB90095B075A2184D676A5C7E257A581F693
-FDD8B34A77CA78F06B674E06E3C4596AE9DBE770A51A2FC5D50DE3744F858F63
-2A810996C917F1DAC470CA7B462684908FA48884514D67ED5BDC043CD53021D5
-9C701A1D62D9791506430BB45CF1362B4E8364A43E7E59EF5F44F78CFF4C2ABC
-00CAD79E6C2A9ED58156E27D74959BBBD262EB44271651D95FADCC6993C4F789
-008648C1282411014B9F1EB5EA7F0880A80B3B24860073C2EBFEF40CD1AA93C4
-154CA5BD37CDCCABE50C7EB3E5933124E2B3B5451226CCC20EB0611F509CA7F5
-5B2783812F6F4C1F9119485933D8E441B9CD7B18C88E193114613F1B55BBD2EA
-3083766C3123D53F2A968F4E0F4D48D31C3B9DAE4FBCB8CA79C5B53EFA185F2A
-12E74835F5DE5CBCF32353991DCAFE8A45336264D7C1DC55EC1249FE846B9998
-2E47E6D855E6C56E18CBBC60B84B0AB44A4028CF9AB16F03740EB584E81491AB
-00845F21486A1F903378CBABB122FB199E33C89DAFA54F3AD43EB6A4A3B9759D
-454E8E3C14FADB4DEC10C64810D3427F1EB144E47A429C8350A99391C82BB82F
-29BA08A51D727FF0FC6E7D0823A4ADB2B40D00A96F00FA7CA1D5C8ABB86B3F25
-5CA86D9C55020908DC2C8371F5BA6D999338C7C9E06B28FC1B1B3E5FEF3AF0AF
-FF412A76E841CCE583CAB8B89C0ABFC585D365B7D071E6E35E40002A0F654689
-BD1D5647A800FC5AD97C20F84E9A608F9BB348EE0D3E9A542B4262BF1F424558
-D3E455268D042F048B4760A6C2E6BB9A783C849787F9F02B98C356C1BAD94634
-2485F033A0CA885570C419818C8203CAB7B9FA6290F8A62EF9033713D1257064
-0E305EE5170A4DE71CAD89EE2C0BA62E9E69A9870DE74CF52D0DEAD65DE2A291
-2282FAFEEBC0B936E91595F7C6E0BBD33E79FEB2ECBE04891F1071D631B3C9EC
-6305879468CBCA461AF927A3561AE15A463B24461B9960474005F98892057048
-6419A27D3A51461C9BB9A0E8E621ED1F536937FD0BFCA77A3C33C35E11F3C367
-554833F4252C036D579F32DDCD7F4081B4BA73AF51A2488EFD7877D917B2D4D9
-C239AB6DF1638C9BD14BFC9964A0C65963F6B79D40CA9E44A301F437B8E03B73
-0A52683FAA4CB2620D7426916F89BF72052DCC7E24509A893B715C4515E740F4
-55EC935779A22EEF3207C657A6833F73F04206D147F5E427B0414D8F6F3DDCCD
-BC895E1FDCD3A7E76D4B21669D5C4C5113959CC62F0B7023F58D771229C2A3A4
-00FA0B6760C8B77E356410A854B23C9BE8F4BAB75482495E621F83045452DD46
-B5F299871544E4E922780FCF0BB6DB666B9EDBCA62703ABD4F3CC69E15728DBB
-6C2DF999717533FF7F98ED6934826FC7569A4020DE4B06147865178D420E8CBF
-FACACBDA128C17B635329AD9995E6E2033E6CC702D5CEF1F0DE1F25322BF58FD
-9041EE0D904200FE87E2D5A672FF0B3C63575D5F7E07F01202FCB8C42EDD0296
-6E657B5D703AF68D26FCA74FBC8076ADBA7F5A4BC58C10D91FCBCB628AA9F313
-71CD61BBAE0B6A6C7B774DE4903676BB3D210F220B413F0B95F43121741523F2
-F65DBBC09B04BE87A030C607A545A9D5791FE4FD8F479BB213662ECA9103027C
-01D85141DC897832816392AA1F49056AAE3EFAB417AEA3C79E49E68EE9CBE8B5
-717FB5C3C5E811F51BA685A178DA6DC3DAD589ABB4F8A0A27A5DDCBBB11A5E76
-94B6320110123C630857538E620AF88BD8ED5B5B8A10F1F28A15BE1ADB196F40
-CB04E8A50ED5322AEC3CBF8881D32160209E8FB6F7ECFA70AC58F94CE3810BE5
-8597D5657E39AB15B3E35DDD508F74069DCFBF0CC70A6399C3AF7B04D4975FA9
-31698D10B8E9CEB89DFDEC2989C37FDD417360F39FC6802EEE5E3CFE7DF63361
-758BF4861385D4931323EF38E7348EB98633C83EF9BF627A29219E9F75A1D341
-5C8091A908ACCCFC01395AD91DDB82EB58BD88D5387994A74F35BA04265BC32C
-4DF225782658BDAF63E8EC8B5B4DB6CEA66F83961D5B41C8FB62CEBA3DBEDC69
-B6DAF5BC4B541FDCA54825918B9C84E7122D9718D28BF9E9066C8B122072225A
-1B79B4A73C235DF52511CCC1E0A3420B35A5598230CBF3C6EBF09AEB6265B481
-304D9325DC8AB8F6853D4111D42724C558761991E953F114019169BD632E6639
-037344F1B767B0DAB524847DCAE3C5CAEB864973F3A3FFC06312A7753F571888
-957ED07CAD5EDC9D04497FCB48446F6C44C6083BE9A31821BFAF1046F89985DA
-009025D4AA91058EA366244ED8E64601B374DE230A90463AE4E57D5D995BDC18
-F621E2B31F79439BF5A4984BB6A02833ADFDF4AC0DD58F53BADEF74BB1D4AB88
-90AC403AEB53313D51303384053A941B0AA32C3868582180868D7B6822533E61
-A4C1E26794A2D9F505EA75EA790BA944FCF61B5314DB14FBBB6252495103C7CB
-8E355F9193D5ABC556F3E4D5B6CD2B8FCE08570B3B69075E241E06CD9AB790B5
-948176080294D56000A0B7ED21D906169D052EFC220767178ABE60759E148036
-388530AFD262244BFDCC980D432DF470C4243BE84EAE322C4D8EED4C2242F490
-93639E49E5548FAE9DBAA2826176756D46BE3449E33E8C1F4CEB4720D0667DC4
-EF9D390416E580ECB81029054635C6DB6D8A1B7B964CCE4B15B632416804C805
-0BBB666A4AA5038D4ADBA00ECF22EB59FE9E6E4F801CDAFE3E35C44EB6C098D8
-093AF18BF4FAFBC3CF7562B90029D395D58383E75039003351E35057489BB5A1
-6AEBC03506289C918E6AFEF280E437299C2ACA7E6D5D52AA3EA2509A1758EA51
-637645F7CE54EE87093AE38B8FBCAAAEAA2452AC65FE2C68235840BE62B91742
-96AFCBCF4AA8300FDAACB55FAB27B2B29C488628347E9262464EEBC8D13855F4
-56D9775DB23F069E9CF9C84813F0CFF1391D72DB08B0C9A3FE409D8D08C00562
-DAEC5022E11EEF099724E648BDD73DEFF8E1FFBB3F80042554CB0C03158793D8
-CEBB320F8E0A86CC95E5860355F00DBB146380CD6BA35F93F5B8FBAA54280262
-31CB7998DA8B43473EE8D1895D5D85ADB6E5C8D2B5109E57DE3697F541C7B27D
-12650F96FC01E3D56F457FFDC3BC2668F8E6FFE82B94D81A648046D7CC71C4F7
-E218F5D5D9F899E5A3A33EEF7EE7C8CBDC9F239BD2C12612519ED9D4E89CA4CF
-348C0EA704B46E56FD9EEE336494CF103C93CDADA00AC0CB74DCCBF4737A481A
-F330C6969D9925BB1CAAFF8A2D857245B8E4C82A7915D97F7466501EE7195D8D
-C35D2B5DFAF50C78686CD5F5717ADC8047B7877FB15E84961F372D03C0679375
-88E4A9A5D2492D28D55FB00ED000E2B8DCF24AB3EB4519CDF68E3FF98B54A1E8
-E4DF661329FC27BDFD47BE63E85A469191E476D0406774727EE99EEE6C2A1C0A
-EDCE20F13FD1838EDF3C1E5FD764723276ED5D853E609B0800197BD8E59C1265
-4092D1D76BF60B1FB675B25344D65C0F79C3064CB634970B5ED680EA710FF884
-8078F9E050655644617690A3EA66AF2D9AB40D187B46E22E72001E2A9D3541C3
-5BECA48A812700501568565A8D37A2159A51A89BC59D4ECA20F3328CF48838F2
-B6BB50D0DFF3039160FE2E278D178B673361A3D412BF3ED1554540F1F0A9A1F5
-67C7C4B257B97C6BD1FAC85ABC9E86B175DBA1FD0E9BB7C0DED0D47956AF2389
-64EB6C4CBB3A03A8DA5AEEEA4422F432EEE66860BECFF5BC5752147BBE75D0D4
-BED50695E88D2E9F01FDE0FFB409CCA801EB16F6471181E62EE70AE4AE06B9CE
-91079CB5ED83BD82A88C835CA82612A4431EB7979FCF8A7D1ECED31CBD1A2C3F
-A586804D66B8A86997A05D349FC01A2796F1892A42979F50B0DB1175B42EFC58
-0B1D3CB8DC992ECF5BA9A6DBD1756C20DBEA6948499F0D245F2CD8D121A8F916
-C0D41F5FD5414C12EA4FFC688344F7EEA2DA6BF2795D4D479851DC004555E3D6
-0AAB1969509FFEE0390AEAA3D631B78EED9370B286B5D2F871EAC4F14FC32B7E
-5571510C3C9BE1467125B7EB3C9E161B0254213733C6992062A63C6904575107
-3395A27167787044056BF09BA5BB742AEC0D7546E9D092D2F66D3BF9564F838E
-FAB5EBFE6FE458D8FB9BE05800AFFF6924270F06FA0DB61E48F36417F2B84ED6
-27076B8B6EC6F7DECD29DED0DEB9D51DE150938B7E94D09D19F28E3608DE37BA
-FEA6BBB3BA06C13F39BFB5268D4BA8D8009E41D5DD8F5C0171FE2859A78C8F16
-8A98E12F32F867DBFB07EB5404B6092C7B04BC47118E3B3FB66F981FF9642C15
-A4A63362DD5D20EC4EBF415D79626385EF9D7ED7B18A41A4C33F3C70553B31A7
-01EC23459FAC1A5B9D320B962D966C43887CF3BEF40D2DC83E843E51C9870C2F
-43CB49080C3C477358867A4FE87FB6E9F79C7C7D573B0D65F155B2656F4D33E7
-0C6049E8C46513CC500CC600D7EE5D30D32B9324C89AA10A9D676EAD04C9728F
-4A4CEF9925A294F26E6AC63730B4520C43BA5AB4EDD6441DBC3F2B4EF8FC4AFB
-1ACA19E714C1CBC4AD114FD0744F84C85F4F3293BBD036EBD4CC29B3B9609F46
-E856F37EC8E33396C89DDEBC43C0A78A3FA67A155E1DCF82148893C418531769
-CB82B1B6357335742E7F712A182C413E8D8192BE6584A907969A48EEBBE5C0F7
-95C7219652F28F3306DE1F83315BFF09D66E3C31CDAB730DABB8ABC1A33C2BCF
-046D3FC7E0084877999B7D2A8AA3880006B9D63BFA9F82F26AF0B93372E55EF1
-DBF53C7494E42794097DF15DDBF43180CD643589E2F3A40AF0A1A0D7EAC3373A
-B94B1C375A45DF21509C3D094F230B8EF207F4D7EE1B6096FA047D0AEB83D12F
-E3AE9ECBDF2C24F3D553DEFFC93ECC63A2479AC22A209FAE85E34D7A6855C386
-C611D60159CBE8A9595DB541849FEDDA99DB09BEEE9499A6CCEE6A0BDB150B11
-6DF9A795156BF845FB89ECD6939D6EBC8615D8FC47911BB34107E71FB3E4507D
-215C1A8476E75BDD1B3D87321852AB6A94D21027D35A2199F25DE7F7BDC4C865
-98DD84C89BA03D5498AA3AD62135F0B1390613421D52E2869B87579EA5AEE7BE
-6804CDF29BC99A9F7355ABC9E42D21E706B97091AB73D3CB9184013C6D8980B4
-CD5C8D5D13973F342E8FB4467260B23340BF1254E3D9195B1D6AA566976C0CB3
-62B492B2C8D4EC481C5756496FC54DD7A6EF6A209F1E15FE2C3F57821E9E19AD
-0A563DD390A89A6722513345EF58F98D65450541A0C5C093E69D749E0759FB1C
-DFCA7A4782EDBC030B9D692B3EB1003487863549585E94245D9ED36D5576245E
-C189F5E31A033C68BD21D5A477B756ABBD830CEA8D7F0FC73F93352CF95D584C
-2593F7389DFFED1A40E6B14BBDEBC5368FE10962FF7A8938227FE9C44AF54602
-3EE2AA0B6D7B4044F906480199E49B3F2AC6ADEAD76C88DC8D22A417C8A4BCEA
-D0812F1F513068E700040A9F3B6678B1F51A48592437C79E2BEA709B92669764
-8A058E234468B01F498B5A51E2021BFDC09784C706024DACCA6EC0DF8F9039B9
-02EDE264D7BF8381A66751F4B9FC4734CF608898828B5CC3483C688132FF61EC
-E7BA899F45C3530ABDAD48A5B5930DA1BE15ACDA0522A33E87127C559F551896
-40348DF2CA4651C51475B1B611957E11D787F05CA436BBF1655999F1DBE03AF2
-3C83746EF137EE71ACA97CFA6969D1CE5ACBF61900A452D630011FC3E85FE0FF
-AB5AFB57483E7ED55221A7735E5F89CB4EC92D5A8C9CD73FFEF46D62F8DE207F
-D4DBAD9EEE001DDF0750125FBC59A5E13A921955C6D7CCB1CF8F89F3E00F7B12
-5D358163ECD0CF38A118064862EA04B50B6AC7B95D531C2065BF2CDBBCE887F1
-70650E0772EE5AE10AD67FF178EB51F8AFA0CB0213BBF9757976621EE0058B0C
-3AF602DBCC7ABFF5F467B7854904BD7F7E89BD19EEF9A2F7B8E557283AC672B2
-92BD96D87365C681463A6FDF56DADFE485E1B81A7766EDFDAE58F92E33CB12AF
-EABC9D80CF4514D8BEBDC6433B990B0AB267D378438D738025AD340FD602C441
-A5A4C63510DED267FEFBF9787BABFDB79804F56C89A602470AFC0E541B46666A
-1C167AB82E06BFA1814E22B65355F40813BCA02BFECC086C7E8FCBD845191C28
-7FA8F4BE3F1B4057D192AF55AAE787B0C654468600ECE8A763BF3B5A7324F7F5
-62F7F596204F0A50A5A7E1911418C00849DF24E00AADFBBEBB6D10180E9B5FC7
-BF839E08691661836B5DE3E5041DA4D3B4A458E270B274C82EC58617A98F0341
-C4D379C508B3DA7F2C20A1E7CA5DC9505795944BD83EBF02022F31E50A3FAE52
-7259693253A45AD3AC1D1E40D694D4B33E8A5A09C405B52BEE5EC132C9B27B8F
-4C45B3EBA9CF34BAFF627AB8D86755D31472CE8ED453F01E96F74851862DDEB6
-0A8B4C6A0D69783E632065B095924AD3D5B98A8100E52F2058E795639BF91C8C
-CF10E8F4DBAC1F9BD167FCB399BCEC1652C81DBAC4B0E37DDAC9998105397E3D
-73FC7E53E70028314EFEED71A935C9792CCEAE794608DC13C6D14A069A02FB43
-8A05187E9EE03AC908DBCC7551F1E933B4FCE961926D5B81CC885D8CF3F4CD3F
-EEB5DEE1769A5C5D8E86C7DB3E96FA500A2EB89735C55AC3252CC280ECD07AE4
-64EC4F4BF687A866CD8A9806BF96FCB8AD9BA0972F3DBC2971F50CCB4E1A2979
-480341DC01E58273F4086B4FB7C98D4271829AC9255598669F26F5B59F3DE2F8
-9BD2FB9BF3AD79C02B8199C952D7135933BFF1A3B3D04EEE52CA1CB9A15413F2
-158BA8D689AE2F93EF3EE2AA055B2CF2CB6D077AC8F72126FCE95F30471F7AF4
-6267671B6EF1D3F5A932D94B700CF3FD7777FE123129E874DA871CC6F54D69AF
-CFB6E499F50025567B58595509CBE1300AB209CD88FC472BBE9C5F8124AEF8D6
-3288921A3932D0374333DF8D0F77881B9012D75EADEBD2F80DA17B5B1CF8DCDC
-C71A7E217FBC07ABE2395653552742AD35C5B3A99045B92B320711B18E9580B7
-071C0C1598A58D0CFBA46370CC8111237545DB6353BDFBBA45128109B9311523
-F493DA4EAFC9D6FF5B73A486A8D4E39C582280BE7569C1B272F2942782C52F6E
-C26A3904E0EF2926B98038E35113D0D1E6B91A310F30B0BB7971E5EF0D4511D4
-888AC76E95D810A7CF7EAD44883DF3CBD91F1452F901F6448EB8914C3FE434A9
-60166AF573EB5D77DA5A16A33E5ACB089C8E0F8FEACE1F9C48C83F18B685A3B0
-027007A99175E59A6C9609A363748E53C44A1602A39E96776738B54690E9E4EE
-A3104B25F24E3F3B77316CED31ED193B4A33C5E8E1CC3B2492319BDE215C1AA1
-DD86D2622627C483F831DC8FF17D9125974521EF53760CEA854F0E8DCEE92856
-7E9364B786F6E7995A3CC87196162C734CED436832DF7F10CBBD7726A1A9FE74
-5AF7E934B5418F210BACAA8C3023598DBEEB4DD2B4C92652B61C76FB1433B9EC
-163099EA47869D3BA7C97B1D27503C4C8CA20E2735B650C7A18B57B8E960F8B8
-42E06826FAD393BAF7DE0D21AD910ECCC2D9D5FF7A260F2E88345617B09EB029
-432AB4ABAF89680F39FFF1722917F6EFDA157A5B5158C8A6261CE4FF77D4E971
-D892554EE4D3E1AED976FF227FA98944D159972872D6DBB6E0805F0D7F267D18
-26ACA6D4BB463E6D288CEE66B08BDDB4FC916718B3A497CA632CE6E8FC9AB174
-8EA17C8E6F053F81AFD6D42382AD9AFE8D64B2A4C7D91181A73AC25F06E5DB71
-4506F66FD51B010AE1AE5E82A3ACB0CC3D5BD1224A28B05D2470209C182FA991
-A9F2DBBF7CB018CE87D3EB1D9FF744099C62169EC03A45DF7994D8F42C326A4D
-5F320EFB7ADB34F2CF4031455F5D42949CB30B925BD9C5D7F8F0D85877FA7A42
-DC6B98FBBCD08BC4A760453B73CDE333CC60A6A8F2BF2785B457CD11878F84F2
-8FE44CB9E828A5AD27EB965ED94BE35BDD3C6D6FC4027CBB93508F3116A0D4C0
-0E75B6E94219DA65169079555947CF73645A516B0B779D4342A4E65B0C8DE843
-4858368B3EAAA38BA9750EFCD7864D6F931240E80E49A8FB2ACCD96C67282060
-B4751BD16AC3232A53AC9B4DD68839A36615642E76607A784ADF74DB11E2C67B
-3966754103EB44767F5DF32FB7BFD4ABD89789E9B5D23E51ACFE4E5ADEE1D4AE
-26385ABF6CC8B432096689A9CAC71E086FF2F5A5111EB0F631703C7851538CD0
-D6EB492CD25F666697B3B6C184BC91B05371345FA185AEE6A5AF301128F4B4CD
-75597F9ED3B7823282CD05655F3BEB5BD4BFFCD0F0199E2FDB6C9F8FB3818747
-6738C4F7610C3A2F46314B90C0DB9A4ADC56D955FF6AA22574B727D8857F2B24
-8B5D884511ED7190EEA9A71E9708D4AA1B06222D5FE5A4E25314388A959FBDDF
-1EA0C85E01169B2AAD698AC73A65400E87B7A9E7EB43E022817C7392CEC3FC67
-D6663DC750D40671F0337A49F2ABDB10AE3EAB8EB746980BDEB2E69D762C19E7
-440F5275C396C3B56C6FE9196ACDE6159F41CB9A554D8320A4D71BE0F7AACC4F
-466397A75E981E1A215EEEED4F3A8482A686FA7C695B6D40AE92B4150BD00DE1
-E4FFFA42AAA059FFFC4AC9491C33C05E4D27808B69E9FAE08A86FBD01A35ACCF
-46E967E862960EC4FC2704B507FBDF00FB02494D7059E429E80761626678AC74
-0BF0108F8B03A95ED783A10FC5938D9E42D64E914E9A4F04EA06BE4C8D79AF99
-25B19DFCE00972D45CA59A8BA41E349840ACA3124E8F3297C26A6D1BB1B02DE6
-C52F047B55DC672DDB9BC73BE4B39410E9CFEAB0A4B1C55DEA46746AB52CA9FA
-761C8C8A2D34944E904879403B0686521C9CFDC8FBC32F4AE659FDA262B41F54
-4D5D69DB0D26B43B68EAFF8C8997A267477ABFCC6FB829632BACD3129BA0127B
-1B9164BB9AB6EBFDE99D84FEEC3F04533B07117AF9ECC0BE6845F0854805296C
-03C11A27AF920E36D28152A50418A9EDA2F14940BFBD9ABF2F31E84D5D0EE3E1
-94F32CEDFA821CC1FEAFA56758D269643383A613B466305C21A87E58C9296CB5
-DB8DC4EEAEEA89A1E84D5DF6041A12563A0EB66C2A0F59581FA47099D429E615
-1FABC2046BFC23C7E848F53D118239D666F058113C865B01A8D4AEDD8AC89F60
-819C1A3A051AA665A43D3552760D9410843CA004B1F2CD998A3FBED3A7CA2277
-E1FEAA9AD910849B10145FC2E0D6346666DE2FF7C2AF38E2F84CE0DF16D0B90D
-03E00EC3C55E5C05AD3A120CB1879E84898995AE5A205721E2AC6F88E5B57FF2
-7CD9D37EAE28F3461181FBBC340BE35601D0CDD0FCAC181EC6E2CCCA00ADEDB3
-6867BA1627D730CA71566C9388C6F0E069BFED8968B67AD465645798D18A49CE
-1C34EA0A2DAE4C7D13FBA180C50EEF9827FE456C27BF25FEC28ADD3AD94486D9
-9A697024609611947D03EB461FC8D17B2EED155A46C0825FF872C1AAD02CE9D9
-A2FC62A38F4784B40CC33C298B4E8F7C3E8A3018ED0F497B054DEF36487213C6
-116F39D64454F11B0EBEA532DC3F72A16454A5EFD2A0A702139F6F6647338E06
-773E301EE8FB984CE226025F597DF0B44A73629E50D39DBE28DE1852B0C79E6A
-1FBB78BCE132753A07F858898522ED3420F671D4EC657B1363D88433F155911E
-991DFCD39AF4523716AB392E40BA705784376CA58F5C5F06C71EAB6734C12F8C
-C6E8D698345483D4DC9194204501A98315E44C43B38D7F30C00E01F0D1024052
-D3E0C5FB320D54FF4ED525133C55CE2021F9B06130DAECE83115C5E4CA7A5E60
-78A5AB40B902EA0315651E07B8FA6367F01701B9F5460AEFCC9F591678A12F90
-A8CD4150876FBA33C30AC006B8D168BCB4B4D63259127268C996A5A59D12872B
-EA4304B8A5A08ADE39604C14416F9B327ABBF977BA56FF620A97FE4F2D4D4181
-ECC349BF0776276405F54C882128121AEA5A07478E2AD6C10742FF6430EC0EAD
-752F3541B1CB283CB24D7E37445D4BF42C8BC632D41C4A168EEBD0B086BDA9FA
-3D17F6ADE5D0D70BEDCF0A50B1E16055999018B459146125D16689CF811CDC42
-E1563D331618A22EE81DB417DB13ABDB475396B02F8FDB041DF6B099074AE073
-202B439C5956EA33C15AA8F1F6BB27F0160337203EB289BF55D613ED95A97685
-5F86C5FC55B627453171F5BF641E5B6DCCAA31E67DFD68F968EC79BFA39B178A
-D3EA21270631FD29031F64621061E60C7E2269645A51A239A207A51DB86CD07E
-3BB35993A95FEAB12FF6BA96EE231F1B2935E979AC69CB0CF2416938F5FAEE48
-E813DFFB95D13BB6A92A7A6E2CC08E3789462092F4E72626279E5C8257EACE5D
-B3CDF6D4704A729D020C278BF8BBD6474912424702ED4DD0368F30CAE5977FDB
-3541ACD80981D99B54976936DA5AA9975B84F7F2A2B2CAC6EAADC5B2BF652891
-FF8BD1DC5BFE7033D9D2A2C79FCFCBE44D84513D542373A9CC8CC6267A6C8BFE
-F2FAAF8AE6C30153EE9F280A063D05A9443DC3B99AF1C9C1F2B0D4BBC6804F99
-5167D5481B434092E61F7F6120C743597D4CC8F7F158622C87E0D7FE7595DEBE
-2EE42174102C99FE6092CD19A8E424B6DF432EAFC0046595DD05EA58D034F4FC
-FD90B00AA18C3CA05F03445DDD30A6F040B51DAD4F04EBCECB1D5482301978D5
-DFED67774A1C1251F2003FBF6C4E2913B259D99C55B25C3173F41AC40933CA99
-2CE8EB0145F68130A4B2960C2BE2CC89AAAF8AE833982768B321DEC8FC8EAA8F
-B64A9868E32D1914C46C8A2EBFA46F7C1CF199D24DE24339661F7272A6E34829
-E62E11A0924988177435DA106D7C524C0C2BC1C2AF99D496859326FA74FABDF3
-83FD82C9144B6F03F082E20EAD92284139E45C994018F889A1FFDA5FA2B19B90
-38B9EF87D2B34A7F46AE27BB95E2195F958798982E96979BF23BC7EAFAD3F1D5
-AE454252A06C5953A6553FD93ED295F86F419D15FC76F05B0C15EECD70D0C784
-21CAD58C34FF8689CA2D0A2C9A204D99C2378421A0F57EE9A3E6C9358F3AEEE4
-E9B6A0CC3AB9DB260D68D35E66376A74B26F925F1578737AE6539575B969F269
-872A97EB9E0181BEA5241F9DB74F212F81249B71B82D547D1C9CB6FCDDCFFA1E
-700FF34E08147F6E29F10F0CBEF09CD254EB5F9F8D8099C56D859AE9EBA5D4D8
-256B90DE65747C78D14B4FB8E39A67FB1039914026E0CEB6FEF629E1C024CC37
-037DA8F073991235541F09CCAD292E4F7574ED126C99628F6B208661C2EA782F
-C74AE7FF1F486B781D89357F70ECDE3F36FF6580E6A0F43F9CEA95BE57AA3AE9
-D82F4D141B9F92F22466637CA739BF9397BB94F60A6F4197C6DF0C4A9F348C46
-29FDEEB9DB680EF7EA71037C2C42D15A966D378AB2192B56D24E2EFFE4421B53
-1930203249DAC898FCBB90EF4FF10B95B01E4CA59B25CBC1517740BF94243B52
-E8B96AD886C9D9EDEE636A4F8722956674D838F57A2B049E0DAAD8731CA7331E
-6D5F3CBE866174B949D87043C4686B226AFAB0BC6878D1693D849CDF52B2D498
-729734641F6F8A63D0FCF3139C55D9ECABB27508613C1997A8D8AFD78C8E789A
-D7C30F6C58E84FB564093D7A589F4181EEE55EEBF39F369396ECD59D90D44965
-1E267F20B980A4359B462F692E86E04E0167B965B6D958A52CD880FB69F6C60F
-F0F76F5DEABE3B0E21592258BC83BD9AD7C087B9028D3F1941A2873FE5D6911C
-7D353B921FEA42816DD49B48450049B8F31D7078D0AE7CD7DB8765A8781D9B75
-0547884A23E8DF7778571C650490A77F1124639AA7554AFE3D8589DDFE5D7141
-43B8AF5E82E9098B95F395C2B9988068260570B288D1882D1EEFEBD9E9B0FFD9
-331503DBF1ACAAE998CF3F3452518B30469A6C72C23D3344C4FC1DF7A8A01148
-73FD5F56F95BC98CB2278B583574471BD2E97E95E8EE1860E74300D302602DCB
-74D548F0D7377C0A1887D5FB27534A5560DE1D1211F52963AC6C7523FDA0104E
-72121BA9D2CF1D84B299F2826B5105F140B890484CD2D5AE03C69BC056786534
-2BAFBEB8D80273CA0395EBE9A3BF3263C1F46093C5B3F17771D7AC85CD72DFA7
-CD767C726E7BF2196380E57453AC511C99DF297E4A7D01ECB22A095355C30E6D
-CAC1B1F0FC955478F0953EF9CF88940D6FBF6D77BE921BEA61F3F1C939EE6351
-C2F6A29D1F1FE4383BFBA53ECC232C6535151EA9E1E81355FA9E72847EBE8B9B
-11B229BE65DFE9774B9B2970C8C08431943ED09CD1A09CD6EFF896F43EE81FF8
-69C777498FC421ADBC40DA7AB46E3C65998092017F8B6BF96FADD768770E8219
-71D03657047E0E6E154CA34E4013D724A8F78B53CE623DDD13A5F7B7FBDCB909
-455CD4AB2062AE859FEC2F78116EC8583A2B002C2D9258FE3DF659855CD98E65
-876383D0F67C2BA1DBDDC0F652875EE767025C2EC6FDDF5CDC440577D5F9ED91
-8F6593731D04B25C2868B3356C87A9ACC98AA052932E01C509DA912B44AC538C
-DB92D01A4AD932CF0D48E6DC067795416BF0A4E5B9500977DA66E4B346394D3E
-D27939A56887239B7FC7F15F564E51116B615A4900CF3A67F33EAED29CF39528
-2BBF2827BDAF3616AA1740B7CF12854CB51175B088CC6A697B5D5462C15B49D5
-D4E58A406B51EFF8CABDBE91FFCB58E9C8101178FFD0833FF612DF7F99891F97
-6E994A80EFC41B863696FE7EB6787E4AEDF21E8BB6D5270927CE9AD669261255
-4D345A92D79F62F15454A661B4470310C0C7F85545806CAA0CC180B957846895
-BA04D4ABDF3D89D321D9B9C7DBAE4C690F4625EEF664CD0BFE548E057E484610
-1839E6F5C8662BA539813EA1011E77B85B859E5C2D30C27E19CE1FD55E2953C0
-6C9D5E733BBF99B3FEF8EA202DCDB64B8588E0F0A5EE6D3F214321FE15C3C9D5
-9DDCFEF830B4A0C458962EDA665A95F4779CB7C6F3A1FE80C8C9EC1542EC2D9E
-B583B37FAF62443FBB3E5A7F6BFE6596DF1E9651216FEBF11803FAE1CDDF8756
-A55D19B3B1898C71ACA59364386B4912DC634E04151A443C6B6C307AA2D3BDE3
-7AC16A5B39744FAE7E9BD225E04A466BEB4F9F51959F3188325DECB6CDE15C2D
-66F4C612224BA6A9FC70787FF17B7E0E31F556E2E088DF214ABF9F27C39EE495
-1EE163A644106E1C1C7CF6BEF07009B38022CB5B9C33CA4C62E69DA01BA25CF0
-BCA87377622FF3C96C68D4FF09BE24612DC788F0ED2910FBB1AE8C023B7CEBF5
-86196213453251BF1231B5BDCE182503C9B0E06724133CAD069E14C36DEBF9A2
-5661BFE61BE51624F42EB5717CAE7F05DF20A27F0CD37D268BD50286E891311C
-D55744A29736BEA554B466A7AEB02C5C0575EF05CCB1F69D37EC144458048245
-01EA846682850F97310FD68190044E4CE798D51699058F03F5B0035A83F96E99
-A5F7112737D436EFE6A7C60627B700D4B539288D2006CCA437D0AD04106AC8BC
-9E411030E00CBCDC3F9357ACA9CE3E6A63203DF968AC474F722B889A4EC10DBB
-39295354F28BD8A3A770BCE14091561583447E29292174A067DDBC4A7C638A50
-7A0F05863F435AA2C763BA5CFCF6DF8E39189E79A9178E80A305E8F03534999D
-532CA867B055AFB2077A0C7B5D1B738DC0494871F707B12D1EF469EE4FFD9C63
-78FE05E1DA7E188E997AD2C03EEB2CCFDAB1019581FA9C57C8F1DA051A60B02B
-C76A5F7419B32AEC483D1EE2E7512BA83AB78C796CF06D6A01AF6C1A517F8643
-141D48E3344B15CC483395CE83BB56762A423322A0AE12786626E541F85C5A2A
-79DFBBE6DAC3A2754AEAE562523A5788C3B548B6DA59D3DA207E5628017BFDD0
-A9DE4072882788AA1177C695DBF0BB784F480F831C4FD4B67365B15CDBA909D5
-F83B44B360609163287D7F315CF95B8090B2BA45518F9BCD3884CA9641704A05
-37D4CEDBCF7F3208C7580AD987F7424C459333F2C7B11937BC3AD70EE12EA881
-FBAFDCCDB80A1C05D129E0C0DAA23909BC56AFEA730F64F93FF369928C40F0E5
-CBDB410CF2EF47D49B0F04841B268F954E225ADA644566B2E2A7B93A6C6EBEDF
-F6CCD83C4BDD1AF12A016D640CA9CF1BCB0FA48213C25E7359294857E16A8326
-400C324F4D6D15FD011EA1D345CC8585B06A5D34A0F2103FEEDECC9D3D5C65D5
-620710092A213AC8E1C8C5AED11E350F0760D1CD7062BC1FA480A15DE733FFEE
-5F428FBF94488CDBCE85D4B65593362AFCD83A782A03F80672257A67EEE33940
-89F04CEE35C0B418BF33F65357EFBA4E3839D5CA447BE8D1E7C14C99A1866A13
-115E858073E68F259F48908E980C8335F9ABEF1109A93C20164161EE5DFFCC18
-3B913D65D9ED29CE5688A0078454080BB624DAF959BF30ABD78B1964C0D38D81
-BBEE68F8C31A647B75194980EADAE5AA18609FCCFFFC73D55212DB091A812A65
-1C62893A54B9E9214A6223EF22E663B0076192EAA8338FEBD91498B875DA25C7
-DB83A8D36542F0818F02717973F1FBF55811A03592A5778CCCC941CB636E6C8C
-0159AD962BBB6951D36FE9966DF8111AD385EAA574BF225F06DC016443CDEF40
-632709C6ADDA1A90DC99DC0C4AF29CD4722CC759C1E811676F12D58148FE7DE0
-6FE2C004CA06AB171D171B21D3F01BC76C5BF9C95B7BDED1E82C0DABA460AD4C
-B434BFB99978D079BB31CE9B6961CDBED6BC7601A99A1F811E5A1384107A9E79
-4CD84EBBA899EEF9F33583490C3767041B9DC600FB7311C8C606F1A3C3A30630
-6C6B2E51637DD48659A31BAAD4CED67A90B9D8FC4B548320CF65C66E5D0B0726
-B2047D77C71A385C3A77DEB598E24CFAEB307185D6CF4DB6985EA47290BB4191
-F5A5700F9070499C56DE417EFCA43AAB5AA92D1620E38D9ED6E01230409EA873
-F16CF19C67466306F8D5A442B9C619D5108E77DCABFB71F3F5222D46DE8B5103
-EA329DC77AB50E9F8C73455354851AB748246C351B313D14292DCF639D80AF65
-2E765CB7C1CD67DCB2B1FFB4C7C16FF06E22229C6CA1B90DF3BC04F43DE4F520
-604F5459B3E77FD1448F38E411CF8890DFA4625A9A70018DB43BE1C83DF0715E
-769DA23B17BFAC15285413BAC8B44E0B8ED023B4CC9F65427E922F7AFFD419CA
-20F0E82EB61C0EE762F546EDF4F6C3BF91F991CEC5751CE393A8A1B5A740E47E
-208BA82AD0AD81FB31FBDF64A44AECE390218F22B94F4912735351875810351D
-7DADE83748BC01453FA6CCB00DB1F253694EFA2F906121935E446568F9C36D74
-22518EDB8490CBFC2A03E3F7C143EC67BE7758D7E018B9D17328E842A71A6DB4
-5653AD77807334DA683403FDF3909AB57EE261D12038D277D445B4AD4B9D0943
-9E1787ADA6156861B188646A3A065A2BBD52DD92CCEC0121BB56AC8961E67A21
-C6C56FAD0A430B0EAFBCEE41F8D7EFA3D1CF92A5A26AB7B1ADFCE7B43BE20CED
-4721BDDD06BAFF6F0D44EAAACF15D4BEE561E4702B525EC62BCF202D52EAD25C
-90F6F53F4F37E45B94C0E707B426F5D598DF95372790BACB881E0C817FB3CE27
-A8E31CBE57FDF91582510DBAF8CED1E042D592C18ED85C646507E39D28C8A6DD
-073FA1DE452C4AC40489B68FD3343DC637070716DA198EC36C2A7283604B99B7
-3389D0F2D1F95455105A3B7C18400F55C617A2EB7EA84CA48F770953AF9FFF9A
-B00A4C6DC1A5BB278129E7B98E1124B396DF750E2C4470DF3AB074602CF55478
-F2DD0FED01D5989EE6E52B3728E9D5EDFACAD462187C310B04914E2F34580E9F
-D2D9939D2E18753A313CEFE1C6C4EC368E199D5569DAC78B62B967E2A01537E9
-6288410DADE218305D5FDC8B96F258964BEA24E3FFC3C092F7FF5A8ED7005939
-CBD7594BFACAECA3A650BB2D2BB41A9146C83BDF84CD8349989B0B7C46264EEE
-B0AB0F2EA1D9911B68E9709D2AA3772094EF0A8774A4ED4B93B45EC22B6D8616
-66D1CB9EA64AE4500209113975CBE220A83B6C74EDDAC5FBC11190A44223611E
-C2829BD6E3443F5938C20761F9B1EDF84D060FE45B20C86C3CCB8C7B83D74235
-598FADECA175DD7AC9C301C875DDB055AA7950C93DE8D7016A3D5D2BE2A0CF82
-94AF5DFFD81BB8E7A8B0664EF4426A765AD48C168965DBBCB4A5292E99E329E4
-3B68419B564858738F4419D2AC492DA601D7D4FB8082F16E104F507B503BF9CB
-7F40A15D1D6B1BCF03D5630E16249ABE6DF0EDDB568CC19FD9F785F3F7417334
-8738B91915C553906EE1B378AFA358CFD6FA3C815F4EF44DD5BA6D26C6E17CEA
-0A29B307C857D5D2CD8C3E506660D7950B82F1DE12E141F4740DE728900709C0
-696AF057305E6670C23DA0BBA5C64A111206219FF2C1CF6FE7B0EF257D5D99AB
-C60AEC3AED73831760CC5D22E74727BFCBFE6810EDF4F48AB39121A82DD5821F
-DE6F8A10AA6CDECFE7D4BD8E2388631D5941C5DA0F61640103E5C68F6CC413A8
-EAA7D2419F2B6A643E8F9A95F66A1ACBCAFCC7443F4E01B62320EE7DE0689EF6
-B8397698925233490BC6C4B90243E9A72770FC68CBD3854821DF66B785087743
-9058E6DE7D1D932ED00A1AB57D21067A5411DD097EB0065B1EABEB209C5B69BE
-87F33EA9E280B71D4B8C8CB8C99123B8282AB57848A99699402FFF93B755ACEA
-DC15E0383422646F3F80BA0698A6A51AB1A28169E38340B303950B69B881030B
-1EF221BD8E44BB2549234CABFC545DE97DCBF12F75655BC523A2371D5E680BBB
-82CC1D799C451E8B3C8AFF0AE63EE353520A2EAF5C4E815352BB98ED6162F08F
-E2EBE7F408BECA380891A40FE3691F984D498935B11F7F295E98A256E77BD0BB
-4492D8CE904D9CFF530B5A26D14A0B49DEDFA9B19DD80FFE4A56CCF3AC87C651
-FBE675846EE0A998B2BA26234849C4F95B0C5DC2D3E84A26961B1175928BCF7A
-730B085C42FEB713C58A2E335CCCA1A5DA7A88F6E2BB015961C14848F61AB3DC
-DA874008FE811F38B13959D227AE5B3E358F1D2BB8E2D7FEC13DF0CC79DB6D25
-5C7BC76C29CF9A0F688A0ADCF3D902FB7E9269837D1C59976F19012919F67E3A
-6094482E0EB91FA4B137FE4F07CBE4557F414E60EF225666F9648AC754A28E43
-629F1F070299834C1309BC28F0659B8FA58C133F403D61BAFE7F40B6E31D6C83
-EB980B5AD4CE3F01D8547DA7FE177C1D230480F771183B302FF5C3683FC2F628
-8A9E6E5DC9C029E7957CFAB8C1C9C4B2B604812854153C683618749FBDD5FB05
-3F743A4FB268B84ACF1D9ED1283A7DB64A31B78636B4574B8A473679C3A881AC
-F7858416D29D3EDB3C2A62604C0A666188BF9287118F092485FF10AC343C31B7
-66C761AE8DF4634B448201A9DB85B0BF06A2E8BE1A762ED37127DF2245084B93
-FB078BC50ABD8980CEE021547ECEC6751B2295819D5F39BC3B210560C383D887
-A4B179D0ECE8C1AC8E0A2F97DF032D1EE28F3C835D7BFA2DB9AEE349E65B73D9
-3C9A367A6C655174DC8180663D37E19C6B5C44031067CCBC577B786828DBB23A
-C076FD672CD32D1AED09BF9F38834E6B16F1BDA5A34F063C64AB8EB8864E7D5F
-C74EE517DC915F0C77A2DD5923A50AD8A4DC39344635AED890A5DF3E461AEE3F
-E362DA67E73CD14B200DF449FBF2D92C27FAF4B895C45F370C93AF5F429A4303
-4CD0D65D1FB3EC103BB5A48C04D675928B6FCE127AB32BF205F2EDAC29B327FF
-A10489744E27D249753E5661634753915059E6E2702C2F58905DE3AFCF2D4272
-9BA4DA3E6781EC67AA39B77B6DDE3968AFCAF99554580AF408293DD5CA032713
-CA5B5D28AA46606E627F53F27628FA563C4759D84697781600DE99D895B402BA
-870E5427BCD0FC02B9090770CD84BC9061B76A051F6CB4921990A0DB13C2E333
-8CA0E378EBF8E9E507E22979D9B694FEC20378CBC11560FADFE040DA63FA4E56
-9D7D12D7005DFFB82D17C87C9EF63CFBA5CA887B88BDAD23B4816CDF4BAEA528
-E269CE1DB32E79840D3569ECF356984326C1E4B7C20B268FE955E9BD3884EE01
-4BD7CD21031F7623DBE183EEF39AED664EE4A94156DD0887D85F19A27C90B834
-4FC4FEC2F39029872023186B6CFCBFE065D9ED6B332D63847E5EA8DC91C8C668
-2026FAD8E24C00B2AED44466AF5BFD3FF9255EB05F7CDD90826D88D6830BE8CF
-2AD621CBC121437726CFCE345418CAE44DE21AA3711E4F9DF7AB331C5B074BF7
-3FD41C21F642266E799450F7D0EBA2DBCCB9D9DF3F331602FE0FC18225BAB14E
-26D1A7E72290E42B39172B949F58258D96DC335CAE79C3B583BEAF9F36AF6DE1
-67213D403790B505E753A10C277A6FAAD5327B738517D57BC130A486BC8B4746
-1D46DED8FDDB9C917B1E8D1D6E4DE551B412DBA2FFC1E35473DF49D9CBB20666
-9ED63C06DD802CA9A81BA3631F1CD8671744267037EEF17A82CF746591C63A7E
-8BA5F822B443BFEEF8BB6C0717AE87D880BAD61A1A478FFF5883C463DD83CA43
-793AE5C407FA4C66A56592862EA0F626822AA8AADC651E6010A652477E63AC80
-0F32336858B94F8D40E9F9FCAC69E8813C76B5491F4CA8B291CE1E7BCD138383
-E02AE5A5C8A8B13569D813A947CC46F321029906C5DEED777724A1B34A684E60
-90F8205B446B5D744D622DE3632F31DA8EA4E412D8E65E45FF964A545CB8CB3E
-654A99A1C4E6CBB8D8C61961403D12CF6BD20E99765BB5E239E8357620DA54B2
-61BC00063389228BCB59EE9565B3BB99F1AAF30D296DF5D34D86B543B41308FC
-B5E55F4B0DCB6D3D5D5A027BA1E23566997C78B477E67F00A57F67414ACF113C
-877AE58946253165E92084BDAA4D40250ECA51BCBD9EBFF9EBFD6369DFF081A2
-2DE96084D718C88C6DF2D167C11805CC839C7CC393C052FD4959399A9B4330EB
-88CC19F2B480CF088E338708B643279D35D68C3679A6EC577997A54FEE8086D4
-94BA562BF63777FCE8EA4E0E59068A8433EF8B64BF8ED59CCE16B7916D9F1E57
-322E144D245577C69E99E84DF2367B1865CA3B5FAA34F4B00D059D09FDAF9EE6
-F57C0D4F73F17D9136F873F1A8A7D2880E7319B3188CDF8451B66E5D08E20BAE
-C106696379B76C44832F51B7BFA28572850DC31EA2512E1BC3888224F96A75A0
-8B7738C1B2981A3B89D8D5ED4B7F6C3F6995C893D6C174F4E3A38268228FEDFA
-A72E14856DA96125C4217DF38DA9DED696C4D62DBF37FA9FC1466A31047A6223
-DDA2F118E90B180B45D0A6D20EB1BEF9FF0C561BA1D870A01349AC1E42A6E9BE
-FDA106D48928D65EC46F2CCE64D61019ECF22E75F743E9E1D0FE98FBF5729A93
-86D9AE0309816B8C5DF3E9698D51BED760CC637FDD3D8516E36B036E7D784D69
-E3512F9AD76F7C3BFC32CE40EAF7C0B7A0B1729E986790DEBD13E2DEADF92C41
-528C9DD1E835CF18CB8489B4CAB7E105CE9D16CE645599199F1D2A58BA2AFF59
-AECDF574F7C2944699ED630718FEF049139CA3F4ED5C0C5702A0DBBFAD074AC1
-78C70DD53C12EC599A5F1B2AEE886DC46426B8A21E059D78AA51E4AB57F8B4CE
-5CEEB784C7FF980C36B2DE62BCFF37CF378A7017D8144AB88CCE45F3A07680B8
-32101BC312A020F621AAFC524C5F86BBC48BCF4F7C81B4B2E82CF585F06F2481
-2F8EA6A1BC2D580617140EFBC6B8F7EB7D7E323A27BE3D5AD599C6BEFBB2CDA4
-3BA86E0E16D7264833827DD01E7B4FFE6EE2454820E939066B988DD2345D97E1
-88ED2DE120992C40A3A5A073C1371662E3DE05CEAB8B438E47057EC5139AE5F9
-7CC2A859CEE5F0EB7F062946327FDC5BA33A7E1358142DC5E7B5476BD1AA7AD0
-1C024E313D070A8D7A3D62FB6B64A5FD562263B79BC832D87C60489FA0A2C4A8
-BAC86DFB78D38A6EDDB47D21A596969093A36BF8185535D3D5C987160188B6D0
-5719D2FB8C8F0F76A5A0A8562E34E7A4543863874E81CDEE68C57068734270B3
-EA9FEC6514B36D5F2484079464CAAC1E8BC82B9708E7355FA8F78C9271ED294E
-146EDCF66FA86CDD1D47D5590B633CDAAC3E559609D270BB7CEB794F48B5DDDB
-EF716CDDD85A9E39CC640E1232BA4E057518B0876B3491AB21CBD1ED1BF51F0E
-5B171D6DEB1A7C292F2FAA36E3AAE7C21548BA6A5D681407613CE614A81AB209
-198C5F7A36F2EE329A3B3BC98B1DC8A8D30EED1D7D0F62D187225BB3224247FD
-67EDFA0A6C417B3411533CA4B6BC54FACFA7D4D8377647AF0C9D562080BA8221
-B1371213B8B1E28C69C6DDB4448B8A5FED0F15656FC6A229715BF71EEDDCCE88
-146243275714C6C27476BB6AF2DDF878F223318B1ECDC0B8FC4D1010C1299A14
-83169C33DB33166F1BBBA3197AEF05A8600891D61947E919A0002297CFABF727
-0204E391480B6C4ECDFB94567478AE392F34CFA124CD2D2637ECD95197F371F4
-92CC9A34BE0FC2EC3E7A05E25D1D76157E0F59734C3969EEE34E164C7BA3829D
-EB3404CA60DEDA0EB05C66D78234729EFDC442BCB0878530CAA0B8EFFF57F74B
-9D3F8361A24E3ACEC3A1AC34766ED8C043B6FB579E873758C501F81939E79C76
-BA612E0F349E8DC891303776A7702C082D91CB23D2F77E08FB2EC60EE73070C6
-4E033D300A5D26F59C51241BDBBEE8DD113EE54CF6DB8642063EB84ED1CFE531
-D9E90C0A972CFA4674937455B30ED726FB98C786CBFE0CEC95EB60D2AA279F64
-C723DBDD83BFFC077DB57F399F2C6731145390B4DAFBAB65A25E0B41E617C71F
-9ADD86B4CC8312E8AEC23ADF1096031DF225F59D890AB7AD5DA0CC8EFE1BC2E1
-A5360CD6799FA342B89290EA741B84A37CA3D64297C8DC6B5ADC401329873763
-E227DD032DBF2164DD14408EB89FE313988FD9335BFF72AE9A5982ADFEE44A08
-D75DD38EB950C579CB6BA4B381FC43354CD9FDCB691C413BA246F07E81764507
-E20F37B02E320E2E086179CC60350B236E249FF196DAFB94242CA7FDA746228E
-1EB82BDB89AE60C453081FC2D1D9E546376F4464E9AEFF63E8CB8D6B47A4D499
-6BB3A0A8744679D7D1C05AE44E98D7325A6402228B87AA3A410367E956D24807
-07581F6AD7932EB450EB16449E1A40E7F250A989FEC92E27AC6AF78826FA6885
-ADC87FD6C0697F41BA2C7C79D777B344037BACB220B1A9A657030A5965E025A1
-F953185214804459E96A586BACC62FBEF3CE5954EF1C61467F5514ACE043D448
-5D038438250F1B85463F8A324962144F9D7E1C328816994DD3A9B31231871091
-5552844DF707EFC3F81FDF4169CEC3A1C38E24FF0F0AFACDFEFE7F745CAAEDE4
-04A092E5809AC0EA02C3F06E384B0FD60AF369F9A9EA85667035DF87C5858BF1
-603E9A419D4D8DB73AEF26F7AD52E9E394557E1B2B257F0DF026A431A192ADAD
-00BD4836B2C8B54D646E8EF9E52B0FB19C4FA322409D09BF167CAC5ED3A82A48
-C8FF640CFE6D091EB6032DDCBC50F9A593B5FEF9976C67CCF409F64207FBA557
-77340CDBCA6F7380B9E2B3243FE805C4B69A3BA2FE1830139F10A403CAAA7ED0
-BF5386C7D3BC998BCA4ACD968401DF751A7EE9492A690BF0D521932FB4E63761
-DB383CDC362D8E5A563BDC4BD8D2A1DB5D900B8FDFB5329CFB85603967C42502
-0947B3FAA5AB0A96FB08A464817136A4F5BF988080CC0085CEB42879D650466E
-1B972B717B18D5CDD21AE47FA495641374CD156A4F726A291D4E7C5CBC042DD6
-3D119BBA7E7163F6AFCDAA9AF22A83569D2FD35969143D992570D905A90F247B
-475E253081579D0B75467A329E5B5F124DDCB602D34D12D72ABEB65E41C5C919
-BB9B1638E41165C33D20797C3755AD71F53FBB70A0FCA76D52B33097C3ADD50C
-7CE5AEECB9C3378538FCA2D0C5928150FCAD751DE3611F9E84ED2A0C6DFE70FC
-4AE33F879129C961929BAB02BE32CF4070F8F4F0BB0158834FB0C605A3CF5490
-4BED0B1E98A2FC5399924C4D554E41E74CB58A21200E6DD2AA0A734679EACF7B
-97D1030EECA997D2371712690F8D8CFC9A4EBCBFFBB9F4E4BFD790A0F961B95B
-700A2877241797ADB1CEF48AE70DE669C8A8E990F7EF38F24C269734C4E230CC
-FA6B080559B635F5D5F78972786469291A062617CC8919F2C8CE94845E955DE1
-F668AAE68051854B3766B7D14962EA3C322845BCD8A00341B20A2A6A90A77DE3
-EB2757A5DF3D6292033C869AFBF5E58F4E4C0819504B93F88E6F116F39200A19
-FBF1236080BF69C9F77C53413323BC8250901D87175E2402926C33726D68FF1F
-AC4C38FB4CF0EC80BF1147AEC15B05F580E4C51B2F5F01EAAF8095B02DECB458
-C2B6D8D951BB2E7DE70C31E4FA5A4FDE49AE7E89DD82B217D6579A00EFCBBA91
-14E991022833D0DF8CF05A1BD852C1879779176564B121F6FC64A795666A8920
-24DB2D57D0AC1341F032403EB030CA99BBB31BF216A87FCDD7282C4497A99AF1
-EF9E7DA614FDE80B811D62C995F5178588FFA0DE8C76E18CA223BE296CED4016
-A8B92C2C727C4E5AEC2F0C56E1D4E004FC3414502FD82A29EB4B87D8FEB92155
-F56C4C27BC1EECDDDF5F224F935CC45D2509E4AF6227C89C20C250F7C823911F
-0E1CF6B31C793BAE12A61A6BF5C8DAA299201D9514267D54A2D201E4257AFD7A
-8BC070BABCBA91F449CB6F546A92F87ACE058EC39AA84EBFD8FAD238EBCE0D63
-0007EB216406BA29C84FD6B9385577D04222C305114F3B59C186604F67C5AC8F
-4546B1B55348E1E2CE449D3A28562FE514F36A77F66A71CA91EED86EADEED4D1
-07F36C67AB83B0BC344FB9DF4960D11FE02EECDBB829B0F2AF39FC9D02E75C5C
-5D3C1BE00FD913F35AB9B9F693E7C9BE6B315B35D035585ACA19CF2C7CCAE105
-349E30AA4F57A63149D9262028C53EB8129E0F15EDCC7CFC2CDB5FC190B1010D
-9F198949F56402888E3C7892E48408B34D9EE3E9418CFF92B8418498297E2449
-E7F92E983348CB30D76BDAA84DD2797D822D6F26A582F8A338B9D4D370581CDD
-34D0D334CA8D7616E448C86374B65CC0131010CEF730785F3DD5ED2E26F27011
-CCC7B554FEDB02B6DEDF48CE76591CC110C65FC5CC72E7272FF63F07516AFE39
-11202DC05097DEDBE384E8DAAA2F2A422565FF426715A849EC159220C8CEBF65
-1E4FDE87CED9414AE86D6D2066F8CE0AFD31FE5A839EAF3092C2974FA170835C
-31E8F1883E82EDF30AA1BD6AE0C5FD22DB9B1A53F27E404E2B8595E241843B95
-A9B16F40CAE8F8712E1BEC901165E4B64AABEAA93A544682298C5703620E42E5
-F8536D0DACD0274B1B13805CDC0ACFD5A242AACF29B8881EAF29780B65CFD8EE
-21524F3F845BE6D7E8D5CF594B0B15C50A9B5A2620907241DF6100DF4AD96AE1
-9BF9254162CA6386079FB93F1F88A94BCFD6E47B1CA020129EA7F34E9A261581
-615C23C8D52AFA37AF575417C814E74D56F08AB575D44B2D0C17274BAA5611BB
-8C61D49D7BA9343D8998110796E4E060523BB6B22F1D5DEA9CF8620D29A5CEF8
-5EDC173ED7142A121F0E472BDFDB29E721A825FEC5013E8794B8D132E994D583
-412370CCA2DCB10E3A5B49778AA5B4489AAC9918D4658F0E43F10558EC41D454
-FF56C8261842EB93FF326EE3856FD0A25AEDC72CF966CF6FF46383C39C44836A
-22485CE993E3A0578466FC77106CCD2195126567E11E54EFFEAF8F40BC0D1B97
-634F8C121D9B62648DD61752005891596F40EFCF13A2276A4C187CB66F0B7949
-BE95486034B3E66445AEB24A084F8E535C754892FFC156AF7EA8315A1997D3D3
-FDAB4CD7C426F839FCC9BF4506C3A9430F6963AA8215E44D86ACEF423291375F
-F6242DDF87980A9A5E55DFB668C74F123656CB625E5E335D2CE989FDBB269F18
-432F91A9E4D62B32E6B9BC8AB5CA32649C98597DDCDE2F343AD7E61F0F54A21B
-449DCD1FECBA7CCFFFB5B2090D90251DF0E92CFF6FCB89B5A4FE39F78E9B817B
-90FC9CCC283011B96319FA61E5C1BB9E2A633CB9BC346D08ECB3AEC5A4E36A75
-CF8843027E2B411B4410B5C06F3B83A37442D06B4BA57316A7C9DA5956B0AEB1
-C7A221C939DFB559CF0FD174C3E9D917DAAEF97391558C48DD1BB7992B14A8AE
-55B1CFB6678C44305C03297D61D45A23A162A71873ACC77FDE7501DEEA302144
-11A8EC2224408B7B4159154C4B1CDE75D5A80FEC50C1E123B6E0ABB523B90F07
-91E363150E451670DF047132CB503719485BA8058750DF7E7961AC02B84FC89E
-B8D57BCC582C6D9754CB90691F65EA57AE3D8A7F61B70AB95FD6C05B0E0D107C
-7560C1C8AC53A0C5588A14412A264BD84DF2A164B1BC8CA599C58A8C581DF0CD
-C9B9719A9CB243B95A41402C29F2F56C71D253FC699BBDC4F2D2FAEAC42AFA75
-DB38A8EE0398BFAB528832A80D3ED42E9E3F3375F7DA493A936EAD1162DB55F8
-79F31A554D8BF98B5E1CD6F1ED1FF319B61F5743E24FD64F42873E0BAAE0754D
-13634CDB4BB284979BA95CA517BCD14F2BC5B7ADF3C105B5FEC0C9A9FC25D662
-0237C84F75CD28D122E5BA85BAC7CD5D8A520DF718AF068A62E2B9D20DFD2E16
-B9DB0234564337ED27C69DE8881A6493AF8FDBB5920CCE09D5C1FB480540C2F1
-980A6D87A4105B168D570BF0CB65E2E03860C838011393C9AF6F6D688FC52770
-EA668A2F714A1F61F77AE35A1F55FF065B799C1028ED8A5E0111581FB14E3CD6
-BE1A98601BDB8B3AB76C58D31A1EC0C72EB5965CA5ACE2E42C73DD7DF21F82D0
-1A3331DFA06E332B68858574FE9CAD3E3D720C17A2D92C53EEE6B58B230316A7
-5AA30C60CC672E473ED311E7D38C4EE2809C29F2E76EA3F5A474E6AEBA84862E
-7BD677B6D9AB0C2B501BD929354DF6A3CBA66FE0FCA49EDDD22D6E660085C421
-533D735684BA3BDA798AB2CF9E8523B16389BD242E0D19953D83FEEEA8ACB5CE
-5EAA4BD530D3F8C8CD72D3EF90DC038E2307A58D51800A5F9C62025039CCA4D3
-07DA0A0A0263FCB71E20C9DDC7F26718A2D1B5882C7BBDD3244701B62D890C48
-5FAF33407E9A5E4EA5D1C6910815BEECBC69FDD837E51154E84FF784896EF91E
-DC45F60F9C2FB8C376B5728C7EA835A807DA811A64C3F8C7043FCECD580B0B02
-F0E23F84CF6335F261F030FB1CEA8C261EB1934C750B34039A5799356B79F65B
-1CA31F02BE58D8AA229FD20CDD1BDFCF6199B6C5B9FF6D63C3585D3475C58E79
-8FCC21AFEDD5D5CB5ACC9B0F6AE689BEA23DD30F02858CA6806DB4248C837B60
-09D96D24C0E2CD5F4CD2ED50E60D03CC760D996B108017B26563E5E8FB203D96
-15FA47459C2CCF99556D0F91E5E6DE0051FB6914EA99F0016627491BA5176383
-AA37E3A49B58E488F1D6D37CE2EDA15AC652164007171D4BB2E1EC06F7ED225D
-71AD96534DC26F8E167179AF8714137383561BD7EC9C5F8ABB64C334F1AF280C
-4E70CA3751C2ABF7FBA2821B286A9F6DDA9E769646D5878F8860F02B8FABA6CC
-A82EADF9A45A30889AD551894A018B81093344C6CB0D59D09D6DFE91112DFC9B
-5F0387D8727D1963415748D482FDD5AFB001FC249FF5B02DCE1D62F011E553B2
-E767E48A1CAB27FA0237E35464C55CBC199F7596FC2F60BD9D853D825498D381
-D52C5FECDED23525AE02234F8AB609EB0339B06A46BE7AD7DC67A08FFF568B3F
-25C071294F839F96C2AE03BC57DCE13855AD7400D7BE881DC5E34720F408DD31
-B6B5A33E2BE89889F0F5868C71602B086EFF8DA6554640A822B59D547C1DA709
-E29964B2E321E2E803684C8E5D64384228714509E618BFFCE97B1298203E144E
-FD4E16F8C2B37AD390CA7A59E3ABDD281B2B41738C96478DEFF7DFDF45BD60B4
-BFF2C7E57027AD51112808DF8E36F0423391C8328E17AE3D71B3EA2958720539
-5182BF85FB826E5119E4D56BD5C0100647B190B3F2F671012AC37165C85962B6
-E1679413DE6F824482AACAE6301C9311BBCE073B1349BE7A287D9B6486A683C4
-4D4C541CF4667B55EC959511E0FB0DD4BFDE5F7F71341598CDD86CFD646C22C1
-A2919208944AA9C75A62F1DEF2AB80DF12023564EEF49D56B0D6D05FE2757BA8
-66F35AB485083ABE685486B81B68082FFE98C89CF09D0171A1FD0CB866E94AAF
-AEEEC73F2AADC9F1B1ACD6545BCDA0CE039891B541FC674F2D6831ABFFF143A6
-8CBB10ACE99ADAC14E99ACDA73CF808B10E87B42DF4AE186BA18FBF828D0BC09
-A4A1C10FE4C47233B57CAB00B6EDD73A38F345609EA860C884E22597A1AF21A2
-4EEA28727C1A92FEF237B84507B38CAA4C66BF72CB2CF1C7F94562029B286AAD
-BF01AB7FFA13A1E0D33494802667C5A3EEF5D51BE02AC508A997B5F09B747089
-2D7C3145EE5A9E7C15DB5AEC8304FB776F15122DF7B939265D4FCC43488EB42B
-699CE8F68E943B035FA1F378E5621BCC00C810163737632CAB6826161D90448F
-3403C32EB1B52D7FB65149EED419A765D56A05FE6A2706D998DBC84125D617A3
-37351C9C547ABB6F1AB4FADEA5A265AF4D9B45BEC4147B6CC5110251A426350E
-60F3172C40805292170B850FB347DD98793AFB38E475AD2BF38F8628987E3F50
-651114D1527F030ADA4D61944E677977BB8EEE0C1EF98679246CB1D43403311F
-5F09BCB30445487F82ED268577F22479EFE87DD0022D42D3328990B88601C3A0
-D5A8389C4578C3DA01F653EEF9EB5D83A98A6939320FCD6F5B6A5A60FADBBCD7
-E5A7DE5A95D1CC7DCF5A051C652B767FCBC59D61AB9FB5141F393F2028879995
-4AB737BD26D81232CA8D64DAFF989F878537C305BB5C09889235BE3727BDEE32
-EC5A4D06A68746CA33CCED3F1D456DFF0118E993C802AF0C3136FDA8B93BC16C
-E22A5C124972517594A82850CDC000F6505A7C5AE9E75800EFEC3815C130EE25
-547A326325271049D9B178E23FC5FDE8880CDA9C903EB4B8A44F85620465FF4A
-D097A6D89A8B644E7D9944E180A3E1EC6D2581715EADFBF3C2BE3B330B1D208F
-B84C4B98E999C5684E9843E6AA2F932D1813DAF4931D12AF17FD2CB2387751D2
-5D14CEA4C66C48C7E6FD61BA6D09E591188E7CFC0F5C306672481FC77B5C6D84
-F589673C4F4EE90E2D3D1345196A10907A22585E7D55A9620FD7D191956DF340
-4C98AB5A8A3D98798F2581D409FBACC2419A031666DC9967DD10A1A565A98672
-BDCDD345FCEC9BC08698949C887E90EAF94B7CB450A9C45FCCF289DEF3380309
-D7644EF509BCFF5628ED51E056FD7848A2A36E30551E13B2A2921AE2028B2C4D
-902F7C901BC54F945AA1AA018EBA00AB9A2FB36159147C74880C06A26092B54C
-D3E6DD432A3507FA11384F0C08C68942C26ADD98DBE948D854199B19B0421687
-7FC55F9284AF035C5C9DB4269FE72FB251030F9A5A31A75FBBB0DBB1151EC785
-08F8CD88D6FD5A700AC0F6E0F37536C2F1228052846C3ADF9DDB7D56A57F19C1
-B8382EB996D8FECE8F8B130B89037F9FD4D58426049F99B840F337BE6A9427DE
-B68BA69B32A301263F8881F35332FF35ED6BC15FBD4A8915C8CC37839BE3944E
-A15701B8FABC6D533FF5D8C96B1D599DF7E2738996520A0702307E3C91A476E5
-C76AA881695D7400238B4EDC669BE334B84A66B9427432A3AB970D55A899DFCC
-81F7C68D637F77121B75C0D6C073CD14A7311799CAD07684A5C0F662CB10CF9B
-FDC4CB98B6E7892BFE731360E35AD6008F8154E419FE86FCAB0264173127B1C7
-92D6DAC832571CB2771F9EBF2486F61FBA0D94DBF0795D5653EDBA2F7441B683
-C3E77B314D02C049282E7B749B80C326DE8DA52D632A1A9C3C84198785161129
-D527239F456F6FA14CC264ACA06DCDF408278CF105A3786073709E365A85BBA4
-74A20C47CF495A0913CE079F33B71BAAE3928C18D59B2DB6A38E54EAD9FB87B4
-EA6D147D264E48E665A4DFB466A948811DE66770B0774C80BC2C54EB7452017A
-52AC312508C6FB6A4DE3570A3DF50EB00540003382B91E06067A3D11E1DDC023
-5EF8787F1F1015152BE7F3D5F88EDE778E946768E4E333288F4DE66D604822A7
-5F2D5069B6CAB613145652E07F608A093645EB6DA6A9B231EB5EB31C097354B4
-AF54E8AF3455011E51ECC74FEB9847FEE3C42DB441DC3E39DC1650E80BB2D530
-823B1246699B391341E7D7BBE42DE15092EE2FACECE3B8290FBFE4567E4E3B09
-973088770EC250F55AB5FB3E7ECC7537909622252E7967AE84368FE204800BC5
-6C51A8DBB2DF121FD04225015DB5A39A1D6241C9874215D115A58D8329E752B4
-D5CE3B1BE30D1703A044BA14B6C71F406733E771E8F9FC662C6DDEE86BAB4F68
-DAFB63D8870938C3149CC07F6660AEC0296885F64905B8BC82B317DE4DD729C9
-5989533686291EE980EA2470794FB3DEBEBE9E41F9BD793CE4DE37D9821D44EF
-803651668599D59FA7D44526F67C73C954BBB28BB25BF8606340755D02B23C42
-094CEF3CD30B04B9AE08FCDAC339FC1A9DD2008B0FF3C1F68C328541FDE6FBA9
-98DE24C4C3B3FC7D3B0D86FE89B6716E57BF46CB201F6A5EF73F05444D024D34
-639BA30B6D6F1A25D7CDB89D79FFD826663A3DCE5E9F4C72F06DD6C32A34CD22
-A7A1B7E3CD27707F4F09EAF284ACB3D960A530D4932D08028CFEB3AFC2D59170
-730ECD5D19B4D23108944CB7649AB0F1F3C286863A6A34A964A879D63CE05F1D
-FC11C5B69374F1993DCCFFC99D0E597C3BC99DE67E5059FF0672F79938F4CC4E
-4C66D6DCB0239444F2E614D09692297C7329411AA1CD5A540F9D61EBE2AF8B58
-DF46F4065672539C326B50BA1CB54DE5603D0799534ED0BE40AD5C72B4EBEF40
-A5EEBD414F1639AB6C955557FF9BAA0B62DBD32895B0DE12FDB66694F3CABABD
-7D54F0B29F8EA32CE746B652CC9E44EA64C3F8847053D8E50CE044C990A7BA13
-7B1B0F4B2FA68D08A82C30E800F8B26CC84495B222ABB5E41824953315CE7F22
-6D8FB5AA10A3EAE16A1B5BA8A283854C5A1735D5F628DB64C8DA6E51C727EA1E
-C3CF188BBE2473E9112529AA6A8DA151DBABCC26973531DD69B4A14D9783FF33
-FCD1672B629CD4DAB4EF573DFE9C3BC550C446A34940BE4437F43CCD16CFA3C0
-537ECBB7DCE1E76D9FCC2EA5E9E5656F7C7A3FE1611BA6A8AFF0667450A4A8CE
-0706CDF854B4DEA79C5FC25A0556F44CA3593E89ED5881ECB5BB3EE6572F8F2D
-4D31466C9AC2350898349C3208636F43D1EBF5BB2F01DCF827AD6C205F3B381F
-800D5F4B827107AC881BD66BF5CEED3205535C8C3704A02614E6233344667C48
-570C4B5A3326D2F58A6111AC9B0CA7F3A48DEC898FD5AA05929492B8FF061E1C
-990E08AADA5E9711658E30F71BA41A7806BEB51BE0949777E1550F54C66B8AFF
-DF4129B42B71DE6101C57DAFA63FAA169145C0D6A0D6279658431E874C32250B
-AB0B09056CF7A096E7E644B5B629F275194CB0CCEFC7A802F123A587156AB136
-513A7362EFC4C0EC330E11C3E25B9A943D2BDFDC1EA5C19DA64B47E690C2726A
-0C0708F7A1DB146B80C6E8B4D30D28F6E8B7A7505EAC296258485AFF374652EF
-ED73EFC04C6CFD28890F035DBB7A0CFCECE8AA68FA622390B782E595D4157106
-802499D76B0351617B5CDFF4F7F758DAD993DB5628B346240DF540E821144C5B
-D7FAC2C00B22D8DD374C6FED26F619FF150AA2292A9D03AC7F5F6A20B3283890
-C80DB07E6923B6C485819A849BA8A3F18F7B4D309802AB3D489587721417A2DD
-0B1A4D9994E3C611E3289465E657939EC06D752330EDD2D475E67F345C3527BF
-0175182934D53176D5877D064F6FE1C1D559DC657E4C2CC83FB022A38E6E406F
-E8F85B556F9A771F4DDA35AAE7C76DE0CCF5C2A9D9F4AC946C1A836553D792C3
-F2F8FEFF9A6D7DAB2FA5F0C9973FF8E3206680D96ACF9CAF54FB6274B99E3F9D
-7E2B64C85EFDE220C15BF9F4AB5CB772197464078AE34FFEA9095DDBE6B0EFE7
-4AFCCEA58D12EB46648093EF927A8E600F0D4E239BCDDE8DD5AB6A651018E932
-746F18584378B3B4899B6E5E7B3C742835BBDE2D9271AA95E1E1C714F51B8D08
-562CFF8AC79F495578993955611AD98303AAD37FEA8CF9AF63543C1B4DC0281E
-1269CECEAE77D660AB8800EAF547ADA30278345A189EB7CE9B03B936F3511496
-84E87A395C9012C66EE994141779E4282AE968FFC1E764C45751CCB23049BEED
-069E6AC75A8CA8D115B4C269C8E6EB3047E0A17251D46D389F43809423BC2A8D
-1730A54F8ED38019DDC4BC752539AA8FE9514EBC42F74FC8B50A850D09829810
-4CF7546878A85B8A9CCCFC866B5C30E1E5295E50D2E05F02B414B04830756970
-09BE8D4898B2CB6D2E95FA6890A620DD863B30C1EC77C08AFA711EF6C0D45878
-2E93BB6E2B4B44A5D24C55C22E6D58E4AE93A566B5545783E1B54B937D68BF21
-45A1CFA44CA87DBCEC8EF7A309015EB883D14BFD9DC89DF814697740C100B0E2
-1A5DD11DEE47681B153C4CFA026451660213253618E16F5C3B2D590363786BF0
-83E23B438E0FE85597F74C40611C5D3BB944108416AE0960432B8E59D8B64197
-81DAC51D615971E976768826B90CE2C563E498B8EE3A2D28546814F3D7E6DA78
-217C56ABD4CD323029CDB3C01B1885A9E12D5F92E773F31B50E2DC680708B37A
-F234AB215B75DE93E7912E20DC4937EBE1208B476DD8BCF68F115B72FA76AF8B
-B14AAC4AC7097D55B469262970369AC25526BDF3EFA81563066A37A4A71C19C2
-27611CF279C483B6C0CDE8B302C531E8F776CD557D91F348494088D6AC9CBD93
-7D0935EB5CE4C558247EFE669A39C56DC5F683337235E405BDB83CCAC1EA995A
-7E437ADB4B9576683D8E6776830D570699D696B0C233BDA475B1909197F57B04
-92A0A6F9D72F4E8A56A71CC7F4729C06A5C4F9915FBA4857276A50D2A4B857D5
-3F20433EB0098D714E526D288CB0F36B88B989FF98EAA2AC2FD44DE6E0159E98
-341459E97C035442EE8974C465ED07924FE76933E6C6B2D0D632EFE2FDCEDF92
-6D1B58D9266F961916E0B21C7EDA8533638DE541728C38225C8EDBA3DF56D9DF
-7CEE29D9EF955215974AB20AC024439A3730BA9227B1DBDABAA2D83443CC2F57
-21F0ADCFB8C2AF6FC327F9AB05C646C7BBFF81F3C3DAD7840CB477A2584695AC
-45BA0AB785FF4C993900136B6139E4D26B5EABF1BF17A80C6370CC2BC3540A0E
-4A4914C8F61A9608DE06BC8DABAB1492482AE665460981F4258B05E8F3A197C5
-30350BEA2DC89BA16224E570290845A6C7096C0C7707DAECFC85F9C853B8D65A
-616E3323082033D542C13FCB10BCBDA0BA71445145A511641BD12B35AB5D8E74
-11D5EFEDE88EF9392103EC087932CF217CB44935FC6F99353CEC68F814950518
-EF919470486379FD02265F766244436BD290C65600D964044989C7F6A9672EF7
-803021A9E4AA6818125000EAE5F90D382AAE0908A26FC6083A90B88FEEC0746A
-9F008C010CA98EEA7AAEA307037D2CA7200CA9BB68916CCAAB05E57FE7164A7D
-C3D820303340D49EB29E6EF22A023F2D42D67A664F38C4FBDFC9A31A28A02145
-E38CC211BC73DF5F661EE9A3CAA076E43EB233583865289F66A7ACBE315AF81B
-AFA2CFDE8A20549941EAE2E73E33BD0EB8D075F492724BC444FE8953F5F77B2B
-4E7378CE552F79C360EEBA56B64CAA47DF10D14402EBEDFFF7069444AE3EBE3A
-E96201E14EF892868F9AA982E738DCFE7E8DBE41C8F43A227EFC9EED795F5D6B
-40D3A08D867F363232B20C71CF2E44B884A8CF28D96A028BE7C67DE00765793A
-B1C867F0DF3E1D578D96428CF1E66632EB746C4B71314D5D009BEC8CA52A7518
-89B9255BDF988262A4BAF717FAB90525C81C223D4936F0AEE0E40908CC9E0DF3
-17AD71C0F5009CA00E1E6F8CD308501356235F63CB112C6760963857B6B20A94
-7FC16C899A7EA6743267F889D070698554DECE912C6052E04DF59FC85E67561B
-3C7345EA3E21DB7206A14EAC4F46F457A83C1E2877B56EC49EF87B9B363F4B77
-BB6F51C3F1454325010AD71E28E935E74924A6ADA4A08C6C723276CBD4DA333E
-C3590B7FB914E25828CEAC502704BB4C8C0C64395EED986F91D8C940D3F0ADEF
-1F2749400B4D9A8BEA50CF4732DCBE21A6BA4DC17762BABC34DFA16EBF988574
-6B6363A6075CD4784CB799E35D29425D55AF001F51E565FCF4D18E98EF3C94C8
-5B88BC96A9157BED2529803EDE8E42BB57FD504764175EAED257D6E62CF9A17F
-3E08727A38A0A43221BD62CBC2818ED5DDABD2E2FA6141D986229528AAEE7C73
-532A8D78FB8FDF433022F0EA43B63EEC52D3829E84AF010A2A19742296D91415
-42F9E632FFB3F0D8457AF426F0CA3B9A1D56DABD0537C9B5A9CA82E42A647CF9
-BA8D38F49445387AC896F16D85708BD8CE4BAA625EA09621EC17FD1A1377807E
-DD68854483E84C181532D3B70680773CFE5D580712FD948F5D34354394D4E502
-6AD35AB042519E82177E06284CCAE4AF2C6D918FB32DFF205E9D9C88E31143FC
-66DC0572961089CD0F2AD2EF82CF204E8AAB1F0122130232ACE276B134A9BB0E
-91FF8020FBF69B32C93F1C10026F6B2E1D40796313D974E066BF799311595012
-59886A161B669C22EFD773802ED9321BE23DFC3240D170BE8499E1735623A130
-054EB5EC958884699867E3C94FFE49CBC9AD6C3C935E56C0712CDEB13BA92E2A
-AA843CD9A30BA3C01ECC284DA4AEE6689A1A9E3D7D0F6A144C658F9441E730FC
-24831893520FB7D2C69104E56D5D49DD6A86152C9BFE88F6166104AEF80B992D
-406205CEA63C31A7B46D6B8C9A1782A0A0A30DD52066642554735406851F863B
-BF981B4C8DC4882A03BCB160A06D18D72E61A49A23163BF92D091C35CEE0CB85
-04E3D95F3E98CBCC53B0015AD136FC481078ECF65B62EDD8EA3EF1B938119D10
-36D6D85412D1104BFAD6A4589C17B40EEEC5C3FC90933D9095B49A6956CF9F61
-E54384137A39A509200B0E51C1625CB599A91B287744677E059E6BA039B6146E
-791EAE2676D2E233F2659C92A10D32A055935A193D4480B4E7069D3DDEEAC166
-1D24FE041BDD02D1A84CD43C43331AFE821B4ACC22F165DC53890D66606FA10C
-B83E2BBA03C826B958FA79C31E081B5396297013A70E1FE82E76C8512402EAE6
-840E5943B19623473FF8F215D6332EC26D1DD0760142E4296287F98A30CB2A82
-8A639137E8BB018AE16F54FFB9100F533587B4812B5A7EBB0C2DD22D20F1B55B
-D241DAA8614240F2B528CD48CD2F71496F181A94F181F7E85D07E4180CEFAB87
-57090401893BD680891ED7E7C9218409DD4995F3DF56E77F79CD06B9207328C1
-1427488F5876672E3806D8B8E0BB95AABA421B6629EA9A5A5FC811D43209610B
-F729AA30565DC4C4A2CA67721FF1F87A4C4B26BBFB2B68766840DD148024FB21
-F2750EFD0F31FE624CAC5D606B6C14C15B1FD7D4DFF182F436399C19F22C9F57
-F243086E319BFFD7412871031E5226D494B41EB70093103C606ACD02F6B2737A
-31C6DC7E3617F617471C37861161C799646C1CF8B60E9A5366C3A9EA785ADFE5
-2AA75D252775300DDF7F463E15FF6EAD513BC042837243F8514AF04586F5E451
-AEAA68E3C96574415497576D010A6D68148DE883083070DAD871E8F151C1C1F2
-2E82F50EEDEE298EE66699BADAA6677586F59AE3DA5038F513FDCFD7978B2829
-794271AD63CA26EA8970DCA4F32B57C09799C9B8D78BFBC50FD36A3F3F254799
-B313915C9640A27AF3530C68FA3053AEF80B2659AD152CAC44BEFDCA211EFD6B
-1DC6A25A08183879CDB74DD95EE2779416C0B3EA306720FABA153F3BD94B0DC2
-A429050A7D6B7B5A54C2AF4F45194667C3CF2EC4014444717DC6C7100035C504
-216661A97B632FA32FC1E021AFB75B395ABF844C558122C416F3CAB82B4ED56F
-15589E9F34CCB7C0C7F7B5FBBF48169105355F6EFF2F41A212C24A81BB9A466C
-598B921E0CF721A525187BC75CB3B2DE6A94205517B2CAA504F351BA0DC5C26A
-28CF5AC9DF3C81B888AA3C930DE00DA50DB0422A0D85A00C7E2AE3061E1E17DA
-55B3E3C998466DB8337E81059214406CC58CC1C204EB3D435C50B52E14B91905
-CC33F6D9C78342EBDD3033EB6A8D41530105CDB05B2E67606A022D366284CEC8
-6BB9FF090261A42EDE521B2BD2D955050F3BD2EDE7976A68F17F889943C369FD
-564CC15CC19D082B2EF4FDCB95E835A0CA799B4F8B68215006ECC332955837F1
-9118D86E07EA5D7815F66D3907EFAC1A2B76845B90B1D385EB08434B5DB96FC0
-59A97A94E4C21015EE22E04BA4A962F5ED4BF157A6
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/micro_40_50.qpf b/lib/fonts/micro_40_50.qpf
deleted file mode 100644
index eae4a5bc80..0000000000
--- a/lib/fonts/micro_40_50.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/unifont_160_50.qpf b/lib/fonts/unifont_160_50.qpf
deleted file mode 100644
index 2288575d78..0000000000
--- a/lib/fonts/unifont_160_50.qpf
+++ /dev/null
Binary files differ
diff --git a/mkspecs/blackberry-armle-v7-qcc/qmake.conf b/mkspecs/blackberry-armle-v7-qcc/qmake.conf
deleted file mode 100644
index 8280d77a96..0000000000
--- a/mkspecs/blackberry-armle-v7-qcc/qmake.conf
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# qmake configuration for blackberry armle-v7 systems
-#
-
-load(qt_config)
-
-DEFINES += Q_OS_BLACKBERRY
-QMAKE_PLATFORM += blackberry
-LIBS += -lbps
-
-# Blackberry also has support for stack smashing protection in its libc
-contains(QT_CONFIG, stack-protector-strong) {
- QMAKE_CFLAGS += -fstack-protector-strong
-} else {
- QMAKE_CFLAGS += -fstack-protector -fstack-protector-all
-}
-
-QMAKE_CFLAGS += -mcpu=cortex-a9 -mtune=cortex-a9 -mthumb -D_FORTIFY_SOURCE=2
-
-QMAKE_LFLAGS_SHLIB += -Wl,-z,relro -Wl,-z,now
-
-include(../common/qcc-base-qnx-armle-v7.conf)
diff --git a/mkspecs/blackberry-x86-qcc/qmake.conf b/mkspecs/blackberry-x86-qcc/qmake.conf
deleted file mode 100644
index c0561694cb..0000000000
--- a/mkspecs/blackberry-x86-qcc/qmake.conf
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# qmake configuration for blackberry x86 systems
-#
-
-load(qt_config)
-
-DEFINES += Q_OS_BLACKBERRY
-QMAKE_PLATFORM += blackberry
-LIBS += -lbps
-
-# Blackberry also has support for stack smashing protection in its libc
-contains(QT_CONFIG, stack-protector-strong) {
- QMAKE_CFLAGS += -fstack-protector-strong
-} else {
- QMAKE_CFLAGS += -fstack-protector -fstack-protector-all
-}
-
-QMAKE_LFLAGS_SHLIB += -Wl,-z,relro -Wl,-z,now
-
-include(../common/qcc-base-qnx-x86.conf)
diff --git a/mkspecs/common/g++-base.conf b/mkspecs/common/g++-base.conf
index 4254551994..c42c46b0ec 100644
--- a/mkspecs/common/g++-base.conf
+++ b/mkspecs/common/g++-base.conf
@@ -27,10 +27,10 @@ QMAKE_CFLAGS_USE_PRECOMPILE = -include ${QMAKE_PCH_OUTPUT_BASE}
QMAKE_CXXFLAGS_PRECOMPILE = -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
-QMAKE_CXXFLAGS_CXX11 = -std=c++0x
+QMAKE_CXXFLAGS_CXX11 = -std=c++11
QMAKE_CXXFLAGS_CXX14 = -std=c++1y
QMAKE_CXXFLAGS_CXX1Z = -std=c++1z
-QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++0x
+QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11
QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y
QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z
QMAKE_LFLAGS_CXX11 =
diff --git a/mkspecs/common/gcc-base.conf b/mkspecs/common/gcc-base.conf
index 27e812b3a1..6e043f558f 100644
--- a/mkspecs/common/gcc-base.conf
+++ b/mkspecs/common/gcc-base.conf
@@ -86,6 +86,15 @@ QMAKE_CFLAGS_SSE4_1 += -msse4.1
QMAKE_CFLAGS_SSE4_2 += -msse4.2
QMAKE_CFLAGS_AVX += -mavx
QMAKE_CFLAGS_AVX2 += -mavx2
+QMAKE_CFLAGS_AVX512F += -mavx512f
+QMAKE_CFLAGS_AVX512ER += -mavx512er
+QMAKE_CFLAGS_AVX512CD += -mavx512cd
+QMAKE_CFLAGS_AVX512PF += -mavx512pf
+QMAKE_CFLAGS_AVX512DQ += -mavx512dq
+QMAKE_CFLAGS_AVX512BW += -mavx512bw
+QMAKE_CFLAGS_AVX512VL += -mavx512vl
+QMAKE_CFLAGS_AVX512IFMA += -mavx512ifma
+QMAKE_CFLAGS_AVX512VBMI += -mavx512vbmi
QMAKE_CFLAGS_NEON += -mfpu=neon
# Wrapper tools that understand .o/.a files with GIMPLE instead of machine code
diff --git a/mkspecs/common/msvc-desktop.conf b/mkspecs/common/msvc-desktop.conf
index eec9e1f688..1b9d57bff0 100644
--- a/mkspecs/common/msvc-desktop.conf
+++ b/mkspecs/common/msvc-desktop.conf
@@ -35,11 +35,18 @@ QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi
QMAKE_CFLAGS_DEBUG = -Zi -MDd
QMAKE_CFLAGS_YACC =
QMAKE_CFLAGS_LTCG = -GL
-QMAKE_CFLAGS_SSE2 = -arch:SSE2
-QMAKE_CFLAGS_SSE3 = -arch:SSE2
-QMAKE_CFLAGS_SSSE3 = -arch:SSE2
-QMAKE_CFLAGS_SSE4_1 = -arch:SSE2
-QMAKE_CFLAGS_SSE4_2 = -arch:SSE2
+
+contains(QMAKE_TARGET.arch, x86_64) {
+ # SSE2 is mandatory on 64-bit mode, so skip the option. It triggers:
+ # cl : Command line warning D9002 : ignoring unknown option '-arch:SSE2'
+ QMAKE_CFLAGS_SSE2 =
+} else {
+ QMAKE_CFLAGS_SSE2 = -arch:SSE2
+}
+QMAKE_CFLAGS_SSE3 = $$QMAKE_CFLAGS_SSE2
+QMAKE_CFLAGS_SSSE3 = $$QMAKE_CFLAGS_SSE2
+QMAKE_CFLAGS_SSE4_1 = $$QMAKE_CFLAGS_SSE2
+QMAKE_CFLAGS_SSE4_2 = $$QMAKE_CFLAGS_SSE2
QMAKE_CXX = $$QMAKE_CC
QMAKE_CXXFLAGS = $$QMAKE_CFLAGS
diff --git a/mkspecs/common/qcc-base-qnx.conf b/mkspecs/common/qcc-base-qnx.conf
index 156ba0ddd8..7101435cb5 100644
--- a/mkspecs/common/qcc-base-qnx.conf
+++ b/mkspecs/common/qcc-base-qnx.conf
@@ -21,7 +21,7 @@ QMAKE_LFLAGS_BSYMBOLIC_FUNC = -Wl,-Bsymbolic-functions
QMAKE_LFLAGS_DYNAMIC_LIST = -Wl,--dynamic-list,
QMAKE_LFLAGS_VERSION_SCRIPT = -Wl,--version-script,
-# Generic options for all BlackBerry/QNX qcc mkspecs
+# Generic options for all QNX qcc mkspecs
QMAKE_CFLAGS_THREAD = -D_REENTRANT
QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
QMAKE_COMPILER_DEFINES += __QNXNTO__
@@ -45,7 +45,7 @@ QMAKE_INCDIR = $${QNX_DIR}/usr/include $${QNX_DIR}/usr/include/freety
QMAKE_LIBDIR = $${QNX_DIR}/$${QNX_CPUDIR}/lib $${QNX_DIR}/$${QNX_CPUDIR}/usr/lib
QMAKE_LFLAGS += -Wl,-rpath-link,$${QNX_DIR}/$${QNX_CPUDIR}/lib -Wl,-rpath-link,$${QNX_DIR}/$${QNX_CPUDIR}/usr/lib
-QMAKE_CXXFLAGS_CXX11 = -Wc,-std=gnu++0x
+QMAKE_CXXFLAGS_CXX11 = -Wc,-std=gnu++11
QMAKE_CXXFLAGS_CXX14 = -Wc,-std=gnu++1y
QMAKE_CXXFLAGS_CXX1Z = -Wc,-std=gnu++1z
diff --git a/mkspecs/devices/linux-imx53qsb-g++/qmake.conf b/mkspecs/devices/linux-imx53qsb-g++/qmake.conf
index 39462d83d9..8572978cb6 100644
--- a/mkspecs/devices/linux-imx53qsb-g++/qmake.conf
+++ b/mkspecs/devices/linux-imx53qsb-g++/qmake.conf
@@ -11,7 +11,7 @@
# export PATH=/opt/imx53qsb/x86_64-linux/usr/bin/armv7a-vfp-neon-poky-linux-gnueabi:$PATH
#
# ./configure -prefix /usr/local/qt5-imx53 -hostprefix /opt/imx53qsb/x86_64-linux/usr/local/qt5-imx53 -release -device linux-imx53qsb-g++
-# -opensource -confirm-license -no-gtkstyle -device-option CROSS_COMPILE=arm-poky-linux-gnueabi- -sysroot /opt/imx53qsb/sysroot
+# -opensource -confirm-license -device-option CROSS_COMPILE=arm-poky-linux-gnueabi- -sysroot /opt/imx53qsb/sysroot
# -eglfs -no-pch -opengl es2 -no-xcb -silent
include(../common/linux_device_pre.conf)
diff --git a/mkspecs/features/configure.prf b/mkspecs/features/configure.prf
index 6b37a04450..92c288cdb6 100644
--- a/mkspecs/features/configure.prf
+++ b/mkspecs/features/configure.prf
@@ -67,7 +67,9 @@ defineTest(qtCompileTest) {
mkpath($$test_out_dir)|error("Aborting.")
- qtRunLoggedCommand("$$test_cmd_base $$system_quote($$system_path($$QMAKE_QMAKE)) -spec $$QMAKESPEC $$qmake_configs $$shell_quote($$test_dir)") {
+ !isEmpty (QMAKE_QTCONF): qtconfarg = -qtconf $$QMAKE_QTCONF
+
+ qtRunLoggedCommand("$$test_cmd_base $$system_quote($$system_path($$QMAKE_QMAKE)) $$qtconfarg -spec $$QMAKESPEC $$qmake_configs $$shell_quote($$test_dir)") {
qtRunLoggedCommand("$$test_cmd_base $$QMAKE_MAKE") {
log("yes$$escape_expand(\\n)")
msg = "test $$1 succeeded"
diff --git a/mkspecs/features/device_config.prf b/mkspecs/features/device_config.prf
index e0383ef530..9281d3e407 100644
--- a/mkspecs/features/device_config.prf
+++ b/mkspecs/features/device_config.prf
@@ -1,16 +1,15 @@
# This file is loaded by some qmakespecs to get early configuration data.
-# Load generated qdevice.pri
-DEVICE_PRI = $$[QT_HOST_DATA/get]/mkspecs/qdevice.pri
+host_build: \
+ PRI_FILE_NAME = qhost.pri
+else: \
+ PRI_FILE_NAME = qdevice.pri
+DEVICE_PRI = $$[QT_HOST_DATA/get]/mkspecs/$$PRI_FILE_NAME
exists($$DEVICE_PRI):include($$DEVICE_PRI)
unset(DEVICE_PRI)
-host_build {
- CROSS_COMPILE =
-} else: isEmpty(CROSS_COMPILE) {
- #this variable can be persisted via qmake -set CROSS_COMPILE /foo
- CROSS_COMPILE = $$[CROSS_COMPILE]
-}
+# this variable can be persisted via qmake -set CROSS_COMPILE /foo
+!host_build:isEmpty(CROSS_COMPILE): CROSS_COMPILE = $$[CROSS_COMPILE]
# Provide a function to be used by mkspecs
defineTest(deviceSanityCheckCompiler) {
diff --git a/mkspecs/features/qml_module.prf b/mkspecs/features/qml_module.prf
index e71543e244..2115b39c04 100644
--- a/mkspecs/features/qml_module.prf
+++ b/mkspecs/features/qml_module.prf
@@ -13,7 +13,8 @@ equals(TEMPLATE, app): TEMPLATE = aux
isEmpty(TARGETPATH): error("Must set TARGETPATH (QML import name)")
-fq_qml_files = $$_PRO_FILE_PWD_/qmldir
+qmldir_file = $$_PRO_FILE_PWD_/qmldir
+fq_qml_files = $$qmldir_file
for(qmlf, QML_FILES): fq_qml_files += $$absolute_path($$qmlf, $$_PRO_FILE_PWD_)
@@ -25,6 +26,8 @@ qml1_target: \
else: \
instbase = $$[QT_INSTALL_QML]
+!qml1_target:static: CONFIG += builtin_resources
+
!force_independent:if(!debug_and_release|!build_all|CONFIG(release, debug|release)) {
# These bizarre rules copy the files to the qtbase build directory
@@ -32,7 +35,8 @@ else: \
return($$relative_path($$1, $$_PRO_FILE_PWD_))
}
- qmlfiles2build.input = fq_qml_files
+ !builtin_resources: qmlfiles2build.input = fq_qml_files
+ else: qmlfiles2build.input = qmldir_file
qmlfiles2build.output = $$instbase/$$TARGETPATH/${QMAKE_FUNC_FILE_IN_qmlModStripSrcDir}
!contains(TEMPLATE, vc.*): qmlfiles2build.variable_out = PRE_TARGETDEPS
qmlfiles2build.commands = $$QMAKE_COPY ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT}
@@ -42,8 +46,18 @@ else: \
QMAKE_EXTRA_COMPILERS += qmlfiles2build
}
+builtin_resources {
+ URITARGET = $$replace(URI, "\\.", "_")
+ # Ensure the qml files are included in the resources
+ $${URITARGET}.files = $$fq_qml_files
+ # qt-project.org/imports is the path used for locating imports inside the resources
+ $${URITARGET}.prefix = /qt-project.org/imports/$$TARGETPATH
+ RESOURCES += $${URITARGET}
+}
+
# Install rules
qmldir.base = $$_PRO_FILE_PWD_
-qmldir.files = $$fq_qml_files
+!builtin_resources: qmldir.files = $$fq_qml_files
+else: qmldir.files = $$qmldir_file
qmldir.path = $$instbase/$$TARGETPATH
INSTALLS += qmldir
diff --git a/mkspecs/features/qt.prf b/mkspecs/features/qt.prf
index c3448718b9..c041c306c1 100644
--- a/mkspecs/features/qt.prf
+++ b/mkspecs/features/qt.prf
@@ -235,7 +235,7 @@ contains(qt_module_deps, qml): \
}
QML_IMPORT_CPP = $$OUT_PWD/$$lower($$basename(TARGET))_qml_plugin_import.cpp
write_file($$QML_IMPORT_CPP, IMPORT_FILE_CONT)|error("Aborting.")
- SOURCES += $$QML_IMPORT_CPP
+ GENERATED_SOURCES += $$QML_IMPORT_CPP
QMAKE_DISTCLEAN += $$QML_IMPORT_CPP
# copy qml files. this part is platform spesific.
@@ -331,7 +331,7 @@ contains(QT_CONFIG, static) {
}
IMPORT_CPP = $$OUT_PWD/$$lower($$basename(TARGET))_plugin_import.cpp
write_file($$IMPORT_CPP, IMPORT_FILE_CONT)|error("Aborting.")
- SOURCES += $$IMPORT_CPP
+ GENERATED_SOURCES += $$IMPORT_CPP
QMAKE_DISTCLEAN += $$IMPORT_CPP
}
}
diff --git a/mkspecs/features/qt_common.prf b/mkspecs/features/qt_common.prf
index 38602f642d..07300842a0 100644
--- a/mkspecs/features/qt_common.prf
+++ b/mkspecs/features/qt_common.prf
@@ -44,6 +44,21 @@ contains(TEMPLATE, .*lib) {
QMAKE_PRL_INSTALL_REPLACE += lib_replace
}
+# Extra warnings for Qt non-example code, to ensure cleanliness of the sources.
+# The block below may turn these warnings into errors for some Qt targets.
+# -Wdate-time: warn if we use __DATE__ or __TIME__ (we want to be able to reproduce the exact same binary)
+# -Wvla: use of variable-length arrays (an extension to C++)
+clang {
+ # Clang 3.5 introduced -Wdate-time
+ # The conditional assumes we aren't compiling against Clang 2.x anymore
+ greaterThan(QT_CLANG_MAJOR_VERSION, 3)|greaterThan(QT_CLANG_MINOR_VERSION, 4): \
+ QMAKE_CXXFLAGS_WARN_ON += -Wdate-time
+} else: gcc:!intel_icc {
+ QMAKE_CXXFLAGS_WARN_ON += -Wvla
+ # GCC 5 introduced -Wdate-time
+ greaterThan(QT_GCC_MAJOR_VERSION, 4): QMAKE_CXXFLAGS_WARN_ON += -Wdate-time
+}
+
warnings_are_errors:warning_clean {
# If the module declares that it has does its clean-up of warnings, enable -Werror.
# This setting is compiler-dependent anyway because it depends on the version of the
diff --git a/mkspecs/features/qt_module_headers.prf b/mkspecs/features/qt_module_headers.prf
index 892a9a2c4b..a2adc19c4c 100644
--- a/mkspecs/features/qt_module_headers.prf
+++ b/mkspecs/features/qt_module_headers.prf
@@ -96,7 +96,7 @@ headersclean:!internal_module {
-DQT_NO_URL_CAST_FROM_STRING=1 \
-DQT_NO_CAST_FROM_BYTEARRAY=1 \
-DQT_NO_KEYWORDS=1 \
- -DQT_USE_FAST_CONCATENATION \
+ -DQT_USE_QSTRINGBUILDER \
-DQT_USE_FAST_OPERATOR_PLUS \
-Dsignals=int \
-Dslots=int \
@@ -124,7 +124,8 @@ headersclean:!internal_module {
hcleanFLAGS -= -Wshadow
}
} else {
- hcleanFLAGS += -Wchar-subscripts
+ # options accepted by GCC and Clang
+ hcleanFLAGS += -Wchar-subscripts -Wold-style-cast
!contains(QT_ARCH, arm):!contains(QT_ARCH, mips): \
hcleanFLAGS += -Wcast-align
diff --git a/mkspecs/features/qt_tool.prf b/mkspecs/features/qt_tool.prf
index 839c3d6b88..bdeb59c83d 100644
--- a/mkspecs/features/qt_tool.prf
+++ b/mkspecs/features/qt_tool.prf
@@ -17,36 +17,45 @@ DEFINES *= QT_USE_QSTRINGBUILDER
# If we are doing a prefix build, create a "module" pri which enables
# qtPrepareTool() to work with the non-installed build.
# Non-bootstrapped tools always need this because of the environment setup.
-!build_pass:if(!host_build|!force_bootstrap|force_independent) {
+!build_pass:if(!host_build|!force_bootstrap|force_independent|!isEmpty(HOST_QT_TOOLS)) {
isEmpty(MODULE):MODULE = $$TARGET
- !host_build|!force_bootstrap: MODULE_DEPENDS = $$replace(QT, -private$, _private)
-
load(qt_build_paths)
- load(resolve_target)
-
TOOL_PRI = $$MODULE_QMAKE_OUTDIR/mkspecs/modules/qt_tool_$${MODULE}.pri
vars = binary depends
- !isEmpty(QT_TOOL_ENV) {
- vars += envvars
- module_var_names =
- module_var_sets =
- for(var, QT_TOOL_ENV) {
- vars += env.$${var}.name env.$${var}.value
- module_var_names += QT_TOOL.$${MODULE}.env.$${var}
- module_var_sets += \
- "QT_TOOL.$${MODULE}.env.$${var}.name = $$val_escape($${var}.name)" \
- "QT_TOOL.$${MODULE}.env.$${var}.value = $$val_escape($${var}.value)"
+
+ isEmpty(HOST_QT_TOOLS) {
+ load(resolve_target)
+
+ !host_build|!force_bootstrap: MODULE_DEPENDS = $$replace(QT, -private$, _private)
+
+ !isEmpty(QT_TOOL_ENV) {
+ vars += envvars
+ module_var_names =
+ module_var_sets =
+ for(var, QT_TOOL_ENV) {
+ vars += env.$${var}.name env.$${var}.value
+ module_var_names += QT_TOOL.$${MODULE}.env.$${var}
+ module_var_sets += \
+ "QT_TOOL.$${MODULE}.env.$${var}.name = $$val_escape($${var}.name)" \
+ "QT_TOOL.$${MODULE}.env.$${var}.value = $$val_escape($${var}.value)"
+ }
+ module_envvars = \
+ "QT_TOOL.$${MODULE}.envvars = $$module_var_names" \
+ $$module_var_sets
+ } else {
+ module_envvars =
}
- module_envvars = \
- "QT_TOOL.$${MODULE}.envvars = $$module_var_names" \
- $$module_var_sets
+
+ bin = $$system_path($$QMAKE_RESOLVED_TARGET)
} else {
- module_envvars =
+ bin = $${HOST_QT_TOOLS}/$${TARGET}
+ equals(QMAKE_HOST.os, Windows): bin = $${bin}.exe
+ bin = $$system_path($$bin)
}
- bin = $$system_path($$QMAKE_RESOLVED_TARGET)
+
TOOL_PRI_CONT = \
"QT_TOOL.$${MODULE}.binary = $$val_escape(bin)" \
"QT_TOOL.$${MODULE}.depends =$$join(MODULE_DEPENDS, " ", " ")" \
diff --git a/mkspecs/features/resources.prf b/mkspecs/features/resources.prf
index 7a38ff8f38..1f04c8b0d7 100644
--- a/mkspecs/features/resources.prf
+++ b/mkspecs/features/resources.prf
@@ -49,9 +49,15 @@ for(resource, RESOURCES) {
for(file, $${resource}.files) {
abs_path = $$absolute_path($$file, $$_PRO_FILE_PWD_)
- alias = $$relative_path($$abs_path, $$abs_base)
- resource_file_content += \
- "<file alias=\"$$xml_escape($$alias)\">$$xml_escape($$abs_path)</file>"
+ files = $$files($$abs_path/*, true)
+ isEmpty(files): \
+ files = $$abs_path
+ for (file, files) {
+ exists($$file/*): next() # exclude directories
+ alias = $$relative_path($$file, $$abs_base)
+ resource_file_content += \
+ "<file alias=\"$$xml_escape($$alias)\">$$xml_escape($$file)</file>"
+ }
}
resource_file_content += \
diff --git a/mkspecs/features/simd.prf b/mkspecs/features/simd.prf
index 700d79a1b5..4aafdbe5ed 100644
--- a/mkspecs/features/simd.prf
+++ b/mkspecs/features/simd.prf
@@ -95,6 +95,47 @@ addSimdCompiler(sse4_1)
addSimdCompiler(sse4_2)
addSimdCompiler(avx)
addSimdCompiler(avx2)
+addSimdCompiler(avx512f)
+addSimdCompiler(avx512cd)
+addSimdCompiler(avx512er)
+addSimdCompiler(avx512pf)
+addSimdCompiler(avx512dq)
+addSimdCompiler(avx512bw)
+addSimdCompiler(avx512vl)
+addSimdCompiler(avx512ifma)
+addSimdCompiler(avx512vbmi)
addSimdCompiler(neon)
addSimdCompiler(mips_dsp)
addSimdCompiler(mips_dspr2)
+
+# Follow the Intel compiler's lead and define profiles of AVX512 instructions
+defineTest(addAvx512Profile) {
+ name = $$1
+ dependencies = $$2
+ upname = $$upper($$name)
+ varname = QMAKE_CFLAGS_$$upname
+
+ cpu_features_missing =
+ cflags = $$QMAKE_CFLAGS_AVX512F
+ for(part, dependencies) {
+ !CONFIG($$part): return() # Profile isn't supported by the compiler
+
+ uppart = $$upper($$part)
+ cflags *= $$eval(QMAKE_CFLAGS_$${uppart})
+ !contains(QT_CPU_FEATURES, $$uppart): cpu_features_missing += $$uppart
+ }
+
+ CONFIG += $$name
+ isEmpty(cpu_features_missing): QT_CPU_FEATURES += $$name
+ $$varname = $$cflags
+
+ export(QT_CPU_FEATURES)
+ export(CONFIG)
+ export($$varname)
+ addSimdCompiler($$name)
+}
+addAvx512Profile(avx512common, avx512cd)
+addAvx512Profile(avx512mic, avx512cd avx512er avx512pf)
+addAvx512Profile(avx512core, avx512cd avx512bw avx512dq avx512vl)
+addAvx512Profile(avx512ifmavl, avx512ifma avx512vl)
+addAvx512Profile(avx512vbmivl, avx512vbmi avx512vl)
diff --git a/mkspecs/features/testcase.prf b/mkspecs/features/testcase.prf
index 6bac0546c3..0340b7ed3c 100644
--- a/mkspecs/features/testcase.prf
+++ b/mkspecs/features/testcase.prf
@@ -103,11 +103,9 @@ isEmpty(BUILDS)|build_pass {
tnam ~= s,[?*],wildcard,
tnam ~= s,[^A-Za-z0-9],_,
tdi = testdata_$$tnam
- tdif = $${tdi}.files
- tdip = $${tdi}.path
# TESTDATA consists of the files to install (source)...
- $$tdif = $$file
+ $${tdi}.files = $$file
# ... and the destination preserves the relative path.
# Strip any leading ../ from the testdata, so that installation does not escape
@@ -123,7 +121,7 @@ isEmpty(BUILDS)|build_pass {
# and testdata in the build and install tree, but should cover most cases.
#
file = $$replace(file, ^(\\.\\./)+, )
- $$tdip = $${target.path}/$$dirname(file)
+ $${tdi}.path = $${target.path}/$$dirname(file)
INSTALLS += $$tdi
}
@@ -137,15 +135,12 @@ isEmpty(BUILDS)|build_pass {
tnam ~= s,[?*],wildcard,
tnam ~= s,[^A-Za-z0-9],_,
tdi = testdata_$$tnam
- tdif = $${tdi}.files
- tdip = $${tdi}.path
- tdic = $${tdi}.CONFIG
- $$tdif = $$file
- $$tdic = no_check_exist
+ $${tdi}.files = $$file
+ $${tdi}.CONFIG = no_check_exist
file = $$replace(file, ^(\\.\\./)+, )
- $$tdip = $${target.path}/$$dirname(file)
+ $${tdi}.path = $${target.path}/$$dirname(file)
INSTALLS += $$tdi
}
diff --git a/mkspecs/linux-icc/qmake.conf b/mkspecs/linux-icc/qmake.conf
index 57f6c45ac1..495fd15e80 100644
--- a/mkspecs/linux-icc/qmake.conf
+++ b/mkspecs/linux-icc/qmake.conf
@@ -35,6 +35,13 @@ QMAKE_CFLAGS_SSE4_1 += -xSSE4.1
QMAKE_CFLAGS_SSE4_2 += -xSSE4.2
QMAKE_CFLAGS_AVX += -xAVX
QMAKE_CFLAGS_AVX2 += -xCORE-AVX2
+QMAKE_CFLAGS_AVX512F += -xCOMMON-AVX512
+QMAKE_CFLAGS_AVX512CD += -xCOMMON-AVX512
+QMAKE_CFLAGS_AVX512ER += -xMIC-AVX512
+QMAKE_CFLAGS_AVX512PF += -xMIC-AVX512
+QMAKE_CFLAGS_AVX512DQ += -xCORE-AVX512
+QMAKE_CFLAGS_AVX512BW += -xCORE-AVX512
+QMAKE_CFLAGS_AVX512VL += -xCORE-AVX512
QMAKE_CXX = icpc
QMAKE_CXXFLAGS = $$QMAKE_CFLAGS
@@ -51,10 +58,10 @@ QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
QMAKE_CXXFLAGS_SPLIT_SECTIONS = $$QMAKE_CFLAGS_SPLIT_SECTIONS
# Disabling exceptions disabled - workaround for QTBUG-36577
#QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -fno-exceptions
-QMAKE_CXXFLAGS_CXX11 = -std=c++0x
+QMAKE_CXXFLAGS_CXX11 = -std=c++11
QMAKE_CXXFLAGS_CXX14 = -std=c++1y
QMAKE_CXXFLAGS_CXX1Z = -std=c++1z
-QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++0x
+QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11
QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y
QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z
QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
diff --git a/mkspecs/macx-icc/qmake.conf b/mkspecs/macx-icc/qmake.conf
index 70ea5ee80f..35e55f799e 100644
--- a/mkspecs/macx-icc/qmake.conf
+++ b/mkspecs/macx-icc/qmake.conf
@@ -33,6 +33,13 @@ QMAKE_CFLAGS_SSE4_1 += -msse4.1
QMAKE_CFLAGS_SSE4_2 += -msse4.2
QMAKE_CFLAGS_AVX += -mavx
QMAKE_CFLAGS_AVX2 += -march=core-avx2
+QMAKE_CFLAGS_AVX512F += -xCOMMON-AVX512
+QMAKE_CFLAGS_AVX512CD += -xCOMMON-AVX512
+QMAKE_CFLAGS_AVX512ER += -xMIC-AVX512
+QMAKE_CFLAGS_AVX512PF += -xMIC-AVX512
+QMAKE_CFLAGS_AVX512DQ += -xCORE-AVX512
+QMAKE_CFLAGS_AVX512BW += -xCORE-AVX512
+QMAKE_CFLAGS_AVX512VL += -xCORE-AVX512
QMAKE_CXX = icpc
QMAKE_CXXFLAGS = $$QMAKE_CFLAGS
diff --git a/mkspecs/win32-g++/qmake.conf b/mkspecs/win32-g++/qmake.conf
index 9cb811b5bf..73f1fb6201 100644
--- a/mkspecs/win32-g++/qmake.conf
+++ b/mkspecs/win32-g++/qmake.conf
@@ -56,10 +56,10 @@ QMAKE_CXXFLAGS_RTTI_ON = -frtti
QMAKE_CXXFLAGS_RTTI_OFF = -fno-rtti
QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions -mthreads
QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -fno-exceptions
-QMAKE_CXXFLAGS_CXX11 = -std=c++0x
+QMAKE_CXXFLAGS_CXX11 = -std=c++11
QMAKE_CXXFLAGS_CXX14 = -std=c++1y
QMAKE_CXXFLAGS_CXX1Z = -std=c++1z
-QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++0x
+QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11
QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y
QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z
QMAKE_CXXFLAGS_SPLIT_SECTIONS = $$QMAKE_CFLAGS_SPLIT_SECTIONS
diff --git a/mkspecs/win32-icc/qmake.conf b/mkspecs/win32-icc/qmake.conf
index 3b440d143f..c9f6748b6c 100644
--- a/mkspecs/win32-icc/qmake.conf
+++ b/mkspecs/win32-icc/qmake.conf
@@ -32,6 +32,13 @@ QMAKE_CFLAGS_SSE4_1 = -QxSSE4.1
QMAKE_CFLAGS_SSE4_2 = -QxSSE4.2
QMAKE_CFLAGS_AVX = -QxAVX
QMAKE_CFLAGS_AVX2 = -QxCORE-AVX2
+QMAKE_CFLAGS_AVX512F += -QxCOMMON-AVX512
+QMAKE_CFLAGS_AVX512CD += -QxCOMMON-AVX512
+QMAKE_CFLAGS_AVX512ER += -QxMIC-AVX512
+QMAKE_CFLAGS_AVX512PF += -QxMIC-AVX512
+QMAKE_CFLAGS_AVX512DQ += -QxCORE-AVX512
+QMAKE_CFLAGS_AVX512BW += -QxCORE-AVX512
+QMAKE_CFLAGS_AVX512VL += -QxCORE-AVX512
QMAKE_CXX = $$QMAKE_CC
QMAKE_CXXFLAGS = $$QMAKE_CFLAGS /Zc:forScope
diff --git a/qmake/Makefile.win32 b/qmake/Makefile.win32
index e61e9503f3..1e8c5129be 100644
--- a/qmake/Makefile.win32
+++ b/qmake/Makefile.win32
@@ -13,7 +13,7 @@ QMKSRC = $(SOURCE_PATH)\qmake
!if "$(QMAKESPEC)" == "win32-icc"
CXX = icl
LINKER = link
-CFLAGS_EXTRA = /Zc:forScope
+CFLAGS_EXTRA = /Zc:forScope /Qstd=c++11
!else
CXX = cl
LINKER = link
diff --git a/qmake/doc/src/qmake-manual.qdoc b/qmake/doc/src/qmake-manual.qdoc
index e59b0ddcbe..89ce3b3504 100644
--- a/qmake/doc/src/qmake-manual.qdoc
+++ b/qmake/doc/src/qmake-manual.qdoc
@@ -28,7 +28,7 @@
/*!
\page qmake-manual.html
\title qmake Manual
- \startpage {index.html}{Qt Reference Documentation}
+ \startpage {Qt Reference Documentation}
\nextpage Overview
\ingroup qttools
diff --git a/qmake/library/qmakeevaluator.cpp b/qmake/library/qmakeevaluator.cpp
index e220d59517..d7fba6b227 100644
--- a/qmake/library/qmakeevaluator.cpp
+++ b/qmake/library/qmakeevaluator.cpp
@@ -1000,6 +1000,8 @@ void QMakeEvaluator::loadDefaults()
vars[ProKey("QMAKE_QMAKE")] << ProString(m_option->qmake_abslocation);
if (!m_option->qmake_args.isEmpty())
vars[ProKey("QMAKE_ARGS")] = ProStringList(m_option->qmake_args);
+ if (!m_option->qtconf.isEmpty())
+ vars[ProKey("QMAKE_QTCONF")] = ProString(m_option->qtconf);
vars[ProKey("QMAKE_HOST.cpu_count")] = ProString(QString::number(idealThreadCount()));
#if defined(Q_OS_WIN32)
vars[ProKey("QMAKE_HOST.os")] << ProString("Windows");
diff --git a/qmake/library/qmakeglobals.cpp b/qmake/library/qmakeglobals.cpp
index 8bb5199519..ff59bdb303 100644
--- a/qmake/library/qmakeglobals.cpp
+++ b/qmake/library/qmakeglobals.cpp
@@ -109,7 +109,7 @@ QString QMakeGlobals::cleanSpec(QMakeCmdLineParserState &state, const QString &s
QMakeGlobals::ArgumentReturn QMakeGlobals::addCommandLineArguments(
QMakeCmdLineParserState &state, QStringList &args, int *pos)
{
- enum { ArgNone, ArgConfig, ArgSpec, ArgXSpec, ArgTmpl, ArgTmplPfx, ArgCache } argState = ArgNone;
+ enum { ArgNone, ArgConfig, ArgSpec, ArgXSpec, ArgTmpl, ArgTmplPfx, ArgCache, ArgQtConf } argState = ArgNone;
for (; *pos < args.count(); (*pos)++) {
QString arg = args.at(*pos);
switch (argState) {
@@ -134,6 +134,9 @@ QMakeGlobals::ArgumentReturn QMakeGlobals::addCommandLineArguments(
case ArgCache:
cachefile = args[*pos] = QDir::cleanPath(QDir(state.pwd).absoluteFilePath(arg));
break;
+ case ArgQtConf:
+ qtconf = args[*pos] = QDir::cleanPath(QDir(state.pwd).absoluteFilePath(arg));
+ break;
default:
if (arg.startsWith(QLatin1Char('-'))) {
if (arg == QLatin1String("-after"))
@@ -144,6 +147,8 @@ QMakeGlobals::ArgumentReturn QMakeGlobals::addCommandLineArguments(
do_cache = false;
else if (arg == QLatin1String("-cache"))
argState = ArgCache;
+ else if (arg == QLatin1String("-qtconf"))
+ argState = ArgQtConf;
else if (arg == QLatin1String("-platform") || arg == QLatin1String("-spec"))
argState = ArgSpec;
else if (arg == QLatin1String("-xplatform") || arg == QLatin1String("-xspec"))
diff --git a/qmake/library/qmakeglobals.h b/qmake/library/qmakeglobals.h
index de46ebbe74..87fc9d4b4e 100644
--- a/qmake/library/qmakeglobals.h
+++ b/qmake/library/qmakeglobals.h
@@ -112,6 +112,7 @@ public:
QString qmake_abslocation;
QStringList qmake_args;
+ QString qtconf;
QString qmakespec, xqmakespec;
QString user_template, user_template_prefix;
QString precmds, postcmds;
diff --git a/qmake/option.cpp b/qmake/option.cpp
index da59616e5c..1d1aece626 100644
--- a/qmake/option.cpp
+++ b/qmake/option.cpp
@@ -172,6 +172,7 @@ bool usage(const char *a0)
" -set <prop> <value> Set persistent property\n"
" -unset <prop> Unset persistent property\n"
" -query <prop> Query persistent property. Show all if <prop> is empty.\n"
+ " -qtconf file Use file instead of looking for qt.conf\n"
" -cache file Use file as cache [makefile mode only]\n"
" -spec spec Use spec as QMAKESPEC [makefile mode only]\n"
" -nocache Don't use a cache file [makefile mode only]\n"
@@ -642,6 +643,8 @@ qmakeAddCacheClear(qmakeCacheClearFunc func, void **data)
QString qmake_libraryInfoFile()
{
+ if (!Option::globals->qtconf.isEmpty())
+ return Option::globals->qtconf;
if (!Option::globals->qmake_abslocation.isEmpty())
return QDir(QFileInfo(Option::globals->qmake_abslocation).absolutePath()).filePath("qt.conf");
return QString();
diff --git a/qmake/qmake-aux.pro b/qmake/qmake-aux.pro
new file mode 100644
index 0000000000..33a7fbfd2d
--- /dev/null
+++ b/qmake/qmake-aux.pro
@@ -0,0 +1,11 @@
+option(host_build)
+TEMPLATE = aux
+
+# qmake documentation
+QMAKE_DOCS = $$PWD/doc/qmake.qdocconf
+
+# qmake binary
+win32: EXTENSION = .exe
+qmake.path = $$[QT_HOST_BINS]
+qmake.files = $$OUT_PWD/../bin/qmake$$EXTENSION
+INSTALLS += qmake
diff --git a/qmake/qmake-docs.pro b/qmake/qmake-docs.pro
deleted file mode 100644
index 3123f7c5d8..0000000000
--- a/qmake/qmake-docs.pro
+++ /dev/null
@@ -1,2 +0,0 @@
-TEMPLATE = aux
-QMAKE_DOCS = $$PWD/doc/qmake.qdocconf
diff --git a/qtbase.pro b/qtbase.pro
index 98ca86ad58..663ff8769d 100644
--- a/qtbase.pro
+++ b/qtbase.pro
@@ -4,7 +4,7 @@
load(qt_parts)
-SUBDIRS += qmake/qmake-docs.pro
+SUBDIRS += qmake/qmake-aux.pro
cross_compile: CONFIG += nostrip
@@ -37,15 +37,6 @@ CONFIG -= qt
### installations ####
-#qmake
-qmake.path = $$[QT_HOST_BINS]
-equals(QMAKE_HOST.os, Windows) {
- qmake.files = $$OUT_PWD/bin/qmake.exe
-} else {
- qmake.files = $$OUT_PWD/bin/qmake
-}
-INSTALLS += qmake
-
#licheck
licheck.path = $$[QT_HOST_BINS]
licheck.files = $$PWD/bin/$$QT_LICHECK
diff --git a/src/3rdparty/double-conversion/LICENSE b/src/3rdparty/double-conversion/LICENSE
new file mode 100644
index 0000000000..933718a9ef
--- /dev/null
+++ b/src/3rdparty/double-conversion/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2006-2011, the V8 project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/src/3rdparty/double-conversion/README b/src/3rdparty/double-conversion/README
new file mode 100644
index 0000000000..75d08df5fe
--- /dev/null
+++ b/src/3rdparty/double-conversion/README
@@ -0,0 +1,8 @@
+This is a copy of the library for binary-decimal and decimal-binary
+conversion routines for IEEE doubles, available from
+
+ https://github.com/google/double-conversion
+
+commit 2fb03de56faa32bbba5e02222528e7b760f71d77
+
+See the LICENSE file for license information.
diff --git a/src/3rdparty/double-conversion/bignum-dtoa.cc b/src/3rdparty/double-conversion/bignum-dtoa.cc
new file mode 100644
index 0000000000..f1ad7a5ae8
--- /dev/null
+++ b/src/3rdparty/double-conversion/bignum-dtoa.cc
@@ -0,0 +1,641 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include <math.h>
+
+#include "bignum-dtoa.h"
+
+#include "bignum.h"
+#include "ieee.h"
+
+namespace double_conversion {
+
+static int NormalizedExponent(uint64_t significand, int exponent) {
+ ASSERT(significand != 0);
+ while ((significand & Double::kHiddenBit) == 0) {
+ significand = significand << 1;
+ exponent = exponent - 1;
+ }
+ return exponent;
+}
+
+
+// Forward declarations:
+// Returns an estimation of k such that 10^(k-1) <= v < 10^k.
+static int EstimatePower(int exponent);
+// Computes v / 10^estimated_power exactly, as a ratio of two bignums, numerator
+// and denominator.
+static void InitialScaledStartValues(uint64_t significand,
+ int exponent,
+ bool lower_boundary_is_closer,
+ int estimated_power,
+ bool need_boundary_deltas,
+ Bignum* numerator,
+ Bignum* denominator,
+ Bignum* delta_minus,
+ Bignum* delta_plus);
+// Multiplies numerator/denominator so that its values lies in the range 1-10.
+// Returns decimal_point s.t.
+// v = numerator'/denominator' * 10^(decimal_point-1)
+// where numerator' and denominator' are the values of numerator and
+// denominator after the call to this function.
+static void FixupMultiply10(int estimated_power, bool is_even,
+ int* decimal_point,
+ Bignum* numerator, Bignum* denominator,
+ Bignum* delta_minus, Bignum* delta_plus);
+// Generates digits from the left to the right and stops when the generated
+// digits yield the shortest decimal representation of v.
+static void GenerateShortestDigits(Bignum* numerator, Bignum* denominator,
+ Bignum* delta_minus, Bignum* delta_plus,
+ bool is_even,
+ Vector<char> buffer, int* length);
+// Generates 'requested_digits' after the decimal point.
+static void BignumToFixed(int requested_digits, int* decimal_point,
+ Bignum* numerator, Bignum* denominator,
+ Vector<char>(buffer), int* length);
+// Generates 'count' digits of numerator/denominator.
+// Once 'count' digits have been produced rounds the result depending on the
+// remainder (remainders of exactly .5 round upwards). Might update the
+// decimal_point when rounding up (for example for 0.9999).
+static void GenerateCountedDigits(int count, int* decimal_point,
+ Bignum* numerator, Bignum* denominator,
+ Vector<char>(buffer), int* length);
+
+
+void BignumDtoa(double v, BignumDtoaMode mode, int requested_digits,
+ Vector<char> buffer, int* length, int* decimal_point) {
+ ASSERT(v > 0);
+ ASSERT(!Double(v).IsSpecial());
+ uint64_t significand;
+ int exponent;
+ bool lower_boundary_is_closer;
+ if (mode == BIGNUM_DTOA_SHORTEST_SINGLE) {
+ float f = static_cast<float>(v);
+ ASSERT(f == v);
+ significand = Single(f).Significand();
+ exponent = Single(f).Exponent();
+ lower_boundary_is_closer = Single(f).LowerBoundaryIsCloser();
+ } else {
+ significand = Double(v).Significand();
+ exponent = Double(v).Exponent();
+ lower_boundary_is_closer = Double(v).LowerBoundaryIsCloser();
+ }
+ bool need_boundary_deltas =
+ (mode == BIGNUM_DTOA_SHORTEST || mode == BIGNUM_DTOA_SHORTEST_SINGLE);
+
+ bool is_even = (significand & 1) == 0;
+ int normalized_exponent = NormalizedExponent(significand, exponent);
+ // estimated_power might be too low by 1.
+ int estimated_power = EstimatePower(normalized_exponent);
+
+ // Shortcut for Fixed.
+ // The requested digits correspond to the digits after the point. If the
+ // number is much too small, then there is no need in trying to get any
+ // digits.
+ if (mode == BIGNUM_DTOA_FIXED && -estimated_power - 1 > requested_digits) {
+ buffer[0] = '\0';
+ *length = 0;
+ // Set decimal-point to -requested_digits. This is what Gay does.
+ // Note that it should not have any effect anyways since the string is
+ // empty.
+ *decimal_point = -requested_digits;
+ return;
+ }
+
+ Bignum numerator;
+ Bignum denominator;
+ Bignum delta_minus;
+ Bignum delta_plus;
+ // Make sure the bignum can grow large enough. The smallest double equals
+ // 4e-324. In this case the denominator needs fewer than 324*4 binary digits.
+ // The maximum double is 1.7976931348623157e308 which needs fewer than
+ // 308*4 binary digits.
+ ASSERT(Bignum::kMaxSignificantBits >= 324*4);
+ InitialScaledStartValues(significand, exponent, lower_boundary_is_closer,
+ estimated_power, need_boundary_deltas,
+ &numerator, &denominator,
+ &delta_minus, &delta_plus);
+ // We now have v = (numerator / denominator) * 10^estimated_power.
+ FixupMultiply10(estimated_power, is_even, decimal_point,
+ &numerator, &denominator,
+ &delta_minus, &delta_plus);
+ // We now have v = (numerator / denominator) * 10^(decimal_point-1), and
+ // 1 <= (numerator + delta_plus) / denominator < 10
+ switch (mode) {
+ case BIGNUM_DTOA_SHORTEST:
+ case BIGNUM_DTOA_SHORTEST_SINGLE:
+ GenerateShortestDigits(&numerator, &denominator,
+ &delta_minus, &delta_plus,
+ is_even, buffer, length);
+ break;
+ case BIGNUM_DTOA_FIXED:
+ BignumToFixed(requested_digits, decimal_point,
+ &numerator, &denominator,
+ buffer, length);
+ break;
+ case BIGNUM_DTOA_PRECISION:
+ GenerateCountedDigits(requested_digits, decimal_point,
+ &numerator, &denominator,
+ buffer, length);
+ break;
+ default:
+ UNREACHABLE();
+ }
+ buffer[*length] = '\0';
+}
+
+
+// The procedure starts generating digits from the left to the right and stops
+// when the generated digits yield the shortest decimal representation of v. A
+// decimal representation of v is a number lying closer to v than to any other
+// double, so it converts to v when read.
+//
+// This is true if d, the decimal representation, is between m- and m+, the
+// upper and lower boundaries. d must be strictly between them if !is_even.
+// m- := (numerator - delta_minus) / denominator
+// m+ := (numerator + delta_plus) / denominator
+//
+// Precondition: 0 <= (numerator+delta_plus) / denominator < 10.
+// If 1 <= (numerator+delta_plus) / denominator < 10 then no leading 0 digit
+// will be produced. This should be the standard precondition.
+static void GenerateShortestDigits(Bignum* numerator, Bignum* denominator,
+ Bignum* delta_minus, Bignum* delta_plus,
+ bool is_even,
+ Vector<char> buffer, int* length) {
+ // Small optimization: if delta_minus and delta_plus are the same just reuse
+ // one of the two bignums.
+ if (Bignum::Equal(*delta_minus, *delta_plus)) {
+ delta_plus = delta_minus;
+ }
+ *length = 0;
+ for (;;) {
+ uint16_t digit;
+ digit = numerator->DivideModuloIntBignum(*denominator);
+ ASSERT(digit <= 9); // digit is a uint16_t and therefore always positive.
+ // digit = numerator / denominator (integer division).
+ // numerator = numerator % denominator.
+ buffer[(*length)++] = static_cast<char>(digit + '0');
+
+ // Can we stop already?
+ // If the remainder of the division is less than the distance to the lower
+ // boundary we can stop. In this case we simply round down (discarding the
+ // remainder).
+ // Similarly we test if we can round up (using the upper boundary).
+ bool in_delta_room_minus;
+ bool in_delta_room_plus;
+ if (is_even) {
+ in_delta_room_minus = Bignum::LessEqual(*numerator, *delta_minus);
+ } else {
+ in_delta_room_minus = Bignum::Less(*numerator, *delta_minus);
+ }
+ if (is_even) {
+ in_delta_room_plus =
+ Bignum::PlusCompare(*numerator, *delta_plus, *denominator) >= 0;
+ } else {
+ in_delta_room_plus =
+ Bignum::PlusCompare(*numerator, *delta_plus, *denominator) > 0;
+ }
+ if (!in_delta_room_minus && !in_delta_room_plus) {
+ // Prepare for next iteration.
+ numerator->Times10();
+ delta_minus->Times10();
+ // We optimized delta_plus to be equal to delta_minus (if they share the
+ // same value). So don't multiply delta_plus if they point to the same
+ // object.
+ if (delta_minus != delta_plus) {
+ delta_plus->Times10();
+ }
+ } else if (in_delta_room_minus && in_delta_room_plus) {
+ // Let's see if 2*numerator < denominator.
+ // If yes, then the next digit would be < 5 and we can round down.
+ int compare = Bignum::PlusCompare(*numerator, *numerator, *denominator);
+ if (compare < 0) {
+ // Remaining digits are less than .5. -> Round down (== do nothing).
+ } else if (compare > 0) {
+ // Remaining digits are more than .5 of denominator. -> Round up.
+ // Note that the last digit could not be a '9' as otherwise the whole
+ // loop would have stopped earlier.
+ // We still have an assert here in case the preconditions were not
+ // satisfied.
+ ASSERT(buffer[(*length) - 1] != '9');
+ buffer[(*length) - 1]++;
+ } else {
+ // Halfway case.
+ // TODO(floitsch): need a way to solve half-way cases.
+ // For now let's round towards even (since this is what Gay seems to
+ // do).
+
+ if ((buffer[(*length) - 1] - '0') % 2 == 0) {
+ // Round down => Do nothing.
+ } else {
+ ASSERT(buffer[(*length) - 1] != '9');
+ buffer[(*length) - 1]++;
+ }
+ }
+ return;
+ } else if (in_delta_room_minus) {
+ // Round down (== do nothing).
+ return;
+ } else { // in_delta_room_plus
+ // Round up.
+ // Note again that the last digit could not be '9' since this would have
+ // stopped the loop earlier.
+ // We still have an ASSERT here, in case the preconditions were not
+ // satisfied.
+ ASSERT(buffer[(*length) -1] != '9');
+ buffer[(*length) - 1]++;
+ return;
+ }
+ }
+}
+
+
+// Let v = numerator / denominator < 10.
+// Then we generate 'count' digits of d = x.xxxxx... (without the decimal point)
+// from left to right. Once 'count' digits have been produced we decide wether
+// to round up or down. Remainders of exactly .5 round upwards. Numbers such
+// as 9.999999 propagate a carry all the way, and change the
+// exponent (decimal_point), when rounding upwards.
+static void GenerateCountedDigits(int count, int* decimal_point,
+ Bignum* numerator, Bignum* denominator,
+ Vector<char> buffer, int* length) {
+ ASSERT(count >= 0);
+ for (int i = 0; i < count - 1; ++i) {
+ uint16_t digit;
+ digit = numerator->DivideModuloIntBignum(*denominator);
+ ASSERT(digit <= 9); // digit is a uint16_t and therefore always positive.
+ // digit = numerator / denominator (integer division).
+ // numerator = numerator % denominator.
+ buffer[i] = static_cast<char>(digit + '0');
+ // Prepare for next iteration.
+ numerator->Times10();
+ }
+ // Generate the last digit.
+ uint16_t digit;
+ digit = numerator->DivideModuloIntBignum(*denominator);
+ if (Bignum::PlusCompare(*numerator, *numerator, *denominator) >= 0) {
+ digit++;
+ }
+ ASSERT(digit <= 10);
+ buffer[count - 1] = static_cast<char>(digit + '0');
+ // Correct bad digits (in case we had a sequence of '9's). Propagate the
+ // carry until we hat a non-'9' or til we reach the first digit.
+ for (int i = count - 1; i > 0; --i) {
+ if (buffer[i] != '0' + 10) break;
+ buffer[i] = '0';
+ buffer[i - 1]++;
+ }
+ if (buffer[0] == '0' + 10) {
+ // Propagate a carry past the top place.
+ buffer[0] = '1';
+ (*decimal_point)++;
+ }
+ *length = count;
+}
+
+
+// Generates 'requested_digits' after the decimal point. It might omit
+// trailing '0's. If the input number is too small then no digits at all are
+// generated (ex.: 2 fixed digits for 0.00001).
+//
+// Input verifies: 1 <= (numerator + delta) / denominator < 10.
+static void BignumToFixed(int requested_digits, int* decimal_point,
+ Bignum* numerator, Bignum* denominator,
+ Vector<char>(buffer), int* length) {
+ // Note that we have to look at more than just the requested_digits, since
+ // a number could be rounded up. Example: v=0.5 with requested_digits=0.
+ // Even though the power of v equals 0 we can't just stop here.
+ if (-(*decimal_point) > requested_digits) {
+ // The number is definitively too small.
+ // Ex: 0.001 with requested_digits == 1.
+ // Set decimal-point to -requested_digits. This is what Gay does.
+ // Note that it should not have any effect anyways since the string is
+ // empty.
+ *decimal_point = -requested_digits;
+ *length = 0;
+ return;
+ } else if (-(*decimal_point) == requested_digits) {
+ // We only need to verify if the number rounds down or up.
+ // Ex: 0.04 and 0.06 with requested_digits == 1.
+ ASSERT(*decimal_point == -requested_digits);
+ // Initially the fraction lies in range (1, 10]. Multiply the denominator
+ // by 10 so that we can compare more easily.
+ denominator->Times10();
+ if (Bignum::PlusCompare(*numerator, *numerator, *denominator) >= 0) {
+ // If the fraction is >= 0.5 then we have to include the rounded
+ // digit.
+ buffer[0] = '1';
+ *length = 1;
+ (*decimal_point)++;
+ } else {
+ // Note that we caught most of similar cases earlier.
+ *length = 0;
+ }
+ return;
+ } else {
+ // The requested digits correspond to the digits after the point.
+ // The variable 'needed_digits' includes the digits before the point.
+ int needed_digits = (*decimal_point) + requested_digits;
+ GenerateCountedDigits(needed_digits, decimal_point,
+ numerator, denominator,
+ buffer, length);
+ }
+}
+
+
+// Returns an estimation of k such that 10^(k-1) <= v < 10^k where
+// v = f * 2^exponent and 2^52 <= f < 2^53.
+// v is hence a normalized double with the given exponent. The output is an
+// approximation for the exponent of the decimal approimation .digits * 10^k.
+//
+// The result might undershoot by 1 in which case 10^k <= v < 10^k+1.
+// Note: this property holds for v's upper boundary m+ too.
+// 10^k <= m+ < 10^k+1.
+// (see explanation below).
+//
+// Examples:
+// EstimatePower(0) => 16
+// EstimatePower(-52) => 0
+//
+// Note: e >= 0 => EstimatedPower(e) > 0. No similar claim can be made for e<0.
+static int EstimatePower(int exponent) {
+ // This function estimates log10 of v where v = f*2^e (with e == exponent).
+ // Note that 10^floor(log10(v)) <= v, but v <= 10^ceil(log10(v)).
+ // Note that f is bounded by its container size. Let p = 53 (the double's
+ // significand size). Then 2^(p-1) <= f < 2^p.
+ //
+ // Given that log10(v) == log2(v)/log2(10) and e+(len(f)-1) is quite close
+ // to log2(v) the function is simplified to (e+(len(f)-1)/log2(10)).
+ // The computed number undershoots by less than 0.631 (when we compute log3
+ // and not log10).
+ //
+ // Optimization: since we only need an approximated result this computation
+ // can be performed on 64 bit integers. On x86/x64 architecture the speedup is
+ // not really measurable, though.
+ //
+ // Since we want to avoid overshooting we decrement by 1e10 so that
+ // floating-point imprecisions don't affect us.
+ //
+ // Explanation for v's boundary m+: the computation takes advantage of
+ // the fact that 2^(p-1) <= f < 2^p. Boundaries still satisfy this requirement
+ // (even for denormals where the delta can be much more important).
+
+ const double k1Log10 = 0.30102999566398114; // 1/lg(10)
+
+ // For doubles len(f) == 53 (don't forget the hidden bit).
+ const int kSignificandSize = Double::kSignificandSize;
+ double estimate = ceil((exponent + kSignificandSize - 1) * k1Log10 - 1e-10);
+ return static_cast<int>(estimate);
+}
+
+
+// See comments for InitialScaledStartValues.
+static void InitialScaledStartValuesPositiveExponent(
+ uint64_t significand, int exponent,
+ int estimated_power, bool need_boundary_deltas,
+ Bignum* numerator, Bignum* denominator,
+ Bignum* delta_minus, Bignum* delta_plus) {
+ // A positive exponent implies a positive power.
+ ASSERT(estimated_power >= 0);
+ // Since the estimated_power is positive we simply multiply the denominator
+ // by 10^estimated_power.
+
+ // numerator = v.
+ numerator->AssignUInt64(significand);
+ numerator->ShiftLeft(exponent);
+ // denominator = 10^estimated_power.
+ denominator->AssignPowerUInt16(10, estimated_power);
+
+ if (need_boundary_deltas) {
+ // Introduce a common denominator so that the deltas to the boundaries are
+ // integers.
+ denominator->ShiftLeft(1);
+ numerator->ShiftLeft(1);
+ // Let v = f * 2^e, then m+ - v = 1/2 * 2^e; With the common
+ // denominator (of 2) delta_plus equals 2^e.
+ delta_plus->AssignUInt16(1);
+ delta_plus->ShiftLeft(exponent);
+ // Same for delta_minus. The adjustments if f == 2^p-1 are done later.
+ delta_minus->AssignUInt16(1);
+ delta_minus->ShiftLeft(exponent);
+ }
+}
+
+
+// See comments for InitialScaledStartValues
+static void InitialScaledStartValuesNegativeExponentPositivePower(
+ uint64_t significand, int exponent,
+ int estimated_power, bool need_boundary_deltas,
+ Bignum* numerator, Bignum* denominator,
+ Bignum* delta_minus, Bignum* delta_plus) {
+ // v = f * 2^e with e < 0, and with estimated_power >= 0.
+ // This means that e is close to 0 (have a look at how estimated_power is
+ // computed).
+
+ // numerator = significand
+ // since v = significand * 2^exponent this is equivalent to
+ // numerator = v * / 2^-exponent
+ numerator->AssignUInt64(significand);
+ // denominator = 10^estimated_power * 2^-exponent (with exponent < 0)
+ denominator->AssignPowerUInt16(10, estimated_power);
+ denominator->ShiftLeft(-exponent);
+
+ if (need_boundary_deltas) {
+ // Introduce a common denominator so that the deltas to the boundaries are
+ // integers.
+ denominator->ShiftLeft(1);
+ numerator->ShiftLeft(1);
+ // Let v = f * 2^e, then m+ - v = 1/2 * 2^e; With the common
+ // denominator (of 2) delta_plus equals 2^e.
+ // Given that the denominator already includes v's exponent the distance
+ // to the boundaries is simply 1.
+ delta_plus->AssignUInt16(1);
+ // Same for delta_minus. The adjustments if f == 2^p-1 are done later.
+ delta_minus->AssignUInt16(1);
+ }
+}
+
+
+// See comments for InitialScaledStartValues
+static void InitialScaledStartValuesNegativeExponentNegativePower(
+ uint64_t significand, int exponent,
+ int estimated_power, bool need_boundary_deltas,
+ Bignum* numerator, Bignum* denominator,
+ Bignum* delta_minus, Bignum* delta_plus) {
+ // Instead of multiplying the denominator with 10^estimated_power we
+ // multiply all values (numerator and deltas) by 10^-estimated_power.
+
+ // Use numerator as temporary container for power_ten.
+ Bignum* power_ten = numerator;
+ power_ten->AssignPowerUInt16(10, -estimated_power);
+
+ if (need_boundary_deltas) {
+ // Since power_ten == numerator we must make a copy of 10^estimated_power
+ // before we complete the computation of the numerator.
+ // delta_plus = delta_minus = 10^estimated_power
+ delta_plus->AssignBignum(*power_ten);
+ delta_minus->AssignBignum(*power_ten);
+ }
+
+ // numerator = significand * 2 * 10^-estimated_power
+ // since v = significand * 2^exponent this is equivalent to
+ // numerator = v * 10^-estimated_power * 2 * 2^-exponent.
+ // Remember: numerator has been abused as power_ten. So no need to assign it
+ // to itself.
+ ASSERT(numerator == power_ten);
+ numerator->MultiplyByUInt64(significand);
+
+ // denominator = 2 * 2^-exponent with exponent < 0.
+ denominator->AssignUInt16(1);
+ denominator->ShiftLeft(-exponent);
+
+ if (need_boundary_deltas) {
+ // Introduce a common denominator so that the deltas to the boundaries are
+ // integers.
+ numerator->ShiftLeft(1);
+ denominator->ShiftLeft(1);
+ // With this shift the boundaries have their correct value, since
+ // delta_plus = 10^-estimated_power, and
+ // delta_minus = 10^-estimated_power.
+ // These assignments have been done earlier.
+ // The adjustments if f == 2^p-1 (lower boundary is closer) are done later.
+ }
+}
+
+
+// Let v = significand * 2^exponent.
+// Computes v / 10^estimated_power exactly, as a ratio of two bignums, numerator
+// and denominator. The functions GenerateShortestDigits and
+// GenerateCountedDigits will then convert this ratio to its decimal
+// representation d, with the required accuracy.
+// Then d * 10^estimated_power is the representation of v.
+// (Note: the fraction and the estimated_power might get adjusted before
+// generating the decimal representation.)
+//
+// The initial start values consist of:
+// - a scaled numerator: s.t. numerator/denominator == v / 10^estimated_power.
+// - a scaled (common) denominator.
+// optionally (used by GenerateShortestDigits to decide if it has the shortest
+// decimal converting back to v):
+// - v - m-: the distance to the lower boundary.
+// - m+ - v: the distance to the upper boundary.
+//
+// v, m+, m-, and therefore v - m- and m+ - v all share the same denominator.
+//
+// Let ep == estimated_power, then the returned values will satisfy:
+// v / 10^ep = numerator / denominator.
+// v's boundarys m- and m+:
+// m- / 10^ep == v / 10^ep - delta_minus / denominator
+// m+ / 10^ep == v / 10^ep + delta_plus / denominator
+// Or in other words:
+// m- == v - delta_minus * 10^ep / denominator;
+// m+ == v + delta_plus * 10^ep / denominator;
+//
+// Since 10^(k-1) <= v < 10^k (with k == estimated_power)
+// or 10^k <= v < 10^(k+1)
+// we then have 0.1 <= numerator/denominator < 1
+// or 1 <= numerator/denominator < 10
+//
+// It is then easy to kickstart the digit-generation routine.
+//
+// The boundary-deltas are only filled if the mode equals BIGNUM_DTOA_SHORTEST
+// or BIGNUM_DTOA_SHORTEST_SINGLE.
+
+static void InitialScaledStartValues(uint64_t significand,
+ int exponent,
+ bool lower_boundary_is_closer,
+ int estimated_power,
+ bool need_boundary_deltas,
+ Bignum* numerator,
+ Bignum* denominator,
+ Bignum* delta_minus,
+ Bignum* delta_plus) {
+ if (exponent >= 0) {
+ InitialScaledStartValuesPositiveExponent(
+ significand, exponent, estimated_power, need_boundary_deltas,
+ numerator, denominator, delta_minus, delta_plus);
+ } else if (estimated_power >= 0) {
+ InitialScaledStartValuesNegativeExponentPositivePower(
+ significand, exponent, estimated_power, need_boundary_deltas,
+ numerator, denominator, delta_minus, delta_plus);
+ } else {
+ InitialScaledStartValuesNegativeExponentNegativePower(
+ significand, exponent, estimated_power, need_boundary_deltas,
+ numerator, denominator, delta_minus, delta_plus);
+ }
+
+ if (need_boundary_deltas && lower_boundary_is_closer) {
+ // The lower boundary is closer at half the distance of "normal" numbers.
+ // Increase the common denominator and adapt all but the delta_minus.
+ denominator->ShiftLeft(1); // *2
+ numerator->ShiftLeft(1); // *2
+ delta_plus->ShiftLeft(1); // *2
+ }
+}
+
+
+// This routine multiplies numerator/denominator so that its values lies in the
+// range 1-10. That is after a call to this function we have:
+// 1 <= (numerator + delta_plus) /denominator < 10.
+// Let numerator the input before modification and numerator' the argument
+// after modification, then the output-parameter decimal_point is such that
+// numerator / denominator * 10^estimated_power ==
+// numerator' / denominator' * 10^(decimal_point - 1)
+// In some cases estimated_power was too low, and this is already the case. We
+// then simply adjust the power so that 10^(k-1) <= v < 10^k (with k ==
+// estimated_power) but do not touch the numerator or denominator.
+// Otherwise the routine multiplies the numerator and the deltas by 10.
+static void FixupMultiply10(int estimated_power, bool is_even,
+ int* decimal_point,
+ Bignum* numerator, Bignum* denominator,
+ Bignum* delta_minus, Bignum* delta_plus) {
+ bool in_range;
+ if (is_even) {
+ // For IEEE doubles half-way cases (in decimal system numbers ending with 5)
+ // are rounded to the closest floating-point number with even significand.
+ in_range = Bignum::PlusCompare(*numerator, *delta_plus, *denominator) >= 0;
+ } else {
+ in_range = Bignum::PlusCompare(*numerator, *delta_plus, *denominator) > 0;
+ }
+ if (in_range) {
+ // Since numerator + delta_plus >= denominator we already have
+ // 1 <= numerator/denominator < 10. Simply update the estimated_power.
+ *decimal_point = estimated_power + 1;
+ } else {
+ *decimal_point = estimated_power;
+ numerator->Times10();
+ if (Bignum::Equal(*delta_minus, *delta_plus)) {
+ delta_minus->Times10();
+ delta_plus->AssignBignum(*delta_minus);
+ } else {
+ delta_minus->Times10();
+ delta_plus->Times10();
+ }
+ }
+}
+
+} // namespace double_conversion
diff --git a/src/3rdparty/double-conversion/bignum-dtoa.h b/src/3rdparty/double-conversion/bignum-dtoa.h
new file mode 100644
index 0000000000..34b961992d
--- /dev/null
+++ b/src/3rdparty/double-conversion/bignum-dtoa.h
@@ -0,0 +1,84 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef DOUBLE_CONVERSION_BIGNUM_DTOA_H_
+#define DOUBLE_CONVERSION_BIGNUM_DTOA_H_
+
+#include "utils.h"
+
+namespace double_conversion {
+
+enum BignumDtoaMode {
+ // Return the shortest correct representation.
+ // For example the output of 0.299999999999999988897 is (the less accurate but
+ // correct) 0.3.
+ BIGNUM_DTOA_SHORTEST,
+ // Same as BIGNUM_DTOA_SHORTEST but for single-precision floats.
+ BIGNUM_DTOA_SHORTEST_SINGLE,
+ // Return a fixed number of digits after the decimal point.
+ // For instance fixed(0.1, 4) becomes 0.1000
+ // If the input number is big, the output will be big.
+ BIGNUM_DTOA_FIXED,
+ // Return a fixed number of digits, no matter what the exponent is.
+ BIGNUM_DTOA_PRECISION
+};
+
+// Converts the given double 'v' to ascii.
+// The result should be interpreted as buffer * 10^(point-length).
+// The buffer will be null-terminated.
+//
+// The input v must be > 0 and different from NaN, and Infinity.
+//
+// The output depends on the given mode:
+// - SHORTEST: produce the least amount of digits for which the internal
+// identity requirement is still satisfied. If the digits are printed
+// (together with the correct exponent) then reading this number will give
+// 'v' again. The buffer will choose the representation that is closest to
+// 'v'. If there are two at the same distance, than the number is round up.
+// In this mode the 'requested_digits' parameter is ignored.
+// - FIXED: produces digits necessary to print a given number with
+// 'requested_digits' digits after the decimal point. The produced digits
+// might be too short in which case the caller has to fill the gaps with '0's.
+// Example: toFixed(0.001, 5) is allowed to return buffer="1", point=-2.
+// Halfway cases are rounded up. The call toFixed(0.15, 2) thus returns
+// buffer="2", point=0.
+// Note: the length of the returned buffer has no meaning wrt the significance
+// of its digits. That is, just because it contains '0's does not mean that
+// any other digit would not satisfy the internal identity requirement.
+// - PRECISION: produces 'requested_digits' where the first digit is not '0'.
+// Even though the length of produced digits usually equals
+// 'requested_digits', the function is allowed to return fewer digits, in
+// which case the caller has to fill the missing digits with '0's.
+// Halfway cases are again rounded up.
+// 'BignumDtoa' expects the given buffer to be big enough to hold all digits
+// and a terminating null-character.
+void BignumDtoa(double v, BignumDtoaMode mode, int requested_digits,
+ Vector<char> buffer, int* length, int* point);
+
+} // namespace double_conversion
+
+#endif // DOUBLE_CONVERSION_BIGNUM_DTOA_H_
diff --git a/src/3rdparty/double-conversion/bignum.cc b/src/3rdparty/double-conversion/bignum.cc
new file mode 100644
index 0000000000..2743d67e8d
--- /dev/null
+++ b/src/3rdparty/double-conversion/bignum.cc
@@ -0,0 +1,766 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "bignum.h"
+#include "utils.h"
+
+namespace double_conversion {
+
+Bignum::Bignum()
+ : bigits_(bigits_buffer_, kBigitCapacity), used_digits_(0), exponent_(0) {
+ for (int i = 0; i < kBigitCapacity; ++i) {
+ bigits_[i] = 0;
+ }
+}
+
+
+template<typename S>
+static int BitSize(S value) {
+ (void) value; // Mark variable as used.
+ return 8 * sizeof(value);
+}
+
+// Guaranteed to lie in one Bigit.
+void Bignum::AssignUInt16(uint16_t value) {
+ ASSERT(kBigitSize >= BitSize(value));
+ Zero();
+ if (value == 0) return;
+
+ EnsureCapacity(1);
+ bigits_[0] = value;
+ used_digits_ = 1;
+}
+
+
+void Bignum::AssignUInt64(uint64_t value) {
+ const int kUInt64Size = 64;
+
+ Zero();
+ if (value == 0) return;
+
+ int needed_bigits = kUInt64Size / kBigitSize + 1;
+ EnsureCapacity(needed_bigits);
+ for (int i = 0; i < needed_bigits; ++i) {
+ bigits_[i] = value & kBigitMask;
+ value = value >> kBigitSize;
+ }
+ used_digits_ = needed_bigits;
+ Clamp();
+}
+
+
+void Bignum::AssignBignum(const Bignum& other) {
+ exponent_ = other.exponent_;
+ for (int i = 0; i < other.used_digits_; ++i) {
+ bigits_[i] = other.bigits_[i];
+ }
+ // Clear the excess digits (if there were any).
+ for (int i = other.used_digits_; i < used_digits_; ++i) {
+ bigits_[i] = 0;
+ }
+ used_digits_ = other.used_digits_;
+}
+
+
+static uint64_t ReadUInt64(Vector<const char> buffer,
+ int from,
+ int digits_to_read) {
+ uint64_t result = 0;
+ for (int i = from; i < from + digits_to_read; ++i) {
+ int digit = buffer[i] - '0';
+ ASSERT(0 <= digit && digit <= 9);
+ result = result * 10 + digit;
+ }
+ return result;
+}
+
+
+void Bignum::AssignDecimalString(Vector<const char> value) {
+ // 2^64 = 18446744073709551616 > 10^19
+ const int kMaxUint64DecimalDigits = 19;
+ Zero();
+ int length = value.length();
+ int pos = 0;
+ // Let's just say that each digit needs 4 bits.
+ while (length >= kMaxUint64DecimalDigits) {
+ uint64_t digits = ReadUInt64(value, pos, kMaxUint64DecimalDigits);
+ pos += kMaxUint64DecimalDigits;
+ length -= kMaxUint64DecimalDigits;
+ MultiplyByPowerOfTen(kMaxUint64DecimalDigits);
+ AddUInt64(digits);
+ }
+ uint64_t digits = ReadUInt64(value, pos, length);
+ MultiplyByPowerOfTen(length);
+ AddUInt64(digits);
+ Clamp();
+}
+
+
+static int HexCharValue(char c) {
+ if ('0' <= c && c <= '9') return c - '0';
+ if ('a' <= c && c <= 'f') return 10 + c - 'a';
+ ASSERT('A' <= c && c <= 'F');
+ return 10 + c - 'A';
+}
+
+
+void Bignum::AssignHexString(Vector<const char> value) {
+ Zero();
+ int length = value.length();
+
+ int needed_bigits = length * 4 / kBigitSize + 1;
+ EnsureCapacity(needed_bigits);
+ int string_index = length - 1;
+ for (int i = 0; i < needed_bigits - 1; ++i) {
+ // These bigits are guaranteed to be "full".
+ Chunk current_bigit = 0;
+ for (int j = 0; j < kBigitSize / 4; j++) {
+ current_bigit += HexCharValue(value[string_index--]) << (j * 4);
+ }
+ bigits_[i] = current_bigit;
+ }
+ used_digits_ = needed_bigits - 1;
+
+ Chunk most_significant_bigit = 0; // Could be = 0;
+ for (int j = 0; j <= string_index; ++j) {
+ most_significant_bigit <<= 4;
+ most_significant_bigit += HexCharValue(value[j]);
+ }
+ if (most_significant_bigit != 0) {
+ bigits_[used_digits_] = most_significant_bigit;
+ used_digits_++;
+ }
+ Clamp();
+}
+
+
+void Bignum::AddUInt64(uint64_t operand) {
+ if (operand == 0) return;
+ Bignum other;
+ other.AssignUInt64(operand);
+ AddBignum(other);
+}
+
+
+void Bignum::AddBignum(const Bignum& other) {
+ ASSERT(IsClamped());
+ ASSERT(other.IsClamped());
+
+ // If this has a greater exponent than other append zero-bigits to this.
+ // After this call exponent_ <= other.exponent_.
+ Align(other);
+
+ // There are two possibilities:
+ // aaaaaaaaaaa 0000 (where the 0s represent a's exponent)
+ // bbbbb 00000000
+ // ----------------
+ // ccccccccccc 0000
+ // or
+ // aaaaaaaaaa 0000
+ // bbbbbbbbb 0000000
+ // -----------------
+ // cccccccccccc 0000
+ // In both cases we might need a carry bigit.
+
+ EnsureCapacity(1 + Max(BigitLength(), other.BigitLength()) - exponent_);
+ Chunk carry = 0;
+ int bigit_pos = other.exponent_ - exponent_;
+ ASSERT(bigit_pos >= 0);
+ for (int i = 0; i < other.used_digits_; ++i) {
+ Chunk sum = bigits_[bigit_pos] + other.bigits_[i] + carry;
+ bigits_[bigit_pos] = sum & kBigitMask;
+ carry = sum >> kBigitSize;
+ bigit_pos++;
+ }
+
+ while (carry != 0) {
+ Chunk sum = bigits_[bigit_pos] + carry;
+ bigits_[bigit_pos] = sum & kBigitMask;
+ carry = sum >> kBigitSize;
+ bigit_pos++;
+ }
+ used_digits_ = Max(bigit_pos, used_digits_);
+ ASSERT(IsClamped());
+}
+
+
+void Bignum::SubtractBignum(const Bignum& other) {
+ ASSERT(IsClamped());
+ ASSERT(other.IsClamped());
+ // We require this to be bigger than other.
+ ASSERT(LessEqual(other, *this));
+
+ Align(other);
+
+ int offset = other.exponent_ - exponent_;
+ Chunk borrow = 0;
+ int i;
+ for (i = 0; i < other.used_digits_; ++i) {
+ ASSERT((borrow == 0) || (borrow == 1));
+ Chunk difference = bigits_[i + offset] - other.bigits_[i] - borrow;
+ bigits_[i + offset] = difference & kBigitMask;
+ borrow = difference >> (kChunkSize - 1);
+ }
+ while (borrow != 0) {
+ Chunk difference = bigits_[i + offset] - borrow;
+ bigits_[i + offset] = difference & kBigitMask;
+ borrow = difference >> (kChunkSize - 1);
+ ++i;
+ }
+ Clamp();
+}
+
+
+void Bignum::ShiftLeft(int shift_amount) {
+ if (used_digits_ == 0) return;
+ exponent_ += shift_amount / kBigitSize;
+ int local_shift = shift_amount % kBigitSize;
+ EnsureCapacity(used_digits_ + 1);
+ BigitsShiftLeft(local_shift);
+}
+
+
+void Bignum::MultiplyByUInt32(uint32_t factor) {
+ if (factor == 1) return;
+ if (factor == 0) {
+ Zero();
+ return;
+ }
+ if (used_digits_ == 0) return;
+
+ // The product of a bigit with the factor is of size kBigitSize + 32.
+ // Assert that this number + 1 (for the carry) fits into double chunk.
+ ASSERT(kDoubleChunkSize >= kBigitSize + 32 + 1);
+ DoubleChunk carry = 0;
+ for (int i = 0; i < used_digits_; ++i) {
+ DoubleChunk product = static_cast<DoubleChunk>(factor) * bigits_[i] + carry;
+ bigits_[i] = static_cast<Chunk>(product & kBigitMask);
+ carry = (product >> kBigitSize);
+ }
+ while (carry != 0) {
+ EnsureCapacity(used_digits_ + 1);
+ bigits_[used_digits_] = carry & kBigitMask;
+ used_digits_++;
+ carry >>= kBigitSize;
+ }
+}
+
+
+void Bignum::MultiplyByUInt64(uint64_t factor) {
+ if (factor == 1) return;
+ if (factor == 0) {
+ Zero();
+ return;
+ }
+ ASSERT(kBigitSize < 32);
+ uint64_t carry = 0;
+ uint64_t low = factor & 0xFFFFFFFF;
+ uint64_t high = factor >> 32;
+ for (int i = 0; i < used_digits_; ++i) {
+ uint64_t product_low = low * bigits_[i];
+ uint64_t product_high = high * bigits_[i];
+ uint64_t tmp = (carry & kBigitMask) + product_low;
+ bigits_[i] = tmp & kBigitMask;
+ carry = (carry >> kBigitSize) + (tmp >> kBigitSize) +
+ (product_high << (32 - kBigitSize));
+ }
+ while (carry != 0) {
+ EnsureCapacity(used_digits_ + 1);
+ bigits_[used_digits_] = carry & kBigitMask;
+ used_digits_++;
+ carry >>= kBigitSize;
+ }
+}
+
+
+void Bignum::MultiplyByPowerOfTen(int exponent) {
+ const uint64_t kFive27 = UINT64_2PART_C(0x6765c793, fa10079d);
+ const uint16_t kFive1 = 5;
+ const uint16_t kFive2 = kFive1 * 5;
+ const uint16_t kFive3 = kFive2 * 5;
+ const uint16_t kFive4 = kFive3 * 5;
+ const uint16_t kFive5 = kFive4 * 5;
+ const uint16_t kFive6 = kFive5 * 5;
+ const uint32_t kFive7 = kFive6 * 5;
+ const uint32_t kFive8 = kFive7 * 5;
+ const uint32_t kFive9 = kFive8 * 5;
+ const uint32_t kFive10 = kFive9 * 5;
+ const uint32_t kFive11 = kFive10 * 5;
+ const uint32_t kFive12 = kFive11 * 5;
+ const uint32_t kFive13 = kFive12 * 5;
+ const uint32_t kFive1_to_12[] =
+ { kFive1, kFive2, kFive3, kFive4, kFive5, kFive6,
+ kFive7, kFive8, kFive9, kFive10, kFive11, kFive12 };
+
+ ASSERT(exponent >= 0);
+ if (exponent == 0) return;
+ if (used_digits_ == 0) return;
+
+ // We shift by exponent at the end just before returning.
+ int remaining_exponent = exponent;
+ while (remaining_exponent >= 27) {
+ MultiplyByUInt64(kFive27);
+ remaining_exponent -= 27;
+ }
+ while (remaining_exponent >= 13) {
+ MultiplyByUInt32(kFive13);
+ remaining_exponent -= 13;
+ }
+ if (remaining_exponent > 0) {
+ MultiplyByUInt32(kFive1_to_12[remaining_exponent - 1]);
+ }
+ ShiftLeft(exponent);
+}
+
+
+void Bignum::Square() {
+ ASSERT(IsClamped());
+ int product_length = 2 * used_digits_;
+ EnsureCapacity(product_length);
+
+ // Comba multiplication: compute each column separately.
+ // Example: r = a2a1a0 * b2b1b0.
+ // r = 1 * a0b0 +
+ // 10 * (a1b0 + a0b1) +
+ // 100 * (a2b0 + a1b1 + a0b2) +
+ // 1000 * (a2b1 + a1b2) +
+ // 10000 * a2b2
+ //
+ // In the worst case we have to accumulate nb-digits products of digit*digit.
+ //
+ // Assert that the additional number of bits in a DoubleChunk are enough to
+ // sum up used_digits of Bigit*Bigit.
+ if ((1 << (2 * (kChunkSize - kBigitSize))) <= used_digits_) {
+ UNIMPLEMENTED();
+ }
+ DoubleChunk accumulator = 0;
+ // First shift the digits so we don't overwrite them.
+ int copy_offset = used_digits_;
+ for (int i = 0; i < used_digits_; ++i) {
+ bigits_[copy_offset + i] = bigits_[i];
+ }
+ // We have two loops to avoid some 'if's in the loop.
+ for (int i = 0; i < used_digits_; ++i) {
+ // Process temporary digit i with power i.
+ // The sum of the two indices must be equal to i.
+ int bigit_index1 = i;
+ int bigit_index2 = 0;
+ // Sum all of the sub-products.
+ while (bigit_index1 >= 0) {
+ Chunk chunk1 = bigits_[copy_offset + bigit_index1];
+ Chunk chunk2 = bigits_[copy_offset + bigit_index2];
+ accumulator += static_cast<DoubleChunk>(chunk1) * chunk2;
+ bigit_index1--;
+ bigit_index2++;
+ }
+ bigits_[i] = static_cast<Chunk>(accumulator) & kBigitMask;
+ accumulator >>= kBigitSize;
+ }
+ for (int i = used_digits_; i < product_length; ++i) {
+ int bigit_index1 = used_digits_ - 1;
+ int bigit_index2 = i - bigit_index1;
+ // Invariant: sum of both indices is again equal to i.
+ // Inner loop runs 0 times on last iteration, emptying accumulator.
+ while (bigit_index2 < used_digits_) {
+ Chunk chunk1 = bigits_[copy_offset + bigit_index1];
+ Chunk chunk2 = bigits_[copy_offset + bigit_index2];
+ accumulator += static_cast<DoubleChunk>(chunk1) * chunk2;
+ bigit_index1--;
+ bigit_index2++;
+ }
+ // The overwritten bigits_[i] will never be read in further loop iterations,
+ // because bigit_index1 and bigit_index2 are always greater
+ // than i - used_digits_.
+ bigits_[i] = static_cast<Chunk>(accumulator) & kBigitMask;
+ accumulator >>= kBigitSize;
+ }
+ // Since the result was guaranteed to lie inside the number the
+ // accumulator must be 0 now.
+ ASSERT(accumulator == 0);
+
+ // Don't forget to update the used_digits and the exponent.
+ used_digits_ = product_length;
+ exponent_ *= 2;
+ Clamp();
+}
+
+
+void Bignum::AssignPowerUInt16(uint16_t base, int power_exponent) {
+ ASSERT(base != 0);
+ ASSERT(power_exponent >= 0);
+ if (power_exponent == 0) {
+ AssignUInt16(1);
+ return;
+ }
+ Zero();
+ int shifts = 0;
+ // We expect base to be in range 2-32, and most often to be 10.
+ // It does not make much sense to implement different algorithms for counting
+ // the bits.
+ while ((base & 1) == 0) {
+ base >>= 1;
+ shifts++;
+ }
+ int bit_size = 0;
+ int tmp_base = base;
+ while (tmp_base != 0) {
+ tmp_base >>= 1;
+ bit_size++;
+ }
+ int final_size = bit_size * power_exponent;
+ // 1 extra bigit for the shifting, and one for rounded final_size.
+ EnsureCapacity(final_size / kBigitSize + 2);
+
+ // Left to Right exponentiation.
+ int mask = 1;
+ while (power_exponent >= mask) mask <<= 1;
+
+ // The mask is now pointing to the bit above the most significant 1-bit of
+ // power_exponent.
+ // Get rid of first 1-bit;
+ mask >>= 2;
+ uint64_t this_value = base;
+
+ bool delayed_multipliciation = false;
+ const uint64_t max_32bits = 0xFFFFFFFF;
+ while (mask != 0 && this_value <= max_32bits) {
+ this_value = this_value * this_value;
+ // Verify that there is enough space in this_value to perform the
+ // multiplication. The first bit_size bits must be 0.
+ if ((power_exponent & mask) != 0) {
+ uint64_t base_bits_mask =
+ ~((static_cast<uint64_t>(1) << (64 - bit_size)) - 1);
+ bool high_bits_zero = (this_value & base_bits_mask) == 0;
+ if (high_bits_zero) {
+ this_value *= base;
+ } else {
+ delayed_multipliciation = true;
+ }
+ }
+ mask >>= 1;
+ }
+ AssignUInt64(this_value);
+ if (delayed_multipliciation) {
+ MultiplyByUInt32(base);
+ }
+
+ // Now do the same thing as a bignum.
+ while (mask != 0) {
+ Square();
+ if ((power_exponent & mask) != 0) {
+ MultiplyByUInt32(base);
+ }
+ mask >>= 1;
+ }
+
+ // And finally add the saved shifts.
+ ShiftLeft(shifts * power_exponent);
+}
+
+
+// Precondition: this/other < 16bit.
+uint16_t Bignum::DivideModuloIntBignum(const Bignum& other) {
+ ASSERT(IsClamped());
+ ASSERT(other.IsClamped());
+ ASSERT(other.used_digits_ > 0);
+
+ // Easy case: if we have less digits than the divisor than the result is 0.
+ // Note: this handles the case where this == 0, too.
+ if (BigitLength() < other.BigitLength()) {
+ return 0;
+ }
+
+ Align(other);
+
+ uint16_t result = 0;
+
+ // Start by removing multiples of 'other' until both numbers have the same
+ // number of digits.
+ while (BigitLength() > other.BigitLength()) {
+ // This naive approach is extremely inefficient if `this` divided by other
+ // is big. This function is implemented for doubleToString where
+ // the result should be small (less than 10).
+ ASSERT(other.bigits_[other.used_digits_ - 1] >= ((1 << kBigitSize) / 16));
+ ASSERT(bigits_[used_digits_ - 1] < 0x10000);
+ // Remove the multiples of the first digit.
+ // Example this = 23 and other equals 9. -> Remove 2 multiples.
+ result += static_cast<uint16_t>(bigits_[used_digits_ - 1]);
+ SubtractTimes(other, bigits_[used_digits_ - 1]);
+ }
+
+ ASSERT(BigitLength() == other.BigitLength());
+
+ // Both bignums are at the same length now.
+ // Since other has more than 0 digits we know that the access to
+ // bigits_[used_digits_ - 1] is safe.
+ Chunk this_bigit = bigits_[used_digits_ - 1];
+ Chunk other_bigit = other.bigits_[other.used_digits_ - 1];
+
+ if (other.used_digits_ == 1) {
+ // Shortcut for easy (and common) case.
+ int quotient = this_bigit / other_bigit;
+ bigits_[used_digits_ - 1] = this_bigit - other_bigit * quotient;
+ ASSERT(quotient < 0x10000);
+ result += static_cast<uint16_t>(quotient);
+ Clamp();
+ return result;
+ }
+
+ int division_estimate = this_bigit / (other_bigit + 1);
+ ASSERT(division_estimate < 0x10000);
+ result += static_cast<uint16_t>(division_estimate);
+ SubtractTimes(other, division_estimate);
+
+ if (other_bigit * (division_estimate + 1) > this_bigit) {
+ // No need to even try to subtract. Even if other's remaining digits were 0
+ // another subtraction would be too much.
+ return result;
+ }
+
+ while (LessEqual(other, *this)) {
+ SubtractBignum(other);
+ result++;
+ }
+ return result;
+}
+
+
+template<typename S>
+static int SizeInHexChars(S number) {
+ ASSERT(number > 0);
+ int result = 0;
+ while (number != 0) {
+ number >>= 4;
+ result++;
+ }
+ return result;
+}
+
+
+static char HexCharOfValue(int value) {
+ ASSERT(0 <= value && value <= 16);
+ if (value < 10) return static_cast<char>(value + '0');
+ return static_cast<char>(value - 10 + 'A');
+}
+
+
+bool Bignum::ToHexString(char* buffer, int buffer_size) const {
+ ASSERT(IsClamped());
+ // Each bigit must be printable as separate hex-character.
+ ASSERT(kBigitSize % 4 == 0);
+ const int kHexCharsPerBigit = kBigitSize / 4;
+
+ if (used_digits_ == 0) {
+ if (buffer_size < 2) return false;
+ buffer[0] = '0';
+ buffer[1] = '\0';
+ return true;
+ }
+ // We add 1 for the terminating '\0' character.
+ int needed_chars = (BigitLength() - 1) * kHexCharsPerBigit +
+ SizeInHexChars(bigits_[used_digits_ - 1]) + 1;
+ if (needed_chars > buffer_size) return false;
+ int string_index = needed_chars - 1;
+ buffer[string_index--] = '\0';
+ for (int i = 0; i < exponent_; ++i) {
+ for (int j = 0; j < kHexCharsPerBigit; ++j) {
+ buffer[string_index--] = '0';
+ }
+ }
+ for (int i = 0; i < used_digits_ - 1; ++i) {
+ Chunk current_bigit = bigits_[i];
+ for (int j = 0; j < kHexCharsPerBigit; ++j) {
+ buffer[string_index--] = HexCharOfValue(current_bigit & 0xF);
+ current_bigit >>= 4;
+ }
+ }
+ // And finally the last bigit.
+ Chunk most_significant_bigit = bigits_[used_digits_ - 1];
+ while (most_significant_bigit != 0) {
+ buffer[string_index--] = HexCharOfValue(most_significant_bigit & 0xF);
+ most_significant_bigit >>= 4;
+ }
+ return true;
+}
+
+
+Bignum::Chunk Bignum::BigitAt(int index) const {
+ if (index >= BigitLength()) return 0;
+ if (index < exponent_) return 0;
+ return bigits_[index - exponent_];
+}
+
+
+int Bignum::Compare(const Bignum& a, const Bignum& b) {
+ ASSERT(a.IsClamped());
+ ASSERT(b.IsClamped());
+ int bigit_length_a = a.BigitLength();
+ int bigit_length_b = b.BigitLength();
+ if (bigit_length_a < bigit_length_b) return -1;
+ if (bigit_length_a > bigit_length_b) return +1;
+ for (int i = bigit_length_a - 1; i >= Min(a.exponent_, b.exponent_); --i) {
+ Chunk bigit_a = a.BigitAt(i);
+ Chunk bigit_b = b.BigitAt(i);
+ if (bigit_a < bigit_b) return -1;
+ if (bigit_a > bigit_b) return +1;
+ // Otherwise they are equal up to this digit. Try the next digit.
+ }
+ return 0;
+}
+
+
+int Bignum::PlusCompare(const Bignum& a, const Bignum& b, const Bignum& c) {
+ ASSERT(a.IsClamped());
+ ASSERT(b.IsClamped());
+ ASSERT(c.IsClamped());
+ if (a.BigitLength() < b.BigitLength()) {
+ return PlusCompare(b, a, c);
+ }
+ if (a.BigitLength() + 1 < c.BigitLength()) return -1;
+ if (a.BigitLength() > c.BigitLength()) return +1;
+ // The exponent encodes 0-bigits. So if there are more 0-digits in 'a' than
+ // 'b' has digits, then the bigit-length of 'a'+'b' must be equal to the one
+ // of 'a'.
+ if (a.exponent_ >= b.BigitLength() && a.BigitLength() < c.BigitLength()) {
+ return -1;
+ }
+
+ Chunk borrow = 0;
+ // Starting at min_exponent all digits are == 0. So no need to compare them.
+ int min_exponent = Min(Min(a.exponent_, b.exponent_), c.exponent_);
+ for (int i = c.BigitLength() - 1; i >= min_exponent; --i) {
+ Chunk chunk_a = a.BigitAt(i);
+ Chunk chunk_b = b.BigitAt(i);
+ Chunk chunk_c = c.BigitAt(i);
+ Chunk sum = chunk_a + chunk_b;
+ if (sum > chunk_c + borrow) {
+ return +1;
+ } else {
+ borrow = chunk_c + borrow - sum;
+ if (borrow > 1) return -1;
+ borrow <<= kBigitSize;
+ }
+ }
+ if (borrow == 0) return 0;
+ return -1;
+}
+
+
+void Bignum::Clamp() {
+ while (used_digits_ > 0 && bigits_[used_digits_ - 1] == 0) {
+ used_digits_--;
+ }
+ if (used_digits_ == 0) {
+ // Zero.
+ exponent_ = 0;
+ }
+}
+
+
+bool Bignum::IsClamped() const {
+ return used_digits_ == 0 || bigits_[used_digits_ - 1] != 0;
+}
+
+
+void Bignum::Zero() {
+ for (int i = 0; i < used_digits_; ++i) {
+ bigits_[i] = 0;
+ }
+ used_digits_ = 0;
+ exponent_ = 0;
+}
+
+
+void Bignum::Align(const Bignum& other) {
+ if (exponent_ > other.exponent_) {
+ // If "X" represents a "hidden" digit (by the exponent) then we are in the
+ // following case (a == this, b == other):
+ // a: aaaaaaXXXX or a: aaaaaXXX
+ // b: bbbbbbX b: bbbbbbbbXX
+ // We replace some of the hidden digits (X) of a with 0 digits.
+ // a: aaaaaa000X or a: aaaaa0XX
+ int zero_digits = exponent_ - other.exponent_;
+ EnsureCapacity(used_digits_ + zero_digits);
+ for (int i = used_digits_ - 1; i >= 0; --i) {
+ bigits_[i + zero_digits] = bigits_[i];
+ }
+ for (int i = 0; i < zero_digits; ++i) {
+ bigits_[i] = 0;
+ }
+ used_digits_ += zero_digits;
+ exponent_ -= zero_digits;
+ ASSERT(used_digits_ >= 0);
+ ASSERT(exponent_ >= 0);
+ }
+}
+
+
+void Bignum::BigitsShiftLeft(int shift_amount) {
+ ASSERT(shift_amount < kBigitSize);
+ ASSERT(shift_amount >= 0);
+ Chunk carry = 0;
+ for (int i = 0; i < used_digits_; ++i) {
+ Chunk new_carry = bigits_[i] >> (kBigitSize - shift_amount);
+ bigits_[i] = ((bigits_[i] << shift_amount) + carry) & kBigitMask;
+ carry = new_carry;
+ }
+ if (carry != 0) {
+ bigits_[used_digits_] = carry;
+ used_digits_++;
+ }
+}
+
+
+void Bignum::SubtractTimes(const Bignum& other, int factor) {
+ ASSERT(exponent_ <= other.exponent_);
+ if (factor < 3) {
+ for (int i = 0; i < factor; ++i) {
+ SubtractBignum(other);
+ }
+ return;
+ }
+ Chunk borrow = 0;
+ int exponent_diff = other.exponent_ - exponent_;
+ for (int i = 0; i < other.used_digits_; ++i) {
+ DoubleChunk product = static_cast<DoubleChunk>(factor) * other.bigits_[i];
+ DoubleChunk remove = borrow + product;
+ Chunk difference = bigits_[i + exponent_diff] - (remove & kBigitMask);
+ bigits_[i + exponent_diff] = difference & kBigitMask;
+ borrow = static_cast<Chunk>((difference >> (kChunkSize - 1)) +
+ (remove >> kBigitSize));
+ }
+ for (int i = other.used_digits_ + exponent_diff; i < used_digits_; ++i) {
+ if (borrow == 0) return;
+ Chunk difference = bigits_[i] - borrow;
+ bigits_[i] = difference & kBigitMask;
+ borrow = difference >> (kChunkSize - 1);
+ }
+ Clamp();
+}
+
+
+} // namespace double_conversion
diff --git a/src/3rdparty/double-conversion/bignum.h b/src/3rdparty/double-conversion/bignum.h
new file mode 100644
index 0000000000..5ec3544f57
--- /dev/null
+++ b/src/3rdparty/double-conversion/bignum.h
@@ -0,0 +1,145 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef DOUBLE_CONVERSION_BIGNUM_H_
+#define DOUBLE_CONVERSION_BIGNUM_H_
+
+#include "utils.h"
+
+namespace double_conversion {
+
+class Bignum {
+ public:
+ // 3584 = 128 * 28. We can represent 2^3584 > 10^1000 accurately.
+ // This bignum can encode much bigger numbers, since it contains an
+ // exponent.
+ static const int kMaxSignificantBits = 3584;
+
+ Bignum();
+ void AssignUInt16(uint16_t value);
+ void AssignUInt64(uint64_t value);
+ void AssignBignum(const Bignum& other);
+
+ void AssignDecimalString(Vector<const char> value);
+ void AssignHexString(Vector<const char> value);
+
+ void AssignPowerUInt16(uint16_t base, int exponent);
+
+ void AddUInt16(uint16_t operand);
+ void AddUInt64(uint64_t operand);
+ void AddBignum(const Bignum& other);
+ // Precondition: this >= other.
+ void SubtractBignum(const Bignum& other);
+
+ void Square();
+ void ShiftLeft(int shift_amount);
+ void MultiplyByUInt32(uint32_t factor);
+ void MultiplyByUInt64(uint64_t factor);
+ void MultiplyByPowerOfTen(int exponent);
+ void Times10() { return MultiplyByUInt32(10); }
+ // Pseudocode:
+ // int result = this / other;
+ // this = this % other;
+ // In the worst case this function is in O(this/other).
+ uint16_t DivideModuloIntBignum(const Bignum& other);
+
+ bool ToHexString(char* buffer, int buffer_size) const;
+
+ // Returns
+ // -1 if a < b,
+ // 0 if a == b, and
+ // +1 if a > b.
+ static int Compare(const Bignum& a, const Bignum& b);
+ static bool Equal(const Bignum& a, const Bignum& b) {
+ return Compare(a, b) == 0;
+ }
+ static bool LessEqual(const Bignum& a, const Bignum& b) {
+ return Compare(a, b) <= 0;
+ }
+ static bool Less(const Bignum& a, const Bignum& b) {
+ return Compare(a, b) < 0;
+ }
+ // Returns Compare(a + b, c);
+ static int PlusCompare(const Bignum& a, const Bignum& b, const Bignum& c);
+ // Returns a + b == c
+ static bool PlusEqual(const Bignum& a, const Bignum& b, const Bignum& c) {
+ return PlusCompare(a, b, c) == 0;
+ }
+ // Returns a + b <= c
+ static bool PlusLessEqual(const Bignum& a, const Bignum& b, const Bignum& c) {
+ return PlusCompare(a, b, c) <= 0;
+ }
+ // Returns a + b < c
+ static bool PlusLess(const Bignum& a, const Bignum& b, const Bignum& c) {
+ return PlusCompare(a, b, c) < 0;
+ }
+ private:
+ typedef uint32_t Chunk;
+ typedef uint64_t DoubleChunk;
+
+ static const int kChunkSize = sizeof(Chunk) * 8;
+ static const int kDoubleChunkSize = sizeof(DoubleChunk) * 8;
+ // With bigit size of 28 we loose some bits, but a double still fits easily
+ // into two chunks, and more importantly we can use the Comba multiplication.
+ static const int kBigitSize = 28;
+ static const Chunk kBigitMask = (1 << kBigitSize) - 1;
+ // Every instance allocates kBigitLength chunks on the stack. Bignums cannot
+ // grow. There are no checks if the stack-allocated space is sufficient.
+ static const int kBigitCapacity = kMaxSignificantBits / kBigitSize;
+
+ void EnsureCapacity(int size) {
+ if (size > kBigitCapacity) {
+ UNREACHABLE();
+ }
+ }
+ void Align(const Bignum& other);
+ void Clamp();
+ bool IsClamped() const;
+ void Zero();
+ // Requires this to have enough capacity (no tests done).
+ // Updates used_digits_ if necessary.
+ // shift_amount must be < kBigitSize.
+ void BigitsShiftLeft(int shift_amount);
+ // BigitLength includes the "hidden" digits encoded in the exponent.
+ int BigitLength() const { return used_digits_ + exponent_; }
+ Chunk BigitAt(int index) const;
+ void SubtractTimes(const Bignum& other, int factor);
+
+ Chunk bigits_buffer_[kBigitCapacity];
+ // A vector backed by bigits_buffer_. This way accesses to the array are
+ // checked for out-of-bounds errors.
+ Vector<Chunk> bigits_;
+ int used_digits_;
+ // The Bignum's value equals value(bigits_) * 2^(exponent_ * kBigitSize).
+ int exponent_;
+
+ DISALLOW_COPY_AND_ASSIGN(Bignum);
+};
+
+} // namespace double_conversion
+
+#endif // DOUBLE_CONVERSION_BIGNUM_H_
diff --git a/src/3rdparty/double-conversion/cached-powers.cc b/src/3rdparty/double-conversion/cached-powers.cc
new file mode 100644
index 0000000000..9536f26927
--- /dev/null
+++ b/src/3rdparty/double-conversion/cached-powers.cc
@@ -0,0 +1,178 @@
+// Copyright 2006-2008 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include <stdarg.h>
+#include <limits.h>
+#include <math.h>
+
+#include "utils.h"
+
+#include "cached-powers.h"
+
+namespace double_conversion {
+
+struct CachedPower {
+ uint64_t significand;
+ int16_t binary_exponent;
+ int16_t decimal_exponent;
+};
+
+static const CachedPower kCachedPowers[] = {
+ {UINT64_2PART_C(0xfa8fd5a0, 081c0288), -1220, -348},
+ {UINT64_2PART_C(0xbaaee17f, a23ebf76), -1193, -340},
+ {UINT64_2PART_C(0x8b16fb20, 3055ac76), -1166, -332},
+ {UINT64_2PART_C(0xcf42894a, 5dce35ea), -1140, -324},
+ {UINT64_2PART_C(0x9a6bb0aa, 55653b2d), -1113, -316},
+ {UINT64_2PART_C(0xe61acf03, 3d1a45df), -1087, -308},
+ {UINT64_2PART_C(0xab70fe17, c79ac6ca), -1060, -300},
+ {UINT64_2PART_C(0xff77b1fc, bebcdc4f), -1034, -292},
+ {UINT64_2PART_C(0xbe5691ef, 416bd60c), -1007, -284},
+ {UINT64_2PART_C(0x8dd01fad, 907ffc3c), -980, -276},
+ {UINT64_2PART_C(0xd3515c28, 31559a83), -954, -268},
+ {UINT64_2PART_C(0x9d71ac8f, ada6c9b5), -927, -260},
+ {UINT64_2PART_C(0xea9c2277, 23ee8bcb), -901, -252},
+ {UINT64_2PART_C(0xaecc4991, 4078536d), -874, -244},
+ {UINT64_2PART_C(0x823c1279, 5db6ce57), -847, -236},
+ {UINT64_2PART_C(0xc2109436, 4dfb5637), -821, -228},
+ {UINT64_2PART_C(0x9096ea6f, 3848984f), -794, -220},
+ {UINT64_2PART_C(0xd77485cb, 25823ac7), -768, -212},
+ {UINT64_2PART_C(0xa086cfcd, 97bf97f4), -741, -204},
+ {UINT64_2PART_C(0xef340a98, 172aace5), -715, -196},
+ {UINT64_2PART_C(0xb23867fb, 2a35b28e), -688, -188},
+ {UINT64_2PART_C(0x84c8d4df, d2c63f3b), -661, -180},
+ {UINT64_2PART_C(0xc5dd4427, 1ad3cdba), -635, -172},
+ {UINT64_2PART_C(0x936b9fce, bb25c996), -608, -164},
+ {UINT64_2PART_C(0xdbac6c24, 7d62a584), -582, -156},
+ {UINT64_2PART_C(0xa3ab6658, 0d5fdaf6), -555, -148},
+ {UINT64_2PART_C(0xf3e2f893, dec3f126), -529, -140},
+ {UINT64_2PART_C(0xb5b5ada8, aaff80b8), -502, -132},
+ {UINT64_2PART_C(0x87625f05, 6c7c4a8b), -475, -124},
+ {UINT64_2PART_C(0xc9bcff60, 34c13053), -449, -116},
+ {UINT64_2PART_C(0x964e858c, 91ba2655), -422, -108},
+ {UINT64_2PART_C(0xdff97724, 70297ebd), -396, -100},
+ {UINT64_2PART_C(0xa6dfbd9f, b8e5b88f), -369, -92},
+ {UINT64_2PART_C(0xf8a95fcf, 88747d94), -343, -84},
+ {UINT64_2PART_C(0xb9447093, 8fa89bcf), -316, -76},
+ {UINT64_2PART_C(0x8a08f0f8, bf0f156b), -289, -68},
+ {UINT64_2PART_C(0xcdb02555, 653131b6), -263, -60},
+ {UINT64_2PART_C(0x993fe2c6, d07b7fac), -236, -52},
+ {UINT64_2PART_C(0xe45c10c4, 2a2b3b06), -210, -44},
+ {UINT64_2PART_C(0xaa242499, 697392d3), -183, -36},
+ {UINT64_2PART_C(0xfd87b5f2, 8300ca0e), -157, -28},
+ {UINT64_2PART_C(0xbce50864, 92111aeb), -130, -20},
+ {UINT64_2PART_C(0x8cbccc09, 6f5088cc), -103, -12},
+ {UINT64_2PART_C(0xd1b71758, e219652c), -77, -4},
+ {UINT64_2PART_C(0x9c400000, 00000000), -50, 4},
+ {UINT64_2PART_C(0xe8d4a510, 00000000), -24, 12},
+ {UINT64_2PART_C(0xad78ebc5, ac620000), 3, 20},
+ {UINT64_2PART_C(0x813f3978, f8940984), 30, 28},
+ {UINT64_2PART_C(0xc097ce7b, c90715b3), 56, 36},
+ {UINT64_2PART_C(0x8f7e32ce, 7bea5c70), 83, 44},
+ {UINT64_2PART_C(0xd5d238a4, abe98068), 109, 52},
+ {UINT64_2PART_C(0x9f4f2726, 179a2245), 136, 60},
+ {UINT64_2PART_C(0xed63a231, d4c4fb27), 162, 68},
+ {UINT64_2PART_C(0xb0de6538, 8cc8ada8), 189, 76},
+ {UINT64_2PART_C(0x83c7088e, 1aab65db), 216, 84},
+ {UINT64_2PART_C(0xc45d1df9, 42711d9a), 242, 92},
+ {UINT64_2PART_C(0x924d692c, a61be758), 269, 100},
+ {UINT64_2PART_C(0xda01ee64, 1a708dea), 295, 108},
+ {UINT64_2PART_C(0xa26da399, 9aef774a), 322, 116},
+ {UINT64_2PART_C(0xf209787b, b47d6b85), 348, 124},
+ {UINT64_2PART_C(0xb454e4a1, 79dd1877), 375, 132},
+ {UINT64_2PART_C(0x865b8692, 5b9bc5c2), 402, 140},
+ {UINT64_2PART_C(0xc83553c5, c8965d3d), 428, 148},
+ {UINT64_2PART_C(0x952ab45c, fa97a0b3), 455, 156},
+ {UINT64_2PART_C(0xde469fbd, 99a05fe3), 481, 164},
+ {UINT64_2PART_C(0xa59bc234, db398c25), 508, 172},
+ {UINT64_2PART_C(0xf6c69a72, a3989f5c), 534, 180},
+ {UINT64_2PART_C(0xb7dcbf53, 54e9bece), 561, 188},
+ {UINT64_2PART_C(0x88fcf317, f22241e2), 588, 196},
+ {UINT64_2PART_C(0xcc20ce9b, d35c78a5), 614, 204},
+ {UINT64_2PART_C(0x98165af3, 7b2153df), 641, 212},
+ {UINT64_2PART_C(0xe2a0b5dc, 971f303a), 667, 220},
+ {UINT64_2PART_C(0xa8d9d153, 5ce3b396), 694, 228},
+ {UINT64_2PART_C(0xfb9b7cd9, a4a7443c), 720, 236},
+ {UINT64_2PART_C(0xbb764c4c, a7a44410), 747, 244},
+ {UINT64_2PART_C(0x8bab8eef, b6409c1a), 774, 252},
+ {UINT64_2PART_C(0xd01fef10, a657842c), 800, 260},
+ {UINT64_2PART_C(0x9b10a4e5, e9913129), 827, 268},
+ {UINT64_2PART_C(0xe7109bfb, a19c0c9d), 853, 276},
+ {UINT64_2PART_C(0xac2820d9, 623bf429), 880, 284},
+ {UINT64_2PART_C(0x80444b5e, 7aa7cf85), 907, 292},
+ {UINT64_2PART_C(0xbf21e440, 03acdd2d), 933, 300},
+ {UINT64_2PART_C(0x8e679c2f, 5e44ff8f), 960, 308},
+ {UINT64_2PART_C(0xd433179d, 9c8cb841), 986, 316},
+ {UINT64_2PART_C(0x9e19db92, b4e31ba9), 1013, 324},
+ {UINT64_2PART_C(0xeb96bf6e, badf77d9), 1039, 332},
+ {UINT64_2PART_C(0xaf87023b, 9bf0ee6b), 1066, 340},
+};
+
+static const int kCachedPowersLength = ARRAY_SIZE(kCachedPowers);
+static const int kCachedPowersOffset = 348; // -1 * the first decimal_exponent.
+static const double kD_1_LOG2_10 = 0.30102999566398114; // 1 / lg(10)
+// Difference between the decimal exponents in the table above.
+const int PowersOfTenCache::kDecimalExponentDistance = 8;
+const int PowersOfTenCache::kMinDecimalExponent = -348;
+const int PowersOfTenCache::kMaxDecimalExponent = 340;
+
+void PowersOfTenCache::GetCachedPowerForBinaryExponentRange(
+ int min_exponent,
+ int max_exponent,
+ DiyFp* power,
+ int* decimal_exponent) {
+ (void)max_exponent; // Silence unused parameter warning in release builds
+ (void)kCachedPowersLength; // Silence unused parameter warning in release builds
+ int kQ = DiyFp::kSignificandSize;
+ double k = ceil((min_exponent + kQ - 1) * kD_1_LOG2_10);
+ int foo = kCachedPowersOffset;
+ int index =
+ (foo + static_cast<int>(k) - 1) / kDecimalExponentDistance + 1;
+ ASSERT(0 <= index && index < kCachedPowersLength);
+ CachedPower cached_power = kCachedPowers[index];
+ ASSERT(min_exponent <= cached_power.binary_exponent);
+ (void) max_exponent; // Mark variable as used.
+ ASSERT(cached_power.binary_exponent <= max_exponent);
+ *decimal_exponent = cached_power.decimal_exponent;
+ *power = DiyFp(cached_power.significand, cached_power.binary_exponent);
+}
+
+
+void PowersOfTenCache::GetCachedPowerForDecimalExponent(int requested_exponent,
+ DiyFp* power,
+ int* found_exponent) {
+ ASSERT(kMinDecimalExponent <= requested_exponent);
+ ASSERT(requested_exponent < kMaxDecimalExponent + kDecimalExponentDistance);
+ int index =
+ (requested_exponent + kCachedPowersOffset) / kDecimalExponentDistance;
+ CachedPower cached_power = kCachedPowers[index];
+ *power = DiyFp(cached_power.significand, cached_power.binary_exponent);
+ *found_exponent = cached_power.decimal_exponent;
+ ASSERT(*found_exponent <= requested_exponent);
+ ASSERT(requested_exponent < *found_exponent + kDecimalExponentDistance);
+}
+
+} // namespace double_conversion
diff --git a/src/3rdparty/double-conversion/cached-powers.h b/src/3rdparty/double-conversion/cached-powers.h
new file mode 100644
index 0000000000..61a50614cf
--- /dev/null
+++ b/src/3rdparty/double-conversion/cached-powers.h
@@ -0,0 +1,64 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef DOUBLE_CONVERSION_CACHED_POWERS_H_
+#define DOUBLE_CONVERSION_CACHED_POWERS_H_
+
+#include "diy-fp.h"
+
+namespace double_conversion {
+
+class PowersOfTenCache {
+ public:
+
+ // Not all powers of ten are cached. The decimal exponent of two neighboring
+ // cached numbers will differ by kDecimalExponentDistance.
+ static const int kDecimalExponentDistance;
+
+ static const int kMinDecimalExponent;
+ static const int kMaxDecimalExponent;
+
+ // Returns a cached power-of-ten with a binary exponent in the range
+ // [min_exponent; max_exponent] (boundaries included).
+ static void GetCachedPowerForBinaryExponentRange(int min_exponent,
+ int max_exponent,
+ DiyFp* power,
+ int* decimal_exponent);
+
+ // Returns a cached power of ten x ~= 10^k such that
+ // k <= decimal_exponent < k + kCachedPowersDecimalDistance.
+ // The given decimal_exponent must satisfy
+ // kMinDecimalExponent <= requested_exponent, and
+ // requested_exponent < kMaxDecimalExponent + kDecimalExponentDistance.
+ static void GetCachedPowerForDecimalExponent(int requested_exponent,
+ DiyFp* power,
+ int* found_exponent);
+};
+
+} // namespace double_conversion
+
+#endif // DOUBLE_CONVERSION_CACHED_POWERS_H_
diff --git a/src/3rdparty/double-conversion/diy-fp.cc b/src/3rdparty/double-conversion/diy-fp.cc
new file mode 100644
index 0000000000..ddd1891b16
--- /dev/null
+++ b/src/3rdparty/double-conversion/diy-fp.cc
@@ -0,0 +1,57 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+#include "diy-fp.h"
+#include "utils.h"
+
+namespace double_conversion {
+
+void DiyFp::Multiply(const DiyFp& other) {
+ // Simply "emulates" a 128 bit multiplication.
+ // However: the resulting number only contains 64 bits. The least
+ // significant 64 bits are only used for rounding the most significant 64
+ // bits.
+ const uint64_t kM32 = 0xFFFFFFFFU;
+ uint64_t a = f_ >> 32;
+ uint64_t b = f_ & kM32;
+ uint64_t c = other.f_ >> 32;
+ uint64_t d = other.f_ & kM32;
+ uint64_t ac = a * c;
+ uint64_t bc = b * c;
+ uint64_t ad = a * d;
+ uint64_t bd = b * d;
+ uint64_t tmp = (bd >> 32) + (ad & kM32) + (bc & kM32);
+ // By adding 1U << 31 to tmp we round the final result.
+ // Halfway cases will be round up.
+ tmp += 1U << 31;
+ uint64_t result_f = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32);
+ e_ += other.e_ + 64;
+ f_ = result_f;
+}
+
+} // namespace double_conversion
diff --git a/src/3rdparty/double-conversion/diy-fp.h b/src/3rdparty/double-conversion/diy-fp.h
new file mode 100644
index 0000000000..9dcf8fbdba
--- /dev/null
+++ b/src/3rdparty/double-conversion/diy-fp.h
@@ -0,0 +1,118 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef DOUBLE_CONVERSION_DIY_FP_H_
+#define DOUBLE_CONVERSION_DIY_FP_H_
+
+#include "utils.h"
+
+namespace double_conversion {
+
+// This "Do It Yourself Floating Point" class implements a floating-point number
+// with a uint64 significand and an int exponent. Normalized DiyFp numbers will
+// have the most significant bit of the significand set.
+// Multiplication and Subtraction do not normalize their results.
+// DiyFp are not designed to contain special doubles (NaN and Infinity).
+class DiyFp {
+ public:
+ static const int kSignificandSize = 64;
+
+ DiyFp() : f_(0), e_(0) {}
+ DiyFp(uint64_t f, int e) : f_(f), e_(e) {}
+
+ // this = this - other.
+ // The exponents of both numbers must be the same and the significand of this
+ // must be bigger than the significand of other.
+ // The result will not be normalized.
+ void Subtract(const DiyFp& other) {
+ ASSERT(e_ == other.e_);
+ ASSERT(f_ >= other.f_);
+ f_ -= other.f_;
+ }
+
+ // Returns a - b.
+ // The exponents of both numbers must be the same and this must be bigger
+ // than other. The result will not be normalized.
+ static DiyFp Minus(const DiyFp& a, const DiyFp& b) {
+ DiyFp result = a;
+ result.Subtract(b);
+ return result;
+ }
+
+
+ // this = this * other.
+ void Multiply(const DiyFp& other);
+
+ // returns a * b;
+ static DiyFp Times(const DiyFp& a, const DiyFp& b) {
+ DiyFp result = a;
+ result.Multiply(b);
+ return result;
+ }
+
+ void Normalize() {
+ ASSERT(f_ != 0);
+ uint64_t f = f_;
+ int e = e_;
+
+ // This method is mainly called for normalizing boundaries. In general
+ // boundaries need to be shifted by 10 bits. We thus optimize for this case.
+ const uint64_t k10MSBits = UINT64_2PART_C(0xFFC00000, 00000000);
+ while ((f & k10MSBits) == 0) {
+ f <<= 10;
+ e -= 10;
+ }
+ while ((f & kUint64MSB) == 0) {
+ f <<= 1;
+ e--;
+ }
+ f_ = f;
+ e_ = e;
+ }
+
+ static DiyFp Normalize(const DiyFp& a) {
+ DiyFp result = a;
+ result.Normalize();
+ return result;
+ }
+
+ uint64_t f() const { return f_; }
+ int e() const { return e_; }
+
+ void set_f(uint64_t new_value) { f_ = new_value; }
+ void set_e(int new_value) { e_ = new_value; }
+
+ private:
+ static const uint64_t kUint64MSB = UINT64_2PART_C(0x80000000, 00000000);
+
+ uint64_t f_;
+ int e_;
+};
+
+} // namespace double_conversion
+
+#endif // DOUBLE_CONVERSION_DIY_FP_H_
diff --git a/src/3rdparty/double-conversion/double-conversion.cc b/src/3rdparty/double-conversion/double-conversion.cc
new file mode 100644
index 0000000000..909985be82
--- /dev/null
+++ b/src/3rdparty/double-conversion/double-conversion.cc
@@ -0,0 +1,975 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include <limits.h>
+#include <math.h>
+
+#include "double-conversion.h"
+
+#include "bignum-dtoa.h"
+#include "fast-dtoa.h"
+#include "fixed-dtoa.h"
+#include "ieee.h"
+#include "strtod.h"
+#include "utils.h"
+
+namespace double_conversion {
+
+const DoubleToStringConverter& DoubleToStringConverter::EcmaScriptConverter() {
+ int flags = UNIQUE_ZERO | EMIT_POSITIVE_EXPONENT_SIGN;
+ static DoubleToStringConverter converter(flags,
+ "Infinity",
+ "NaN",
+ 'e',
+ -6, 21,
+ 6, 0);
+ return converter;
+}
+
+
+bool DoubleToStringConverter::HandleSpecialValues(
+ double value,
+ StringBuilder* result_builder) const {
+ Double double_inspect(value);
+ if (double_inspect.IsInfinite()) {
+ if (infinity_symbol_ == NULL) return false;
+ if (value < 0) {
+ result_builder->AddCharacter('-');
+ }
+ result_builder->AddString(infinity_symbol_);
+ return true;
+ }
+ if (double_inspect.IsNan()) {
+ if (nan_symbol_ == NULL) return false;
+ result_builder->AddString(nan_symbol_);
+ return true;
+ }
+ return false;
+}
+
+
+void DoubleToStringConverter::CreateExponentialRepresentation(
+ const char* decimal_digits,
+ int length,
+ int exponent,
+ StringBuilder* result_builder) const {
+ ASSERT(length != 0);
+ result_builder->AddCharacter(decimal_digits[0]);
+ if (length != 1) {
+ result_builder->AddCharacter('.');
+ result_builder->AddSubstring(&decimal_digits[1], length-1);
+ }
+ result_builder->AddCharacter(exponent_character_);
+ if (exponent < 0) {
+ result_builder->AddCharacter('-');
+ exponent = -exponent;
+ } else {
+ if ((flags_ & EMIT_POSITIVE_EXPONENT_SIGN) != 0) {
+ result_builder->AddCharacter('+');
+ }
+ }
+ if (exponent == 0) {
+ result_builder->AddCharacter('0');
+ return;
+ }
+ ASSERT(exponent < 1e4);
+ const int kMaxExponentLength = 5;
+ char buffer[kMaxExponentLength + 1];
+ buffer[kMaxExponentLength] = '\0';
+ int first_char_pos = kMaxExponentLength;
+ while (exponent > 0) {
+ buffer[--first_char_pos] = '0' + (exponent % 10);
+ exponent /= 10;
+ }
+ result_builder->AddSubstring(&buffer[first_char_pos],
+ kMaxExponentLength - first_char_pos);
+}
+
+
+void DoubleToStringConverter::CreateDecimalRepresentation(
+ const char* decimal_digits,
+ int length,
+ int decimal_point,
+ int digits_after_point,
+ StringBuilder* result_builder) const {
+ // Create a representation that is padded with zeros if needed.
+ if (decimal_point <= 0) {
+ // "0.00000decimal_rep".
+ result_builder->AddCharacter('0');
+ if (digits_after_point > 0) {
+ result_builder->AddCharacter('.');
+ result_builder->AddPadding('0', -decimal_point);
+ ASSERT(length <= digits_after_point - (-decimal_point));
+ result_builder->AddSubstring(decimal_digits, length);
+ int remaining_digits = digits_after_point - (-decimal_point) - length;
+ result_builder->AddPadding('0', remaining_digits);
+ }
+ } else if (decimal_point >= length) {
+ // "decimal_rep0000.00000" or "decimal_rep.0000"
+ result_builder->AddSubstring(decimal_digits, length);
+ result_builder->AddPadding('0', decimal_point - length);
+ if (digits_after_point > 0) {
+ result_builder->AddCharacter('.');
+ result_builder->AddPadding('0', digits_after_point);
+ }
+ } else {
+ // "decima.l_rep000"
+ ASSERT(digits_after_point > 0);
+ result_builder->AddSubstring(decimal_digits, decimal_point);
+ result_builder->AddCharacter('.');
+ ASSERT(length - decimal_point <= digits_after_point);
+ result_builder->AddSubstring(&decimal_digits[decimal_point],
+ length - decimal_point);
+ int remaining_digits = digits_after_point - (length - decimal_point);
+ result_builder->AddPadding('0', remaining_digits);
+ }
+ if (digits_after_point == 0) {
+ if ((flags_ & EMIT_TRAILING_DECIMAL_POINT) != 0) {
+ result_builder->AddCharacter('.');
+ }
+ if ((flags_ & EMIT_TRAILING_ZERO_AFTER_POINT) != 0) {
+ result_builder->AddCharacter('0');
+ }
+ }
+}
+
+
+bool DoubleToStringConverter::ToShortestIeeeNumber(
+ double value,
+ StringBuilder* result_builder,
+ DoubleToStringConverter::DtoaMode mode) const {
+ ASSERT(mode == SHORTEST || mode == SHORTEST_SINGLE);
+ if (Double(value).IsSpecial()) {
+ return HandleSpecialValues(value, result_builder);
+ }
+
+ int decimal_point;
+ bool sign;
+ const int kDecimalRepCapacity = kBase10MaximalLength + 1;
+ char decimal_rep[kDecimalRepCapacity];
+ int decimal_rep_length;
+
+ DoubleToAscii(value, mode, 0, decimal_rep, kDecimalRepCapacity,
+ &sign, &decimal_rep_length, &decimal_point);
+
+ bool unique_zero = (flags_ & UNIQUE_ZERO) != 0;
+ if (sign && (value != 0.0 || !unique_zero)) {
+ result_builder->AddCharacter('-');
+ }
+
+ int exponent = decimal_point - 1;
+ if ((decimal_in_shortest_low_ <= exponent) &&
+ (exponent < decimal_in_shortest_high_)) {
+ CreateDecimalRepresentation(decimal_rep, decimal_rep_length,
+ decimal_point,
+ Max(0, decimal_rep_length - decimal_point),
+ result_builder);
+ } else {
+ CreateExponentialRepresentation(decimal_rep, decimal_rep_length, exponent,
+ result_builder);
+ }
+ return true;
+}
+
+
+bool DoubleToStringConverter::ToFixed(double value,
+ int requested_digits,
+ StringBuilder* result_builder) const {
+ ASSERT(kMaxFixedDigitsBeforePoint == 60);
+ const double kFirstNonFixed = 1e60;
+
+ if (Double(value).IsSpecial()) {
+ return HandleSpecialValues(value, result_builder);
+ }
+
+ if (requested_digits > kMaxFixedDigitsAfterPoint) return false;
+ if (value >= kFirstNonFixed || value <= -kFirstNonFixed) return false;
+
+ // Find a sufficiently precise decimal representation of n.
+ int decimal_point;
+ bool sign;
+ // Add space for the '\0' byte.
+ const int kDecimalRepCapacity =
+ kMaxFixedDigitsBeforePoint + kMaxFixedDigitsAfterPoint + 1;
+ char decimal_rep[kDecimalRepCapacity];
+ int decimal_rep_length;
+ DoubleToAscii(value, FIXED, requested_digits,
+ decimal_rep, kDecimalRepCapacity,
+ &sign, &decimal_rep_length, &decimal_point);
+
+ bool unique_zero = ((flags_ & UNIQUE_ZERO) != 0);
+ if (sign && (value != 0.0 || !unique_zero)) {
+ result_builder->AddCharacter('-');
+ }
+
+ CreateDecimalRepresentation(decimal_rep, decimal_rep_length, decimal_point,
+ requested_digits, result_builder);
+ return true;
+}
+
+
+bool DoubleToStringConverter::ToExponential(
+ double value,
+ int requested_digits,
+ StringBuilder* result_builder) const {
+ if (Double(value).IsSpecial()) {
+ return HandleSpecialValues(value, result_builder);
+ }
+
+ if (requested_digits < -1) return false;
+ if (requested_digits > kMaxExponentialDigits) return false;
+
+ int decimal_point;
+ bool sign;
+ // Add space for digit before the decimal point and the '\0' character.
+ const int kDecimalRepCapacity = kMaxExponentialDigits + 2;
+ ASSERT(kDecimalRepCapacity > kBase10MaximalLength);
+ char decimal_rep[kDecimalRepCapacity];
+ int decimal_rep_length;
+
+ if (requested_digits == -1) {
+ DoubleToAscii(value, SHORTEST, 0,
+ decimal_rep, kDecimalRepCapacity,
+ &sign, &decimal_rep_length, &decimal_point);
+ } else {
+ DoubleToAscii(value, PRECISION, requested_digits + 1,
+ decimal_rep, kDecimalRepCapacity,
+ &sign, &decimal_rep_length, &decimal_point);
+ ASSERT(decimal_rep_length <= requested_digits + 1);
+
+ for (int i = decimal_rep_length; i < requested_digits + 1; ++i) {
+ decimal_rep[i] = '0';
+ }
+ decimal_rep_length = requested_digits + 1;
+ }
+
+ bool unique_zero = ((flags_ & UNIQUE_ZERO) != 0);
+ if (sign && (value != 0.0 || !unique_zero)) {
+ result_builder->AddCharacter('-');
+ }
+
+ int exponent = decimal_point - 1;
+ CreateExponentialRepresentation(decimal_rep,
+ decimal_rep_length,
+ exponent,
+ result_builder);
+ return true;
+}
+
+
+bool DoubleToStringConverter::ToPrecision(double value,
+ int precision,
+ StringBuilder* result_builder) const {
+ if (Double(value).IsSpecial()) {
+ return HandleSpecialValues(value, result_builder);
+ }
+
+ if (precision < kMinPrecisionDigits || precision > kMaxPrecisionDigits) {
+ return false;
+ }
+
+ // Find a sufficiently precise decimal representation of n.
+ int decimal_point;
+ bool sign;
+ // Add one for the terminating null character.
+ const int kDecimalRepCapacity = kMaxPrecisionDigits + 1;
+ char decimal_rep[kDecimalRepCapacity];
+ int decimal_rep_length;
+
+ DoubleToAscii(value, PRECISION, precision,
+ decimal_rep, kDecimalRepCapacity,
+ &sign, &decimal_rep_length, &decimal_point);
+ ASSERT(decimal_rep_length <= precision);
+
+ bool unique_zero = ((flags_ & UNIQUE_ZERO) != 0);
+ if (sign && (value != 0.0 || !unique_zero)) {
+ result_builder->AddCharacter('-');
+ }
+
+ // The exponent if we print the number as x.xxeyyy. That is with the
+ // decimal point after the first digit.
+ int exponent = decimal_point - 1;
+
+ int extra_zero = ((flags_ & EMIT_TRAILING_ZERO_AFTER_POINT) != 0) ? 1 : 0;
+ if ((-decimal_point + 1 > max_leading_padding_zeroes_in_precision_mode_) ||
+ (decimal_point - precision + extra_zero >
+ max_trailing_padding_zeroes_in_precision_mode_)) {
+ // Fill buffer to contain 'precision' digits.
+ // Usually the buffer is already at the correct length, but 'DoubleToAscii'
+ // is allowed to return less characters.
+ for (int i = decimal_rep_length; i < precision; ++i) {
+ decimal_rep[i] = '0';
+ }
+
+ CreateExponentialRepresentation(decimal_rep,
+ precision,
+ exponent,
+ result_builder);
+ } else {
+ CreateDecimalRepresentation(decimal_rep, decimal_rep_length, decimal_point,
+ Max(0, precision - decimal_point),
+ result_builder);
+ }
+ return true;
+}
+
+
+static BignumDtoaMode DtoaToBignumDtoaMode(
+ DoubleToStringConverter::DtoaMode dtoa_mode) {
+ switch (dtoa_mode) {
+ case DoubleToStringConverter::SHORTEST: return BIGNUM_DTOA_SHORTEST;
+ case DoubleToStringConverter::SHORTEST_SINGLE:
+ return BIGNUM_DTOA_SHORTEST_SINGLE;
+ case DoubleToStringConverter::FIXED: return BIGNUM_DTOA_FIXED;
+ case DoubleToStringConverter::PRECISION: return BIGNUM_DTOA_PRECISION;
+ default:
+ UNREACHABLE();
+ }
+}
+
+
+void DoubleToStringConverter::DoubleToAscii(double v,
+ DtoaMode mode,
+ int requested_digits,
+ char* buffer,
+ int buffer_length,
+ bool* sign,
+ int* length,
+ int* point) {
+ Vector<char> vector(buffer, buffer_length);
+ ASSERT(!Double(v).IsSpecial());
+ ASSERT(mode == SHORTEST || mode == SHORTEST_SINGLE || requested_digits >= 0);
+
+ if (Double(v).Sign() < 0) {
+ *sign = true;
+ v = -v;
+ } else {
+ *sign = false;
+ }
+
+ if (mode == PRECISION && requested_digits == 0) {
+ vector[0] = '\0';
+ *length = 0;
+ return;
+ }
+
+ if (v == 0) {
+ vector[0] = '0';
+ vector[1] = '\0';
+ *length = 1;
+ *point = 1;
+ return;
+ }
+
+ bool fast_worked;
+ switch (mode) {
+ case SHORTEST:
+ fast_worked = FastDtoa(v, FAST_DTOA_SHORTEST, 0, vector, length, point);
+ break;
+ case SHORTEST_SINGLE:
+ fast_worked = FastDtoa(v, FAST_DTOA_SHORTEST_SINGLE, 0,
+ vector, length, point);
+ break;
+ case FIXED:
+ fast_worked = FastFixedDtoa(v, requested_digits, vector, length, point);
+ break;
+ case PRECISION:
+ fast_worked = FastDtoa(v, FAST_DTOA_PRECISION, requested_digits,
+ vector, length, point);
+ break;
+ default:
+ fast_worked = false;
+ UNREACHABLE();
+ }
+ if (fast_worked) return;
+
+ // If the fast dtoa didn't succeed use the slower bignum version.
+ BignumDtoaMode bignum_mode = DtoaToBignumDtoaMode(mode);
+ BignumDtoa(v, bignum_mode, requested_digits, vector, length, point);
+ vector[*length] = '\0';
+}
+
+
+// Consumes the given substring from the iterator.
+// Returns false, if the substring does not match.
+template <class Iterator>
+static bool ConsumeSubString(Iterator* current,
+ Iterator end,
+ const char* substring) {
+ ASSERT(**current == *substring);
+ for (substring++; *substring != '\0'; substring++) {
+ ++*current;
+ if (*current == end || **current != *substring) return false;
+ }
+ ++*current;
+ return true;
+}
+
+
+// Maximum number of significant digits in decimal representation.
+// The longest possible double in decimal representation is
+// (2^53 - 1) * 2 ^ -1074 that is (2 ^ 53 - 1) * 5 ^ 1074 / 10 ^ 1074
+// (768 digits). If we parse a number whose first digits are equal to a
+// mean of 2 adjacent doubles (that could have up to 769 digits) the result
+// must be rounded to the bigger one unless the tail consists of zeros, so
+// we don't need to preserve all the digits.
+const int kMaxSignificantDigits = 772;
+
+
+static const char kWhitespaceTable7[] = { 32, 13, 10, 9, 11, 12 };
+static const int kWhitespaceTable7Length = ARRAY_SIZE(kWhitespaceTable7);
+
+
+static const uc16 kWhitespaceTable16[] = {
+ 160, 8232, 8233, 5760, 6158, 8192, 8193, 8194, 8195,
+ 8196, 8197, 8198, 8199, 8200, 8201, 8202, 8239, 8287, 12288, 65279
+};
+static const int kWhitespaceTable16Length = ARRAY_SIZE(kWhitespaceTable16);
+
+
+static bool isWhitespace(int x) {
+ if (x < 128) {
+ for (int i = 0; i < kWhitespaceTable7Length; i++) {
+ if (kWhitespaceTable7[i] == x) return true;
+ }
+ } else {
+ for (int i = 0; i < kWhitespaceTable16Length; i++) {
+ if (kWhitespaceTable16[i] == x) return true;
+ }
+ }
+ return false;
+}
+
+
+// Returns true if a nonspace found and false if the end has reached.
+template <class Iterator>
+static inline bool AdvanceToNonspace(Iterator* current, Iterator end) {
+ while (*current != end) {
+ if (!isWhitespace(**current)) return true;
+ ++*current;
+ }
+ return false;
+}
+
+
+static bool isDigit(int x, int radix) {
+ return (x >= '0' && x <= '9' && x < '0' + radix)
+ || (radix > 10 && x >= 'a' && x < 'a' + radix - 10)
+ || (radix > 10 && x >= 'A' && x < 'A' + radix - 10);
+}
+
+
+static double SignedZero(bool sign) {
+ return sign ? -0.0 : 0.0;
+}
+
+
+// Returns true if 'c' is a decimal digit that is valid for the given radix.
+//
+// The function is small and could be inlined, but VS2012 emitted a warning
+// because it constant-propagated the radix and concluded that the last
+// condition was always true. By moving it into a separate function the
+// compiler wouldn't warn anymore.
+static bool IsDecimalDigitForRadix(int c, int radix) {
+ return '0' <= c && c <= '9' && (c - '0') < radix;
+}
+
+// Returns true if 'c' is a character digit that is valid for the given radix.
+// The 'a_character' should be 'a' or 'A'.
+//
+// The function is small and could be inlined, but VS2012 emitted a warning
+// because it constant-propagated the radix and concluded that the first
+// condition was always false. By moving it into a separate function the
+// compiler wouldn't warn anymore.
+static bool IsCharacterDigitForRadix(int c, int radix, char a_character) {
+ return radix > 10 && c >= a_character && c < a_character + radix - 10;
+}
+
+
+// Parsing integers with radix 2, 4, 8, 16, 32. Assumes current != end.
+template <int radix_log_2, class Iterator>
+static double RadixStringToIeee(Iterator* current,
+ Iterator end,
+ bool sign,
+ bool allow_trailing_junk,
+ double junk_string_value,
+ bool read_as_double,
+ bool* result_is_junk) {
+ ASSERT(*current != end);
+
+ const int kDoubleSize = Double::kSignificandSize;
+ const int kSingleSize = Single::kSignificandSize;
+ const int kSignificandSize = read_as_double? kDoubleSize: kSingleSize;
+
+ *result_is_junk = true;
+
+ // Skip leading 0s.
+ while (**current == '0') {
+ ++(*current);
+ if (*current == end) {
+ *result_is_junk = false;
+ return SignedZero(sign);
+ }
+ }
+
+ int64_t number = 0;
+ int exponent = 0;
+ const int radix = (1 << radix_log_2);
+
+ do {
+ int digit;
+ if (IsDecimalDigitForRadix(**current, radix)) {
+ digit = static_cast<char>(**current) - '0';
+ } else if (IsCharacterDigitForRadix(**current, radix, 'a')) {
+ digit = static_cast<char>(**current) - 'a' + 10;
+ } else if (IsCharacterDigitForRadix(**current, radix, 'A')) {
+ digit = static_cast<char>(**current) - 'A' + 10;
+ } else {
+ if (allow_trailing_junk || !AdvanceToNonspace(current, end)) {
+ break;
+ } else {
+ return junk_string_value;
+ }
+ }
+
+ number = number * radix + digit;
+ int overflow = static_cast<int>(number >> kSignificandSize);
+ if (overflow != 0) {
+ // Overflow occurred. Need to determine which direction to round the
+ // result.
+ int overflow_bits_count = 1;
+ while (overflow > 1) {
+ overflow_bits_count++;
+ overflow >>= 1;
+ }
+
+ int dropped_bits_mask = ((1 << overflow_bits_count) - 1);
+ int dropped_bits = static_cast<int>(number) & dropped_bits_mask;
+ number >>= overflow_bits_count;
+ exponent = overflow_bits_count;
+
+ bool zero_tail = true;
+ for (;;) {
+ ++(*current);
+ if (*current == end || !isDigit(**current, radix)) break;
+ zero_tail = zero_tail && **current == '0';
+ exponent += radix_log_2;
+ }
+
+ if (!allow_trailing_junk && AdvanceToNonspace(current, end)) {
+ return junk_string_value;
+ }
+
+ int middle_value = (1 << (overflow_bits_count - 1));
+ if (dropped_bits > middle_value) {
+ number++; // Rounding up.
+ } else if (dropped_bits == middle_value) {
+ // Rounding to even to consistency with decimals: half-way case rounds
+ // up if significant part is odd and down otherwise.
+ if ((number & 1) != 0 || !zero_tail) {
+ number++; // Rounding up.
+ }
+ }
+
+ // Rounding up may cause overflow.
+ if ((number & ((int64_t)1 << kSignificandSize)) != 0) {
+ exponent++;
+ number >>= 1;
+ }
+ break;
+ }
+ ++(*current);
+ } while (*current != end);
+
+ ASSERT(number < ((int64_t)1 << kSignificandSize));
+ ASSERT(static_cast<int64_t>(static_cast<double>(number)) == number);
+
+ *result_is_junk = false;
+
+ if (exponent == 0) {
+ if (sign) {
+ if (number == 0) return -0.0;
+ number = -number;
+ }
+ return static_cast<double>(number);
+ }
+
+ ASSERT(number != 0);
+ return Double(DiyFp(number, exponent)).value();
+}
+
+
+template <class Iterator>
+double StringToDoubleConverter::StringToIeee(
+ Iterator input,
+ int length,
+ bool read_as_double,
+ int* processed_characters_count) const {
+ Iterator current = input;
+ Iterator end = input + length;
+
+ *processed_characters_count = 0;
+
+ const bool allow_trailing_junk = (flags_ & ALLOW_TRAILING_JUNK) != 0;
+ const bool allow_leading_spaces = (flags_ & ALLOW_LEADING_SPACES) != 0;
+ const bool allow_trailing_spaces = (flags_ & ALLOW_TRAILING_SPACES) != 0;
+ const bool allow_spaces_after_sign = (flags_ & ALLOW_SPACES_AFTER_SIGN) != 0;
+
+ // To make sure that iterator dereferencing is valid the following
+ // convention is used:
+ // 1. Each '++current' statement is followed by check for equality to 'end'.
+ // 2. If AdvanceToNonspace returned false then current == end.
+ // 3. If 'current' becomes equal to 'end' the function returns or goes to
+ // 'parsing_done'.
+ // 4. 'current' is not dereferenced after the 'parsing_done' label.
+ // 5. Code before 'parsing_done' may rely on 'current != end'.
+ if (current == end) return empty_string_value_;
+
+ if (allow_leading_spaces || allow_trailing_spaces) {
+ if (!AdvanceToNonspace(&current, end)) {
+ *processed_characters_count = static_cast<int>(current - input);
+ return empty_string_value_;
+ }
+ if (!allow_leading_spaces && (input != current)) {
+ // No leading spaces allowed, but AdvanceToNonspace moved forward.
+ return junk_string_value_;
+ }
+ }
+
+ // The longest form of simplified number is: "-<significant digits>.1eXXX\0".
+ const int kBufferSize = kMaxSignificantDigits + 10;
+ char buffer[kBufferSize]; // NOLINT: size is known at compile time.
+ int buffer_pos = 0;
+
+ // Exponent will be adjusted if insignificant digits of the integer part
+ // or insignificant leading zeros of the fractional part are dropped.
+ int exponent = 0;
+ int significant_digits = 0;
+ int insignificant_digits = 0;
+ bool nonzero_digit_dropped = false;
+
+ bool sign = false;
+
+ if (*current == '+' || *current == '-') {
+ sign = (*current == '-');
+ ++current;
+ Iterator next_non_space = current;
+ // Skip following spaces (if allowed).
+ if (!AdvanceToNonspace(&next_non_space, end)) return junk_string_value_;
+ if (!allow_spaces_after_sign && (current != next_non_space)) {
+ return junk_string_value_;
+ }
+ current = next_non_space;
+ }
+
+ if (infinity_symbol_ != NULL) {
+ if (*current == infinity_symbol_[0]) {
+ if (!ConsumeSubString(&current, end, infinity_symbol_)) {
+ return junk_string_value_;
+ }
+
+ if (!(allow_trailing_spaces || allow_trailing_junk) && (current != end)) {
+ return junk_string_value_;
+ }
+ if (!allow_trailing_junk && AdvanceToNonspace(&current, end)) {
+ return junk_string_value_;
+ }
+
+ ASSERT(buffer_pos == 0);
+ *processed_characters_count = static_cast<int>(current - input);
+ return sign ? -Double::Infinity() : Double::Infinity();
+ }
+ }
+
+ if (nan_symbol_ != NULL) {
+ if (*current == nan_symbol_[0]) {
+ if (!ConsumeSubString(&current, end, nan_symbol_)) {
+ return junk_string_value_;
+ }
+
+ if (!(allow_trailing_spaces || allow_trailing_junk) && (current != end)) {
+ return junk_string_value_;
+ }
+ if (!allow_trailing_junk && AdvanceToNonspace(&current, end)) {
+ return junk_string_value_;
+ }
+
+ ASSERT(buffer_pos == 0);
+ *processed_characters_count = static_cast<int>(current - input);
+ return sign ? -Double::NaN() : Double::NaN();
+ }
+ }
+
+ bool leading_zero = false;
+ if (*current == '0') {
+ ++current;
+ if (current == end) {
+ *processed_characters_count = static_cast<int>(current - input);
+ return SignedZero(sign);
+ }
+
+ leading_zero = true;
+
+ // It could be hexadecimal value.
+ if ((flags_ & ALLOW_HEX) && (*current == 'x' || *current == 'X')) {
+ ++current;
+ if (current == end || !isDigit(*current, 16)) {
+ return junk_string_value_; // "0x".
+ }
+
+ bool result_is_junk;
+ double result = RadixStringToIeee<4>(&current,
+ end,
+ sign,
+ allow_trailing_junk,
+ junk_string_value_,
+ read_as_double,
+ &result_is_junk);
+ if (!result_is_junk) {
+ if (allow_trailing_spaces) AdvanceToNonspace(&current, end);
+ *processed_characters_count = static_cast<int>(current - input);
+ }
+ return result;
+ }
+
+ // Ignore leading zeros in the integer part.
+ while (*current == '0') {
+ ++current;
+ if (current == end) {
+ *processed_characters_count = static_cast<int>(current - input);
+ return SignedZero(sign);
+ }
+ }
+ }
+
+ bool octal = leading_zero && (flags_ & ALLOW_OCTALS) != 0;
+
+ // Copy significant digits of the integer part (if any) to the buffer.
+ while (*current >= '0' && *current <= '9') {
+ if (significant_digits < kMaxSignificantDigits) {
+ ASSERT(buffer_pos < kBufferSize);
+ buffer[buffer_pos++] = static_cast<char>(*current);
+ significant_digits++;
+ // Will later check if it's an octal in the buffer.
+ } else {
+ insignificant_digits++; // Move the digit into the exponential part.
+ nonzero_digit_dropped = nonzero_digit_dropped || *current != '0';
+ }
+ octal = octal && *current < '8';
+ ++current;
+ if (current == end) goto parsing_done;
+ }
+
+ if (significant_digits == 0) {
+ octal = false;
+ }
+
+ if (*current == '.') {
+ if (octal && !allow_trailing_junk) return junk_string_value_;
+ if (octal) goto parsing_done;
+
+ ++current;
+ if (current == end) {
+ if (significant_digits == 0 && !leading_zero) {
+ return junk_string_value_;
+ } else {
+ goto parsing_done;
+ }
+ }
+
+ if (significant_digits == 0) {
+ // octal = false;
+ // Integer part consists of 0 or is absent. Significant digits start after
+ // leading zeros (if any).
+ while (*current == '0') {
+ ++current;
+ if (current == end) {
+ *processed_characters_count = static_cast<int>(current - input);
+ return SignedZero(sign);
+ }
+ exponent--; // Move this 0 into the exponent.
+ }
+ }
+
+ // There is a fractional part.
+ // We don't emit a '.', but adjust the exponent instead.
+ while (*current >= '0' && *current <= '9') {
+ if (significant_digits < kMaxSignificantDigits) {
+ ASSERT(buffer_pos < kBufferSize);
+ buffer[buffer_pos++] = static_cast<char>(*current);
+ significant_digits++;
+ exponent--;
+ } else {
+ // Ignore insignificant digits in the fractional part.
+ nonzero_digit_dropped = nonzero_digit_dropped || *current != '0';
+ }
+ ++current;
+ if (current == end) goto parsing_done;
+ }
+ }
+
+ if (!leading_zero && exponent == 0 && significant_digits == 0) {
+ // If leading_zeros is true then the string contains zeros.
+ // If exponent < 0 then string was [+-]\.0*...
+ // If significant_digits != 0 the string is not equal to 0.
+ // Otherwise there are no digits in the string.
+ return junk_string_value_;
+ }
+
+ // Parse exponential part.
+ if (*current == 'e' || *current == 'E') {
+ if (octal && !allow_trailing_junk) return junk_string_value_;
+ if (octal) goto parsing_done;
+ ++current;
+ if (current == end) {
+ if (allow_trailing_junk) {
+ goto parsing_done;
+ } else {
+ return junk_string_value_;
+ }
+ }
+ char sign = '+';
+ if (*current == '+' || *current == '-') {
+ sign = static_cast<char>(*current);
+ ++current;
+ if (current == end) {
+ if (allow_trailing_junk) {
+ goto parsing_done;
+ } else {
+ return junk_string_value_;
+ }
+ }
+ }
+
+ if (current == end || *current < '0' || *current > '9') {
+ if (allow_trailing_junk) {
+ goto parsing_done;
+ } else {
+ return junk_string_value_;
+ }
+ }
+
+ const int max_exponent = INT_MAX / 2;
+ ASSERT(-max_exponent / 2 <= exponent && exponent <= max_exponent / 2);
+ int num = 0;
+ do {
+ // Check overflow.
+ int digit = *current - '0';
+ if (num >= max_exponent / 10
+ && !(num == max_exponent / 10 && digit <= max_exponent % 10)) {
+ num = max_exponent;
+ } else {
+ num = num * 10 + digit;
+ }
+ ++current;
+ } while (current != end && *current >= '0' && *current <= '9');
+
+ exponent += (sign == '-' ? -num : num);
+ }
+
+ if (!(allow_trailing_spaces || allow_trailing_junk) && (current != end)) {
+ return junk_string_value_;
+ }
+ if (!allow_trailing_junk && AdvanceToNonspace(&current, end)) {
+ return junk_string_value_;
+ }
+ if (allow_trailing_spaces) {
+ AdvanceToNonspace(&current, end);
+ }
+
+ parsing_done:
+ exponent += insignificant_digits;
+
+ if (octal) {
+ double result;
+ bool result_is_junk;
+ char* start = buffer;
+ result = RadixStringToIeee<3>(&start,
+ buffer + buffer_pos,
+ sign,
+ allow_trailing_junk,
+ junk_string_value_,
+ read_as_double,
+ &result_is_junk);
+ ASSERT(!result_is_junk);
+ *processed_characters_count = static_cast<int>(current - input);
+ return result;
+ }
+
+ if (nonzero_digit_dropped) {
+ buffer[buffer_pos++] = '1';
+ exponent--;
+ }
+
+ ASSERT(buffer_pos < kBufferSize);
+ buffer[buffer_pos] = '\0';
+
+ double converted;
+ if (read_as_double) {
+ converted = Strtod(Vector<const char>(buffer, buffer_pos), exponent);
+ } else {
+ converted = Strtof(Vector<const char>(buffer, buffer_pos), exponent);
+ }
+ *processed_characters_count = static_cast<int>(current - input);
+ return sign? -converted: converted;
+}
+
+
+double StringToDoubleConverter::StringToDouble(
+ const char* buffer,
+ int length,
+ int* processed_characters_count) const {
+ return StringToIeee(buffer, length, true, processed_characters_count);
+}
+
+
+double StringToDoubleConverter::StringToDouble(
+ const uc16* buffer,
+ int length,
+ int* processed_characters_count) const {
+ return StringToIeee(buffer, length, true, processed_characters_count);
+}
+
+
+float StringToDoubleConverter::StringToFloat(
+ const char* buffer,
+ int length,
+ int* processed_characters_count) const {
+ return static_cast<float>(StringToIeee(buffer, length, false,
+ processed_characters_count));
+}
+
+
+float StringToDoubleConverter::StringToFloat(
+ const uc16* buffer,
+ int length,
+ int* processed_characters_count) const {
+ return static_cast<float>(StringToIeee(buffer, length, false,
+ processed_characters_count));
+}
+
+} // namespace double_conversion
diff --git a/src/3rdparty/double-conversion/double-conversion.pri b/src/3rdparty/double-conversion/double-conversion.pri
new file mode 100644
index 0000000000..3207169689
--- /dev/null
+++ b/src/3rdparty/double-conversion/double-conversion.pri
@@ -0,0 +1,24 @@
+INCLUDEPATH += $$PWD/include $$PWD/include/double-conversion
+SOURCES += \
+ $$PWD/bignum.cc \
+ $$PWD/bignum-dtoa.cc \
+ $$PWD/cached-powers.cc \
+ $$PWD/diy-fp.cc \
+ $$PWD/double-conversion.cc \
+ $$PWD/fast-dtoa.cc \
+ $$PWD/fixed-dtoa.cc \
+ $$PWD/strtod.cc
+
+HEADERS += \
+ $$PWD/bignum-dtoa.h \
+ $$PWD/bignum.h \
+ $$PWD/cached-powers.h \
+ $$PWD/diy-fp.h \
+ $$PWD/include/double-conversion/double-conversion.h \
+ $$PWD/fast-dtoa.h \
+ $$PWD/fixed-dtoa.h \
+ $$PWD/ieee.h \
+ $$PWD/strtod.h \
+ $$PWD/include/double-conversion/utils.h
+
+OTHER_FILES += README
diff --git a/src/3rdparty/double-conversion/fast-dtoa.cc b/src/3rdparty/double-conversion/fast-dtoa.cc
new file mode 100644
index 0000000000..61350383a9
--- /dev/null
+++ b/src/3rdparty/double-conversion/fast-dtoa.cc
@@ -0,0 +1,665 @@
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "fast-dtoa.h"
+
+#include "cached-powers.h"
+#include "diy-fp.h"
+#include "ieee.h"
+
+namespace double_conversion {
+
+// The minimal and maximal target exponent define the range of w's binary
+// exponent, where 'w' is the result of multiplying the input by a cached power
+// of ten.
+//
+// A different range might be chosen on a different platform, to optimize digit
+// generation, but a smaller range requires more powers of ten to be cached.
+static const int kMinimalTargetExponent = -60;
+static const int kMaximalTargetExponent = -32;
+
+
+// Adjusts the last digit of the generated number, and screens out generated
+// solutions that may be inaccurate. A solution may be inaccurate if it is
+// outside the safe interval, or if we cannot prove that it is closer to the
+// input than a neighboring representation of the same length.
+//
+// Input: * buffer containing the digits of too_high / 10^kappa
+// * the buffer's length
+// * distance_too_high_w == (too_high - w).f() * unit
+// * unsafe_interval == (too_high - too_low).f() * unit
+// * rest = (too_high - buffer * 10^kappa).f() * unit
+// * ten_kappa = 10^kappa * unit
+// * unit = the common multiplier
+// Output: returns true if the buffer is guaranteed to contain the closest
+// representable number to the input.
+// Modifies the generated digits in the buffer to approach (round towards) w.
+static bool RoundWeed(Vector<char> buffer,
+ int length,
+ uint64_t distance_too_high_w,
+ uint64_t unsafe_interval,
+ uint64_t rest,
+ uint64_t ten_kappa,
+ uint64_t unit) {
+ uint64_t small_distance = distance_too_high_w - unit;
+ uint64_t big_distance = distance_too_high_w + unit;
+ // Let w_low = too_high - big_distance, and
+ // w_high = too_high - small_distance.
+ // Note: w_low < w < w_high
+ //
+ // The real w (* unit) must lie somewhere inside the interval
+ // ]w_low; w_high[ (often written as "(w_low; w_high)")
+
+ // Basically the buffer currently contains a number in the unsafe interval
+ // ]too_low; too_high[ with too_low < w < too_high
+ //
+ // too_high - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ // ^v 1 unit ^ ^ ^ ^
+ // boundary_high --------------------- . . . .
+ // ^v 1 unit . . . .
+ // - - - - - - - - - - - - - - - - - - - + - - + - - - - - - . .
+ // . . ^ . .
+ // . big_distance . . .
+ // . . . . rest
+ // small_distance . . . .
+ // v . . . .
+ // w_high - - - - - - - - - - - - - - - - - - . . . .
+ // ^v 1 unit . . . .
+ // w ---------------------------------------- . . . .
+ // ^v 1 unit v . . .
+ // w_low - - - - - - - - - - - - - - - - - - - - - . . .
+ // . . v
+ // buffer --------------------------------------------------+-------+--------
+ // . .
+ // safe_interval .
+ // v .
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - .
+ // ^v 1 unit .
+ // boundary_low ------------------------- unsafe_interval
+ // ^v 1 unit v
+ // too_low - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ //
+ //
+ // Note that the value of buffer could lie anywhere inside the range too_low
+ // to too_high.
+ //
+ // boundary_low, boundary_high and w are approximations of the real boundaries
+ // and v (the input number). They are guaranteed to be precise up to one unit.
+ // In fact the error is guaranteed to be strictly less than one unit.
+ //
+ // Anything that lies outside the unsafe interval is guaranteed not to round
+ // to v when read again.
+ // Anything that lies inside the safe interval is guaranteed to round to v
+ // when read again.
+ // If the number inside the buffer lies inside the unsafe interval but not
+ // inside the safe interval then we simply do not know and bail out (returning
+ // false).
+ //
+ // Similarly we have to take into account the imprecision of 'w' when finding
+ // the closest representation of 'w'. If we have two potential
+ // representations, and one is closer to both w_low and w_high, then we know
+ // it is closer to the actual value v.
+ //
+ // By generating the digits of too_high we got the largest (closest to
+ // too_high) buffer that is still in the unsafe interval. In the case where
+ // w_high < buffer < too_high we try to decrement the buffer.
+ // This way the buffer approaches (rounds towards) w.
+ // There are 3 conditions that stop the decrementation process:
+ // 1) the buffer is already below w_high
+ // 2) decrementing the buffer would make it leave the unsafe interval
+ // 3) decrementing the buffer would yield a number below w_high and farther
+ // away than the current number. In other words:
+ // (buffer{-1} < w_high) && w_high - buffer{-1} > buffer - w_high
+ // Instead of using the buffer directly we use its distance to too_high.
+ // Conceptually rest ~= too_high - buffer
+ // We need to do the following tests in this order to avoid over- and
+ // underflows.
+ ASSERT(rest <= unsafe_interval);
+ while (rest < small_distance && // Negated condition 1
+ unsafe_interval - rest >= ten_kappa && // Negated condition 2
+ (rest + ten_kappa < small_distance || // buffer{-1} > w_high
+ small_distance - rest >= rest + ten_kappa - small_distance)) {
+ buffer[length - 1]--;
+ rest += ten_kappa;
+ }
+
+ // We have approached w+ as much as possible. We now test if approaching w-
+ // would require changing the buffer. If yes, then we have two possible
+ // representations close to w, but we cannot decide which one is closer.
+ if (rest < big_distance &&
+ unsafe_interval - rest >= ten_kappa &&
+ (rest + ten_kappa < big_distance ||
+ big_distance - rest > rest + ten_kappa - big_distance)) {
+ return false;
+ }
+
+ // Weeding test.
+ // The safe interval is [too_low + 2 ulp; too_high - 2 ulp]
+ // Since too_low = too_high - unsafe_interval this is equivalent to
+ // [too_high - unsafe_interval + 4 ulp; too_high - 2 ulp]
+ // Conceptually we have: rest ~= too_high - buffer
+ return (2 * unit <= rest) && (rest <= unsafe_interval - 4 * unit);
+}
+
+
+// Rounds the buffer upwards if the result is closer to v by possibly adding
+// 1 to the buffer. If the precision of the calculation is not sufficient to
+// round correctly, return false.
+// The rounding might shift the whole buffer in which case the kappa is
+// adjusted. For example "99", kappa = 3 might become "10", kappa = 4.
+//
+// If 2*rest > ten_kappa then the buffer needs to be round up.
+// rest can have an error of +/- 1 unit. This function accounts for the
+// imprecision and returns false, if the rounding direction cannot be
+// unambiguously determined.
+//
+// Precondition: rest < ten_kappa.
+static bool RoundWeedCounted(Vector<char> buffer,
+ int length,
+ uint64_t rest,
+ uint64_t ten_kappa,
+ uint64_t unit,
+ int* kappa) {
+ ASSERT(rest < ten_kappa);
+ // The following tests are done in a specific order to avoid overflows. They
+ // will work correctly with any uint64 values of rest < ten_kappa and unit.
+ //
+ // If the unit is too big, then we don't know which way to round. For example
+ // a unit of 50 means that the real number lies within rest +/- 50. If
+ // 10^kappa == 40 then there is no way to tell which way to round.
+ if (unit >= ten_kappa) return false;
+ // Even if unit is just half the size of 10^kappa we are already completely
+ // lost. (And after the previous test we know that the expression will not
+ // over/underflow.)
+ if (ten_kappa - unit <= unit) return false;
+ // If 2 * (rest + unit) <= 10^kappa we can safely round down.
+ if ((ten_kappa - rest > rest) && (ten_kappa - 2 * rest >= 2 * unit)) {
+ return true;
+ }
+ // If 2 * (rest - unit) >= 10^kappa, then we can safely round up.
+ if ((rest > unit) && (ten_kappa - (rest - unit) <= (rest - unit))) {
+ // Increment the last digit recursively until we find a non '9' digit.
+ buffer[length - 1]++;
+ for (int i = length - 1; i > 0; --i) {
+ if (buffer[i] != '0' + 10) break;
+ buffer[i] = '0';
+ buffer[i - 1]++;
+ }
+ // If the first digit is now '0'+ 10 we had a buffer with all '9's. With the
+ // exception of the first digit all digits are now '0'. Simply switch the
+ // first digit to '1' and adjust the kappa. Example: "99" becomes "10" and
+ // the power (the kappa) is increased.
+ if (buffer[0] == '0' + 10) {
+ buffer[0] = '1';
+ (*kappa) += 1;
+ }
+ return true;
+ }
+ return false;
+}
+
+// Returns the biggest power of ten that is less than or equal to the given
+// number. We furthermore receive the maximum number of bits 'number' has.
+//
+// Returns power == 10^(exponent_plus_one-1) such that
+// power <= number < power * 10.
+// If number_bits == 0 then 0^(0-1) is returned.
+// The number of bits must be <= 32.
+// Precondition: number < (1 << (number_bits + 1)).
+
+// Inspired by the method for finding an integer log base 10 from here:
+// http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10
+static unsigned int const kSmallPowersOfTen[] =
+ {0, 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000,
+ 1000000000};
+
+static void BiggestPowerTen(uint32_t number,
+ int number_bits,
+ uint32_t* power,
+ int* exponent_plus_one) {
+ ASSERT(number < (1u << (number_bits + 1)));
+ // 1233/4096 is approximately 1/lg(10).
+ int exponent_plus_one_guess = ((number_bits + 1) * 1233 >> 12);
+ // We increment to skip over the first entry in the kPowersOf10 table.
+ // Note: kPowersOf10[i] == 10^(i-1).
+ exponent_plus_one_guess++;
+ // We don't have any guarantees that 2^number_bits <= number.
+ if (number < kSmallPowersOfTen[exponent_plus_one_guess]) {
+ exponent_plus_one_guess--;
+ }
+ *power = kSmallPowersOfTen[exponent_plus_one_guess];
+ *exponent_plus_one = exponent_plus_one_guess;
+}
+
+// Generates the digits of input number w.
+// w is a floating-point number (DiyFp), consisting of a significand and an
+// exponent. Its exponent is bounded by kMinimalTargetExponent and
+// kMaximalTargetExponent.
+// Hence -60 <= w.e() <= -32.
+//
+// Returns false if it fails, in which case the generated digits in the buffer
+// should not be used.
+// Preconditions:
+// * low, w and high are correct up to 1 ulp (unit in the last place). That
+// is, their error must be less than a unit of their last digits.
+// * low.e() == w.e() == high.e()
+// * low < w < high, and taking into account their error: low~ <= high~
+// * kMinimalTargetExponent <= w.e() <= kMaximalTargetExponent
+// Postconditions: returns false if procedure fails.
+// otherwise:
+// * buffer is not null-terminated, but len contains the number of digits.
+// * buffer contains the shortest possible decimal digit-sequence
+// such that LOW < buffer * 10^kappa < HIGH, where LOW and HIGH are the
+// correct values of low and high (without their error).
+// * if more than one decimal representation gives the minimal number of
+// decimal digits then the one closest to W (where W is the correct value
+// of w) is chosen.
+// Remark: this procedure takes into account the imprecision of its input
+// numbers. If the precision is not enough to guarantee all the postconditions
+// then false is returned. This usually happens rarely (~0.5%).
+//
+// Say, for the sake of example, that
+// w.e() == -48, and w.f() == 0x1234567890abcdef
+// w's value can be computed by w.f() * 2^w.e()
+// We can obtain w's integral digits by simply shifting w.f() by -w.e().
+// -> w's integral part is 0x1234
+// w's fractional part is therefore 0x567890abcdef.
+// Printing w's integral part is easy (simply print 0x1234 in decimal).
+// In order to print its fraction we repeatedly multiply the fraction by 10 and
+// get each digit. Example the first digit after the point would be computed by
+// (0x567890abcdef * 10) >> 48. -> 3
+// The whole thing becomes slightly more complicated because we want to stop
+// once we have enough digits. That is, once the digits inside the buffer
+// represent 'w' we can stop. Everything inside the interval low - high
+// represents w. However we have to pay attention to low, high and w's
+// imprecision.
+static bool DigitGen(DiyFp low,
+ DiyFp w,
+ DiyFp high,
+ Vector<char> buffer,
+ int* length,
+ int* kappa) {
+ ASSERT(low.e() == w.e() && w.e() == high.e());
+ ASSERT(low.f() + 1 <= high.f() - 1);
+ ASSERT(kMinimalTargetExponent <= w.e() && w.e() <= kMaximalTargetExponent);
+ // low, w and high are imprecise, but by less than one ulp (unit in the last
+ // place).
+ // If we remove (resp. add) 1 ulp from low (resp. high) we are certain that
+ // the new numbers are outside of the interval we want the final
+ // representation to lie in.
+ // Inversely adding (resp. removing) 1 ulp from low (resp. high) would yield
+ // numbers that are certain to lie in the interval. We will use this fact
+ // later on.
+ // We will now start by generating the digits within the uncertain
+ // interval. Later we will weed out representations that lie outside the safe
+ // interval and thus _might_ lie outside the correct interval.
+ uint64_t unit = 1;
+ DiyFp too_low = DiyFp(low.f() - unit, low.e());
+ DiyFp too_high = DiyFp(high.f() + unit, high.e());
+ // too_low and too_high are guaranteed to lie outside the interval we want the
+ // generated number in.
+ DiyFp unsafe_interval = DiyFp::Minus(too_high, too_low);
+ // We now cut the input number into two parts: the integral digits and the
+ // fractionals. We will not write any decimal separator though, but adapt
+ // kappa instead.
+ // Reminder: we are currently computing the digits (stored inside the buffer)
+ // such that: too_low < buffer * 10^kappa < too_high
+ // We use too_high for the digit_generation and stop as soon as possible.
+ // If we stop early we effectively round down.
+ DiyFp one = DiyFp(static_cast<uint64_t>(1) << -w.e(), w.e());
+ // Division by one is a shift.
+ uint32_t integrals = static_cast<uint32_t>(too_high.f() >> -one.e());
+ // Modulo by one is an and.
+ uint64_t fractionals = too_high.f() & (one.f() - 1);
+ uint32_t divisor;
+ int divisor_exponent_plus_one;
+ BiggestPowerTen(integrals, DiyFp::kSignificandSize - (-one.e()),
+ &divisor, &divisor_exponent_plus_one);
+ *kappa = divisor_exponent_plus_one;
+ *length = 0;
+ // Loop invariant: buffer = too_high / 10^kappa (integer division)
+ // The invariant holds for the first iteration: kappa has been initialized
+ // with the divisor exponent + 1. And the divisor is the biggest power of ten
+ // that is smaller than integrals.
+ while (*kappa > 0) {
+ int digit = integrals / divisor;
+ ASSERT(digit <= 9);
+ buffer[*length] = static_cast<char>('0' + digit);
+ (*length)++;
+ integrals %= divisor;
+ (*kappa)--;
+ // Note that kappa now equals the exponent of the divisor and that the
+ // invariant thus holds again.
+ uint64_t rest =
+ (static_cast<uint64_t>(integrals) << -one.e()) + fractionals;
+ // Invariant: too_high = buffer * 10^kappa + DiyFp(rest, one.e())
+ // Reminder: unsafe_interval.e() == one.e()
+ if (rest < unsafe_interval.f()) {
+ // Rounding down (by not emitting the remaining digits) yields a number
+ // that lies within the unsafe interval.
+ return RoundWeed(buffer, *length, DiyFp::Minus(too_high, w).f(),
+ unsafe_interval.f(), rest,
+ static_cast<uint64_t>(divisor) << -one.e(), unit);
+ }
+ divisor /= 10;
+ }
+
+ // The integrals have been generated. We are at the point of the decimal
+ // separator. In the following loop we simply multiply the remaining digits by
+ // 10 and divide by one. We just need to pay attention to multiply associated
+ // data (like the interval or 'unit'), too.
+ // Note that the multiplication by 10 does not overflow, because w.e >= -60
+ // and thus one.e >= -60.
+ ASSERT(one.e() >= -60);
+ ASSERT(fractionals < one.f());
+ ASSERT(UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF) / 10 >= one.f());
+ for (;;) {
+ fractionals *= 10;
+ unit *= 10;
+ unsafe_interval.set_f(unsafe_interval.f() * 10);
+ // Integer division by one.
+ int digit = static_cast<int>(fractionals >> -one.e());
+ ASSERT(digit <= 9);
+ buffer[*length] = static_cast<char>('0' + digit);
+ (*length)++;
+ fractionals &= one.f() - 1; // Modulo by one.
+ (*kappa)--;
+ if (fractionals < unsafe_interval.f()) {
+ return RoundWeed(buffer, *length, DiyFp::Minus(too_high, w).f() * unit,
+ unsafe_interval.f(), fractionals, one.f(), unit);
+ }
+ }
+}
+
+
+
+// Generates (at most) requested_digits digits of input number w.
+// w is a floating-point number (DiyFp), consisting of a significand and an
+// exponent. Its exponent is bounded by kMinimalTargetExponent and
+// kMaximalTargetExponent.
+// Hence -60 <= w.e() <= -32.
+//
+// Returns false if it fails, in which case the generated digits in the buffer
+// should not be used.
+// Preconditions:
+// * w is correct up to 1 ulp (unit in the last place). That
+// is, its error must be strictly less than a unit of its last digit.
+// * kMinimalTargetExponent <= w.e() <= kMaximalTargetExponent
+//
+// Postconditions: returns false if procedure fails.
+// otherwise:
+// * buffer is not null-terminated, but length contains the number of
+// digits.
+// * the representation in buffer is the most precise representation of
+// requested_digits digits.
+// * buffer contains at most requested_digits digits of w. If there are less
+// than requested_digits digits then some trailing '0's have been removed.
+// * kappa is such that
+// w = buffer * 10^kappa + eps with |eps| < 10^kappa / 2.
+//
+// Remark: This procedure takes into account the imprecision of its input
+// numbers. If the precision is not enough to guarantee all the postconditions
+// then false is returned. This usually happens rarely, but the failure-rate
+// increases with higher requested_digits.
+static bool DigitGenCounted(DiyFp w,
+ int requested_digits,
+ Vector<char> buffer,
+ int* length,
+ int* kappa) {
+ ASSERT(kMinimalTargetExponent <= w.e() && w.e() <= kMaximalTargetExponent);
+ ASSERT(kMinimalTargetExponent >= -60);
+ ASSERT(kMaximalTargetExponent <= -32);
+ // w is assumed to have an error less than 1 unit. Whenever w is scaled we
+ // also scale its error.
+ uint64_t w_error = 1;
+ // We cut the input number into two parts: the integral digits and the
+ // fractional digits. We don't emit any decimal separator, but adapt kappa
+ // instead. Example: instead of writing "1.2" we put "12" into the buffer and
+ // increase kappa by 1.
+ DiyFp one = DiyFp(static_cast<uint64_t>(1) << -w.e(), w.e());
+ // Division by one is a shift.
+ uint32_t integrals = static_cast<uint32_t>(w.f() >> -one.e());
+ // Modulo by one is an and.
+ uint64_t fractionals = w.f() & (one.f() - 1);
+ uint32_t divisor;
+ int divisor_exponent_plus_one;
+ BiggestPowerTen(integrals, DiyFp::kSignificandSize - (-one.e()),
+ &divisor, &divisor_exponent_plus_one);
+ *kappa = divisor_exponent_plus_one;
+ *length = 0;
+
+ // Loop invariant: buffer = w / 10^kappa (integer division)
+ // The invariant holds for the first iteration: kappa has been initialized
+ // with the divisor exponent + 1. And the divisor is the biggest power of ten
+ // that is smaller than 'integrals'.
+ while (*kappa > 0) {
+ int digit = integrals / divisor;
+ ASSERT(digit <= 9);
+ buffer[*length] = static_cast<char>('0' + digit);
+ (*length)++;
+ requested_digits--;
+ integrals %= divisor;
+ (*kappa)--;
+ // Note that kappa now equals the exponent of the divisor and that the
+ // invariant thus holds again.
+ if (requested_digits == 0) break;
+ divisor /= 10;
+ }
+
+ if (requested_digits == 0) {
+ uint64_t rest =
+ (static_cast<uint64_t>(integrals) << -one.e()) + fractionals;
+ return RoundWeedCounted(buffer, *length, rest,
+ static_cast<uint64_t>(divisor) << -one.e(), w_error,
+ kappa);
+ }
+
+ // The integrals have been generated. We are at the point of the decimal
+ // separator. In the following loop we simply multiply the remaining digits by
+ // 10 and divide by one. We just need to pay attention to multiply associated
+ // data (the 'unit'), too.
+ // Note that the multiplication by 10 does not overflow, because w.e >= -60
+ // and thus one.e >= -60.
+ ASSERT(one.e() >= -60);
+ ASSERT(fractionals < one.f());
+ ASSERT(UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF) / 10 >= one.f());
+ while (requested_digits > 0 && fractionals > w_error) {
+ fractionals *= 10;
+ w_error *= 10;
+ // Integer division by one.
+ int digit = static_cast<int>(fractionals >> -one.e());
+ ASSERT(digit <= 9);
+ buffer[*length] = static_cast<char>('0' + digit);
+ (*length)++;
+ requested_digits--;
+ fractionals &= one.f() - 1; // Modulo by one.
+ (*kappa)--;
+ }
+ if (requested_digits != 0) return false;
+ return RoundWeedCounted(buffer, *length, fractionals, one.f(), w_error,
+ kappa);
+}
+
+
+// Provides a decimal representation of v.
+// Returns true if it succeeds, otherwise the result cannot be trusted.
+// There will be *length digits inside the buffer (not null-terminated).
+// If the function returns true then
+// v == (double) (buffer * 10^decimal_exponent).
+// The digits in the buffer are the shortest representation possible: no
+// 0.09999999999999999 instead of 0.1. The shorter representation will even be
+// chosen even if the longer one would be closer to v.
+// The last digit will be closest to the actual v. That is, even if several
+// digits might correctly yield 'v' when read again, the closest will be
+// computed.
+static bool Grisu3(double v,
+ FastDtoaMode mode,
+ Vector<char> buffer,
+ int* length,
+ int* decimal_exponent) {
+ DiyFp w = Double(v).AsNormalizedDiyFp();
+ // boundary_minus and boundary_plus are the boundaries between v and its
+ // closest floating-point neighbors. Any number strictly between
+ // boundary_minus and boundary_plus will round to v when convert to a double.
+ // Grisu3 will never output representations that lie exactly on a boundary.
+ DiyFp boundary_minus, boundary_plus;
+ if (mode == FAST_DTOA_SHORTEST) {
+ Double(v).NormalizedBoundaries(&boundary_minus, &boundary_plus);
+ } else {
+ ASSERT(mode == FAST_DTOA_SHORTEST_SINGLE);
+ float single_v = static_cast<float>(v);
+ Single(single_v).NormalizedBoundaries(&boundary_minus, &boundary_plus);
+ }
+ ASSERT(boundary_plus.e() == w.e());
+ DiyFp ten_mk; // Cached power of ten: 10^-k
+ int mk; // -k
+ int ten_mk_minimal_binary_exponent =
+ kMinimalTargetExponent - (w.e() + DiyFp::kSignificandSize);
+ int ten_mk_maximal_binary_exponent =
+ kMaximalTargetExponent - (w.e() + DiyFp::kSignificandSize);
+ PowersOfTenCache::GetCachedPowerForBinaryExponentRange(
+ ten_mk_minimal_binary_exponent,
+ ten_mk_maximal_binary_exponent,
+ &ten_mk, &mk);
+ ASSERT((kMinimalTargetExponent <= w.e() + ten_mk.e() +
+ DiyFp::kSignificandSize) &&
+ (kMaximalTargetExponent >= w.e() + ten_mk.e() +
+ DiyFp::kSignificandSize));
+ // Note that ten_mk is only an approximation of 10^-k. A DiyFp only contains a
+ // 64 bit significand and ten_mk is thus only precise up to 64 bits.
+
+ // The DiyFp::Times procedure rounds its result, and ten_mk is approximated
+ // too. The variable scaled_w (as well as scaled_boundary_minus/plus) are now
+ // off by a small amount.
+ // In fact: scaled_w - w*10^k < 1ulp (unit in the last place) of scaled_w.
+ // In other words: let f = scaled_w.f() and e = scaled_w.e(), then
+ // (f-1) * 2^e < w*10^k < (f+1) * 2^e
+ DiyFp scaled_w = DiyFp::Times(w, ten_mk);
+ ASSERT(scaled_w.e() ==
+ boundary_plus.e() + ten_mk.e() + DiyFp::kSignificandSize);
+ // In theory it would be possible to avoid some recomputations by computing
+ // the difference between w and boundary_minus/plus (a power of 2) and to
+ // compute scaled_boundary_minus/plus by subtracting/adding from
+ // scaled_w. However the code becomes much less readable and the speed
+ // enhancements are not terriffic.
+ DiyFp scaled_boundary_minus = DiyFp::Times(boundary_minus, ten_mk);
+ DiyFp scaled_boundary_plus = DiyFp::Times(boundary_plus, ten_mk);
+
+ // DigitGen will generate the digits of scaled_w. Therefore we have
+ // v == (double) (scaled_w * 10^-mk).
+ // Set decimal_exponent == -mk and pass it to DigitGen. If scaled_w is not an
+ // integer than it will be updated. For instance if scaled_w == 1.23 then
+ // the buffer will be filled with "123" und the decimal_exponent will be
+ // decreased by 2.
+ int kappa;
+ bool result = DigitGen(scaled_boundary_minus, scaled_w, scaled_boundary_plus,
+ buffer, length, &kappa);
+ *decimal_exponent = -mk + kappa;
+ return result;
+}
+
+
+// The "counted" version of grisu3 (see above) only generates requested_digits
+// number of digits. This version does not generate the shortest representation,
+// and with enough requested digits 0.1 will at some point print as 0.9999999...
+// Grisu3 is too imprecise for real halfway cases (1.5 will not work) and
+// therefore the rounding strategy for halfway cases is irrelevant.
+static bool Grisu3Counted(double v,
+ int requested_digits,
+ Vector<char> buffer,
+ int* length,
+ int* decimal_exponent) {
+ DiyFp w = Double(v).AsNormalizedDiyFp();
+ DiyFp ten_mk; // Cached power of ten: 10^-k
+ int mk; // -k
+ int ten_mk_minimal_binary_exponent =
+ kMinimalTargetExponent - (w.e() + DiyFp::kSignificandSize);
+ int ten_mk_maximal_binary_exponent =
+ kMaximalTargetExponent - (w.e() + DiyFp::kSignificandSize);
+ PowersOfTenCache::GetCachedPowerForBinaryExponentRange(
+ ten_mk_minimal_binary_exponent,
+ ten_mk_maximal_binary_exponent,
+ &ten_mk, &mk);
+ ASSERT((kMinimalTargetExponent <= w.e() + ten_mk.e() +
+ DiyFp::kSignificandSize) &&
+ (kMaximalTargetExponent >= w.e() + ten_mk.e() +
+ DiyFp::kSignificandSize));
+ // Note that ten_mk is only an approximation of 10^-k. A DiyFp only contains a
+ // 64 bit significand and ten_mk is thus only precise up to 64 bits.
+
+ // The DiyFp::Times procedure rounds its result, and ten_mk is approximated
+ // too. The variable scaled_w (as well as scaled_boundary_minus/plus) are now
+ // off by a small amount.
+ // In fact: scaled_w - w*10^k < 1ulp (unit in the last place) of scaled_w.
+ // In other words: let f = scaled_w.f() and e = scaled_w.e(), then
+ // (f-1) * 2^e < w*10^k < (f+1) * 2^e
+ DiyFp scaled_w = DiyFp::Times(w, ten_mk);
+
+ // We now have (double) (scaled_w * 10^-mk).
+ // DigitGen will generate the first requested_digits digits of scaled_w and
+ // return together with a kappa such that scaled_w ~= buffer * 10^kappa. (It
+ // will not always be exactly the same since DigitGenCounted only produces a
+ // limited number of digits.)
+ int kappa;
+ bool result = DigitGenCounted(scaled_w, requested_digits,
+ buffer, length, &kappa);
+ *decimal_exponent = -mk + kappa;
+ return result;
+}
+
+
+bool FastDtoa(double v,
+ FastDtoaMode mode,
+ int requested_digits,
+ Vector<char> buffer,
+ int* length,
+ int* decimal_point) {
+ ASSERT(v > 0);
+ ASSERT(!Double(v).IsSpecial());
+
+ bool result = false;
+ int decimal_exponent = 0;
+ switch (mode) {
+ case FAST_DTOA_SHORTEST:
+ case FAST_DTOA_SHORTEST_SINGLE:
+ result = Grisu3(v, mode, buffer, length, &decimal_exponent);
+ break;
+ case FAST_DTOA_PRECISION:
+ result = Grisu3Counted(v, requested_digits,
+ buffer, length, &decimal_exponent);
+ break;
+ default:
+ UNREACHABLE();
+ }
+ if (result) {
+ *decimal_point = *length + decimal_exponent;
+ buffer[*length] = '\0';
+ }
+ return result;
+}
+
+} // namespace double_conversion
diff --git a/src/3rdparty/double-conversion/fast-dtoa.h b/src/3rdparty/double-conversion/fast-dtoa.h
new file mode 100644
index 0000000000..5f1e8eee5e
--- /dev/null
+++ b/src/3rdparty/double-conversion/fast-dtoa.h
@@ -0,0 +1,88 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef DOUBLE_CONVERSION_FAST_DTOA_H_
+#define DOUBLE_CONVERSION_FAST_DTOA_H_
+
+#include "utils.h"
+
+namespace double_conversion {
+
+enum FastDtoaMode {
+ // Computes the shortest representation of the given input. The returned
+ // result will be the most accurate number of this length. Longer
+ // representations might be more accurate.
+ FAST_DTOA_SHORTEST,
+ // Same as FAST_DTOA_SHORTEST but for single-precision floats.
+ FAST_DTOA_SHORTEST_SINGLE,
+ // Computes a representation where the precision (number of digits) is
+ // given as input. The precision is independent of the decimal point.
+ FAST_DTOA_PRECISION
+};
+
+// FastDtoa will produce at most kFastDtoaMaximalLength digits. This does not
+// include the terminating '\0' character.
+static const int kFastDtoaMaximalLength = 17;
+// Same for single-precision numbers.
+static const int kFastDtoaMaximalSingleLength = 9;
+
+// Provides a decimal representation of v.
+// The result should be interpreted as buffer * 10^(point - length).
+//
+// Precondition:
+// * v must be a strictly positive finite double.
+//
+// Returns true if it succeeds, otherwise the result can not be trusted.
+// There will be *length digits inside the buffer followed by a null terminator.
+// If the function returns true and mode equals
+// - FAST_DTOA_SHORTEST, then
+// the parameter requested_digits is ignored.
+// The result satisfies
+// v == (double) (buffer * 10^(point - length)).
+// The digits in the buffer are the shortest representation possible. E.g.
+// if 0.099999999999 and 0.1 represent the same double then "1" is returned
+// with point = 0.
+// The last digit will be closest to the actual v. That is, even if several
+// digits might correctly yield 'v' when read again, the buffer will contain
+// the one closest to v.
+// - FAST_DTOA_PRECISION, then
+// the buffer contains requested_digits digits.
+// the difference v - (buffer * 10^(point-length)) is closest to zero for
+// all possible representations of requested_digits digits.
+// If there are two values that are equally close, then FastDtoa returns
+// false.
+// For both modes the buffer must be large enough to hold the result.
+bool FastDtoa(double d,
+ FastDtoaMode mode,
+ int requested_digits,
+ Vector<char> buffer,
+ int* length,
+ int* decimal_point);
+
+} // namespace double_conversion
+
+#endif // DOUBLE_CONVERSION_FAST_DTOA_H_
diff --git a/src/3rdparty/double-conversion/fixed-dtoa.cc b/src/3rdparty/double-conversion/fixed-dtoa.cc
new file mode 100644
index 0000000000..aef65fdc21
--- /dev/null
+++ b/src/3rdparty/double-conversion/fixed-dtoa.cc
@@ -0,0 +1,404 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include <math.h>
+
+#include "fixed-dtoa.h"
+#include "ieee.h"
+
+namespace double_conversion {
+
+// Represents a 128bit type. This class should be replaced by a native type on
+// platforms that support 128bit integers.
+class UInt128 {
+ public:
+ UInt128() : high_bits_(0), low_bits_(0) { }
+ UInt128(uint64_t high, uint64_t low) : high_bits_(high), low_bits_(low) { }
+
+ void Multiply(uint32_t multiplicand) {
+ uint64_t accumulator;
+
+ accumulator = (low_bits_ & kMask32) * multiplicand;
+ uint32_t part = static_cast<uint32_t>(accumulator & kMask32);
+ accumulator >>= 32;
+ accumulator = accumulator + (low_bits_ >> 32) * multiplicand;
+ low_bits_ = (accumulator << 32) + part;
+ accumulator >>= 32;
+ accumulator = accumulator + (high_bits_ & kMask32) * multiplicand;
+ part = static_cast<uint32_t>(accumulator & kMask32);
+ accumulator >>= 32;
+ accumulator = accumulator + (high_bits_ >> 32) * multiplicand;
+ high_bits_ = (accumulator << 32) + part;
+ ASSERT((accumulator >> 32) == 0);
+ }
+
+ void Shift(int shift_amount) {
+ ASSERT(-64 <= shift_amount && shift_amount <= 64);
+ if (shift_amount == 0) {
+ return;
+ } else if (shift_amount == -64) {
+ high_bits_ = low_bits_;
+ low_bits_ = 0;
+ } else if (shift_amount == 64) {
+ low_bits_ = high_bits_;
+ high_bits_ = 0;
+ } else if (shift_amount <= 0) {
+ high_bits_ <<= -shift_amount;
+ high_bits_ += low_bits_ >> (64 + shift_amount);
+ low_bits_ <<= -shift_amount;
+ } else {
+ low_bits_ >>= shift_amount;
+ low_bits_ += high_bits_ << (64 - shift_amount);
+ high_bits_ >>= shift_amount;
+ }
+ }
+
+ // Modifies *this to *this MOD (2^power).
+ // Returns *this DIV (2^power).
+ int DivModPowerOf2(int power) {
+ if (power >= 64) {
+ int result = static_cast<int>(high_bits_ >> (power - 64));
+ high_bits_ -= static_cast<uint64_t>(result) << (power - 64);
+ return result;
+ } else {
+ uint64_t part_low = low_bits_ >> power;
+ uint64_t part_high = high_bits_ << (64 - power);
+ int result = static_cast<int>(part_low + part_high);
+ high_bits_ = 0;
+ low_bits_ -= part_low << power;
+ return result;
+ }
+ }
+
+ bool IsZero() const {
+ return high_bits_ == 0 && low_bits_ == 0;
+ }
+
+ int BitAt(int position) {
+ if (position >= 64) {
+ return static_cast<int>(high_bits_ >> (position - 64)) & 1;
+ } else {
+ return static_cast<int>(low_bits_ >> position) & 1;
+ }
+ }
+
+ private:
+ static const uint64_t kMask32 = 0xFFFFFFFF;
+ // Value == (high_bits_ << 64) + low_bits_
+ uint64_t high_bits_;
+ uint64_t low_bits_;
+};
+
+
+static const int kDoubleSignificandSize = 53; // Includes the hidden bit.
+
+
+static void FillDigits32FixedLength(uint32_t number, int requested_length,
+ Vector<char> buffer, int* length) {
+ for (int i = requested_length - 1; i >= 0; --i) {
+ buffer[(*length) + i] = '0' + number % 10;
+ number /= 10;
+ }
+ *length += requested_length;
+}
+
+
+static void FillDigits32(uint32_t number, Vector<char> buffer, int* length) {
+ int number_length = 0;
+ // We fill the digits in reverse order and exchange them afterwards.
+ while (number != 0) {
+ int digit = number % 10;
+ number /= 10;
+ buffer[(*length) + number_length] = static_cast<char>('0' + digit);
+ number_length++;
+ }
+ // Exchange the digits.
+ int i = *length;
+ int j = *length + number_length - 1;
+ while (i < j) {
+ char tmp = buffer[i];
+ buffer[i] = buffer[j];
+ buffer[j] = tmp;
+ i++;
+ j--;
+ }
+ *length += number_length;
+}
+
+
+static void FillDigits64FixedLength(uint64_t number,
+ Vector<char> buffer, int* length) {
+ const uint32_t kTen7 = 10000000;
+ // For efficiency cut the number into 3 uint32_t parts, and print those.
+ uint32_t part2 = static_cast<uint32_t>(number % kTen7);
+ number /= kTen7;
+ uint32_t part1 = static_cast<uint32_t>(number % kTen7);
+ uint32_t part0 = static_cast<uint32_t>(number / kTen7);
+
+ FillDigits32FixedLength(part0, 3, buffer, length);
+ FillDigits32FixedLength(part1, 7, buffer, length);
+ FillDigits32FixedLength(part2, 7, buffer, length);
+}
+
+
+static void FillDigits64(uint64_t number, Vector<char> buffer, int* length) {
+ const uint32_t kTen7 = 10000000;
+ // For efficiency cut the number into 3 uint32_t parts, and print those.
+ uint32_t part2 = static_cast<uint32_t>(number % kTen7);
+ number /= kTen7;
+ uint32_t part1 = static_cast<uint32_t>(number % kTen7);
+ uint32_t part0 = static_cast<uint32_t>(number / kTen7);
+
+ if (part0 != 0) {
+ FillDigits32(part0, buffer, length);
+ FillDigits32FixedLength(part1, 7, buffer, length);
+ FillDigits32FixedLength(part2, 7, buffer, length);
+ } else if (part1 != 0) {
+ FillDigits32(part1, buffer, length);
+ FillDigits32FixedLength(part2, 7, buffer, length);
+ } else {
+ FillDigits32(part2, buffer, length);
+ }
+}
+
+
+static void RoundUp(Vector<char> buffer, int* length, int* decimal_point) {
+ // An empty buffer represents 0.
+ if (*length == 0) {
+ buffer[0] = '1';
+ *decimal_point = 1;
+ *length = 1;
+ return;
+ }
+ // Round the last digit until we either have a digit that was not '9' or until
+ // we reached the first digit.
+ buffer[(*length) - 1]++;
+ for (int i = (*length) - 1; i > 0; --i) {
+ if (buffer[i] != '0' + 10) {
+ return;
+ }
+ buffer[i] = '0';
+ buffer[i - 1]++;
+ }
+ // If the first digit is now '0' + 10, we would need to set it to '0' and add
+ // a '1' in front. However we reach the first digit only if all following
+ // digits had been '9' before rounding up. Now all trailing digits are '0' and
+ // we simply switch the first digit to '1' and update the decimal-point
+ // (indicating that the point is now one digit to the right).
+ if (buffer[0] == '0' + 10) {
+ buffer[0] = '1';
+ (*decimal_point)++;
+ }
+}
+
+
+// The given fractionals number represents a fixed-point number with binary
+// point at bit (-exponent).
+// Preconditions:
+// -128 <= exponent <= 0.
+// 0 <= fractionals * 2^exponent < 1
+// The buffer holds the result.
+// The function will round its result. During the rounding-process digits not
+// generated by this function might be updated, and the decimal-point variable
+// might be updated. If this function generates the digits 99 and the buffer
+// already contained "199" (thus yielding a buffer of "19999") then a
+// rounding-up will change the contents of the buffer to "20000".
+static void FillFractionals(uint64_t fractionals, int exponent,
+ int fractional_count, Vector<char> buffer,
+ int* length, int* decimal_point) {
+ ASSERT(-128 <= exponent && exponent <= 0);
+ // 'fractionals' is a fixed-point number, with binary point at bit
+ // (-exponent). Inside the function the non-converted remainder of fractionals
+ // is a fixed-point number, with binary point at bit 'point'.
+ if (-exponent <= 64) {
+ // One 64 bit number is sufficient.
+ ASSERT(fractionals >> 56 == 0);
+ int point = -exponent;
+ for (int i = 0; i < fractional_count; ++i) {
+ if (fractionals == 0) break;
+ // Instead of multiplying by 10 we multiply by 5 and adjust the point
+ // location. This way the fractionals variable will not overflow.
+ // Invariant at the beginning of the loop: fractionals < 2^point.
+ // Initially we have: point <= 64 and fractionals < 2^56
+ // After each iteration the point is decremented by one.
+ // Note that 5^3 = 125 < 128 = 2^7.
+ // Therefore three iterations of this loop will not overflow fractionals
+ // (even without the subtraction at the end of the loop body). At this
+ // time point will satisfy point <= 61 and therefore fractionals < 2^point
+ // and any further multiplication of fractionals by 5 will not overflow.
+ fractionals *= 5;
+ point--;
+ int digit = static_cast<int>(fractionals >> point);
+ ASSERT(digit <= 9);
+ buffer[*length] = static_cast<char>('0' + digit);
+ (*length)++;
+ fractionals -= static_cast<uint64_t>(digit) << point;
+ }
+ // If the first bit after the point is set we have to round up.
+ if (((fractionals >> (point - 1)) & 1) == 1) {
+ RoundUp(buffer, length, decimal_point);
+ }
+ } else { // We need 128 bits.
+ ASSERT(64 < -exponent && -exponent <= 128);
+ UInt128 fractionals128 = UInt128(fractionals, 0);
+ fractionals128.Shift(-exponent - 64);
+ int point = 128;
+ for (int i = 0; i < fractional_count; ++i) {
+ if (fractionals128.IsZero()) break;
+ // As before: instead of multiplying by 10 we multiply by 5 and adjust the
+ // point location.
+ // This multiplication will not overflow for the same reasons as before.
+ fractionals128.Multiply(5);
+ point--;
+ int digit = fractionals128.DivModPowerOf2(point);
+ ASSERT(digit <= 9);
+ buffer[*length] = static_cast<char>('0' + digit);
+ (*length)++;
+ }
+ if (fractionals128.BitAt(point - 1) == 1) {
+ RoundUp(buffer, length, decimal_point);
+ }
+ }
+}
+
+
+// Removes leading and trailing zeros.
+// If leading zeros are removed then the decimal point position is adjusted.
+static void TrimZeros(Vector<char> buffer, int* length, int* decimal_point) {
+ while (*length > 0 && buffer[(*length) - 1] == '0') {
+ (*length)--;
+ }
+ int first_non_zero = 0;
+ while (first_non_zero < *length && buffer[first_non_zero] == '0') {
+ first_non_zero++;
+ }
+ if (first_non_zero != 0) {
+ for (int i = first_non_zero; i < *length; ++i) {
+ buffer[i - first_non_zero] = buffer[i];
+ }
+ *length -= first_non_zero;
+ *decimal_point -= first_non_zero;
+ }
+}
+
+
+bool FastFixedDtoa(double v,
+ int fractional_count,
+ Vector<char> buffer,
+ int* length,
+ int* decimal_point) {
+ const uint32_t kMaxUInt32 = 0xFFFFFFFF;
+ uint64_t significand = Double(v).Significand();
+ int exponent = Double(v).Exponent();
+ // v = significand * 2^exponent (with significand a 53bit integer).
+ // If the exponent is larger than 20 (i.e. we may have a 73bit number) then we
+ // don't know how to compute the representation. 2^73 ~= 9.5*10^21.
+ // If necessary this limit could probably be increased, but we don't need
+ // more.
+ if (exponent > 20) return false;
+ if (fractional_count > 20) return false;
+ *length = 0;
+ // At most kDoubleSignificandSize bits of the significand are non-zero.
+ // Given a 64 bit integer we have 11 0s followed by 53 potentially non-zero
+ // bits: 0..11*..0xxx..53*..xx
+ if (exponent + kDoubleSignificandSize > 64) {
+ // The exponent must be > 11.
+ //
+ // We know that v = significand * 2^exponent.
+ // And the exponent > 11.
+ // We simplify the task by dividing v by 10^17.
+ // The quotient delivers the first digits, and the remainder fits into a 64
+ // bit number.
+ // Dividing by 10^17 is equivalent to dividing by 5^17*2^17.
+ const uint64_t kFive17 = UINT64_2PART_C(0xB1, A2BC2EC5); // 5^17
+ uint64_t divisor = kFive17;
+ int divisor_power = 17;
+ uint64_t dividend = significand;
+ uint32_t quotient;
+ uint64_t remainder;
+ // Let v = f * 2^e with f == significand and e == exponent.
+ // Then need q (quotient) and r (remainder) as follows:
+ // v = q * 10^17 + r
+ // f * 2^e = q * 10^17 + r
+ // f * 2^e = q * 5^17 * 2^17 + r
+ // If e > 17 then
+ // f * 2^(e-17) = q * 5^17 + r/2^17
+ // else
+ // f = q * 5^17 * 2^(17-e) + r/2^e
+ if (exponent > divisor_power) {
+ // We only allow exponents of up to 20 and therefore (17 - e) <= 3
+ dividend <<= exponent - divisor_power;
+ quotient = static_cast<uint32_t>(dividend / divisor);
+ remainder = (dividend % divisor) << divisor_power;
+ } else {
+ divisor <<= divisor_power - exponent;
+ quotient = static_cast<uint32_t>(dividend / divisor);
+ remainder = (dividend % divisor) << exponent;
+ }
+ FillDigits32(quotient, buffer, length);
+ FillDigits64FixedLength(remainder, buffer, length);
+ *decimal_point = *length;
+ } else if (exponent >= 0) {
+ // 0 <= exponent <= 11
+ significand <<= exponent;
+ FillDigits64(significand, buffer, length);
+ *decimal_point = *length;
+ } else if (exponent > -kDoubleSignificandSize) {
+ // We have to cut the number.
+ uint64_t integrals = significand >> -exponent;
+ uint64_t fractionals = significand - (integrals << -exponent);
+ if (integrals > kMaxUInt32) {
+ FillDigits64(integrals, buffer, length);
+ } else {
+ FillDigits32(static_cast<uint32_t>(integrals), buffer, length);
+ }
+ *decimal_point = *length;
+ FillFractionals(fractionals, exponent, fractional_count,
+ buffer, length, decimal_point);
+ } else if (exponent < -128) {
+ // This configuration (with at most 20 digits) means that all digits must be
+ // 0.
+ ASSERT(fractional_count <= 20);
+ buffer[0] = '\0';
+ *length = 0;
+ *decimal_point = -fractional_count;
+ } else {
+ *decimal_point = 0;
+ FillFractionals(significand, exponent, fractional_count,
+ buffer, length, decimal_point);
+ }
+ TrimZeros(buffer, length, decimal_point);
+ buffer[*length] = '\0';
+ if ((*length) == 0) {
+ // The string is empty and the decimal_point thus has no importance. Mimick
+ // Gay's dtoa and and set it to -fractional_count.
+ *decimal_point = -fractional_count;
+ }
+ return true;
+}
+
+} // namespace double_conversion
diff --git a/src/3rdparty/double-conversion/fixed-dtoa.h b/src/3rdparty/double-conversion/fixed-dtoa.h
new file mode 100644
index 0000000000..3bdd08e21f
--- /dev/null
+++ b/src/3rdparty/double-conversion/fixed-dtoa.h
@@ -0,0 +1,56 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef DOUBLE_CONVERSION_FIXED_DTOA_H_
+#define DOUBLE_CONVERSION_FIXED_DTOA_H_
+
+#include "utils.h"
+
+namespace double_conversion {
+
+// Produces digits necessary to print a given number with
+// 'fractional_count' digits after the decimal point.
+// The buffer must be big enough to hold the result plus one terminating null
+// character.
+//
+// The produced digits might be too short in which case the caller has to fill
+// the gaps with '0's.
+// Example: FastFixedDtoa(0.001, 5, ...) is allowed to return buffer = "1", and
+// decimal_point = -2.
+// Halfway cases are rounded towards +/-Infinity (away from 0). The call
+// FastFixedDtoa(0.15, 2, ...) thus returns buffer = "2", decimal_point = 0.
+// The returned buffer may contain digits that would be truncated from the
+// shortest representation of the input.
+//
+// This method only works for some parameters. If it can't handle the input it
+// returns false. The output is null-terminated when the function succeeds.
+bool FastFixedDtoa(double v, int fractional_count,
+ Vector<char> buffer, int* length, int* decimal_point);
+
+} // namespace double_conversion
+
+#endif // DOUBLE_CONVERSION_FIXED_DTOA_H_
diff --git a/src/3rdparty/double-conversion/ieee.h b/src/3rdparty/double-conversion/ieee.h
new file mode 100644
index 0000000000..661141d1a8
--- /dev/null
+++ b/src/3rdparty/double-conversion/ieee.h
@@ -0,0 +1,402 @@
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef DOUBLE_CONVERSION_DOUBLE_H_
+#define DOUBLE_CONVERSION_DOUBLE_H_
+
+#include "diy-fp.h"
+
+namespace double_conversion {
+
+// We assume that doubles and uint64_t have the same endianness.
+static uint64_t double_to_uint64(double d) { return BitCast<uint64_t>(d); }
+static double uint64_to_double(uint64_t d64) { return BitCast<double>(d64); }
+static uint32_t float_to_uint32(float f) { return BitCast<uint32_t>(f); }
+static float uint32_to_float(uint32_t d32) { return BitCast<float>(d32); }
+
+// Helper functions for doubles.
+class Double {
+ public:
+ static const uint64_t kSignMask = UINT64_2PART_C(0x80000000, 00000000);
+ static const uint64_t kExponentMask = UINT64_2PART_C(0x7FF00000, 00000000);
+ static const uint64_t kSignificandMask = UINT64_2PART_C(0x000FFFFF, FFFFFFFF);
+ static const uint64_t kHiddenBit = UINT64_2PART_C(0x00100000, 00000000);
+ static const int kPhysicalSignificandSize = 52; // Excludes the hidden bit.
+ static const int kSignificandSize = 53;
+
+ Double() : d64_(0) {}
+ explicit Double(double d) : d64_(double_to_uint64(d)) {}
+ explicit Double(uint64_t d64) : d64_(d64) {}
+ explicit Double(DiyFp diy_fp)
+ : d64_(DiyFpToUint64(diy_fp)) {}
+
+ // The value encoded by this Double must be greater or equal to +0.0.
+ // It must not be special (infinity, or NaN).
+ DiyFp AsDiyFp() const {
+ ASSERT(Sign() > 0);
+ ASSERT(!IsSpecial());
+ return DiyFp(Significand(), Exponent());
+ }
+
+ // The value encoded by this Double must be strictly greater than 0.
+ DiyFp AsNormalizedDiyFp() const {
+ ASSERT(value() > 0.0);
+ uint64_t f = Significand();
+ int e = Exponent();
+
+ // The current double could be a denormal.
+ while ((f & kHiddenBit) == 0) {
+ f <<= 1;
+ e--;
+ }
+ // Do the final shifts in one go.
+ f <<= DiyFp::kSignificandSize - kSignificandSize;
+ e -= DiyFp::kSignificandSize - kSignificandSize;
+ return DiyFp(f, e);
+ }
+
+ // Returns the double's bit as uint64.
+ uint64_t AsUint64() const {
+ return d64_;
+ }
+
+ // Returns the next greater double. Returns +infinity on input +infinity.
+ double NextDouble() const {
+ if (d64_ == kInfinity) return Double(kInfinity).value();
+ if (Sign() < 0 && Significand() == 0) {
+ // -0.0
+ return 0.0;
+ }
+ if (Sign() < 0) {
+ return Double(d64_ - 1).value();
+ } else {
+ return Double(d64_ + 1).value();
+ }
+ }
+
+ double PreviousDouble() const {
+ if (d64_ == (kInfinity | kSignMask)) return -Double::Infinity();
+ if (Sign() < 0) {
+ return Double(d64_ + 1).value();
+ } else {
+ if (Significand() == 0) return -0.0;
+ return Double(d64_ - 1).value();
+ }
+ }
+
+ int Exponent() const {
+ if (IsDenormal()) return kDenormalExponent;
+
+ uint64_t d64 = AsUint64();
+ int biased_e =
+ static_cast<int>((d64 & kExponentMask) >> kPhysicalSignificandSize);
+ return biased_e - kExponentBias;
+ }
+
+ uint64_t Significand() const {
+ uint64_t d64 = AsUint64();
+ uint64_t significand = d64 & kSignificandMask;
+ if (!IsDenormal()) {
+ return significand + kHiddenBit;
+ } else {
+ return significand;
+ }
+ }
+
+ // Returns true if the double is a denormal.
+ bool IsDenormal() const {
+ uint64_t d64 = AsUint64();
+ return (d64 & kExponentMask) == 0;
+ }
+
+ // We consider denormals not to be special.
+ // Hence only Infinity and NaN are special.
+ bool IsSpecial() const {
+ uint64_t d64 = AsUint64();
+ return (d64 & kExponentMask) == kExponentMask;
+ }
+
+ bool IsNan() const {
+ uint64_t d64 = AsUint64();
+ return ((d64 & kExponentMask) == kExponentMask) &&
+ ((d64 & kSignificandMask) != 0);
+ }
+
+ bool IsInfinite() const {
+ uint64_t d64 = AsUint64();
+ return ((d64 & kExponentMask) == kExponentMask) &&
+ ((d64 & kSignificandMask) == 0);
+ }
+
+ int Sign() const {
+ uint64_t d64 = AsUint64();
+ return (d64 & kSignMask) == 0? 1: -1;
+ }
+
+ // Precondition: the value encoded by this Double must be greater or equal
+ // than +0.0.
+ DiyFp UpperBoundary() const {
+ ASSERT(Sign() > 0);
+ return DiyFp(Significand() * 2 + 1, Exponent() - 1);
+ }
+
+ // Computes the two boundaries of this.
+ // The bigger boundary (m_plus) is normalized. The lower boundary has the same
+ // exponent as m_plus.
+ // Precondition: the value encoded by this Double must be greater than 0.
+ void NormalizedBoundaries(DiyFp* out_m_minus, DiyFp* out_m_plus) const {
+ ASSERT(value() > 0.0);
+ DiyFp v = this->AsDiyFp();
+ DiyFp m_plus = DiyFp::Normalize(DiyFp((v.f() << 1) + 1, v.e() - 1));
+ DiyFp m_minus;
+ if (LowerBoundaryIsCloser()) {
+ m_minus = DiyFp((v.f() << 2) - 1, v.e() - 2);
+ } else {
+ m_minus = DiyFp((v.f() << 1) - 1, v.e() - 1);
+ }
+ m_minus.set_f(m_minus.f() << (m_minus.e() - m_plus.e()));
+ m_minus.set_e(m_plus.e());
+ *out_m_plus = m_plus;
+ *out_m_minus = m_minus;
+ }
+
+ bool LowerBoundaryIsCloser() const {
+ // The boundary is closer if the significand is of the form f == 2^p-1 then
+ // the lower boundary is closer.
+ // Think of v = 1000e10 and v- = 9999e9.
+ // Then the boundary (== (v - v-)/2) is not just at a distance of 1e9 but
+ // at a distance of 1e8.
+ // The only exception is for the smallest normal: the largest denormal is
+ // at the same distance as its successor.
+ // Note: denormals have the same exponent as the smallest normals.
+ bool physical_significand_is_zero = ((AsUint64() & kSignificandMask) == 0);
+ return physical_significand_is_zero && (Exponent() != kDenormalExponent);
+ }
+
+ double value() const { return uint64_to_double(d64_); }
+
+ // Returns the significand size for a given order of magnitude.
+ // If v = f*2^e with 2^p-1 <= f <= 2^p then p+e is v's order of magnitude.
+ // This function returns the number of significant binary digits v will have
+ // once it's encoded into a double. In almost all cases this is equal to
+ // kSignificandSize. The only exceptions are denormals. They start with
+ // leading zeroes and their effective significand-size is hence smaller.
+ static int SignificandSizeForOrderOfMagnitude(int order) {
+ if (order >= (kDenormalExponent + kSignificandSize)) {
+ return kSignificandSize;
+ }
+ if (order <= kDenormalExponent) return 0;
+ return order - kDenormalExponent;
+ }
+
+ static double Infinity() {
+ return Double(kInfinity).value();
+ }
+
+ static double NaN() {
+ return Double(kNaN).value();
+ }
+
+ private:
+ static const int kExponentBias = 0x3FF + kPhysicalSignificandSize;
+ static const int kDenormalExponent = -kExponentBias + 1;
+ static const int kMaxExponent = 0x7FF - kExponentBias;
+ static const uint64_t kInfinity = UINT64_2PART_C(0x7FF00000, 00000000);
+ static const uint64_t kNaN = UINT64_2PART_C(0x7FF80000, 00000000);
+
+ const uint64_t d64_;
+
+ static uint64_t DiyFpToUint64(DiyFp diy_fp) {
+ uint64_t significand = diy_fp.f();
+ int exponent = diy_fp.e();
+ while (significand > kHiddenBit + kSignificandMask) {
+ significand >>= 1;
+ exponent++;
+ }
+ if (exponent >= kMaxExponent) {
+ return kInfinity;
+ }
+ if (exponent < kDenormalExponent) {
+ return 0;
+ }
+ while (exponent > kDenormalExponent && (significand & kHiddenBit) == 0) {
+ significand <<= 1;
+ exponent--;
+ }
+ uint64_t biased_exponent;
+ if (exponent == kDenormalExponent && (significand & kHiddenBit) == 0) {
+ biased_exponent = 0;
+ } else {
+ biased_exponent = static_cast<uint64_t>(exponent + kExponentBias);
+ }
+ return (significand & kSignificandMask) |
+ (biased_exponent << kPhysicalSignificandSize);
+ }
+
+ DISALLOW_COPY_AND_ASSIGN(Double);
+};
+
+class Single {
+ public:
+ static const uint32_t kSignMask = 0x80000000;
+ static const uint32_t kExponentMask = 0x7F800000;
+ static const uint32_t kSignificandMask = 0x007FFFFF;
+ static const uint32_t kHiddenBit = 0x00800000;
+ static const int kPhysicalSignificandSize = 23; // Excludes the hidden bit.
+ static const int kSignificandSize = 24;
+
+ Single() : d32_(0) {}
+ explicit Single(float f) : d32_(float_to_uint32(f)) {}
+ explicit Single(uint32_t d32) : d32_(d32) {}
+
+ // The value encoded by this Single must be greater or equal to +0.0.
+ // It must not be special (infinity, or NaN).
+ DiyFp AsDiyFp() const {
+ ASSERT(Sign() > 0);
+ ASSERT(!IsSpecial());
+ return DiyFp(Significand(), Exponent());
+ }
+
+ // Returns the single's bit as uint64.
+ uint32_t AsUint32() const {
+ return d32_;
+ }
+
+ int Exponent() const {
+ if (IsDenormal()) return kDenormalExponent;
+
+ uint32_t d32 = AsUint32();
+ int biased_e =
+ static_cast<int>((d32 & kExponentMask) >> kPhysicalSignificandSize);
+ return biased_e - kExponentBias;
+ }
+
+ uint32_t Significand() const {
+ uint32_t d32 = AsUint32();
+ uint32_t significand = d32 & kSignificandMask;
+ if (!IsDenormal()) {
+ return significand + kHiddenBit;
+ } else {
+ return significand;
+ }
+ }
+
+ // Returns true if the single is a denormal.
+ bool IsDenormal() const {
+ uint32_t d32 = AsUint32();
+ return (d32 & kExponentMask) == 0;
+ }
+
+ // We consider denormals not to be special.
+ // Hence only Infinity and NaN are special.
+ bool IsSpecial() const {
+ uint32_t d32 = AsUint32();
+ return (d32 & kExponentMask) == kExponentMask;
+ }
+
+ bool IsNan() const {
+ uint32_t d32 = AsUint32();
+ return ((d32 & kExponentMask) == kExponentMask) &&
+ ((d32 & kSignificandMask) != 0);
+ }
+
+ bool IsInfinite() const {
+ uint32_t d32 = AsUint32();
+ return ((d32 & kExponentMask) == kExponentMask) &&
+ ((d32 & kSignificandMask) == 0);
+ }
+
+ int Sign() const {
+ uint32_t d32 = AsUint32();
+ return (d32 & kSignMask) == 0? 1: -1;
+ }
+
+ // Computes the two boundaries of this.
+ // The bigger boundary (m_plus) is normalized. The lower boundary has the same
+ // exponent as m_plus.
+ // Precondition: the value encoded by this Single must be greater than 0.
+ void NormalizedBoundaries(DiyFp* out_m_minus, DiyFp* out_m_plus) const {
+ ASSERT(value() > 0.0);
+ DiyFp v = this->AsDiyFp();
+ DiyFp m_plus = DiyFp::Normalize(DiyFp((v.f() << 1) + 1, v.e() - 1));
+ DiyFp m_minus;
+ if (LowerBoundaryIsCloser()) {
+ m_minus = DiyFp((v.f() << 2) - 1, v.e() - 2);
+ } else {
+ m_minus = DiyFp((v.f() << 1) - 1, v.e() - 1);
+ }
+ m_minus.set_f(m_minus.f() << (m_minus.e() - m_plus.e()));
+ m_minus.set_e(m_plus.e());
+ *out_m_plus = m_plus;
+ *out_m_minus = m_minus;
+ }
+
+ // Precondition: the value encoded by this Single must be greater or equal
+ // than +0.0.
+ DiyFp UpperBoundary() const {
+ ASSERT(Sign() > 0);
+ return DiyFp(Significand() * 2 + 1, Exponent() - 1);
+ }
+
+ bool LowerBoundaryIsCloser() const {
+ // The boundary is closer if the significand is of the form f == 2^p-1 then
+ // the lower boundary is closer.
+ // Think of v = 1000e10 and v- = 9999e9.
+ // Then the boundary (== (v - v-)/2) is not just at a distance of 1e9 but
+ // at a distance of 1e8.
+ // The only exception is for the smallest normal: the largest denormal is
+ // at the same distance as its successor.
+ // Note: denormals have the same exponent as the smallest normals.
+ bool physical_significand_is_zero = ((AsUint32() & kSignificandMask) == 0);
+ return physical_significand_is_zero && (Exponent() != kDenormalExponent);
+ }
+
+ float value() const { return uint32_to_float(d32_); }
+
+ static float Infinity() {
+ return Single(kInfinity).value();
+ }
+
+ static float NaN() {
+ return Single(kNaN).value();
+ }
+
+ private:
+ static const int kExponentBias = 0x7F + kPhysicalSignificandSize;
+ static const int kDenormalExponent = -kExponentBias + 1;
+ static const int kMaxExponent = 0xFF - kExponentBias;
+ static const uint32_t kInfinity = 0x7F800000;
+ static const uint32_t kNaN = 0x7FC00000;
+
+ const uint32_t d32_;
+
+ DISALLOW_COPY_AND_ASSIGN(Single);
+};
+
+} // namespace double_conversion
+
+#endif // DOUBLE_CONVERSION_DOUBLE_H_
diff --git a/src/3rdparty/double-conversion/include/double-conversion/double-conversion.h b/src/3rdparty/double-conversion/include/double-conversion/double-conversion.h
new file mode 100644
index 0000000000..6bdfa8d25d
--- /dev/null
+++ b/src/3rdparty/double-conversion/include/double-conversion/double-conversion.h
@@ -0,0 +1,543 @@
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef DOUBLE_CONVERSION_DOUBLE_CONVERSION_H_
+#define DOUBLE_CONVERSION_DOUBLE_CONVERSION_H_
+
+#include "utils.h"
+
+namespace double_conversion {
+
+class DoubleToStringConverter {
+ public:
+ // When calling ToFixed with a double > 10^kMaxFixedDigitsBeforePoint
+ // or a requested_digits parameter > kMaxFixedDigitsAfterPoint then the
+ // function returns false.
+ static const int kMaxFixedDigitsBeforePoint = 60;
+ static const int kMaxFixedDigitsAfterPoint = 60;
+
+ // When calling ToExponential with a requested_digits
+ // parameter > kMaxExponentialDigits then the function returns false.
+ static const int kMaxExponentialDigits = 120;
+
+ // When calling ToPrecision with a requested_digits
+ // parameter < kMinPrecisionDigits or requested_digits > kMaxPrecisionDigits
+ // then the function returns false.
+ static const int kMinPrecisionDigits = 1;
+ static const int kMaxPrecisionDigits = 120;
+
+ enum Flags {
+ NO_FLAGS = 0,
+ EMIT_POSITIVE_EXPONENT_SIGN = 1,
+ EMIT_TRAILING_DECIMAL_POINT = 2,
+ EMIT_TRAILING_ZERO_AFTER_POINT = 4,
+ UNIQUE_ZERO = 8
+ };
+
+ // Flags should be a bit-or combination of the possible Flags-enum.
+ // - NO_FLAGS: no special flags.
+ // - EMIT_POSITIVE_EXPONENT_SIGN: when the number is converted into exponent
+ // form, emits a '+' for positive exponents. Example: 1.2e+2.
+ // - EMIT_TRAILING_DECIMAL_POINT: when the input number is an integer and is
+ // converted into decimal format then a trailing decimal point is appended.
+ // Example: 2345.0 is converted to "2345.".
+ // - EMIT_TRAILING_ZERO_AFTER_POINT: in addition to a trailing decimal point
+ // emits a trailing '0'-character. This flag requires the
+ // EXMIT_TRAILING_DECIMAL_POINT flag.
+ // Example: 2345.0 is converted to "2345.0".
+ // - UNIQUE_ZERO: "-0.0" is converted to "0.0".
+ //
+ // Infinity symbol and nan_symbol provide the string representation for these
+ // special values. If the string is NULL and the special value is encountered
+ // then the conversion functions return false.
+ //
+ // The exponent_character is used in exponential representations. It is
+ // usually 'e' or 'E'.
+ //
+ // When converting to the shortest representation the converter will
+ // represent input numbers in decimal format if they are in the interval
+ // [10^decimal_in_shortest_low; 10^decimal_in_shortest_high[
+ // (lower boundary included, greater boundary excluded).
+ // Example: with decimal_in_shortest_low = -6 and
+ // decimal_in_shortest_high = 21:
+ // ToShortest(0.000001) -> "0.000001"
+ // ToShortest(0.0000001) -> "1e-7"
+ // ToShortest(111111111111111111111.0) -> "111111111111111110000"
+ // ToShortest(100000000000000000000.0) -> "100000000000000000000"
+ // ToShortest(1111111111111111111111.0) -> "1.1111111111111111e+21"
+ //
+ // When converting to precision mode the converter may add
+ // max_leading_padding_zeroes before returning the number in exponential
+ // format.
+ // Example with max_leading_padding_zeroes_in_precision_mode = 6.
+ // ToPrecision(0.0000012345, 2) -> "0.0000012"
+ // ToPrecision(0.00000012345, 2) -> "1.2e-7"
+ // Similarily the converter may add up to
+ // max_trailing_padding_zeroes_in_precision_mode in precision mode to avoid
+ // returning an exponential representation. A zero added by the
+ // EMIT_TRAILING_ZERO_AFTER_POINT flag is counted for this limit.
+ // Examples for max_trailing_padding_zeroes_in_precision_mode = 1:
+ // ToPrecision(230.0, 2) -> "230"
+ // ToPrecision(230.0, 2) -> "230." with EMIT_TRAILING_DECIMAL_POINT.
+ // ToPrecision(230.0, 2) -> "2.3e2" with EMIT_TRAILING_ZERO_AFTER_POINT.
+ DoubleToStringConverter(int flags,
+ const char* infinity_symbol,
+ const char* nan_symbol,
+ char exponent_character,
+ int decimal_in_shortest_low,
+ int decimal_in_shortest_high,
+ int max_leading_padding_zeroes_in_precision_mode,
+ int max_trailing_padding_zeroes_in_precision_mode)
+ : flags_(flags),
+ infinity_symbol_(infinity_symbol),
+ nan_symbol_(nan_symbol),
+ exponent_character_(exponent_character),
+ decimal_in_shortest_low_(decimal_in_shortest_low),
+ decimal_in_shortest_high_(decimal_in_shortest_high),
+ max_leading_padding_zeroes_in_precision_mode_(
+ max_leading_padding_zeroes_in_precision_mode),
+ max_trailing_padding_zeroes_in_precision_mode_(
+ max_trailing_padding_zeroes_in_precision_mode) {
+ // When 'trailing zero after the point' is set, then 'trailing point'
+ // must be set too.
+ ASSERT(((flags & EMIT_TRAILING_DECIMAL_POINT) != 0) ||
+ !((flags & EMIT_TRAILING_ZERO_AFTER_POINT) != 0));
+ }
+
+ // Returns a converter following the EcmaScript specification.
+ static const DoubleToStringConverter& EcmaScriptConverter();
+
+ // Computes the shortest string of digits that correctly represent the input
+ // number. Depending on decimal_in_shortest_low and decimal_in_shortest_high
+ // (see constructor) it then either returns a decimal representation, or an
+ // exponential representation.
+ // Example with decimal_in_shortest_low = -6,
+ // decimal_in_shortest_high = 21,
+ // EMIT_POSITIVE_EXPONENT_SIGN activated, and
+ // EMIT_TRAILING_DECIMAL_POINT deactived:
+ // ToShortest(0.000001) -> "0.000001"
+ // ToShortest(0.0000001) -> "1e-7"
+ // ToShortest(111111111111111111111.0) -> "111111111111111110000"
+ // ToShortest(100000000000000000000.0) -> "100000000000000000000"
+ // ToShortest(1111111111111111111111.0) -> "1.1111111111111111e+21"
+ //
+ // Note: the conversion may round the output if the returned string
+ // is accurate enough to uniquely identify the input-number.
+ // For example the most precise representation of the double 9e59 equals
+ // "899999999999999918767229449717619953810131273674690656206848", but
+ // the converter will return the shorter (but still correct) "9e59".
+ //
+ // Returns true if the conversion succeeds. The conversion always succeeds
+ // except when the input value is special and no infinity_symbol or
+ // nan_symbol has been given to the constructor.
+ bool ToShortest(double value, StringBuilder* result_builder) const {
+ return ToShortestIeeeNumber(value, result_builder, SHORTEST);
+ }
+
+ // Same as ToShortest, but for single-precision floats.
+ bool ToShortestSingle(float value, StringBuilder* result_builder) const {
+ return ToShortestIeeeNumber(value, result_builder, SHORTEST_SINGLE);
+ }
+
+
+ // Computes a decimal representation with a fixed number of digits after the
+ // decimal point. The last emitted digit is rounded.
+ //
+ // Examples:
+ // ToFixed(3.12, 1) -> "3.1"
+ // ToFixed(3.1415, 3) -> "3.142"
+ // ToFixed(1234.56789, 4) -> "1234.5679"
+ // ToFixed(1.23, 5) -> "1.23000"
+ // ToFixed(0.1, 4) -> "0.1000"
+ // ToFixed(1e30, 2) -> "1000000000000000019884624838656.00"
+ // ToFixed(0.1, 30) -> "0.100000000000000005551115123126"
+ // ToFixed(0.1, 17) -> "0.10000000000000001"
+ //
+ // If requested_digits equals 0, then the tail of the result depends on
+ // the EMIT_TRAILING_DECIMAL_POINT and EMIT_TRAILING_ZERO_AFTER_POINT.
+ // Examples, for requested_digits == 0,
+ // let EMIT_TRAILING_DECIMAL_POINT and EMIT_TRAILING_ZERO_AFTER_POINT be
+ // - false and false: then 123.45 -> 123
+ // 0.678 -> 1
+ // - true and false: then 123.45 -> 123.
+ // 0.678 -> 1.
+ // - true and true: then 123.45 -> 123.0
+ // 0.678 -> 1.0
+ //
+ // Returns true if the conversion succeeds. The conversion always succeeds
+ // except for the following cases:
+ // - the input value is special and no infinity_symbol or nan_symbol has
+ // been provided to the constructor,
+ // - 'value' > 10^kMaxFixedDigitsBeforePoint, or
+ // - 'requested_digits' > kMaxFixedDigitsAfterPoint.
+ // The last two conditions imply that the result will never contain more than
+ // 1 + kMaxFixedDigitsBeforePoint + 1 + kMaxFixedDigitsAfterPoint characters
+ // (one additional character for the sign, and one for the decimal point).
+ bool ToFixed(double value,
+ int requested_digits,
+ StringBuilder* result_builder) const;
+
+ // Computes a representation in exponential format with requested_digits
+ // after the decimal point. The last emitted digit is rounded.
+ // If requested_digits equals -1, then the shortest exponential representation
+ // is computed.
+ //
+ // Examples with EMIT_POSITIVE_EXPONENT_SIGN deactivated, and
+ // exponent_character set to 'e'.
+ // ToExponential(3.12, 1) -> "3.1e0"
+ // ToExponential(5.0, 3) -> "5.000e0"
+ // ToExponential(0.001, 2) -> "1.00e-3"
+ // ToExponential(3.1415, -1) -> "3.1415e0"
+ // ToExponential(3.1415, 4) -> "3.1415e0"
+ // ToExponential(3.1415, 3) -> "3.142e0"
+ // ToExponential(123456789000000, 3) -> "1.235e14"
+ // ToExponential(1000000000000000019884624838656.0, -1) -> "1e30"
+ // ToExponential(1000000000000000019884624838656.0, 32) ->
+ // "1.00000000000000001988462483865600e30"
+ // ToExponential(1234, 0) -> "1e3"
+ //
+ // Returns true if the conversion succeeds. The conversion always succeeds
+ // except for the following cases:
+ // - the input value is special and no infinity_symbol or nan_symbol has
+ // been provided to the constructor,
+ // - 'requested_digits' > kMaxExponentialDigits.
+ // The last condition implies that the result will never contain more than
+ // kMaxExponentialDigits + 8 characters (the sign, the digit before the
+ // decimal point, the decimal point, the exponent character, the
+ // exponent's sign, and at most 3 exponent digits).
+ bool ToExponential(double value,
+ int requested_digits,
+ StringBuilder* result_builder) const;
+
+ // Computes 'precision' leading digits of the given 'value' and returns them
+ // either in exponential or decimal format, depending on
+ // max_{leading|trailing}_padding_zeroes_in_precision_mode (given to the
+ // constructor).
+ // The last computed digit is rounded.
+ //
+ // Example with max_leading_padding_zeroes_in_precision_mode = 6.
+ // ToPrecision(0.0000012345, 2) -> "0.0000012"
+ // ToPrecision(0.00000012345, 2) -> "1.2e-7"
+ // Similarily the converter may add up to
+ // max_trailing_padding_zeroes_in_precision_mode in precision mode to avoid
+ // returning an exponential representation. A zero added by the
+ // EMIT_TRAILING_ZERO_AFTER_POINT flag is counted for this limit.
+ // Examples for max_trailing_padding_zeroes_in_precision_mode = 1:
+ // ToPrecision(230.0, 2) -> "230"
+ // ToPrecision(230.0, 2) -> "230." with EMIT_TRAILING_DECIMAL_POINT.
+ // ToPrecision(230.0, 2) -> "2.3e2" with EMIT_TRAILING_ZERO_AFTER_POINT.
+ // Examples for max_trailing_padding_zeroes_in_precision_mode = 3, and no
+ // EMIT_TRAILING_ZERO_AFTER_POINT:
+ // ToPrecision(123450.0, 6) -> "123450"
+ // ToPrecision(123450.0, 5) -> "123450"
+ // ToPrecision(123450.0, 4) -> "123500"
+ // ToPrecision(123450.0, 3) -> "123000"
+ // ToPrecision(123450.0, 2) -> "1.2e5"
+ //
+ // Returns true if the conversion succeeds. The conversion always succeeds
+ // except for the following cases:
+ // - the input value is special and no infinity_symbol or nan_symbol has
+ // been provided to the constructor,
+ // - precision < kMinPericisionDigits
+ // - precision > kMaxPrecisionDigits
+ // The last condition implies that the result will never contain more than
+ // kMaxPrecisionDigits + 7 characters (the sign, the decimal point, the
+ // exponent character, the exponent's sign, and at most 3 exponent digits).
+ bool ToPrecision(double value,
+ int precision,
+ StringBuilder* result_builder) const;
+
+ enum DtoaMode {
+ // Produce the shortest correct representation.
+ // For example the output of 0.299999999999999988897 is (the less accurate
+ // but correct) 0.3.
+ SHORTEST,
+ // Same as SHORTEST, but for single-precision floats.
+ SHORTEST_SINGLE,
+ // Produce a fixed number of digits after the decimal point.
+ // For instance fixed(0.1, 4) becomes 0.1000
+ // If the input number is big, the output will be big.
+ FIXED,
+ // Fixed number of digits (independent of the decimal point).
+ PRECISION
+ };
+
+ // The maximal number of digits that are needed to emit a double in base 10.
+ // A higher precision can be achieved by using more digits, but the shortest
+ // accurate representation of any double will never use more digits than
+ // kBase10MaximalLength.
+ // Note that DoubleToAscii null-terminates its input. So the given buffer
+ // should be at least kBase10MaximalLength + 1 characters long.
+ static const int kBase10MaximalLength = 17;
+
+ // Converts the given double 'v' to ascii. 'v' must not be NaN, +Infinity, or
+ // -Infinity. In SHORTEST_SINGLE-mode this restriction also applies to 'v'
+ // after it has been casted to a single-precision float. That is, in this
+ // mode static_cast<float>(v) must not be NaN, +Infinity or -Infinity.
+ //
+ // The result should be interpreted as buffer * 10^(point-length).
+ //
+ // The output depends on the given mode:
+ // - SHORTEST: produce the least amount of digits for which the internal
+ // identity requirement is still satisfied. If the digits are printed
+ // (together with the correct exponent) then reading this number will give
+ // 'v' again. The buffer will choose the representation that is closest to
+ // 'v'. If there are two at the same distance, than the one farther away
+ // from 0 is chosen (halfway cases - ending with 5 - are rounded up).
+ // In this mode the 'requested_digits' parameter is ignored.
+ // - SHORTEST_SINGLE: same as SHORTEST but with single-precision.
+ // - FIXED: produces digits necessary to print a given number with
+ // 'requested_digits' digits after the decimal point. The produced digits
+ // might be too short in which case the caller has to fill the remainder
+ // with '0's.
+ // Example: toFixed(0.001, 5) is allowed to return buffer="1", point=-2.
+ // Halfway cases are rounded towards +/-Infinity (away from 0). The call
+ // toFixed(0.15, 2) thus returns buffer="2", point=0.
+ // The returned buffer may contain digits that would be truncated from the
+ // shortest representation of the input.
+ // - PRECISION: produces 'requested_digits' where the first digit is not '0'.
+ // Even though the length of produced digits usually equals
+ // 'requested_digits', the function is allowed to return fewer digits, in
+ // which case the caller has to fill the missing digits with '0's.
+ // Halfway cases are again rounded away from 0.
+ // DoubleToAscii expects the given buffer to be big enough to hold all
+ // digits and a terminating null-character. In SHORTEST-mode it expects a
+ // buffer of at least kBase10MaximalLength + 1. In all other modes the
+ // requested_digits parameter and the padding-zeroes limit the size of the
+ // output. Don't forget the decimal point, the exponent character and the
+ // terminating null-character when computing the maximal output size.
+ // The given length is only used in debug mode to ensure the buffer is big
+ // enough.
+ static void DoubleToAscii(double v,
+ DtoaMode mode,
+ int requested_digits,
+ char* buffer,
+ int buffer_length,
+ bool* sign,
+ int* length,
+ int* point);
+
+ private:
+ // Implementation for ToShortest and ToShortestSingle.
+ bool ToShortestIeeeNumber(double value,
+ StringBuilder* result_builder,
+ DtoaMode mode) const;
+
+ // If the value is a special value (NaN or Infinity) constructs the
+ // corresponding string using the configured infinity/nan-symbol.
+ // If either of them is NULL or the value is not special then the
+ // function returns false.
+ bool HandleSpecialValues(double value, StringBuilder* result_builder) const;
+ // Constructs an exponential representation (i.e. 1.234e56).
+ // The given exponent assumes a decimal point after the first decimal digit.
+ void CreateExponentialRepresentation(const char* decimal_digits,
+ int length,
+ int exponent,
+ StringBuilder* result_builder) const;
+ // Creates a decimal representation (i.e 1234.5678).
+ void CreateDecimalRepresentation(const char* decimal_digits,
+ int length,
+ int decimal_point,
+ int digits_after_point,
+ StringBuilder* result_builder) const;
+
+ const int flags_;
+ const char* const infinity_symbol_;
+ const char* const nan_symbol_;
+ const char exponent_character_;
+ const int decimal_in_shortest_low_;
+ const int decimal_in_shortest_high_;
+ const int max_leading_padding_zeroes_in_precision_mode_;
+ const int max_trailing_padding_zeroes_in_precision_mode_;
+
+ DISALLOW_IMPLICIT_CONSTRUCTORS(DoubleToStringConverter);
+};
+
+
+class StringToDoubleConverter {
+ public:
+ // Enumeration for allowing octals and ignoring junk when converting
+ // strings to numbers.
+ enum Flags {
+ NO_FLAGS = 0,
+ ALLOW_HEX = 1,
+ ALLOW_OCTALS = 2,
+ ALLOW_TRAILING_JUNK = 4,
+ ALLOW_LEADING_SPACES = 8,
+ ALLOW_TRAILING_SPACES = 16,
+ ALLOW_SPACES_AFTER_SIGN = 32
+ };
+
+ // Flags should be a bit-or combination of the possible Flags-enum.
+ // - NO_FLAGS: no special flags.
+ // - ALLOW_HEX: recognizes the prefix "0x". Hex numbers may only be integers.
+ // Ex: StringToDouble("0x1234") -> 4660.0
+ // In StringToDouble("0x1234.56") the characters ".56" are trailing
+ // junk. The result of the call is hence dependent on
+ // the ALLOW_TRAILING_JUNK flag and/or the junk value.
+ // With this flag "0x" is a junk-string. Even with ALLOW_TRAILING_JUNK,
+ // the string will not be parsed as "0" followed by junk.
+ //
+ // - ALLOW_OCTALS: recognizes the prefix "0" for octals:
+ // If a sequence of octal digits starts with '0', then the number is
+ // read as octal integer. Octal numbers may only be integers.
+ // Ex: StringToDouble("01234") -> 668.0
+ // StringToDouble("012349") -> 12349.0 // Not a sequence of octal
+ // // digits.
+ // In StringToDouble("01234.56") the characters ".56" are trailing
+ // junk. The result of the call is hence dependent on
+ // the ALLOW_TRAILING_JUNK flag and/or the junk value.
+ // In StringToDouble("01234e56") the characters "e56" are trailing
+ // junk, too.
+ // - ALLOW_TRAILING_JUNK: ignore trailing characters that are not part of
+ // a double literal.
+ // - ALLOW_LEADING_SPACES: skip over leading whitespace, including spaces,
+ // new-lines, and tabs.
+ // - ALLOW_TRAILING_SPACES: ignore trailing whitespace.
+ // - ALLOW_SPACES_AFTER_SIGN: ignore whitespace after the sign.
+ // Ex: StringToDouble("- 123.2") -> -123.2.
+ // StringToDouble("+ 123.2") -> 123.2
+ //
+ // empty_string_value is returned when an empty string is given as input.
+ // If ALLOW_LEADING_SPACES or ALLOW_TRAILING_SPACES are set, then a string
+ // containing only spaces is converted to the 'empty_string_value', too.
+ //
+ // junk_string_value is returned when
+ // a) ALLOW_TRAILING_JUNK is not set, and a junk character (a character not
+ // part of a double-literal) is found.
+ // b) ALLOW_TRAILING_JUNK is set, but the string does not start with a
+ // double literal.
+ //
+ // infinity_symbol and nan_symbol are strings that are used to detect
+ // inputs that represent infinity and NaN. They can be null, in which case
+ // they are ignored.
+ // The conversion routine first reads any possible signs. Then it compares the
+ // following character of the input-string with the first character of
+ // the infinity, and nan-symbol. If either matches, the function assumes, that
+ // a match has been found, and expects the following input characters to match
+ // the remaining characters of the special-value symbol.
+ // This means that the following restrictions apply to special-value symbols:
+ // - they must not start with signs ('+', or '-'),
+ // - they must not have the same first character.
+ // - they must not start with digits.
+ //
+ // Examples:
+ // flags = ALLOW_HEX | ALLOW_TRAILING_JUNK,
+ // empty_string_value = 0.0,
+ // junk_string_value = NaN,
+ // infinity_symbol = "infinity",
+ // nan_symbol = "nan":
+ // StringToDouble("0x1234") -> 4660.0.
+ // StringToDouble("0x1234K") -> 4660.0.
+ // StringToDouble("") -> 0.0 // empty_string_value.
+ // StringToDouble(" ") -> NaN // junk_string_value.
+ // StringToDouble(" 1") -> NaN // junk_string_value.
+ // StringToDouble("0x") -> NaN // junk_string_value.
+ // StringToDouble("-123.45") -> -123.45.
+ // StringToDouble("--123.45") -> NaN // junk_string_value.
+ // StringToDouble("123e45") -> 123e45.
+ // StringToDouble("123E45") -> 123e45.
+ // StringToDouble("123e+45") -> 123e45.
+ // StringToDouble("123E-45") -> 123e-45.
+ // StringToDouble("123e") -> 123.0 // trailing junk ignored.
+ // StringToDouble("123e-") -> 123.0 // trailing junk ignored.
+ // StringToDouble("+NaN") -> NaN // NaN string literal.
+ // StringToDouble("-infinity") -> -inf. // infinity literal.
+ // StringToDouble("Infinity") -> NaN // junk_string_value.
+ //
+ // flags = ALLOW_OCTAL | ALLOW_LEADING_SPACES,
+ // empty_string_value = 0.0,
+ // junk_string_value = NaN,
+ // infinity_symbol = NULL,
+ // nan_symbol = NULL:
+ // StringToDouble("0x1234") -> NaN // junk_string_value.
+ // StringToDouble("01234") -> 668.0.
+ // StringToDouble("") -> 0.0 // empty_string_value.
+ // StringToDouble(" ") -> 0.0 // empty_string_value.
+ // StringToDouble(" 1") -> 1.0
+ // StringToDouble("0x") -> NaN // junk_string_value.
+ // StringToDouble("0123e45") -> NaN // junk_string_value.
+ // StringToDouble("01239E45") -> 1239e45.
+ // StringToDouble("-infinity") -> NaN // junk_string_value.
+ // StringToDouble("NaN") -> NaN // junk_string_value.
+ StringToDoubleConverter(int flags,
+ double empty_string_value,
+ double junk_string_value,
+ const char* infinity_symbol,
+ const char* nan_symbol)
+ : flags_(flags),
+ empty_string_value_(empty_string_value),
+ junk_string_value_(junk_string_value),
+ infinity_symbol_(infinity_symbol),
+ nan_symbol_(nan_symbol) {
+ }
+
+ // Performs the conversion.
+ // The output parameter 'processed_characters_count' is set to the number
+ // of characters that have been processed to read the number.
+ // Spaces than are processed with ALLOW_{LEADING|TRAILING}_SPACES are included
+ // in the 'processed_characters_count'. Trailing junk is never included.
+ double StringToDouble(const char* buffer,
+ int length,
+ int* processed_characters_count) const;
+
+ // Same as StringToDouble above but for 16 bit characters.
+ double StringToDouble(const uc16* buffer,
+ int length,
+ int* processed_characters_count) const;
+
+ // Same as StringToDouble but reads a float.
+ // Note that this is not equivalent to static_cast<float>(StringToDouble(...))
+ // due to potential double-rounding.
+ float StringToFloat(const char* buffer,
+ int length,
+ int* processed_characters_count) const;
+
+ // Same as StringToFloat above but for 16 bit characters.
+ float StringToFloat(const uc16* buffer,
+ int length,
+ int* processed_characters_count) const;
+
+ private:
+ const int flags_;
+ const double empty_string_value_;
+ const double junk_string_value_;
+ const char* const infinity_symbol_;
+ const char* const nan_symbol_;
+
+ template <class Iterator>
+ double StringToIeee(Iterator start_pointer,
+ int length,
+ bool read_as_double,
+ int* processed_characters_count) const;
+
+ DISALLOW_IMPLICIT_CONSTRUCTORS(StringToDoubleConverter);
+};
+
+} // namespace double_conversion
+
+#endif // DOUBLE_CONVERSION_DOUBLE_CONVERSION_H_
diff --git a/src/3rdparty/double-conversion/include/double-conversion/utils.h b/src/3rdparty/double-conversion/include/double-conversion/utils.h
new file mode 100644
index 0000000000..53eec64282
--- /dev/null
+++ b/src/3rdparty/double-conversion/include/double-conversion/utils.h
@@ -0,0 +1,330 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef DOUBLE_CONVERSION_UTILS_H_
+#define DOUBLE_CONVERSION_UTILS_H_
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <assert.h>
+#ifndef ASSERT
+# if defined(WINCE) || defined(_WIN32_WCE)
+# define ASSERT(condition)
+# else
+# define ASSERT(condition) \
+ assert(condition);
+# endif
+#endif
+#ifndef UNIMPLEMENTED
+# define UNIMPLEMENTED() (exit(-1))
+#endif
+#ifndef UNREACHABLE
+# define UNREACHABLE() (exit(-1))
+#endif
+
+// Double operations detection based on target architecture.
+// Linux uses a 80bit wide floating point stack on x86. This induces double
+// rounding, which in turn leads to wrong results.
+// An easy way to test if the floating-point operations are correct is to
+// evaluate: 89255.0/1e22. If the floating-point stack is 64 bits wide then
+// the result is equal to 89255e-22.
+// The best way to test this, is to create a division-function and to compare
+// the output of the division with the expected result. (Inlining must be
+// disabled.)
+// On Linux,x86 89255e-22 != Div_double(89255.0/1e22)
+#if defined(_M_X64) || defined(__x86_64__) || \
+ defined(__ARMEL__) || defined(__avr32__) || _M_ARM_FP || \
+ defined(__hppa__) || defined(__ia64__) || \
+ defined(__mips__) || \
+ defined(__powerpc__) || defined(__ppc__) || defined(__ppc64__) || \
+ defined(__sparc__) || defined(__sparc) || defined(__s390__) || \
+ defined(__SH4__) || defined(__alpha__) || \
+ defined(_MIPS_ARCH_MIPS32R2) || \
+ defined(__AARCH64EL__)
+#define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1
+#elif defined(_M_IX86) || defined(__i386__) || defined(__i386)
+#if defined(_WIN32)
+// Windows uses a 64bit wide floating point stack.
+#define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1
+#else
+#undef DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS
+#endif // _WIN32
+#elif defined(WINCE) || defined(_WIN32_WCE)
+#define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1
+#else
+#error Target architecture was not detected as supported by Double-Conversion.
+#endif
+
+#if defined(__GNUC__)
+#define DOUBLE_CONVERSION_UNUSED __attribute__((unused))
+#else
+#define DOUBLE_CONVERSION_UNUSED
+#endif
+
+#if defined(_WIN32) && !defined(__MINGW32__)
+
+typedef signed char int8_t;
+typedef unsigned char uint8_t;
+typedef short int16_t; // NOLINT
+typedef unsigned short uint16_t; // NOLINT
+typedef int int32_t;
+typedef unsigned int uint32_t;
+typedef __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+// intptr_t and friends are defined in crtdefs.h through stdio.h.
+
+#else
+
+#include <stdint.h>
+
+#endif
+
+typedef uint16_t uc16;
+
+// The following macro works on both 32 and 64-bit platforms.
+// Usage: instead of writing 0x1234567890123456
+// write UINT64_2PART_C(0x12345678,90123456);
+#define UINT64_2PART_C(a, b) (((static_cast<uint64_t>(a) << 32) + 0x##b##u))
+
+
+// The expression ARRAY_SIZE(a) is a compile-time constant of type
+// size_t which represents the number of elements of the given
+// array. You should only use ARRAY_SIZE on statically allocated
+// arrays.
+#ifndef ARRAY_SIZE
+#define ARRAY_SIZE(a) \
+ ((sizeof(a) / sizeof(*(a))) / \
+ static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
+#endif
+
+// A macro to disallow the evil copy constructor and operator= functions
+// This should be used in the private: declarations for a class
+#ifndef DISALLOW_COPY_AND_ASSIGN
+#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
+ TypeName(const TypeName&); \
+ void operator=(const TypeName&)
+#endif
+
+// A macro to disallow all the implicit constructors, namely the
+// default constructor, copy constructor and operator= functions.
+//
+// This should be used in the private: declarations for a class
+// that wants to prevent anyone from instantiating it. This is
+// especially useful for classes containing only static methods.
+#ifndef DISALLOW_IMPLICIT_CONSTRUCTORS
+#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \
+ TypeName(); \
+ DISALLOW_COPY_AND_ASSIGN(TypeName)
+#endif
+
+namespace double_conversion {
+
+static const int kCharSize = sizeof(char);
+
+// Returns the maximum of the two parameters.
+template <typename T>
+static T Max(T a, T b) {
+ return a < b ? b : a;
+}
+
+
+// Returns the minimum of the two parameters.
+template <typename T>
+static T Min(T a, T b) {
+ return a < b ? a : b;
+}
+
+
+inline int StrLength(const char* string) {
+ size_t length = strlen(string);
+ ASSERT(length == static_cast<size_t>(static_cast<int>(length)));
+ return static_cast<int>(length);
+}
+
+// This is a simplified version of V8's Vector class.
+template <typename T>
+class Vector {
+ public:
+ Vector() : start_(NULL), length_(0) {}
+ Vector(T* data, int length) : start_(data), length_(length) {
+ ASSERT(length == 0 || (length > 0 && data != NULL));
+ }
+
+ // Returns a vector using the same backing storage as this one,
+ // spanning from and including 'from', to but not including 'to'.
+ Vector<T> SubVector(int from, int to) {
+ ASSERT(to <= length_);
+ ASSERT(from < to);
+ ASSERT(0 <= from);
+ return Vector<T>(start() + from, to - from);
+ }
+
+ // Returns the length of the vector.
+ int length() const { return length_; }
+
+ // Returns whether or not the vector is empty.
+ bool is_empty() const { return length_ == 0; }
+
+ // Returns the pointer to the start of the data in the vector.
+ T* start() const { return start_; }
+
+ // Access individual vector elements - checks bounds in debug mode.
+ T& operator[](int index) const {
+ ASSERT(0 <= index && index < length_);
+ return start_[index];
+ }
+
+ T& first() { return start_[0]; }
+
+ T& last() { return start_[length_ - 1]; }
+
+ private:
+ T* start_;
+ int length_;
+};
+
+
+// Helper class for building result strings in a character buffer. The
+// purpose of the class is to use safe operations that checks the
+// buffer bounds on all operations in debug mode.
+class StringBuilder {
+ public:
+ StringBuilder(char* buffer, int size)
+ : buffer_(buffer, size), position_(0) { }
+
+ ~StringBuilder() { if (!is_finalized()) Finalize(); }
+
+ int size() const { return buffer_.length(); }
+
+ // Get the current position in the builder.
+ int position() const {
+ ASSERT(!is_finalized());
+ return position_;
+ }
+
+ // Reset the position.
+ void Reset() { position_ = 0; }
+
+ // Add a single character to the builder. It is not allowed to add
+ // 0-characters; use the Finalize() method to terminate the string
+ // instead.
+ void AddCharacter(char c) {
+ ASSERT(c != '\0');
+ ASSERT(!is_finalized() && position_ < buffer_.length());
+ buffer_[position_++] = c;
+ }
+
+ // Add an entire string to the builder. Uses strlen() internally to
+ // compute the length of the input string.
+ void AddString(const char* s) {
+ AddSubstring(s, StrLength(s));
+ }
+
+ // Add the first 'n' characters of the given string 's' to the
+ // builder. The input string must have enough characters.
+ void AddSubstring(const char* s, int n) {
+ ASSERT(!is_finalized() && position_ + n < buffer_.length());
+ ASSERT(static_cast<size_t>(n) <= strlen(s));
+ memmove(&buffer_[position_], s, n * kCharSize);
+ position_ += n;
+ }
+
+
+ // Add character padding to the builder. If count is non-positive,
+ // nothing is added to the builder.
+ void AddPadding(char c, int count) {
+ for (int i = 0; i < count; i++) {
+ AddCharacter(c);
+ }
+ }
+
+ // Finalize the string by 0-terminating it and returning the buffer.
+ char* Finalize() {
+ ASSERT(!is_finalized() && position_ < buffer_.length());
+ buffer_[position_] = '\0';
+ // Make sure nobody managed to add a 0-character to the
+ // buffer while building the string.
+ ASSERT(strlen(buffer_.start()) == static_cast<size_t>(position_));
+ position_ = -1;
+ ASSERT(is_finalized());
+ return buffer_.start();
+ }
+
+ private:
+ Vector<char> buffer_;
+ int position_;
+
+ bool is_finalized() const { return position_ < 0; }
+
+ DISALLOW_IMPLICIT_CONSTRUCTORS(StringBuilder);
+};
+
+// The type-based aliasing rule allows the compiler to assume that pointers of
+// different types (for some definition of different) never alias each other.
+// Thus the following code does not work:
+//
+// float f = foo();
+// int fbits = *(int*)(&f);
+//
+// The compiler 'knows' that the int pointer can't refer to f since the types
+// don't match, so the compiler may cache f in a register, leaving random data
+// in fbits. Using C++ style casts makes no difference, however a pointer to
+// char data is assumed to alias any other pointer. This is the 'memcpy
+// exception'.
+//
+// Bit_cast uses the memcpy exception to move the bits from a variable of one
+// type of a variable of another type. Of course the end result is likely to
+// be implementation dependent. Most compilers (gcc-4.2 and MSVC 2005)
+// will completely optimize BitCast away.
+//
+// There is an additional use for BitCast.
+// Recent gccs will warn when they see casts that may result in breakage due to
+// the type-based aliasing rule. If you have checked that there is no breakage
+// you can use BitCast to cast one pointer type to another. This confuses gcc
+// enough that it can no longer see that you have cast one pointer type to
+// another thus avoiding the warning.
+template <class Dest, class Source>
+inline Dest BitCast(const Source& source) {
+ // Compile time assertion: sizeof(Dest) == sizeof(Source)
+ // A compile error here means your Dest and Source have different sizes.
+ DOUBLE_CONVERSION_UNUSED
+ typedef char VerifySizesAreEqual[sizeof(Dest) == sizeof(Source) ? 1 : -1];
+
+ Dest dest;
+ memmove(&dest, &source, sizeof(dest));
+ return dest;
+}
+
+template <class Dest, class Source>
+inline Dest BitCast(Source* source) {
+ return BitCast<Dest>(reinterpret_cast<uintptr_t>(source));
+}
+
+} // namespace double_conversion
+
+#endif // DOUBLE_CONVERSION_UTILS_H_
diff --git a/src/3rdparty/double-conversion/strtod.cc b/src/3rdparty/double-conversion/strtod.cc
new file mode 100644
index 0000000000..34717562bd
--- /dev/null
+++ b/src/3rdparty/double-conversion/strtod.cc
@@ -0,0 +1,555 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include <stdarg.h>
+#include <limits.h>
+
+#include "strtod.h"
+#include "bignum.h"
+#include "cached-powers.h"
+#include "ieee.h"
+
+namespace double_conversion {
+
+// 2^53 = 9007199254740992.
+// Any integer with at most 15 decimal digits will hence fit into a double
+// (which has a 53bit significand) without loss of precision.
+static const int kMaxExactDoubleIntegerDecimalDigits = 15;
+// 2^64 = 18446744073709551616 > 10^19
+static const int kMaxUint64DecimalDigits = 19;
+
+// Max double: 1.7976931348623157 x 10^308
+// Min non-zero double: 4.9406564584124654 x 10^-324
+// Any x >= 10^309 is interpreted as +infinity.
+// Any x <= 10^-324 is interpreted as 0.
+// Note that 2.5e-324 (despite being smaller than the min double) will be read
+// as non-zero (equal to the min non-zero double).
+static const int kMaxDecimalPower = 309;
+static const int kMinDecimalPower = -324;
+
+// 2^64 = 18446744073709551616
+static const uint64_t kMaxUint64 = UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF);
+
+
+static const double exact_powers_of_ten[] = {
+ 1.0, // 10^0
+ 10.0,
+ 100.0,
+ 1000.0,
+ 10000.0,
+ 100000.0,
+ 1000000.0,
+ 10000000.0,
+ 100000000.0,
+ 1000000000.0,
+ 10000000000.0, // 10^10
+ 100000000000.0,
+ 1000000000000.0,
+ 10000000000000.0,
+ 100000000000000.0,
+ 1000000000000000.0,
+ 10000000000000000.0,
+ 100000000000000000.0,
+ 1000000000000000000.0,
+ 10000000000000000000.0,
+ 100000000000000000000.0, // 10^20
+ 1000000000000000000000.0,
+ // 10^22 = 0x21e19e0c9bab2400000 = 0x878678326eac9 * 2^22
+ 10000000000000000000000.0
+};
+static const int kExactPowersOfTenSize = ARRAY_SIZE(exact_powers_of_ten);
+
+// Maximum number of significant digits in the decimal representation.
+// In fact the value is 772 (see conversions.cc), but to give us some margin
+// we round up to 780.
+static const int kMaxSignificantDecimalDigits = 780;
+
+static Vector<const char> TrimLeadingZeros(Vector<const char> buffer) {
+ for (int i = 0; i < buffer.length(); i++) {
+ if (buffer[i] != '0') {
+ return buffer.SubVector(i, buffer.length());
+ }
+ }
+ return Vector<const char>(buffer.start(), 0);
+}
+
+
+static Vector<const char> TrimTrailingZeros(Vector<const char> buffer) {
+ for (int i = buffer.length() - 1; i >= 0; --i) {
+ if (buffer[i] != '0') {
+ return buffer.SubVector(0, i + 1);
+ }
+ }
+ return Vector<const char>(buffer.start(), 0);
+}
+
+
+static void CutToMaxSignificantDigits(Vector<const char> buffer,
+ int exponent,
+ char* significant_buffer,
+ int* significant_exponent) {
+ for (int i = 0; i < kMaxSignificantDecimalDigits - 1; ++i) {
+ significant_buffer[i] = buffer[i];
+ }
+ // The input buffer has been trimmed. Therefore the last digit must be
+ // different from '0'.
+ ASSERT(buffer[buffer.length() - 1] != '0');
+ // Set the last digit to be non-zero. This is sufficient to guarantee
+ // correct rounding.
+ significant_buffer[kMaxSignificantDecimalDigits - 1] = '1';
+ *significant_exponent =
+ exponent + (buffer.length() - kMaxSignificantDecimalDigits);
+}
+
+
+// Trims the buffer and cuts it to at most kMaxSignificantDecimalDigits.
+// If possible the input-buffer is reused, but if the buffer needs to be
+// modified (due to cutting), then the input needs to be copied into the
+// buffer_copy_space.
+static void TrimAndCut(Vector<const char> buffer, int exponent,
+ char* buffer_copy_space, int space_size,
+ Vector<const char>* trimmed, int* updated_exponent) {
+ Vector<const char> left_trimmed = TrimLeadingZeros(buffer);
+ Vector<const char> right_trimmed = TrimTrailingZeros(left_trimmed);
+ exponent += left_trimmed.length() - right_trimmed.length();
+ if (right_trimmed.length() > kMaxSignificantDecimalDigits) {
+ (void) space_size; // Mark variable as used.
+ ASSERT(space_size >= kMaxSignificantDecimalDigits);
+ CutToMaxSignificantDigits(right_trimmed, exponent,
+ buffer_copy_space, updated_exponent);
+ *trimmed = Vector<const char>(buffer_copy_space,
+ kMaxSignificantDecimalDigits);
+ } else {
+ *trimmed = right_trimmed;
+ *updated_exponent = exponent;
+ }
+}
+
+
+// Reads digits from the buffer and converts them to a uint64.
+// Reads in as many digits as fit into a uint64.
+// When the string starts with "1844674407370955161" no further digit is read.
+// Since 2^64 = 18446744073709551616 it would still be possible read another
+// digit if it was less or equal than 6, but this would complicate the code.
+static uint64_t ReadUint64(Vector<const char> buffer,
+ int* number_of_read_digits) {
+ uint64_t result = 0;
+ int i = 0;
+ while (i < buffer.length() && result <= (kMaxUint64 / 10 - 1)) {
+ int digit = buffer[i++] - '0';
+ ASSERT(0 <= digit && digit <= 9);
+ result = 10 * result + digit;
+ }
+ *number_of_read_digits = i;
+ return result;
+}
+
+
+// Reads a DiyFp from the buffer.
+// The returned DiyFp is not necessarily normalized.
+// If remaining_decimals is zero then the returned DiyFp is accurate.
+// Otherwise it has been rounded and has error of at most 1/2 ulp.
+static void ReadDiyFp(Vector<const char> buffer,
+ DiyFp* result,
+ int* remaining_decimals) {
+ int read_digits;
+ uint64_t significand = ReadUint64(buffer, &read_digits);
+ if (buffer.length() == read_digits) {
+ *result = DiyFp(significand, 0);
+ *remaining_decimals = 0;
+ } else {
+ // Round the significand.
+ if (buffer[read_digits] >= '5') {
+ significand++;
+ }
+ // Compute the binary exponent.
+ int exponent = 0;
+ *result = DiyFp(significand, exponent);
+ *remaining_decimals = buffer.length() - read_digits;
+ }
+}
+
+
+static bool DoubleStrtod(Vector<const char> trimmed,
+ int exponent,
+ double* result) {
+#if !defined(DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS)
+ // On x86 the floating-point stack can be 64 or 80 bits wide. If it is
+ // 80 bits wide (as is the case on Linux) then double-rounding occurs and the
+ // result is not accurate.
+ // We know that Windows32 uses 64 bits and is therefore accurate.
+ // Note that the ARM simulator is compiled for 32bits. It therefore exhibits
+ // the same problem.
+ return false;
+#endif
+ if (trimmed.length() <= kMaxExactDoubleIntegerDecimalDigits) {
+ int read_digits;
+ // The trimmed input fits into a double.
+ // If the 10^exponent (resp. 10^-exponent) fits into a double too then we
+ // can compute the result-double simply by multiplying (resp. dividing) the
+ // two numbers.
+ // This is possible because IEEE guarantees that floating-point operations
+ // return the best possible approximation.
+ if (exponent < 0 && -exponent < kExactPowersOfTenSize) {
+ // 10^-exponent fits into a double.
+ *result = static_cast<double>(ReadUint64(trimmed, &read_digits));
+ ASSERT(read_digits == trimmed.length());
+ *result /= exact_powers_of_ten[-exponent];
+ return true;
+ }
+ if (0 <= exponent && exponent < kExactPowersOfTenSize) {
+ // 10^exponent fits into a double.
+ *result = static_cast<double>(ReadUint64(trimmed, &read_digits));
+ ASSERT(read_digits == trimmed.length());
+ *result *= exact_powers_of_ten[exponent];
+ return true;
+ }
+ int remaining_digits =
+ kMaxExactDoubleIntegerDecimalDigits - trimmed.length();
+ if ((0 <= exponent) &&
+ (exponent - remaining_digits < kExactPowersOfTenSize)) {
+ // The trimmed string was short and we can multiply it with
+ // 10^remaining_digits. As a result the remaining exponent now fits
+ // into a double too.
+ *result = static_cast<double>(ReadUint64(trimmed, &read_digits));
+ ASSERT(read_digits == trimmed.length());
+ *result *= exact_powers_of_ten[remaining_digits];
+ *result *= exact_powers_of_ten[exponent - remaining_digits];
+ return true;
+ }
+ }
+ return false;
+}
+
+
+// Returns 10^exponent as an exact DiyFp.
+// The given exponent must be in the range [1; kDecimalExponentDistance[.
+static DiyFp AdjustmentPowerOfTen(int exponent) {
+ ASSERT(0 < exponent);
+ ASSERT(exponent < PowersOfTenCache::kDecimalExponentDistance);
+ // Simply hardcode the remaining powers for the given decimal exponent
+ // distance.
+ ASSERT(PowersOfTenCache::kDecimalExponentDistance == 8);
+ switch (exponent) {
+ case 1: return DiyFp(UINT64_2PART_C(0xa0000000, 00000000), -60);
+ case 2: return DiyFp(UINT64_2PART_C(0xc8000000, 00000000), -57);
+ case 3: return DiyFp(UINT64_2PART_C(0xfa000000, 00000000), -54);
+ case 4: return DiyFp(UINT64_2PART_C(0x9c400000, 00000000), -50);
+ case 5: return DiyFp(UINT64_2PART_C(0xc3500000, 00000000), -47);
+ case 6: return DiyFp(UINT64_2PART_C(0xf4240000, 00000000), -44);
+ case 7: return DiyFp(UINT64_2PART_C(0x98968000, 00000000), -40);
+ default:
+ UNREACHABLE();
+ }
+}
+
+
+// If the function returns true then the result is the correct double.
+// Otherwise it is either the correct double or the double that is just below
+// the correct double.
+static bool DiyFpStrtod(Vector<const char> buffer,
+ int exponent,
+ double* result) {
+ DiyFp input;
+ int remaining_decimals;
+ ReadDiyFp(buffer, &input, &remaining_decimals);
+ // Since we may have dropped some digits the input is not accurate.
+ // If remaining_decimals is different than 0 than the error is at most
+ // .5 ulp (unit in the last place).
+ // We don't want to deal with fractions and therefore keep a common
+ // denominator.
+ const int kDenominatorLog = 3;
+ const int kDenominator = 1 << kDenominatorLog;
+ // Move the remaining decimals into the exponent.
+ exponent += remaining_decimals;
+ int error = (remaining_decimals == 0 ? 0 : kDenominator / 2);
+
+ int old_e = input.e();
+ input.Normalize();
+ error <<= old_e - input.e();
+
+ ASSERT(exponent <= PowersOfTenCache::kMaxDecimalExponent);
+ if (exponent < PowersOfTenCache::kMinDecimalExponent) {
+ *result = 0.0;
+ return true;
+ }
+ DiyFp cached_power;
+ int cached_decimal_exponent;
+ PowersOfTenCache::GetCachedPowerForDecimalExponent(exponent,
+ &cached_power,
+ &cached_decimal_exponent);
+
+ if (cached_decimal_exponent != exponent) {
+ int adjustment_exponent = exponent - cached_decimal_exponent;
+ DiyFp adjustment_power = AdjustmentPowerOfTen(adjustment_exponent);
+ input.Multiply(adjustment_power);
+ if (kMaxUint64DecimalDigits - buffer.length() >= adjustment_exponent) {
+ // The product of input with the adjustment power fits into a 64 bit
+ // integer.
+ ASSERT(DiyFp::kSignificandSize == 64);
+ } else {
+ // The adjustment power is exact. There is hence only an error of 0.5.
+ error += kDenominator / 2;
+ }
+ }
+
+ input.Multiply(cached_power);
+ // The error introduced by a multiplication of a*b equals
+ // error_a + error_b + error_a*error_b/2^64 + 0.5
+ // Substituting a with 'input' and b with 'cached_power' we have
+ // error_b = 0.5 (all cached powers have an error of less than 0.5 ulp),
+ // error_ab = 0 or 1 / kDenominator > error_a*error_b/ 2^64
+ int error_b = kDenominator / 2;
+ int error_ab = (error == 0 ? 0 : 1); // We round up to 1.
+ int fixed_error = kDenominator / 2;
+ error += error_b + error_ab + fixed_error;
+
+ old_e = input.e();
+ input.Normalize();
+ error <<= old_e - input.e();
+
+ // See if the double's significand changes if we add/subtract the error.
+ int order_of_magnitude = DiyFp::kSignificandSize + input.e();
+ int effective_significand_size =
+ Double::SignificandSizeForOrderOfMagnitude(order_of_magnitude);
+ int precision_digits_count =
+ DiyFp::kSignificandSize - effective_significand_size;
+ if (precision_digits_count + kDenominatorLog >= DiyFp::kSignificandSize) {
+ // This can only happen for very small denormals. In this case the
+ // half-way multiplied by the denominator exceeds the range of an uint64.
+ // Simply shift everything to the right.
+ int shift_amount = (precision_digits_count + kDenominatorLog) -
+ DiyFp::kSignificandSize + 1;
+ input.set_f(input.f() >> shift_amount);
+ input.set_e(input.e() + shift_amount);
+ // We add 1 for the lost precision of error, and kDenominator for
+ // the lost precision of input.f().
+ error = (error >> shift_amount) + 1 + kDenominator;
+ precision_digits_count -= shift_amount;
+ }
+ // We use uint64_ts now. This only works if the DiyFp uses uint64_ts too.
+ ASSERT(DiyFp::kSignificandSize == 64);
+ ASSERT(precision_digits_count < 64);
+ uint64_t one64 = 1;
+ uint64_t precision_bits_mask = (one64 << precision_digits_count) - 1;
+ uint64_t precision_bits = input.f() & precision_bits_mask;
+ uint64_t half_way = one64 << (precision_digits_count - 1);
+ precision_bits *= kDenominator;
+ half_way *= kDenominator;
+ DiyFp rounded_input(input.f() >> precision_digits_count,
+ input.e() + precision_digits_count);
+ if (precision_bits >= half_way + error) {
+ rounded_input.set_f(rounded_input.f() + 1);
+ }
+ // If the last_bits are too close to the half-way case than we are too
+ // inaccurate and round down. In this case we return false so that we can
+ // fall back to a more precise algorithm.
+
+ *result = Double(rounded_input).value();
+ if (half_way - error < precision_bits && precision_bits < half_way + error) {
+ // Too imprecise. The caller will have to fall back to a slower version.
+ // However the returned number is guaranteed to be either the correct
+ // double, or the next-lower double.
+ return false;
+ } else {
+ return true;
+ }
+}
+
+
+// Returns
+// - -1 if buffer*10^exponent < diy_fp.
+// - 0 if buffer*10^exponent == diy_fp.
+// - +1 if buffer*10^exponent > diy_fp.
+// Preconditions:
+// buffer.length() + exponent <= kMaxDecimalPower + 1
+// buffer.length() + exponent > kMinDecimalPower
+// buffer.length() <= kMaxDecimalSignificantDigits
+static int CompareBufferWithDiyFp(Vector<const char> buffer,
+ int exponent,
+ DiyFp diy_fp) {
+ ASSERT(buffer.length() + exponent <= kMaxDecimalPower + 1);
+ ASSERT(buffer.length() + exponent > kMinDecimalPower);
+ ASSERT(buffer.length() <= kMaxSignificantDecimalDigits);
+ // Make sure that the Bignum will be able to hold all our numbers.
+ // Our Bignum implementation has a separate field for exponents. Shifts will
+ // consume at most one bigit (< 64 bits).
+ // ln(10) == 3.3219...
+ ASSERT(((kMaxDecimalPower + 1) * 333 / 100) < Bignum::kMaxSignificantBits);
+ Bignum buffer_bignum;
+ Bignum diy_fp_bignum;
+ buffer_bignum.AssignDecimalString(buffer);
+ diy_fp_bignum.AssignUInt64(diy_fp.f());
+ if (exponent >= 0) {
+ buffer_bignum.MultiplyByPowerOfTen(exponent);
+ } else {
+ diy_fp_bignum.MultiplyByPowerOfTen(-exponent);
+ }
+ if (diy_fp.e() > 0) {
+ diy_fp_bignum.ShiftLeft(diy_fp.e());
+ } else {
+ buffer_bignum.ShiftLeft(-diy_fp.e());
+ }
+ return Bignum::Compare(buffer_bignum, diy_fp_bignum);
+}
+
+
+// Returns true if the guess is the correct double.
+// Returns false, when guess is either correct or the next-lower double.
+static bool ComputeGuess(Vector<const char> trimmed, int exponent,
+ double* guess) {
+ if (trimmed.length() == 0) {
+ *guess = 0.0;
+ return true;
+ }
+ if (exponent + trimmed.length() - 1 >= kMaxDecimalPower) {
+ *guess = Double::Infinity();
+ return true;
+ }
+ if (exponent + trimmed.length() <= kMinDecimalPower) {
+ *guess = 0.0;
+ return true;
+ }
+
+ if (DoubleStrtod(trimmed, exponent, guess) ||
+ DiyFpStrtod(trimmed, exponent, guess)) {
+ return true;
+ }
+ if (*guess == Double::Infinity()) {
+ return true;
+ }
+ return false;
+}
+
+double Strtod(Vector<const char> buffer, int exponent) {
+ char copy_buffer[kMaxSignificantDecimalDigits];
+ Vector<const char> trimmed;
+ int updated_exponent;
+ TrimAndCut(buffer, exponent, copy_buffer, kMaxSignificantDecimalDigits,
+ &trimmed, &updated_exponent);
+ exponent = updated_exponent;
+
+ double guess;
+ bool is_correct = ComputeGuess(trimmed, exponent, &guess);
+ if (is_correct) return guess;
+
+ DiyFp upper_boundary = Double(guess).UpperBoundary();
+ int comparison = CompareBufferWithDiyFp(trimmed, exponent, upper_boundary);
+ if (comparison < 0) {
+ return guess;
+ } else if (comparison > 0) {
+ return Double(guess).NextDouble();
+ } else if ((Double(guess).Significand() & 1) == 0) {
+ // Round towards even.
+ return guess;
+ } else {
+ return Double(guess).NextDouble();
+ }
+}
+
+float Strtof(Vector<const char> buffer, int exponent) {
+ char copy_buffer[kMaxSignificantDecimalDigits];
+ Vector<const char> trimmed;
+ int updated_exponent;
+ TrimAndCut(buffer, exponent, copy_buffer, kMaxSignificantDecimalDigits,
+ &trimmed, &updated_exponent);
+ exponent = updated_exponent;
+
+ double double_guess;
+ bool is_correct = ComputeGuess(trimmed, exponent, &double_guess);
+
+ float float_guess = static_cast<float>(double_guess);
+ if (float_guess == double_guess) {
+ // This shortcut triggers for integer values.
+ return float_guess;
+ }
+
+ // We must catch double-rounding. Say the double has been rounded up, and is
+ // now a boundary of a float, and rounds up again. This is why we have to
+ // look at previous too.
+ // Example (in decimal numbers):
+ // input: 12349
+ // high-precision (4 digits): 1235
+ // low-precision (3 digits):
+ // when read from input: 123
+ // when rounded from high precision: 124.
+ // To do this we simply look at the neigbors of the correct result and see
+ // if they would round to the same float. If the guess is not correct we have
+ // to look at four values (since two different doubles could be the correct
+ // double).
+
+ double double_next = Double(double_guess).NextDouble();
+ double double_previous = Double(double_guess).PreviousDouble();
+
+ float f1 = static_cast<float>(double_previous);
+ float f2 = float_guess;
+ float f3 = static_cast<float>(double_next);
+ float f4;
+ if (is_correct) {
+ f4 = f3;
+ } else {
+ double double_next2 = Double(double_next).NextDouble();
+ f4 = static_cast<float>(double_next2);
+ }
+ (void) f2; // Mark variable as used.
+ ASSERT(f1 <= f2 && f2 <= f3 && f3 <= f4);
+
+ // If the guess doesn't lie near a single-precision boundary we can simply
+ // return its float-value.
+ if (f1 == f4) {
+ return float_guess;
+ }
+
+ ASSERT((f1 != f2 && f2 == f3 && f3 == f4) ||
+ (f1 == f2 && f2 != f3 && f3 == f4) ||
+ (f1 == f2 && f2 == f3 && f3 != f4));
+
+ // guess and next are the two possible canditates (in the same way that
+ // double_guess was the lower candidate for a double-precision guess).
+ float guess = f1;
+ float next = f4;
+ DiyFp upper_boundary;
+ if (guess == 0.0f) {
+ float min_float = 1e-45f;
+ upper_boundary = Double(static_cast<double>(min_float) / 2).AsDiyFp();
+ } else {
+ upper_boundary = Single(guess).UpperBoundary();
+ }
+ int comparison = CompareBufferWithDiyFp(trimmed, exponent, upper_boundary);
+ if (comparison < 0) {
+ return guess;
+ } else if (comparison > 0) {
+ return next;
+ } else if ((Single(guess).Significand() & 1) == 0) {
+ // Round towards even.
+ return guess;
+ } else {
+ return next;
+ }
+}
+
+} // namespace double_conversion
diff --git a/src/3rdparty/double-conversion/strtod.h b/src/3rdparty/double-conversion/strtod.h
new file mode 100644
index 0000000000..ed0293b8f5
--- /dev/null
+++ b/src/3rdparty/double-conversion/strtod.h
@@ -0,0 +1,45 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef DOUBLE_CONVERSION_STRTOD_H_
+#define DOUBLE_CONVERSION_STRTOD_H_
+
+#include "utils.h"
+
+namespace double_conversion {
+
+// The buffer must only contain digits in the range [0-9]. It must not
+// contain a dot or a sign. It must not start with '0', and must not be empty.
+double Strtod(Vector<const char> buffer, int exponent);
+
+// The buffer must only contain digits in the range [0-9]. It must not
+// contain a dot or a sign. It must not start with '0', and must not be empty.
+float Strtof(Vector<const char> buffer, int exponent);
+
+} // namespace double_conversion
+
+#endif // DOUBLE_CONVERSION_STRTOD_H_
diff --git a/src/3rdparty/sqlite/0001-Fixing-the-SQLite3-build-for-WEC2013-again.patch b/src/3rdparty/sqlite/0001-Fixing-the-SQLite3-build-for-WEC2013-again.patch
new file mode 100644
index 0000000000..2d92cfffa7
--- /dev/null
+++ b/src/3rdparty/sqlite/0001-Fixing-the-SQLite3-build-for-WEC2013-again.patch
@@ -0,0 +1,33 @@
+From c7bbe85015995c1e0627d88bac6fd5715b1338a0 Mon Sep 17 00:00:00 2001
+From: Bjoern Breitmeyer <bjoern.breitmeyer@kdab.com>
+Date: Fri, 3 Jul 2015 14:08:04 +0200
+Subject: [PATCH] Fixing the SQLite3 build for WEC2013 again.
+
+The new version broke the build again
+-> fix it again.
+
+Change-Id: I75761d134d97a2784f1de5076412aa814fdf9bcd
+---
+ src/3rdparty/sqlite/sqlite3.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/src/3rdparty/sqlite/sqlite3.c b/src/3rdparty/sqlite/sqlite3.c
+index 71f6c10..040a9e1 100644
+--- a/src/3rdparty/sqlite/sqlite3.c
++++ b/src/3rdparty/sqlite/sqlite3.c
+@@ -15474,9 +15474,11 @@ static void clearYMD_HMS_TZ(DateTime *p){
+ #define HAVE_LOCALTIME_S 1
+ #endif
+
+-#if defined(_WIN32_WCE)
++#if defined(_WIN32_WCE) && _WIN32_WCE < 0x800
+ #undef HAVE_LOCALTIME_S
+ struct tm *__cdecl localtime(const time_t *t);
++#elif defined(_WIN32_WCE) && _WIN32_WCE >= 0x800
++# define SQLITE_MSVC_LOCALTIME_API 1
+ #endif
+
+ #ifndef SQLITE_OMIT_LOCALTIME
+--
+1.8.1.msysgit.1
+
diff --git a/src/3rdparty/sqlite/sqlite3.c b/src/3rdparty/sqlite/sqlite3.c
index 06f6d154f1..65379a822d 100644
--- a/src/3rdparty/sqlite/sqlite3.c
+++ b/src/3rdparty/sqlite/sqlite3.c
@@ -15742,9 +15742,11 @@ static void clearYMD_HMS_TZ(DateTime *p){
#define HAVE_LOCALTIME_S 1
#endif
-#if defined(_WIN32_WCE)
+#if defined(_WIN32_WCE) && _WIN32_WCE < 0x800
#undef HAVE_LOCALTIME_S
struct tm *__cdecl localtime(const time_t *t);
+#elif defined(_WIN32_WCE) && _WIN32_WCE >= 0x800
+# define SQLITE_MSVC_LOCALTIME_API 1
#endif
#ifndef SQLITE_OMIT_LOCALTIME
diff --git a/src/android/accessibility/accessibility.pro b/src/android/accessibility/accessibility.pro
deleted file mode 100644
index df5846945d..0000000000
--- a/src/android/accessibility/accessibility.pro
+++ /dev/null
@@ -1,2 +0,0 @@
-TEMPLATE = subdirs
-SUBDIRS = jar
diff --git a/src/android/accessibility/jar/AndroidManifest.xml b/src/android/accessibility/jar/AndroidManifest.xml
deleted file mode 100644
index dc8343a55a..0000000000
--- a/src/android/accessibility/jar/AndroidManifest.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- android:versionCode="1"
- android:versionName="1.0"
- package="org.qtproject.qt5.android.accessibility">
- <supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
-</manifest>
diff --git a/src/android/accessibility/jar/bundledjar.pro b/src/android/accessibility/jar/bundledjar.pro
deleted file mode 100644
index 85ba810310..0000000000
--- a/src/android/accessibility/jar/bundledjar.pro
+++ /dev/null
@@ -1,3 +0,0 @@
-TARGET = QtAndroidAccessibility-bundled
-CONFIG += bundled_jar_file
-include(jar.pri)
diff --git a/src/android/accessibility/jar/distributedjar.pro b/src/android/accessibility/jar/distributedjar.pro
deleted file mode 100644
index d161cf0cf6..0000000000
--- a/src/android/accessibility/jar/distributedjar.pro
+++ /dev/null
@@ -1,2 +0,0 @@
-TARGET = QtAndroidAccessibility
-include(jar.pri)
diff --git a/src/android/accessibility/jar/jar.pri b/src/android/accessibility/jar/jar.pri
deleted file mode 100644
index 3ae9fed59d..0000000000
--- a/src/android/accessibility/jar/jar.pri
+++ /dev/null
@@ -1,15 +0,0 @@
-CONFIG += java
-DESTDIR = $$[QT_INSTALL_PREFIX/get]/jar
-API_VERSION = android-16
-
-PATHPREFIX = $$PWD/src/org/qtproject/qt5/android/accessibility
-
-JAVACLASSPATH += $$PWD/src/ \
- $$DESTDIR/QtAndroid-bundled.jar
-JAVASOURCES += \
- $$PATHPREFIX/QtAccessibilityDelegate.java \
- $$PATHPREFIX/QtNativeAccessibility.java
-
-# install
-target.path = $$[QT_INSTALL_PREFIX]/jar
-INSTALLS += target \ No newline at end of file
diff --git a/src/android/accessibility/jar/jar.pro b/src/android/accessibility/jar/jar.pro
deleted file mode 100644
index 8d19c1b7d6..0000000000
--- a/src/android/accessibility/jar/jar.pro
+++ /dev/null
@@ -1,2 +0,0 @@
-TEMPLATE = subdirs
-SUBDIRS += bundledjar.pro distributedjar.pro
diff --git a/src/android/android.pro b/src/android/android.pro
index b17dd15cd4..1174084591 100644
--- a/src/android/android.pro
+++ b/src/android/android.pro
@@ -1,3 +1,3 @@
TEMPLATE = subdirs
CONFIG += ordered
-SUBDIRS = jar java templates accessibility
+SUBDIRS = jar java templates
diff --git a/src/android/jar/jar.pri b/src/android/jar/jar.pri
index a962af18ab..b45b353f95 100644
--- a/src/android/jar/jar.pri
+++ b/src/android/jar/jar.pri
@@ -6,6 +6,8 @@ PATHPREFIX = $$PWD/src/org/qtproject/qt5/android/
JAVACLASSPATH += $$PWD/src/
JAVASOURCES += \
+ $$PATHPREFIX/accessibility/QtAccessibilityDelegate.java \
+ $$PATHPREFIX/accessibility/QtNativeAccessibility.java \
$$PATHPREFIX/QtActivityDelegate.java \
$$PATHPREFIX/QtEditText.java \
$$PATHPREFIX/QtInputConnection.java \
@@ -14,9 +16,7 @@ JAVASOURCES += \
$$PATHPREFIX/QtNative.java \
$$PATHPREFIX/QtNativeLibrariesDir.java \
$$PATHPREFIX/QtSurface.java \
- $$PATHPREFIX/ExtractStyle.java \
- $$PATHPREFIX/QtPopupMenu.java \
- $$PATHPREFIX/QtPopupMenu14.java
+ $$PATHPREFIX/ExtractStyle.java
# install
target.path = $$[QT_INSTALL_PREFIX]/jar
diff --git a/src/android/jar/src/org/qtproject/qt5/android/ExtractStyle.java b/src/android/jar/src/org/qtproject/qt5/android/ExtractStyle.java
index f5dac1fa60..9d0031d0de 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/ExtractStyle.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/ExtractStyle.java
@@ -1813,11 +1813,7 @@ public class ExtractStyle {
jsonWriter.name("simple_spinner_item").value(extractItemStyle(android.R.layout.simple_spinner_item, "simple_spinner_item", -1));
jsonWriter.name("simple_spinner_dropdown_item").value(extractItemStyle(android.R.layout.simple_spinner_dropdown_item, "simple_spinner_dropdown_item",android.R.style.TextAppearance_Large));
jsonWriter.name("simple_dropdown_item_1line").value(extractItemStyle(android.R.layout.simple_dropdown_item_1line, "simple_dropdown_item_1line",android.R.style.TextAppearance_Large));
- if (Build.VERSION.SDK_INT > 10) {
- Class<?> layoutClass = Class.forName("android.R$layout");
- int styleId = layoutClass.getDeclaredField("simple_selectable_list_item").getInt(null);
- jsonWriter.name("simple_selectable_list_item").value(extractItemStyle(styleId, "simple_selectable_list_item",android.R.style.TextAppearance_Large));
- }
+ jsonWriter.name("simple_selectable_list_item").value(extractItemStyle(android.R.layout.simple_selectable_list_item, "simple_selectable_list_item",android.R.style.TextAppearance_Large));
} catch (Exception e) {
e.printStackTrace();
}
@@ -2018,9 +2014,7 @@ public class ExtractStyle {
extractProgressBar(jsonWriter, "progressBarStyleSmall", null);
extractProgressBar(jsonWriter, "progressBarStyle", null);
extractAbsSeekBar(jsonWriter, "seekBarStyle", "QSlider");
- if (Build.VERSION.SDK_INT > 13) {
- extractSwitch(jsonWriter, "switchStyle", null);
- }
+ extractSwitch(jsonWriter, "switchStyle", null);
extractCompoundButton(jsonWriter, "checkboxStyle", "QCheckBox");
jsonWriter.name("editTextStyle").value(extractTextAppearanceInformations("editTextStyle", "QLineEdit", null, -1));
extractCompoundButton(jsonWriter, "radioButtonStyle", "QRadioButton");
@@ -2030,15 +2024,13 @@ public class ExtractStyle {
jsonWriter.name("listSeparatorTextViewStyle").value(extractTextAppearanceInformations("listSeparatorTextViewStyle", null, null, -1));
extractItemsStyle(jsonWriter);
extractCompoundButton(jsonWriter, "buttonStyleToggle", null);
- if (Build.VERSION.SDK_INT > 10) {
- extractCalendar(jsonWriter, "calendarViewStyle", "QCalendarWidget");
- extractToolBar(jsonWriter, "actionBarStyle", "QToolBar");
- jsonWriter.name("actionButtonStyle").value(extractTextAppearanceInformations("actionButtonStyle", "QToolButton", null, -1));
- jsonWriter.name("actionBarTabTextStyle").value(extractTextAppearanceInformations("actionBarTabTextStyle", null, null, -1));
- jsonWriter.name("actionBarTabStyle").value(extractTextAppearanceInformations("actionBarTabStyle", null, null, -1));
- jsonWriter.name("actionOverflowButtonStyle").value(extractImageViewInformations("actionOverflowButtonStyle", null));
- extractTabBar(jsonWriter, "actionBarTabBarStyle", "QTabBar");
- }
+ extractCalendar(jsonWriter, "calendarViewStyle", "QCalendarWidget");
+ extractToolBar(jsonWriter, "actionBarStyle", "QToolBar");
+ jsonWriter.name("actionButtonStyle").value(extractTextAppearanceInformations("actionButtonStyle", "QToolButton", null, -1));
+ jsonWriter.name("actionBarTabTextStyle").value(extractTextAppearanceInformations("actionBarTabTextStyle", null, null, -1));
+ jsonWriter.name("actionBarTabStyle").value(extractTextAppearanceInformations("actionBarTabStyle", null, null, -1));
+ jsonWriter.name("actionOverflowButtonStyle").value(extractImageViewInformations("actionOverflowButtonStyle", null));
+ extractTabBar(jsonWriter, "actionBarTabBarStyle", "QTabBar");
} catch (Exception e) {
e.printStackTrace();
}
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
index dd5a7b4fec..0a10a12660 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
@@ -67,6 +67,7 @@ import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.view.ViewTreeObserver;
+import android.widget.PopupMenu;
import android.graphics.Rect;
import java.io.BufferedReader;
@@ -80,6 +81,8 @@ import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
+import org.qtproject.qt5.android.accessibility.QtAccessibilityDelegate;
+
public class QtActivityDelegate
{
private Activity m_activity = null;
@@ -135,35 +138,23 @@ public class QtActivityDelegate
m_activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
m_activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
try {
- if (Build.VERSION.SDK_INT >= 14) {
- int flags = View.class.getDeclaredField("SYSTEM_UI_FLAG_HIDE_NAVIGATION").getInt(null);
- if (Build.VERSION.SDK_INT >= 16) {
- flags |= View.class.getDeclaredField("SYSTEM_UI_FLAG_LAYOUT_STABLE").getInt(null);
- flags |= View.class.getDeclaredField("SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION").getInt(null);
- flags |= View.class.getDeclaredField("SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN").getInt(null);
- flags |= View.class.getDeclaredField("SYSTEM_UI_FLAG_FULLSCREEN").getInt(null);
-
- if (Build.VERSION.SDK_INT >= 19)
- flags |= View.class.getDeclaredField("SYSTEM_UI_FLAG_IMMERSIVE_STICKY").getInt(null);
- }
- Method m = View.class.getMethod("setSystemUiVisibility", int.class);
- m.invoke(m_activity.getWindow().getDecorView(), flags | View.INVISIBLE);
- }
+ int flags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
+ flags |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
+ flags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
+ flags |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
+ flags |= View.SYSTEM_UI_FLAG_FULLSCREEN;
+
+ if (Build.VERSION.SDK_INT >= 19)
+ flags |= View.class.getDeclaredField("SYSTEM_UI_FLAG_IMMERSIVE_STICKY").getInt(null);
+
+ m_activity.getWindow().getDecorView().setSystemUiVisibility(flags | View.INVISIBLE);
} catch (Exception e) {
e.printStackTrace();
}
} else {
m_activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
m_activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
- if (Build.VERSION.SDK_INT >= 14) {
- try {
- int ui_flag_visible = View.class.getDeclaredField("SYSTEM_UI_FLAG_VISIBLE").getInt(null);
- Method m = View.class.getMethod("setSystemUiVisibility", int.class);
- m.invoke(m_activity.getWindow().getDecorView(), ui_flag_visible);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
+ m_activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
}
m_layout.requestLayout();
}
@@ -286,8 +277,7 @@ public class QtActivityDelegate
imeOptions = android.view.inputmethod.EditorInfo.IME_ACTION_NEXT;
break;
case EnterKeyPrevious:
- if (Build.VERSION.SDK_INT > 10)
- imeOptions = android.view.inputmethod.EditorInfo.IME_ACTION_PREVIOUS;
+ imeOptions = android.view.inputmethod.EditorInfo.IME_ACTION_PREVIOUS;
break;
}
@@ -300,7 +290,7 @@ public class QtActivityDelegate
| android.text.InputType.TYPE_NUMBER_FLAG_SIGNED);
}
- if (Build.VERSION.SDK_INT > 10 && (inputHints & ImhHiddenText) != 0)
+ if ((inputHints & ImhHiddenText) != 0)
inputType |= 0x10 /* TYPE_NUMBER_VARIATION_PASSWORD */;
} else if ((inputHints & ImhDialableCharactersOnly) != 0) {
inputType = android.text.InputType.TYPE_CLASS_PHONE;
@@ -478,13 +468,7 @@ public class QtActivityDelegate
m_super_onKeyUp = m_activity.getClass().getMethod("super_onKeyUp", Integer.TYPE, KeyEvent.class);
m_super_onConfigurationChanged = m_activity.getClass().getMethod("super_onConfigurationChanged", Configuration.class);
m_super_onActivityResult = m_activity.getClass().getMethod("super_onActivityResult", Integer.TYPE, Integer.TYPE, Intent.class);
- if (Build.VERSION.SDK_INT >= 12) {
- try {
- m_super_dispatchGenericMotionEvent = m_activity.getClass().getMethod("super_dispatchGenericMotionEvent", MotionEvent.class);
- } catch (Exception e) {
- }
- }
-
+ m_super_dispatchGenericMotionEvent = m_activity.getClass().getMethod("super_dispatchGenericMotionEvent", MotionEvent.class);
} catch (Exception e) {
e.printStackTrace();
return false;
@@ -500,10 +484,8 @@ public class QtActivityDelegate
+ "\tNECESSITAS_API_LEVEL=" + necessitasApiLevel
+ "\tHOME=" + m_activity.getFilesDir().getAbsolutePath()
+ "\tTMPDIR=" + m_activity.getFilesDir().getAbsolutePath();
- if (Build.VERSION.SDK_INT < 14)
- additionalEnvironmentVariables += "\tQT_ANDROID_FONTS=Droid Sans;Droid Sans Fallback";
- else
- additionalEnvironmentVariables += "\tQT_ANDROID_FONTS=Roboto;Droid Sans;Droid Sans Fallback";
+
+ additionalEnvironmentVariables += "\tQT_ANDROID_FONTS=Roboto;Droid Sans;Droid Sans Fallback";
additionalEnvironmentVariables += getAppIconSize(activity);
@@ -884,21 +866,7 @@ public class QtActivityDelegate
public void initializeAccessibility()
{
- // Initialize accessibility
- try {
- final String a11yDelegateClassName = "org.qtproject.qt5.android.accessibility.QtAccessibilityDelegate";
- Class<?> qtDelegateClass = Class.forName(a11yDelegateClassName);
- Constructor constructor = qtDelegateClass.getConstructor(android.app.Activity.class,
- android.view.ViewGroup.class,
- this.getClass());
- Object accessibilityDelegate = constructor.newInstance(m_activity, m_layout, this);
- } catch (ClassNotFoundException e) {
- // Class not found is fine since we are compatible with Android API < 16, but the function will
- // only be available with that API level.
- } catch (Exception e) {
- // Unknown exception means something went wrong.
- Log.w("Qt A11y", "Unknown exception: " + e.toString());
- }
+ new QtAccessibilityDelegate(m_activity, m_layout, this);
}
public void onConfigurationChanged(Configuration configuration)
@@ -908,6 +876,23 @@ public class QtActivityDelegate
} catch (Exception e) {
e.printStackTrace();
}
+
+ // if splash screen is defined, then show it
+ // Note: QtActivity handles settting the splash screen
+ // in onCreate, change that too if you are changing
+ // how the splash screen should be displayed
+ try {
+ if (m_surfaces.size() == 0) {
+ ActivityInfo info = m_activity.getPackageManager().getActivityInfo(m_activity.getComponentName(), PackageManager.GET_META_DATA);
+ if (info.metaData.containsKey("android.app.splash_screen_drawable"))
+ m_activity.getWindow().setBackgroundDrawableResource(info.metaData.getInt("android.app.splash_screen_drawable"));
+ else
+ m_activity.getWindow().setBackgroundDrawable(new ColorDrawable(0xff000000));
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
int rotation = m_activity.getWindowManager().getDefaultDisplay().getRotation();
if (rotation != m_currentRotation) {
QtNative.handleOrientationChanged(rotation, m_nativeOrientation);
@@ -1102,17 +1087,9 @@ public class QtActivityDelegate
public void resetOptionsMenu()
{
- if (Build.VERSION.SDK_INT > 10) {
- try {
- Activity.class.getMethod("invalidateOptionsMenu").invoke(m_activity);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- else
- if (m_optionsMenuIsVisible)
- m_activity.closeOptionsMenu();
+ m_activity.invalidateOptionsMenu();
}
+
private boolean m_contextMenuVisible = false;
public void onCreateContextMenu(ContextMenu menu,
View v,
@@ -1148,15 +1125,22 @@ public class QtActivityDelegate
m_layout.postDelayed(new Runnable() {
@Override
public void run() {
- if (Build.VERSION.SDK_INT < 11 || w <= 0 || h <= 0) {
- m_activity.openContextMenu(m_layout);
- } else if (Build.VERSION.SDK_INT < 14) {
- m_layout.setLayoutParams(m_editText, new QtLayout.LayoutParams(w, h, x, y), false);
- QtPopupMenu.getInstance().showMenu(m_editText);
- } else {
- m_layout.setLayoutParams(m_editText, new QtLayout.LayoutParams(w, h, x, y), false);
- QtPopupMenu14.getInstance().showMenu(m_editText);
- }
+ m_layout.setLayoutParams(m_editText, new QtLayout.LayoutParams(w, h, x, y), false);
+ PopupMenu popup = new PopupMenu(m_activity, m_editText);
+ QtActivityDelegate.this.onCreatePopupMenu(popup.getMenu());
+ popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem menuItem) {
+ return QtActivityDelegate.this.onContextItemSelected(menuItem);
+ }
+ });
+ popup.setOnDismissListener(new PopupMenu.OnDismissListener() {
+ @Override
+ public void onDismiss(PopupMenu popupMenu) {
+ QtActivityDelegate.this.onContextMenuClosed(popupMenu.getMenu());
+ }
+ });
+ popup.show();
}
}, 100);
}
@@ -1166,46 +1150,12 @@ public class QtActivityDelegate
m_activity.closeContextMenu();
}
- private boolean hasPermanentMenuKey()
- {
- try {
- return Build.VERSION.SDK_INT < 11 || (Build.VERSION.SDK_INT >= 14 &&
- (Boolean)ViewConfiguration.class.getMethod("hasPermanentMenuKey").invoke(ViewConfiguration.get(m_activity)));
- } catch (Exception e) {
- e.printStackTrace();
- return false;
- }
- }
-
- private Object getActionBar()
- {
- try {
- return Activity.class.getMethod("getActionBar").invoke(m_activity);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
-
private void setActionBarVisibility(boolean visible)
{
- if (hasPermanentMenuKey() || !visible) {
- if (Build.VERSION.SDK_INT > 10 && getActionBar() != null) {
- try {
- Class.forName("android.app.ActionBar").getMethod("hide").invoke(getActionBar());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- } else {
- if (Build.VERSION.SDK_INT > 10 && getActionBar() != null)
- try {
- Class.forName("android.app.ActionBar").getMethod("show").invoke(getActionBar());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
+ if (ViewConfiguration.get(m_activity).hasPermanentMenuKey() || !visible)
+ m_activity.getActionBar().hide();
+ else
+ m_activity.getActionBar().show();
}
public void insertNativeView(int id, View view, int x, int y, int w, int h) {
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtMessageDialogHelper.java b/src/android/jar/src/org/qtproject/qt5/android/QtMessageDialogHelper.java
index 341bc159c8..c0ebf3980f 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtMessageDialogHelper.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtMessageDialogHelper.java
@@ -100,14 +100,12 @@ public class QtMessageDialogHelper
if (m_icon == 0)
return null;
- if (Build.VERSION.SDK_INT > 10) {
- try {
- TypedValue typedValue = new TypedValue();
- m_theme.resolveAttribute(Class.forName("android.R$attr").getDeclaredField("alertDialogIcon").getInt(null), typedValue, true);
- return m_activity.getResources().getDrawable(typedValue.resourceId);
- } catch (Exception e) {
- e.printStackTrace();
- }
+ try {
+ TypedValue typedValue = new TypedValue();
+ m_theme.resolveAttribute(android.R.attr.alertDialogIcon, typedValue, true);
+ return m_activity.getResources().getDrawable(typedValue.resourceId);
+ } catch (Exception e) {
+ e.printStackTrace();
}
// Information, Warning, Critical, Question
@@ -115,7 +113,7 @@ public class QtMessageDialogHelper
{
case 1: // Information
try {
- return m_activity.getResources().getDrawable(Class.forName("android.R$drawable").getDeclaredField("ic_dialog_info").getInt(null));
+ return m_activity.getResources().getDrawable(android.R.drawable.ic_dialog_info);
} catch (Exception e) {
e.printStackTrace();
}
@@ -129,14 +127,14 @@ public class QtMessageDialogHelper
// break;
case 3: // Critical
try {
- return m_activity.getResources().getDrawable(Class.forName("android.R$drawable").getDeclaredField("ic_dialog_alert").getInt(null));
+ return m_activity.getResources().getDrawable(android.R.drawable.ic_dialog_alert);
} catch (Exception e) {
e.printStackTrace();
}
break;
case 4: // Question
try {
- return m_activity.getResources().getDrawable(Class.forName("android.R$drawable").getDeclaredField("ic_menu_help").getInt(null));
+ return m_activity.getResources().getDrawable(android.R.drawable.ic_menu_help);
} catch (Exception e) {
e.printStackTrace();
}
@@ -310,15 +308,11 @@ public class QtMessageDialogHelper
for (ButtonStruct button: m_buttonsList)
{
Button bv;
- if (Build.VERSION.SDK_INT > 10) {
- try {
- bv = new Button(m_activity, null, Class.forName("android.R$attr").getDeclaredField("borderlessButtonStyle").getInt(null));
- } catch (Exception e) {
- bv = new Button(m_activity);
- e.printStackTrace();
- }
- } else {
+ try {
+ bv = new Button(m_activity, null, Class.forName("android.R$attr").getDeclaredField("borderlessButtonStyle").getInt(null));
+ } catch (Exception e) {
bv = new Button(m_activity);
+ e.printStackTrace();
}
bv.setText(button.m_text);
@@ -327,14 +321,12 @@ public class QtMessageDialogHelper
{
LinearLayout.LayoutParams layout = null;
View spacer = new View(m_activity);
- if (Build.VERSION.SDK_INT > 10) {
- try {
- layout = new LinearLayout.LayoutParams(1, RelativeLayout.LayoutParams.MATCH_PARENT);
- spacer.setBackgroundDrawable(getStyledDrawable("dividerVertical"));
- buttonsLayout.addView(spacer, layout);
- } catch (Exception e) {
- e.printStackTrace();
- }
+ try {
+ layout = new LinearLayout.LayoutParams(1, RelativeLayout.LayoutParams.MATCH_PARENT);
+ spacer.setBackgroundDrawable(getStyledDrawable("dividerVertical"));
+ buttonsLayout.addView(spacer, layout);
+ } catch (Exception e) {
+ e.printStackTrace();
}
}
LinearLayout.LayoutParams layout = null;
@@ -343,23 +335,21 @@ public class QtMessageDialogHelper
firstButton = false;
}
- if (Build.VERSION.SDK_INT > 10) {
- try {
- View horizontalDevider = new View(m_activity);
- horizontalDevider.setId(id++);
- horizontalDevider.setBackgroundDrawable(getStyledDrawable("dividerHorizontal"));
- RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 1);
- relativeParams.setMargins(0, 10, 0, 0);
- if (lastView != null) {
- relativeParams.addRule(RelativeLayout.BELOW, lastView.getId());
- }
- else
- relativeParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
- dialogLayout.addView(horizontalDevider, relativeParams);
- lastView = horizontalDevider;
- } catch (Exception e) {
- e.printStackTrace();
+ try {
+ View horizontalDevider = new View(m_activity);
+ horizontalDevider.setId(id++);
+ horizontalDevider.setBackgroundDrawable(getStyledDrawable("dividerHorizontal"));
+ RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 1);
+ relativeParams.setMargins(0, 10, 0, 0);
+ if (lastView != null) {
+ relativeParams.addRule(RelativeLayout.BELOW, lastView.getId());
}
+ else
+ relativeParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
+ dialogLayout.addView(horizontalDevider, relativeParams);
+ lastView = horizontalDevider;
+ } catch (Exception e) {
+ e.printStackTrace();
}
RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
if (lastView != null) {
@@ -367,10 +357,7 @@ public class QtMessageDialogHelper
}
else
relativeParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
- if (Build.VERSION.SDK_INT < 11)
- relativeParams.setMargins(2, 12, 2, 4);
- else
- relativeParams.setMargins(2, 0, 2, 0);
+ relativeParams.setMargins(2, 0, 2, 0);
dialogLayout.addView(buttonsLayout, relativeParams);
}
scrollView.addView(dialogLayout);
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
index 2349ea6db1..5ff5bbc32f 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
@@ -333,16 +333,14 @@ public class QtNative
{
int pointerType = 0;
- if (Build.VERSION.SDK_INT >= 14) {
- switch (event.getToolType(0)) {
- case MotionEvent.TOOL_TYPE_STYLUS:
- pointerType = 1; // QTabletEvent::Pen
- break;
- case MotionEvent.TOOL_TYPE_ERASER:
- pointerType = 3; // QTabletEvent::Eraser
- break;
- // TODO TOOL_TYPE_MOUSE
- }
+ switch (event.getToolType(0)) {
+ case MotionEvent.TOOL_TYPE_STYLUS:
+ pointerType = 1; // QTabletEvent::Pen
+ break;
+ case MotionEvent.TOOL_TYPE_ERASER:
+ pointerType = 3; // QTabletEvent::Eraser
+ break;
+ // TODO TOOL_TYPE_MOUSE
}
if (pointerType != 0) {
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtPopupMenu.java b/src/android/jar/src/org/qtproject/qt5/android/QtPopupMenu.java
deleted file mode 100644
index d89b454b77..0000000000
--- a/src/android/jar/src/org/qtproject/qt5/android/QtPopupMenu.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Android port of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-package org.qtproject.qt5.android;
-
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.PopupMenu;
-
-public class QtPopupMenu {
- private QtPopupMenu() { }
-
- private static class QtPopupMenuHolder {
- private static final QtPopupMenu INSTANCE = new QtPopupMenu();
- }
-
- public static QtPopupMenu getInstance() {
- return QtPopupMenuHolder.INSTANCE;
- }
-
- public void showMenu(View anchor)
- {
- PopupMenu popup = new PopupMenu(QtNative.activity(), anchor);
- QtNative.activityDelegate().onCreatePopupMenu(popup.getMenu());
- popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem menuItem) {
- boolean res = QtNative.onContextItemSelected(menuItem.getItemId(), menuItem.isChecked());
- if (res)
- QtNative.activityDelegate().onContextMenuClosed(null);
- return res;
- }
- });
- popup.show();
- }
-}
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtPopupMenu14.java b/src/android/jar/src/org/qtproject/qt5/android/QtPopupMenu14.java
deleted file mode 100644
index edef682dec..0000000000
--- a/src/android/jar/src/org/qtproject/qt5/android/QtPopupMenu14.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the Android port of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-package org.qtproject.qt5.android;
-
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.PopupMenu;
-
-public class QtPopupMenu14 {
- private QtPopupMenu14() { }
-
- private static class QtPopupMenu14Holder {
- private static final QtPopupMenu14 INSTANCE = new QtPopupMenu14();
- }
-
- public static QtPopupMenu14 getInstance() {
- return QtPopupMenu14Holder.INSTANCE;
- }
-
- public void showMenu(View anchor)
- {
- PopupMenu popup = new PopupMenu(QtNative.activity(), anchor);
- QtNative.activityDelegate().onCreatePopupMenu(popup.getMenu());
- popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem menuItem) {
- return QtNative.activityDelegate().onContextItemSelected(menuItem);
- }
- });
- popup.setOnDismissListener(new PopupMenu.OnDismissListener() {
- @Override
- public void onDismiss(PopupMenu popupMenu) {
- QtNative.activityDelegate().onContextMenuClosed(popupMenu.getMenu());
- }
- });
- popup.show();
- }
-}
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtSurface.java b/src/android/jar/src/org/qtproject/qt5/android/QtSurface.java
index 74433d2b65..51d0410816 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtSurface.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtSurface.java
@@ -62,9 +62,6 @@ public class QtSurface extends SurfaceView implements SurfaceHolder.Callback
else
getHolder().setFormat(PixelFormat.RGBA_8888);
- if (android.os.Build.VERSION.SDK_INT < 11)
- getHolder().setType(SurfaceHolder.SURFACE_TYPE_GPU);
-
setId(id);
m_gestureDetector =
new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
diff --git a/src/android/accessibility/jar/src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java
index 6f95675597..6f95675597 100644
--- a/src/android/accessibility/jar/src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/accessibility/QtAccessibilityDelegate.java
diff --git a/src/android/accessibility/jar/src/org/qtproject/qt5/android/accessibility/QtNativeAccessibility.java b/src/android/jar/src/org/qtproject/qt5/android/accessibility/QtNativeAccessibility.java
index bfda2d55b7..bfda2d55b7 100644
--- a/src/android/accessibility/jar/src/org/qtproject/qt5/android/accessibility/QtNativeAccessibility.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/accessibility/QtNativeAccessibility.java
diff --git a/src/android/java/res/values-ro/strings.xml b/src/android/java/res/values-ro/strings.xml
index f88a442b35..fef52ad3bd 100644
--- a/src/android/java/res/values-ro/strings.xml
+++ b/src/android/java/res/values-ro/strings.xml
@@ -3,4 +3,5 @@
<string name="ministro_not_found_msg">Serviciul Ministro nu poate fi găsit.\nAplicaţia nu poate porni.</string>
<string name="ministro_needed_msg">Această aplicaţie necesită serviciul Ministro.\nDoriţi să-l instalaţi?</string>
<string name="fatal_error_msg">Aplicaţia dumneavoastră a întâmpinat o eroare fatală şi nu poate continua.</string>
+ <string name="unsupported_android_version">Versiune Android nesuportată.</string>
</resources>
diff --git a/src/android/java/res/values/strings.xml b/src/android/java/res/values/strings.xml
index fcc3eb097b..95b3385924 100644
--- a/src/android/java/res/values/strings.xml
+++ b/src/android/java/res/values/strings.xml
@@ -4,4 +4,5 @@
<string name="ministro_not_found_msg">Can\'t find Ministro service.\nThe application can\'t start.</string>
<string name="ministro_needed_msg">This application requires Ministro service. Would you like to install it?</string>
<string name="fatal_error_msg">Your application encountered a fatal error and cannot continue.</string>
+ <string name="unsupported_android_version">Unsupported Android version.</string>
</resources>
diff --git a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
index 146d6b34f2..0859318fe1 100644
--- a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
+++ b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
@@ -183,11 +183,7 @@ public class QtActivity extends Activity
public QtActivity()
{
- if (Build.VERSION.SDK_INT <= 10) {
- QT_ANDROID_THEMES = new String[] {"Theme_Light"};
- QT_ANDROID_DEFAULT_THEME = "Theme_Light";
- }
- else if ((Build.VERSION.SDK_INT >= 11 && Build.VERSION.SDK_INT <= 13) || Build.VERSION.SDK_INT >= 21){
+ if (Build.VERSION.SDK_INT >= 21) {
QT_ANDROID_THEMES = new String[] {"Theme_Holo_Light"};
QT_ANDROID_DEFAULT_THEME = "Theme_Holo_Light";
} else {
@@ -843,7 +839,6 @@ public class QtActivity extends Activity
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
-
try {
m_activityInfo = getPackageManager().getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);
for (Field f : Class.forName("android.R$style").getDeclaredFields()) {
@@ -858,21 +853,30 @@ public class QtActivity extends Activity
return;
}
+ if (Build.VERSION.SDK_INT < 16) {
+ // fatal error, show the error and quit
+ AlertDialog errorDialog = new AlertDialog.Builder(QtActivity.this).create();
+ if (m_activityInfo.metaData.containsKey("android.app.unsupported_android_version"))
+ errorDialog.setMessage(m_activityInfo.metaData.getString("android.app.unsupported_android_version"));
+ else
+ errorDialog.setMessage("Unsupported Android version.");
+ errorDialog.setButton(getResources().getString(android.R.string.ok), new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ finish();
+ }
+ });
+ errorDialog.show();
+ return;
+ }
+
try {
setTheme(Class.forName("android.R$style").getDeclaredField(QT_ANDROID_DEFAULT_THEME).getInt(null));
} catch (Exception e) {
e.printStackTrace();
}
- if (Build.VERSION.SDK_INT > 10) {
- try {
- requestWindowFeature(Window.class.getField("FEATURE_ACTION_BAR").getInt(null));
- } catch (Exception e) {
- e.printStackTrace();
- }
- } else {
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- }
+ requestWindowFeature(Window.FEATURE_ACTION_BAR);
if (QtApplication.m_delegateObject != null && QtApplication.onCreate != null) {
QtApplication.invokeDelegateMethod(QtApplication.onCreate, savedInstanceState);
@@ -886,6 +890,9 @@ public class QtActivity extends Activity
if (null == getLastNonConfigurationInstance()) {
// if splash screen is defined, then show it
+ // Note: QtActivityDelegate handles updating the splash screen
+ // in onConfigurationChanged, change that too if you are changing
+ // how the splash screen should be displayed
if (m_activityInfo.metaData.containsKey("android.app.splash_screen_drawable"))
getWindow().setBackgroundDrawableResource(m_activityInfo.metaData.getInt("android.app.splash_screen_drawable"));
else
diff --git a/src/android/templates/AndroidManifest.xml b/src/android/templates/AndroidManifest.xml
index 262a5f6dba..2a6d0b6fa3 100644
--- a/src/android/templates/AndroidManifest.xml
+++ b/src/android/templates/AndroidManifest.xml
@@ -50,7 +50,7 @@
<!-- auto screen scale factor -->
</activity>
</application>
- <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="14"/>
+ <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="16"/>
<supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
<!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.
diff --git a/src/corelib/codecs/qutfcodec.cpp b/src/corelib/codecs/qutfcodec.cpp
index a64b3d167e..a8a0687d7a 100644
--- a/src/corelib/codecs/qutfcodec.cpp
+++ b/src/corelib/codecs/qutfcodec.cpp
@@ -256,8 +256,32 @@ QString QUtf8::convertToUnicode(const char *chars, int len)
// The table holds for invalid sequences too: we'll insert one replacement char
// per invalid byte.
QString result(len, Qt::Uninitialized);
+ QChar *data = const_cast<QChar*>(result.constData()); // we know we're not shared
+ const QChar *end = convertToUnicode(data, chars, len);
+ result.truncate(end - data);
+ return result;
+}
- ushort *dst = reinterpret_cast<ushort *>(const_cast<QChar *>(result.constData()));
+/*!
+ \since 5.7
+ \overload
+
+ Converts the UTF-8 sequence of \a len octets beginning at \a chars to
+ a sequence of QChar starting at \a buffer. The buffer is expected to be
+ large enough to hold the result. An upper bound for the size of the
+ buffer is \a len QChars.
+
+ If, during decoding, an error occurs, a QChar::ReplacementCharacter is
+ written.
+
+ Returns a pointer to one past the last QChar written.
+
+ This function never throws.
+*/
+
+QChar *QUtf8::convertToUnicode(QChar *buffer, const char *chars, int len) Q_DECL_NOTHROW
+{
+ ushort *dst = reinterpret_cast<ushort *>(buffer);
const uchar *src = reinterpret_cast<const uchar *>(chars);
const uchar *end = src + len;
@@ -288,8 +312,7 @@ QString QUtf8::convertToUnicode(const char *chars, int len)
}
}
- result.truncate(dst - reinterpret_cast<const ushort *>(result.constData()));
- return result;
+ return reinterpret_cast<QChar *>(dst);
}
QString QUtf8::convertToUnicode(const char *chars, int len, QTextCodec::ConverterState *state)
diff --git a/src/corelib/codecs/qutfcodec_p.h b/src/corelib/codecs/qutfcodec_p.h
index d97145c6fc..62540213f9 100644
--- a/src/corelib/codecs/qutfcodec_p.h
+++ b/src/corelib/codecs/qutfcodec_p.h
@@ -279,6 +279,7 @@ enum DataEndianness
struct QUtf8
{
+ static QChar *convertToUnicode(QChar *, const char *, int) Q_DECL_NOTHROW;
static QString convertToUnicode(const char *, int);
static QString convertToUnicode(const char *, int, QTextCodec::ConverterState *);
static QByteArray convertFromUnicode(const QChar *, int);
diff --git a/src/corelib/corelib.pro b/src/corelib/corelib.pro
index 5cd0bde87b..a8c8f65d37 100644
--- a/src/corelib/corelib.pro
+++ b/src/corelib/corelib.pro
@@ -16,13 +16,11 @@ CONFIG += optimize_full
QMAKE_DOCS = $$PWD/doc/qtcore.qdocconf
ANDROID_JAR_DEPENDENCIES = \
- jar/QtAndroid.jar \
- jar/QtAndroidAccessibility.jar
+ jar/QtAndroid.jar
ANDROID_LIB_DEPENDENCIES = \
plugins/platforms/android/libqtforandroid.so
ANDROID_BUNDLED_JAR_DEPENDENCIES = \
- jar/QtAndroid-bundled.jar \
- jar/QtAndroidAccessibility-bundled.jar
+ jar/QtAndroid-bundled.jar
ANDROID_PERMISSIONS = \
android.permission.INTERNET \
android.permission.WRITE_EXTERNAL_STORAGE
diff --git a/src/corelib/doc/snippets/code/src_corelib_global_qglobal.cpp b/src/corelib/doc/snippets/code/src_corelib_global_qglobal.cpp
index 6ff4f57945..ccf8399e0d 100644
--- a/src/corelib/doc/snippets/code/src_corelib_global_qglobal.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_global_qglobal.cpp
@@ -439,6 +439,11 @@ qWarning("%s: %s", qUtf8Printable(key), qUtf8Printable(value));
//! [37]
+//! [qUtf16Printable]
+qWarning("%ls: %ls", qUtf16Printable(key), qUtf16Printable(value));
+//! [qUtf16Printable]
+
+
//! [38]
struct Point2D
{
diff --git a/src/corelib/doc/snippets/qprocess/qprocess-createprocessargumentsmodifier.cpp b/src/corelib/doc/snippets/qprocess/qprocess-createprocessargumentsmodifier.cpp
new file mode 100644
index 0000000000..4dd32dd58a
--- /dev/null
+++ b/src/corelib/doc/snippets/qprocess/qprocess-createprocessargumentsmodifier.cpp
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QCoreApplication>
+#include <QProcess>
+#include <qt_windows.h>
+
+int main(int argc, char *argv[])
+{
+ QCoreApplication app(argc, argv);
+
+//! [0]
+ QProcess process;
+ process.setCreateProcessArgumentsModifier([] (QProcess::CreateProcessArguments *args)
+ {
+ args->flags |= CREATE_NEW_CONSOLE;
+ args->startupInfo->dwFlags &= ~STARTF_USESTDHANDLES;
+ args->startupInfo->dwFlags |= STARTF_USEFILLATTRIBUTE;
+ args->startupInfo->dwFillAttribute = BACKGROUND_BLUE | FOREGROUND_RED
+ | FOREGROUND_INTENSITY;
+ });
+ process.start("C:\\Windows\\System32\\cmd.exe", QStringList() << "/k" << "title" << "The Child Process");
+//! [0]
+
+ return app.exec();
+}
diff --git a/src/corelib/global/qcompilerdetection.h b/src/corelib/global/qcompilerdetection.h
index ba830977ad..24d022059d 100644
--- a/src/corelib/global/qcompilerdetection.h
+++ b/src/corelib/global/qcompilerdetection.h
@@ -1119,6 +1119,37 @@
#endif
/*
+ * SG10's SD-6 feature detection and some useful extensions from Clang and GCC
+ * https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations
+ * http://clang.llvm.org/docs/LanguageExtensions.html#feature-checking-macros
+ */
+#ifdef __has_builtin
+# define QT_HAS_BUILTIN(x) __has_builtin(x)
+#else
+# define QT_HAS_BUILTIN(x) 0
+#endif
+#ifdef __has_attribute
+# define QT_HAS_ATTRIBUTE(x) __has_attribute(x)
+#else
+# define QT_HAS_ATTRIBUTE(x) 0
+#endif
+#ifdef __has_cpp_attribute
+# define QT_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
+#else
+# define QT_HAS_CPP_ATTRIBUTE(x) 0
+#endif
+#ifdef __has_include
+# define QT_HAS_INCLUDE(x) __has_include(x)
+#else
+# define QT_HAS_INCLUDE(x) 0
+#endif
+#ifdef __has_include_next
+# define QT_HAS_INCLUDE_NEXT(x) __has_include_next(x)
+#else
+# define QT_HAS_INCLUDE_NEXT(x) 0
+#endif
+
+/*
* Warning/diagnostic handling
*/
diff --git a/src/corelib/global/qendian.h b/src/corelib/global/qendian.h
index 2ddefaec8b..dd0e5a7e5a 100644
--- a/src/corelib/global/qendian.h
+++ b/src/corelib/global/qendian.h
@@ -87,12 +87,6 @@ template <typename T> inline T qFromUnaligned(const uchar *src)
*/
template <typename T> T qbswap(T source);
-#ifdef __has_builtin
-# define QT_HAS_BUILTIN(x) __has_builtin(x)
-#else
-# define QT_HAS_BUILTIN(x) 0
-#endif
-
// GCC 4.3 implemented all the intrinsics, but the 16-bit one only got implemented in 4.8;
// Clang 2.6 implemented the 32- and 64-bit but waited until 3.2 to implement the 16-bit one
#if (defined(Q_CC_GNU) && Q_CC_GNU >= 403) || QT_HAS_BUILTIN(__builtin_bswap32)
@@ -154,8 +148,6 @@ template <> inline quint16 qbswap<quint16>(quint16 source)
}
#endif // GCC & Clang intrinsics
-#undef QT_HAS_BUILTIN
-
// signed specializations
template <> inline qint64 qbswap<qint64>(qint64 source)
{
diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp
index 81925642f8..a9abd07a3b 100644
--- a/src/corelib/global/qglobal.cpp
+++ b/src/corelib/global/qglobal.cpp
@@ -87,10 +87,6 @@ using namespace ABI::Windows::Networking::Sockets;
#include <private/qjni_p.h>
#endif
-#if defined(Q_OS_BLACKBERRY)
-# include <bps/deviceinfo.h>
-#endif
-
#if defined(Q_OS_SOLARIS)
# include <sys/systeminfo.h>
#endif
@@ -1183,30 +1179,35 @@ bool qSharedBuild() Q_DECL_NOTHROW
\macro Q_OS_DARWIN
\relates <QtGlobal>
- Defined on Darwin-based operating systems such as OS X and iOS,
- including any open source version(s) of Darwin.
+ Defined on Darwin-based operating systems such as OS X, iOS, watchOS, and tvOS.
*/
/*!
- \macro Q_OS_MAC
+ \macro Q_OS_OSX
\relates <QtGlobal>
- Defined on Darwin-based operating systems distributed by Apple, which
- currently includes OS X and iOS, but not the open source versions of Darwin.
+ Defined on OS X.
*/
/*!
- \macro Q_OS_OSX
+ \macro Q_OS_IOS
\relates <QtGlobal>
- Defined on OS X.
+ Defined on iOS.
*/
/*!
- \macro Q_OS_IOS
+ \macro Q_OS_WATCHOS
\relates <QtGlobal>
- Defined on iOS.
+ Defined on watchOS.
+ */
+
+/*!
+ \macro Q_OS_TVOS
+ \relates <QtGlobal>
+
+ Defined on tvOS.
*/
/*!
@@ -2512,7 +2513,7 @@ static QString unknownText()
Note that this function may return surprising values: it returns "linux"
for all operating systems running Linux (including Android), "qnx" for all
- operating systems running QNX (including BlackBerry 10), "freebsd" for
+ operating systems running QNX, "freebsd" for
Debian/kFreeBSD, and "darwin" for OS X and iOS. For information on the type
of product the application is running on, see productType().
@@ -2537,7 +2538,7 @@ QString QSysInfo::kernelType()
Returns the release version of the operating system kernel. On Windows, it
returns the version of the NT or CE kernel. On Unix systems, including
- Android, BlackBerry and OS X, it returns the same as the \c{uname -r}
+ Android and OS X, it returns the same as the \c{uname -r}
command would return.
If the version could not be determined, this function may return an empty
@@ -2578,10 +2579,6 @@ QString QSysInfo::kernelVersion()
to determine the distribution name and returns that. If determining the
distribution name failed, it returns "unknown".
- \b{BlackBerry note}: this function returns "blackberry" for QNX systems
- running the BlackBerry userspace, but "qnx" for all other QNX-based
- systems.
-
\b{Darwin, OS X and iOS note}: this function returns "osx" for OS X
systems, "ios" for iOS systems and "darwin" in case the system could not be
determined.
@@ -2609,8 +2606,6 @@ QString QSysInfo::productType()
#elif defined(Q_OS_WIN)
return QStringLiteral("windows");
-#elif defined(Q_OS_BLACKBERRY)
- return QStringLiteral("blackberry");
#elif defined(Q_OS_QNX)
return QStringLiteral("qnx");
@@ -2639,7 +2634,7 @@ QString QSysInfo::productType()
Returns the product version of the operating system in string form. If the
version could not be determined, this function returns "unknown".
- It will return the Android, BlackBerry, iOS, OS X, Windows full-product
+ It will return the Android, iOS, OS X, Windows full-product
versions on those systems. In particular, on OS X, iOS and Windows, the
returned string is similar to the macVersion() or windowsVersion() enums.
@@ -2650,7 +2645,7 @@ QString QSysInfo::productType()
In all other Unix-type systems, this function always returns "unknown".
\note The version string returned from this function is only guaranteed to
- be orderable on Android, BlackBerry, OS X and iOS. On Windows, some Windows
+ be orderable on Android, OS X and iOS. On Windows, some Windows
versions are text ("XP" and "Vista", for example). On Linux, the version of
the distribution may jump unexpectedly, please refer to the distribution's
documentation for versioning practices.
@@ -2668,18 +2663,11 @@ QString QSysInfo::productVersion()
return QString::fromLatin1(version).toLower();
// fall through
-// Android and Blackberry should not fall through to the Unix code
+// Android should not fall through to the Unix code
#elif defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK)
return QJNIObjectPrivate::getStaticObjectField("android/os/Build$VERSION", "RELEASE", "Ljava/lang/String;").toString();
#elif defined(Q_OS_ANDROID) // Q_OS_ANDROID_NO_SDK
// TBD
-#elif defined(Q_OS_BLACKBERRY)
- deviceinfo_details_t *deviceInfo;
- if (deviceinfo_get_details(&deviceInfo) == BPS_SUCCESS) {
- QString bbVersion = QString::fromLatin1(deviceinfo_details_get_device_os_version(deviceInfo));
- deviceinfo_free_details(&deviceInfo);
- return bbVersion;
- }
#elif defined(USE_ETC_OS_RELEASE) // Q_OS_UNIX
QUnixOSVersion unixOsVersion;
findUnixOsVersion(unixOsVersion);
@@ -2755,8 +2743,6 @@ QString QSysInfo::prettyProductName()
return QLatin1String("Windows ") + QLatin1String(winVer_helper());
#elif defined(Q_OS_ANDROID)
return QLatin1String("Android ") + productVersion();
-#elif defined(Q_OS_BLACKBERRY)
- return QLatin1String("BlackBerry ") + productVersion();
#elif defined(Q_OS_HAIKU)
return QLatin1String("Haiku ") + productVersion();
#elif defined(Q_OS_UNIX)
@@ -3820,6 +3806,29 @@ int qrand()
*/
/*!
+ \macro const wchar_t *qUtf16Printable(const QString &str)
+ \relates <QtGlobal>
+ \since 5.7
+
+ Returns \a str as a \c{const ushort *}, but cast to a \c{const wchar_t *}
+ to avoid warnings. This is equivalent to \a{str}.utf16() plus some casting.
+
+ The only useful thing you can do with the return value of this macro is to
+ pass it to QString::asprintf() for use in a \c{%ls} conversion. In particular,
+ the return value is \e{not} a valid \c{const wchar_t*}!
+
+ In general, the pointer will be invalid after the statement in which
+ qUtf16Printable() is used. This is because the pointer may have been
+ obtained from a temporary expression, which will fall out of scope.
+
+ Example:
+
+ \snippet code/src_corelib_global_qglobal.cpp qUtf16Printable
+
+ \sa qPrintable(), qDebug(), qInfo(), qWarning(), qCritical(), qFatal()
+*/
+
+/*!
\macro Q_DECLARE_TYPEINFO(Type, Flags)
\relates <QtGlobal>
@@ -4229,7 +4238,7 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
Calls the message handler with the debug message \a message. If no
message handler has been installed, the message is printed to
stderr. Under Windows the message is sent to the console, if it is a
- console application; otherwise, it is sent to the debugger. On Blackberry, the
+ console application; otherwise, it is sent to the debugger. On QNX, the
message is sent to slogger2. This function does nothing if \c QT_NO_DEBUG_OUTPUT
was defined during compilation.
@@ -4266,7 +4275,7 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
Calls the message handler with the informational message \a message. If no
message handler has been installed, the message is printed to
stderr. Under Windows, the message is sent to the console, if it is a
- console application; otherwise, it is sent to the debugger. On Blackberry the
+ console application; otherwise, it is sent to the debugger. On QNX the
message is sent to slogger2. This function does nothing if \c QT_NO_INFO_OUTPUT
was defined during compilation.
@@ -4302,7 +4311,7 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
Calls the message handler with the warning message \a message. If no
message handler has been installed, the message is printed to
stderr. Under Windows, the message is sent to the debugger.
- On Blackberry the message is sent to slogger2. This
+ On QNX the message is sent to slogger2. This
function does nothing if \c QT_NO_WARNING_OUTPUT was defined
during compilation; it exits if the environment variable \c
QT_FATAL_WARNINGS is not empty.
@@ -4336,7 +4345,7 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
Calls the message handler with the critical message \a message. If no
message handler has been installed, the message is printed to
stderr. Under Windows, the message is sent to the debugger.
- On Blackberry the message is sent to slogger2.
+ On QNX the message is sent to slogger2
It exits if the environment variable QT_FATAL_CRITICALS is not empty.
@@ -4369,7 +4378,7 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
Calls the message handler with the fatal message \a message. If no
message handler has been installed, the message is printed to
stderr. Under Windows, the message is sent to the debugger.
- On Blackberry the message is sent to slogger2.
+ On QNX the message is sent to slogger2
If you are using the \b{default message handler} this function will
abort on Unix systems to create a core dump. On Windows, for debug builds,
diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h
index 07a0b5e27a..128d8abad7 100644
--- a/src/corelib/global/qglobal.h
+++ b/src/corelib/global/qglobal.h
@@ -687,6 +687,15 @@ Q_CORE_EXPORT bool qSharedBuild() Q_DECL_NOTHROW;
# define qUtf8Printable(string) QString(string).toUtf8().constData()
#endif
+/*
+ Wrap QString::utf16() with enough casts to allow passing it
+ to QString::asprintf("%ls") without warnings.
+*/
+#ifndef qUtf16Printable
+# define qUtf16Printable(string) \
+ static_cast<const wchar_t*>(static_cast<const void*>(QString(string).utf16()))
+#endif
+
class QString;
Q_CORE_EXPORT QString qt_error_string(int errorCode = -1);
@@ -745,7 +754,7 @@ Q_CORE_EXPORT void qt_check_pointer(const char *, int);
Q_CORE_EXPORT void qBadAlloc();
#ifdef QT_NO_EXCEPTIONS
-# if defined(QT_NO_DEBUG)
+# if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS)
# define Q_CHECK_PTR(p) qt_noop()
# else
# define Q_CHECK_PTR(p) do {if(!(p))qt_check_pointer(__FILE__,__LINE__);} while (0)
@@ -915,8 +924,6 @@ QT_WARNING_DISABLE_MSVC(4530) /* C++ exception handler used, but unwind semantic
# endif
#endif
-#if defined(Q_COMPILER_DECLTYPE) || defined(Q_CC_GNU)
-/* make use of decltype or GCC's __typeof__ extension */
template <typename T>
class QForeachContainer {
QForeachContainer &operator=(const QForeachContainer &) Q_DECL_EQ_DELETE;
@@ -927,17 +934,6 @@ public:
int control;
};
-// We need to use __typeof__ if we don't have decltype or if the compiler
-// hasn't been updated to the fix of Core Language Defect Report 382
-// (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#382).
-// GCC 4.3 and 4.4 have support for decltype, but are affected by DR 382.
-# if defined(Q_COMPILER_DECLTYPE) && \
- (defined(Q_CC_CLANG) || defined(Q_CC_INTEL) || !defined(Q_CC_GNU) || Q_CC_GNU >= 405)
-# define QT_FOREACH_DECLTYPE(x) typename QtPrivate::remove_reference<decltype(x)>::type
-# else
-# define QT_FOREACH_DECLTYPE(x) __typeof__((x))
-# endif
-
// Explanation of the control word:
// - it's initialized to 1
// - that means both the inner and outer loops start
@@ -947,61 +943,12 @@ public:
// the outer loop to continue executing
// - if there was a break inside the inner loop, it will exit with control still
// set to 1; in that case, the outer loop will invert it to 0 and will exit too
-# define Q_FOREACH(variable, container) \
-for (QForeachContainer<QT_FOREACH_DECLTYPE(container)> _container_((container)); \
+#define Q_FOREACH(variable, container) \
+for (QForeachContainer<typename QtPrivate::remove_reference<decltype(container)>::type> _container_((container)); \
_container_.control && _container_.i != _container_.e; \
++_container_.i, _container_.control ^= 1) \
for (variable = *_container_.i; _container_.control; _container_.control = 0)
-#else
-
-struct QForeachContainerBase {};
-
-template <typename T>
-class QForeachContainer : public QForeachContainerBase {
- QForeachContainer &operator=(const QForeachContainer &) Q_DECL_EQ_DELETE;
-public:
- inline QForeachContainer(const T& t): c(t), brk(0), i(c.begin()), e(c.end()){}
- QForeachContainer(const QForeachContainer &other)
- : c(other.c), brk(other.brk), i(other.i), e(other.e) {}
- const T c;
- mutable int brk;
- mutable typename T::const_iterator i, e;
- inline bool condition() const { return (!brk++ && i != e); }
-};
-
-template <typename T> inline T *qForeachPointer(const T &) { return 0; }
-
-template <typename T> inline QForeachContainer<T> qForeachContainerNew(const T& t)
-{ return QForeachContainer<T>(t); }
-
-template <typename T>
-inline const QForeachContainer<T> *qForeachContainer(const QForeachContainerBase *base, const T *)
-{ return static_cast<const QForeachContainer<T> *>(base); }
-
-#if defined(Q_CC_DIAB)
-// VxWorks DIAB generates unresolvable symbols, if container is a function call
-# define Q_FOREACH(variable,container) \
- if(0){}else \
- for (const QForeachContainerBase &_container_ = qForeachContainerNew(container); \
- qForeachContainer(&_container_, (__typeof__(container) *) 0)->condition(); \
- ++qForeachContainer(&_container_, (__typeof__(container) *) 0)->i) \
- for (variable = *qForeachContainer(&_container_, (__typeof__(container) *) 0)->i; \
- qForeachContainer(&_container_, (__typeof__(container) *) 0)->brk; \
- --qForeachContainer(&_container_, (__typeof__(container) *) 0)->brk)
-
-#else
-# define Q_FOREACH(variable, container) \
- for (const QForeachContainerBase &_container_ = qForeachContainerNew(container); \
- qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->condition(); \
- ++qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->i) \
- for (variable = *qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->i; \
- qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->brk; \
- --qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->brk)
-#endif // MSVC6 || MIPSpro
-
-#endif
-
#define Q_FOREVER for(;;)
#ifndef QT_NO_KEYWORDS
# ifndef foreach
diff --git a/src/corelib/global/qhooks.cpp b/src/corelib/global/qhooks.cpp
index 382f45f592..40a7c88f13 100644
--- a/src/corelib/global/qhooks.cpp
+++ b/src/corelib/global/qhooks.cpp
@@ -37,7 +37,7 @@ QT_BEGIN_NAMESPACE
// Only add to the end, and bump version if you do.
quintptr Q_CORE_EXPORT qtHookData[] = {
- 2, // hook data version
+ 3, // hook data version
QHooks::LastHookIndex, // size of qtHookData
QT_VERSION,
@@ -52,6 +52,15 @@ quintptr Q_CORE_EXPORT qtHookData[] = {
0,
// Startup, void(*)(), called once QCoreApplication is operational
+ 0,
+
+ // TypeInformationVersion, an integral value, bumped whenever private
+ // object sizes or member offsets that are used in Qt Creator's
+ // data structure "pretty printing" change.
+ //
+ // The required sizes and offsets are tested in tests/auto/other/toolsupport.
+ // When this fails and the change was intentional, adjust the test and
+ // adjust this value here.
0
};
diff --git a/src/corelib/global/qhooks_p.h b/src/corelib/global/qhooks_p.h
index 3ff4980abe..2beb58f8a7 100644
--- a/src/corelib/global/qhooks_p.h
+++ b/src/corelib/global/qhooks_p.h
@@ -61,6 +61,7 @@ enum HookIndex {
AddQObject = 3,
RemoveQObject = 4,
Startup = 5,
+ TypeInformationVersion = 6,
LastHookIndex
};
diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp
index 20c31f7ef8..47591a3fa8 100644
--- a/src/corelib/global/qlogging.cpp
+++ b/src/corelib/global/qlogging.cpp
@@ -75,17 +75,13 @@
# include "private/qcore_unix_p.h"
#endif
-#ifndef __has_include
-# define __has_include(x) 0
-#endif
-
#ifndef QT_BOOTSTRAPPED
#if !defined QT_NO_REGULAREXPRESSION
# ifdef __UCLIBC__
# if __UCLIBC_HAS_BACKTRACE__
# define QLOGGING_HAVE_BACKTRACE
# endif
-# elif (defined(__GLIBC__) && defined(__GLIBCXX__)) || (__has_include(<cxxabi.h>) && __has_include(<execinfo.h>))
+# elif (defined(__GLIBC__) && defined(__GLIBCXX__)) || (QT_HAS_INCLUDE(<cxxabi.h>) && QT_HAS_INCLUDE(<execinfo.h>))
# define QLOGGING_HAVE_BACKTRACE
# endif
#endif
@@ -94,7 +90,7 @@
extern char *__progname;
#endif
-#if defined(Q_OS_LINUX) && (defined(__GLIBC__) || __has_include(<sys/syscall.h>))
+#if defined(Q_OS_LINUX) && (defined(__GLIBC__) || QT_HAS_INCLUDE(<sys/syscall.h>))
# include <sys/syscall.h>
static long qt_gettid()
{
diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h
index c4f5415a01..45594d1914 100644
--- a/src/corelib/global/qnamespace.h
+++ b/src/corelib/global/qnamespace.h
@@ -482,7 +482,8 @@ public:
AA_DontShowIconsInMenus = 2,
AA_NativeWindows = 3,
AA_DontCreateNativeWidgetSiblings = 4,
- AA_MacPluginApplication = 5,
+ AA_PluginApplication = 5,
+ AA_MacPluginApplication = AA_PluginApplication, // ### Qt 6: remove me
AA_DontUseNativeMenuBar = 6,
AA_MacDontSwapCtrlAndMeta = 7,
AA_Use96Dpi = 8,
@@ -498,6 +499,7 @@ public:
AA_SetPalette = 19,
AA_EnableHighDpiScaling = 20,
AA_DisableHighDpiScaling = 21,
+ AA_UseStyleSheetPropagationInWidgetStyles = 22, // ### Qt 6: remove me
// Add new attributes before this line
AA_AttributeCount
diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc
index 502d6acd9f..7fd76be3ca 100644
--- a/src/corelib/global/qnamespace.qdoc
+++ b/src/corelib/global/qnamespace.qdoc
@@ -120,13 +120,21 @@
widgets stay non-native unless specifically set by the
Qt::WA_NativeWindow attribute.
- \value AA_MacPluginApplication Stops the Qt mac application from doing
- specific initializations that do not necessarily make sense when using Qt
- to author a plugin. This includes avoiding loading our nib for the main
- menu and not taking possession of the native menu bar. When setting this
+ \value AA_PluginApplication Indicates that Qt is used to author a plugin. Depending
+ on the operating system, it suppresses specific initializations that do not
+ necessarily make sense in the plugin case.
+
+ For example on OS X, this includes avoiding loading our nib for the main
+ menu and not taking possession of the native menu bar. Setting this
attribute to true will also set the AA_DontUseNativeMenuBar attribute
to true. It also disables native event filters.
+ This attribute has been added in Qt 5.7. It must be set before
+ \l {QGuiApplication}{Q(Gui)Application} is constructed.
+
+ \value AA_MacPluginApplication This attribute has been deprecated.
+ Use AA_PluginApplication instead.
+
\value AA_DontUseNativeMenuBar All menubars created while this attribute is
set to true won't be used as a native menubar (e.g, the menubar at
the top of the main screen on OS X or at the bottom in Windows CE).
@@ -217,6 +225,13 @@
environment variable to 0. This value has been added in Qt 5.6. This
attribute must be set before Q(Gui)Application is constructed.
+ \value AA_UseStyleSheetPropagationInWidgetStyles By default, Qt Style Sheets
+ disable regular QWidget palette and font propagation. When this flag
+ is enabled, font and palette changes propagate as though the user had
+ manually called the corresponding QWidget methods. See
+ \l{The Style Sheet Syntax#Inheritance}{The Style Sheet Syntax - Inheritance}
+ for more details. This value has been added in Qt 5.7.
+
The following values are obsolete:
\value AA_ImmediateWidgetCreation This attribute is no longer fully
@@ -2096,8 +2111,8 @@
another process or by manually using native code.
\value CoverWindow Indicates that the window represents a cover window,
- which is shown when the application is minimized
- on the BlackBerry platform for instance.
+ which is shown when the application is minimized on
+ some platforms.
There are also a number of flags which you can use to customize
the appearance of top-level windows. These have no effect on other
diff --git a/src/corelib/global/qnumeric_p.h b/src/corelib/global/qnumeric_p.h
index b18d521d05..e1941fcbe0 100644
--- a/src/corelib/global/qnumeric_p.h
+++ b/src/corelib/global/qnumeric_p.h
@@ -47,7 +47,7 @@
//
#include "QtCore/qglobal.h"
-
+#include <cmath>
#include <limits>
#if defined(Q_CC_MSVC) && !defined(Q_OS_WINCE)
@@ -56,153 +56,112 @@
# include <immintrin.h> // for _addcarry_u<nn>
#endif
-#ifndef __has_builtin
-# define __has_builtin(x) 0
+#if defined(Q_CC_MSVC)
+#include <float.h>
#endif
+#if !defined(Q_CC_MSVC) && (defined(Q_OS_QNX) || !defined(__cplusplus) || __cplusplus < 201103L)
+#include <math.h>
QT_BEGIN_NAMESPACE
-
-#if !defined(Q_CC_MIPS)
-
-static const union { unsigned char c[8]; double d; } qt_be_inf_bytes = { { 0x7f, 0xf0, 0, 0, 0, 0, 0, 0 } };
-static const union { unsigned char c[8]; double d; } qt_le_inf_bytes = { { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f } };
-static inline double qt_inf()
-{
- return (QSysInfo::ByteOrder == QSysInfo::BigEndian
- ? qt_be_inf_bytes.d
- : qt_le_inf_bytes.d);
+namespace qnumeric_std_wrapper {
+// the 'using namespace std' below is cases where the stdlib already put the math.h functions in the std namespace and undefined the macros.
+static inline bool math_h_isnan(double d) { using namespace std; return isnan(d); }
+static inline bool math_h_isinf(double d) { using namespace std; return isinf(d); }
+static inline bool math_h_isfinite(double d) { using namespace std; return isfinite(d); }
+static inline bool math_h_isnan(float f) { using namespace std; return isnan(f); }
+static inline bool math_h_isinf(float f) { using namespace std; return isinf(f); }
+static inline bool math_h_isfinite(float f) { using namespace std; return isfinite(f); }
}
+QT_END_NAMESPACE
+// These macros from math.h conflict with the real functions in the std namespace.
+#undef signbit
+#undef isnan
+#undef isinf
+#undef isfinite
+#endif
-// Signaling NAN
-static const union { unsigned char c[8]; double d; } qt_be_snan_bytes = { { 0x7f, 0xf8, 0, 0, 0, 0, 0, 0 } };
-static const union { unsigned char c[8]; double d; } qt_le_snan_bytes = { { 0, 0, 0, 0, 0, 0, 0xf8, 0x7f } };
-static inline double qt_snan()
-{
- return (QSysInfo::ByteOrder == QSysInfo::BigEndian
- ? qt_be_snan_bytes.d
- : qt_le_snan_bytes.d);
-}
+QT_BEGIN_NAMESPACE
-// Quiet NAN
-static const union { unsigned char c[8]; double d; } qt_be_qnan_bytes = { { 0xff, 0xf8, 0, 0, 0, 0, 0, 0 } };
-static const union { unsigned char c[8]; double d; } qt_le_qnan_bytes = { { 0, 0, 0, 0, 0, 0, 0xf8, 0xff } };
-static inline double qt_qnan()
-{
- return (QSysInfo::ByteOrder == QSysInfo::BigEndian
- ? qt_be_qnan_bytes.d
- : qt_le_qnan_bytes.d);
+namespace qnumeric_std_wrapper {
+#if defined(Q_CC_MSVC) && _MSC_VER < 1800
+static inline bool isnan(double d) { return !!_isnan(d); }
+static inline bool isinf(double d) { return !_finite(d) && !_isnan(d); }
+static inline bool isfinite(double d) { return !!_finite(d); }
+static inline bool isnan(float f) { return !!_isnan(f); }
+static inline bool isinf(float f) { return !_finite(f) && !_isnan(f); }
+static inline bool isfinite(float f) { return !!_finite(f); }
+#elif !defined(Q_CC_MSVC) && (defined(Q_OS_QNX) || !defined(__cplusplus) || __cplusplus < 201103L)
+static inline bool isnan(double d) { return math_h_isnan(d); }
+static inline bool isinf(double d) { return math_h_isinf(d); }
+static inline bool isfinite(double d) { return math_h_isfinite(d); }
+static inline bool isnan(float f) { return math_h_isnan(f); }
+static inline bool isinf(float f) { return math_h_isinf(f); }
+static inline bool isfinite(float f) { return math_h_isfinite(f); }
+#else
+static inline bool isnan(double d) { return std::isnan(d); }
+static inline bool isinf(double d) { return std::isinf(d); }
+static inline bool isfinite(double d) { return std::isfinite(d); }
+static inline bool isnan(float f) { return std::isnan(f); }
+static inline bool isinf(float f) { return std::isinf(f); }
+static inline bool isfinite(float f) { return std::isfinite(f); }
+#endif
}
-#else // Q_CC_MIPS
-
-static const unsigned char qt_be_inf_bytes[] = { 0x7f, 0xf0, 0, 0, 0, 0, 0, 0 };
-static const unsigned char qt_le_inf_bytes[] = { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f };
-static inline double qt_inf()
+Q_DECL_CONSTEXPR static inline double qt_inf() Q_DECL_NOEXCEPT
{
- const unsigned char *bytes;
- bytes = (QSysInfo::ByteOrder == QSysInfo::BigEndian
- ? qt_be_inf_bytes
- : qt_le_inf_bytes);
-
- union { unsigned char c[8]; double d; } returnValue;
- memcpy(returnValue.c, bytes, sizeof(returnValue.c));
- return returnValue.d;
+ Q_STATIC_ASSERT_X(std::numeric_limits<double>::has_infinity,
+ "platform has no definition for infinity for type double");
+ return std::numeric_limits<double>::infinity();
}
-// Signaling NAN
-static const unsigned char qt_be_snan_bytes[] = { 0x7f, 0xf8, 0, 0, 0, 0, 0, 0 };
-static const unsigned char qt_le_snan_bytes[] = { 0, 0, 0, 0, 0, 0, 0xf8, 0x7f };
-static inline double qt_snan()
+// Signaling NaN
+Q_DECL_CONSTEXPR static inline double qt_snan() Q_DECL_NOEXCEPT
{
- const unsigned char *bytes;
- bytes = (QSysInfo::ByteOrder == QSysInfo::BigEndian
- ? qt_be_snan_bytes
- : qt_le_snan_bytes);
-
- union { unsigned char c[8]; double d; } returnValue;
- memcpy(returnValue.c, bytes, sizeof(returnValue.c));
- return returnValue.d;
+ Q_STATIC_ASSERT_X(std::numeric_limits<double>::has_signaling_NaN,
+ "platform has no definition for signaling NaN for type double");
+ return std::numeric_limits<double>::signaling_NaN();
}
-// Quiet NAN
-static const unsigned char qt_be_qnan_bytes[] = { 0xff, 0xf8, 0, 0, 0, 0, 0, 0 };
-static const unsigned char qt_le_qnan_bytes[] = { 0, 0, 0, 0, 0, 0, 0xf8, 0xff };
-static inline double qt_qnan()
+// Quiet NaN
+Q_DECL_CONSTEXPR static inline double qt_qnan() Q_DECL_NOEXCEPT
{
- const unsigned char *bytes;
- bytes = (QSysInfo::ByteOrder == QSysInfo::BigEndian
- ? qt_be_qnan_bytes
- : qt_le_qnan_bytes);
-
- union { unsigned char c[8]; double d; } returnValue;
- memcpy(returnValue.c, bytes, sizeof(returnValue.c));
- return returnValue.d;
+ Q_STATIC_ASSERT_X(std::numeric_limits<double>::has_quiet_NaN,
+ "platform has no definition for quiet NaN for type double");
+ return std::numeric_limits<double>::quiet_NaN();
}
-#endif // Q_CC_MIPS
-
static inline bool qt_is_inf(double d)
{
- uchar *ch = (uchar *)&d;
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- return (ch[0] & 0x7f) == 0x7f && ch[1] == 0xf0;
- } else {
- return (ch[7] & 0x7f) == 0x7f && ch[6] == 0xf0;
- }
+ return qnumeric_std_wrapper::isinf(d);
}
static inline bool qt_is_nan(double d)
{
- uchar *ch = (uchar *)&d;
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- return (ch[0] & 0x7f) == 0x7f && ch[1] > 0xf0;
- } else {
- return (ch[7] & 0x7f) == 0x7f && ch[6] > 0xf0;
- }
+ return qnumeric_std_wrapper::isnan(d);
}
static inline bool qt_is_finite(double d)
{
- uchar *ch = (uchar *)&d;
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- return (ch[0] & 0x7f) != 0x7f || (ch[1] & 0xf0) != 0xf0;
- } else {
- return (ch[7] & 0x7f) != 0x7f || (ch[6] & 0xf0) != 0xf0;
- }
+ return qnumeric_std_wrapper::isfinite(d);
}
-static inline bool qt_is_inf(float d)
+static inline bool qt_is_inf(float f)
{
- uchar *ch = (uchar *)&d;
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- return (ch[0] & 0x7f) == 0x7f && ch[1] == 0x80;
- } else {
- return (ch[3] & 0x7f) == 0x7f && ch[2] == 0x80;
- }
+ return qnumeric_std_wrapper::isinf(f);
}
-static inline bool qt_is_nan(float d)
+static inline bool qt_is_nan(float f)
{
- uchar *ch = (uchar *)&d;
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- return (ch[0] & 0x7f) == 0x7f && ch[1] > 0x80;
- } else {
- return (ch[3] & 0x7f) == 0x7f && ch[2] > 0x80;
- }
+ return qnumeric_std_wrapper::isnan(f);
}
-static inline bool qt_is_finite(float d)
+static inline bool qt_is_finite(float f)
{
- uchar *ch = (uchar *)&d;
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- return (ch[0] & 0x7f) != 0x7f || (ch[1] & 0x80) != 0x80;
- } else {
- return (ch[3] & 0x7f) != 0x7f || (ch[2] & 0x80) != 0x80;
- }
+ return qnumeric_std_wrapper::isfinite(f);
}
//
-// Overflow math
+// Unsigned overflow math
//
namespace {
template <typename T> inline typename QtPrivate::QEnableIf<QtPrivate::is_unsigned<T>::value, bool>::Type
@@ -230,28 +189,28 @@ mul_overflow(T v1, T v2, T *r)
#endif
// GCC 5 and Clang have builtins to detect overflows
-#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || __has_builtin(__builtin_uadd_overflow)
+#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || QT_HAS_BUILTIN(__builtin_uadd_overflow)
template <> inline bool add_overflow(unsigned v1, unsigned v2, unsigned *r)
{ return __builtin_uadd_overflow(v1, v2, r); }
#endif
-#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || __has_builtin(__builtin_uaddl_overflow)
+#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || QT_HAS_BUILTIN(__builtin_uaddl_overflow)
template <> inline bool add_overflow(unsigned long v1, unsigned long v2, unsigned long *r)
{ return __builtin_uaddl_overflow(v1, v2, r); }
#endif
-#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || __has_builtin(__builtin_uaddll_overflow)
+#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || QT_HAS_BUILTIN(__builtin_uaddll_overflow)
template <> inline bool add_overflow(unsigned long long v1, unsigned long long v2, unsigned long long *r)
{ return __builtin_uaddll_overflow(v1, v2, r); }
#endif
-#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || __has_builtin(__builtin_umul_overflow)
+#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || QT_HAS_BUILTIN(__builtin_umul_overflow)
template <> inline bool mul_overflow(unsigned v1, unsigned v2, unsigned *r)
{ return __builtin_umul_overflow(v1, v2, r); }
#endif
-#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || __has_builtin(__builtin_umull_overflow)
+#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || QT_HAS_BUILTIN(__builtin_umull_overflow)
template <> inline bool mul_overflow(unsigned long v1, unsigned long v2, unsigned long *r)
{ return __builtin_umull_overflow(v1, v2, r); }
#endif
-#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || __has_builtin(__builtin_umulll_overflow)
+#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || QT_HAS_BUILTIN(__builtin_umulll_overflow)
template <> inline bool mul_overflow(unsigned long long v1, unsigned long long v2, unsigned long long *r)
{ return __builtin_umulll_overflow(v1, v2, r); }
# define HAVE_MUL64_OVERFLOW
@@ -303,6 +262,97 @@ template <> inline bool mul_overflow(unsigned long v1, unsigned long v2, unsigne
#else
# undef HAVE_MUL64_OVERFLOW
#endif
+
+//
+// Signed overflow math
+//
+// In C++, signed overflow math is Undefined Behavior. However, many CPUs do implement some way to
+// check for overflow. Some compilers expose intrinsics to use this functionality. If the no
+// intrinsic is exposed, overflow checking can be done by widening the result type and "manually"
+// checking for overflow. Or, alternatively, by using inline assembly to use the CPU features.
+//
+// Only int overflow checking is implemented, because it's the only one used.
+#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || QT_HAS_BUILTIN(__builtin_sadd_overflow)
+inline bool add_overflow(int v1, int v2, int *r)
+{ return __builtin_sadd_overflow(v1, v2, r); }
+#elif defined(Q_CC_GNU) && defined(Q_PROCESSOR_X86)
+inline bool add_overflow(int v1, int v2, int *r)
+{
+ quint8 overflow = 0;
+ int res = v1;
+
+ asm ("addl %2, %1\n"
+ "seto %0"
+ : "=q" (overflow), "=r" (res)
+ : "r" (v2), "1" (res)
+ : "cc"
+ );
+ *r = res;
+ return overflow;
+}
+#else
+inline bool add_overflow(int v1, int v2, int *r)
+{
+ qint64 t = qint64(v1) + v2;
+ *r = static_cast<int>(t);
+ return t > std::numeric_limits<int>::max() || t < std::numeric_limits<int>::min();
+}
+#endif
+
+#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || QT_HAS_BUILTIN(__builtin_ssub_overflow)
+inline bool sub_overflow(int v1, int v2, int *r)
+{ return __builtin_ssub_overflow(v1, v2, r); }
+#elif defined(Q_CC_GNU) && defined(Q_PROCESSOR_X86)
+inline bool sub_overflow(int v1, int v2, int *r)
+{
+ quint8 overflow = 0;
+ int res = v1;
+
+ asm ("subl %2, %1\n"
+ "seto %0"
+ : "=q" (overflow), "=r" (res)
+ : "r" (v2), "1" (res)
+ : "cc"
+ );
+ *r = res;
+ return overflow;
+}
+#else
+inline bool sub_overflow(int v1, int v2, int *r)
+{
+ qint64 t = qint64(v1) - v2;
+ *r = static_cast<int>(t);
+ return t > std::numeric_limits<int>::max() || t < std::numeric_limits<int>::min();
+}
+#endif
+
+#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || QT_HAS_BUILTIN(__builtin_smul_overflow)
+inline bool mul_overflow(int v1, int v2, int *r)
+{ return __builtin_smul_overflow(v1, v2, r); }
+#elif defined(Q_CC_GNU) && defined(Q_PROCESSOR_X86)
+inline bool mul_overflow(int v1, int v2, int *r)
+{
+ quint8 overflow = 0;
+ int res = v1;
+
+ asm ("imul %2, %1\n"
+ "seto %0"
+ : "=q" (overflow), "=r" (res)
+ : "r" (v2), "1" (res)
+ : "cc"
+ );
+ *r = res;
+ return overflow;
+}
+#else
+inline bool mul_overflow(int v1, int v2, int *r)
+{
+ qint64 t = qint64(v1) * v2;
+ *r = static_cast<int>(t);
+ return t > std::numeric_limits<int>::max() || t < std::numeric_limits<int>::min();
+}
+#endif
+
}
QT_END_NAMESPACE
diff --git a/src/corelib/global/qprocessordetection.h b/src/corelib/global/qprocessordetection.h
index 4b75872bb6..f8c168e074 100644
--- a/src/corelib/global/qprocessordetection.h
+++ b/src/corelib/global/qprocessordetection.h
@@ -95,7 +95,9 @@
# else
# define Q_PROCESSOR_ARM_32
# endif
-# if defined(__ARM64_ARCH_8__)
+# if defined(__ARM64_ARCH_8__) \
+ || defined(__ARM_ARCH_8A) \
+ || (defined(__ARM_ARCH) && __ARM_ARCH == 8)
# define Q_PROCESSOR_ARM_V8
# define Q_PROCESSOR_ARM_V7
# define Q_PROCESSOR_ARM_V6
@@ -107,7 +109,8 @@
|| defined(__ARM_ARCH_7S__) \
|| defined(_ARM_ARCH_7) \
|| (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 7) \
- || (defined(_M_ARM) && _M_ARM-0 >= 7)
+ || (defined(_M_ARM) && _M_ARM-0 >= 7) \
+ || (defined(__ARMv7__))
# define Q_PROCESSOR_ARM_V7
# define Q_PROCESSOR_ARM_V6
# define Q_PROCESSOR_ARM_V5
@@ -176,11 +179,11 @@
# if defined(_M_IX86)
# define Q_PROCESSOR_X86 (_M_IX86/100)
-# elif defined(__i686__) || defined(__athlon__) || defined(__SSE__)
+# elif defined(__i686__) || defined(__athlon__) || defined(__SSE__) || defined(__pentiumpro__)
# define Q_PROCESSOR_X86 6
-# elif defined(__i586__) || defined(__k6__)
+# elif defined(__i586__) || defined(__k6__) || defined(__pentium__)
# define Q_PROCESSOR_X86 5
-# elif defined(__i486__)
+# elif defined(__i486__) || defined(__80486__)
# define Q_PROCESSOR_X86 4
# else
# define Q_PROCESSOR_X86 3
diff --git a/src/corelib/global/qsystemdetection.h b/src/corelib/global/qsystemdetection.h
index 751c6a9a0e..8a0a4a0a8a 100644
--- a/src/corelib/global/qsystemdetection.h
+++ b/src/corelib/global/qsystemdetection.h
@@ -41,10 +41,11 @@
/*
The operating system, must be one of: (Q_OS_x)
- DARWIN - Any Darwin system
- MAC - OS X and iOS
+ DARWIN - Any Darwin system (OS X, iOS, watchOS, tvOS)
OSX - OS X
IOS - iOS
+ WATCHOS - watchOS
+ TVOS - tvOS
MSDOS - MS-DOS and Windows
OS2 - OS/2
OS2EMX - XFree86 on OS/2 (not PM)
@@ -80,19 +81,37 @@
The following operating systems have variants:
LINUX - both Q_OS_LINUX and Q_OS_ANDROID are defined when building for Android
- only Q_OS_LINUX is defined if building for other Linux systems
- QNX - both Q_OS_QNX and Q_OS_BLACKBERRY are defined when building for Blackberry 10
- - only Q_OS_QNX is defined if building for other QNX targets
FREEBSD - Q_OS_FREEBSD is defined only when building for FreeBSD with a BSD userland
- Q_OS_FREEBSD_KERNEL is always defined on FreeBSD, even if the userland is from GNU
*/
#if defined(__APPLE__) && (defined(__GNUC__) || defined(__xlC__) || defined(__xlc__))
-# define Q_OS_DARWIN
-# define Q_OS_BSD4
-# ifdef __LP64__
-# define Q_OS_DARWIN64
+# include <TargetConditionals.h>
+# if defined(TARGET_OS_MAC) && TARGET_OS_MAC
+# define Q_OS_DARWIN
+# define Q_OS_BSD4
+# ifdef __LP64__
+# define Q_OS_DARWIN64
+# else
+# define Q_OS_DARWIN32
+# endif
+# if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
+# if defined(TARGET_OS_TV) && TARGET_OS_TV
+# define Q_OS_TVOS
+# elif defined(TARGET_OS_WATCH) && TARGET_OS_WATCH
+# define Q_OS_WATCHOS
+# else
+# // TARGET_OS_IOS is only available in newer SDKs,
+# // so assume any other iOS-based platform is iOS for now
+# define Q_OS_IOS
+# endif
+# else
+# // there is no "real" OS X define (rdar://22640089),
+# // assume any non iOS-based platform is OS X for now
+# define Q_OS_OSX
+# endif
# else
-# define Q_OS_DARWIN32
+# error "Qt has not been ported to this Apple platform - see http://www.qt.io/developers"
# endif
#elif defined(__ANDROID__) || defined(ANDROID)
# define Q_OS_ANDROID
@@ -181,28 +200,26 @@
# define Q_OS_WIN
#endif
-#if defined(Q_OS_DARWIN)
-# define Q_OS_MAC
-# if defined(Q_OS_DARWIN64)
-# define Q_OS_MAC64
-# elif defined(Q_OS_DARWIN32)
-# define Q_OS_MAC32
-# endif
-# include <TargetConditionals.h>
-# if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
-# define Q_OS_IOS
-# elif defined(TARGET_OS_MAC) && TARGET_OS_MAC
-# define Q_OS_OSX
-# define Q_OS_MACX // compatibility synonym
-# endif
-#endif
-
#if defined(Q_OS_WIN)
# undef Q_OS_UNIX
#elif !defined(Q_OS_UNIX)
# define Q_OS_UNIX
#endif
+// Compatibility synonyms
+#ifdef Q_OS_DARWIN
+#define Q_OS_MAC
+#endif
+#ifdef Q_OS_DARWIN32
+#define Q_OS_MAC32
+#endif
+#ifdef Q_OS_DARWIN64
+#define Q_OS_MAC64
+#endif
+#ifdef Q_OS_OSX
+#define Q_OS_MACX
+#endif
+
#ifdef Q_OS_DARWIN
# include <Availability.h>
# include <AvailabilityMacros.h>
diff --git a/src/corelib/global/qtypeinfo.h b/src/corelib/global/qtypeinfo.h
index b42e5998fc..cd0a83ae80 100644
--- a/src/corelib/global/qtypeinfo.h
+++ b/src/corelib/global/qtypeinfo.h
@@ -276,13 +276,25 @@ Q_DECLARE_TYPEINFO(double, Q_PRIMITIVE_TYPE);
Q_DECLARE_TYPEINFO(long double, Q_PRIMITIVE_TYPE);
#endif
+
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
-// We can't do it now because it would break BC on QList<char32_t>
+// ### Qt 6: remove the other branch
+// This was required so that QList<T> for these types allocates out of the array storage
+# ifdef Q_COMPILER_UNICODE_STRINGS
Q_DECLARE_TYPEINFO(char16_t, Q_PRIMITIVE_TYPE);
Q_DECLARE_TYPEINFO(char32_t, Q_PRIMITIVE_TYPE);
+# endif
# if !defined(Q_CC_MSVC) || defined(_NATIVE_WCHAR_T_DEFINED)
Q_DECLARE_TYPEINFO(wchar_t, Q_PRIMITIVE_TYPE);
# endif
+#else
+# ifdef Q_COMPILER_UNICODE_STRINGS
+Q_DECLARE_TYPEINFO(char16_t, Q_RELOCATABLE_TYPE);
+Q_DECLARE_TYPEINFO(char32_t, Q_RELOCATABLE_TYPE);
+# endif
+# if !defined(Q_CC_MSVC) || defined(_NATIVE_WCHAR_T_DEFINED)
+Q_DECLARE_TYPEINFO(wchar_t, Q_RELOCATABLE_TYPE);
+# endif
#endif // Qt 6
QT_END_NAMESPACE
diff --git a/src/corelib/io/io.pri b/src/corelib/io/io.pri
index b2bcbdf727..218fb5b078 100644
--- a/src/corelib/io/io.pri
+++ b/src/corelib/io/io.pri
@@ -149,25 +149,15 @@ win32 {
}
freebsd: LIBS_PRIVATE += -lutil # qlockfile_unix.cpp requires this
mac {
+ SOURCES += io/qstorageinfo_mac.cpp
+ OBJECTIVE_SOURCES += io/qstandardpaths_mac.mm
osx {
OBJECTIVE_SOURCES += io/qfilesystemwatcher_fsevents.mm
HEADERS += io/qfilesystemwatcher_fsevents_p.h
- }
- macx {
- SOURCES += io/qstorageinfo_mac.cpp
- OBJECTIVE_SOURCES += io/qstandardpaths_mac.mm
LIBS += -framework DiskArbitration -framework IOKit
} else:ios {
- OBJECTIVE_SOURCES += io/qstandardpaths_ios.mm
- SOURCES += io/qstorageinfo_mac.cpp
LIBS += -framework MobileCoreServices
- } else {
- SOURCES += io/qstandardpaths_unix.cpp
}
- } else:blackberry {
- SOURCES += \
- io/qstandardpaths_blackberry.cpp \
- io/qstorageinfo_unix.cpp
} else:android:!android-no-sdk {
SOURCES += \
io/qstandardpaths_android.cpp \
diff --git a/src/corelib/io/qdatastream.cpp b/src/corelib/io/qdatastream.cpp
index 675178ea80..c32df4c8a6 100644
--- a/src/corelib/io/qdatastream.cpp
+++ b/src/corelib/io/qdatastream.cpp
@@ -527,6 +527,7 @@ void QDataStream::setByteOrder(ByteOrder bo)
\value Qt_5_4 Version 16 (Qt 5.4)
\value Qt_5_5 Same as Qt_5_4
\value Qt_5_6 Version 17 (Qt 5.6)
+ \value Qt_5_7 Same as Qt_5_6
\omitvalue Qt_DefaultCompiledVersion
\sa setVersion(), version()
diff --git a/src/corelib/io/qdatastream.h b/src/corelib/io/qdatastream.h
index 5730c12907..744829c659 100644
--- a/src/corelib/io/qdatastream.h
+++ b/src/corelib/io/qdatastream.h
@@ -84,10 +84,11 @@ public:
Qt_5_4 = 16,
Qt_5_5 = Qt_5_4,
Qt_5_6 = 17,
-#if QT_VERSION >= 0x050700
+ Qt_5_7 = Qt_5_6,
+#if QT_VERSION >= 0x050800
#error Add the datastream version for this Qt version and update Qt_DefaultCompiledVersion
#endif
- Qt_DefaultCompiledVersion = Qt_5_6
+ Qt_DefaultCompiledVersion = Qt_5_7
};
enum ByteOrder {
diff --git a/src/corelib/io/qdebug.cpp b/src/corelib/io/qdebug.cpp
index 81af96b96b..4f85ceb084 100644
--- a/src/corelib/io/qdebug.cpp
+++ b/src/corelib/io/qdebug.cpp
@@ -704,6 +704,15 @@ QDebug &QDebug::resetFormat()
*/
/*!
+ \fn QDebug operator<<(QDebug stream, const std::list<T, Alloc> &list)
+ \relates QDebug
+ \since 5.7
+
+ Writes the contents of \a list to \a stream. \c T needs to
+ support streaming into QDebug.
+*/
+
+/*!
\fn QDebug operator<<(QDebug stream, const QVector<T> &vector)
\relates QDebug
@@ -712,6 +721,15 @@ QDebug &QDebug::resetFormat()
*/
/*!
+ \fn QDebug operator<<(QDebug stream, const std::vector<T, Alloc> &vector)
+ \relates QDebug
+ \since 5.7
+
+ Writes the contents of \a vector to \a stream. \c T needs to
+ support streaming into QDebug.
+*/
+
+/*!
\fn QDebug operator<<(QDebug stream, const QSet<T> &set)
\relates QDebug
@@ -728,6 +746,24 @@ QDebug &QDebug::resetFormat()
*/
/*!
+ \fn QDebug operator<<(QDebug stream, const std::map<Key, T, Compare, Alloc> &map)
+ \relates QDebug
+ \since 5.7
+
+ Writes the contents of \a map to \a stream. Both \c Key and
+ \c T need to support streaming into QDebug.
+*/
+
+/*!
+ \fn QDebug operator<<(QDebug stream, const std::multimap<Key, T, Compare, Alloc> &map)
+ \relates QDebug
+ \since 5.7
+
+ Writes the contents of \a map to \a stream. Both \c Key and
+ \c T need to support streaming into QDebug.
+*/
+
+/*!
\fn QDebug operator<<(QDebug stream, const QHash<Key, T> &hash)
\relates QDebug
@@ -831,6 +867,19 @@ QDebugStateSaver::~QDebugStateSaver()
d->restoreState();
}
+/*!
+ \internal
+
+ Specialization of the primary template in qdebug.h to out-of-line
+ the common case of QFlags<T>::Int being int.
+
+ Just call the generic version so the two don't get out of sync.
+*/
+void qt_QMetaEnum_flagDebugOperator(QDebug &debug, size_t sizeofT, int value)
+{
+ qt_QMetaEnum_flagDebugOperator<int>(debug, sizeofT, value);
+}
+
#ifndef QT_NO_QOBJECT
/*!
\internal
diff --git a/src/corelib/io/qdebug.h b/src/corelib/io/qdebug.h
index b1a0396f35..858231e118 100644
--- a/src/corelib/io/qdebug.h
+++ b/src/corelib/io/qdebug.h
@@ -45,6 +45,12 @@
#include <QtCore/qset.h>
#include <QtCore/qcontiguouscache.h>
+// all these have already been included by various headers above, but don't rely on indirect includes:
+#include <vector>
+#include <list>
+#include <map>
+#include <utility>
+
QT_BEGIN_NAMESPACE
@@ -192,28 +198,63 @@ inline QDebug &QDebug::operator=(const QDebug &other)
return *this;
}
-template <class T>
-inline QDebug operator<<(QDebug debug, const QList<T> &list)
+namespace QtPrivate {
+
+template <typename SequentialContainer>
+inline QDebug printSequentialContainer(QDebug debug, const char *which, const SequentialContainer &c)
{
const bool oldSetting = debug.autoInsertSpaces();
- debug.nospace() << '(';
- for (typename QList<T>::size_type i = 0; i < list.count(); ++i) {
- if (i)
- debug << ", ";
- debug << list.at(i);
+ debug.nospace() << which << '(';
+ typename SequentialContainer::const_iterator it = c.begin(), end = c.end();
+ if (it != end) {
+ debug << *it;
+ ++it;
+ }
+ while (it != end) {
+ debug << ", " << *it;
+ ++it;
}
debug << ')';
debug.setAutoInsertSpaces(oldSetting);
return debug.maybeSpace();
}
+} // namespace QtPrivate
+
+template <class T>
+inline QDebug operator<<(QDebug debug, const QList<T> &list)
+{
+ return QtPrivate::printSequentialContainer(debug, "" /*for historical reasons*/, list);
+}
+
template <typename T>
inline QDebug operator<<(QDebug debug, const QVector<T> &vec)
{
- const bool oldSetting = debug.autoInsertSpaces();
- debug.nospace() << "QVector";
- debug.setAutoInsertSpaces(oldSetting);
- return operator<<(debug, vec.toList());
+ return QtPrivate::printSequentialContainer(debug, "QVector", vec);
+}
+
+template <typename T, typename Alloc>
+inline QDebug operator<<(QDebug debug, const std::vector<T, Alloc> &vec)
+{
+ return QtPrivate::printSequentialContainer(debug, "std::vector", vec);
+}
+
+template <typename T, typename Alloc>
+inline QDebug operator<<(QDebug debug, const std::list<T, Alloc> &vec)
+{
+ return QtPrivate::printSequentialContainer(debug, "std::list", vec);
+}
+
+template <typename Key, typename T, typename Compare, typename Alloc>
+inline QDebug operator<<(QDebug debug, const std::map<Key, T, Compare, Alloc> &map)
+{
+ return QtPrivate::printSequentialContainer(debug, "std::map", map); // yes, sequential: *it is std::pair
+}
+
+template <typename Key, typename T, typename Compare, typename Alloc>
+inline QDebug operator<<(QDebug debug, const std::multimap<Key, T, Compare, Alloc> &map)
+{
+ return QtPrivate::printSequentialContainer(debug, "std::multimap", map); // yes, sequential: *it is std::pair
}
template <class Key, class T>
@@ -252,13 +293,19 @@ inline QDebug operator<<(QDebug debug, const QPair<T1, T2> &pair)
return debug.maybeSpace();
}
-template <typename T>
-inline QDebug operator<<(QDebug debug, const QSet<T> &set)
+template <class T1, class T2>
+inline QDebug operator<<(QDebug debug, const std::pair<T1, T2> &pair)
{
const bool oldSetting = debug.autoInsertSpaces();
- debug.nospace() << "QSet";
+ debug.nospace() << "std::pair(" << pair.first << ',' << pair.second << ')';
debug.setAutoInsertSpaces(oldSetting);
- return operator<<(debug, set.toList());
+ return debug.maybeSpace();
+}
+
+template <typename T>
+inline QDebug operator<<(QDebug debug, const QSet<T> &set)
+{
+ return QtPrivate::printSequentialContainer(debug, "QSet", set);
}
template <class T>
@@ -276,6 +323,27 @@ inline QDebug operator<<(QDebug debug, const QContiguousCache<T> &cache)
return debug.maybeSpace();
}
+Q_CORE_EXPORT void qt_QMetaEnum_flagDebugOperator(QDebug &debug, size_t sizeofT, int value);
+
+template <typename Int>
+void qt_QMetaEnum_flagDebugOperator(QDebug &debug, size_t sizeofT, Int value)
+{
+ const QDebugStateSaver saver(debug);
+ debug.resetFormat();
+ debug.nospace() << "QFlags(" << hex << showbase;
+ bool needSeparator = false;
+ for (uint i = 0; i < sizeofT * 8; ++i) {
+ if (value & (Int(1) << i)) {
+ if (needSeparator)
+ debug << '|';
+ else
+ needSeparator = true;
+ debug << (Int(1) << i);
+ }
+ }
+ debug << ')';
+}
+
#if !defined(QT_NO_QOBJECT) && !defined(Q_QDOC)
Q_CORE_EXPORT QDebug qt_QMetaEnum_debugOperator(QDebug&, int value, const QMetaObject *meta, const char *name);
Q_CORE_EXPORT QDebug qt_QMetaEnum_flagDebugOperator(QDebug &dbg, quint64 value, const QMetaObject *meta, const char *name);
@@ -310,20 +378,7 @@ template <class T>
inline QDebug qt_QMetaEnum_flagDebugOperator_helper(QDebug debug, const QFlags<T> &flags)
#endif
{
- QDebugStateSaver saver(debug);
- debug.resetFormat();
- debug.nospace() << "QFlags(" << hex << showbase;
- bool needSeparator = false;
- for (uint i = 0; i < sizeof(T) * 8; ++i) {
- if (flags.testFlag(T(1 << i))) {
- if (needSeparator)
- debug << '|';
- else
- needSeparator = true;
- debug << (typename QFlags<T>::Int(1) << i);
- }
- }
- debug << ')';
+ qt_QMetaEnum_flagDebugOperator(debug, sizeof(T), typename QFlags<T>::Int(flags));
return debug;
}
diff --git a/src/corelib/io/qfile.cpp b/src/corelib/io/qfile.cpp
index ce1684a943..2f3525bbdb 100644
--- a/src/corelib/io/qfile.cpp
+++ b/src/corelib/io/qfile.cpp
@@ -232,7 +232,7 @@ QFile::QFile(QFilePrivate &dd)
}
#else
/*!
- \internal
+ Constructs a QFile object.
*/
QFile::QFile()
: QFileDevice(*new QFilePrivate, 0)
diff --git a/src/corelib/io/qfileselector.cpp b/src/corelib/io/qfileselector.cpp
index 85d9b0bfcb..32b98e32d8 100644
--- a/src/corelib/io/qfileselector.cpp
+++ b/src/corelib/io/qfileselector.cpp
@@ -92,8 +92,6 @@ QFileSelectorPrivate::QFileSelectorPrivate()
QString defaultsPath = "data/defaults.conf";
#if defined(Q_OS_ANDROID)
defaultsPath = "data/android/defaults.conf";
-#elif defined(Q_OS_BLACKBERRY)
- defaultsPath = "data/blackberry/defaults.conf";
#elif defined(Q_OS_IOS)
defaultsPath = "data/ios/defaults.conf";
#endif
@@ -116,7 +114,6 @@ QFileSelectorPrivate::QFileSelectorPrivate()
\code
data/defaults.conf
data/+android/defaults.conf
- data/+blackberry/defaults.conf
data/+ios/+en_GB/defaults.conf
\endcode
@@ -127,9 +124,8 @@ QFileSelectorPrivate::QFileSelectorPrivate()
\code
images/background.png
images/+android/+en_GB/background.png
- images/+blackberry/+en_GB/background.png
\endcode
- With those files available, you would select a different file on android and blackberry platforms,
+ With those files available, you would select a different file on the android platform,
but only if the locale was en_GB.
QFileSelector will not attempt to select if the base file does not exist. For error handling in
@@ -145,8 +141,8 @@ QFileSelectorPrivate::QFileSelectorPrivate()
Selectors normally available are
\list
\li platform, any of the following strings which match the platform the application is running
- on (list not exhaustive): android, blackberry, ios, osx, darwin, mac, linux, wince, unix,
- windows. On Linux, if it can be determined, the name of the distribution too, like debian,
+ on (list not exhaustive): android, ios, osx, darwin, mac, linux, wince, unix, windows.
+ On Linux, if it can be determined, the name of the distribution too, like debian,
fedora or opensuse.
\li locale, same as QLocale().name().
\endlist
@@ -368,8 +364,8 @@ QStringList QFileSelectorPrivate::platformSelectors()
# endif
#elif defined(Q_OS_UNIX)
ret << QStringLiteral("unix");
-# if !defined(Q_OS_ANDROID) && !defined(Q_OS_BLACKBERRY)
- // we don't want "linux" for Android or "qnx" for Blackberry here
+# if !defined(Q_OS_ANDROID)
+ // we don't want "linux" for Android
ret << QSysInfo::kernelType();
# ifdef Q_OS_MAC
ret << QStringLiteral("mac"); // compatibility, since kernelType() is "darwin"
@@ -377,7 +373,7 @@ QStringList QFileSelectorPrivate::platformSelectors()
# endif
QString productName = QSysInfo::productType();
if (productName != QLatin1String("unknown"))
- ret << productName; // "opensuse", "fedora", "osx", "ios", "blackberry", "android"
+ ret << productName; // "opensuse", "fedora", "osx", "ios", "android"
#endif
return ret;
}
diff --git a/src/corelib/io/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp
index 7bc2293b0d..8f6d9911e8 100644
--- a/src/corelib/io/qfilesystemengine_unix.cpp
+++ b/src/corelib/io/qfilesystemengine_unix.cpp
@@ -345,17 +345,17 @@ QString QFileSystemEngine::resolveUserName(uint userId)
QVarLengthArray<char, 1024> buf(size_max);
#endif
- struct passwd *pw = 0;
#if !defined(Q_OS_INTEGRITY)
+ struct passwd *pw = 0;
#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_OPENBSD) && !defined(Q_OS_VXWORKS)
struct passwd entry;
getpwuid_r(userId, &entry, buf.data(), buf.size(), &pw);
#else
pw = getpwuid(userId);
#endif
-#endif
if (pw)
return QFile::decodeName(QByteArray(pw->pw_name));
+#endif
return QString();
}
@@ -369,8 +369,8 @@ QString QFileSystemEngine::resolveGroupName(uint groupId)
QVarLengthArray<char, 1024> buf(size_max);
#endif
- struct group *gr = 0;
#if !defined(Q_OS_INTEGRITY)
+ struct group *gr = 0;
#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_OPENBSD) && !defined(Q_OS_VXWORKS)
size_max = sysconf(_SC_GETGR_R_SIZE_MAX);
if (size_max == -1)
@@ -390,9 +390,9 @@ QString QFileSystemEngine::resolveGroupName(uint groupId)
#else
gr = getgrgid(groupId);
#endif
-#endif
if (gr)
return QFile::decodeName(QByteArray(gr->gr_name));
+#endif
return QString();
}
@@ -694,16 +694,6 @@ QString QFileSystemEngine::tempPath()
{
#ifdef QT_UNIX_TEMP_PATH_OVERRIDE
return QLatin1String(QT_UNIX_TEMP_PATH_OVERRIDE);
-#elif defined(Q_OS_BLACKBERRY)
- QString temp = QFile::decodeName(qgetenv("TEMP"));
- if (temp.isEmpty())
- temp = QFile::decodeName(qgetenv("TMPDIR"));
-
- if (temp.isEmpty()) {
- qWarning("Neither the TEMP nor the TMPDIR environment variable is set, falling back to /var/tmp.");
- temp = QLatin1String("/var/tmp");
- }
- return QDir::cleanPath(temp);
#else
QString temp = QFile::decodeName(qgetenv("TMPDIR"));
if (temp.isEmpty())
diff --git a/src/corelib/io/qfilesystementry.cpp b/src/corelib/io/qfilesystementry.cpp
index 709970e3ac..2dc534d356 100644
--- a/src/corelib/io/qfilesystementry.cpp
+++ b/src/corelib/io/qfilesystementry.cpp
@@ -372,7 +372,7 @@ bool QFileSystemEntry::isClean() const
int dots = 0;
bool dotok = true; // checking for ".." or "." starts to relative paths
bool slashok = true;
- for (QString::const_iterator iter = m_filePath.constBegin(); iter != m_filePath.constEnd(); iter++) {
+ for (QString::const_iterator iter = m_filePath.constBegin(); iter != m_filePath.constEnd(); ++iter) {
if (*iter == QLatin1Char('/')) {
if (dots == 1 || dots == 2)
return false; // path contains "./" or "../"
diff --git a/src/corelib/io/qfilesystemwatcher_inotify.cpp b/src/corelib/io/qfilesystemwatcher_inotify.cpp
index 8bc06cfcbe..5e9e19aab1 100644
--- a/src/corelib/io/qfilesystemwatcher_inotify.cpp
+++ b/src/corelib/io/qfilesystemwatcher_inotify.cpp
@@ -37,6 +37,7 @@
#ifndef QT_NO_FILESYSTEMWATCHER
#include "private/qcore_unix_p.h"
+#include "private/qsystemerror_p.h"
#include <qdebug.h>
#include <qfile.h>
@@ -287,7 +288,7 @@ QStringList QInotifyFileSystemWatcherEngine::addPaths(const QStringList &paths,
| IN_DELETE_SELF
)));
if (wd < 0) {
- perror("QInotifyFileSystemWatcherEngine::addPaths: inotify_add_watch failed");
+ qWarning().nospace() << "inotify_add_watch(" << path << ") failed: " << QSystemError(errno, QSystemError::NativeError).toString();
continue;
}
diff --git a/src/corelib/io/qiodevice.cpp b/src/corelib/io/qiodevice.cpp
index 3c7a7d69e4..64078b5c54 100644
--- a/src/corelib/io/qiodevice.cpp
+++ b/src/corelib/io/qiodevice.cpp
@@ -670,7 +670,7 @@ bool QIODevice::seek(qint64 pos)
// operation will then refill the buffer. We can optimize this, if we
// find that seeking backwards becomes a significant performance hit.
d->buffer.clear();
- else if (!d->buffer.isEmpty())
+ else
d->buffer.skip(offset);
#if defined QIODEVICE_DEBUG
diff --git a/src/corelib/io/qlockfile_unix.cpp b/src/corelib/io/qlockfile_unix.cpp
index 365f3e07ab..ae776d4137 100644
--- a/src/corelib/io/qlockfile_unix.cpp
+++ b/src/corelib/io/qlockfile_unix.cpp
@@ -44,7 +44,10 @@
#include "private/qabstractfileengine_p.h"
#include "private/qtemporaryfile_p.h"
+#if !defined(Q_OS_INTEGRITY)
#include <sys/file.h> // flock
+#endif
+
#include <sys/types.h> // kill
#include <signal.h> // kill
#include <unistd.h> // gethostname
@@ -54,6 +57,8 @@
#elif defined(Q_OS_LINUX)
# include <unistd.h>
# include <cstdio>
+#elif defined(Q_OS_HAIKU)
+# include <kernel/OS.h>
#elif defined(Q_OS_BSD4) && !defined(Q_OS_IOS)
# include <sys/user.h>
# if defined(__GLIBC__) && defined(__FreeBSD_kernel__)
@@ -248,6 +253,11 @@ QString QLockFilePrivate::processNameByPid(qint64 pid)
}
buf[len] = 0;
return QFileInfo(QFile::decodeName(buf)).fileName();
+#elif defined(Q_OS_HAIKU)
+ thread_info info;
+ if (get_thread_info(pid, &info) != B_OK)
+ return QString();
+ return QFile::decodeName(info.name);
#elif defined(Q_OS_BSD4) && !defined(Q_OS_IOS)
# if defined(__GLIBC__) && defined(__FreeBSD_kernel__)
int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, pid };
diff --git a/src/corelib/io/qprocess.cpp b/src/corelib/io/qprocess.cpp
index 952116b9db..315142aabe 100644
--- a/src/corelib/io/qprocess.cpp
+++ b/src/corelib/io/qprocess.cpp
@@ -744,6 +744,47 @@ void QProcessPrivate::Channel::clear()
*/
/*!
+ \typedef QProcess::CreateProcessArgumentModifier
+ \note This typedef is only available on desktop Windows and Windows CE.
+
+ On Windows, QProcess uses the Win32 API function \c CreateProcess to
+ start child processes. While QProcess provides a comfortable way to start
+ processes without worrying about platform
+ details, it is in some cases desirable to fine-tune the parameters that are
+ passed to \c CreateProcess. This is done by defining a
+ \c CreateProcessArgumentModifier function and passing it to
+ \c setCreateProcessArgumentsModifier.
+
+ A \c CreateProcessArgumentModifier function takes one parameter: a pointer
+ to a \c CreateProcessArguments struct. The members of this struct will be
+ passed to \c CreateProcess after the \c CreateProcessArgumentModifier
+ function is called.
+
+ The following example demonstrates how to pass custom flags to
+ \c CreateProcess.
+ When starting a console process B from a console process A, QProcess will
+ reuse the console window of process A for process B by default. In this
+ example, a new console window with a custom color scheme is created for the
+ child process B instead.
+
+ \snippet qprocess/qprocess-createprocessargumentsmodifier.cpp 0
+
+ \sa QProcess::CreateProcessArguments
+ \sa setCreateProcessArgumentsModifier()
+*/
+
+/*!
+ \class QProcess::CreateProcessArguments
+ \note This struct is only available on the Windows platform.
+
+ This struct is a representation of all parameters of the Windows API
+ function \c CreateProcess. It is used as parameter for
+ \c CreateProcessArgumentModifier functions.
+
+ \sa QProcess::CreateProcessArgumentModifier
+*/
+
+/*!
\fn void QProcess::error(QProcess::ProcessError error)
\obsolete
@@ -1563,6 +1604,39 @@ void QProcess::setNativeArguments(const QString &arguments)
d->nativeArguments = arguments;
}
+/*!
+ \since 5.7
+
+ Returns a previously set \c CreateProcess modifier function.
+
+ \note This function is available only on the Windows platform.
+
+ \sa setCreateProcessArgumentsModifier()
+ \sa QProcess::CreateProcessArgumentModifier
+*/
+QProcess::CreateProcessArgumentModifier QProcess::createProcessArgumentsModifier() const
+{
+ Q_D(const QProcess);
+ return d->modifyCreateProcessArgs;
+}
+
+/*!
+ \since 5.7
+
+ Sets the \a modifier for the \c CreateProcess Win32 API call.
+ Pass \c QProcess::CreateProcessArgumentModifier() to remove a previously set one.
+
+ \note This function is available only on the Windows platform and requires
+ C++11.
+
+ \sa QProcess::CreateProcessArgumentModifier
+*/
+void QProcess::setCreateProcessArgumentsModifier(CreateProcessArgumentModifier modifier)
+{
+ Q_D(QProcess);
+ d->modifyCreateProcessArgs = modifier;
+}
+
#endif
/*!
diff --git a/src/corelib/io/qprocess.h b/src/corelib/io/qprocess.h
index f95358250e..52e0316857 100644
--- a/src/corelib/io/qprocess.h
+++ b/src/corelib/io/qprocess.h
@@ -38,6 +38,8 @@
#include <QtCore/qstringlist.h>
#include <QtCore/qshareddata.h>
+#include <functional>
+
QT_BEGIN_NAMESPACE
@@ -48,6 +50,8 @@ typedef qint64 Q_PID;
#else
QT_END_NAMESPACE
typedef struct _PROCESS_INFORMATION *Q_PID;
+typedef struct _SECURITY_ATTRIBUTES Q_SECURITY_ATTRIBUTES;
+typedef struct _STARTUPINFOW Q_STARTUPINFO;
QT_BEGIN_NAMESPACE
#endif
@@ -180,7 +184,23 @@ public:
#if defined(Q_OS_WIN)
QString nativeArguments() const;
void setNativeArguments(const QString &arguments);
-#endif
+ struct CreateProcessArguments
+ {
+ const wchar_t *applicationName;
+ wchar_t *arguments;
+ Q_SECURITY_ATTRIBUTES *processAttributes;
+ Q_SECURITY_ATTRIBUTES *threadAttributes;
+ bool inheritHandles;
+ unsigned long flags;
+ void *environment;
+ const wchar_t *currentDirectory;
+ Q_STARTUPINFO *startupInfo;
+ Q_PID processInformation;
+ };
+ typedef std::function<void(CreateProcessArguments *)> CreateProcessArgumentModifier;
+ CreateProcessArgumentModifier createProcessArgumentsModifier() const;
+ void setCreateProcessArgumentsModifier(CreateProcessArgumentModifier modifier);
+#endif // Q_OS_WIN
QString workingDirectory() const;
void setWorkingDirectory(const QString &dir);
diff --git a/src/corelib/io/qprocess_p.h b/src/corelib/io/qprocess_p.h
index d3f251c399..227a583718 100644
--- a/src/corelib/io/qprocess_p.h
+++ b/src/corelib/io/qprocess_p.h
@@ -329,6 +329,7 @@ public:
QStringList arguments;
#if defined(Q_OS_WIN)
QString nativeArguments;
+ QProcess::CreateProcessArgumentModifier modifyCreateProcessArgs;
#endif
QProcessEnvironment environment;
@@ -385,11 +386,6 @@ public:
void cleanup();
void setError(QProcess::ProcessError error, const QString &description = QString());
void setErrorAndEmit(QProcess::ProcessError error, const QString &description = QString());
-
-#ifdef Q_OS_BLACKBERRY
- QList<QSocketNotifier *> defaultNotifiers() const;
-#endif // Q_OS_BLACKBERRY
-
};
QT_END_NAMESPACE
diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp
index 8eb5ac9564..ab5734a298 100644
--- a/src/corelib/io/qprocess_unix.cpp
+++ b/src/corelib/io/qprocess_unix.cpp
@@ -564,7 +564,7 @@ static int doSpawn(pid_t *ppid, const posix_spawn_file_actions_t *file_actions,
qWarning("ThreadCtl(): failed to chdir to %s", oldWorkingDir);
# ifdef Q_OS_QNX
- if (ThreadCtl(_NTO_TCTL_THREADS_CONT, 0) == -1)
+ if (Q_UNLIKELY(ThreadCtl(_NTO_TCTL_THREADS_CONT, 0) == -1))
qFatal("ThreadCtl(): cannot resume threads: %s", qPrintable(qt_error_string(errno)));
# endif
}
@@ -676,6 +676,7 @@ void QProcessPrivate::execChild(const char *workingDir, char **path, char **argv
qt_safe_close(childStartedPipe[0]);
// enter the working directory
+ const char *callthatfailed = "chdir: ";
if (workingDir && QT_CHDIR(workingDir) == -1) {
// failed, stop the process
goto report_errno;
@@ -687,6 +688,7 @@ void QProcessPrivate::execChild(const char *workingDir, char **path, char **argv
// execute the process
if (!envp) {
qt_safe_execvp(argv[0], argv);
+ callthatfailed = "execvp: ";
} else {
if (path) {
char **arg = path;
@@ -704,15 +706,19 @@ void QProcessPrivate::execChild(const char *workingDir, char **path, char **argv
#endif
qt_safe_execve(argv[0], argv, envp);
}
+ callthatfailed = "execve: ";
}
// notify failure
+ // we're running in the child process, so we don't need to be thread-safe;
+ // we can use strerror
report_errno:
- QString error = qt_error_string(errno);
+ const char *msg = strerror(errno);
#if defined (QPROCESS_DEBUG)
- fprintf(stderr, "QProcessPrivate::execChild() failed (%s), notifying parent process\n", qPrintable(error));
+ fprintf(stderr, "QProcessPrivate::execChild() failed (%s), notifying parent process\n", msg);
#endif
- qt_safe_write(childStartedPipe[1], error.data(), error.length() * sizeof(QChar));
+ qt_safe_write(childStartedPipe[1], callthatfailed, strlen(callthatfailed));
+ qt_safe_write(childStartedPipe[1], msg, strlen(msg));
qt_safe_close(childStartedPipe[1]);
childStartedPipe[1] = -1;
}
@@ -720,8 +726,15 @@ report_errno:
bool QProcessPrivate::processStarted(QString *errorMessage)
{
- ushort buf[errorBufferMax];
- int i = qt_safe_read(childStartedPipe[0], &buf, sizeof buf);
+ char buf[errorBufferMax];
+ int i = 0;
+ int ret;
+ do {
+ ret = qt_safe_read(childStartedPipe[0], buf + i, sizeof buf - i);
+ if (ret > 0)
+ i += ret;
+ } while (ret > 0 && i < int(sizeof buf));
+
if (startupSocketNotifier) {
startupSocketNotifier->setEnabled(false);
startupSocketNotifier->deleteLater();
@@ -736,7 +749,7 @@ bool QProcessPrivate::processStarted(QString *errorMessage)
// did we read an error message?
if ((i > 0) && errorMessage)
- *errorMessage = QString((const QChar *)buf, i / sizeof(QChar));
+ *errorMessage = QString::fromLocal8Bit(buf, i);
return i <= 0;
}
@@ -830,17 +843,6 @@ bool QProcessPrivate::waitForStarted(int msecs)
return startedEmitted;
}
-#ifdef Q_OS_BLACKBERRY
-QList<QSocketNotifier *> QProcessPrivate::defaultNotifiers() const
-{
- QList<QSocketNotifier *> notifiers;
- notifiers << stdoutChannel.notifier
- << stderrChannel.notifier
- << stdinChannel.notifier;
- return notifiers;
-}
-#endif // Q_OS_BLACKBERRY
-
bool QProcessPrivate::waitForReadyRead(int msecs)
{
#if defined (QPROCESS_DEBUG)
@@ -850,10 +852,6 @@ bool QProcessPrivate::waitForReadyRead(int msecs)
QElapsedTimer stopWatch;
stopWatch.start();
-#ifdef Q_OS_BLACKBERRY
- QList<QSocketNotifier *> notifiers = defaultNotifiers();
-#endif
-
forever {
fd_set fdread;
fd_set fdwrite;
@@ -876,11 +874,8 @@ bool QProcessPrivate::waitForReadyRead(int msecs)
add_fd(nfds, stdinChannel.pipe[1], &fdwrite);
int timeout = qt_subtract_from_timeout(msecs, stopWatch.elapsed());
-#ifdef Q_OS_BLACKBERRY
- int ret = bb_select(notifiers, nfds + 1, &fdread, &fdwrite, timeout);
-#else
int ret = qt_select_msecs(nfds + 1, &fdread, &fdwrite, timeout);
-#endif
+
if (ret < 0) {
break;
}
@@ -928,10 +923,6 @@ bool QProcessPrivate::waitForBytesWritten(int msecs)
QElapsedTimer stopWatch;
stopWatch.start();
-#ifdef Q_OS_BLACKBERRY
- QList<QSocketNotifier *> notifiers = defaultNotifiers();
-#endif
-
while (!stdinChannel.buffer.isEmpty()) {
fd_set fdread;
fd_set fdwrite;
@@ -955,11 +946,8 @@ bool QProcessPrivate::waitForBytesWritten(int msecs)
add_fd(nfds, stdinChannel.pipe[1], &fdwrite);
int timeout = qt_subtract_from_timeout(msecs, stopWatch.elapsed());
-#ifdef Q_OS_BLACKBERRY
- int ret = bb_select(notifiers, nfds + 1, &fdread, &fdwrite, timeout);
-#else
int ret = qt_select_msecs(nfds + 1, &fdread, &fdwrite, timeout);
-#endif
+
if (ret < 0) {
break;
}
@@ -1001,10 +989,6 @@ bool QProcessPrivate::waitForFinished(int msecs)
QElapsedTimer stopWatch;
stopWatch.start();
-#ifdef Q_OS_BLACKBERRY
- QList<QSocketNotifier *> notifiers = defaultNotifiers();
-#endif
-
forever {
fd_set fdread;
fd_set fdwrite;
@@ -1028,11 +1012,8 @@ bool QProcessPrivate::waitForFinished(int msecs)
add_fd(nfds, stdinChannel.pipe[1], &fdwrite);
int timeout = qt_subtract_from_timeout(msecs, stopWatch.elapsed());
-#ifdef Q_OS_BLACKBERRY
- int ret = bb_select(notifiers, nfds + 1, &fdread, &fdwrite, timeout);
-#else
int ret = qt_select_msecs(nfds + 1, &fdread, &fdwrite, timeout);
-#endif
+
if (ret < 0) {
break;
}
diff --git a/src/corelib/io/qprocess_win.cpp b/src/corelib/io/qprocess_win.cpp
index 80e6d5bb61..69d9ac6e87 100644
--- a/src/corelib/io/qprocess_win.cpp
+++ b/src/corelib/io/qprocess_win.cpp
@@ -497,11 +497,22 @@ void QProcessPrivate::startProcess()
0, 0, 0,
stdinChannel.pipe[0], stdoutChannel.pipe[1], stderrChannel.pipe[1]
};
- success = CreateProcess(0, (wchar_t*)args.utf16(),
- 0, 0, TRUE, dwCreationFlags,
- environment.isEmpty() ? 0 : envlist.data(),
- workingDirectory.isEmpty() ? 0 : (wchar_t*)QDir::toNativeSeparators(workingDirectory).utf16(),
- &startupInfo, pid);
+
+ const QString nativeWorkingDirectory = QDir::toNativeSeparators(workingDirectory);
+ QProcess::CreateProcessArguments cpargs = {
+ 0, (wchar_t*)args.utf16(),
+ 0, 0, TRUE, dwCreationFlags,
+ environment.isEmpty() ? 0 : envlist.data(),
+ nativeWorkingDirectory.isEmpty() ? Q_NULLPTR : (wchar_t*)nativeWorkingDirectory.utf16(),
+ &startupInfo, pid
+ };
+ if (modifyCreateProcessArgs)
+ modifyCreateProcessArgs(&cpargs);
+ success = CreateProcess(cpargs.applicationName, cpargs.arguments, cpargs.processAttributes,
+ cpargs.threadAttributes, cpargs.inheritHandles, cpargs.flags,
+ cpargs.environment, cpargs.currentDirectory, cpargs.startupInfo,
+ cpargs.processInformation);
+
QString errorString;
if (!success) {
// Capture the error string before we do CloseHandle below
diff --git a/src/corelib/io/qsettings.cpp b/src/corelib/io/qsettings.cpp
index 0c44582af8..efdb86bd7f 100644
--- a/src/corelib/io/qsettings.cpp
+++ b/src/corelib/io/qsettings.cpp
@@ -100,7 +100,7 @@ using namespace ABI::Windows::Storage;
#define CSIDL_APPDATA 0x001a // <username>\Application Data
#endif
-#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_BLACKBERRY) && !defined(Q_OS_ANDROID)
+#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_ANDROID)
#define Q_XDG_PLATFORM
#endif
@@ -1073,7 +1073,7 @@ static void initDefaultPaths(QMutexLocker *locker)
#else
#ifndef QSETTINGS_USE_QSTANDARDPATHS
- // Non XDG platforms (OS X, iOS, Blackberry, Android...) have used this code path erroneously
+ // Non XDG platforms (OS X, iOS, Android...) have used this code path erroneously
// for some time now. Moving away from that would require migrating existing settings.
QString userPath;
QByteArray env = qgetenv("XDG_CONFIG_HOME");
@@ -1140,7 +1140,6 @@ QConfFileSettingsPrivate::QConfFileSettingsPrivate(QSettings::Format format,
org = QLatin1String("Unknown Organization");
}
-#if !defined(Q_OS_BLACKBERRY)
QString appFile = org + QDir::separator() + application + extension;
QString orgFile = org + extension;
@@ -1155,13 +1154,6 @@ QConfFileSettingsPrivate::QConfFileSettingsPrivate(QSettings::Format format,
if (!application.isEmpty())
confFiles[F_System | F_Application].reset(QConfFile::fromName(systemPath + appFile, false));
confFiles[F_System | F_Organization].reset(QConfFile::fromName(systemPath + orgFile, false));
-#else
- QString confName = getPath(format, QSettings::UserScope) + org;
- if (!application.isEmpty())
- confName += QDir::separator() + application;
- confName += extension;
- confFiles[SandboxConfFile].reset(QConfFile::fromName(confName, true));
-#endif
for (i = 0; i < NumConfFiles; ++i) {
if (confFiles[i]) {
@@ -2249,7 +2241,6 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
stored in the following registry path:
\c{HKEY_LOCAL_MACHINE\Software\WOW6432node}.
- On BlackBerry only a single file is used (see \l{Platform Limitations}).
If the file format is NativeFormat, this is "Settings/MySoft/Star Runner.conf"
in the application's home directory.
@@ -2277,7 +2268,6 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
%COMMON_APPDATA% path is usually \tt{C:\\Documents and
Settings\\All Users\\Application Data}.
- On BlackBerry only a single file is used (see \l{Platform Limitations}).
If the file format is IniFormat, this is "Settings/MySoft/Star Runner.ini"
in the application's home directory.
@@ -2382,15 +2372,6 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
10.8 (Mountain Lion), only root can. However, 10.9 (Mavericks) changes
that rule again but only for the native format (plist files).
- \li On the BlackBerry platform, applications run in a sandbox. They are not
- allowed to read or write outside of this sandbox. This involves the
- following limitations:
- \list
- \li As there is only a single scope the scope is simply ignored,
- i.e. there is no difference between SystemScope and UserScope.
- \li The \l{Fallback Mechanism} is not applied, i.e. only a single
- location is considered.
- \li It is advised against setting and using custom file paths.
\endlist
\endlist
@@ -2413,14 +2394,24 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
This enum type specifies the storage format used by QSettings.
- \value NativeFormat Store the settings using the most
- appropriate storage format for the platform.
- On Windows, this means the system registry;
- on OS X and iOS, this means the CFPreferences
- API; on Unix, this means textual
- configuration files in INI format.
- \value IniFormat Store the settings in INI files.
- \value InvalidFormat Special value returned by registerFormat().
+ \value NativeFormat Store the settings using the most
+ appropriate storage format for the platform.
+ On Windows, this means the system registry;
+ on OS X and iOS, this means the CFPreferences
+ API; on Unix, this means textual
+ configuration files in INI format.
+ \value Registry32Format Windows only: Explicitly access the 32-bit system registry
+ from a 64-bit application running on 64-bit Windows.
+ On 32-bit Windows or from a 32-bit application on 64-bit Windows,
+ this works the same as specifying NativeFormat.
+ This enum value was added in Qt 5.7.
+ \value Registry64Format Windows only: Explicitly access the 64-bit system registry
+ from a 32-bit application running on 64-bit Windows.
+ On 32-bit Windows or from a 64-bit application on 64-bit Windows,
+ this works the same as specifying NativeFormat.
+ This enum value was added in Qt 5.7.
+ \value IniFormat Store the settings in INI files.
+ \value InvalidFormat Special value returned by registerFormat().
\omitvalue CustomFormat1
\omitvalue CustomFormat2
\omitvalue CustomFormat3
diff --git a/src/corelib/io/qsettings.h b/src/corelib/io/qsettings.h
index 8f41273ffa..dd0c4a9bfb 100644
--- a/src/corelib/io/qsettings.h
+++ b/src/corelib/io/qsettings.h
@@ -79,6 +79,11 @@ public:
NativeFormat,
IniFormat,
+#ifdef Q_OS_WIN
+ Registry32Format,
+ Registry64Format,
+#endif
+
InvalidFormat = 16,
CustomFormat1,
CustomFormat2,
diff --git a/src/corelib/io/qsettings_p.h b/src/corelib/io/qsettings_p.h
index 5a3eb58a58..919485b5c3 100644
--- a/src/corelib/io/qsettings_p.h
+++ b/src/corelib/io/qsettings_p.h
@@ -236,16 +236,11 @@ public:
because their values are respectively 1 and 2.
*/
enum {
-#if !defined(Q_OS_BLACKBERRY)
F_Application = 0x0,
F_Organization = 0x1,
F_User = 0x0,
F_System = 0x2,
NumConfFiles = 4
-#else
- SandboxConfFile = 0,
- NumConfFiles = 1
-#endif
};
QSettings::Format format;
diff --git a/src/corelib/io/qsettings_win.cpp b/src/corelib/io/qsettings_win.cpp
index 1546219c3b..88f58422a8 100644
--- a/src/corelib/io/qsettings_win.cpp
+++ b/src/corelib/io/qsettings_win.cpp
@@ -41,6 +41,18 @@
#include "qdebug.h"
#include <qt_windows.h>
+// See "Accessing an Alternate Registry View" at:
+// http://msdn.microsoft.com/en-us/library/aa384129%28VS.85%29.aspx
+#ifndef KEY_WOW64_64KEY
+ // Access a 32-bit key from either a 32-bit or 64-bit application.
+# define KEY_WOW64_64KEY 0x0100
+#endif
+
+#ifndef KEY_WOW64_32KEY
+ // Access a 64-bit key from either a 32-bit or 64-bit application.
+# define KEY_WOW64_32KEY 0x0200
+#endif
+
QT_BEGIN_NAMESPACE
/* Keys are stored in QStrings. If the variable name starts with 'u', this is a "user"
@@ -135,12 +147,13 @@ static QString errorCodeToString(DWORD errorCode)
return result;
}
-// Open a key with the specified perms
-static HKEY openKey(HKEY parentHandle, REGSAM perms, const QString &rSubKey)
+// Open a key with the specified "perms".
+// "access" is to explicitly use the 32- or 64-bit branch.
+static HKEY openKey(HKEY parentHandle, REGSAM perms, const QString &rSubKey, REGSAM access = 0)
{
HKEY resultHandle = 0;
LONG res = RegOpenKeyEx(parentHandle, reinterpret_cast<const wchar_t *>(rSubKey.utf16()),
- 0, perms, &resultHandle);
+ 0, perms | access, &resultHandle);
if (res == ERROR_SUCCESS)
return resultHandle;
@@ -148,17 +161,18 @@ static HKEY openKey(HKEY parentHandle, REGSAM perms, const QString &rSubKey)
return 0;
}
-// Open a key with the specified perms, create it if it does not exist
-static HKEY createOrOpenKey(HKEY parentHandle, REGSAM perms, const QString &rSubKey)
+// Open a key with the specified "perms", create it if it does not exist.
+// "access" is to explicitly use the 32- or 64-bit branch.
+static HKEY createOrOpenKey(HKEY parentHandle, REGSAM perms, const QString &rSubKey, REGSAM access = 0)
{
// try to open it
- HKEY resultHandle = openKey(parentHandle, perms, rSubKey);
+ HKEY resultHandle = openKey(parentHandle, perms, rSubKey, access);
if (resultHandle != 0)
return resultHandle;
// try to create it
LONG res = RegCreateKeyEx(parentHandle, reinterpret_cast<const wchar_t *>(rSubKey.utf16()), 0, 0,
- REG_OPTION_NON_VOLATILE, perms, 0, &resultHandle, 0);
+ REG_OPTION_NON_VOLATILE, perms | access, 0, &resultHandle, 0);
if (res == ERROR_SUCCESS)
return resultHandle;
@@ -169,11 +183,12 @@ static HKEY createOrOpenKey(HKEY parentHandle, REGSAM perms, const QString &rSub
return 0;
}
-// Open or create a key in read-write mode if possible, otherwise read-only
-static HKEY createOrOpenKey(HKEY parentHandle, const QString &rSubKey, bool *readOnly)
+// Open or create a key in read-write mode if possible, otherwise read-only.
+// "access" is to explicitly use the 32- or 64-bit branch.
+static HKEY createOrOpenKey(HKEY parentHandle, const QString &rSubKey, bool *readOnly, REGSAM access = 0)
{
// try to open or create it read/write
- HKEY resultHandle = createOrOpenKey(parentHandle, registryPermissions, rSubKey);
+ HKEY resultHandle = createOrOpenKey(parentHandle, registryPermissions, rSubKey, access);
if (resultHandle != 0) {
if (readOnly != 0)
*readOnly = false;
@@ -181,7 +196,7 @@ static HKEY createOrOpenKey(HKEY parentHandle, const QString &rSubKey, bool *rea
}
// try to open or create it read/only
- resultHandle = createOrOpenKey(parentHandle, KEY_READ, rSubKey);
+ resultHandle = createOrOpenKey(parentHandle, KEY_READ, rSubKey, access);
if (resultHandle != 0) {
if (readOnly != 0)
*readOnly = true;
@@ -247,9 +262,9 @@ static QStringList childKeysOrGroups(HKEY parentHandle, QSettingsPrivate::ChildS
return result;
}
-static void allKeys(HKEY parentHandle, const QString &rSubKey, NameSet *result)
+static void allKeys(HKEY parentHandle, const QString &rSubKey, NameSet *result, REGSAM access = 0)
{
- HKEY handle = openKey(parentHandle, KEY_READ, rSubKey);
+ HKEY handle = openKey(parentHandle, KEY_READ, rSubKey, access);
if (handle == 0)
return;
@@ -270,11 +285,11 @@ static void allKeys(HKEY parentHandle, const QString &rSubKey, NameSet *result)
if (!s.isEmpty())
s += QLatin1Char('\\');
s += childGroups.at(i);
- allKeys(parentHandle, s, result);
+ allKeys(parentHandle, s, result, access);
}
}
-static void deleteChildGroups(HKEY parentHandle)
+static void deleteChildGroups(HKEY parentHandle, REGSAM access = 0)
{
QStringList childGroups = childKeysOrGroups(parentHandle, QSettingsPrivate::ChildGroups);
@@ -282,10 +297,10 @@ static void deleteChildGroups(HKEY parentHandle)
QString group = childGroups.at(i);
// delete subgroups in group
- HKEY childGroupHandle = openKey(parentHandle, registryPermissions, group);
+ HKEY childGroupHandle = openKey(parentHandle, registryPermissions, group, access);
if (childGroupHandle == 0)
continue;
- deleteChildGroups(childGroupHandle);
+ deleteChildGroups(childGroupHandle, access);
RegCloseKey(childGroupHandle);
// delete group itself
@@ -305,7 +320,7 @@ static void deleteChildGroups(HKEY parentHandle)
class RegistryKey
{
public:
- RegistryKey(HKEY parent_handle = 0, const QString &key = QString(), bool read_only = true);
+ RegistryKey(HKEY parent_handle = 0, const QString &key = QString(), bool read_only = true, REGSAM access = 0);
QString key() const;
HKEY handle() const;
HKEY parentHandle() const;
@@ -316,13 +331,15 @@ private:
mutable HKEY m_handle;
QString m_key;
mutable bool m_read_only;
+ REGSAM m_access;
};
-RegistryKey::RegistryKey(HKEY parent_handle, const QString &key, bool read_only)
+RegistryKey::RegistryKey(HKEY parent_handle, const QString &key, bool read_only, REGSAM access)
: m_parent_handle(parent_handle),
m_handle(0),
m_key(key),
- m_read_only(read_only)
+ m_read_only(read_only),
+ m_access(access)
{
}
@@ -337,9 +354,9 @@ HKEY RegistryKey::handle() const
return m_handle;
if (m_read_only)
- m_handle = openKey(m_parent_handle, KEY_READ, m_key);
+ m_handle = openKey(m_parent_handle, KEY_READ, m_key, m_access);
else
- m_handle = createOrOpenKey(m_parent_handle, m_key, &m_read_only);
+ m_handle = createOrOpenKey(m_parent_handle, m_key, &m_read_only, m_access);
return m_handle;
}
@@ -371,8 +388,8 @@ class QWinSettingsPrivate : public QSettingsPrivate
{
public:
QWinSettingsPrivate(QSettings::Scope scope, const QString &organization,
- const QString &application);
- QWinSettingsPrivate(QString rKey);
+ const QString &application, REGSAM access = 0);
+ QWinSettingsPrivate(QString rKey, REGSAM access = 0);
~QWinSettingsPrivate();
void remove(const QString &uKey);
@@ -390,11 +407,13 @@ public:
private:
RegistryKeyList regList; // list of registry locations to search for keys
bool deleteWriteHandleOnExit;
+ REGSAM access;
};
QWinSettingsPrivate::QWinSettingsPrivate(QSettings::Scope scope, const QString &organization,
- const QString &application)
- : QSettingsPrivate(QSettings::NativeFormat, scope, organization, application)
+ const QString &application, REGSAM access)
+ : QSettingsPrivate(QSettings::NativeFormat, scope, organization, application),
+ access(access)
{
deleteWriteHandleOnExit = false;
@@ -405,23 +424,24 @@ QWinSettingsPrivate::QWinSettingsPrivate(QSettings::Scope scope, const QString &
if (scope == QSettings::UserScope) {
if (!application.isEmpty())
- regList.append(RegistryKey(HKEY_CURRENT_USER, appPrefix, !regList.isEmpty()));
+ regList.append(RegistryKey(HKEY_CURRENT_USER, appPrefix, !regList.isEmpty(), access));
- regList.append(RegistryKey(HKEY_CURRENT_USER, orgPrefix, !regList.isEmpty()));
+ regList.append(RegistryKey(HKEY_CURRENT_USER, orgPrefix, !regList.isEmpty(), access));
}
if (!application.isEmpty())
- regList.append(RegistryKey(HKEY_LOCAL_MACHINE, appPrefix, !regList.isEmpty()));
+ regList.append(RegistryKey(HKEY_LOCAL_MACHINE, appPrefix, !regList.isEmpty(), access));
- regList.append(RegistryKey(HKEY_LOCAL_MACHINE, orgPrefix, !regList.isEmpty()));
+ regList.append(RegistryKey(HKEY_LOCAL_MACHINE, orgPrefix, !regList.isEmpty(), access));
}
if (regList.isEmpty())
setStatus(QSettings::AccessError);
}
-QWinSettingsPrivate::QWinSettingsPrivate(QString rPath)
- : QSettingsPrivate(QSettings::NativeFormat)
+QWinSettingsPrivate::QWinSettingsPrivate(QString rPath, REGSAM access)
+ : QSettingsPrivate(QSettings::NativeFormat),
+ access(access)
{
deleteWriteHandleOnExit = false;
@@ -460,9 +480,9 @@ QWinSettingsPrivate::QWinSettingsPrivate(QString rPath)
}
if (rPath.length() == keyLength)
- regList.append(RegistryKey(keyName, QString(), false));
+ regList.append(RegistryKey(keyName, QString(), false, access));
else if (rPath[keyLength] == QLatin1Char('\\'))
- regList.append(RegistryKey(keyName, rPath.mid(keyLength+1), false));
+ regList.append(RegistryKey(keyName, rPath.mid(keyLength+1), false, access));
}
bool QWinSettingsPrivate::readKey(HKEY parentHandle, const QString &rSubKey, QVariant *value) const
@@ -471,7 +491,7 @@ bool QWinSettingsPrivate::readKey(HKEY parentHandle, const QString &rSubKey, QVa
QString rSubkeyPath = keyPath(rSubKey);
// open a handle on the subkey
- HKEY handle = openKey(parentHandle, KEY_READ, rSubkeyPath);
+ HKEY handle = openKey(parentHandle, KEY_READ, rSubkeyPath, access);
if (handle == 0)
return false;
@@ -604,16 +624,16 @@ void QWinSettingsPrivate::remove(const QString &uKey)
// try to delete value bar in key foo
LONG res;
- HKEY handle = openKey(writeHandle(), registryPermissions, keyPath(rKey));
+ HKEY handle = openKey(writeHandle(), registryPermissions, keyPath(rKey), access);
if (handle != 0) {
res = RegDeleteValue(handle, reinterpret_cast<const wchar_t *>(keyName(rKey).utf16()));
RegCloseKey(handle);
}
// try to delete key foo/bar and all subkeys
- handle = openKey(writeHandle(), registryPermissions, rKey);
+ handle = openKey(writeHandle(), registryPermissions, rKey, access);
if (handle != 0) {
- deleteChildGroups(handle);
+ deleteChildGroups(handle, access);
if (rKey.isEmpty()) {
QStringList childKeys = childKeysOrGroups(handle, QSettingsPrivate::ChildKeys);
@@ -661,7 +681,7 @@ void QWinSettingsPrivate::set(const QString &uKey, const QVariant &value)
QString rKey = escapedKey(uKey);
- HKEY handle = createOrOpenKey(writeHandle(), registryPermissions, keyPath(rKey));
+ HKEY handle = createOrOpenKey(writeHandle(), registryPermissions, keyPath(rKey), access);
if (handle == 0) {
setStatus(QSettings::AccessError);
return;
@@ -775,13 +795,13 @@ QStringList QWinSettingsPrivate::children(const QString &uKey, ChildSpec spec) c
HKEY parent_handle = regList.at(i).handle();
if (parent_handle == 0)
continue;
- HKEY handle = openKey(parent_handle, KEY_READ, rKey);
+ HKEY handle = openKey(parent_handle, KEY_READ, rKey, access);
if (handle == 0)
continue;
if (spec == AllKeys) {
NameSet keys;
- allKeys(handle, QLatin1String(""), &keys);
+ allKeys(handle, QLatin1String(""), &keys, access);
mergeKeySets(&result, keys);
} else { // ChildGroups or ChildKeys
QStringList names = childKeysOrGroups(handle, spec);
@@ -836,20 +856,26 @@ bool QWinSettingsPrivate::isWritable() const
QSettingsPrivate *QSettingsPrivate::create(QSettings::Format format, QSettings::Scope scope,
const QString &organization, const QString &application)
{
- if (format == QSettings::NativeFormat) {
+ if (format == QSettings::NativeFormat)
return new QWinSettingsPrivate(scope, organization, application);
- } else {
+ else if (format == QSettings::Registry32Format)
+ return new QWinSettingsPrivate(scope, organization, application, KEY_WOW64_32KEY);
+ else if (format == QSettings::Registry64Format)
+ return new QWinSettingsPrivate(scope, organization, application, KEY_WOW64_64KEY);
+ else
return new QConfFileSettingsPrivate(format, scope, organization, application);
- }
}
QSettingsPrivate *QSettingsPrivate::create(const QString &fileName, QSettings::Format format)
{
- if (format == QSettings::NativeFormat) {
+ if (format == QSettings::NativeFormat)
return new QWinSettingsPrivate(fileName);
- } else {
+ else if (format == QSettings::Registry32Format)
+ return new QWinSettingsPrivate(fileName, KEY_WOW64_32KEY);
+ else if (format == QSettings::Registry64Format)
+ return new QWinSettingsPrivate(fileName, KEY_WOW64_64KEY);
+ else
return new QConfFileSettingsPrivate(fileName, format);
- }
}
QT_END_NAMESPACE
diff --git a/src/corelib/io/qstandardpaths.cpp b/src/corelib/io/qstandardpaths.cpp
index 8828e09e8f..497191fd32 100644
--- a/src/corelib/io/qstandardpaths.cpp
+++ b/src/corelib/io/qstandardpaths.cpp
@@ -210,66 +210,46 @@ QT_BEGIN_NAMESPACE
\endtable
\table
- \header \li Path type \li Blackberry \li Linux
+ \header \li Path type \li Linux
\row \li DesktopLocation
- \li "<APPROOT>/data"
\li "~/Desktop"
\row \li DocumentsLocation
- \li "<APPROOT>/shared/documents"
\li "~/Documents"
\row \li FontsLocation
- \li "/base/usr/fonts" (not writable)
\li "~/.fonts"
\row \li ApplicationsLocation
- \li not supported (directory not readable)
\li "~/.local/share/applications", "/usr/local/share/applications", "/usr/share/applications"
\row \li MusicLocation
- \li "<APPROOT>/shared/music"
\li "~/Music"
\row \li MoviesLocation
- \li "<APPROOT>/shared/videos"
\li "~/Videos"
\row \li PicturesLocation
- \li "<APPROOT>/shared/photos"
\li "~/Pictures"
\row \li TempLocation
- \li "/var/tmp"
\li "/tmp"
\row \li HomeLocation
- \li "<APPROOT>/data"
\li "~"
\row \li DataLocation
- \li "<APPROOT>/data", "<APPROOT>/app/native/assets"
\li "~/.local/share/<APPNAME>", "/usr/local/share/<APPNAME>", "/usr/share/<APPNAME>"
\row \li CacheLocation
- \li "<APPROOT>/data/Cache"
\li "~/.cache/<APPNAME>"
\row \li GenericDataLocation
- \li "<APPROOT>/shared/misc"
\li "~/.local/share", "/usr/local/share", "/usr/share"
\row \li RuntimeLocation
- \li "/var/tmp"
\li "/run/user/<USER>"
\row \li ConfigLocation
- \li "<APPROOT>/data/Settings"
\li "~/.config", "/etc/xdg"
\row \li GenericConfigLocation
- \li "<APPROOT>/data/Settings"
\li "~/.config", "/etc/xdg"
\row \li DownloadLocation
- \li "<APPROOT>/shared/downloads"
\li "~/Downloads"
\row \li GenericCacheLocation
- \li "<APPROOT>/data/Cache" (there is no shared cache)
\li "~/.cache"
\row \li AppDataLocation
- \li "<APPROOT>/data", "<APPROOT>/app/native/assets"
\li "~/.local/share/<APPNAME>", "/usr/local/share/<APPNAME>", "/usr/share/<APPNAME>"
\row \li AppLocalDataLocation
- \li "<APPROOT>/data", "<APPROOT>/app/native/assets"
\li "~/.local/share/<APPNAME>", "/usr/local/share/<APPNAME>", "/usr/share/<APPNAME>"
\row \li AppConfigLocation
- \li "<APPROOT>/data/Settings"
\li "~/.config/<APPNAME>", "/etc/xdg/<APPNAME>"
\endtable
@@ -277,13 +257,13 @@ QT_BEGIN_NAMESPACE
\header \li Path type \li Android \li iOS
\row \li DesktopLocation
\li "<APPROOT>/files"
- \li "<APPROOT>/<APPDIR>" (not writable)
+ \li "<APPROOT>/Documents/Desktop"
\row \li DocumentsLocation
\li "<USER>/Documents", "<USER>/<APPNAME>/Documents"
\li "<APPROOT>/Documents"
\row \li FontsLocation
\li "/system/fonts" (not writable)
- \li "<APPROOT>/Documents/.fonts"
+ \li "<APPROOT>/Library/Fonts"
\row \li ApplicationsLocation
\li not supported (directory not readable)
\li not supported
@@ -301,7 +281,7 @@ QT_BEGIN_NAMESPACE
\li "<APPROOT>/tmp"
\row \li HomeLocation
\li "<APPROOT>/files"
- \li "<APPROOT>/<APPDIR>" (not writable)
+ \li "<APPROOT>" (not writable)
\row \li DataLocation
\li "<APPROOT>/files", "<USER>/<APPNAME>/files"
\li "<APPROOT>/Library/Application Support"
@@ -316,13 +296,13 @@ QT_BEGIN_NAMESPACE
\li not supported
\row \li ConfigLocation
\li "<APPROOT>/files/settings"
- \li "<APPROOT>/Documents"
+ \li "<APPROOT>/Library/Preferences"
\row \li GenericConfigLocation
\li "<APPROOT>/files/settings" (there is no shared settings)
- \li "<APPROOT>/Documents"
+ \li "<APPROOT>/Library/Preferences"
\row \li DownloadLocation
\li "<USER>/Downloads", "<USER>/<APPNAME>/Downloads"
- \li "<APPROOT>/Documents/Download"
+ \li "<APPROOT>/Documents/Downloads"
\row \li GenericCacheLocation
\li "<APPROOT>/cache" (there is no shared cache)
\li "<APPROOT>/Library/Caches"
@@ -331,7 +311,7 @@ QT_BEGIN_NAMESPACE
\li "<APPROOT>/Library/Application Support"
\row \li AppConfigLocation
\li "<APPROOT>/files/settings"
- \li "<APPROOT>/Documents"
+ \li "<APPROOT>/Library/Preferences/<APPNAME>"
\row \li AppLocalDataLocation
\li "<APPROOT>/files", "<USER>/<APPNAME>/files"
\li "<APPROOT>/Library/Application Support"
@@ -555,7 +535,7 @@ QString QStandardPaths::findExecutable(const QString &executableName, const QStr
an empty QString if no relevant location can be found.
*/
-#if !defined(Q_OS_OSX) && !defined(QT_BOOTSTRAPPED)
+#if !defined(Q_OS_MAC) && !defined(QT_BOOTSTRAPPED)
QString QStandardPaths::displayName(StandardLocation type)
{
switch (type) {
diff --git a/src/corelib/io/qstandardpaths_blackberry.cpp b/src/corelib/io/qstandardpaths_blackberry.cpp
deleted file mode 100644
index 4b29ad7ed9..0000000000
--- a/src/corelib/io/qstandardpaths_blackberry.cpp
+++ /dev/null
@@ -1,115 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2012 Research In Motion
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qstandardpaths.h"
-#include <qdir.h>
-
-#ifndef QT_NO_STANDARDPATHS
-
-#include <qstring.h>
-
-QT_BEGIN_NAMESPACE
-
-static QString testModeInsert() {
- if (QStandardPaths::isTestModeEnabled())
- return QStringLiteral("/.qttest");
- else
- return QStringLiteral("");
-}
-
-QString QStandardPaths::writableLocation(StandardLocation type)
-{
- QDir sharedDir = QDir::home();
- sharedDir.cd(QLatin1String("../shared"));
-
- const QString sharedRoot = sharedDir.absolutePath();
-
- switch (type) {
- case AppDataLocation:
- case AppLocalDataLocation:
- return QDir::homePath() + testModeInsert();
- case DesktopLocation:
- case HomeLocation:
- return QDir::homePath();
- case RuntimeLocation:
- case TempLocation:
- return QDir::tempPath();
- case CacheLocation:
- case GenericCacheLocation:
- return QDir::homePath() + testModeInsert() + QLatin1String("/Cache");
- case ConfigLocation:
- case GenericConfigLocation:
- case AppConfigLocation:
- return QDir::homePath() + testModeInsert() + QLatin1String("/Settings");
- case GenericDataLocation:
- return sharedRoot + testModeInsert() + QLatin1String("/misc");
- case DocumentsLocation:
- return sharedRoot + QLatin1String("/documents");
- case PicturesLocation:
- return sharedRoot + QLatin1String("/photos");
- case FontsLocation:
- // this is not a writable location
- return QString();
- case MusicLocation:
- return sharedRoot + QLatin1String("/music");
- case MoviesLocation:
- return sharedRoot + QLatin1String("/videos");
- case DownloadLocation:
- return sharedRoot + QLatin1String("/downloads");
- case ApplicationsLocation:
- return QString();
- default:
- break;
- }
-
- return QString();
-}
-
-QStringList QStandardPaths::standardLocations(StandardLocation type)
-{
- QStringList dirs;
-
- if (type == FontsLocation)
- return QStringList(QLatin1String("/base/usr/fonts"));
-
- if (type == AppDataLocation || type == AppLocalDataLocation)
- dirs.append(QDir::homePath() + testModeInsert() + QLatin1String("native/assets"));
-
- const QString localDir = writableLocation(type);
- dirs.prepend(localDir);
- return dirs;
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_STANDARDPATHS
diff --git a/src/corelib/io/qstandardpaths_ios.mm b/src/corelib/io/qstandardpaths_ios.mm
deleted file mode 100644
index eb85e2fd23..0000000000
--- a/src/corelib/io/qstandardpaths_ios.mm
+++ /dev/null
@@ -1,133 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#import <UIKit/UIKit.h>
-
-#include "qstandardpaths.h"
-
-#ifndef QT_NO_STANDARDPATHS
-
-QT_BEGIN_NAMESPACE
-
-static QString pathForDirectory(NSSearchPathDirectory directory)
-{
- return QString::fromNSString(
- [NSSearchPathForDirectoriesInDomains(directory, NSUserDomainMask, YES) lastObject]);
-}
-
-static QString bundlePath()
-{
- return QString::fromNSString([[NSBundle mainBundle] bundlePath]);
-}
-
-QString QStandardPaths::writableLocation(StandardLocation type)
-{
- QString location;
-
- switch (type) {
- case DocumentsLocation:
- location = pathForDirectory(NSDocumentDirectory);
- break;
- case FontsLocation:
- location = pathForDirectory(NSDocumentDirectory) + QLatin1String("/.fonts");
- break;
- case ApplicationsLocation:
- // NSApplicationDirectory points to a non-existing write-protected path.
- break;
- case MusicLocation:
- // NSMusicDirectory points to a non-existing write-protected path. Use sensible fallback.
- location = pathForDirectory(NSDocumentDirectory) + QLatin1String("/Music");
- break;
- case MoviesLocation:
- // NSMoviesDirectory points to a non-existing write-protected path. Use sensible fallback.
- location = pathForDirectory(NSDocumentDirectory) + QLatin1String("/Movies");
- break;
- case PicturesLocation:
- // NSPicturesDirectory points to a non-existing write-protected path. Use sensible fallback.
- location = pathForDirectory(NSDocumentDirectory) + QLatin1String("/Pictures");
- break;
- case TempLocation:
- location = QString::fromNSString(NSTemporaryDirectory());
- break;
- case DesktopLocation:
- case HomeLocation:
- location = bundlePath();
- break;
- case AppDataLocation:
- case AppLocalDataLocation:
- location = pathForDirectory(NSApplicationSupportDirectory);
- break;
- case GenericDataLocation:
- location = pathForDirectory(NSDocumentDirectory);
- break;
- case CacheLocation:
- case GenericCacheLocation:
- location = pathForDirectory(NSCachesDirectory);
- break;
- case ConfigLocation:
- case GenericConfigLocation:
- case AppConfigLocation:
- location = pathForDirectory(NSDocumentDirectory);
- break;
- case DownloadLocation:
- // NSDownloadsDirectory points to a non-existing write-protected path.
- location = pathForDirectory(NSDocumentDirectory) + QLatin1String("/Download");
- break;
- case RuntimeLocation:
- break;
- default:
- break;
- }
-
- return location;
-}
-
-QStringList QStandardPaths::standardLocations(StandardLocation type)
-{
- QStringList dirs;
-
- switch (type) {
- case PicturesLocation:
- dirs << writableLocation(PicturesLocation) << QLatin1String("assets-library://");
- break;
- default:
- dirs << writableLocation(type);
- break;
- }
-
- return dirs;
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_STANDARDPATHS
diff --git a/src/corelib/io/qstandardpaths_mac.mm b/src/corelib/io/qstandardpaths_mac.mm
index 7b97a03db2..341a504168 100644
--- a/src/corelib/io/qstandardpaths_mac.mm
+++ b/src/corelib/io/qstandardpaths_mac.mm
@@ -32,6 +32,9 @@
****************************************************************************/
#include "qstandardpaths.h"
+
+#ifndef QT_NO_STANDARDPATHS
+
#include <qdir.h>
#include <qurl.h>
#include <private/qcore_mac_p.h>
@@ -40,63 +43,47 @@
#include <qcoreapplication.h>
#endif
-#include <CoreFoundation/CoreFoundation.h>
-#include <ApplicationServices/ApplicationServices.h>
+#import <Foundation/Foundation.h>
QT_BEGIN_NAMESPACE
-/*
- Translates a QStandardPaths::StandardLocation into the mac equivalent.
-*/
-OSType translateLocation(QStandardPaths::StandardLocation type)
+static QString pathForDirectory(NSSearchPathDirectory directory,
+ NSSearchPathDomainMask mask)
+{
+ return QString::fromNSString(
+ [NSSearchPathForDirectoriesInDomains(directory, mask, YES) lastObject]);
+}
+
+static NSSearchPathDirectory searchPathDirectory(QStandardPaths::StandardLocation type)
{
switch (type) {
- case QStandardPaths::ConfigLocation:
- case QStandardPaths::GenericConfigLocation:
- case QStandardPaths::AppConfigLocation:
- return kPreferencesFolderType;
case QStandardPaths::DesktopLocation:
- return kDesktopFolderType;
+ return NSDesktopDirectory;
case QStandardPaths::DocumentsLocation:
- return kDocumentsFolderType;
- case QStandardPaths::FontsLocation:
- // There are at least two different font directories on the mac: /Library/Fonts and ~/Library/Fonts.
- // To select a specific one we have to specify a different first parameter when calling FSFindFolder.
- return kFontsFolderType;
+ return NSDocumentDirectory;
case QStandardPaths::ApplicationsLocation:
- return kApplicationsFolderType;
+ return NSApplicationDirectory;
case QStandardPaths::MusicLocation:
- return kMusicDocumentsFolderType;
+ return NSMusicDirectory;
case QStandardPaths::MoviesLocation:
- return kMovieDocumentsFolderType;
+ return NSMoviesDirectory;
case QStandardPaths::PicturesLocation:
- return kPictureDocumentsFolderType;
- case QStandardPaths::TempLocation:
- return kTemporaryFolderType;
+ return NSPicturesDirectory;
case QStandardPaths::GenericDataLocation:
case QStandardPaths::RuntimeLocation:
case QStandardPaths::AppDataLocation:
case QStandardPaths::AppLocalDataLocation:
- return kApplicationSupportFolderType;
+ return NSApplicationSupportDirectory;
case QStandardPaths::GenericCacheLocation:
case QStandardPaths::CacheLocation:
- return kCachedDataFolderType;
+ return NSCachesDirectory;
+ case QStandardPaths::DownloadLocation:
+ return NSDownloadsDirectory;
default:
- return kDesktopFolderType;
+ return (NSSearchPathDirectory)0;
}
}
-/*
- Constructs a full unicode path from a FSRef.
-*/
-static QString getFullPath(const FSRef &ref)
-{
- QByteArray ba(2048, 0);
- if (FSRefMakePath(&ref, reinterpret_cast<UInt8 *>(ba.data()), ba.size()) == noErr)
- return QString::fromUtf8(ba.constData()).normalized(QString::NormalizationForm_C);
- return QString();
-}
-
static void appendOrganizationAndApp(QString &path)
{
#ifndef QT_BOOTSTRAPPED
@@ -111,28 +98,65 @@ static void appendOrganizationAndApp(QString &path)
#endif
}
-static QString macLocation(QStandardPaths::StandardLocation type, short domain)
+static QString baseWritableLocation(QStandardPaths::StandardLocation type,
+ NSSearchPathDomainMask mask = NSUserDomainMask,
+ bool appendOrgAndApp = false)
{
- // https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/index.html
- if (type == QStandardPaths::DownloadLocation) {
- NSFileManager *fileManager = [NSFileManager defaultManager];
- NSURL *url = [fileManager URLForDirectory:NSDownloadsDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
- if (!url)
- return QString();
- return QString::fromNSString([url path]);
+ QString path;
+ const NSSearchPathDirectory dir = searchPathDirectory(type);
+ switch (type) {
+ case QStandardPaths::HomeLocation:
+ path = QDir::homePath();
+ break;
+ case QStandardPaths::TempLocation:
+ path = QDir::tempPath();
+ break;
+#ifdef Q_OS_IOS
+ // These locations point to non-existing write-protected paths. Use sensible fallbacks.
+ case QStandardPaths::MusicLocation:
+ path = pathForDirectory(NSDocumentDirectory, mask) + QLatin1String("/Music");
+ break;
+ case QStandardPaths::MoviesLocation:
+ path = pathForDirectory(NSDocumentDirectory, mask) + QLatin1String("/Movies");
+ break;
+ case QStandardPaths::PicturesLocation:
+ path = pathForDirectory(NSDocumentDirectory, mask) + QLatin1String("/Pictures");
+ break;
+ case QStandardPaths::DownloadLocation:
+ path = pathForDirectory(NSDocumentDirectory, mask) + QLatin1String("/Downloads");
+ break;
+ case QStandardPaths::DesktopLocation:
+ path = pathForDirectory(NSDocumentDirectory, mask) + QLatin1String("/Desktop");
+ break;
+ case QStandardPaths::ApplicationsLocation:
+ break;
+#endif
+ case QStandardPaths::FontsLocation:
+ path = pathForDirectory(NSLibraryDirectory, mask) + QLatin1String("/Fonts");
+ break;
+ case QStandardPaths::ConfigLocation:
+ case QStandardPaths::GenericConfigLocation:
+ case QStandardPaths::AppConfigLocation:
+ path = pathForDirectory(NSLibraryDirectory, mask) + QLatin1String("/Preferences");
+ break;
+ default:
+ path = pathForDirectory(dir, mask);
+ break;
}
- // http://developer.apple.com/documentation/Carbon/Reference/Folder_Manager/Reference/reference.html
- FSRef ref;
- OSErr err = FSFindFolder(domain, translateLocation(type), false, &ref);
- if (err)
- return QString();
-
- QString path = getFullPath(ref);
+ if (appendOrgAndApp) {
+ switch (type) {
+ case QStandardPaths::AppDataLocation:
+ case QStandardPaths::AppLocalDataLocation:
+ case QStandardPaths::AppConfigLocation:
+ case QStandardPaths::CacheLocation:
+ appendOrganizationAndApp(path);
+ break;
+ default:
+ break;
+ }
+ }
- if (type == QStandardPaths::AppDataLocation || type == QStandardPaths::AppLocalDataLocation ||
- type == QStandardPaths::CacheLocation || type == QStandardPaths::AppConfigLocation)
- appendOrganizationAndApp(path);
return path;
}
@@ -167,31 +191,32 @@ QString QStandardPaths::writableLocation(StandardLocation type)
}
}
- switch (type) {
- case HomeLocation:
- return QDir::homePath();
- case TempLocation:
- return QDir::tempPath();
- case GenericDataLocation:
- case AppDataLocation:
- case AppLocalDataLocation:
- case GenericCacheLocation:
- case CacheLocation:
- case RuntimeLocation:
- return macLocation(type, kUserDomain);
- default:
- return macLocation(type, kOnAppropriateDisk);
- }
+ return baseWritableLocation(type, NSUserDomainMask, true);
}
QStringList QStandardPaths::standardLocations(StandardLocation type)
{
QStringList dirs;
- if (type == GenericDataLocation || type == AppDataLocation || type == AppLocalDataLocation || type == GenericCacheLocation || type == CacheLocation) {
- const QString path = macLocation(type, kOnAppropriateDisk);
- if (!path.isEmpty())
- dirs.append(path);
+#ifdef Q_OS_IOS
+ if (type == PicturesLocation)
+ dirs << writableLocation(PicturesLocation) << QLatin1String("assets-library://");
+#endif
+
+ if (type == GenericDataLocation || type == FontsLocation || type == ApplicationsLocation
+ || type == AppDataLocation || type == AppLocalDataLocation
+ || type == GenericCacheLocation || type == CacheLocation) {
+ QList<NSSearchPathDomainMask> masks;
+ masks << NSLocalDomainMask;
+ if (type == FontsLocation || type == GenericCacheLocation)
+ masks << NSSystemDomainMask;
+
+ for (QList<NSSearchPathDomainMask>::const_iterator it = masks.begin();
+ it != masks.end(); ++it) {
+ const QString path = baseWritableLocation(type, *it, true);
+ if (!path.isEmpty() && !dirs.contains(path))
+ dirs.append(path);
+ }
}
if (type == AppDataLocation || type == AppLocalDataLocation) {
@@ -219,28 +244,41 @@ QStringList QStandardPaths::standardLocations(StandardLocation type)
}
}
const QString localDir = writableLocation(type);
- dirs.prepend(localDir);
+ if (!localDir.isEmpty())
+ dirs.prepend(localDir);
return dirs;
}
#ifndef QT_BOOTSTRAPPED
QString QStandardPaths::displayName(StandardLocation type)
{
+ // Use "Home" instead of the user's Unix username
if (QStandardPaths::HomeLocation == type)
return QCoreApplication::translate("QStandardPaths", "Home");
- FSRef ref;
- OSErr err = FSFindFolder(kOnAppropriateDisk, translateLocation(type), false, &ref);
- if (err)
- return QString();
+ // The temporary directory returned by the old Carbon APIs is ~/Library/Caches/TemporaryItems,
+ // the display name of which ("TemporaryItems") isn't translated by the system. The standard
+ // temporary directory has no reasonable display name either, so use something more sensible.
+ if (QStandardPaths::TempLocation == type)
+ return QCoreApplication::translate("QStandardPaths", "Temporary Items");
- QCFString displayName;
- err = LSCopyDisplayNameForRef(&ref, &displayName);
- if (err)
- return QString();
+ // standardLocations() may return an empty list on some platforms
+ if (QStandardPaths::ApplicationsLocation == type)
+ return QCoreApplication::translate("QStandardPaths", "Applications");
- return static_cast<QString>(displayName);
+ if (QCFType<CFURLRef> url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
+ standardLocations(type).first().toCFString(),
+ kCFURLPOSIXPathStyle, true)) {
+ QCFString name;
+ CFURLCopyResourcePropertyForKey(url, kCFURLLocalizedNameKey, &name, NULL);
+ if (name && CFStringGetLength(name))
+ return QString::fromCFString(name);
+ }
+
+ return QFileInfo(baseWritableLocation(type)).fileName();
}
#endif
QT_END_NAMESPACE
+
+#endif // QT_NO_STANDARDPATHS
diff --git a/src/corelib/io/qtemporarydir.cpp b/src/corelib/io/qtemporarydir.cpp
index 71436c6497..1096cb8c31 100644
--- a/src/corelib/io/qtemporarydir.cpp
+++ b/src/corelib/io/qtemporarydir.cpp
@@ -45,7 +45,7 @@
#endif
#include <stdlib.h> // mkdtemp
-#if defined(Q_OS_QNX) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID)
+#if defined(Q_OS_QNX) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID) || defined(Q_OS_INTEGRITY)
#include <private/qfilesystemengine_p.h>
#endif
@@ -91,7 +91,7 @@ static QString defaultTemplateName()
return QDir::tempPath() + QLatin1Char('/') + baseName + QLatin1String("-XXXXXX");
}
-#if defined(Q_OS_QNX ) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID)
+#if defined(Q_OS_QNX ) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID) || defined(Q_OS_INTEGRITY)
static int nextRand(int &v)
{
diff --git a/src/corelib/io/qtextstream.cpp b/src/corelib/io/qtextstream.cpp
index a8fd2dd7ab..adf9e1aa55 100644
--- a/src/corelib/io/qtextstream.cpp
+++ b/src/corelib/io/qtextstream.cpp
@@ -2545,6 +2545,8 @@ QTextStream &QTextStream::operator<<(double f)
flags |= QLocaleData::Alternate;
if (locale() != QLocale::c() && !(locale().numberOptions() & QLocale::OmitGroupSeparator))
flags |= QLocaleData::ThousandsGroup;
+ if (!(locale().numberOptions() & QLocale::OmitLeadingZeroInExponent))
+ flags |= QLocaleData::ZeroPadExponent;
const QLocaleData *dd = d->locale.d->m_data;
QString num = dd->doubleToString(f, d->params.realNumberPrecision, form, -1, flags);
diff --git a/src/corelib/itemmodels/qabstractitemmodel_p.h b/src/corelib/itemmodels/qabstractitemmodel_p.h
index c2cbaf5298..77a3164959 100644
--- a/src/corelib/itemmodels/qabstractitemmodel_p.h
+++ b/src/corelib/itemmodels/qabstractitemmodel_p.h
@@ -46,7 +46,8 @@
//
//
-#include "private/qobject_p.h"
+#include "QtCore/qabstractitemmodel.h"
+#include "QtCore/private/qobject_p.h"
#include "QtCore/qstack.h"
#include "QtCore/qset.h"
#include "QtCore/qhash.h"
@@ -126,9 +127,9 @@ public:
}
struct Change {
- Change() : first(-1), last(-1) {}
- Change(const Change &c) : parent(c.parent), first(c.first), last(c.last), needsAdjust(c.needsAdjust) {}
- Change(const QModelIndex &p, int f, int l) : parent(p), first(f), last(l), needsAdjust(false) {}
+ Q_DECL_CONSTEXPR Change() : parent(), first(-1), last(-1), needsAdjust(false) {}
+ Q_DECL_CONSTEXPR Change(const QModelIndex &p, int f, int l) : parent(p), first(f), last(l), needsAdjust(false) {}
+
QModelIndex parent;
int first, last;
@@ -147,7 +148,7 @@ public:
// rowsMoved signal.
bool needsAdjust;
- bool isValid() { return first >= 0 && last >= 0; }
+ Q_DECL_CONSTEXPR bool isValid() const { return first >= 0 && last >= 0; }
};
QStack<Change> changes;
diff --git a/src/corelib/json/qjsonwriter.cpp b/src/corelib/json/qjsonwriter.cpp
index 45a05e93a3..0ab8b2bb80 100644
--- a/src/corelib/json/qjsonwriter.cpp
+++ b/src/corelib/json/qjsonwriter.cpp
@@ -32,6 +32,7 @@
**
****************************************************************************/
+#include <qlocale.h>
#include "qjsonwriter_p.h"
#include "qjson_p.h"
#include "private/qutfcodec_p.h"
@@ -123,7 +124,7 @@ static void valueToJson(const QJsonPrivate::Base *b, const QJsonPrivate::Value &
case QJsonValue::Double: {
const double d = v.toDouble(b);
if (qIsFinite(d)) // +2 to format to ensure the expected precision
- json += QByteArray::number(d, 'g', std::numeric_limits<double>::digits10 + 2); // ::digits10 is 15
+ json += QByteArray::number(d, 'g', QLocale::FloatingPointShortest);
else
json += "null"; // +INF || -INF || NaN (see RFC4627#section2.4)
break;
diff --git a/src/corelib/kernel/kernel.pri b/src/corelib/kernel/kernel.pri
index bc93791c2e..adcc9c5581 100644
--- a/src/corelib/kernel/kernel.pri
+++ b/src/corelib/kernel/kernel.pri
@@ -143,8 +143,14 @@ unix|integrity {
kernel/qcore_unix_p.h \
kernel/qcrashhandler_p.h \
kernel/qeventdispatcher_unix_p.h \
+ kernel/qpoll_p.h \
kernel/qtimerinfo_unix_p.h
+ contains(QT_CONFIG, poll_select): SOURCES += kernel/qpoll.cpp
+ contains(QT_CONFIG, poll_poll): DEFINES += QT_HAVE_POLL
+ contains(QT_CONFIG, poll_ppoll): DEFINES += QT_HAVE_POLL QT_HAVE_PPOLL
+ contains(QT_CONFIG, poll_pollts): DEFINES += QT_HAVE_POLL QT_HAVE_POLLTS
+
contains(QT_CONFIG, glib) {
SOURCES += \
kernel/qeventdispatcher_glib.cpp
@@ -176,13 +182,6 @@ vxworks {
kernel/qfunctions_vxworks.h
}
-blackberry {
- SOURCES += \
- kernel/qeventdispatcher_blackberry.cpp
- HEADERS += \
- kernel/qeventdispatcher_blackberry_p.h
-}
-
qqnx_pps {
LIBS_PRIVATE += -lpps
SOURCES += \
diff --git a/src/corelib/kernel/qabstractnativeeventfilter.cpp b/src/corelib/kernel/qabstractnativeeventfilter.cpp
index 9892cc7333..66bfa415a7 100644
--- a/src/corelib/kernel/qabstractnativeeventfilter.cpp
+++ b/src/corelib/kernel/qabstractnativeeventfilter.cpp
@@ -92,9 +92,6 @@ QAbstractNativeEventFilter::~QAbstractNativeEventFilter()
On Mac, \a eventType is set to "mac_generic_NSEvent", and the \a message can be casted to an EventRef.
- On Blackberry (not plain QNX) \a eventType is set to "bps_event_t", and the \a message can be casted
- to a bps_event_t pointer.
-
In your reimplementation of this function, if you want to filter
the \a message out, i.e. stop it being handled further, return
true; otherwise return false.
diff --git a/src/corelib/kernel/qcore_unix.cpp b/src/corelib/kernel/qcore_unix.cpp
index 5695cb3ec5..97c0efc36f 100644
--- a/src/corelib/kernel/qcore_unix.cpp
+++ b/src/corelib/kernel/qcore_unix.cpp
@@ -50,12 +50,13 @@
#include <mach/mach_time.h>
#endif
-#ifdef Q_OS_BLACKBERRY
-#include <qsocketnotifier.h>
-#endif // Q_OS_BLACKBERRY
-
QT_BEGIN_NAMESPACE
+#if !defined(QT_HAVE_PPOLL) && defined(QT_HAVE_POLLTS)
+# define ppoll pollts
+# define QT_HAVE_PPOLL
+#endif
+
static inline bool time_update(struct timespec *tv, const struct timespec &start,
const struct timespec &timeout)
{
@@ -85,9 +86,7 @@ int qt_safe_select(int nfds, fd_set *fdread, fd_set *fdwrite, fd_set *fdexcept,
#ifndef Q_OS_QNX
ret = ::pselect(nfds, fdread, fdwrite, fdexcept, &timeout, 0);
#else
- timeval timeoutVal;
- timeoutVal.tv_sec = timeout.tv_sec;
- timeoutVal.tv_usec = timeout.tv_nsec / 1000;
+ timeval timeoutVal = timespecToTimeval(timeout);
ret = ::select(nfds, fdread, fdwrite, fdexcept, &timeoutVal);
#endif
if (ret != -1 || errno != EINTR)
@@ -102,43 +101,80 @@ int qt_safe_select(int nfds, fd_set *fdread, fd_set *fdwrite, fd_set *fdexcept,
}
}
+static inline struct timespec millisecsToTimespec(const unsigned int ms)
+{
+ struct timespec tv;
+
+ tv.tv_sec = ms / 1000;
+ tv.tv_nsec = (ms % 1000) * 1000 * 1000;
+
+ return tv;
+}
+
int qt_select_msecs(int nfds, fd_set *fdread, fd_set *fdwrite, int timeout)
{
if (timeout < 0)
return qt_safe_select(nfds, fdread, fdwrite, 0, 0);
- struct timespec tv;
- tv.tv_sec = timeout / 1000;
- tv.tv_nsec = (timeout % 1000) * 1000 * 1000;
+ struct timespec tv = millisecsToTimespec(timeout);
return qt_safe_select(nfds, fdread, fdwrite, 0, &tv);
}
-#ifdef Q_OS_BLACKBERRY
-// The BlackBerry event dispatcher uses bps_get_event. Unfortunately, already registered
-// socket notifiers are disabled by a call to select. This is to rearm the standard streams.
-int bb_select(QList<QSocketNotifier *> socketNotifiers, int nfds, fd_set *fdread, fd_set *fdwrite,
- int timeout)
+#if !defined(QT_HAVE_PPOLL) && defined(QT_HAVE_POLL)
+static inline int timespecToMillisecs(const struct timespec *ts)
{
- QList<bool> socketNotifiersEnabled;
- socketNotifiersEnabled.reserve(socketNotifiers.count());
- for (int a = 0; a < socketNotifiers.count(); ++a) {
- if (socketNotifiers.at(a) && socketNotifiers.at(a)->isEnabled()) {
- socketNotifiersEnabled.append(true);
- socketNotifiers.at(a)->setEnabled(false);
- } else {
- socketNotifiersEnabled.append(false);
- }
- }
+ return (ts == NULL) ? -1 :
+ (ts->tv_sec * 1000) + (ts->tv_nsec / 1000000);
+}
+#endif
+
+// defined in qpoll.cpp
+int qt_poll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout_ts);
+
+static inline int qt_ppoll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout_ts)
+{
+#if defined(QT_HAVE_PPOLL)
+ return ::ppoll(fds, nfds, timeout_ts, Q_NULLPTR);
+#elif defined(QT_HAVE_POLL)
+ return ::poll(fds, nfds, timespecToMillisecs(timeout_ts));
+#else
+ return qt_poll(fds, nfds, timeout_ts);
+#endif
+}
+
- const int ret = qt_select_msecs(nfds, fdread, fdwrite, timeout);
+/*!
+ \internal
- for (int a = 0; a < socketNotifiers.count(); ++a) {
- if (socketNotifiersEnabled.at(a) == true)
- socketNotifiers.at(a)->setEnabled(true);
+ Behaves as close to POSIX poll(2) as practical but may be implemented
+ using select(2) where necessary. In that case, returns -1 and sets errno
+ to EINVAL if passed any descriptor greater than or equal to FD_SETSIZE.
+*/
+int qt_safe_poll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout_ts)
+{
+ if (!timeout_ts) {
+ // no timeout -> block forever
+ int ret;
+ EINTR_LOOP(ret, qt_ppoll(fds, nfds, Q_NULLPTR));
+ return ret;
}
- return ret;
+ timespec start = qt_gettime();
+ timespec timeout = *timeout_ts;
+
+ // loop and recalculate the timeout as needed
+ forever {
+ const int ret = qt_ppoll(fds, nfds, &timeout);
+ if (ret != -1 || errno != EINTR)
+ return ret;
+
+ // recalculate the timeout
+ if (!time_update(&timeout, start, *timeout_ts)) {
+ // timeout during update
+ // or clock reset, fake timeout error
+ return 0;
+ }
+ }
}
-#endif // Q_OS_BLACKBERRY
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qcore_unix_p.h b/src/corelib/kernel/qcore_unix_p.h
index f80dcb5a50..fcc65589a0 100644
--- a/src/corelib/kernel/qcore_unix_p.h
+++ b/src/corelib/kernel/qcore_unix_p.h
@@ -66,6 +66,12 @@
# include <ioLib.h>
#endif
+#ifdef QT_NO_NATIVE_POLL
+# include "qpoll_p.h"
+#else
+# include <poll.h>
+#endif
+
struct sockaddr;
#define EINTR_LOOP(var, cmd) \
@@ -121,6 +127,14 @@ inline timespec operator*(const timespec &t1, int mul)
tmp.tv_nsec = t1.tv_nsec * mul;
return normalizedTimespec(tmp);
}
+inline timeval timespecToTimeval(const timespec &ts)
+{
+ timeval tv;
+ tv.tv_sec = ts.tv_sec;
+ tv.tv_usec = ts.tv_nsec / 1000;
+ return tv;
+}
+
inline void qt_ignore_sigpipe()
{
@@ -303,17 +317,13 @@ static inline pid_t qt_safe_waitpid(pid_t pid, int *status, int options)
timespec qt_gettime() Q_DECL_NOTHROW;
void qt_nanosleep(timespec amount);
+Q_CORE_EXPORT int qt_safe_poll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout_ts);
+
Q_CORE_EXPORT int qt_safe_select(int nfds, fd_set *fdread, fd_set *fdwrite, fd_set *fdexcept,
const struct timespec *tv);
int qt_select_msecs(int nfds, fd_set *fdread, fd_set *fdwrite, int timeout);
-#ifdef Q_OS_BLACKBERRY
-class QSocketNotifier;
-Q_CORE_EXPORT int bb_select(QList<QSocketNotifier *> socketNotifiers, int nfds, fd_set *fdread,
- fd_set *fdwrite, int timeout);
-#endif // Q_OS_BLACKBERRY
-
// according to X/OPEN we have to define semun ourselves
// we use prefix as on some systems sem.h will have it
struct semid_ds;
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp
index abc5af94cb..8d9b923e61 100644
--- a/src/corelib/kernel/qcoreapplication.cpp
+++ b/src/corelib/kernel/qcoreapplication.cpp
@@ -66,19 +66,14 @@
#ifndef QT_NO_QOBJECT
#if defined(Q_OS_UNIX)
-# if defined(Q_OS_BLACKBERRY)
-# include "qeventdispatcher_blackberry_p.h"
-# include <process.h>
-# include <unistd.h>
-# elif defined(Q_OS_OSX)
-# include "qeventdispatcher_cf_p.h"
-# include "qeventdispatcher_unix_p.h"
-# else
-# if !defined(QT_NO_GLIB)
-# include "qeventdispatcher_glib_p.h"
-# endif
-# include "qeventdispatcher_unix_p.h"
+# if defined(Q_OS_OSX)
+# include "qeventdispatcher_cf_p.h"
+# else
+# if !defined(QT_NO_GLIB)
+# include "qeventdispatcher_glib_p.h"
# endif
+# endif
+# include "qeventdispatcher_unix_p.h"
#endif
#ifdef Q_OS_WIN
# ifdef Q_OS_WINRT
@@ -338,34 +333,6 @@ struct QCoreApplicationData {
#endif
}
-#ifdef Q_OS_BLACKBERRY
- //The QCoreApplicationData struct is only populated on demand, because it is rarely needed and would
- //affect startup time
- void loadManifest() {
- static bool manifestLoadAttempt = false;
- if (manifestLoadAttempt)
- return;
-
- manifestLoadAttempt = true;
-
- QFile metafile(QStringLiteral("app/META-INF/MANIFEST.MF"));
- if (!metafile.open(QIODevice::ReadOnly)) {
- qWarning("Could not open application metafile for reading")
- } else {
- while (!metafile.atEnd() && (application.isEmpty() || applicationVersion.isEmpty() || orgName.isEmpty())) {
- QByteArray line = metafile.readLine();
- if (line.startsWith("Application-Name:"))
- application = QString::fromUtf8(line.mid(18).trimmed());
- else if (line.startsWith("Application-Version:"))
- applicationVersion = QString::fromUtf8(line.mid(21).trimmed());
- else if (line.startsWith("Package-Author:"))
- orgName = QString::fromUtf8(line.mid(16).trimmed());
- }
- metafile.close();
- }
- }
-#endif
-
QString orgName, orgDomain;
QString application; // application name, initially from argv[0], can then be modified.
QString applicationVersion;
@@ -450,7 +417,7 @@ QCoreApplicationPrivate::QCoreApplicationPrivate(int &aargc, char **aargv, uint
QCoreApplicationPrivate::is_app_closing = false;
# if defined(Q_OS_UNIX)
- if (!setuidAllowed && (geteuid() != getuid()))
+ if (Q_UNLIKELY(!setuidAllowed && (geteuid() != getuid())))
qFatal("FATAL: The application binary appears to be running setuid, this is a security hole.");
# endif // Q_OS_UNIX
@@ -506,9 +473,7 @@ void QCoreApplicationPrivate::createEventDispatcher()
{
Q_Q(QCoreApplication);
#if defined(Q_OS_UNIX)
-# if defined(Q_OS_BLACKBERRY)
- eventDispatcher = new QEventDispatcherBlackberry(q);
-# elif defined(Q_OS_OSX)
+# if defined(Q_OS_OSX)
bool ok = false;
int value = qEnvironmentVariableIntValue("QT_EVENT_DISPATCHER_CORE_FOUNDATION", &ok);
if (ok && value > 0)
@@ -600,7 +565,7 @@ void QCoreApplicationPrivate::initLocale()
if (qt_locale_initialized)
return;
qt_locale_initialized = true;
-#ifdef Q_OS_UNIX
+#if defined(Q_OS_UNIX) && !defined(QT_BOOTSTRAPPED)
setlocale(LC_ALL, "");
#endif
}
@@ -2135,33 +2100,6 @@ QString QCoreApplication::applicationFilePath()
#if defined(Q_OS_WIN)
QCoreApplicationPrivate::setApplicationFilePath(QFileInfo(qAppFileName()).filePath());
return *QCoreApplicationPrivate::cachedApplicationFilePath;
-#elif defined(Q_OS_BLACKBERRY)
- if (!arguments().isEmpty()) { // args is never empty, but the navigator can change behaviour some day
- QFileInfo fileInfo(arguments().at(0));
- const bool zygotized = fileInfo.exists();
- if (zygotized) {
- // Handle the zygotized case:
- QCoreApplicationPrivate::setApplicationFilePath(QDir::cleanPath(fileInfo.absoluteFilePath()));
- return *QCoreApplicationPrivate::cachedApplicationFilePath;
- }
- }
-
- // Handle the non-zygotized case:
- const size_t maximum_path = static_cast<size_t>(pathconf("/",_PC_PATH_MAX));
- char buff[maximum_path+1];
- if (_cmdname(buff)) {
- QCoreApplicationPrivate::setApplicationFilePath(QDir::cleanPath(QString::fromLocal8Bit(buff)));
- } else {
- qWarning("QCoreApplication::applicationFilePath: _cmdname() failed");
- // _cmdname() won't fail, but just in case, fallback to the old method
- QDir dir(QStringLiteral("./app/native/"));
- QStringList executables = dir.entryList(QDir::Executable | QDir::Files);
- if (!executables.empty()) {
- //We assume that there is only one executable in the folder
- QCoreApplicationPrivate::setApplicationFilePath(dir.absoluteFilePath(executables.first()));
- }
- }
- return *QCoreApplicationPrivate::cachedApplicationFilePath;
#elif defined(Q_OS_MAC)
QString qAppFileName_str = qAppFileName();
if(!qAppFileName_str.isEmpty()) {
@@ -2327,9 +2265,6 @@ QStringList QCoreApplication::arguments()
organizationName(). On all other platforms, QSettings uses
organizationName() as the organization.
- On BlackBerry this property is read-only. It is obtained from the
- BAR application descriptor file.
-
\sa organizationDomain, applicationName
*/
@@ -2354,9 +2289,6 @@ void QCoreApplication::setOrganizationName(const QString &orgName)
QString QCoreApplication::organizationName()
{
-#ifdef Q_OS_BLACKBERRY
- coreappdata()->loadManifest();
-#endif
return coreappdata()->orgName;
}
@@ -2407,9 +2339,6 @@ QString QCoreApplication::organizationDomain()
If not set, the application name defaults to the executable name (since 5.0).
- On BlackBerry this property is read-only. It is obtained from the
- BAR application descriptor file.
-
\sa organizationName, organizationDomain, applicationVersion, applicationFilePath()
*/
/*!
@@ -2435,9 +2364,6 @@ void QCoreApplication::setApplicationName(const QString &application)
QString QCoreApplication::applicationName()
{
-#ifdef Q_OS_BLACKBERRY
- coreappdata()->loadManifest();
-#endif
return coreappdata() ? coreappdata()->application : QString();
}
@@ -2452,9 +2378,6 @@ Q_CORE_EXPORT QString qt_applicationName_noFallback()
\since 4.4
\brief the version of this application
- On BlackBerry this property is read-only. It is obtained from the
- BAR application descriptor file.
-
\sa applicationName, organizationName, organizationDomain
*/
/*!
@@ -2476,9 +2399,6 @@ void QCoreApplication::setApplicationVersion(const QString &version)
QString QCoreApplication::applicationVersion()
{
-#ifdef Q_OS_BLACKBERRY
- coreappdata()->loadManifest();
-#endif
return coreappdata()->applicationVersion;
}
@@ -2698,7 +2618,7 @@ void QCoreApplication::removeLibraryPath(const QString &path)
i.e. MSG or XCB event structs.
\note Native event filters will be disabled in the application when the
- Qt::AA_MacPluginApplication attribute is set.
+ Qt::AA_PluginApplication attribute is set.
For maximum portability, you should always try to use QEvent
and QObject::installEventFilter() whenever possible.
@@ -2709,8 +2629,8 @@ void QCoreApplication::removeLibraryPath(const QString &path)
*/
void QCoreApplication::installNativeEventFilter(QAbstractNativeEventFilter *filterObj)
{
- if (QCoreApplication::testAttribute(Qt::AA_MacPluginApplication)) {
- qWarning("Native event filters are not applied when the Qt::AA_MacPluginApplication attribute is set");
+ if (QCoreApplication::testAttribute(Qt::AA_PluginApplication)) {
+ qWarning("Native event filters are not applied when the Qt::AA_PluginApplication attribute is set");
return;
}
diff --git a/src/corelib/kernel/qcoreevent.h b/src/corelib/kernel/qcoreevent.h
index 53da4a849b..d9de828fa1 100644
--- a/src/corelib/kernel/qcoreevent.h
+++ b/src/corelib/kernel/qcoreevent.h
@@ -276,6 +276,8 @@ public:
PlatformSurface = 217, // Platform surface created or about to be destroyed
+ Pointer = 218, // QQuickPointerEvent; ### Qt 6: QPointerEvent
+
// 512 reserved for Qt Jambi's MetaCall event
// 513 reserved for Qt Jambi's DeleteOnMainThread event
diff --git a/src/corelib/kernel/qeventdispatcher_blackberry.cpp b/src/corelib/kernel/qeventdispatcher_blackberry.cpp
deleted file mode 100644
index a8e3d3c766..0000000000
--- a/src/corelib/kernel/qeventdispatcher_blackberry.cpp
+++ /dev/null
@@ -1,502 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 - 2013 BlackBerry Limited. All rights reserved.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qeventdispatcher_blackberry_p.h"
-#include "qsocketnotifier.h"
-#include "qdebug.h"
-#include "qelapsedtimer.h"
-#include "private/qthread_p.h"
-
-#include <bps/bps.h>
-#include <bps/event.h>
-
-//#define QEVENTDISPATCHERBLACKBERRY_DEBUG
-
-#ifdef QEVENTDISPATCHERBLACKBERRY_DEBUG
-#include <QThread>
-#define qEventDispatcherDebug qDebug() << QThread::currentThread()
-#else
-#define qEventDispatcherDebug QT_NO_QDEBUG_MACRO()
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class BpsChannelScopeSwitcher
-{
-public:
- BpsChannelScopeSwitcher(int scopeChannel) : innerChannel(scopeChannel)
- {
- outerChannel = bps_channel_get_active();
- if (outerChannel != innerChannel)
- bps_channel_set_active(innerChannel);
- }
-
- ~BpsChannelScopeSwitcher()
- {
- if (outerChannel != innerChannel)
- bps_channel_set_active(outerChannel);
- }
-
-private:
- int innerChannel;
- int outerChannel;
-};
-
-class BBScopedLoopLevelCounter
-{
- QEventDispatcherBlackberryPrivate *d;
-
-public:
- inline BBScopedLoopLevelCounter(QEventDispatcherBlackberryPrivate *p)
- : d(p)
- { ++d->loop_level; }
-
- inline ~BBScopedLoopLevelCounter()
- { --d->loop_level; }
-};
-
-struct bpsIOHandlerData
-{
- bpsIOHandlerData()
- : count(0), readfds(0), writefds(0), exceptfds(0)
- {
- }
-
- int count;
- fd_set *readfds;
- fd_set *writefds;
- fd_set *exceptfds;
-};
-
-static int bpsUnblockDomain = -1;
-
-static int bpsIOHandler(int fd, int io_events, void *data)
-{
- qEventDispatcherDebug;
- // decode callback payload
- bpsIOHandlerData *ioData = static_cast<bpsIOHandlerData*>(data);
-
- // check if first file is ready
- bool firstReady = (ioData->count == 0);
-
- // update ready state of file
- if (io_events & BPS_IO_INPUT) {
- qEventDispatcherDebug << fd << "ready for Read";
- FD_SET(fd, ioData->readfds);
- ioData->count++;
- }
-
- if (io_events & BPS_IO_OUTPUT) {
- qEventDispatcherDebug << fd << "ready for Write";
- FD_SET(fd, ioData->writefds);
- ioData->count++;
- }
-
- if (io_events & BPS_IO_EXCEPT) {
- qEventDispatcherDebug << fd << "ready for Exception";
- FD_SET(fd, ioData->exceptfds);
- ioData->count++;
- }
-
- // force bps_get_event() to return immediately by posting an event to ourselves;
- // but this only needs to happen once if multiple files become ready at the same time
- if (firstReady) {
- qEventDispatcherDebug << "Sending bpsIOReadyDomain event";
- // create unblock event
- bps_event_t *event;
- int result = bps_event_create(&event, bpsUnblockDomain, 0, NULL, NULL);
- if (Q_UNLIKELY(result != BPS_SUCCESS)) {
- qWarning("QEventDispatcherBlackberry: bps_event_create failed");
- return BPS_FAILURE;
- }
-
- // post unblock event to our thread; in this callback the bps channel is
- // guaranteed to be the same that was active when bps_add_fd was called
- result = bps_push_event(event);
- if (Q_UNLIKELY(result != BPS_SUCCESS)) {
- qWarning("QEventDispatcherBlackberry: bps_push_event failed");
- bps_event_destroy(event);
- return BPS_FAILURE;
- }
- }
-
- return BPS_SUCCESS;
-}
-
-QEventDispatcherBlackberryPrivate::QEventDispatcherBlackberryPrivate()
- : loop_level(0)
- , ioData(new bpsIOHandlerData)
-{
- // prepare to use BPS
- int result = bps_initialize();
- if (Q_UNLIKELY(result != BPS_SUCCESS))
- qFatal("QEventDispatcherBlackberry: bps_initialize failed");
-
- bps_channel = bps_channel_get_active();
-
- if (bps_channel_create(&holding_channel, 0) != BPS_SUCCESS) {
- qWarning("QEventDispatcherBlackberry: bps_channel_create failed");
- holding_channel = -1;
- }
-
- // get domain for IO ready and wake up events - ignoring race condition here for now
- if (bpsUnblockDomain == -1) {
- bpsUnblockDomain = bps_register_domain();
- if (Q_UNLIKELY(bpsUnblockDomain == -1))
- qWarning("QEventDispatcherBlackberry: bps_register_domain failed");
- }
-}
-
-QEventDispatcherBlackberryPrivate::~QEventDispatcherBlackberryPrivate()
-{
- if ((holding_channel != -1) &&
- (bps_channel_destroy(holding_channel) != BPS_SUCCESS)) {
- qWarning("QEventDispatcherBlackberry: bps_channel_destroy failed");
- }
-
- // we're done using BPS
- bps_shutdown();
-}
-
-int QEventDispatcherBlackberryPrivate::initThreadWakeUp()
-{
- return -1; // no fd's used
-}
-
-int QEventDispatcherBlackberryPrivate::processThreadWakeUp(int nsel)
-{
- Q_UNUSED(nsel);
- return wakeUps.fetchAndStoreRelaxed(0);
-}
-
-/////////////////////////////////////////////////////////////////////////////
-
-QEventDispatcherBlackberry::QEventDispatcherBlackberry(QObject *parent)
- : QEventDispatcherUNIX(*new QEventDispatcherBlackberryPrivate, parent)
-{
-}
-
-QEventDispatcherBlackberry::QEventDispatcherBlackberry(QEventDispatcherBlackberryPrivate &dd, QObject *parent)
- : QEventDispatcherUNIX(dd, parent)
-{
-}
-
-QEventDispatcherBlackberry::~QEventDispatcherBlackberry()
-{
-}
-
-void QEventDispatcherBlackberry::registerSocketNotifier(QSocketNotifier *notifier)
-{
- Q_ASSERT(notifier);
- Q_D(QEventDispatcherBlackberry);
-
- int sockfd = notifier->socket();
- int type = notifier->type();
-
- qEventDispatcherDebug << "fd =" << sockfd;
-
- if (Q_UNLIKELY(sockfd >= FD_SETSIZE)) {
- qWarning() << "QEventDispatcherBlackberry: cannot register QSocketNotifier (fd too high)"
- << sockfd;
- return;
- }
-
- // Register the fd with bps
- BpsChannelScopeSwitcher channelSwitcher(d->bps_channel);
- int io_events = ioEvents(sockfd);
- if (io_events)
- bps_remove_fd(sockfd);
-
- switch (type) {
- case QSocketNotifier::Read:
- qEventDispatcherDebug << "Registering" << sockfd << "for Reads";
- io_events |= BPS_IO_INPUT;
- break;
- case QSocketNotifier::Write:
- qEventDispatcherDebug << "Registering" << sockfd << "for Writes";
- io_events |= BPS_IO_OUTPUT;
- break;
- case QSocketNotifier::Exception:
- default:
- qEventDispatcherDebug << "Registering" << sockfd << "for Exceptions";
- io_events |= BPS_IO_EXCEPT;
- break;
- }
-
- const int result = bps_add_fd(sockfd, io_events, &bpsIOHandler, d->ioData.data());
- if (Q_UNLIKELY(result != BPS_SUCCESS))
- qWarning() << "QEventDispatcherBlackberry: bps_add_fd failed";
-
- // Call the base Unix implementation. Needed to allow select() to be called correctly
- QEventDispatcherUNIX::registerSocketNotifier(notifier);
-}
-
-void QEventDispatcherBlackberry::unregisterSocketNotifier(QSocketNotifier *notifier)
-{
- Q_D(QEventDispatcherBlackberry);
-
- int sockfd = notifier->socket();
-
- qEventDispatcherDebug << "fd =" << sockfd;
-
- if (Q_UNLIKELY(sockfd >= FD_SETSIZE)) {
- qWarning() << "QEventDispatcherBlackberry: cannot unregister QSocketNotifier" << sockfd;
- return;
- }
-
- // Allow the base Unix implementation to unregister the fd too (before call to ioEvents()!)
- QEventDispatcherUNIX::unregisterSocketNotifier(notifier);
-
- // Unregister the fd with bps
- BpsChannelScopeSwitcher channelSwitcher(d->bps_channel);
- int result = bps_remove_fd(sockfd);
- if (Q_UNLIKELY(result != BPS_SUCCESS))
- qWarning() << "QEventDispatcherBlackberry: bps_remove_fd failed" << sockfd;
-
- const int io_events = ioEvents(sockfd);
- // if other socket notifier is watching sockfd, readd it
- if (io_events) {
- result = bps_add_fd(sockfd, io_events, &bpsIOHandler, d->ioData.data());
- if (Q_UNLIKELY(result != BPS_SUCCESS))
- qWarning("QEventDispatcherBlackberry: bps_add_fd error");
- }
-}
-
-static inline int timespecToMillisecs(const timespec &tv)
-{
- return (tv.tv_sec * 1000) + (tv.tv_nsec / 1000000);
-}
-
-static inline void destroyHeldBpsEvent(int holding_channel)
-{
- // Switch to the holding channel and use bps_get_event() to trigger its destruction. We
- // don't care about the return value from this call to bps_get_event().
- BpsChannelScopeSwitcher holdingChannelSwitcher(holding_channel);
- bps_event_t *held_event = 0;
- (void)bps_get_event(&held_event, 0);
- }
-
-int QEventDispatcherBlackberry::select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
- timespec *timeout)
-{
- Q_UNUSED(nfds);
- Q_D(QEventDispatcherBlackberry);
- const BBScopedLoopLevelCounter bbLoopCounter(d);
-
- BpsChannelScopeSwitcher channelSwitcher(d->bps_channel);
-
- // prepare file sets for bps callback
- d->ioData->count = 0;
- d->ioData->readfds = readfds;
- d->ioData->writefds = writefds;
- d->ioData->exceptfds = exceptfds;
-
- // reset all file sets
- if (readfds)
- FD_ZERO(readfds);
-
- if (writefds)
- FD_ZERO(writefds);
-
- if (exceptfds)
- FD_ZERO(exceptfds);
-
- bps_event_t *event = 0;
- unsigned int eventCount = 0;
-
- // If an event handler called through filterEvent() starts a nested event loop by creating a
- // new QEventLoop, we will recursively enter this function again. However, each time
- // bps_get_event() is called, it destroys the last event it handed out before returning the
- // next event. We don't want it to destroy the event that triggered the nested event loop,
- // since there may still be more handlers that need to get that event, once the nested event
- // loop is done and control returns to the outer event loop.
- //
- // So we move an event to a holding channel, which takes ownership of the event. Putting
- // the event on our own channel allows us to manage when it is destroyed, keeping it alive
- // until we know we are done with it. Each recursive call of this function needs to have
- // it's own holding channel, since a channel is a queue, not a stack.
- //
- // However, a recursive call into this function happens very rarely compared to the many
- // times this function is called. We don't want to create a holding channel for each time
- // this function is called, only when it is called recursively. Thus we have the instance
- // variable d->holding_channel to use in the common case. We keep track of recursive calls
- // with d->loop_level. If we are in a recursive call, then we create a new holding channel
- // for this run.
- int holding_channel = d->holding_channel;
- if ((d->loop_level > 1) &&
- Q_UNLIKELY(bps_channel_create(&holding_channel, 0) != BPS_SUCCESS)) {
- qWarning("QEventDispatcherBlackberry: bps_channel_create failed");
- holding_channel = -1;
- }
-
- // Convert timeout to milliseconds
- int timeoutTotal = -1;
- if (timeout)
- timeoutTotal = timespecToMillisecs(*timeout);
- int timeoutLeft = timeoutTotal;
- timespec startTime = qt_gettime();
-
- // This loop exists such that we can drain the bps event queue of all native events
- // more efficiently than if we were to return control to Qt after each event. This
- // is important for handling touch events which can come in rapidly.
- forever {
- // Only emit the awake() and aboutToBlock() signals in the second iteration. For the
- // first iteration, the UNIX event dispatcher will have taken care of that already.
- // Also native events are actually processed one loop iteration after they were
- // retrieved with bps_get_event().
-
- // Filtering the native event should happen between the awake() and aboutToBlock()
- // signal emissions. The calls awake() - filterNativeEvent() - aboutToBlock() -
- // bps_get_event() need not to be interrupted by a break or return statement.
- if (eventCount > 0) {
- if (event) {
- emit awake();
- filterNativeEvent(QByteArrayLiteral("bps_event_t"), static_cast<void*>(event), 0);
- emit aboutToBlock();
-
- if (Q_LIKELY(holding_channel != -1)) {
- // We are now done with this BPS event. Destroy it.
- destroyHeldBpsEvent(holding_channel);
- }
- }
-
- // Update the timeout
- // Clock source is monotonic, so we can recalculate how much timeout is left
- if (timeoutTotal != -1) {
- timespec t2 = qt_gettime();
- timeoutLeft = timeoutTotal
- - (timespecToMillisecs(t2) - timespecToMillisecs(startTime));
- if (timeoutLeft < 0)
- timeoutLeft = 0;
- }
-
- timespec tnext;
- if (d->timerList.timerWait(tnext)) {
- int timeoutNext = timespecToMillisecs(tnext);
- if (timeoutNext < timeoutLeft || timeoutTotal == -1) {
- timeoutTotal = timeoutLeft = timeoutNext;
- startTime = qt_gettime();
- }
- }
- }
-
- event = 0;
- { // We need to increase loop level in this scope,
- // because bps_get_event can also invoke callbacks
- QScopedLoopLevelCounter loopLevelCounter(d->threadData);
-
- // Wait for event or file to be ready
- const int result = bps_get_event(&event, timeoutLeft);
- if (Q_UNLIKELY(result != BPS_SUCCESS))
- qWarning("QEventDispatcherBlackberry: bps_get_event failed");
- }
-
- if (!event) // In case of !event, we break out of the loop to let Qt process the timers
- break; // (since timeout has expired) and socket notifiers that are now ready.
-
- if (bps_event_get_domain(event) == bpsUnblockDomain) {
- timeoutTotal = 0; // in order to immediately drain the event queue of native events
- event = 0; // (especially touch move events) we don't break out here
- } else {
- // Move the event to our holding channel so we can manage when it is destroyed.
- if (Q_LIKELY(holding_channel != 1) &&
- Q_UNLIKELY(bps_channel_push_event(holding_channel, event) != BPS_SUCCESS)) {
- qWarning("QEventDispatcherBlackberry: bps_channel_push_event failed");
- }
- }
-
- ++eventCount;
-
- // Make sure we are not trapped in this loop due to continuous native events
- // also we cannot recalculate the timeout without a monotonic clock as the time may have changed
- const unsigned int maximumEventCount = 12;
- if (Q_UNLIKELY((eventCount > maximumEventCount && timeoutLeft == 0)
- || !QElapsedTimer::isMonotonic())) {
- if (event) {
- filterNativeEvent(QByteArrayLiteral("bps_event_t"), static_cast<void*>(event), 0);
-
- if (Q_LIKELY(holding_channel != -1)) {
- // We are now done with this BPS event. Destroy it.
- destroyHeldBpsEvent(holding_channel);
- }
- }
- break;
- }
- }
-
- // If this was a recursive call into this function, a new holding channel was created for
- // this run, so destroy it now.
- if ((holding_channel != d->holding_channel) &&
- Q_LIKELY(holding_channel != -1) &&
- Q_UNLIKELY(bps_channel_destroy(holding_channel) != BPS_SUCCESS)) {
- qWarning("QEventDispatcherBlackberry: bps_channel_destroy failed");
- }
-
- // the number of bits set in the file sets
- return d->ioData->count;
-}
-
-void QEventDispatcherBlackberry::wakeUp()
-{
- Q_D(QEventDispatcherBlackberry);
- if (d->wakeUps.testAndSetAcquire(0, 1)) {
- bps_event_t *event;
- if (Q_LIKELY(bps_event_create(&event, bpsUnblockDomain, 0, 0, 0) == BPS_SUCCESS)) {
- if (Q_LIKELY(bps_channel_push_event(d->bps_channel, event) == BPS_SUCCESS))
- return;
- else
- bps_event_destroy(event);
- }
- qWarning("QEventDispatcherBlackberry: wakeUp failed");
- }
-}
-
-int QEventDispatcherBlackberry::ioEvents(int fd)
-{
- int io_events = 0;
-
- Q_D(QEventDispatcherBlackberry);
-
- if (FD_ISSET(fd, &d->sn_vec[0].enabled_fds))
- io_events |= BPS_IO_INPUT;
-
- if (FD_ISSET(fd, &d->sn_vec[1].enabled_fds))
- io_events |= BPS_IO_OUTPUT;
-
- if (FD_ISSET(fd, &d->sn_vec[2].enabled_fds))
- io_events |= BPS_IO_EXCEPT;
-
- return io_events;
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qeventdispatcher_blackberry_p.h b/src/corelib/kernel/qeventdispatcher_blackberry_p.h
deleted file mode 100644
index 7912ae83c5..0000000000
--- a/src/corelib/kernel/qeventdispatcher_blackberry_p.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 - 2013 BlackBerry Limited. All rights reserved.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QEVENTDISPATCHER_BLACKBERRY_P_H
-#define QEVENTDISPATCHER_BLACKBERRY_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "private/qeventdispatcher_unix_p.h"
-
-QT_BEGIN_NAMESPACE
-
-class QEventDispatcherBlackberryPrivate;
-
-class Q_CORE_EXPORT QEventDispatcherBlackberry : public QEventDispatcherUNIX
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QEventDispatcherBlackberry)
-
-public:
- explicit QEventDispatcherBlackberry(QObject *parent = 0);
- ~QEventDispatcherBlackberry();
-
- void registerSocketNotifier(QSocketNotifier *notifier);
- void unregisterSocketNotifier(QSocketNotifier *notifier);
-
- void wakeUp();
-
-protected:
- QEventDispatcherBlackberry(QEventDispatcherBlackberryPrivate &dd, QObject *parent = 0);
-
- int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
- timespec *timeout);
- int ioEvents(int fd);
-};
-
-struct bpsIOHandlerData;
-
-class Q_CORE_EXPORT QEventDispatcherBlackberryPrivate : public QEventDispatcherUNIXPrivate
-{
- Q_DECLARE_PUBLIC(QEventDispatcherBlackberry)
-
-public:
- QEventDispatcherBlackberryPrivate();
- ~QEventDispatcherBlackberryPrivate();
-
- int initThreadWakeUp();
- int processThreadWakeUp(int nsel);
-
- int bps_channel;
- int holding_channel;
- int loop_level;
- QScopedPointer<bpsIOHandlerData> ioData;
-};
-
-QT_END_NAMESPACE
-
-#endif // QEVENTDISPATCHER_BLACKBERRY_P_H
diff --git a/src/corelib/kernel/qeventdispatcher_unix.cpp b/src/corelib/kernel/qeventdispatcher_unix.cpp
index 155f7b7aa2..f8102195cc 100644
--- a/src/corelib/kernel/qeventdispatcher_unix.cpp
+++ b/src/corelib/kernel/qeventdispatcher_unix.cpp
@@ -68,7 +68,7 @@
QT_BEGIN_NAMESPACE
-#if defined(Q_OS_INTEGRITY) || defined(Q_OS_VXWORKS)
+#if defined(Q_OS_VXWORKS)
static void initThreadPipeFD(int fd)
{
int ret = fcntl(fd, F_SETFD, FD_CLOEXEC);
@@ -87,22 +87,11 @@ static void initThreadPipeFD(int fd)
QEventDispatcherUNIXPrivate::QEventDispatcherUNIXPrivate()
{
- extern Qt::HANDLE qt_application_thread_id;
- mainThread = (QThread::currentThreadId() == qt_application_thread_id);
bool pipefail = false;
// initialize the common parts of the event loop
-#if defined(Q_OS_NACL) || defined (Q_OS_BLACKBERRY)
+#if defined(Q_OS_NACL)
// do nothing.
-#elif defined(Q_OS_INTEGRITY)
- // INTEGRITY doesn't like a "select" on pipes, so use socketpair instead
- if (socketpair(AF_INET, SOCK_STREAM, 0, thread_pipe) == -1) {
- perror("QEventDispatcherUNIXPrivate(): Unable to create socket pair");
- pipefail = true;
- } else {
- initThreadPipeFD(thread_pipe[0]);
- initThreadPipeFD(thread_pipe[1]);
- }
#elif defined(Q_OS_VXWORKS)
char name[20];
qsnprintf(name, sizeof(name), "/pipe/qt_%08x", int(taskIdSelf()));
@@ -135,7 +124,7 @@ QEventDispatcherUNIXPrivate::QEventDispatcherUNIXPrivate()
}
#endif
- if (pipefail)
+ if (Q_UNLIKELY(pipefail))
qFatal("QEventDispatcherUNIXPrivate(): Can not continue without a thread pipe");
sn_highest = -1;
@@ -143,7 +132,7 @@ QEventDispatcherUNIXPrivate::QEventDispatcherUNIXPrivate()
QEventDispatcherUNIXPrivate::~QEventDispatcherUNIXPrivate()
{
-#if defined(Q_OS_NACL) || defined (Q_OS_BLACKBERRY)
+#if defined(Q_OS_NACL)
// do nothing.
#elif defined(Q_OS_VXWORKS)
close(thread_pipe[0]);
diff --git a/src/corelib/kernel/qeventdispatcher_unix_p.h b/src/corelib/kernel/qeventdispatcher_unix_p.h
index df080809b6..18a96c6e9a 100644
--- a/src/corelib/kernel/qeventdispatcher_unix_p.h
+++ b/src/corelib/kernel/qeventdispatcher_unix_p.h
@@ -86,12 +86,6 @@ public:
class QEventDispatcherUNIXPrivate;
-#ifdef Q_OS_QNX
-# define FINAL_EXCEPT_BLACKBERRY
-#else
-# define FINAL_EXCEPT_BLACKBERRY Q_DECL_FINAL
-#endif
-
class Q_CORE_EXPORT QEventDispatcherUNIX : public QAbstractEventDispatcher
{
Q_OBJECT
@@ -104,8 +98,8 @@ public:
bool processEvents(QEventLoop::ProcessEventsFlags flags) Q_DECL_OVERRIDE;
bool hasPendingEvents() Q_DECL_OVERRIDE;
- void registerSocketNotifier(QSocketNotifier *notifier) FINAL_EXCEPT_BLACKBERRY;
- void unregisterSocketNotifier(QSocketNotifier *notifier) FINAL_EXCEPT_BLACKBERRY;
+ void registerSocketNotifier(QSocketNotifier *notifier) Q_DECL_FINAL;
+ void unregisterSocketNotifier(QSocketNotifier *notifier) Q_DECL_FINAL;
void registerTimer(int timerId, int interval, Qt::TimerType timerType, QObject *object) Q_DECL_FINAL;
bool unregisterTimer(int timerId) Q_DECL_FINAL;
@@ -114,7 +108,7 @@ public:
int remainingTime(int timerId) Q_DECL_FINAL;
- void wakeUp() FINAL_EXCEPT_BLACKBERRY;
+ void wakeUp() Q_DECL_FINAL;
void interrupt() Q_DECL_FINAL;
void flush() Q_DECL_OVERRIDE;
@@ -140,10 +134,8 @@ public:
~QEventDispatcherUNIXPrivate();
int doSelect(QEventLoop::ProcessEventsFlags flags, timespec *timeout);
- virtual int initThreadWakeUp() FINAL_EXCEPT_BLACKBERRY;
- virtual int processThreadWakeUp(int nsel) FINAL_EXCEPT_BLACKBERRY;
-
- bool mainThread;
+ virtual int initThreadWakeUp() Q_DECL_FINAL;
+ virtual int processThreadWakeUp(int nsel) Q_DECL_FINAL;
// note for eventfd(7) support:
// if thread_pipe[1] is -1, then eventfd(7) is in use and is stored in thread_pipe[0]
@@ -163,8 +155,6 @@ public:
QAtomicInt interrupt; // bool
};
-#undef FINAL_EXCEPT_BLACKBERRY
-
QT_END_NAMESPACE
#endif // QEVENTDISPATCHER_UNIX_P_H
diff --git a/src/corelib/kernel/qeventdispatcher_win.cpp b/src/corelib/kernel/qeventdispatcher_win.cpp
index bb091e9f6d..62aaca88e9 100644
--- a/src/corelib/kernel/qeventdispatcher_win.cpp
+++ b/src/corelib/kernel/qeventdispatcher_win.cpp
@@ -667,7 +667,7 @@ void QEventDispatcherWin32::installMessageHook()
#ifndef Q_OS_WINCE
// setup GetMessage hook needed to drive our posted events
d->getMessageHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC) qt_GetMessageHook, NULL, GetCurrentThreadId());
- if (!d->getMessageHook) {
+ if (Q_UNLIKELY(!d->getMessageHook)) {
int errorCode = GetLastError();
qFatal("Qt: INTERNAL ERROR: failed to install GetMessage hook: %d, %s",
errorCode, qPrintable(qt_error_string(errorCode)));
diff --git a/src/corelib/kernel/qmetaobjectbuilder.cpp b/src/corelib/kernel/qmetaobjectbuilder.cpp
index 021e137273..c2302cbc5e 100644
--- a/src/corelib/kernel/qmetaobjectbuilder.cpp
+++ b/src/corelib/kernel/qmetaobjectbuilder.cpp
@@ -36,6 +36,7 @@
#include "qobject_p.h"
#include "qmetaobject_p.h"
+#include <vector>
#include <stdlib.h>
QT_BEGIN_NAMESPACE
@@ -88,7 +89,6 @@ static inline Q_DECL_UNUSED const QMetaObjectPrivate *priv(const uint* data)
class QMetaMethodBuilderPrivate
{
public:
- QMetaMethodBuilderPrivate() {} // for QVector, don't use
QMetaMethodBuilderPrivate
(QMetaMethod::MethodType _methodType,
const QByteArray& _signature,
@@ -145,7 +145,6 @@ Q_DECLARE_TYPEINFO(QMetaMethodBuilderPrivate, Q_MOVABLE_TYPE);
class QMetaPropertyBuilderPrivate
{
public:
- QMetaPropertyBuilderPrivate() {} // for QVector, don't use
QMetaPropertyBuilderPrivate
(const QByteArray& _name, const QByteArray& _type, int notifierIdx=-1,
int _revision = 0)
@@ -184,7 +183,6 @@ Q_DECLARE_TYPEINFO(QMetaPropertyBuilderPrivate, Q_MOVABLE_TYPE);
class QMetaEnumBuilderPrivate
{
public:
- QMetaEnumBuilderPrivate() {} // for QVector, don't use
QMetaEnumBuilderPrivate(const QByteArray& _name)
: name(_name), isFlag(false)
{
@@ -213,20 +211,20 @@ public:
QByteArray className;
const QMetaObject *superClass;
QMetaObjectBuilder::StaticMetacallFunction staticMetacallFunction;
- QVector<QMetaMethodBuilderPrivate> methods;
- QVector<QMetaMethodBuilderPrivate> constructors;
- QVector<QMetaPropertyBuilderPrivate> properties;
+ std::vector<QMetaMethodBuilderPrivate> methods;
+ std::vector<QMetaMethodBuilderPrivate> constructors;
+ std::vector<QMetaPropertyBuilderPrivate> properties;
QList<QByteArray> classInfoNames;
QList<QByteArray> classInfoValues;
- QVector<QMetaEnumBuilderPrivate> enumerators;
+ std::vector<QMetaEnumBuilderPrivate> enumerators;
QList<const QMetaObject *> relatedMetaObjects;
int flags;
};
bool QMetaObjectBuilderPrivate::hasRevisionedProperties() const
{
- for (int i = 0; i < properties.size(); ++i) {
- if (properties.at(i).revision)
+ for (const auto &property : properties) {
+ if (property.revision)
return true;
}
return false;
@@ -234,8 +232,8 @@ bool QMetaObjectBuilderPrivate::hasRevisionedProperties() const
bool QMetaObjectBuilderPrivate::hasRevisionedMethods() const
{
- for (int i = 0; i < methods.size(); ++i) {
- if (methods.at(i).revision)
+ for (const auto &method : methods) {
+ if (method.revision)
return true;
}
return false;
@@ -353,7 +351,7 @@ void QMetaObjectBuilder::setFlags(MetaObjectFlags flags)
*/
int QMetaObjectBuilder::methodCount() const
{
- return d->methods.size();
+ return int(d->methods.size());
}
/*!
@@ -363,7 +361,7 @@ int QMetaObjectBuilder::methodCount() const
*/
int QMetaObjectBuilder::constructorCount() const
{
- return d->constructors.size();
+ return int(d->constructors.size());
}
/*!
@@ -374,7 +372,7 @@ int QMetaObjectBuilder::constructorCount() const
*/
int QMetaObjectBuilder::propertyCount() const
{
- return d->properties.size();
+ return int(d->properties.size());
}
/*!
@@ -386,7 +384,7 @@ int QMetaObjectBuilder::propertyCount() const
*/
int QMetaObjectBuilder::enumeratorCount() const
{
- return d->enumerators.size();
+ return int(d->enumerators.size());
}
/*!
@@ -427,8 +425,8 @@ int QMetaObjectBuilder::relatedMetaObjectCount() const
*/
QMetaMethodBuilder QMetaObjectBuilder::addMethod(const QByteArray& signature)
{
- int index = d->methods.size();
- d->methods.append(QMetaMethodBuilderPrivate(QMetaMethod::Method, signature));
+ int index = int(d->methods.size());
+ d->methods.push_back(QMetaMethodBuilderPrivate(QMetaMethod::Method, signature));
return QMetaMethodBuilder(this, index);
}
@@ -444,8 +442,8 @@ QMetaMethodBuilder QMetaObjectBuilder::addMethod(const QByteArray& signature)
QMetaMethodBuilder QMetaObjectBuilder::addMethod
(const QByteArray& signature, const QByteArray& returnType)
{
- int index = d->methods.size();
- d->methods.append(QMetaMethodBuilderPrivate
+ int index = int(d->methods.size());
+ d->methods.push_back(QMetaMethodBuilderPrivate
(QMetaMethod::Method, signature, returnType));
return QMetaMethodBuilder(this, index);
}
@@ -491,8 +489,8 @@ QMetaMethodBuilder QMetaObjectBuilder::addMethod(const QMetaMethod& prototype)
*/
QMetaMethodBuilder QMetaObjectBuilder::addSlot(const QByteArray& signature)
{
- int index = d->methods.size();
- d->methods.append(QMetaMethodBuilderPrivate(QMetaMethod::Slot, signature));
+ int index = int(d->methods.size());
+ d->methods.push_back(QMetaMethodBuilderPrivate(QMetaMethod::Slot, signature));
return QMetaMethodBuilder(this, index);
}
@@ -506,8 +504,8 @@ QMetaMethodBuilder QMetaObjectBuilder::addSlot(const QByteArray& signature)
*/
QMetaMethodBuilder QMetaObjectBuilder::addSignal(const QByteArray& signature)
{
- int index = d->methods.size();
- d->methods.append(QMetaMethodBuilderPrivate
+ int index = int(d->methods.size());
+ d->methods.push_back(QMetaMethodBuilderPrivate
(QMetaMethod::Signal, signature, QByteArray("void"), QMetaMethod::Public));
return QMetaMethodBuilder(this, index);
}
@@ -523,9 +521,9 @@ QMetaMethodBuilder QMetaObjectBuilder::addSignal(const QByteArray& signature)
*/
QMetaMethodBuilder QMetaObjectBuilder::addConstructor(const QByteArray& signature)
{
- int index = d->constructors.size();
- d->constructors.append(QMetaMethodBuilderPrivate(QMetaMethod::Constructor, signature,
- /*returnType=*/QByteArray()));
+ int index = int(d->constructors.size());
+ d->constructors.push_back(QMetaMethodBuilderPrivate(QMetaMethod::Constructor, signature,
+ /*returnType=*/QByteArray()));
return QMetaMethodBuilder(this, -(index + 1));
}
@@ -564,8 +562,8 @@ QMetaMethodBuilder QMetaObjectBuilder::addConstructor(const QMetaMethod& prototy
QMetaPropertyBuilder QMetaObjectBuilder::addProperty
(const QByteArray& name, const QByteArray& type, int notifierId)
{
- int index = d->properties.size();
- d->properties.append(QMetaPropertyBuilderPrivate(name, type, notifierId));
+ int index = int(d->properties.size());
+ d->properties.push_back(QMetaPropertyBuilderPrivate(name, type, notifierId));
return QMetaPropertyBuilder(this, index);
}
@@ -615,8 +613,8 @@ QMetaPropertyBuilder QMetaObjectBuilder::addProperty(const QMetaProperty& protot
*/
QMetaEnumBuilder QMetaObjectBuilder::addEnumerator(const QByteArray& name)
{
- int index = d->enumerators.size();
- d->enumerators.append(QMetaEnumBuilderPrivate(name));
+ int index = int(d->enumerators.size());
+ d->enumerators.push_back(QMetaEnumBuilderPrivate(name));
return QMetaEnumBuilder(this, index);
}
@@ -762,7 +760,7 @@ void QMetaObjectBuilder::addMetaObject
*/
QMetaMethodBuilder QMetaObjectBuilder::method(int index) const
{
- if (index >= 0 && index < d->methods.size())
+ if (uint(index) < d->methods.size())
return QMetaMethodBuilder(this, index);
else
return QMetaMethodBuilder();
@@ -775,7 +773,7 @@ QMetaMethodBuilder QMetaObjectBuilder::method(int index) const
*/
QMetaMethodBuilder QMetaObjectBuilder::constructor(int index) const
{
- if (index >= 0 && index < d->constructors.size())
+ if (uint(index) < d->constructors.size())
return QMetaMethodBuilder(this, -(index + 1));
else
return QMetaMethodBuilder();
@@ -788,7 +786,7 @@ QMetaMethodBuilder QMetaObjectBuilder::constructor(int index) const
*/
QMetaPropertyBuilder QMetaObjectBuilder::property(int index) const
{
- if (index >= 0 && index < d->properties.size())
+ if (uint(index) < d->properties.size())
return QMetaPropertyBuilder(this, index);
else
return QMetaPropertyBuilder();
@@ -802,7 +800,7 @@ QMetaPropertyBuilder QMetaObjectBuilder::property(int index) const
*/
QMetaEnumBuilder QMetaObjectBuilder::enumerator(int index) const
{
- if (index >= 0 && index < d->enumerators.size())
+ if (uint(index) < d->enumerators.size())
return QMetaEnumBuilder(this, index);
else
return QMetaEnumBuilder();
@@ -866,15 +864,15 @@ QByteArray QMetaObjectBuilder::classInfoValue(int index) const
*/
void QMetaObjectBuilder::removeMethod(int index)
{
- if (index >= 0 && index < d->methods.size()) {
- d->methods.removeAt(index);
- for (int prop = 0; prop < d->properties.size(); ++prop) {
+ if (uint(index) < d->methods.size()) {
+ d->methods.erase(d->methods.begin() + index);
+ for (auto &property : d->properties) {
// Adjust the indices of property notify signal references.
- if (d->properties[prop].notifySignal == index) {
- d->properties[prop].notifySignal = -1;
- d->properties[prop].setFlag(Notify, false);
- } else if (d->properties[prop].notifySignal > index)
- (d->properties[prop].notifySignal)--;
+ if (property.notifySignal == index) {
+ property.notifySignal = -1;
+ property.setFlag(Notify, false);
+ } else if (property.notifySignal > index)
+ property.notifySignal--;
}
}
}
@@ -888,8 +886,8 @@ void QMetaObjectBuilder::removeMethod(int index)
*/
void QMetaObjectBuilder::removeConstructor(int index)
{
- if (index >= 0 && index < d->constructors.size())
- d->constructors.removeAt(index);
+ if (uint(index) < d->constructors.size())
+ d->constructors.erase(d->constructors.begin() + index);
}
/*!
@@ -900,8 +898,8 @@ void QMetaObjectBuilder::removeConstructor(int index)
*/
void QMetaObjectBuilder::removeProperty(int index)
{
- if (index >= 0 && index < d->properties.size())
- d->properties.removeAt(index);
+ if (uint(index) < d->properties.size())
+ d->properties.erase(d->properties.begin() + index);
}
/*!
@@ -913,8 +911,8 @@ void QMetaObjectBuilder::removeProperty(int index)
*/
void QMetaObjectBuilder::removeEnumerator(int index)
{
- if (index >= 0 && index < d->enumerators.size())
- d->enumerators.removeAt(index);
+ if (uint(index) < d->enumerators.size())
+ d->enumerators.erase(d->enumerators.begin() + index);
}
/*!
@@ -959,9 +957,9 @@ void QMetaObjectBuilder::removeRelatedMetaObject(int index)
int QMetaObjectBuilder::indexOfMethod(const QByteArray& signature)
{
QByteArray sig = QMetaObject::normalizedSignature(signature);
- for (int index = 0; index < d->methods.size(); ++index) {
- if (sig == d->methods[index].signature)
- return index;
+ for (const auto &method : d->methods) {
+ if (sig == method.signature)
+ return int(&method - &d->methods.front());
}
return -1;
}
@@ -975,10 +973,9 @@ int QMetaObjectBuilder::indexOfMethod(const QByteArray& signature)
int QMetaObjectBuilder::indexOfSignal(const QByteArray& signature)
{
QByteArray sig = QMetaObject::normalizedSignature(signature);
- for (int index = 0; index < d->methods.size(); ++index) {
- if (sig == d->methods[index].signature &&
- d->methods[index].methodType() == QMetaMethod::Signal)
- return index;
+ for (const auto &method : d->methods) {
+ if (method.methodType() == QMetaMethod::Signal && sig == method.signature)
+ return int(&method - &d->methods.front());
}
return -1;
}
@@ -992,10 +989,9 @@ int QMetaObjectBuilder::indexOfSignal(const QByteArray& signature)
int QMetaObjectBuilder::indexOfSlot(const QByteArray& signature)
{
QByteArray sig = QMetaObject::normalizedSignature(signature);
- for (int index = 0; index < d->methods.size(); ++index) {
- if (sig == d->methods[index].signature &&
- d->methods[index].methodType() == QMetaMethod::Slot)
- return index;
+ for (const auto &method : d->methods) {
+ if (method.methodType() == QMetaMethod::Slot && sig == method.signature)
+ return int(&method - &d->methods.front());
}
return -1;
}
@@ -1009,9 +1005,9 @@ int QMetaObjectBuilder::indexOfSlot(const QByteArray& signature)
int QMetaObjectBuilder::indexOfConstructor(const QByteArray& signature)
{
QByteArray sig = QMetaObject::normalizedSignature(signature);
- for (int index = 0; index < d->constructors.size(); ++index) {
- if (sig == d->constructors[index].signature)
- return index;
+ for (const auto &constructor : d->constructors) {
+ if (sig == constructor.signature)
+ return int(&constructor - &d->constructors.front());
}
return -1;
}
@@ -1024,9 +1020,9 @@ int QMetaObjectBuilder::indexOfConstructor(const QByteArray& signature)
*/
int QMetaObjectBuilder::indexOfProperty(const QByteArray& name)
{
- for (int index = 0; index < d->properties.size(); ++index) {
- if (name == d->properties[index].name)
- return index;
+ for (const auto &property : d->properties) {
+ if (name == property.name)
+ return int(&property - &d->properties.front());
}
return -1;
}
@@ -1039,9 +1035,9 @@ int QMetaObjectBuilder::indexOfProperty(const QByteArray& name)
*/
int QMetaObjectBuilder::indexOfEnumerator(const QByteArray& name)
{
- for (int index = 0; index < d->enumerators.size(); ++index) {
- if (name == d->enumerators[index].name)
- return index;
+ for (const auto &enumerator : d->enumerators) {
+ if (name == enumerator.name)
+ return int(&enumerator - &d->enumerators.front());
}
return -1;
}
@@ -1155,11 +1151,11 @@ void QMetaStringTable::writeBlob(char *out) const
// Returns the sum of all parameters (including return type) for the given
// \a methods. This is needed for calculating the size of the methods'
// parameter type/name meta-data.
-static int aggregateParameterCount(const QVector<QMetaMethodBuilderPrivate> &methods)
+static int aggregateParameterCount(const std::vector<QMetaMethodBuilderPrivate> &methods)
{
int sum = 0;
- for (int i = 0; i < methods.size(); ++i)
- sum += methods.at(i).parameterCount() + 1; // +1 for return type
+ for (const auto &method : methods)
+ sum += method.parameterCount() + 1; // +1 for return type
return sum;
}
@@ -1200,8 +1196,8 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
= reinterpret_cast<QMetaObjectPrivate *>(buf + size);
int pmetaSize = size;
dataIndex = MetaObjectPrivateFieldCount;
- for (index = 0; index < d->properties.size(); ++index) {
- if (d->properties[index].notifySignal != -1) {
+ for (const auto &property : d->properties) {
+ if (property.notifySignal != -1) {
hasNotifySignals = true;
break;
}
@@ -1209,8 +1205,8 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
int methodParametersDataSize =
((aggregateParameterCount(d->methods)
+ aggregateParameterCount(d->constructors)) * 2) // types and parameter names
- - d->methods.size() // return "parameters" don't have names
- - d->constructors.size(); // "this" parameters don't have names
+ - int(d->methods.size()) // return "parameters" don't have names
+ - int(d->constructors.size()); // "this" parameters don't have names
if (buf) {
Q_STATIC_ASSERT_X(QMetaObjectPrivate::OutputRevision == 7, "QMetaObjectBuilder should generate the same version as moc");
pmeta->revision = QMetaObjectPrivate::OutputRevision;
@@ -1222,51 +1218,49 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
pmeta->classInfoData = dataIndex;
dataIndex += 2 * d->classInfoNames.size();
- pmeta->methodCount = d->methods.size();
+ pmeta->methodCount = int(d->methods.size());
pmeta->methodData = dataIndex;
- dataIndex += 5 * d->methods.size();
+ dataIndex += 5 * int(d->methods.size());
if (hasRevisionedMethods)
- dataIndex += d->methods.size();
+ dataIndex += int(d->methods.size());
paramsIndex = dataIndex;
dataIndex += methodParametersDataSize;
- pmeta->propertyCount = d->properties.size();
+ pmeta->propertyCount = int(d->properties.size());
pmeta->propertyData = dataIndex;
- dataIndex += 3 * d->properties.size();
+ dataIndex += 3 * int(d->properties.size());
if (hasNotifySignals)
- dataIndex += d->properties.size();
+ dataIndex += int(d->properties.size());
if (hasRevisionedProperties)
- dataIndex += d->properties.size();
+ dataIndex += int(d->properties.size());
- pmeta->enumeratorCount = d->enumerators.size();
+ pmeta->enumeratorCount = int(d->enumerators.size());
pmeta->enumeratorData = dataIndex;
- dataIndex += 4 * d->enumerators.size();
+ dataIndex += 4 * int(d->enumerators.size());
- pmeta->constructorCount = d->constructors.size();
+ pmeta->constructorCount = int(d->constructors.size());
pmeta->constructorData = dataIndex;
- dataIndex += 5 * d->constructors.size();
+ dataIndex += 5 * int(d->constructors.size());
} else {
- dataIndex += 2 * d->classInfoNames.size();
- dataIndex += 5 * d->methods.size();
+ dataIndex += 2 * int(d->classInfoNames.size());
+ dataIndex += 5 * int(d->methods.size());
if (hasRevisionedMethods)
- dataIndex += d->methods.size();
+ dataIndex += int(d->methods.size());
paramsIndex = dataIndex;
dataIndex += methodParametersDataSize;
- dataIndex += 3 * d->properties.size();
+ dataIndex += 3 * int(d->properties.size());
if (hasNotifySignals)
- dataIndex += d->properties.size();
+ dataIndex += int(d->properties.size());
if (hasRevisionedProperties)
- dataIndex += d->properties.size();
- dataIndex += 4 * d->enumerators.size();
- dataIndex += 5 * d->constructors.size();
+ dataIndex += int(d->properties.size());
+ dataIndex += 4 * int(d->enumerators.size());
+ dataIndex += 5 * int(d->constructors.size());
}
// Allocate space for the enumerator key names and values.
enumIndex = dataIndex;
- for (index = 0; index < d->enumerators.size(); ++index) {
- QMetaEnumBuilderPrivate *enumerator = &(d->enumerators[index]);
- dataIndex += 2 * enumerator->keys.size();
- }
+ for (const auto &enumerator : d->enumerators)
+ dataIndex += 2 * enumerator.keys.size();
// Zero terminator at the end of the data offset table.
++dataIndex;
@@ -1305,44 +1299,41 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
// Output the methods in the class.
Q_ASSERT(!buf || dataIndex == pmeta->methodData);
- for (index = 0; index < d->methods.size(); ++index) {
- QMetaMethodBuilderPrivate *method = &(d->methods[index]);
- int name = strings.enter(method->name());
- int argc = method->parameterCount();
- int tag = strings.enter(method->tag);
- int attrs = method->attributes;
+ for (const auto &method : d->methods) {
+ int name = strings.enter(method.name());
+ int argc = method.parameterCount();
+ int tag = strings.enter(method.tag);
+ int attrs = method.attributes;
if (buf) {
data[dataIndex] = name;
data[dataIndex + 1] = argc;
data[dataIndex + 2] = paramsIndex;
data[dataIndex + 3] = tag;
data[dataIndex + 4] = attrs;
- if (method->methodType() == QMetaMethod::Signal)
+ if (method.methodType() == QMetaMethod::Signal)
pmeta->signalCount++;
}
dataIndex += 5;
paramsIndex += 1 + argc * 2;
}
if (hasRevisionedMethods) {
- for (index = 0; index < d->methods.size(); ++index) {
- QMetaMethodBuilderPrivate *method = &(d->methods[index]);
+ for (const auto &method : d->methods) {
if (buf)
- data[dataIndex] = method->revision;
+ data[dataIndex] = method.revision;
++dataIndex;
}
}
// Output the method parameters in the class.
- Q_ASSERT(!buf || dataIndex == pmeta->methodData + d->methods.size() * 5
- + (hasRevisionedMethods ? d->methods.size() : 0));
+ Q_ASSERT(!buf || dataIndex == pmeta->methodData + int(d->methods.size()) * 5
+ + (hasRevisionedMethods ? int(d->methods.size()) : 0));
for (int x = 0; x < 2; ++x) {
- QVector<QMetaMethodBuilderPrivate> &methods = (x == 0) ? d->methods : d->constructors;
- for (index = 0; index < methods.size(); ++index) {
- QMetaMethodBuilderPrivate *method = &(methods[index]);
- QList<QByteArray> paramTypeNames = method->parameterTypes();
+ const std::vector<QMetaMethodBuilderPrivate> &methods = (x == 0) ? d->methods : d->constructors;
+ for (const auto &method : methods) {
+ const QList<QByteArray> paramTypeNames = method.parameterTypes();
int paramCount = paramTypeNames.size();
for (int i = -1; i < paramCount; ++i) {
- const QByteArray &typeName = (i < 0) ? method->returnType : paramTypeNames.at(i);
+ const QByteArray &typeName = (i < 0) ? method.returnType : paramTypeNames.at(i);
int typeInfo;
if (QtPrivate::isBuiltinType(typeName))
typeInfo = QMetaType::type(typeName);
@@ -1353,7 +1344,7 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
++dataIndex;
}
- QList<QByteArray> paramNames = method->parameterNames;
+ QList<QByteArray> paramNames = method.parameterNames;
while (paramNames.size() < paramCount)
paramNames.append(QByteArray());
for (int i = 0; i < paramCount; ++i) {
@@ -1367,19 +1358,18 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
// Output the properties in the class.
Q_ASSERT(!buf || dataIndex == pmeta->propertyData);
- for (index = 0; index < d->properties.size(); ++index) {
- QMetaPropertyBuilderPrivate *prop = &(d->properties[index]);
- int name = strings.enter(prop->name);
+ for (const auto &prop : d->properties) {
+ int name = strings.enter(prop.name);
int typeInfo;
- if (QtPrivate::isBuiltinType(prop->type))
- typeInfo = QMetaType::type(prop->type);
+ if (QtPrivate::isBuiltinType(prop.type))
+ typeInfo = QMetaType::type(prop.type);
else
- typeInfo = IsUnresolvedType | strings.enter(prop->type);
+ typeInfo = IsUnresolvedType | strings.enter(prop.type);
- int flags = prop->flags;
+ int flags = prop.flags;
- if (!QtPrivate::isBuiltinType(prop->type))
+ if (!QtPrivate::isBuiltinType(prop.type))
flags |= EnumOrFlag;
if (buf) {
@@ -1390,11 +1380,10 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
dataIndex += 3;
}
if (hasNotifySignals) {
- for (index = 0; index < d->properties.size(); ++index) {
- QMetaPropertyBuilderPrivate *prop = &(d->properties[index]);
+ for (const auto &prop : d->properties) {
if (buf) {
- if (prop->notifySignal != -1)
- data[dataIndex] = prop->notifySignal;
+ if (prop.notifySignal != -1)
+ data[dataIndex] = prop.notifySignal;
else
data[dataIndex] = 0;
}
@@ -1402,21 +1391,19 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
}
}
if (hasRevisionedProperties) {
- for (index = 0; index < d->properties.size(); ++index) {
- QMetaPropertyBuilderPrivate *prop = &(d->properties[index]);
+ for (const auto &prop : d->properties) {
if (buf)
- data[dataIndex] = prop->revision;
+ data[dataIndex] = prop.revision;
++dataIndex;
}
}
// Output the enumerators in the class.
Q_ASSERT(!buf || dataIndex == pmeta->enumeratorData);
- for (index = 0; index < d->enumerators.size(); ++index) {
- QMetaEnumBuilderPrivate *enumerator = &(d->enumerators[index]);
- int name = strings.enter(enumerator->name);
- int isFlag = (int)(enumerator->isFlag);
- int count = enumerator->keys.size();
+ for (const auto &enumerator : d->enumerators) {
+ int name = strings.enter(enumerator.name);
+ int isFlag = (int)(enumerator.isFlag);
+ int count = enumerator.keys.size();
int enumOffset = enumIndex;
if (buf) {
data[dataIndex] = name;
@@ -1425,10 +1412,10 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
data[dataIndex + 3] = enumOffset;
}
for (int key = 0; key < count; ++key) {
- int keyIndex = strings.enter(enumerator->keys[key]);
+ int keyIndex = strings.enter(enumerator.keys[key]);
if (buf) {
data[enumOffset++] = keyIndex;
- data[enumOffset++] = enumerator->values[key];
+ data[enumOffset++] = enumerator.values[key];
}
}
dataIndex += 4;
@@ -1437,12 +1424,11 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
// Output the constructors in the class.
Q_ASSERT(!buf || dataIndex == pmeta->constructorData);
- for (index = 0; index < d->constructors.size(); ++index) {
- QMetaMethodBuilderPrivate *method = &(d->constructors[index]);
- int name = strings.enter(method->name());
- int argc = method->parameterCount();
- int tag = strings.enter(method->tag);
- int attrs = method->attributes;
+ for (const auto &ctor : d->constructors) {
+ int name = strings.enter(ctor.name());
+ int argc = ctor.parameterCount();
+ int tag = strings.enter(ctor.tag);
+ int attrs = ctor.attributes;
if (buf) {
data[dataIndex] = name;
data[dataIndex + 1] = argc;
@@ -1612,10 +1598,10 @@ void QMetaObjectBuilder::serialize(QDataStream& stream) const
// Write the counts for each type of class member.
stream << d->classInfoNames.size();
- stream << d->methods.size();
- stream << d->properties.size();
- stream << d->enumerators.size();
- stream << d->constructors.size();
+ stream << int(d->methods.size());
+ stream << int(d->properties.size());
+ stream << int(d->enumerators.size());
+ stream << int(d->constructors.size());
stream << d->relatedMetaObjects.size();
// Write the items of class information.
@@ -1625,45 +1611,41 @@ void QMetaObjectBuilder::serialize(QDataStream& stream) const
}
// Write the methods.
- for (index = 0; index < d->methods.size(); ++index) {
- const QMetaMethodBuilderPrivate *method = &(d->methods[index]);
- stream << method->signature;
- stream << method->returnType;
- stream << method->parameterNames;
- stream << method->tag;
- stream << method->attributes;
- if (method->revision)
- stream << method->revision;
+ for (const auto &method : d->methods) {
+ stream << method.signature;
+ stream << method.returnType;
+ stream << method.parameterNames;
+ stream << method.tag;
+ stream << method.attributes;
+ if (method.revision)
+ stream << method.revision;
}
// Write the properties.
- for (index = 0; index < d->properties.size(); ++index) {
- const QMetaPropertyBuilderPrivate *property = &(d->properties[index]);
- stream << property->name;
- stream << property->type;
- stream << property->flags;
- stream << property->notifySignal;
- if (property->revision)
- stream << property->revision;
+ for (const auto &property : d->properties) {
+ stream << property.name;
+ stream << property.type;
+ stream << property.flags;
+ stream << property.notifySignal;
+ if (property.revision)
+ stream << property.revision;
}
// Write the enumerators.
- for (index = 0; index < d->enumerators.size(); ++index) {
- const QMetaEnumBuilderPrivate *enumerator = &(d->enumerators[index]);
- stream << enumerator->name;
- stream << enumerator->isFlag;
- stream << enumerator->keys;
- stream << enumerator->values;
+ for (const auto &enumerator : d->enumerators) {
+ stream << enumerator.name;
+ stream << enumerator.isFlag;
+ stream << enumerator.keys;
+ stream << enumerator.values;
}
// Write the constructors.
- for (index = 0; index < d->constructors.size(); ++index) {
- const QMetaMethodBuilderPrivate *method = &(d->constructors[index]);
- stream << method->signature;
- stream << method->returnType;
- stream << method->parameterNames;
- stream << method->tag;
- stream << method->attributes;
+ for (const auto &ctor : d->constructors) {
+ stream << ctor.signature;
+ stream << ctor.returnType;
+ stream << ctor.parameterNames;
+ stream << ctor.tag;
+ stream << ctor.attributes;
}
// Write the related meta objects.
@@ -1770,14 +1752,14 @@ void QMetaObjectBuilder::deserialize
return;
stream >> name;
addMethod(name);
- QMetaMethodBuilderPrivate *method = &(d->methods[index]);
- stream >> method->returnType;
- stream >> method->parameterNames;
- stream >> method->tag;
- stream >> method->attributes;
- if (method->attributes & MethodRevisioned)
- stream >> method->revision;
- if (method->methodType() == QMetaMethod::Constructor) {
+ QMetaMethodBuilderPrivate &method = d->methods[index];
+ stream >> method.returnType;
+ stream >> method.parameterNames;
+ stream >> method.tag;
+ stream >> method.attributes;
+ if (method.attributes & MethodRevisioned)
+ stream >> method.revision;
+ if (method.methodType() == QMetaMethod::Constructor) {
// Cannot add a constructor in this set of methods.
stream.setStatus(QDataStream::ReadCorruptData);
return;
@@ -1792,23 +1774,23 @@ void QMetaObjectBuilder::deserialize
stream >> name;
stream >> type;
addProperty(name, type);
- QMetaPropertyBuilderPrivate *property = &(d->properties[index]);
- stream >> property->flags;
- stream >> property->notifySignal;
- if (property->notifySignal < -1 ||
- property->notifySignal >= d->methods.size()) {
+ QMetaPropertyBuilderPrivate &property = d->properties[index];
+ stream >> property.flags;
+ stream >> property.notifySignal;
+ if (property.notifySignal < -1 ||
+ property.notifySignal >= int(d->methods.size())) {
// Notify signal method index is out of range.
stream.setStatus(QDataStream::ReadCorruptData);
return;
}
- if (property->notifySignal >= 0 &&
- d->methods[property->notifySignal].methodType() != QMetaMethod::Signal) {
+ if (property.notifySignal >= 0 &&
+ d->methods[property.notifySignal].methodType() != QMetaMethod::Signal) {
// Notify signal method index does not refer to a signal.
stream.setStatus(QDataStream::ReadCorruptData);
return;
}
- if (property->flags & Revisioned)
- stream >> property->revision;
+ if (property.flags & Revisioned)
+ stream >> property.revision;
}
// Read the enumerators.
@@ -1817,11 +1799,11 @@ void QMetaObjectBuilder::deserialize
return;
stream >> name;
addEnumerator(name);
- QMetaEnumBuilderPrivate *enumerator = &(d->enumerators[index]);
- stream >> enumerator->isFlag;
- stream >> enumerator->keys;
- stream >> enumerator->values;
- if (enumerator->keys.size() != enumerator->values.size()) {
+ QMetaEnumBuilderPrivate &enumerator = d->enumerators[index];
+ stream >> enumerator.isFlag;
+ stream >> enumerator.keys;
+ stream >> enumerator.values;
+ if (enumerator.keys.size() != enumerator.values.size()) {
// Mismatch between number of keys and number of values.
stream.setStatus(QDataStream::ReadCorruptData);
return;
@@ -1834,12 +1816,12 @@ void QMetaObjectBuilder::deserialize
return;
stream >> name;
addConstructor(name);
- QMetaMethodBuilderPrivate *method = &(d->constructors[index]);
- stream >> method->returnType;
- stream >> method->parameterNames;
- stream >> method->tag;
- stream >> method->attributes;
- if (method->methodType() != QMetaMethod::Constructor) {
+ QMetaMethodBuilderPrivate &method = d->constructors[index];
+ stream >> method.returnType;
+ stream >> method.parameterNames;
+ stream >> method.tag;
+ stream >> method.attributes;
+ if (method.methodType() != QMetaMethod::Constructor) {
// The type must be Constructor.
stream.setStatus(QDataStream::ReadCorruptData);
return;
@@ -1875,9 +1857,9 @@ void QMetaObjectBuilder::deserialize
QMetaMethodBuilderPrivate *QMetaMethodBuilder::d_func() const
{
// Positive indices indicate methods, negative indices indicate constructors.
- if (_mobj && _index >= 0 && _index < _mobj->d->methods.size())
+ if (_mobj && _index >= 0 && _index < int(_mobj->d->methods.size()))
return &(_mobj->d->methods[_index]);
- else if (_mobj && -_index >= 1 && -_index <= _mobj->d->constructors.size())
+ else if (_mobj && -_index >= 1 && -_index <= int(_mobj->d->constructors.size()))
return &(_mobj->d->constructors[(-_index) - 1]);
else
return 0;
@@ -2116,7 +2098,7 @@ void QMetaMethodBuilder::setRevision(int revision)
QMetaPropertyBuilderPrivate *QMetaPropertyBuilder::d_func() const
{
- if (_mobj && _index >= 0 && _index < _mobj->d->properties.size())
+ if (_mobj && _index >= 0 && _index < int(_mobj->d->properties.size()))
return &(_mobj->d->properties[_index]);
else
return 0;
@@ -2588,7 +2570,7 @@ void QMetaPropertyBuilder::setRevision(int revision)
QMetaEnumBuilderPrivate *QMetaEnumBuilder::d_func() const
{
- if (_mobj && _index >= 0 && _index < _mobj->d->enumerators.size())
+ if (_mobj && _index >= 0 && _index < int(_mobj->d->enumerators.size()))
return &(_mobj->d->enumerators[_index]);
else
return 0;
diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp
index e6d745bb74..c0caa3cca5 100644
--- a/src/corelib/kernel/qmetatype.cpp
+++ b/src/corelib/kernel/qmetatype.cpp
@@ -1074,7 +1074,7 @@ int QMetaType::registerNormalizedType(const NS(QByteArray) &normalizedTypeName,
previousFlags = QMetaType::typeFlags(idx);
}
- if (previousSize != size) {
+ if (Q_UNLIKELY(previousSize != size)) {
qFatal("QMetaType::registerType: Binary compatibility break "
"-- Size mismatch for type '%s' [%i]. Previously registered "
"size %i, now registering size %i.",
@@ -1084,7 +1084,7 @@ int QMetaType::registerNormalizedType(const NS(QByteArray) &normalizedTypeName,
// these flags cannot change in a binary compatible way:
const int binaryCompatibilityFlag = PointerToQObject | IsEnumeration | SharedPointerToQObject
| WeakPointerToQObject | TrackingPointerToQObject;
- if ((previousFlags ^ flags) & binaryCompatibilityFlag) {
+ if (Q_UNLIKELY((previousFlags ^ flags) & binaryCompatibilityFlag)) {
const char *msg = "QMetaType::registerType: Binary compatibility break. "
"\nType flags for type '%s' [%i] don't match. Previously "
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index c316ebc69f..a4531e29eb 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -203,7 +203,7 @@ QObjectPrivate::QObjectPrivate(int version)
// This allows incompatible versions to be loaded, possibly for testing.
Q_UNUSED(version);
#else
- if (version != QObjectPrivateVersion)
+ if (Q_UNLIKELY(version != QObjectPrivateVersion))
qFatal("Cannot mix incompatible Qt library (version 0x%x) with this library (version 0x%x)",
version, QObjectPrivateVersion);
#endif
diff --git a/src/corelib/kernel/qobject.h b/src/corelib/kernel/qobject.h
index 64c5b58fd4..118316484b 100644
--- a/src/corelib/kernel/qobject.h
+++ b/src/corelib/kernel/qobject.h
@@ -293,7 +293,7 @@ public:
connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, const QObject *context, Func2 slot,
Qt::ConnectionType type = Qt::AutoConnection)
{
-#if defined (Q_COMPILER_DECLTYPE) && defined (Q_COMPILER_VARIADIC_TEMPLATES)
+#if defined (Q_COMPILER_VARIADIC_TEMPLATES)
typedef QtPrivate::FunctionPointer<Func1> SignalType;
const int FunctorArgumentCount = QtPrivate::ComputeFunctorArgumentCount<Func2 , typename SignalType::Arguments>::Value;
@@ -313,15 +313,7 @@ public:
Functors with overloaded or templated operator() are only supported if the compiler supports
C++11 variadic templates
*/
-#ifndef Q_COMPILER_DECLTYPE //Workaround the lack of decltype using another function as indirection
- return connect_functor(sender, signal, context, slot, &Func2::operator(), type); }
- template <typename Func1, typename Func2, typename Func2Operator>
- static inline QMetaObject::Connection connect_functor(const QObject *sender, Func1 signal, const QObject *context,
- Func2 slot, Func2Operator, Qt::ConnectionType type) {
- typedef QtPrivate::FunctionPointer<Func2Operator> SlotType ;
-#else
typedef QtPrivate::FunctionPointer<decltype(&Func2::operator())> SlotType ;
-#endif
typedef QtPrivate::FunctionPointer<Func1> SignalType;
typedef typename SlotType::ReturnType SlotReturnType;
const int SlotArgumentCount = SlotType::ArgumentCount;
diff --git a/src/corelib/kernel/qobjectdefs_impl.h b/src/corelib/kernel/qobjectdefs_impl.h
index d5574a4dd1..dc445a426d 100644
--- a/src/corelib/kernel/qobjectdefs_impl.h
+++ b/src/corelib/kernel/qobjectdefs_impl.h
@@ -593,7 +593,7 @@ namespace QtPrivate {
};
#endif
-#if defined(Q_COMPILER_DECLTYPE) && defined(Q_COMPILER_VARIADIC_TEMPLATES)
+#if defined(Q_COMPILER_VARIADIC_TEMPLATES)
/*
Find the maximum number of arguments a functor object can take and be still compatible with
the arguments from the signal.
diff --git a/src/corelib/kernel/qpoll.cpp b/src/corelib/kernel/qpoll.cpp
new file mode 100644
index 0000000000..b152518c00
--- /dev/null
+++ b/src/corelib/kernel/qpoll.cpp
@@ -0,0 +1,220 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qcore_unix_p.h"
+
+QT_BEGIN_NAMESPACE
+
+#define QT_POLL_READ_MASK (POLLIN | POLLRDNORM)
+#define QT_POLL_WRITE_MASK (POLLOUT | POLLWRNORM | POLLWRBAND)
+#define QT_POLL_EXCEPT_MASK (POLLPRI | POLLRDBAND)
+#define QT_POLL_ERROR_MASK (POLLERR | POLLNVAL)
+#define QT_POLL_EVENTS_MASK (QT_POLL_READ_MASK | QT_POLL_WRITE_MASK | QT_POLL_EXCEPT_MASK)
+
+static inline int qt_poll_prepare(struct pollfd *fds, nfds_t nfds,
+ fd_set *read_fds, fd_set *write_fds, fd_set *except_fds)
+{
+ int max_fd = -1;
+
+ FD_ZERO(read_fds);
+ FD_ZERO(write_fds);
+ FD_ZERO(except_fds);
+
+ for (nfds_t i = 0; i < nfds; i++) {
+ if (fds[i].fd >= FD_SETSIZE) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if ((fds[i].fd < 0) || (fds[i].revents & QT_POLL_ERROR_MASK))
+ continue;
+
+ if (fds[i].events & QT_POLL_READ_MASK)
+ FD_SET(fds[i].fd, read_fds);
+
+ if (fds[i].events & QT_POLL_WRITE_MASK)
+ FD_SET(fds[i].fd, write_fds);
+
+ if (fds[i].events & QT_POLL_EXCEPT_MASK)
+ FD_SET(fds[i].fd, except_fds);
+
+ if (fds[i].events & QT_POLL_EVENTS_MASK)
+ max_fd = qMax(max_fd, fds[i].fd);
+ }
+
+ return max_fd + 1;
+}
+
+static inline void qt_poll_examine_ready_read(struct pollfd &pfd)
+{
+ int res;
+ char data;
+
+ EINTR_LOOP(res, ::recv(pfd.fd, &data, sizeof(data), MSG_PEEK));
+ const int error = (res < 0) ? errno : 0;
+
+ if (res == 0) {
+ pfd.revents |= POLLHUP;
+ } else if (res > 0 || error == ENOTSOCK || error == ENOTCONN) {
+ pfd.revents |= QT_POLL_READ_MASK & pfd.events;
+ } else {
+ switch (error) {
+ case ESHUTDOWN:
+ case ECONNRESET:
+ case ECONNABORTED:
+ case ENETRESET:
+ pfd.revents |= POLLHUP;
+ break;
+ default:
+ pfd.revents |= POLLERR;
+ break;
+ }
+ }
+}
+
+static inline int qt_poll_sweep(struct pollfd *fds, nfds_t nfds,
+ fd_set *read_fds, fd_set *write_fds, fd_set *except_fds)
+{
+ int result = 0;
+
+ for (nfds_t i = 0; i < nfds; i++) {
+ if (fds[i].fd < 0)
+ continue;
+
+ if (FD_ISSET(fds[i].fd, read_fds))
+ qt_poll_examine_ready_read(fds[i]);
+
+ if (FD_ISSET(fds[i].fd, write_fds))
+ fds[i].revents |= QT_POLL_WRITE_MASK & fds[i].events;
+
+ if (FD_ISSET(fds[i].fd, except_fds))
+ fds[i].revents |= QT_POLL_EXCEPT_MASK & fds[i].events;
+
+ if (fds[i].revents != 0)
+ result++;
+ }
+
+ return result;
+}
+
+static inline bool qt_poll_is_bad_fd(int fd)
+{
+ int ret;
+ EINTR_LOOP(ret, fcntl(fd, F_GETFD));
+ return (ret == -1 && errno == EBADF);
+}
+
+static inline int qt_poll_mark_bad_fds(struct pollfd *fds, const nfds_t nfds)
+{
+ int n_marked = 0;
+
+ for (nfds_t i = 0; i < nfds; i++) {
+ if (fds[i].fd < 0)
+ continue;
+
+ if (fds[i].revents & QT_POLL_ERROR_MASK)
+ continue;
+
+ if (qt_poll_is_bad_fd(fds[i].fd)) {
+ fds[i].revents |= POLLNVAL;
+ n_marked++;
+ }
+ }
+
+ return n_marked;
+}
+
+int qt_poll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout_ts)
+{
+ if (!fds && nfds) {
+ errno = EFAULT;
+ return -1;
+ }
+
+ fd_set read_fds, write_fds, except_fds;
+ struct timeval tv, *ptv = 0;
+
+ if (timeout_ts) {
+ tv = timespecToTimeval(*timeout_ts);
+ ptv = &tv;
+ }
+
+ int n_bad_fds = 0;
+
+ for (nfds_t i = 0; i < nfds; i++) {
+ fds[i].revents = 0;
+
+ if (fds[i].fd < 0)
+ continue;
+
+ if (fds[i].events & QT_POLL_EVENTS_MASK)
+ continue;
+
+ if (qt_poll_is_bad_fd(fds[i].fd)) {
+ // Mark bad file descriptors that have no event flags set
+ // here, as we won't be passing them to select below and therefore
+ // need to do the check ourselves
+ fds[i].revents = POLLNVAL;
+ n_bad_fds++;
+ }
+ }
+
+ forever {
+ const int max_fd = qt_poll_prepare(fds, nfds, &read_fds, &write_fds, &except_fds);
+
+ if (max_fd < 0)
+ return max_fd;
+
+ if (n_bad_fds > 0) {
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+ ptv = &tv;
+ }
+
+ const int ret = ::select(max_fd, &read_fds, &write_fds, &except_fds, ptv);
+
+ if (ret == 0)
+ return n_bad_fds;
+
+ if (ret > 0)
+ return qt_poll_sweep(fds, nfds, &read_fds, &write_fds, &except_fds);
+
+ if (errno != EBADF)
+ return -1;
+
+ // We have at least one bad file descriptor that we waited on, find out which and try again
+ n_bad_fds += qt_poll_mark_bad_fds(fds, nfds);
+ }
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qpoll_p.h b/src/corelib/kernel/qpoll_p.h
new file mode 100644
index 0000000000..497058ad6b
--- /dev/null
+++ b/src/corelib/kernel/qpoll_p.h
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPOLL_P_H
+#define QPOLL_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of Qt code on Unix. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qglobal.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifdef QT_NO_NATIVE_POLL
+
+#include <unistd.h>
+#include <time.h>
+
+struct pollfd {
+ int fd;
+ short events, revents;
+};
+
+typedef unsigned long int nfds_t;
+
+#define POLLIN 0x001
+#define POLLPRI 0x002
+#define POLLOUT 0x004
+#define POLLERR 0x008
+#define POLLHUP 0x010
+#define POLLNVAL 0x020
+#define POLLRDNORM 0x040
+#define POLLRDBAND 0x080
+#define POLLWRNORM 0x100
+#define POLLWRBAND 0x200
+
+#endif // QT_NO_NATIVE_POLL
+
+QT_END_NAMESPACE
+
+#endif // QPOLL_P_H
diff --git a/src/corelib/kernel/qsharedmemory_p.h b/src/corelib/kernel/qsharedmemory_p.h
index 2bcc0d4f6a..149bc85a15 100644
--- a/src/corelib/kernel/qsharedmemory_p.h
+++ b/src/corelib/kernel/qsharedmemory_p.h
@@ -61,7 +61,7 @@ namespace QSharedMemoryPrivate
#include "qsystemsemaphore.h"
#include "private/qobject_p.h"
-#if !defined(Q_OS_WIN) && !defined(Q_OS_ANDROID)
+#if !defined(Q_OS_WIN) && !defined(Q_OS_ANDROID) && !defined(Q_OS_INTEGRITY)
# include <sys/sem.h>
#endif
diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp
index fdcbdb1c45..1e755cf5d8 100644
--- a/src/corelib/kernel/qvariant.cpp
+++ b/src/corelib/kernel/qvariant.cpp
@@ -56,6 +56,7 @@
#include "qbytearraylist.h"
#endif
#include "private/qvariant_p.h"
+#include "private/qlocale_p.h"
#include "qmetatype_p.h"
#include <qmetaobject.h>
@@ -71,18 +72,6 @@
QT_BEGIN_NAMESPACE
-#ifndef DBL_MANT_DIG
-# define DBL_MANT_DIG 53
-#endif
-#ifndef FLT_MANT_DIG
-# define FLT_MANT_DIG 24
-#endif
-
-const int log10_2_10000 = 30103; // log10(2) * 100000
-// same as C++11 std::numeric_limits<T>::max_digits10
-const int max_digits10_double = (DBL_MANT_DIG * log10_2_10000) / 100000 + 2;
-const int max_digits10_float = (FLT_MANT_DIG * log10_2_10000) / 100000 + 2;
-
namespace {
class HandlersManager
{
@@ -433,10 +422,10 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
*str = QString::number(qMetaTypeUNumber(d));
break;
case QMetaType::Float:
- *str = QString::number(d->data.f, 'g', max_digits10_float);
+ *str = QString::number(d->data.f, 'g', QLocale::FloatingPointShortest);
break;
case QVariant::Double:
- *str = QString::number(d->data.d, 'g', max_digits10_double);
+ *str = QString::number(d->data.d, 'g', QLocale::FloatingPointShortest);
break;
#if !defined(QT_NO_DATESTRING)
case QVariant::Date:
@@ -625,10 +614,10 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
*ba = v_cast<QString>(d)->toUtf8();
break;
case QVariant::Double:
- *ba = QByteArray::number(d->data.d, 'g', max_digits10_double);
+ *ba = QByteArray::number(d->data.d, 'g', QLocale::FloatingPointShortest);
break;
case QMetaType::Float:
- *ba = QByteArray::number(d->data.f, 'g', max_digits10_float);
+ *ba = QByteArray::number(d->data.f, 'g', QLocale::FloatingPointShortest);
break;
case QMetaType::Char:
case QMetaType::SChar:
diff --git a/src/corelib/kernel/qvariant_p.h b/src/corelib/kernel/qvariant_p.h
index d84d702982..986eb2c467 100644
--- a/src/corelib/kernel/qvariant_p.h
+++ b/src/corelib/kernel/qvariant_p.h
@@ -202,7 +202,6 @@ class QVariantIsNull
/// \internal
/// This class checks if a type T has method called isNull. Result is kept in the Value property
/// TODO Can we somehow generalize it? A macro version?
-#if defined(Q_COMPILER_DECLTYPE) // C++11 version
template<typename T>
class HasIsNullMethod {
struct Yes { char unused[1]; };
@@ -214,44 +213,6 @@ class QVariantIsNull
public:
static const bool Value = (sizeof(test<T>(0)) == sizeof(Yes));
};
-#elif defined(Q_CC_MSVC) && _MSC_VER >= 1400 && !defined(Q_CC_INTEL) // MSVC 2005, 2008 version: no decltype, but 'sealed' classes (>=2010 has decltype)
- template<typename T>
- class HasIsNullMethod {
- struct Yes { char unused[1]; };
- struct No { char unused[2]; };
- Q_STATIC_ASSERT(sizeof(Yes) != sizeof(No));
-
- template<class C> static Yes test(char (*)[(&C::isNull == 0) + 1]);
- template<class C> static No test(...);
- public:
- static const bool Value = (sizeof(test<T>(0)) == sizeof(Yes));
- };
-#else // C++98 version (doesn't work for final classes)
- template<typename T, bool IsClass = QTypeInfo<T>::isComplex>
- class HasIsNullMethod
- {
- struct Yes { char unused[1]; };
- struct No { char unused[2]; };
- Q_STATIC_ASSERT(sizeof(Yes) != sizeof(No));
-
- struct FallbackMixin { bool isNull() const; };
- struct Derived : public T, public FallbackMixin {}; // <- doesn't work for final classes
- template<class C, C> struct TypeCheck {};
-
- template<class C> static Yes test(...);
- template<class C> static No test(TypeCheck<bool (FallbackMixin::*)() const, &C::isNull> *);
- public:
- static const bool Value = (sizeof(test<Derived>(0)) == sizeof(Yes));
- };
-
- // We need to exclude primitive types as they won't compile with HasIsNullMethod::Check classes
- // anyway it is not a problem as the types do not have isNull method.
- template<typename T>
- class HasIsNullMethod<T, /* IsClass = */ false> {
- public:
- static const bool Value = false;
- };
-#endif
// TODO This part should go to autotests during HasIsNullMethod generalization.
Q_STATIC_ASSERT(!HasIsNullMethod<bool>::Value);
diff --git a/src/corelib/plugin/plugin.pri b/src/corelib/plugin/plugin.pri
index 8b64f93467..9dc60c5d39 100644
--- a/src/corelib/plugin/plugin.pri
+++ b/src/corelib/plugin/plugin.pri
@@ -35,4 +35,8 @@ integrity {
SOURCES += plugin/qlibrary_unix.cpp
}
+darwin {
+ OBJECTIVE_SOURCES += plugin/quuid_darwin.mm
+}
+
LIBS_PRIVATE += $$QMAKE_LIBS_DYNLOAD
diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp
index fb5b895851..7556f5caf8 100644
--- a/src/corelib/plugin/qfactoryloader.cpp
+++ b/src/corelib/plugin/qfactoryloader.cpp
@@ -33,7 +33,7 @@
#include "qfactoryloader_p.h"
-#ifndef QT_NO_LIBRARY
+#ifndef QT_NO_QOBJECT
#include "qfactoryinterface.h"
#include "qmap.h"
#include <qdir.h>
@@ -50,10 +50,6 @@
QT_BEGIN_NAMESPACE
-Q_GLOBAL_STATIC(QList<QFactoryLoader *>, qt_factory_loaders)
-
-Q_GLOBAL_STATIC_WITH_ARGS(QMutex, qt_factoryloader_mutex, (QMutex::Recursive))
-
namespace {
// avoid duplicate QStringLiteral data:
@@ -71,18 +67,24 @@ class QFactoryLoaderPrivate : public QObjectPrivate
Q_DECLARE_PUBLIC(QFactoryLoader)
public:
QFactoryLoaderPrivate(){}
+ QByteArray iid;
+#ifndef QT_NO_LIBRARY
~QFactoryLoaderPrivate();
mutable QMutex mutex;
- QByteArray iid;
QList<QLibraryPrivate*> libraryList;
QMap<QString,QLibraryPrivate*> keyMap;
QString suffix;
Qt::CaseSensitivity cs;
QStringList loadedPaths;
-
- void unloadPath(const QString &path);
+#endif
};
+#ifndef QT_NO_LIBRARY
+
+Q_GLOBAL_STATIC(QList<QFactoryLoader *>, qt_factory_loaders)
+
+Q_GLOBAL_STATIC_WITH_ARGS(QMutex, qt_factoryloader_mutex, (QMutex::Recursive))
+
QFactoryLoaderPrivate::~QFactoryLoaderPrivate()
{
for (int i = 0; i < libraryList.count(); ++i) {
@@ -92,25 +94,6 @@ QFactoryLoaderPrivate::~QFactoryLoaderPrivate()
}
}
-QFactoryLoader::QFactoryLoader(const char *iid,
- const QString &suffix,
- Qt::CaseSensitivity cs)
- : QObject(*new QFactoryLoaderPrivate)
-{
- moveToThread(QCoreApplicationPrivate::mainThread());
- Q_D(QFactoryLoader);
- d->iid = iid;
- d->cs = cs;
- d->suffix = suffix;
-
-
- QMutexLocker locker(qt_factoryloader_mutex());
- update();
- qt_factory_loaders()->append(this);
-}
-
-
-
void QFactoryLoader::update()
{
#ifdef QT_SHARED
@@ -231,13 +214,56 @@ QFactoryLoader::~QFactoryLoader()
qt_factory_loaders()->removeAll(this);
}
+#if defined(Q_OS_UNIX) && !defined (Q_OS_MAC)
+QLibraryPrivate *QFactoryLoader::library(const QString &key) const
+{
+ Q_D(const QFactoryLoader);
+ return d->keyMap.value(d->cs ? key : key.toLower());
+}
+#endif
+
+void QFactoryLoader::refreshAll()
+{
+ QMutexLocker locker(qt_factoryloader_mutex());
+ QList<QFactoryLoader *> *loaders = qt_factory_loaders();
+ for (QList<QFactoryLoader *>::const_iterator it = loaders->constBegin();
+ it != loaders->constEnd(); ++it) {
+ (*it)->update();
+ }
+}
+
+#endif // QT_NO_LIBRARY
+
+QFactoryLoader::QFactoryLoader(const char *iid,
+ const QString &suffix,
+ Qt::CaseSensitivity cs)
+ : QObject(*new QFactoryLoaderPrivate)
+{
+ moveToThread(QCoreApplicationPrivate::mainThread());
+ Q_D(QFactoryLoader);
+ d->iid = iid;
+#ifndef QT_NO_LIBRARY
+ d->cs = cs;
+ d->suffix = suffix;
+
+ QMutexLocker locker(qt_factoryloader_mutex());
+ update();
+ qt_factory_loaders()->append(this);
+#else
+ Q_UNUSED(suffix);
+ Q_UNUSED(cs);
+#endif
+}
+
QList<QJsonObject> QFactoryLoader::metaData() const
{
Q_D(const QFactoryLoader);
- QMutexLocker locker(&d->mutex);
QList<QJsonObject> metaData;
+#ifndef QT_NO_LIBRARY
+ QMutexLocker locker(&d->mutex);
for (int i = 0; i < d->libraryList.size(); ++i)
metaData.append(d->libraryList.at(i)->metaData);
+#endif
foreach (const QStaticPlugin &plugin, QPluginLoader::staticPlugins()) {
const QJsonObject object = plugin.metaData();
@@ -254,6 +280,7 @@ QObject *QFactoryLoader::instance(int index) const
if (index < 0)
return 0;
+#ifndef QT_NO_LIBRARY
if (index < d->libraryList.size()) {
QLibraryPrivate *library = d->libraryList.at(index);
if (library->instance || library->loadPlugin()) {
@@ -268,8 +295,9 @@ QObject *QFactoryLoader::instance(int index) const
}
return 0;
}
-
index -= d->libraryList.size();
+#endif
+
QVector<QStaticPlugin> staticPlugins = QPluginLoader::staticPlugins();
for (int i = 0; i < staticPlugins.count(); ++i) {
const QJsonObject object = staticPlugins.at(i).metaData();
@@ -284,24 +312,6 @@ QObject *QFactoryLoader::instance(int index) const
return 0;
}
-#if defined(Q_OS_UNIX) && !defined (Q_OS_MAC)
-QLibraryPrivate *QFactoryLoader::library(const QString &key) const
-{
- Q_D(const QFactoryLoader);
- return d->keyMap.value(d->cs ? key : key.toLower());
-}
-#endif
-
-void QFactoryLoader::refreshAll()
-{
- QMutexLocker locker(qt_factoryloader_mutex());
- QList<QFactoryLoader *> *loaders = qt_factory_loaders();
- for (QList<QFactoryLoader *>::const_iterator it = loaders->constBegin();
- it != loaders->constEnd(); ++it) {
- (*it)->update();
- }
-}
-
QMultiMap<int, QString> QFactoryLoader::keyMap() const
{
QMultiMap<int, QString> result;
@@ -337,4 +347,4 @@ int QFactoryLoader::indexOf(const QString &needle) const
QT_END_NAMESPACE
-#endif // QT_NO_LIBRARY
+#endif // QT_NO_QOBJECT
diff --git a/src/corelib/plugin/qfactoryloader_p.h b/src/corelib/plugin/qfactoryloader_p.h
index 1c48491b0d..ee07084180 100644
--- a/src/corelib/plugin/qfactoryloader_p.h
+++ b/src/corelib/plugin/qfactoryloader_p.h
@@ -45,17 +45,18 @@
// We mean it.
//
+#include "QtCore/qglobal.h"
+#ifndef QT_NO_QOBJECT
+
#include "QtCore/qobject.h"
#include "QtCore/qstringlist.h"
#include "QtCore/qjsonobject.h"
#include "QtCore/qmap.h"
#include "private/qlibrary_p.h"
-#ifndef QT_NO_LIBRARY
QT_BEGIN_NAMESPACE
class QFactoryLoaderPrivate;
-
class Q_CORE_EXPORT QFactoryLoader : public QObject
{
Q_OBJECT
@@ -65,21 +66,23 @@ public:
explicit QFactoryLoader(const char *iid,
const QString &suffix = QString(),
Qt::CaseSensitivity = Qt::CaseSensitive);
+
+#ifndef QT_NO_LIBRARY
~QFactoryLoader();
- QList<QJsonObject> metaData() const;
- QObject *instance(int index) const;
+ void update();
+ static void refreshAll();
#if defined(Q_OS_UNIX) && !defined (Q_OS_MAC)
QLibraryPrivate *library(const QString &key) const;
-#endif
+#endif // Q_OS_UNIX && !Q_OS_MAC
+#endif // !QT_NO_LIBRARY
QMultiMap<int, QString> keyMap() const;
int indexOf(const QString &needle) const;
- void update();
-
- static void refreshAll();
+ QList<QJsonObject> metaData() const;
+ QObject *instance(int index) const;
};
template <class PluginInterface, class FactoryInterface>
@@ -112,6 +115,6 @@ PluginInterface *qLoadPlugin1(const QFactoryLoader *loader,
QT_END_NAMESPACE
-#endif // QT_NO_LIBRARY
+#endif // QT_NO_QOBJECT
#endif // QFACTORYLOADER_P_H
diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp
index 317c1dcdc1..38e82fc059 100644
--- a/src/corelib/plugin/qlibrary.cpp
+++ b/src/corelib/plugin/qlibrary.cpp
@@ -302,7 +302,7 @@ static bool findPatternUnloaded(const QString &library, QLibraryPrivate *lib)
if (pos >= 0) {
if (hasMetaData) {
const char *data = filedata + pos;
- QJsonDocument doc = QLibraryPrivate::fromRawMetaData(data);
+ QJsonDocument doc = qJsonFromRawLibraryMetaData(data);
lib->metaData = doc.object();
if (qt_debug_component())
qWarning("Found metadata in lib %s, metadata=\n%s\n",
@@ -675,7 +675,7 @@ static bool qt_get_metadata(QtPluginQueryVerificationDataFunction pfn, QLibraryP
if (!szData)
return false;
- QJsonDocument doc = QLibraryPrivate::fromRawMetaData(szData);
+ QJsonDocument doc = qJsonFromRawLibraryMetaData(szData);
if (doc.isNull())
return false;
priv->metaData = doc.object();
diff --git a/src/corelib/plugin/qlibrary_p.h b/src/corelib/plugin/qlibrary_p.h
index ada90d7bfd..11b0cb1eb9 100644
--- a/src/corelib/plugin/qlibrary_p.h
+++ b/src/corelib/plugin/qlibrary_p.h
@@ -57,9 +57,20 @@
# include "QtCore/qt_windows.h"
#endif
+QT_BEGIN_NAMESPACE
+
+// Needed also in case of QT_NO_LIBRARY, for static plugin loading.
+inline QJsonDocument qJsonFromRawLibraryMetaData(const char *raw)
+{
+ raw += strlen("QTMETADATA ");
+ // the size of the embedded JSON object can be found 8 bytes into the data (see qjson_p.h),
+ // but doesn't include the size of the header (8 bytes)
+ QByteArray json(raw, qFromLittleEndian<uint>(*(const uint *)(raw + 8)) + 8);
+ return QJsonDocument::fromBinaryData(json);
+}
+
#ifndef QT_NO_LIBRARY
-QT_BEGIN_NAMESPACE
bool qt_debug_component();
@@ -104,14 +115,6 @@ public:
void updatePluginState();
bool isPlugin();
- static inline QJsonDocument fromRawMetaData(const char *raw) {
- raw += strlen("QTMETADATA ");
- // the size of the embedded JSON object can be found 8 bytes into the data (see qjson_p.h),
- // but doesn't include the size of the header (8 bytes)
- QByteArray json(raw, qFromLittleEndian<uint>(*(const uint *)(raw + 8)) + 8);
- return QJsonDocument::fromBinaryData(json);
- }
-
private:
explicit QLibraryPrivate(const QString &canonicalFileName, const QString &version, QLibrary::LoadHints loadHints);
~QLibraryPrivate();
@@ -132,8 +135,8 @@ private:
friend class QLibraryStore;
};
-QT_END_NAMESPACE
-
#endif // QT_NO_LIBRARY
+QT_END_NAMESPACE
+
#endif // QLIBRARY_P_H
diff --git a/src/corelib/plugin/qpluginloader.cpp b/src/corelib/plugin/qpluginloader.cpp
index 24101be87b..8264a27842 100644
--- a/src/corelib/plugin/qpluginloader.cpp
+++ b/src/corelib/plugin/qpluginloader.cpp
@@ -41,10 +41,10 @@
#include "qdebug.h"
#include "qdir.h"
-#ifndef QT_NO_LIBRARY
-
QT_BEGIN_NAMESPACE
+#ifndef QT_NO_LIBRARY
+
/*!
\class QPluginLoader
\inmodule QtCore
@@ -382,9 +382,6 @@ QString QPluginLoader::errorString() const
return (!d || d->errorString.isEmpty()) ? tr("Unknown error") : d->errorString;
}
-typedef QVector<QStaticPlugin> StaticPluginList;
-Q_GLOBAL_STATIC(StaticPluginList, staticPluginList)
-
/*! \since 4.4
\property QPluginLoader::loadHints
@@ -413,6 +410,11 @@ QLibrary::LoadHints QPluginLoader::loadHints() const
return d ? d->loadHints() : QLibrary::LoadHints();
}
+#endif // QT_NO_LIBRARY
+
+typedef QVector<QStaticPlugin> StaticPluginList;
+Q_GLOBAL_STATIC(StaticPluginList, staticPluginList)
+
/*!
\relates QPluginLoader
\since 5.0
@@ -465,9 +467,8 @@ QVector<QStaticPlugin> QPluginLoader::staticPlugins()
*/
QJsonObject QStaticPlugin::metaData() const
{
- return QLibraryPrivate::fromRawMetaData(rawMetaData()).object();
+ return qJsonFromRawLibraryMetaData(rawMetaData()).object();
}
QT_END_NAMESPACE
-#endif // QT_NO_LIBRARY
diff --git a/src/corelib/plugin/qpluginloader.h b/src/corelib/plugin/qpluginloader.h
index 0ab25bbb07..5dc7d1b66c 100644
--- a/src/corelib/plugin/qpluginloader.h
+++ b/src/corelib/plugin/qpluginloader.h
@@ -37,10 +37,10 @@
#include <QtCore/qlibrary.h>
#include <QtCore/qplugin.h>
-#ifndef QT_NO_LIBRARY
-
QT_BEGIN_NAMESPACE
+#ifndef QT_NO_LIBRARY
+
class QLibraryPrivate;
class QJsonObject;
@@ -78,8 +78,17 @@ private:
Q_DISABLE_COPY(QPluginLoader)
};
-QT_END_NAMESPACE
+#else
+
+class Q_CORE_EXPORT QPluginLoader
+{
+public:
+ static QObjectList staticInstances();
+ static QVector<QStaticPlugin> staticPlugins();
+};
#endif // QT_NO_LIBRARY
+QT_END_NAMESPACE
+
#endif //QPLUGINLOADER_H
diff --git a/src/corelib/plugin/quuid.cpp b/src/corelib/plugin/quuid.cpp
index 253789b4f0..b7ea1f2f60 100644
--- a/src/corelib/plugin/quuid.cpp
+++ b/src/corelib/plugin/quuid.cpp
@@ -803,6 +803,39 @@ QUuid::Version QUuid::version() const Q_DECL_NOTHROW
return ver;
}
+/*! \fn QUuid QUuid::fromCFUUID(CFUUIDRef uuid)
+ \since 5.7
+
+ Constructs a new QUuid containing a copy of the \a uuid CFUUID.
+
+ \note this function is only available on Apple platforms.
+*/
+
+/*! \fn CFUUIDRef QUuid::toCFUUID() const
+ \since 5.7
+
+ Creates a CFUUID from a QUuid. The caller owns the CFUUID and is
+ responsible for releasing it.
+
+ \note this function is only available on Apple platforms.
+*/
+
+/*! \fn QUuid QUuid::fromNSUUID(const NSUUID *uuid)
+ \since 5.7
+
+ Constructs a new QUuid containing a copy of the \a uuid NSUUID.
+
+ \note this function is only available on Apple platforms.
+*/
+
+/*! \fn NSUUID QUuid::toNSUUID() const
+ \since 5.7
+
+ Creates a NSUUID from a QUuid. The NSUUID is autoreleased.
+
+ \note this function is only available on Apple platforms.
+*/
+
/*!
\fn bool QUuid::operator<(const QUuid &other) const
diff --git a/src/corelib/plugin/quuid.h b/src/corelib/plugin/quuid.h
index f004cba77e..07cd9c4103 100644
--- a/src/corelib/plugin/quuid.h
+++ b/src/corelib/plugin/quuid.h
@@ -49,6 +49,12 @@ typedef struct _GUID
#endif
#endif
+#ifdef Q_OS_DARWIN
+Q_FORWARD_DECLARE_CF_TYPE(CFUUID);
+# ifdef __OBJC__
+Q_FORWARD_DECLARE_OBJC_CLASS(NSUUID);
+# endif
+#endif
QT_BEGIN_NAMESPACE
@@ -195,6 +201,15 @@ public:
QUuid::Variant variant() const Q_DECL_NOTHROW;
QUuid::Version version() const Q_DECL_NOTHROW;
+#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
+ static QUuid fromCFUUID(CFUUIDRef uuid);
+ CFUUIDRef toCFUUID() const Q_DECL_CF_RETURNS_RETAINED;
+# if defined(__OBJC__) || defined(Q_QDOC)
+ static QUuid fromNSUUID(const NSUUID *uuid);
+ NSUUID *toNSUUID() const Q_DECL_NS_RETURNS_AUTORELEASED;
+# endif
+#endif
+
uint data1;
ushort data2;
ushort data3;
diff --git a/src/widgets/styles/qgtkpainter.cpp b/src/corelib/plugin/quuid_darwin.mm
index e86fee079e..b316b88d52 100644
--- a/src/widgets/styles/qgtkpainter.cpp
+++ b/src/corelib/plugin/quuid_darwin.mm
@@ -3,7 +3,7 @@
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
-** This file is part of the QtWidgets module of the Qt Toolkit.
+** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL21$
** Commercial License Usage
@@ -31,46 +31,39 @@
**
****************************************************************************/
-#include "qgtkpainter_p.h"
+#include "quuid.h"
-#if !defined(QT_NO_STYLE_GTK)
-
-#include <private/qhexstring_p.h>
+#import <Foundation/Foundation.h>
QT_BEGIN_NAMESPACE
-QGtkPainter::QGtkPainter()
+QUuid QUuid::fromCFUUID(CFUUIDRef uuid)
{
- reset(0);
+ if (!uuid)
+ return QUuid();
+ const CFUUIDBytes bytes = CFUUIDGetUUIDBytes(uuid);
+ return QUuid::fromRfc4122(QByteArray::fromRawData(reinterpret_cast<const char *>(&bytes), sizeof(bytes)));
}
-QGtkPainter::~QGtkPainter()
+CFUUIDRef QUuid::toCFUUID() const
{
+ const QByteArray bytes = toRfc4122();
+ return CFUUIDCreateFromUUIDBytes(0, *reinterpret_cast<const CFUUIDBytes *>(bytes.constData()));
}
-void QGtkPainter::reset(QPainter *painter)
+QUuid QUuid::fromNSUUID(const NSUUID *uuid)
{
- m_painter = painter;
- m_alpha = true;
- m_hflipped = false;
- m_vflipped = false;
- m_usePixmapCache = true;
- m_cliprect = QRect();
+ if (!uuid)
+ return QUuid();
+ uuid_t bytes;
+ [uuid getUUIDBytes:bytes];
+ return QUuid::fromRfc4122(QByteArray::fromRawData(reinterpret_cast<const char *>(bytes), sizeof(bytes)));
}
-QString QGtkPainter::uniqueName(const QString &key, GtkStateType state, GtkShadowType shadow,
- const QSize &size, GtkWidget *widget)
+NSUUID *QUuid::toNSUUID() const
{
- // Note the widget arg should ideally use the widget path, though would compromise performance
- QString tmp = key
- % HexString<uint>(state)
- % HexString<uint>(shadow)
- % HexString<uint>(size.width())
- % HexString<uint>(size.height())
- % HexString<quint64>(quint64(widget));
- return tmp;
+ const QByteArray bytes = toRfc4122();
+ return [[[NSUUID alloc] initWithUUIDBytes:*reinterpret_cast<const uuid_t *>(bytes.constData())] autorelease];
}
QT_END_NAMESPACE
-
-#endif //!defined(QT_NO_STYLE_GTK)
diff --git a/src/corelib/statemachine/qsignaltransition.cpp b/src/corelib/statemachine/qsignaltransition.cpp
index 7ec72df77c..e8c5f3e479 100644
--- a/src/corelib/statemachine/qsignaltransition.cpp
+++ b/src/corelib/statemachine/qsignaltransition.cpp
@@ -146,6 +146,19 @@ QSignalTransition::QSignalTransition(const QObject *sender, const char *signal,
}
/*!
+ \fn QSignalTransition::QSignalTransition(const QObject *sender,
+ PointerToMemberFunction signal, QState *sourceState);
+ \since 5.7
+ \overload
+
+ Constructs a new signal transition associated with the given \a signal of
+ the given \a sender object and with the given \a sourceSate.
+ This constructor is enabled if compiler supports delegating constructor.
+
+ \sa Q_COMPILER_DELEGATING_CONSTRUCTORS
+*/
+
+/*!
Destroys this signal transition.
*/
QSignalTransition::~QSignalTransition()
diff --git a/src/corelib/statemachine/qsignaltransition.h b/src/corelib/statemachine/qsignaltransition.h
index c388323ec4..b428cb621d 100644
--- a/src/corelib/statemachine/qsignaltransition.h
+++ b/src/corelib/statemachine/qsignaltransition.h
@@ -35,6 +35,7 @@
#define QSIGNALTRANSITION_H
#include <QtCore/qabstracttransition.h>
+#include <QtCore/qmetaobject.h>
QT_BEGIN_NAMESPACE
@@ -52,6 +53,18 @@ public:
QSignalTransition(QState *sourceState = Q_NULLPTR);
QSignalTransition(const QObject *sender, const char *signal,
QState *sourceState = Q_NULLPTR);
+#ifdef Q_QDOC
+ QSignalTransition(const QObject *object, PointerToMemberFunction signal,
+ QState *sourceState = Q_NULLPTR);
+#elif defined(Q_COMPILER_DELEGATING_CONSTRUCTORS)
+ template <typename Func>
+ QSignalTransition(const typename QtPrivate::FunctionPointer<Func>::Object *obj,
+ Func sig, QState *srcState = Q_NULLPTR)
+ : QSignalTransition(obj, QMetaMethod::fromSignal(sig).methodSignature().constData(), srcState)
+ {
+ }
+#endif
+
~QSignalTransition();
QObject *senderObject() const;
diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp
index af4ce7c59e..9329c515af 100644
--- a/src/corelib/thread/qthread_unix.cpp
+++ b/src/corelib/thread/qthread_unix.cpp
@@ -38,18 +38,16 @@
#include <private/qcoreapplication_p.h>
#include <private/qcore_unix_p.h>
-#if defined(Q_OS_BLACKBERRY)
-# include <private/qeventdispatcher_blackberry_p.h>
-#elif defined(Q_OS_OSX)
+#if defined(Q_OS_OSX)
# include <private/qeventdispatcher_cf_p.h>
-# include <private/qeventdispatcher_unix_p.h>
#else
# if !defined(QT_NO_GLIB)
# include "../kernel/qeventdispatcher_glib_p.h"
# endif
-# include <private/qeventdispatcher_unix_p.h>
#endif
+#include <private/qeventdispatcher_unix_p.h>
+
#include "qthreadstorage.h"
#include "qthread_p.h"
@@ -250,16 +248,14 @@ typedef void*(*QtThreadCallback)(void*);
void QThreadPrivate::createEventDispatcher(QThreadData *data)
{
-#if defined(Q_OS_BLACKBERRY)
- data->eventDispatcher.storeRelease(new QEventDispatcherBlackberry);
-# elif defined(Q_OS_OSX)
+#if defined(Q_OS_OSX)
bool ok = false;
int value = qEnvironmentVariableIntValue("QT_EVENT_DISPATCHER_CORE_FOUNDATION", &ok);
if (ok && value > 0)
data->eventDispatcher.storeRelease(new QEventDispatcherCoreFoundation);
else
data->eventDispatcher.storeRelease(new QEventDispatcherUNIX);
-# elif !defined(QT_NO_GLIB)
+#elif !defined(QT_NO_GLIB)
if (qEnvironmentVariableIsEmpty("QT_NO_GLIB")
&& qEnvironmentVariableIsEmpty("QT_NO_THREADED_GLIB")
&& QEventDispatcherGlib::versionSupported())
diff --git a/src/corelib/tools/qalgorithms.h b/src/corelib/tools/qalgorithms.h
index ffa3082d5e..27630aea87 100644
--- a/src/corelib/tools/qalgorithms.h
+++ b/src/corelib/tools/qalgorithms.h
@@ -620,7 +620,11 @@ Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint8 v) Q_DECL_NOT
Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint16 v) Q_DECL_NOTHROW
{
#if defined(Q_CC_GNU)
+# if QT_HAS_BUILTIN(__builtin_ctzs) || defined(__BMI__)
+ return v ? __builtin_ctzs(v) : 16U;
+# else
return v ? __builtin_ctz(v) : 16U;
+# endif
#else
unsigned int c = 16; // c will be the number of zero bits on the right
v &= -signed(v);
@@ -679,7 +683,11 @@ Q_DECL_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(quint8 v) Q_DECL_NOTH
Q_DECL_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(quint16 v) Q_DECL_NOTHROW
{
#if defined(Q_CC_GNU)
+# if QT_HAS_BUILTIN(__builtin_clzs) || defined(__BMI__)
+ return v ? __builtin_clzs(v) : 16U;
+# else
return v ? __builtin_clz(v)-16U : 16U;
+# endif
#else
v = v | (v >> 1);
v = v | (v >> 2);
diff --git a/src/corelib/tools/qbytearray.cpp b/src/corelib/tools/qbytearray.cpp
index 00d15fd518..b972be68a3 100644
--- a/src/corelib/tools/qbytearray.cpp
+++ b/src/corelib/tools/qbytearray.cpp
@@ -39,6 +39,7 @@
#include "qlist.h"
#include "qlocale.h"
#include "qlocale_p.h"
+#include "qlocale_tools_p.h"
#include "qstringalgorithms_p.h"
#include "qscopedpointer.h"
#include "qbytearray_p.h"
@@ -1713,6 +1714,14 @@ QByteArray &QByteArray::prepend(const char *str, int len)
return *this;
}
+/*! \fn QByteArray &QByteArray::prepend(int count, char ch)
+
+ \overload
+ \since 5.7
+
+ Prepends \a count copies of character \a ch to this byte array.
+*/
+
/*!
\overload
@@ -1825,6 +1834,17 @@ QByteArray &QByteArray::append(const char *str, int len)
return *this;
}
+/*! \fn QByteArray &QByteArray::append(int count, char ch)
+
+ \overload
+ \since 5.7
+
+ Appends \a count copies of character \a ch to this byte
+ array and returns a reference to this byte array.
+
+ If \a count is negative or zero nothing is appended to the byte array.
+*/
+
/*!
\overload
@@ -1941,6 +1961,33 @@ QByteArray &QByteArray::insert(int i, char ch)
return qbytearray_insert(this, i, &ch, 1);
}
+/*! \fn QByteArray &QByteArray::insert(int i, int count, char ch)
+
+ \overload
+ \since 5.7
+
+ Inserts \a count copies of character \a ch at index position \a i in the
+ byte array.
+
+ If \a i is greater than size(), the array is first extended using resize().
+*/
+
+QByteArray &QByteArray::insert(int i, int count, char ch)
+{
+ if (i < 0 || count <= 0)
+ return *this;
+
+ int oldsize = size();
+ resize(qMax(i, oldsize) + count);
+ char *dst = d->data();
+ if (i > oldsize)
+ ::memset(dst + oldsize, 0x20, i - oldsize);
+ else if (i < oldsize)
+ ::memmove(dst + i + count, dst + i, oldsize - i);
+ ::memset(dst + i, ch, count);
+ return *this;
+}
+
/*!
Removes \a len bytes from the array, starting at index position \a
pos, and returns a reference to the array.
@@ -3648,7 +3695,13 @@ ushort QByteArray::toUShort(bool *ok, int base) const
double QByteArray::toDouble(bool *ok) const
{
- return QLocaleData::bytearrayToDouble(nulTerminated().constData(), ok);
+ QByteArray nulled = nulTerminated();
+ bool nonNullOk = false;
+ int processed = 0;
+ double d = asciiToDouble(nulled.constData(), nulled.length(), nonNullOk, processed);
+ if (ok)
+ *ok = nonNullOk;
+ return d;
}
/*!
@@ -3877,10 +3930,10 @@ QByteArray &QByteArray::setNum(qulonglong n, int base)
QByteArray &QByteArray::setNum(double n, char f, int prec)
{
QLocaleData::DoubleForm form = QLocaleData::DFDecimal;
- uint flags = 0;
+ uint flags = QLocaleData::ZeroPadExponent;
if (qIsUpper(f))
- flags = QLocaleData::CapitalEorX;
+ flags |= QLocaleData::CapitalEorX;
f = qToLower(f);
switch (f) {
diff --git a/src/corelib/tools/qbytearray.h b/src/corelib/tools/qbytearray.h
index f0032227e8..6c79a603d3 100644
--- a/src/corelib/tools/qbytearray.h
+++ b/src/corelib/tools/qbytearray.h
@@ -255,21 +255,21 @@ public:
# define Q_REQUIRED_RESULT
# define Q_REQUIRED_RESULT_pushed
# endif
- QByteArray toLower() const & Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QByteArray toLower() const & Q_REQUIRED_RESULT
{ return toLower_helper(*this); }
- QByteArray toLower() && Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QByteArray toLower() && Q_REQUIRED_RESULT
{ return toLower_helper(*this); }
- QByteArray toUpper() const & Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QByteArray toUpper() const & Q_REQUIRED_RESULT
{ return toUpper_helper(*this); }
- QByteArray toUpper() && Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QByteArray toUpper() && Q_REQUIRED_RESULT
{ return toUpper_helper(*this); }
- QByteArray trimmed() const & Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QByteArray trimmed() const & Q_REQUIRED_RESULT
{ return trimmed_helper(*this); }
- QByteArray trimmed() && Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QByteArray trimmed() && Q_REQUIRED_RESULT
{ return trimmed_helper(*this); }
- QByteArray simplified() const & Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QByteArray simplified() const & Q_REQUIRED_RESULT
{ return simplified_helper(*this); }
- QByteArray simplified() && Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QByteArray simplified() && Q_REQUIRED_RESULT
{ return simplified_helper(*this); }
# ifdef Q_REQUIRED_RESULT_pushed
# pragma pop_macro("Q_REQUIRED_RESULT")
@@ -285,14 +285,17 @@ public:
QByteArray rightJustified(int width, char fill = ' ', bool truncate = false) const Q_REQUIRED_RESULT;
QByteArray &prepend(char c);
+ QByteArray &prepend(int count, char c);
QByteArray &prepend(const char *s);
QByteArray &prepend(const char *s, int len);
QByteArray &prepend(const QByteArray &a);
QByteArray &append(char c);
+ QByteArray &append(int count, char c);
QByteArray &append(const char *s);
QByteArray &append(const char *s, int len);
QByteArray &append(const QByteArray &a);
QByteArray &insert(int i, char c);
+ QByteArray &insert(int i, int count, char c);
QByteArray &insert(int i, const char *s);
QByteArray &insert(int i, const char *s, int len);
QByteArray &insert(int i, const QByteArray &a);
@@ -568,6 +571,10 @@ inline QByteArray::const_iterator QByteArray::cend() const
{ return d->data() + d->size; }
inline QByteArray::const_iterator QByteArray::constEnd() const
{ return d->data() + d->size; }
+inline QByteArray &QByteArray::append(int n, char ch)
+{ return insert(d->size, n, ch); }
+inline QByteArray &QByteArray::prepend(int n, char ch)
+{ return insert(0, n, ch); }
inline QByteArray &QByteArray::operator+=(char c)
{ return append(c); }
inline QByteArray &QByteArray::operator+=(const char *s)
diff --git a/src/corelib/tools/qchar.h b/src/corelib/tools/qchar.h
index 9833380cc8..c60b5fbf49 100644
--- a/src/corelib/tools/qchar.h
+++ b/src/corelib/tools/qchar.h
@@ -567,10 +567,10 @@ Q_DECLARE_TYPEINFO(QChar, Q_MOVABLE_TYPE);
Q_DECL_CONSTEXPR inline bool operator==(QChar c1, QChar c2) Q_DECL_NOTHROW { return c1.ucs == c2.ucs; }
Q_DECL_CONSTEXPR inline bool operator< (QChar c1, QChar c2) Q_DECL_NOTHROW { return c1.ucs < c2.ucs; }
-Q_DECL_CONSTEXPR inline bool operator!=(QChar c1, QChar c2) { return !operator==(c1, c2); }
-Q_DECL_CONSTEXPR inline bool operator>=(QChar c1, QChar c2) { return !operator< (c1, c2); }
-Q_DECL_CONSTEXPR inline bool operator> (QChar c1, QChar c2) { return operator< (c2, c1); }
-Q_DECL_CONSTEXPR inline bool operator<=(QChar c1, QChar c2) { return !operator< (c2, c1); }
+Q_DECL_CONSTEXPR inline bool operator!=(QChar c1, QChar c2) Q_DECL_NOTHROW { return !operator==(c1, c2); }
+Q_DECL_CONSTEXPR inline bool operator>=(QChar c1, QChar c2) Q_DECL_NOTHROW { return !operator< (c1, c2); }
+Q_DECL_CONSTEXPR inline bool operator> (QChar c1, QChar c2) Q_DECL_NOTHROW { return operator< (c2, c1); }
+Q_DECL_CONSTEXPR inline bool operator<=(QChar c1, QChar c2) Q_DECL_NOTHROW { return !operator< (c2, c1); }
#ifndef QT_NO_DATASTREAM
Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, QChar);
diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp
index 9bbf5b8944..366ad5b02f 100644
--- a/src/corelib/tools/qdatetime.cpp
+++ b/src/corelib/tools/qdatetime.cpp
@@ -64,6 +64,8 @@
QT_BEGIN_NAMESPACE
+Q_GLOBAL_STATIC_WITH_ARGS(QSharedDataPointer<QDateTimePrivate>, defaultDateTimePrivate, (new QDateTimePrivate()))
+
/*****************************************************************************
Date/Time Constants
*****************************************************************************/
@@ -2924,7 +2926,7 @@ qint64 QDateTimePrivate::zoneMSecsToEpochMSecs(qint64 zoneMSecs, const QTimeZone
\sa isValid()
*/
QDateTime::QDateTime()
- : d(new QDateTimePrivate)
+ : d(*defaultDateTimePrivate())
{
}
diff --git a/src/corelib/tools/qdoublescanprint_p.h b/src/corelib/tools/qdoublescanprint_p.h
new file mode 100644
index 0000000000..30ac584d06
--- /dev/null
+++ b/src/corelib/tools/qdoublescanprint_p.h
@@ -0,0 +1,150 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDOUBLESCANPRINT_P_H
+#define QDOUBLESCANPRINT_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of internal files. This header file may change from version to version
+// without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <qglobal.h>
+
+#if defined(Q_CC_MSVC) && (defined(QT_BOOTSTRAPPED) || defined(QT_NO_DOUBLECONVERSION))
+# include <stdio.h>
+# include <locale.h>
+
+QT_BEGIN_NAMESPACE
+
+// We can always use _sscanf_l and _snprintf_l on MSVC as those were introduced in 2005.
+
+// MSVC doesn't document what it will do with a NULL locale passed to _sscanf_l or _snprintf_l.
+// The documentation for _create_locale() does not formally document "C" to be valid, but an example
+// code snippet in the same documentation shows it.
+
+struct QCLocaleT {
+ QCLocaleT() : locale(_create_locale(LC_ALL, "C"))
+ {
+ }
+
+ ~QCLocaleT()
+ {
+ _free_locale(locale);
+ }
+
+ const _locale_t locale;
+};
+
+# define QT_CLOCALE_HOLDER Q_GLOBAL_STATIC(QCLocaleT, cLocaleT)
+# define QT_CLOCALE cLocaleT()->locale
+
+inline int qDoubleSscanf(const char *buf, _locale_t locale, const char *format, double *d,
+ int *processed)
+{
+ return _sscanf_l(buf, format, locale, d, processed);
+}
+
+inline int qDoubleSnprintf(char *buf, size_t buflen, _locale_t locale, const char *format, double d)
+{
+ return _snprintf_l(buf, buflen, format, locale, d);
+}
+
+QT_END_NAMESPACE
+
+#elif defined(QT_BOOTSTRAPPED)
+# include <stdio.h>
+
+QT_BEGIN_NAMESPACE
+
+// When bootstrapping we don't have libdouble-conversion available, yet. We can also not use locale
+// aware snprintf and sscanf variants in the general case because those are only available on select
+// platforms. We can use the regular snprintf and sscanf because we don't do setlocale(3) when
+// bootstrapping and the locale is always "C" then.
+
+# define QT_CLOCALE_HOLDER
+# define QT_CLOCALE 0
+
+inline int qDoubleSscanf(const char *buf, int, const char *format, double *d, int *processed)
+{
+ return sscanf(buf, format, d, processed);
+}
+inline int qDoubleSnprintf(char *buf, size_t buflen, int, const char *format, double d)
+{
+ return snprintf(buf, buflen, format, d);
+}
+
+QT_END_NAMESPACE
+
+#else // !QT_BOOTSTRAPPED && (!Q_CC_MSVC || !QT_NO_DOUBLECONVERSION)
+# ifdef QT_NO_DOUBLECONVERSION
+# include <stdio.h>
+# include <xlocale.h>
+
+QT_BEGIN_NAMESPACE
+
+// OS X and FreeBSD both treat NULL as the "C" locale for snprintf_l and sscanf_l.
+// When other implementations with different behavior show up, we'll have to do newlocale(3) and
+// freelocale(3) here. The arguments to those will depend on what the other implementations will
+// offer. OS X and FreeBSD again interpret a locale name of NULL as "C", but "C" itself is not
+// documented as valid locale name. Mind that the names of the LC_* constants differ between e.g.
+// BSD variants and linux.
+
+# define QT_CLOCALE_HOLDER
+# define QT_CLOCALE NULL
+
+inline int qDoubleSscanf(const char *buf, locale_t locale, const char *format, double *d,
+ int *processed)
+{
+ return sscanf_l(buf, locale, format, d, processed);
+}
+inline int qDoubleSnprintf(char *buf, size_t buflen, locale_t locale, const char *format, double d)
+{
+ return snprintf_l(buf, buflen, locale, format, d);
+}
+
+QT_END_NAMESPACE
+
+# else // !QT_NO_DOUBLECONVERSION
+# include <double-conversion/double-conversion.h>
+# define QT_CLOCALE_HOLDER
+# endif // QT_NO_DOUBLECONVERSION
+#endif // QT_BOOTSTRAPPED
+
+#endif // QDOUBLESCANPRINT_P_H
diff --git a/src/corelib/tools/qeasingcurve.h b/src/corelib/tools/qeasingcurve.h
index d04d5ef30a..da423f2ee7 100644
--- a/src/corelib/tools/qeasingcurve.h
+++ b/src/corelib/tools/qeasingcurve.h
@@ -75,12 +75,12 @@ public:
QEasingCurve &operator=(const QEasingCurve &other)
{ if ( this != &other ) { QEasingCurve copy(other); swap(copy); } return *this; }
#ifdef Q_COMPILER_RVALUE_REFS
- QEasingCurve(QEasingCurve &&other) : d_ptr(other.d_ptr) { other.d_ptr = Q_NULLPTR; }
- QEasingCurve &operator=(QEasingCurve &&other)
+ QEasingCurve(QEasingCurve &&other) Q_DECL_NOTHROW : d_ptr(other.d_ptr) { other.d_ptr = Q_NULLPTR; }
+ QEasingCurve &operator=(QEasingCurve &&other) Q_DECL_NOTHROW
{ qSwap(d_ptr, other.d_ptr); return *this; }
#endif
- inline void swap(QEasingCurve &other) { qSwap(d_ptr, other.d_ptr); }
+ void swap(QEasingCurve &other) Q_DECL_NOTHROW { qSwap(d_ptr, other.d_ptr); }
bool operator==(const QEasingCurve &other) const;
inline bool operator!=(const QEasingCurve &other) const
diff --git a/src/corelib/tools/qhash.cpp b/src/corelib/tools/qhash.cpp
index b334a697a9..7724516a5d 100644
--- a/src/corelib/tools/qhash.cpp
+++ b/src/corelib/tools/qhash.cpp
@@ -682,17 +682,17 @@ void QHashData::dump()
void QHashData::checkSanity()
{
- if (fakeNext)
+ if (Q_UNLIKELY(fakeNext))
qFatal("Fake next isn't 0");
for (int i = 0; i < numBuckets; ++i) {
Node *n = buckets[i];
Node *p = n;
- if (!n)
+ if (Q_UNLIKELY(!n))
qFatal("%d: Bucket entry is 0", i);
if (n != reinterpret_cast<Node *>(this)) {
while (n != reinterpret_cast<Node *>(this)) {
- if (!n->next)
+ if (Q_UNLIKELY(!n->next))
qFatal("%d: Next of %p is 0, should be %p", i, n, this);
n = n->next;
}
diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index b1f53dc7a2..1f4d0c88c5 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -521,7 +521,7 @@ int qt_repeatCount(const QString &s, int i)
}
static const QLocaleData *default_data = 0;
-static uint default_number_options = 0;
+static QLocale::NumberOptions default_number_options = QLocale::DefaultNumberOptions;
static const QLocaleData *const c_data = locale_data;
static QLocalePrivate *c_private()
@@ -699,7 +699,8 @@ static QLocalePrivate *localePrivateByName(const QString &name)
if (name == QLatin1String("C"))
return c_private();
const QLocaleData *data = findLocaleData(name);
- return QLocalePrivate::create(data, data->m_language_id == QLocale::C ? QLocale::OmitGroupSeparator : 0);
+ return QLocalePrivate::create(data, data->m_language_id == QLocale::C ?
+ QLocale::OmitGroupSeparator : QLocale::DefaultNumberOptions);
}
static QLocalePrivate *findLocalePrivate(QLocale::Language language, QLocale::Script script,
@@ -710,7 +711,7 @@ static QLocalePrivate *findLocalePrivate(QLocale::Language language, QLocale::Sc
const QLocaleData *data = QLocaleData::findLocaleData(language, script, country);
- int numberOptions = 0;
+ QLocale::NumberOptions numberOptions = QLocale::DefaultNumberOptions;
// If not found, should default to system
if (data->m_language_id == QLocale::C && language != QLocale::C) {
@@ -903,7 +904,7 @@ void QLocale::setNumberOptions(NumberOptions options)
*/
QLocale::NumberOptions QLocale::numberOptions() const
{
- return static_cast<NumberOption>(d->m_numberOptions);
+ return static_cast<NumberOptions>(d->m_numberOptions);
}
/*!
@@ -1071,13 +1072,13 @@ QString QLocale::name() const
}
static qlonglong toIntegral_helper(const QLocaleData *d, const QChar *data, int len, bool *ok,
- QLocaleData::GroupSeparatorMode mode, qlonglong)
+ QLocale::NumberOptions mode, qlonglong)
{
return d->stringToLongLong(data, len, 10, ok, mode);
}
static qulonglong toIntegral_helper(const QLocaleData *d, const QChar *data, int len, bool *ok,
- QLocaleData::GroupSeparatorMode mode, qulonglong)
+ QLocale::NumberOptions mode, qulonglong)
{
return d->stringToUnsLongLong(data, len, 10, ok, mode);
}
@@ -1089,13 +1090,8 @@ T toIntegral_helper(const QLocalePrivate *d, const QChar *data, int len, bool *o
const bool isUnsigned = T(0) < T(-1);
typedef typename QtPrivate::QConditional<isUnsigned, qulonglong, qlonglong>::Type Int64;
- QLocaleData::GroupSeparatorMode mode
- = d->m_numberOptions & QLocale::RejectGroupSeparator
- ? QLocaleData::FailOnGroupSeparators
- : QLocaleData::ParseGroupSeparators;
-
// we select the right overload by the last, unused parameter
- Int64 val = toIntegral_helper(d->m_data, data, len, ok, mode, Int64());
+ Int64 val = toIntegral_helper(d->m_data, data, len, ok, d->m_numberOptions, Int64());
if (T(val) != val) {
if (ok)
*ok = false;
@@ -1314,12 +1310,7 @@ float QLocale::toFloat(const QString &s, bool *ok) const
double QLocale::toDouble(const QString &s, bool *ok) const
{
- QLocaleData::GroupSeparatorMode mode
- = d->m_numberOptions & RejectGroupSeparator
- ? QLocaleData::FailOnGroupSeparators
- : QLocaleData::ParseGroupSeparators;
-
- return d->m_data->stringToDouble(s.constData(), s.size(), ok, mode);
+ return d->m_data->stringToDouble(s.constData(), s.size(), ok, d->m_numberOptions);
}
/*!
@@ -1488,12 +1479,7 @@ float QLocale::toFloat(const QStringRef &s, bool *ok) const
double QLocale::toDouble(const QStringRef &s, bool *ok) const
{
- QLocaleData::GroupSeparatorMode mode
- = d->m_numberOptions & RejectGroupSeparator
- ? QLocaleData::FailOnGroupSeparators
- : QLocaleData::ParseGroupSeparators;
-
- return d->m_data->stringToDouble(s.constData(), s.size(), ok, mode);
+ return d->m_data->stringToDouble(s.constData(), s.size(), ok, d->m_numberOptions);
}
@@ -2019,6 +2005,8 @@ QString QLocale::toString(double i, char f, int prec) const
if (!(d->m_numberOptions & OmitGroupSeparator))
flags |= QLocaleData::ThousandsGroup;
+ if (!(d->m_numberOptions & OmitLeadingZeroInExponent))
+ flags |= QLocaleData::ZeroPadExponent;
return d->m_data->doubleToString(i, prec, form, -1, flags);
}
@@ -2743,57 +2731,33 @@ QString QLocaleData::doubleToString(const QChar _zero, const QChar plus, const Q
const QChar exponential, const QChar group, const QChar decimal,
double d, int precision, DoubleForm form, int width, unsigned flags)
{
- if (precision < 0)
+ if (precision != QLocale::FloatingPointShortest && precision < 0)
precision = 6;
if (width < 0)
width = 0;
bool negative = false;
- bool special_number = false; // nan, +/-inf
QString num_str;
- // Detect special numbers (nan, +/-inf)
- if (qt_is_inf(d)) {
- num_str = QString::fromLatin1("inf");
- special_number = true;
- negative = d < 0;
- } else if (qt_is_nan(d)) {
- num_str = QString::fromLatin1("nan");
- special_number = true;
- }
-
- // Handle normal numbers
- if (!special_number) {
- int decpt, sign;
- QString digits;
-
- int mode;
- if (form == DFDecimal)
- mode = 3;
- else
- mode = 2;
-
- /* This next bit is a bit quirky. In DFExponent form, the precision
- is the number of digits after decpt. So that would suggest using
- mode=3 for qdtoa. But qdtoa behaves strangely when mode=3 and
- precision=0. So we get around this by using mode=2 and reasoning
- that we want precision+1 significant digits, since the decimal
- point in this mode is always after the first digit. */
- int pr = precision;
- if (form == DFExponent)
- ++pr;
-
- char *rve = 0;
- char *buff = 0;
- QT_TRY {
- digits = QLatin1String(qdtoa(d, mode, pr, &decpt, &sign, &rve, &buff));
- } QT_CATCH(...) {
- if (buff != 0)
- free(buff);
- QT_RETHROW;
- }
- if (buff != 0)
- free(buff);
+ int decpt;
+ int bufSize = 1;
+ if (precision == QLocale::FloatingPointShortest)
+ bufSize += DoubleMaxSignificant;
+ else if (form == DFDecimal) // optimize for numbers between -512k and 512k
+ bufSize += ((d > (1 << 19) || d < -(1 << 19)) ? DoubleMaxDigitsBeforeDecimal : 6) +
+ precision;
+ else // Add extra digit due to different interpretations of precision. Also, "nan" has to fit.
+ bufSize += qMax(2, precision) + 1;
+
+ QVarLengthArray<char> buf(bufSize);
+ int length;
+
+ doubleToAscii(d, form, precision, buf.data(), bufSize, negative, length, decpt);
+
+ if (qstrncmp(buf.data(), "inf", 3) == 0 || qstrncmp(buf.data(), "nan", 3) == 0) {
+ num_str = QString::fromLatin1(buf.data(), length);
+ } else { // Handle normal numbers
+ QString digits = QString::fromLatin1(buf.data(), length);
if (_zero.unicode() != '0') {
ushort z = _zero.unicode() - '0';
@@ -2806,7 +2770,7 @@ QString QLocaleData::doubleToString(const QChar _zero, const QChar plus, const Q
case DFExponent: {
num_str = exponentForm(_zero, decimal, exponential, group, plus, minus,
digits, decpt, precision, PMDecimalDigits,
- always_show_decpt);
+ always_show_decpt, flags & ZeroPadExponent);
break;
}
case DFDecimal: {
@@ -2819,10 +2783,23 @@ QString QLocaleData::doubleToString(const QChar _zero, const QChar plus, const Q
PrecisionMode mode = (flags & Alternate) ?
PMSignificantDigits : PMChopTrailingZeros;
- if (decpt != digits.length() && (decpt <= -4 || decpt > precision))
+ int cutoff = precision < 0 ? 6 : precision;
+ // Find out which representation is shorter
+ if (precision == QLocale::FloatingPointShortest && decpt > 0) {
+ cutoff = digits.length() + 4; // 'e', '+'/'-', one digit exponent
+ if (decpt <= 10) {
+ ++cutoff;
+ } else {
+ cutoff += decpt > 100 ? 2 : 1;
+ }
+ if (!always_show_decpt && digits.length() > decpt)
+ ++cutoff; // decpt shown in exponent form, but not in decimal form
+ }
+
+ if (decpt != digits.length() && (decpt <= -4 || decpt > cutoff))
num_str = exponentForm(_zero, decimal, exponential, group, plus, minus,
digits, decpt, precision, mode,
- always_show_decpt);
+ always_show_decpt, flags & ZeroPadExponent);
else
num_str = decimalForm(_zero, decimal, group,
digits, decpt, precision, mode,
@@ -2831,23 +2808,22 @@ QString QLocaleData::doubleToString(const QChar _zero, const QChar plus, const Q
}
}
- negative = sign != 0 && !isZero(d);
- }
-
- // pad with zeros. LeftAdjusted overrides this flag). Also, we don't
- // pad special numbers
- if (flags & QLocaleData::ZeroPadded
- && !(flags & QLocaleData::LeftAdjusted)
- && !special_number) {
- int num_pad_chars = width - num_str.length();
- // leave space for the sign
- if (negative
- || flags & QLocaleData::AlwaysShowSign
- || flags & QLocaleData::BlankBeforePositive)
- --num_pad_chars;
-
- for (int i = 0; i < num_pad_chars; ++i)
- num_str.prepend(_zero);
+ if (isZero(d))
+ negative = false;
+
+ // pad with zeros. LeftAdjusted overrides this flag). Also, we don't
+ // pad special numbers
+ if (flags & QLocaleData::ZeroPadded && !(flags & QLocaleData::LeftAdjusted)) {
+ int num_pad_chars = width - num_str.length();
+ // leave space for the sign
+ if (negative
+ || flags & QLocaleData::AlwaysShowSign
+ || flags & QLocaleData::BlankBeforePositive)
+ --num_pad_chars;
+
+ for (int i = 0; i < num_pad_chars; ++i)
+ num_str.prepend(_zero);
+ }
}
// add sign
@@ -3042,9 +3018,8 @@ QString QLocaleData::unsLongLongToString(const QChar zero, const QChar group,
number. We can't detect junk here, since we don't even know the base
of the number.
*/
-bool QLocaleData::numberToCLocale(const QChar *str, int len,
- GroupSeparatorMode group_sep_mode,
- CharBuff *result) const
+bool QLocaleData::numberToCLocale(const QChar *str, int len, QLocale::NumberOptions number_options,
+ CharBuff *result) const
{
const QChar *uc = str;
int l = len;
@@ -3066,6 +3041,7 @@ bool QLocaleData::numberToCLocale(const QChar *str, int len,
int decpt_idx = -1;
int last_separator_idx = -1;
int start_of_digits_idx = -1;
+ int exponent_idx = -1;
while (idx < l) {
const QChar in = uc[idx];
@@ -3084,7 +3060,19 @@ bool QLocaleData::numberToCLocale(const QChar *str, int len,
else
break;
}
- if (group_sep_mode == ParseGroupSeparators) {
+
+ if (number_options & QLocale::RejectLeadingZeroInExponent) {
+ if (out == 'e' || out == 'E') {
+ exponent_idx = idx;
+ } else if (exponent_idx != -1) {
+ if (out >= '1' && out <= '9')
+ exponent_idx = -1; // leading digit is not 0, forget exponent_idx
+ else if (out == '0' && idx < l - 1)
+ return false;
+ }
+ }
+
+ if (!(number_options & QLocale::RejectGroupSeparator)) {
if (start_of_digits_idx == -1 && out >= '0' && out <= '9') {
start_of_digits_idx = idx;
} else if (out == ',') {
@@ -3127,7 +3115,7 @@ bool QLocaleData::numberToCLocale(const QChar *str, int len,
++idx;
}
- if (group_sep_mode == ParseGroupSeparators) {
+ if (!(number_options & QLocale::RejectGroupSeparator)) {
// group separator post-processing
// did we end in a separator?
if (last_separator_idx + 1 == idx)
@@ -3142,7 +3130,7 @@ bool QLocaleData::numberToCLocale(const QChar *str, int len,
}
bool QLocaleData::validateChars(const QString &str, NumberMode numMode, QByteArray *buff,
- int decDigits, bool rejectGroupSeparators) const
+ int decDigits, QLocale::NumberOptions number_options) const
{
buff->clear();
buff->reserve(str.length());
@@ -3164,6 +3152,13 @@ bool QLocaleData::validateChars(const QString &str, NumberMode numMode, QByteArr
if (dec && decDigits != -1 && decDigits < ++decDigitCnt)
return false;
}
+
+ // The only non-digit character after the 'e' can be '+' or '-'.
+ // If a zero is directly after that, then the exponent is zero-padded.
+ if ((number_options & QLocale::RejectLeadingZeroInExponent) && c == '0' && eCnt > 0 &&
+ !lastWasDigit)
+ return false;
+
lastWasDigit = true;
} else {
switch (c) {
@@ -3203,7 +3198,8 @@ bool QLocaleData::validateChars(const QString &str, NumberMode numMode, QByteArr
case ',':
//it can only be placed after a digit which is before the decimal point
- if (rejectGroupSeparators || !lastWasDigit || decPointCnt > 0)
+ if ((number_options & QLocale::RejectGroupSeparator) || !lastWasDigit ||
+ decPointCnt > 0)
return false;
break;
@@ -3235,22 +3231,27 @@ bool QLocaleData::validateChars(const QString &str, NumberMode numMode, QByteArr
}
double QLocaleData::stringToDouble(const QChar *begin, int len, bool *ok,
- GroupSeparatorMode group_sep_mode) const
+ QLocale::NumberOptions number_options) const
{
CharBuff buff;
- if (!numberToCLocale(begin, len, group_sep_mode, &buff)) {
+ if (!numberToCLocale(begin, len, number_options, &buff)) {
if (ok != 0)
*ok = false;
return 0.0;
}
- return bytearrayToDouble(buff.constData(), ok);
+ int processed = 0;
+ bool nonNullOk = false;
+ double d = asciiToDouble(buff.constData(), buff.length() - 1, nonNullOk, processed);
+ if (ok)
+ *ok = nonNullOk;
+ return d;
}
-qlonglong QLocaleData::stringToLongLong(const QChar *begin, int len, int base,
- bool *ok, GroupSeparatorMode group_sep_mode) const
+qlonglong QLocaleData::stringToLongLong(const QChar *begin, int len, int base, bool *ok,
+ QLocale::NumberOptions number_options) const
{
CharBuff buff;
- if (!numberToCLocale(begin, len, group_sep_mode, &buff)) {
+ if (!numberToCLocale(begin, len, number_options, &buff)) {
if (ok != 0)
*ok = false;
return 0;
@@ -3259,11 +3260,11 @@ qlonglong QLocaleData::stringToLongLong(const QChar *begin, int len, int base,
return bytearrayToLongLong(buff.constData(), base, ok);
}
-qulonglong QLocaleData::stringToUnsLongLong(const QChar *begin, int len, int base,
- bool *ok, GroupSeparatorMode group_sep_mode) const
+qulonglong QLocaleData::stringToUnsLongLong(const QChar *begin, int len, int base, bool *ok,
+ QLocale::NumberOptions number_options) const
{
CharBuff buff;
- if (!numberToCLocale(begin, len, group_sep_mode, &buff)) {
+ if (!numberToCLocale(begin, len, number_options, &buff)) {
if (ok != 0)
*ok = false;
return 0;
@@ -3274,53 +3275,15 @@ qulonglong QLocaleData::stringToUnsLongLong(const QChar *begin, int len, int bas
double QLocaleData::bytearrayToDouble(const char *num, bool *ok, bool *overflow)
{
- if (ok != 0)
- *ok = true;
- if (overflow != 0)
- *overflow = false;
-
- if (*num == '\0') {
- if (ok != 0)
- *ok = false;
- return 0.0;
- }
-
- if (qstrcmp(num, "nan") == 0)
- return qt_snan();
-
- if (qstrcmp(num, "+inf") == 0 || qstrcmp(num, "inf") == 0)
- return qt_inf();
-
- if (qstrcmp(num, "-inf") == 0)
- return -qt_inf();
-
- bool _ok;
- const char *endptr;
- double d = qstrtod(num, &endptr, &_ok);
-
- if (!_ok) {
- // the only way strtod can fail with *endptr != '\0' on a non-empty
- // input string is overflow
- if (ok != 0)
- *ok = false;
- if (overflow != 0)
- *overflow = *endptr != '\0';
- return 0.0;
- }
-
- if (*endptr != '\0') {
- // we stopped at a non-digit character after converting some digits
- if (ok != 0)
- *ok = false;
- if (overflow != 0)
- *overflow = false;
- return 0.0;
- }
-
- if (ok != 0)
- *ok = true;
- if (overflow != 0)
- *overflow = false;
+ bool nonNullOk = false;
+ int len = static_cast<int>(strlen(num));
+ Q_ASSERT(len >= 0);
+ int processed = 0;
+ double d = asciiToDouble(num, len, nonNullOk, processed);
+ if (ok)
+ *ok = nonNullOk;
+ if (overflow)
+ *overflow = processed < len;
return d;
}
diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
index 729fd73a5d..e90354138c 100644
--- a/src/corelib/tools/qlocale.h
+++ b/src/corelib/tools/qlocale.h
@@ -843,11 +843,18 @@ public:
enum FormatType { LongFormat, ShortFormat, NarrowFormat };
enum NumberOption {
+ DefaultNumberOptions = 0x0,
OmitGroupSeparator = 0x01,
- RejectGroupSeparator = 0x02
+ RejectGroupSeparator = 0x02,
+ OmitLeadingZeroInExponent = 0x04,
+ RejectLeadingZeroInExponent = 0x08
};
Q_DECLARE_FLAGS(NumberOptions, NumberOption)
+ enum FloatingPointPrecisionOption {
+ FloatingPointShortest = -128
+ };
+
enum CurrencySymbolFormat {
CurrencyIsoCode,
CurrencySymbol,
diff --git a/src/corelib/tools/qlocale.qdoc b/src/corelib/tools/qlocale.qdoc
index c87e67cf17..76195ab666 100644
--- a/src/corelib/tools/qlocale.qdoc
+++ b/src/corelib/tools/qlocale.qdoc
@@ -930,17 +930,44 @@
conversions. They can be retrieved with numberOptions() and set with
setNumberOptions().
+ \value DefaultNumberOptions This option represents the default behavior, with
+ group separators and with one leading zero in single digit exponents.
\value OmitGroupSeparator If this option is set, the number-to-string functions
will not insert group separators in their return values. The default
is to insert group separators.
\value RejectGroupSeparator If this option is set, the string-to-number functions
will fail if they encounter group separators in their input. The default
is to accept numbers containing correctly placed group separators.
+ \value OmitLeadingZeroInExponent If this option is set, the number-to-string
+ functions will not pad exponents with zeroes when printing floating point
+ numbers in scientific notation. The default is to add one leading zero to
+ single digit exponents.
+ \value RejectLeadingZeroInExponent If this option is set, the string-to-number
+ functions will fail if they encounter an exponent padded with zeroes when
+ parsing a floating point number in scientific notation. The default is to
+ accept such padding.
\sa setNumberOptions(), numberOptions()
*/
/*!
+ \enum QLocale::FloatingPointPrecisionOption
+
+ This enum defines constants that can be given as precision to QString::number(),
+ QByteArray::number(), and QLocale::toString() when converting floats or doubles,
+ in order to express a variable number of digits as precision.
+
+ \value FloatingPointShortest The conversion algorithm will try to find the
+ shortest accurate representation for the given number. "Accurate" means
+ that you get the exact same number back from an inverse conversion on
+ the generated string representation.
+
+ \sa toString(), QString, QByteArray
+
+ \since 5.7
+*/
+
+/*!
\enum QLocale::MeasurementSystem
This enum defines which units are used for measurement.
diff --git a/src/corelib/tools/qlocale_blackberry.cpp b/src/corelib/tools/qlocale_blackberry.cpp
deleted file mode 100644
index c8543ca9b8..0000000000
--- a/src/corelib/tools/qlocale_blackberry.cpp
+++ /dev/null
@@ -1,333 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qlocale_blackberry.h"
-#include "qlocale_p.h"
-
-#include "qdatetime.h"
-
-#include "qcoreapplication.h"
-#include "private/qcore_unix_p.h"
-
-#include <errno.h>
-#include <sys/pps.h>
-#include <unistd.h>
-
-QT_BEGIN_NAMESPACE
-
-#ifndef QT_NO_SYSTEMLOCALE
-
-static const char ppsUomPath[] = "/pps/services/locale/uom";
-static const char ppsRegionLocalePath[] = "/pps/services/locale/settings";
-static const char ppsLanguageLocalePath[] = "/pps/services/confstr/_CS_LOCALE";
-static const char ppsHourFormatPath[] = "/pps/system/settings";
-
-static const int MAX_PPS_SIZE = 16000;
-
-QBBSystemLocaleData::QBBSystemLocaleData()
- : languageNotifier(0)
- , regionNotifier(0)
- , measurementNotifier(0)
- , hourNotifier(0)
-{
- // Do not use qWarning to log warnings if qt_safe_open fails to open the pps file
- // since the user code may install a message handler that invokes QLocale API again
- // (i.e QDate, QDateTime, ...) which will cause a deadlock.
- if ((measurementFd = qt_safe_open(ppsUomPath, O_RDONLY)) == -1)
- fprintf(stderr, "Failed to open uom pps, errno=%d\n", errno);
-
- if ((regionFd = qt_safe_open(ppsRegionLocalePath, O_RDONLY)) == -1)
- fprintf(stderr, "Failed to open region pps, errno=%d\n", errno);
-
- if ((languageFd = qt_safe_open(ppsLanguageLocalePath, O_RDONLY)) == -1)
- fprintf(stderr, "Failed to open language pps, errno=%d\n", errno);
-
- if ((hourFd = qt_safe_open(ppsHourFormatPath, O_RDONLY)) == -1)
- fprintf(stderr, "Failed to open hour format pps, errno=%d\n", errno);
-
- // we cannot call this directly, because by the time this constructor is
- // called, the event dispatcher has not yet been created, causing the
- // subsequent call to QSocketNotifier constructor to fail.
- QMetaObject::invokeMethod(this, "installSocketNotifiers", Qt::QueuedConnection);
-
- readLanguageLocale();
- readRegionLocale();
- readMeasurementSystem();
- readHourFormat();
-}
-
-QBBSystemLocaleData::~QBBSystemLocaleData()
-{
- if (measurementFd != -1)
- qt_safe_close(measurementFd);
-
- if (languageFd != -1)
- qt_safe_close(languageFd);
-
- if (regionFd != -1)
- qt_safe_close(regionFd);
-
- if (hourFd != -1)
- qt_safe_close(hourFd);
-}
-
-uint QBBSystemLocaleData::measurementSystem()
-{
- return m_measurementSystem;
-}
-
-QVariant QBBSystemLocaleData::timeFormat(QLocale::FormatType formatType)
-{
- return getCorrectFormat(regionLocale().timeFormat(formatType), formatType);
-}
-
-QVariant QBBSystemLocaleData::dateTimeFormat(QLocale::FormatType formatType)
-{
- return getCorrectFormat(regionLocale().dateTimeFormat(formatType), formatType);
-}
-
-QLocale QBBSystemLocaleData::languageLocale()
-{
- if (!lc_language.isEmpty())
- return QLocale(QLatin1String(lc_language));
-
- return QLocale::c();
-}
-
-QLocale QBBSystemLocaleData::regionLocale()
-{
- if (!lc_region.isEmpty())
- return QLocale(QLatin1String(lc_region));
-
- return QLocale::c();
-}
-
-void QBBSystemLocaleData::installSocketNotifiers()
-{
- Q_ASSERT(!languageNotifier || !regionNotifier || !measurementNotifier || !hourNotifier);
- Q_ASSERT(QCoreApplication::instance());
-
- languageNotifier = new QSocketNotifier(languageFd, QSocketNotifier::Read, this);
- QObject::connect(languageNotifier, SIGNAL(activated(int)), this, SLOT(readLanguageLocale()));
-
- regionNotifier = new QSocketNotifier(regionFd, QSocketNotifier::Read, this);
- QObject::connect(regionNotifier, SIGNAL(activated(int)), this, SLOT(readRegionLocale()));
-
- measurementNotifier = new QSocketNotifier(measurementFd, QSocketNotifier::Read, this);
- QObject::connect(measurementNotifier, SIGNAL(activated(int)), this, SLOT(readMeasurementSystem()));
-
- hourNotifier = new QSocketNotifier(hourFd, QSocketNotifier::Read, this);
- QObject::connect(hourNotifier, SIGNAL(activated(int)), this, SLOT(readHourFormat()));
-}
-
-void QBBSystemLocaleData::readLanguageLocale()
-{
- lc_language = readPpsValue("_CS_LOCALE", languageFd);
-}
-
-void QBBSystemLocaleData::readRegionLocale()
-{
- lc_region = readPpsValue("region", regionFd);
-}
-
-void QBBSystemLocaleData::readMeasurementSystem()
-{
- QByteArray measurement = readPpsValue("uom", measurementFd);
- m_measurementSystem = (qstrcmp(measurement, "imperial") == 0) ? QLocale::ImperialSystem : QLocale::MetricSystem;
-}
-
-void QBBSystemLocaleData::readHourFormat()
-{
- QByteArray hourFormat = readPpsValue("hourFormat", hourFd);
- is24HourFormat = (qstrcmp(hourFormat, "24") == 0);
-}
-
-QByteArray QBBSystemLocaleData::readPpsValue(const char *ppsObject, int ppsFd)
-{
- QByteArray result;
- if (!ppsObject || ppsFd == -1)
- return result;
-
- // PPS objects are of unknown size, but must be read all at once.
- // Relying on the file size may not be a good idea since the size may change before reading.
- // Let's try with an initial size (512), and if the buffer is too small try with bigger one,
- // until we succeed or until other non buffer-size-related error occurs.
- // Using QVarLengthArray means the first try (of size == 512) uses a buffer on the stack - no allocation necessary.
- // Hopefully that covers most use cases.
- int bytes;
- QVarLengthArray<char, 512> buffer(512);
- for (;;) {
- errno = 0;
- bytes = qt_safe_read(ppsFd, buffer.data(), buffer.size() - 1);
- const bool bufferIsTooSmall = (bytes == -1 && errno == EMSGSIZE && buffer.size() < MAX_PPS_SIZE);
- if (!bufferIsTooSmall)
- break;
-
- buffer.resize(qMin(buffer.size()*2, MAX_PPS_SIZE));
- }
-
- // This method is called in the ctor(), so do not use qWarning to log warnings
- // if qt_safe_read fails to read the pps file
- // since the user code may install a message handler that invokes QLocale API again
- // (i.e QDate, QDateTime, ...) which will cause a deadlock.
- if (bytes == -1) {
- fprintf(stderr, "Failed to read pps object:%s, errno=%d\n", ppsObject, errno);
- return result;
- }
- // ensure data is null terminated
- buffer[bytes] = '\0';
-
- pps_decoder_t ppsDecoder;
- pps_decoder_initialize(&ppsDecoder, 0);
- if (pps_decoder_parse_pps_str(&ppsDecoder, buffer.data()) == PPS_DECODER_OK) {
- pps_decoder_push(&ppsDecoder, 0);
- const char *ppsBuff;
- if (pps_decoder_get_string(&ppsDecoder, ppsObject, &ppsBuff) == PPS_DECODER_OK) {
- result = ppsBuff;
- } else {
- int val;
- if (pps_decoder_get_int(&ppsDecoder, ppsObject, &val) == PPS_DECODER_OK)
- result = QByteArray::number(val);
- }
- }
-
- pps_decoder_cleanup(&ppsDecoder);
-
- return result;
-}
-
-QString QBBSystemLocaleData::getCorrectFormat(const QString &baseFormat, QLocale::FormatType formatType)
-{
- QString format = baseFormat;
- if (is24HourFormat) {
- if (format.contains(QStringLiteral("AP"), Qt::CaseInsensitive)) {
- format.replace(QStringLiteral("AP"), QStringLiteral(""), Qt::CaseInsensitive);
- format.replace(QStringLiteral("h"), QStringLiteral("H"), Qt::CaseSensitive);
- }
-
- } else {
-
- if (!format.contains(QStringLiteral("AP"), Qt::CaseInsensitive)) {
- format.contains(QStringLiteral("HH"), Qt::CaseSensitive) ?
- format.replace(QStringLiteral("HH"), QStringLiteral("hh"), Qt::CaseSensitive) :
- format.replace(QStringLiteral("H"), QStringLiteral("h"), Qt::CaseSensitive);
-
- formatType == QLocale::LongFormat ? format.append(QStringLiteral(" AP t")) : format.append(QStringLiteral(" AP"));
- }
- }
-
- return format;
-}
-
-Q_GLOBAL_STATIC(QBBSystemLocaleData, bbSysLocaleData)
-
-QLocale QSystemLocale::fallbackUiLocale() const
-{
- return bbSysLocaleData()->languageLocale();
-}
-
-QVariant QSystemLocale::query(QueryType type, QVariant in) const
-{
- QBBSystemLocaleData *d = bbSysLocaleData();
-
- QReadLocker locker(&d->lock);
-
- const QLocale &lc_language = d->languageLocale();
- const QLocale &lc_region = d->regionLocale();
-
- switch (type) {
- case DecimalPoint:
- return lc_region.decimalPoint();
- case GroupSeparator:
- return lc_region.groupSeparator();
- case NegativeSign:
- return lc_region.negativeSign();
- case PositiveSign:
- return lc_region.positiveSign();
- case DateFormatLong:
- return lc_region.dateFormat(QLocale::LongFormat);
- case DateFormatShort:
- return lc_region.dateFormat(QLocale::ShortFormat);
- case TimeFormatLong:
- return d->timeFormat(QLocale::LongFormat);
- case TimeFormatShort:
- return d->timeFormat(QLocale::ShortFormat);
- case DateTimeFormatLong:
- return d->dateTimeFormat(QLocale::LongFormat);
- case DateTimeFormatShort:
- return d->dateTimeFormat(QLocale::ShortFormat);
- case DayNameLong:
- return lc_language.dayName(in.toInt(), QLocale::LongFormat);
- case DayNameShort:
- return lc_language.dayName(in.toInt(), QLocale::ShortFormat);
- case MonthNameLong:
- return lc_language.monthName(in.toInt(), QLocale::LongFormat);
- case MonthNameShort:
- return lc_language.monthName(in.toInt(), QLocale::ShortFormat);
- case StandaloneMonthNameLong:
- return lc_language.standaloneMonthName(in.toInt(), QLocale::LongFormat);
- case StandaloneMonthNameShort:
- return lc_language.standaloneMonthName(in.toInt(), QLocale::ShortFormat);
- case DateToStringLong:
- return lc_region.toString(in.toDate(), QLocale::LongFormat);
- case DateToStringShort:
- return lc_region.toString(in.toDate(), QLocale::ShortFormat);
- case TimeToStringLong:
- return lc_region.toString(in.toTime(), d->timeFormat(QLocale::LongFormat).toString());
- case TimeToStringShort:
- return lc_region.toString(in.toTime(), d->timeFormat(QLocale::ShortFormat).toString());
- case DateTimeToStringShort:
- return lc_region.toString(in.toDateTime(), d->dateTimeFormat(QLocale::ShortFormat).toString());
- case DateTimeToStringLong:
- return lc_region.toString(in.toDateTime(), d->dateTimeFormat(QLocale::LongFormat).toString());
- case MeasurementSystem:
- return d->measurementSystem();
- case ZeroDigit:
- return lc_region.zeroDigit();
- case CountryId:
- return lc_region.country();
- case LanguageId:
- return lc_language.language();
- case AMText:
- return lc_language.amText();
- case PMText:
- return lc_language.pmText();
- default:
- break;
- }
- return QVariant();
-}
-
-#endif
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qlocale_blackberry.h b/src/corelib/tools/qlocale_blackberry.h
deleted file mode 100644
index 317ae375ae..0000000000
--- a/src/corelib/tools/qlocale_blackberry.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QLOCALE_BLACKBERRY_H
-#define QLOCALE_BLACKBERRY_H
-
-#include <QtCore/qsocketnotifier.h>
-#include <QtCore/qreadwritelock.h>
-#include <QtCore/qlocale.h>
-
-QT_BEGIN_NAMESPACE
-
-#ifndef QT_NO_SYSTEMLOCALE
-
-class QBBSystemLocaleData : public QObject
-{
- Q_OBJECT
-
-public:
- QBBSystemLocaleData();
- virtual ~QBBSystemLocaleData();
- uint measurementSystem();
- QVariant timeFormat(QLocale::FormatType);
- QVariant dateTimeFormat(QLocale::FormatType);
- QLocale languageLocale();
- QLocale regionLocale();
-
- QReadWriteLock lock;
-
-public Q_SLOTS:
- void installSocketNotifiers();
- void readLanguageLocale();
- void readRegionLocale();
- void readMeasurementSystem();
- void readHourFormat();
-
-private:
- QByteArray readPpsValue(const char *ppsObject, int ppsFd);
- QString getCorrectFormat(const QString &baseFormat, QLocale::FormatType typeFormat);
-
- QByteArray lc_language;
- QByteArray lc_region;
- uint m_measurementSystem;
- bool is24HourFormat;
-
- QSocketNotifier *languageNotifier;
- QSocketNotifier *regionNotifier;
- QSocketNotifier *measurementNotifier;
- QSocketNotifier *hourNotifier;
-
- int languageFd;
- int regionFd;
- int measurementFd;
- int hourFd;
-};
-#endif // QT_NO_SYSTEMLOCALE
-
-QT_END_NAMESPACE
-
-#endif // QLOCALE_BLACKBERRY_H
-
diff --git a/src/corelib/tools/qlocale_p.h b/src/corelib/tools/qlocale_p.h
index b3fd7a96b8..65d4d58def 100644
--- a/src/corelib/tools/qlocale_p.h
+++ b/src/corelib/tools/qlocale_p.h
@@ -165,6 +165,17 @@ public:
QLocale::Country country);
static const QLocaleData *c();
+ // Maximum number of significant digits needed to represent a double.
+ // We cannot use std::numeric_limits here without constexpr.
+ static const int DoubleMantissaBits = 53;
+ static const int Log10_2_100000 = 30103; // log10(2) * 100000
+ // same as C++11 std::numeric_limits<T>::max_digits10
+ static const int DoubleMaxSignificant = (DoubleMantissaBits * Log10_2_100000) / 100000 + 2;
+
+ // Maximum number of digits before decimal point to represent a double
+ // Same as std::numeric_limits<double>::max_exponent10 + 1
+ static const int DoubleMaxDigitsBeforeDecimal = 309;
+
enum DoubleForm {
DFExponent = 0,
DFDecimal,
@@ -184,14 +195,10 @@ public:
ShowBase = 0x80,
UppercaseBase = 0x100,
+ ZeroPadExponent = 0x200,
ForcePoint = Alternate
};
- enum GroupSeparatorMode {
- FailOnGroupSeparators,
- ParseGroupSeparators
- };
-
enum NumberMode { IntegerMode, DoubleStandardMode, DoubleScientificMode };
typedef QVarLengthArray<char, 256> CharBuff;
@@ -239,24 +246,26 @@ public:
return float(d);
}
- double stringToDouble(const QChar *begin, int len, bool *ok, GroupSeparatorMode group_sep_mode) const;
- qint64 stringToLongLong(const QChar *begin, int len, int base, bool *ok, GroupSeparatorMode group_sep_mode) const;
- quint64 stringToUnsLongLong(const QChar *begin, int len, int base, bool *ok, GroupSeparatorMode group_sep_mode) const;
+ double stringToDouble(const QChar *begin, int len, bool *ok,
+ QLocale::NumberOptions number_options) const;
+ qint64 stringToLongLong(const QChar *begin, int len, int base, bool *ok,
+ QLocale::NumberOptions number_options) const;
+ quint64 stringToUnsLongLong(const QChar *begin, int len, int base, bool *ok,
+ QLocale::NumberOptions number_options) const;
// these functions are used in QIntValidator (QtGui)
Q_CORE_EXPORT static double bytearrayToDouble(const char *num, bool *ok, bool *overflow = 0);
Q_CORE_EXPORT static qint64 bytearrayToLongLong(const char *num, int base, bool *ok, bool *overflow = 0);
Q_CORE_EXPORT static quint64 bytearrayToUnsLongLong(const char *num, int base, bool *ok);
- bool numberToCLocale(const QChar *str, int len,
- GroupSeparatorMode group_sep_mode,
- CharBuff *result) const;
+ bool numberToCLocale(const QChar *str, int len, QLocale::NumberOptions number_options,
+ CharBuff *result) const;
inline char digitToCLocale(QChar c) const;
// this function is used in QIntValidator (QtGui)
- Q_CORE_EXPORT bool validateChars(const QString &str, NumberMode numMode,
- QByteArray *buff, int decDigits = -1,
- bool rejectGroupSeparators = false) const;
+ Q_CORE_EXPORT bool validateChars(
+ const QString &str, NumberMode numMode, QByteArray *buff, int decDigits = -1,
+ QLocale::NumberOptions number_options = QLocale::DefaultNumberOptions) const;
public:
quint16 m_language_id, m_script_id, m_country_id;
@@ -304,7 +313,9 @@ public:
class Q_CORE_EXPORT QLocalePrivate
{
public:
- static QLocalePrivate *create(const QLocaleData *data, int numberOptions = 0)
+ static QLocalePrivate *create(
+ const QLocaleData *data,
+ QLocale::NumberOptions numberOptions = QLocale::DefaultNumberOptions)
{
QLocalePrivate *retval = new QLocalePrivate;
retval->m_data = data;
@@ -351,7 +362,7 @@ public:
const QLocaleData *m_data;
QBasicAtomicInt ref;
- quint16 m_numberOptions;
+ QLocale::NumberOptions m_numberOptions;
};
template <>
diff --git a/src/corelib/tools/qlocale_tools.cpp b/src/corelib/tools/qlocale_tools.cpp
index 03b911c4b3..f766a301c5 100644
--- a/src/corelib/tools/qlocale_tools.cpp
+++ b/src/corelib/tools/qlocale_tools.cpp
@@ -33,9 +33,12 @@
****************************************************************************/
#include "qlocale_tools_p.h"
+#include "qdoublescanprint_p.h"
#include "qlocale_p.h"
#include "qstring.h"
+#include <private/qnumeric_p.h>
+
#include <ctype.h>
#include <errno.h>
#include <float.h>
@@ -44,10 +47,6 @@
#include <stdlib.h>
#include <time.h>
-#ifdef Q_OS_WINCE
-# include "qfunctions_wince.h" // for _control87
-#endif
-
#if defined(Q_OS_LINUX) && !defined(__UCLIBC__)
# include <fenv.h>
#endif
@@ -68,6 +67,307 @@ QT_BEGIN_NAMESPACE
#include "../../3rdparty/freebsd/strtoull.c"
#include "../../3rdparty/freebsd/strtoll.c"
+QT_CLOCALE_HOLDER
+
+void doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, char *buf, int bufSize,
+ bool &sign, int &length, int &decpt)
+{
+ if (bufSize == 0) {
+ decpt = 0;
+ sign = d < 0;
+ length = 0;
+ return;
+ }
+
+ // Detect special numbers (nan, +/-inf)
+ // We cannot use the high-level API of libdouble-conversion as we need to apply locale-specific
+ // formatting, such as decimal points, thousands-separators, etc. Because of this, we have to
+ // check for infinity and NaN before calling DoubleToAscii.
+ if (qt_is_inf(d)) {
+ sign = d < 0;
+ if (bufSize >= 3) {
+ buf[0] = 'i';
+ buf[1] = 'n';
+ buf[2] = 'f';
+ length = 3;
+ } else {
+ length = 0;
+ }
+ return;
+ } else if (qt_is_nan(d)) {
+ if (bufSize >= 3) {
+ buf[0] = 'n';
+ buf[1] = 'a';
+ buf[2] = 'n';
+ length = 3;
+ } else {
+ length = 0;
+ }
+ return;
+ }
+
+ if (form == QLocaleData::DFSignificantDigits && precision == 0)
+ precision = 1; // 0 significant digits is silently converted to 1
+
+#if !defined(QT_NO_DOUBLECONVERSION) && !defined(QT_BOOTSTRAPPED)
+ // one digit before the decimal dot, counts as significant digit for DoubleToStringConverter
+ if (form == QLocaleData::DFExponent && precision >= 0)
+ ++precision;
+
+ double_conversion::DoubleToStringConverter::DtoaMode mode;
+ if (precision == QLocale::FloatingPointShortest) {
+ mode = double_conversion::DoubleToStringConverter::SHORTEST;
+ } else if (form == QLocaleData::DFSignificantDigits || form == QLocaleData::DFExponent) {
+ mode = double_conversion::DoubleToStringConverter::PRECISION;
+ } else {
+ mode = double_conversion::DoubleToStringConverter::FIXED;
+ }
+ double_conversion::DoubleToStringConverter::DoubleToAscii(d, mode, precision, buf, bufSize,
+ &sign, &length, &decpt);
+#else // QT_NO_DOUBLECONVERSION || QT_BOOTSTRAPPED
+
+ // Cut the precision at 999, to fit it into the format string. We can't get more than 17
+ // significant digits, so anything after that is mostly noise. You do get closer to the "middle"
+ // of the range covered by the given double with more digits, so to a degree it does make sense
+ // to honor higher precisions. We define that at more than 999 digits that is not the case.
+ if (precision > 999)
+ precision = 999;
+ else if (precision == QLocale::FloatingPointShortest)
+ precision = QLocaleData::DoubleMaxSignificant; // "shortest" mode not supported by snprintf
+
+ if (isZero(d)) {
+ // Negative zero is expected as simple "0", not "-0". We cannot do d < 0, though.
+ sign = false;
+ buf[0] = '0';
+ length = 1;
+ decpt = 1;
+ return;
+ } else if (d < 0) {
+ sign = true;
+ d = -d;
+ } else {
+ sign = false;
+ }
+
+ const int formatLength = 7; // '%', '.', 3 digits precision, 'f', '\0'
+ char format[formatLength];
+ format[formatLength - 1] = '\0';
+ format[0] = '%';
+ format[1] = '.';
+ format[2] = char((precision / 100) % 10) + '0';
+ format[3] = char((precision / 10) % 10) + '0';
+ format[4] = char(precision % 10) + '0';
+ int extraChars;
+ switch (form) {
+ case QLocaleData::DFDecimal:
+ format[formatLength - 2] = 'f';
+ // <anything> '.' <precision> '\0' - optimize for numbers smaller than 512k
+ extraChars = (d > (1 << 19) ? QLocaleData::DoubleMaxDigitsBeforeDecimal : 6) + 2;
+ break;
+ case QLocaleData::DFExponent:
+ format[formatLength - 2] = 'e';
+ // '.', 'e', '-', <exponent> '\0'
+ extraChars = 7;
+ break;
+ case QLocaleData::DFSignificantDigits:
+ format[formatLength - 2] = 'g';
+
+ // either the same as in the 'e' case, or '.' and '\0'
+ // precision covers part before '.'
+ extraChars = 7;
+ break;
+ default:
+ Q_UNREACHABLE();
+ }
+
+ QVarLengthArray<char> target(precision + extraChars);
+
+ length = qDoubleSnprintf(target.data(), target.size(), QT_CLOCALE, format, d);
+ int firstSignificant = 0;
+ int decptInTarget = length;
+
+ // Find the first significant digit (not 0), and note any '.' we encounter.
+ // There is no '-' at the front of target because we made sure d > 0 above.
+ while (firstSignificant < length) {
+ if (target[firstSignificant] == '.')
+ decptInTarget = firstSignificant;
+ else if (target[firstSignificant] != '0')
+ break;
+ ++firstSignificant;
+ }
+
+ // If no '.' found so far, search the rest of the target buffer for it.
+ if (decptInTarget == length)
+ decptInTarget = std::find(target.data() + firstSignificant, target.data() + length, '.') -
+ target.data();
+
+ int eSign = length;
+ if (form != QLocaleData::DFDecimal) {
+ // In 'e' or 'g' form, look for the 'e'.
+ eSign = std::find(target.data() + firstSignificant, target.data() + length, 'e') -
+ target.data();
+
+ if (eSign < length) {
+ // If 'e' is found, the final decimal point is determined by the number after 'e'.
+ // Mind that the final decimal point, decpt, is the offset of the decimal point from the
+ // start of the resulting string in buf. It may be negative or larger than bufSize, in
+ // which case the missing digits are zeroes. In the 'e' case decptInTarget is always 1,
+ // as variants of snprintf always generate numbers with one digit before the '.' then.
+ // This is why the final decimal point is offset by 1, relative to the number after 'e'.
+ bool ok;
+ const char *endptr;
+ decpt = qstrtoll(target.data() + eSign + 1, &endptr, 10, &ok) + 1;
+ Q_ASSERT(ok);
+ Q_ASSERT(endptr - target.data() <= length - eSign -1);
+ } else {
+ // No 'e' found, so it's the 'f' form. Variants of snprintf generate numbers with
+ // potentially multiple digits before the '.', but without decimal exponent then. So we
+ // get the final decimal point from the position of the '.'. The '.' itself takes up one
+ // character. We adjust by 1 below if that gets in the way.
+ decpt = decptInTarget - firstSignificant;
+ }
+ } else {
+ // In 'f' form, there can not be an 'e', so it's enough to look for the '.'
+ // (and possibly adjust by 1 below)
+ decpt = decptInTarget - firstSignificant;
+ }
+
+ // Move the actual digits from the snprintf target to the actual buffer.
+ if (decptInTarget > firstSignificant) {
+ // First move the digits before the '.', if any
+ int lengthBeforeDecpt = decptInTarget - firstSignificant;
+ memcpy(buf, target.data() + firstSignificant, qMin(lengthBeforeDecpt, bufSize));
+ if (eSign > decptInTarget && lengthBeforeDecpt < bufSize) {
+ // Then move any remaining digits, until 'e'
+ memcpy(buf + lengthBeforeDecpt, target.data() + decptInTarget + 1,
+ qMin(eSign - decptInTarget - 1, bufSize - lengthBeforeDecpt));
+ // The final length of the output is the distance between the first significant digit
+ // and 'e' minus 1, for the '.', except if the buffer is smaller.
+ length = qMin(eSign - firstSignificant - 1, bufSize);
+ } else {
+ // 'e' was before the decpt or things didn't fit. Don't subtract the '.' from the length.
+ length = qMin(eSign - firstSignificant, bufSize);
+ }
+ } else {
+ if (eSign > firstSignificant) {
+ // If there are any significant digits at all, they are all after the '.' now.
+ // Just copy them straight away.
+ memcpy(buf, target.data() + firstSignificant, qMin(eSign - firstSignificant, bufSize));
+
+ // The decimal point was before the first significant digit, so we were one off above.
+ // Consider 0.1 - buf will be just '1', and decpt should be 0. But
+ // "decptInTarget - firstSignificant" will yield -1.
+ ++decpt;
+ length = qMin(eSign - firstSignificant, bufSize);
+ } else {
+ // No significant digits means the number is just 0.
+ buf[0] = '0';
+ length = 1;
+ decpt = 1;
+ }
+ }
+#endif // QT_NO_DOUBLECONVERSION || QT_BOOTSTRAPPED
+ while (length > 1 && buf[length - 1] == '0') // drop trailing zeroes
+ --length;
+}
+
+double asciiToDouble(const char *num, int numLen, bool &ok, int &processed)
+{
+ if (*num == '\0') {
+ ok = false;
+ processed = 0;
+ return 0.0;
+ }
+
+ ok = true;
+
+ // We have to catch NaN before because we need NaN as marker for "garbage" in the
+ // libdouble-conversion case and, in contrast to libdouble-conversion or sscanf, we don't allow
+ // "-nan" or "+nan"
+ if (qstrcmp(num, "nan") == 0) {
+ processed = 3;
+ return qt_snan();
+ } else if ((num[0] == '-' || num[0] == '+') && qstrcmp(num + 1, "nan") == 0) {
+ processed = 0;
+ ok = false;
+ return 0.0;
+ }
+
+ // Infinity values are implementation defined in the sscanf case. In the libdouble-conversion
+ // case we need infinity as overflow marker.
+ if (qstrcmp(num, "+inf") == 0) {
+ processed = 4;
+ return qt_inf();
+ } else if (qstrcmp(num, "inf") == 0) {
+ processed = 3;
+ return qt_inf();
+ } else if (qstrcmp(num, "-inf") == 0) {
+ processed = 4;
+ return -qt_inf();
+ }
+
+ double d = 0.0;
+#if !defined(QT_NO_DOUBLECONVERSION) && !defined(QT_BOOTSTRAPPED)
+ int conv_flags = double_conversion::StringToDoubleConverter::NO_FLAGS;
+ double_conversion::StringToDoubleConverter conv(conv_flags, 0.0, qt_snan(), 0, 0);
+ d = conv.StringToDouble(num, numLen, &processed);
+
+ if (!qIsFinite(d)) {
+ ok = false;
+ if (qIsNaN(d)) {
+ // Garbage found. We don't accept it and return 0.
+ processed = 0;
+ return 0.0;
+ } else {
+ // Overflow. That's not OK, but we still return infinity.
+ return d;
+ }
+ }
+#else
+ if (qDoubleSscanf(num, QT_CLOCALE, "%lf%n", &d, &processed) < 1)
+ processed = 0;
+
+ if (processed != numLen || qIsNaN(d)) {
+ // Implementation defined nan symbol or garbage found. We don't accept it.
+ processed = 0;
+ ok = false;
+ return 0.0;
+ }
+
+ if (!qIsFinite(d)) {
+ // Overflow. Check for implementation-defined infinity symbols and reject them.
+ // We assume that any infinity symbol has to contain a character that cannot be part of a
+ // "normal" number (that is 0-9, ., -, +, e).
+ ok = false;
+ for (int i = 0; i < numLen; ++i) {
+ char c = num[i];
+ if ((c < '0' || c > '9') && c != '.' && c != '-' && c != '+' && c != 'e') {
+ // Garbage found
+ processed = 0;
+ return 0.0;
+ }
+ }
+ return d;
+ }
+#endif // !defined(QT_NO_DOUBLECONVERSION) && !defined(QT_BOOTSTRAPPED)
+
+ Q_ASSERT(processed == numLen); // Otherwise we would have gotten NaN or sorted it out above.
+
+ // Check if underflow has occurred.
+ if (isZero(d)) {
+ for (int i = 0; i < numLen; ++i) {
+ if (num[i] >= '1' && num[i] <= '9') {
+ // if a digit before any 'e' is not 0, then a non-zero number was intended.
+ ok = false;
+ return 0.0;
+ } else if (num[i] == 'e') {
+ break;
+ }
+ }
+ }
+ return d;
+}
+
unsigned long long
qstrtoull(const char * nptr, const char **endptr, int base, bool *ok)
{
@@ -114,9 +414,6 @@ qstrtoll(const char * nptr, const char **endptr, int base, bool *ok)
return result;
}
-static char *_qdtoa( NEEDS_VOLATILE double d, int mode, int ndigits, int *decpt,
- int *sign, char **rve, char **digits_str);
-
QString qulltoa(qulonglong l, int base, const QChar _zero)
{
ushort buff[65]; // length of MAX_ULLONG in base 2
@@ -155,7 +452,7 @@ QString qlltoa(qlonglong l, int base, const QChar zero)
}
QString &decimalForm(QChar zero, QChar decimal, QChar group,
- QString &digits, int decpt, uint precision,
+ QString &digits, int decpt, int precision,
PrecisionMode pm,
bool always_show_decpt,
bool thousands_group)
@@ -172,11 +469,11 @@ QString &decimalForm(QChar zero, QChar decimal, QChar group,
if (pm == PMDecimalDigits) {
uint decimal_digits = digits.length() - decpt;
- for (uint i = decimal_digits; i < precision; ++i)
+ for (int i = decimal_digits; i < precision; ++i)
digits.append(zero);
}
else if (pm == PMSignificantDigits) {
- for (uint i = digits.length(); i < precision; ++i)
+ for (int i = digits.length(); i < precision; ++i)
digits.append(zero);
}
else { // pm == PMChopTrailingZeros
@@ -198,18 +495,19 @@ QString &decimalForm(QChar zero, QChar decimal, QChar group,
QString &exponentForm(QChar zero, QChar decimal, QChar exponential,
QChar group, QChar plus, QChar minus,
- QString &digits, int decpt, uint precision,
+ QString &digits, int decpt, int precision,
PrecisionMode pm,
- bool always_show_decpt)
+ bool always_show_decpt,
+ bool leading_zero_in_exponent)
{
int exp = decpt - 1;
if (pm == PMDecimalDigits) {
- for (uint i = digits.length(); i < precision + 1; ++i)
+ for (int i = digits.length(); i < precision + 1; ++i)
digits.append(zero);
}
else if (pm == PMSignificantDigits) {
- for (uint i = digits.length(); i < precision; ++i)
+ for (int i = digits.length(); i < precision; ++i)
digits.append(zero);
}
else { // pm == PMChopTrailingZeros
@@ -220,2398 +518,42 @@ QString &exponentForm(QChar zero, QChar decimal, QChar exponential,
digits.append(exponential);
digits.append(QLocaleData::longLongToString(zero, group, plus, minus,
- exp, 2, 10, -1, QLocaleData::AlwaysShowSign));
+ exp, leading_zero_in_exponent ? 2 : 1, 10, -1, QLocaleData::AlwaysShowSign));
return digits;
}
-/* From: NetBSD: strtod.c,v 1.26 1998/02/03 18:44:21 perry Exp */
-/* $FreeBSD: src/lib/libc/stdlib/netbsd_strtod.c,v 1.2.2.2 2001/03/02 17:14:15 tegge Exp $ */
-
-/* Please send bug reports to
- David M. Gay
- AT&T Bell Laboratories, Room 2C-463
- 600 Mountain Avenue
- Murray Hill, NJ 07974-2070
- U.S.A.
- dmg@research.att.com or research!dmg
- */
-
-/* strtod for IEEE-, VAX-, and IBM-arithmetic machines.
- *
- * This strtod returns a nearest machine number to the input decimal
- * string (or sets errno to ERANGE). With IEEE arithmetic, ties are
- * broken by the IEEE round-even rule. Otherwise ties are broken by
- * biased rounding (add half and chop).
- *
- * Inspired loosely by William D. Clinger's paper "How to Read Floating
- * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101].
- *
- * Modifications:
- *
- * 1. We only require IEEE, IBM, or VAX double-precision
- * arithmetic (not IEEE double-extended).
- * 2. We get by with floating-point arithmetic in a case that
- * Clinger missed -- when we're computing d * 10^n
- * for a small integer d and the integer n is not too
- * much larger than 22 (the maximum integer k for which
- * we can represent 10^k exactly), we may be able to
- * compute (d*10^k) * 10^(e-k) with just one roundoff.
- * 3. Rather than a bit-at-a-time adjustment of the binary
- * result in the hard case, we use floating-point
- * arithmetic to determine the adjustment to within
- * one bit; only in really hard cases do we need to
- * compute a second residual.
- * 4. Because of 3., we don't need a large table of powers of 10
- * for ten-to-e (just some small tables, e.g. of 10^k
- * for 0 <= k <= 22).
- */
-
-/*
- * #define IEEE_LITTLE_ENDIAN for IEEE-arithmetic machines where the least
- * significant byte has the lowest address.
- * #define IEEE_BIG_ENDIAN for IEEE-arithmetic machines where the most
- * significant byte has the lowest address.
- * #define Long int on machines with 32-bit ints and 64-bit longs.
- * #define Sudden_Underflow for IEEE-format machines without gradual
- * underflow (i.e., that flush to zero on underflow).
- * #define IBM for IBM mainframe-style floating-point arithmetic.
- * #define VAX for VAX-style floating-point arithmetic.
- * #define Unsigned_Shifts if >> does treats its left operand as unsigned.
- * #define No_leftright to omit left-right logic in fast floating-point
- * computation of dtoa.
- * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3.
- * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines
- * that use extended-precision instructions to compute rounded
- * products and quotients) with IBM.
- * #define ROUND_BIASED for IEEE-format with biased rounding.
- * #define Inaccurate_Divide for IEEE-format with correctly rounded
- * products but inaccurate quotients, e.g., for Intel i860.
- * #define Just_16 to store 16 bits per 32-bit Long when doing high-precision
- * integer arithmetic. Whether this speeds things up or slows things
- * down depends on the machine and the number being converted.
- * #define KR_headers for old-style C function headers.
- * #define Bad_float_h if your system lacks a float.h or if it does not
- * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP,
- * FLT_RADIX, FLT_ROUNDS, and DBL_MAX.
- * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n)
- * if memory is available and otherwise does something you deem
- * appropriate. If MALLOC is undefined, malloc will be invoked
- * directly -- and assumed always to succeed.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: strtod.c,v 1.26 1998/02/03 18:44:21 perry Exp $");
-#endif /* LIBC_SCCS and not lint */
-
-/*
-#if defined(__m68k__) || defined(__sparc__) || defined(__i386__) || \
- defined(__mips__) || defined(__ns32k__) || defined(__alpha__) || \
- defined(__powerpc__) || defined(Q_OS_WIN) || defined(Q_OS_DARWIN) || defined(Q_OS_MAC) || \
- defined(mips) || defined(Q_OS_AIX) || defined(Q_OS_SOLARIS)
-# define IEEE_BIG_OR_LITTLE_ENDIAN 1
-#endif
-*/
-
-// *All* of our architectures have IEEE arithmetic, don't they?
-#define IEEE_BIG_OR_LITTLE_ENDIAN 1
-
-#ifdef __arm32__
-/*
- * Although the CPU is little endian the FP has different
- * byte and word endianness. The byte order is still little endian
- * but the word order is big endian.
- */
-#define IEEE_BIG_OR_LITTLE_ENDIAN
-#endif
-
-#ifdef vax
-#define VAX
-#endif
-
-#define Long qint32
-#define ULong quint32
-
-#define MALLOC malloc
-
-#ifdef BSD_QDTOA_DEBUG
-QT_BEGIN_INCLUDE_NAMESPACE
-#include <stdio.h>
-QT_END_INCLUDE_NAMESPACE
-
-#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);}
-#endif
-
-#ifdef Unsigned_Shifts
-#define Sign_Extend(a,b) if (b < 0) a |= 0xffff0000;
-#else
-#define Sign_Extend(a,b) /*no-op*/
-#endif
-
-#if (defined(IEEE_BIG_OR_LITTLE_ENDIAN) + defined(VAX) + defined(IBM)) != 1
-#error Exactly one of IEEE_BIG_OR_LITTLE_ENDIAN, VAX, or IBM should be defined.
-#endif
-
-static inline ULong getWord0(const NEEDS_VOLATILE double x)
-{
- const NEEDS_VOLATILE uchar *ptr = reinterpret_cast<const NEEDS_VOLATILE uchar *>(&x);
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- return (ptr[0]<<24) + (ptr[1]<<16) + (ptr[2]<<8) + ptr[3];
- } else {
- return (ptr[7]<<24) + (ptr[6]<<16) + (ptr[5]<<8) + ptr[4];
- }
-}
-
-static inline void setWord0(NEEDS_VOLATILE double *x, ULong l)
-{
- NEEDS_VOLATILE uchar *ptr = reinterpret_cast<NEEDS_VOLATILE uchar *>(x);
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- ptr[0] = uchar(l>>24);
- ptr[1] = uchar(l>>16);
- ptr[2] = uchar(l>>8);
- ptr[3] = uchar(l);
- } else {
- ptr[7] = uchar(l>>24);
- ptr[6] = uchar(l>>16);
- ptr[5] = uchar(l>>8);
- ptr[4] = uchar(l);
- }
-}
-
-static inline ULong getWord1(const NEEDS_VOLATILE double x)
-{
- const NEEDS_VOLATILE uchar *ptr = reinterpret_cast<const NEEDS_VOLATILE uchar *>(&x);
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- return (ptr[4]<<24) + (ptr[5]<<16) + (ptr[6]<<8) + ptr[7];
- } else {
- return (ptr[3]<<24) + (ptr[2]<<16) + (ptr[1]<<8) + ptr[0];
- }
-}
-static inline void setWord1(NEEDS_VOLATILE double *x, ULong l)
-{
- NEEDS_VOLATILE uchar *ptr = reinterpret_cast<uchar NEEDS_VOLATILE *>(x);
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- ptr[4] = uchar(l>>24);
- ptr[5] = uchar(l>>16);
- ptr[6] = uchar(l>>8);
- ptr[7] = uchar(l);
- } else {
- ptr[3] = uchar(l>>24);
- ptr[2] = uchar(l>>16);
- ptr[1] = uchar(l>>8);
- ptr[0] = uchar(l);
- }
-}
-
-static inline void Storeinc(ULong *&a, const ULong &b, const ULong &c)
+double qstrtod(const char *s00, const char **se, bool *ok)
{
-
- *a = (ushort(b) << 16) | ushort(c);
- ++a;
-}
-
-/* #define P DBL_MANT_DIG */
-/* Ten_pmax = floor(P*log(2)/log(5)) */
-/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */
-/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */
-/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */
-
-#if defined(IEEE_BIG_OR_LITTLE_ENDIAN)
-#define Exp_shift 20
-#define Exp_shift1 20
-#define Exp_msk1 0x100000
-#define Exp_msk11 0x100000
-#define Exp_mask 0x7ff00000
-#define P 53
-#define Bias 1023
-#define IEEE_Arith
-#define Emin (-1022)
-#define Exp_1 0x3ff00000
-#define Exp_11 0x3ff00000
-#define Ebits 11
-#define Frac_mask 0xfffff
-#define Frac_mask1 0xfffff
-#define Ten_pmax 22
-#define Bletch 0x10
-#define Bndry_mask 0xfffff
-#define Bndry_mask1 0xfffff
-#if defined(LSB) && defined(Q_OS_VXWORKS)
-#undef LSB
-#endif
-#define LSB 1
-#define Sign_bit 0x80000000
-#define Log2P 1
-#define Tiny0 0
-#define Tiny1 1
-#define Quick_max 14
-#define Int_max 14
-#define Infinite(x) (getWord0(x) == 0x7ff00000) /* sufficient test for here */
-#else
-#undef Sudden_Underflow
-#define Sudden_Underflow
-#ifdef IBM
-#define Exp_shift 24
-#define Exp_shift1 24
-#define Exp_msk1 0x1000000
-#define Exp_msk11 0x1000000
-#define Exp_mask 0x7f000000
-#define P 14
-#define Bias 65
-#define Exp_1 0x41000000
-#define Exp_11 0x41000000
-#define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */
-#define Frac_mask 0xffffff
-#define Frac_mask1 0xffffff
-#define Bletch 4
-#define Ten_pmax 22
-#define Bndry_mask 0xefffff
-#define Bndry_mask1 0xffffff
-#define LSB 1
-#define Sign_bit 0x80000000
-#define Log2P 4
-#define Tiny0 0x100000
-#define Tiny1 0
-#define Quick_max 14
-#define Int_max 15
-#else /* VAX */
-#define Exp_shift 23
-#define Exp_shift1 7
-#define Exp_msk1 0x80
-#define Exp_msk11 0x800000
-#define Exp_mask 0x7f80
-#define P 56
-#define Bias 129
-#define Exp_1 0x40800000
-#define Exp_11 0x4080
-#define Ebits 8
-#define Frac_mask 0x7fffff
-#define Frac_mask1 0xffff007f
-#define Ten_pmax 24
-#define Bletch 2
-#define Bndry_mask 0xffff007f
-#define Bndry_mask1 0xffff007f
-#define LSB 0x10000
-#define Sign_bit 0x8000
-#define Log2P 1
-#define Tiny0 0x80
-#define Tiny1 0
-#define Quick_max 15
-#define Int_max 15
-#endif
-#endif
-
-#ifndef IEEE_Arith
-#define ROUND_BIASED
-#endif
-
-#ifdef RND_PRODQUOT
-#define rounded_product(a,b) a = rnd_prod(a, b)
-#define rounded_quotient(a,b) a = rnd_quot(a, b)
-extern double rnd_prod(double, double), rnd_quot(double, double);
-#else
-#define rounded_product(a,b) a *= b
-#define rounded_quotient(a,b) a /= b
-#endif
-
-#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
-#define Big1 0xffffffff
-
-#ifndef Just_16
-/* When Pack_32 is not defined, we store 16 bits per 32-bit Long.
- * This makes some inner loops simpler and sometimes saves work
- * during multiplications, but it often seems to make things slightly
- * slower. Hence the default is now to store 32 bits per Long.
- */
-#ifndef Pack_32
-#define Pack_32
-#endif
-#endif
-
-#define Kmax 15
-
-struct
-Bigint {
- struct Bigint *next;
- int k, maxwds, sign, wds;
- ULong x[1];
-};
-
- typedef struct Bigint Bigint;
-
-static Bigint *Balloc(int k)
-{
- int x;
- Bigint *rv;
-
- x = 1 << k;
- rv = static_cast<Bigint *>(MALLOC(sizeof(Bigint) + (x-1)*sizeof(Long)));
- Q_CHECK_PTR(rv);
- rv->k = k;
- rv->maxwds = x;
- rv->sign = rv->wds = 0;
- return rv;
-}
-
-static void Bfree(Bigint *v)
-{
- free(v);
-}
-
-#define Bcopy(x,y) memcpy(reinterpret_cast<char *>(&x->sign), reinterpret_cast<char *>(&y->sign), \
-y->wds*sizeof(Long) + 2*sizeof(int))
-
-/* multiply by m and add a */
-static Bigint *multadd(Bigint *b, int m, int a)
-{
- int i, wds;
- ULong *x, y;
-#ifdef Pack_32
- ULong xi, z;
-#endif
- Bigint *b1;
-
- wds = b->wds;
- x = b->x;
- i = 0;
- do {
-#ifdef Pack_32
- xi = *x;
- y = (xi & 0xffff) * m + a;
- z = (xi >> 16) * m + (y >> 16);
- a = (z >> 16);
- *x++ = (z << 16) + (y & 0xffff);
-#else
- y = *x * m + a;
- a = (y >> 16);
- *x++ = y & 0xffff;
-#endif
- }
- while(++i < wds);
- if (a) {
- if (wds >= b->maxwds) {
- b1 = Balloc(b->k+1);
- Bcopy(b1, b);
- Bfree(b);
- b = b1;
- }
- b->x[wds++] = a;
- b->wds = wds;
- }
- return b;
-}
-
-static Bigint *s2b(const char *s, int nd0, int nd, ULong y9)
-{
- Bigint *b;
- int i, k;
- Long x, y;
-
- x = (nd + 8) / 9;
- for(k = 0, y = 1; x > y; y <<= 1, k++) ;
-#ifdef Pack_32
- b = Balloc(k);
- b->x[0] = y9;
- b->wds = 1;
-#else
- b = Balloc(k+1);
- b->x[0] = y9 & 0xffff;
- b->wds = (b->x[1] = y9 >> 16) ? 2 : 1;
-#endif
-
- i = 9;
- if (9 < nd0) {
- s += 9;
- do b = multadd(b, 10, *s++ - '0');
- while(++i < nd0);
- s++;
- }
- else
- s += 10;
- for(; i < nd; i++)
- b = multadd(b, 10, *s++ - '0');
- return b;
-}
-
-static int hi0bits(ULong x)
-{
- int k = 0;
-
- if (!(x & 0xffff0000)) {
- k = 16;
- x <<= 16;
- }
- if (!(x & 0xff000000)) {
- k += 8;
- x <<= 8;
- }
- if (!(x & 0xf0000000)) {
- k += 4;
- x <<= 4;
- }
- if (!(x & 0xc0000000)) {
- k += 2;
- x <<= 2;
- }
- if (!(x & 0x80000000)) {
- k++;
- if (!(x & 0x40000000))
- return 32;
- }
- return k;
-}
-
-static int lo0bits(ULong *y)
-{
- int k;
- ULong x = *y;
-
- if (x & 7) {
- if (x & 1)
- return 0;
- if (x & 2) {
- *y = x >> 1;
- return 1;
- }
- *y = x >> 2;
- return 2;
- }
- k = 0;
- if (!(x & 0xffff)) {
- k = 16;
- x >>= 16;
- }
- if (!(x & 0xff)) {
- k += 8;
- x >>= 8;
- }
- if (!(x & 0xf)) {
- k += 4;
- x >>= 4;
- }
- if (!(x & 0x3)) {
- k += 2;
- x >>= 2;
- }
- if (!(x & 1)) {
- k++;
- x >>= 1;
- if (!x & 1)
- return 32;
- }
- *y = x;
- return k;
-}
-
-static Bigint *i2b(int i)
-{
- Bigint *b;
-
- b = Balloc(1);
- b->x[0] = i;
- b->wds = 1;
- return b;
-}
-
-static Bigint *mult(Bigint *a, Bigint *b)
-{
- Bigint *c;
- int k, wa, wb, wc;
- ULong carry, y, z;
- ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
-#ifdef Pack_32
- ULong z2;
-#endif
-
- if (a->wds < b->wds) {
- c = a;
- a = b;
- b = c;
- }
- k = a->k;
- wa = a->wds;
- wb = b->wds;
- wc = wa + wb;
- if (wc > a->maxwds)
- k++;
- c = Balloc(k);
- for(x = c->x, xa = x + wc; x < xa; x++)
- *x = 0;
- xa = a->x;
- xae = xa + wa;
- xb = b->x;
- xbe = xb + wb;
- xc0 = c->x;
-#ifdef Pack_32
- for(; xb < xbe; xb++, xc0++) {
- if ((y = *xb & 0xffff) != 0) {
- x = xa;
- xc = xc0;
- carry = 0;
- do {
- z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
- carry = z >> 16;
- z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
- carry = z2 >> 16;
- Storeinc(xc, z2, z);
- }
- while(x < xae);
- *xc = carry;
- }
- if ((y = *xb >> 16) != 0) {
- x = xa;
- xc = xc0;
- carry = 0;
- z2 = *xc;
- do {
- z = (*x & 0xffff) * y + (*xc >> 16) + carry;
- carry = z >> 16;
- Storeinc(xc, z, z2);
- z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
- carry = z2 >> 16;
- }
- while(x < xae);
- *xc = z2;
- }
- }
-#else
- for(; xb < xbe; xc0++) {
- if (y = *xb++) {
- x = xa;
- xc = xc0;
- carry = 0;
- do {
- z = *x++ * y + *xc + carry;
- carry = z >> 16;
- *xc++ = z & 0xffff;
- }
- while(x < xae);
- *xc = carry;
- }
- }
-#endif
- for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
- c->wds = wc;
- return c;
-}
-
-static Bigint *p5s;
-
-struct p5s_deleter
-{
- ~p5s_deleter()
- {
- while (p5s) {
- Bigint *next = p5s->next;
- Bfree(p5s);
- p5s = next;
- }
- }
-};
-
-static Bigint *pow5mult(Bigint *b, int k)
-{
- Bigint *b1, *p5, *p51;
- int i;
- static const int p05[3] = { 5, 25, 125 };
-
- if ((i = k & 3) != 0)
- b = multadd(b, p05[i-1], 0);
-
- if (!(k >>= 2))
- return b;
- if (!(p5 = p5s)) {
- /* first time */
- static p5s_deleter deleter;
- p5 = p5s = i2b(625);
- p5->next = 0;
- }
- for(;;) {
- if (k & 1) {
- b1 = mult(b, p5);
- Bfree(b);
- b = b1;
- }
- if (!(k >>= 1))
- break;
- if (!(p51 = p5->next)) {
- p51 = p5->next = mult(p5,p5);
- p51->next = 0;
- }
- p5 = p51;
- }
- return b;
-}
-
-static Bigint *lshift(Bigint *b, int k)
-{
- int i, k1, n, n1;
- Bigint *b1;
- ULong *x, *x1, *xe, z;
-
-#ifdef Pack_32
- n = k >> 5;
-#else
- n = k >> 4;
-#endif
- k1 = b->k;
- n1 = n + b->wds + 1;
- for(i = b->maxwds; n1 > i; i <<= 1)
- k1++;
- b1 = Balloc(k1);
- x1 = b1->x;
- for(i = 0; i < n; i++)
- *x1++ = 0;
- x = b->x;
- xe = x + b->wds;
-#ifdef Pack_32
- if (k &= 0x1f) {
- k1 = 32 - k;
- z = 0;
- do {
- *x1++ = *x << k | z;
- z = *x++ >> k1;
- }
- while(x < xe);
- if ((*x1 = z) != 0)
- ++n1;
- }
-#else
- if (k &= 0xf) {
- k1 = 16 - k;
- z = 0;
- do {
- *x1++ = *x << k & 0xffff | z;
- z = *x++ >> k1;
- }
- while(x < xe);
- if (*x1 = z)
- ++n1;
- }
-#endif
- else do
- *x1++ = *x++;
- while(x < xe);
- b1->wds = n1 - 1;
- Bfree(b);
- return b1;
-}
-
-static int cmp(Bigint *a, Bigint *b)
-{
- ULong *xa, *xa0, *xb, *xb0;
- int i, j;
-
- i = a->wds;
- j = b->wds;
-#ifdef BSD_QDTOA_DEBUG
- if (i > 1 && !a->x[i-1])
- Bug("cmp called with a->x[a->wds-1] == 0");
- if (j > 1 && !b->x[j-1])
- Bug("cmp called with b->x[b->wds-1] == 0");
-#endif
- if (i -= j)
- return i;
- xa0 = a->x;
- xa = xa0 + j;
- xb0 = b->x;
- xb = xb0 + j;
- for(;;) {
- if (*--xa != *--xb)
- return *xa < *xb ? -1 : 1;
- if (xa <= xa0)
- break;
- }
- return 0;
-}
-
-static Bigint *diff(Bigint *a, Bigint *b)
-{
- Bigint *c;
- int i, wa, wb;
- Long borrow, y; /* We need signed shifts here. */
- ULong *xa, *xae, *xb, *xbe, *xc;
-#ifdef Pack_32
- Long z;
-#endif
-
- i = cmp(a,b);
- if (!i) {
- c = Balloc(0);
- c->wds = 1;
- c->x[0] = 0;
- return c;
- }
- if (i < 0) {
- c = a;
- a = b;
- b = c;
- i = 1;
- }
- else
- i = 0;
- c = Balloc(a->k);
- c->sign = i;
- wa = a->wds;
- xa = a->x;
- xae = xa + wa;
- wb = b->wds;
- xb = b->x;
- xbe = xb + wb;
- xc = c->x;
- borrow = 0;
-#ifdef Pack_32
- do {
- y = (*xa & 0xffff) - (*xb & 0xffff) + borrow;
- borrow = y >> 16;
- Sign_Extend(borrow, y);
- z = (*xa++ >> 16) - (*xb++ >> 16) + borrow;
- borrow = z >> 16;
- Sign_Extend(borrow, z);
- Storeinc(xc, z, y);
- }
- while(xb < xbe);
- while(xa < xae) {
- y = (*xa & 0xffff) + borrow;
- borrow = y >> 16;
- Sign_Extend(borrow, y);
- z = (*xa++ >> 16) + borrow;
- borrow = z >> 16;
- Sign_Extend(borrow, z);
- Storeinc(xc, z, y);
- }
-#else
- do {
- y = *xa++ - *xb++ + borrow;
- borrow = y >> 16;
- Sign_Extend(borrow, y);
- *xc++ = y & 0xffff;
- }
- while(xb < xbe);
- while(xa < xae) {
- y = *xa++ + borrow;
- borrow = y >> 16;
- Sign_Extend(borrow, y);
- *xc++ = y & 0xffff;
- }
-#endif
- while(!*--xc)
- wa--;
- c->wds = wa;
- return c;
-}
-
-static double ulp(double x)
-{
- Long L;
- double a;
-
- L = (getWord0(x) & Exp_mask) - (P-1)*Exp_msk1;
-#ifndef Sudden_Underflow
- if (L > 0) {
-#endif
-#ifdef IBM
- L |= Exp_msk1 >> 4;
-#endif
- setWord0(&a, L);
- setWord1(&a, 0);
-#ifndef Sudden_Underflow
- }
- else {
- L = -L >> Exp_shift;
- if (L < Exp_shift) {
- setWord0(&a, 0x80000 >> L);
- setWord1(&a, 0);
- }
- else {
- setWord0(&a, 0);
- L -= Exp_shift;
- setWord1(&a, L >= 31 ? 1U : 1U << (31 - L));
- }
- }
-#endif
- return a;
-}
-
-static double b2d(Bigint *a, int *e)
-{
- ULong *xa, *xa0, w, y, z;
- int k;
- double d;
-
- xa0 = a->x;
- xa = xa0 + a->wds;
- y = *--xa;
-#ifdef BSD_QDTOA_DEBUG
- if (!y) Bug("zero y in b2d");
-#endif
- k = hi0bits(y);
- *e = 32 - k;
-#ifdef Pack_32
- if (k < Ebits) {
- setWord0(&d, Exp_1 | y >> (Ebits - k));
- w = xa > xa0 ? *--xa : 0;
- setWord1(&d, y << ((32-Ebits) + k) | w >> (Ebits - k));
- goto ret_d;
- }
- z = xa > xa0 ? *--xa : 0;
- if (k -= Ebits) {
- setWord0(&d, Exp_1 | y << k | z >> (32 - k));
- y = xa > xa0 ? *--xa : 0;
- setWord1(&d, z << k | y >> (32 - k));
- }
- else {
- setWord0(&d, Exp_1 | y);
- setWord1(&d, z);
- }
-#else
- if (k < Ebits + 16) {
- z = xa > xa0 ? *--xa : 0;
- setWord0(&d, Exp_1 | y << k - Ebits | z >> Ebits + 16 - k);
- w = xa > xa0 ? *--xa : 0;
- y = xa > xa0 ? *--xa : 0;
- setWord1(&d, z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k);
- goto ret_d;
- }
- z = xa > xa0 ? *--xa : 0;
- w = xa > xa0 ? *--xa : 0;
- k -= Ebits + 16;
- setWord0(&d, Exp_1 | y << k + 16 | z << k | w >> 16 - k);
- y = xa > xa0 ? *--xa : 0;
- setWord1(&d, w << k + 16 | y << k);
-#endif
- ret_d:
- return d;
-}
-
-static Bigint *d2b(double d, int *e, int *bits)
-{
- Bigint *b;
- int de, i, k;
- ULong *x, y, z;
-
-#ifdef Pack_32
- b = Balloc(1);
-#else
- b = Balloc(2);
-#endif
- x = b->x;
-
- z = getWord0(d) & Frac_mask;
- setWord0(&d, getWord0(d) & 0x7fffffff); /* clear sign bit, which we ignore */
-#ifdef Sudden_Underflow
- de = (int)(getWord0(d) >> Exp_shift);
-#ifndef IBM
- z |= Exp_msk11;
-#endif
-#else
- if ((de = int(getWord0(d) >> Exp_shift)) != 0)
- z |= Exp_msk1;
-#endif
-#ifdef Pack_32
- if ((y = getWord1(d)) != 0) {
- if ((k = lo0bits(&y)) != 0) {
- x[0] = y | z << (32 - k);
- z >>= k;
- }
- else
- x[0] = y;
- i = b->wds = (x[1] = z) ? 2 : 1;
- }
- else {
-#ifdef BSD_QDTOA_DEBUG
- if (!z)
- Bug("Zero passed to d2b");
-#endif
- k = lo0bits(&z);
- x[0] = z;
- i = b->wds = 1;
- k += 32;
- }
-#else
- if (y = getWord1(d)) {
- if (k = lo0bits(&y))
- if (k >= 16) {
- x[0] = y | z << 32 - k & 0xffff;
- x[1] = z >> k - 16 & 0xffff;
- x[2] = z >> k;
- i = 2;
- }
- else {
- x[0] = y & 0xffff;
- x[1] = y >> 16 | z << 16 - k & 0xffff;
- x[2] = z >> k & 0xffff;
- x[3] = z >> k+16;
- i = 3;
- }
- else {
- x[0] = y & 0xffff;
- x[1] = y >> 16;
- x[2] = z & 0xffff;
- x[3] = z >> 16;
- i = 3;
- }
- }
- else {
-#ifdef BSD_QDTOA_DEBUG
- if (!z)
- Bug("Zero passed to d2b");
-#endif
- k = lo0bits(&z);
- if (k >= 16) {
- x[0] = z;
- i = 0;
- }
- else {
- x[0] = z & 0xffff;
- x[1] = z >> 16;
- i = 1;
- }
- k += 32;
- }
- while(!x[i])
- --i;
- b->wds = i + 1;
-#endif
-#ifndef Sudden_Underflow
- if (de) {
-#endif
-#ifdef IBM
- *e = (de - Bias - (P-1) << 2) + k;
- *bits = 4*P + 8 - k - hi0bits(getWord0(d) & Frac_mask);
-#else
- *e = de - Bias - (P-1) + k;
- *bits = P - k;
-#endif
-#ifndef Sudden_Underflow
- }
- else {
- *e = de - Bias - (P-1) + 1 + k;
-#ifdef Pack_32
- *bits = 32*i - hi0bits(x[i-1]);
-#else
- *bits = (i+2)*16 - hi0bits(x[i]);
-#endif
- }
-#endif
- return b;
-}
-
-static double ratio(Bigint *a, Bigint *b)
-{
- double da, db;
- int k, ka, kb;
-
- da = b2d(a, &ka);
- db = b2d(b, &kb);
-#ifdef Pack_32
- k = ka - kb + 32*(a->wds - b->wds);
-#else
- k = ka - kb + 16*(a->wds - b->wds);
-#endif
-#ifdef IBM
- if (k > 0) {
- setWord0(&da, getWord0(da) + (k >> 2)*Exp_msk1);
- if (k &= 3)
- da *= 1 << k;
- }
- else {
- k = -k;
- setWord0(&db, getWord0(db) + (k >> 2)*Exp_msk1);
- if (k &= 3)
- db *= 1 << k;
- }
-#else
- if (k > 0)
- setWord0(&da, getWord0(da) + k*Exp_msk1);
- else {
- k = -k;
- setWord0(&db, getWord0(db) + k*Exp_msk1);
- }
-#endif
- return da / db;
-}
-
-static const double tens[] = {
- 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
- 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
- 1e20, 1e21, 1e22
-#ifdef VAX
- , 1e23, 1e24
-#endif
-};
-
-#ifdef IEEE_Arith
-static const double bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };
-static const double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, 1e-256 };
-#define n_bigtens 5
-#else
-#ifdef IBM
-static const double bigtens[] = { 1e16, 1e32, 1e64 };
-static const double tinytens[] = { 1e-16, 1e-32, 1e-64 };
-#define n_bigtens 3
-#else
-static const double bigtens[] = { 1e16, 1e32 };
-static const double tinytens[] = { 1e-16, 1e-32 };
-#define n_bigtens 2
-#endif
-#endif
-
-/*
- The pre-release gcc3.3 shipped with SuSE 8.2 has a bug which causes
- the comparison 1e-100 == 0.0 to return true. As a workaround, we
- compare it to a global variable containing 0.0, which produces
- correct assembler output.
-
- ### consider detecting the broken compilers and using the static
- ### double for these, and use a #define for all working compilers
-*/
-static double g_double_zero = 0.0;
-
-Q_CORE_EXPORT double qstrtod(const char *s00, const char **se, bool *ok)
-{
- int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,
- e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
- const char *s, *s0, *s1;
- double aadj, aadj1, adj, rv, rv0;
- Long L;
- ULong y, z;
- Bigint *bb1, *bd0;
- Bigint *bb = NULL, *bd = NULL, *bs = NULL, *delta = NULL;/* pacify gcc */
-
- /*
- #ifndef KR_headers
- const char decimal_point = localeconv()->decimal_point[0];
- #else
- const char decimal_point = '.';
- #endif */
- if (ok != 0)
- *ok = true;
-
- const char decimal_point = '.';
-
- sign = nz0 = nz = 0;
- rv = 0.;
-
-
- for(s = s00; ascii_isspace(uchar(*s)); s++)
- ;
-
- if (*s == '-') {
- sign = 1;
- s++;
- } else if (*s == '+') {
- s++;
- }
-
- if (*s == '\0') {
- s = s00;
- goto ret;
- }
-
- if (*s == '0') {
- nz0 = 1;
- while(*++s == '0') ;
- if (!*s)
- goto ret;
- }
- s0 = s;
- y = z = 0;
- for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
- if (nd < 9)
- y = 10*y + c - '0';
- else if (nd < 16)
- z = 10*z + c - '0';
- nd0 = nd;
- if (c == decimal_point) {
- c = *++s;
- if (!nd) {
- for(; c == '0'; c = *++s)
- nz++;
- if (c > '0' && c <= '9') {
- s0 = s;
- nf += nz;
- nz = 0;
- goto have_dig;
- }
- goto dig_done;
- }
- for(; c >= '0' && c <= '9'; c = *++s) {
- have_dig:
- nz++;
- if (c -= '0') {
- nf += nz;
- for(i = 1; i < nz; i++)
- if (nd++ < 9)
- y *= 10;
- else if (nd <= DBL_DIG + 1)
- z *= 10;
- if (nd++ < 9)
- y = 10*y + c;
- else if (nd <= DBL_DIG + 1)
- z = 10*z + c;
- nz = 0;
- }
- }
- }
- dig_done:
- e = 0;
- if (c == 'e' || c == 'E') {
- if (!nd && !nz && !nz0) {
- s = s00;
- goto ret;
- }
- s00 = s;
- esign = 0;
- switch(c = *++s) {
- case '-':
- esign = 1;
- case '+':
- c = *++s;
- }
- if (c >= '0' && c <= '9') {
- while(c == '0')
- c = *++s;
- if (c > '0' && c <= '9') {
- L = c - '0';
- s1 = s;
- while((c = *++s) >= '0' && c <= '9')
- L = 10*L + c - '0';
- if (s - s1 > 8 || L > 19999)
- /* Avoid confusion from exponents
- * so large that e might overflow.
- */
- e = 19999; /* safe for 16 bit ints */
- else
- e = int(L);
- if (esign)
- e = -e;
- }
- else
- e = 0;
- }
- else
- s = s00;
- }
- if (!nd) {
- if (!nz && !nz0)
- s = s00;
- goto ret;
- }
- e1 = e -= nf;
-
- /* Now we have nd0 digits, starting at s0, followed by a
- * decimal point, followed by nd-nd0 digits. The number we're
- * after is the integer represented by those digits times
- * 10**e */
-
- if (!nd0)
- nd0 = nd;
- k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
- rv = y;
- if (k > 9)
- rv = tens[k - 9] * rv + z;
-
- bd0 = 0;
- if (nd <= DBL_DIG
-#ifndef RND_PRODQUOT
- && FLT_ROUNDS == 1
-#endif
- ) {
- if (!e)
- goto ret;
- if (e > 0) {
- if (e <= Ten_pmax) {
-#ifdef VAX
- goto vax_ovfl_check;
-#else
- /* rv = */ rounded_product(rv, tens[e]);
- goto ret;
-#endif
- }
- i = DBL_DIG - nd;
- if (e <= Ten_pmax + i) {
- /* A fancier test would sometimes let us do
- * this for larger i values.
- */
- e -= i;
- rv *= tens[i];
-#ifdef VAX
- /* VAX exponent range is so narrow we must
- * worry about overflow here...
- */
- vax_ovfl_check:
- setWord0(&rv, getWord0(rv) - P*Exp_msk1);
- /* rv = */ rounded_product(rv, tens[e]);
- if ((getWord0(rv) & Exp_mask)
- > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
- goto ovfl;
- setWord0(&rv, getWord0(rv) + P*Exp_msk1);
-#else
- /* rv = */ rounded_product(rv, tens[e]);
-#endif
- goto ret;
- }
- }
-#ifndef Inaccurate_Divide
- else if (e >= -Ten_pmax) {
- /* rv = */ rounded_quotient(rv, tens[-e]);
- goto ret;
- }
-#endif
- }
- e1 += nd - k;
-
- /* Get starting approximation = rv * 10**e1 */
-
- if (e1 > 0) {
- if ((i = e1 & 15) != 0)
- rv *= tens[i];
- if (e1 &= ~15) {
- if (e1 > DBL_MAX_10_EXP) {
- ovfl:
- // errno = ERANGE;
- if (ok != 0)
- *ok = false;
-#ifdef __STDC__
- rv = HUGE_VAL;
-#else
- /* Can't trust HUGE_VAL */
-#ifdef IEEE_Arith
- setWord0(&rv, Exp_mask);
- setWord1(&rv, 0);
-#else
- setWord0(&rv, Big0);
- setWord1(&rv, Big1);
-#endif
-#endif
- if (bd0)
- goto retfree;
- goto ret;
- }
- if (e1 >>= 4) {
- for(j = 0; e1 > 1; j++, e1 >>= 1)
- if (e1 & 1)
- rv *= bigtens[j];
- /* The last multiplication could overflow. */
- setWord0(&rv, getWord0(rv) - P*Exp_msk1);
- rv *= bigtens[j];
- if ((z = getWord0(rv) & Exp_mask)
- > Exp_msk1*(DBL_MAX_EXP+Bias-P))
- goto ovfl;
- if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
- /* set to largest number */
- /* (Can't trust DBL_MAX) */
- setWord0(&rv, Big0);
- setWord1(&rv, Big1);
- }
- else
- setWord0(&rv, getWord0(rv) + P*Exp_msk1);
- }
-
- }
- }
- else if (e1 < 0) {
- e1 = -e1;
- if ((i = e1 & 15) != 0)
- rv /= tens[i];
- if (e1 &= ~15) {
- e1 >>= 4;
- if (e1 >= 1 << n_bigtens)
- goto undfl;
- for(j = 0; e1 > 1; j++, e1 >>= 1)
- if (e1 & 1)
- rv *= tinytens[j];
- /* The last multiplication could underflow. */
- rv0 = rv;
- rv *= tinytens[j];
- if (rv == g_double_zero)
- {
- rv = 2.*rv0;
- rv *= tinytens[j];
- if (rv == g_double_zero)
- {
- undfl:
- rv = 0.;
- // errno = ERANGE;
- if (ok != 0)
- *ok = false;
- if (bd0)
- goto retfree;
- goto ret;
- }
- setWord0(&rv, Tiny0);
- setWord1(&rv, Tiny1);
- /* The refinement below will clean
- * this approximation up.
- */
- }
- }
- }
-
- /* Now the hard part -- adjusting rv to the correct value.*/
-
- /* Put digits into bd: true value = bd * 10^e */
-
- bd0 = s2b(s0, nd0, nd, y);
-
- for(;;) {
- bd = Balloc(bd0->k);
- Bcopy(bd, bd0);
- bb = d2b(rv, &bbe, &bbbits); /* rv = bb * 2^bbe */
- bs = i2b(1);
-
- if (e >= 0) {
- bb2 = bb5 = 0;
- bd2 = bd5 = e;
- }
- else {
- bb2 = bb5 = -e;
- bd2 = bd5 = 0;
- }
- if (bbe >= 0)
- bb2 += bbe;
- else
- bd2 -= bbe;
- bs2 = bb2;
-#ifdef Sudden_Underflow
-#ifdef IBM
- j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
-#else
- j = P + 1 - bbbits;
-#endif
-#else
- i = bbe + bbbits - 1; /* logb(rv) */
- if (i < Emin) /* denormal */
- j = bbe + (P-Emin);
- else
- j = P + 1 - bbbits;
-#endif
- bb2 += j;
- bd2 += j;
- i = bb2 < bd2 ? bb2 : bd2;
- if (i > bs2)
- i = bs2;
- if (i > 0) {
- bb2 -= i;
- bd2 -= i;
- bs2 -= i;
- }
- if (bb5 > 0) {
- bs = pow5mult(bs, bb5);
- bb1 = mult(bs, bb);
- Bfree(bb);
- bb = bb1;
- }
- if (bb2 > 0)
- bb = lshift(bb, bb2);
- if (bd5 > 0)
- bd = pow5mult(bd, bd5);
- if (bd2 > 0)
- bd = lshift(bd, bd2);
- if (bs2 > 0)
- bs = lshift(bs, bs2);
- delta = diff(bb, bd);
- dsign = delta->sign;
- delta->sign = 0;
- i = cmp(delta, bs);
- if (i < 0) {
- /* Error is less than half an ulp -- check for
- * special case of mantissa a power of two.
- */
- if (dsign || getWord1(rv) || getWord0(rv) & Bndry_mask)
- break;
- delta = lshift(delta,Log2P);
- if (cmp(delta, bs) > 0)
- goto drop_down;
- break;
- }
- if (i == 0) {
- /* exactly half-way between */
- if (dsign) {
- if ((getWord0(rv) & Bndry_mask1) == Bndry_mask1
- && getWord1(rv) == 0xffffffff) {
- /*boundary case -- increment exponent*/
- setWord0(&rv, (getWord0(rv) & Exp_mask)
- + Exp_msk1
-#ifdef IBM
- | Exp_msk1 >> 4
-#endif
- );
- setWord1(&rv, 0);
- break;
- }
- }
- else if (!(getWord0(rv) & Bndry_mask) && !getWord1(rv)) {
- drop_down:
- /* boundary case -- decrement exponent */
-#ifdef Sudden_Underflow
- L = getWord0(rv) & Exp_mask;
-#ifdef IBM
- if (L < Exp_msk1)
-#else
- if (L <= Exp_msk1)
-#endif
- goto undfl;
- L -= Exp_msk1;
-#else
- L = (getWord0(rv) & Exp_mask) - Exp_msk1;
-#endif
- setWord0(&rv, L | Bndry_mask1);
- setWord1(&rv, 0xffffffff);
-#ifdef IBM
- goto cont;
-#else
- break;
-#endif
- }
-#ifndef ROUND_BIASED
- if (!(getWord1(rv) & LSB))
- break;
-#endif
- if (dsign)
- rv += ulp(rv);
-#ifndef ROUND_BIASED
- else {
- rv -= ulp(rv);
-#ifndef Sudden_Underflow
- if (rv == g_double_zero)
- goto undfl;
-#endif
- }
-#endif
- break;
- }
- if ((aadj = ratio(delta, bs)) <= 2.) {
- if (dsign)
- aadj = aadj1 = 1.;
- else if (getWord1(rv) || getWord0(rv) & Bndry_mask) {
-#ifndef Sudden_Underflow
- if (getWord1(rv) == Tiny1 && !getWord0(rv))
- goto undfl;
-#endif
- aadj = 1.;
- aadj1 = -1.;
- }
- else {
- /* special case -- power of FLT_RADIX to be */
- /* rounded down... */
-
- if (aadj < 2./FLT_RADIX)
- aadj = 1./FLT_RADIX;
- else
- aadj *= 0.5;
- aadj1 = -aadj;
- }
- }
- else {
- aadj *= 0.5;
- aadj1 = dsign ? aadj : -aadj;
-#ifdef Check_FLT_ROUNDS
- switch(FLT_ROUNDS) {
- case 2: /* towards +infinity */
- aadj1 -= 0.5;
- break;
- case 0: /* towards 0 */
- case 3: /* towards -infinity */
- aadj1 += 0.5;
- }
-#else
- if (FLT_ROUNDS == 0)
- aadj1 += 0.5;
-#endif
- }
- y = getWord0(rv) & Exp_mask;
-
- /* Check for overflow */
-
- if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
- rv0 = rv;
- setWord0(&rv, getWord0(rv) - P*Exp_msk1);
- adj = aadj1 * ulp(rv);
- rv += adj;
- if ((getWord0(rv) & Exp_mask) >=
- Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
- if (getWord0(rv0) == Big0 && getWord1(rv0) == Big1)
- goto ovfl;
- setWord0(&rv, Big0);
- setWord1(&rv, Big1);
- goto cont;
- }
- else
- setWord0(&rv, getWord0(rv) + P*Exp_msk1);
- }
- else {
-#ifdef Sudden_Underflow
- if ((getWord0(rv) & Exp_mask) <= P*Exp_msk1) {
- rv0 = rv;
- setWord0(&rv, getWord0(rv) + P*Exp_msk1);
- adj = aadj1 * ulp(rv);
- rv += adj;
-#ifdef IBM
- if ((getWord0(rv) & Exp_mask) < P*Exp_msk1)
-#else
- if ((getWord0(rv) & Exp_mask) <= P*Exp_msk1)
-#endif
- {
- if (getWord0(rv0) == Tiny0
- && getWord1(rv0) == Tiny1)
- goto undfl;
- setWord0(&rv, Tiny0);
- setWord1(&rv, Tiny1);
- goto cont;
- }
- else
- setWord0(&rv, getWord0(rv) - P*Exp_msk1);
- }
- else {
- adj = aadj1 * ulp(rv);
- rv += adj;
- }
-#else
- /* Compute adj so that the IEEE rounding rules will
- * correctly round rv + adj in some half-way cases.
- * If rv * ulp(rv) is denormalized (i.e.,
- * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid
- * trouble from bits lost to denormalization;
- * example: 1.2e-307 .
- */
- if (y <= (P-1)*Exp_msk1 && aadj >= 1.) {
- aadj1 = int(aadj + 0.5);
- if (!dsign)
- aadj1 = -aadj1;
- }
- adj = aadj1 * ulp(rv);
- rv += adj;
-#endif
- }
- z = getWord0(rv) & Exp_mask;
- if (y == z) {
- /* Can we stop now? */
- L = Long(aadj);
- aadj -= L;
- /* The tolerances below are conservative. */
- if (dsign || getWord1(rv) || getWord0(rv) & Bndry_mask) {
- if (aadj < .4999999 || aadj > .5000001)
- break;
- }
- else if (aadj < .4999999/FLT_RADIX)
- break;
- }
- cont:
- Bfree(bb);
- Bfree(bd);
- Bfree(bs);
- Bfree(delta);
- }
- retfree:
- Bfree(bb);
- Bfree(bd);
- Bfree(bs);
- Bfree(bd0);
- Bfree(delta);
- ret:
+ int processed = 0;
+ bool nonNullOk = false;
+ int len = static_cast<int>(strlen(s00));
+ Q_ASSERT(len >= 0);
+ double d = asciiToDouble(s00, len, nonNullOk, processed);
if (se)
- *se = s;
- return sign ? -rv : rv;
-}
-
-static int quorem(Bigint *b, Bigint *S)
-{
- int n;
- Long borrow, y;
- ULong carry, q, ys;
- ULong *bx, *bxe, *sx, *sxe;
-#ifdef Pack_32
- Long z;
- ULong si, zs;
-#endif
-
- n = S->wds;
-#ifdef BSD_QDTOA_DEBUG
- /*debug*/ if (b->wds > n)
- /*debug*/ Bug("oversize b in quorem");
-#endif
- if (b->wds < n)
- return 0;
- sx = S->x;
- sxe = sx + --n;
- bx = b->x;
- bxe = bx + n;
- q = *bxe / (*sxe + 1); /* ensure q <= true quotient */
-#ifdef BSD_QDTOA_DEBUG
- /*debug*/ if (q > 9)
- /*debug*/ Bug("oversized quotient in quorem");
-#endif
- if (q) {
- borrow = 0;
- carry = 0;
- do {
-#ifdef Pack_32
- si = *sx++;
- ys = (si & 0xffff) * q + carry;
- zs = (si >> 16) * q + (ys >> 16);
- carry = zs >> 16;
- y = (*bx & 0xffff) - (ys & 0xffff) + borrow;
- borrow = y >> 16;
- Sign_Extend(borrow, y);
- z = (*bx >> 16) - (zs & 0xffff) + borrow;
- borrow = z >> 16;
- Sign_Extend(borrow, z);
- Storeinc(bx, z, y);
-#else
- ys = *sx++ * q + carry;
- carry = ys >> 16;
- y = *bx - (ys & 0xffff) + borrow;
- borrow = y >> 16;
- Sign_Extend(borrow, y);
- *bx++ = y & 0xffff;
-#endif
- }
- while(sx <= sxe);
- if (!*bxe) {
- bx = b->x;
- while(--bxe > bx && !*bxe)
- --n;
- b->wds = n;
- }
- }
- if (cmp(b, S) >= 0) {
- q++;
- borrow = 0;
- carry = 0;
- bx = b->x;
- sx = S->x;
- do {
-#ifdef Pack_32
- si = *sx++;
- ys = (si & 0xffff) + carry;
- zs = (si >> 16) + (ys >> 16);
- carry = zs >> 16;
- y = (*bx & 0xffff) - (ys & 0xffff) + borrow;
- borrow = y >> 16;
- Sign_Extend(borrow, y);
- z = (*bx >> 16) - (zs & 0xffff) + borrow;
- borrow = z >> 16;
- Sign_Extend(borrow, z);
- Storeinc(bx, z, y);
-#else
- ys = *sx++ + carry;
- carry = ys >> 16;
- y = *bx - (ys & 0xffff) + borrow;
- borrow = y >> 16;
- Sign_Extend(borrow, y);
- *bx++ = y & 0xffff;
-#endif
- }
- while(sx <= sxe);
- bx = b->x;
- bxe = bx + n;
- if (!*bxe) {
- while(--bxe > bx && !*bxe)
- --n;
- b->wds = n;
- }
- }
- return q;
-}
-
-/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
- *
- * Inspired by "How to Print Floating-Point Numbers Accurately" by
- * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 92-101].
- *
- * Modifications:
- * 1. Rather than iterating, we use a simple numeric overestimate
- * to determine k = floor(log10(d)). We scale relevant
- * quantities using O(log2(k)) rather than O(k) multiplications.
- * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
- * try to generate digits strictly left to right. Instead, we
- * compute with fewer bits and propagate the carry if necessary
- * when rounding the final digit up. This is often faster.
- * 3. Under the assumption that input will be rounded nearest,
- * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
- * That is, we allow equality in stopping tests when the
- * round-nearest rule will give the same floating-point value
- * as would satisfaction of the stopping test with strict
- * inequality.
- * 4. We remove common factors of powers of 2 from relevant
- * quantities.
- * 5. When converting floating-point integers less than 1e16,
- * we use floating-point arithmetic rather than resorting
- * to multiple-precision integers.
- * 6. When asked to produce fewer than 15 digits, we first try
- * to get by with floating-point arithmetic; we resort to
- * multiple-precision integer arithmetic only if we cannot
- * guarantee that the floating-point calculation has given
- * the correctly rounded result. For k requested digits and
- * "uniformly" distributed input, the probability is
- * something like 10^(k-15) that we must resort to the Long
- * calculation.
- */
-
-#if defined(Q_OS_WIN) && defined (Q_CC_GNU) && !defined(_clear87) // See QTBUG-7576
-extern "C" {
-__attribute__ ((dllimport)) unsigned int __cdecl __MINGW_NOTHROW _control87 (unsigned int unNew, unsigned int unMask);
-__attribute__ ((dllimport)) unsigned int __cdecl __MINGW_NOTHROW _clearfp (void); /* Clear the FPU status word */
+ *se = s00 + processed;
+ if (ok)
+ *ok = nonNullOk;
+ return d;
}
-# define _clear87 _clearfp
-#endif
-
-/* This actually sometimes returns a pointer to a string literal
- cast to a char*. Do NOT try to modify the return value. */
-Q_CORE_EXPORT char *qdtoa ( double d, int mode, int ndigits, int *decpt, int *sign, char **rve, char **resultp)
+QString qdtoa(qreal d, int *decpt, int *sign)
{
- // Some values of the floating-point control word can cause _qdtoa to crash with an underflow.
- // We set a safe value here.
-#ifdef Q_OS_WIN
- _clear87();
- unsigned int oldbits = _control87(0, 0);
-#ifndef MCW_EM
-# ifdef _MCW_EM
-# define MCW_EM _MCW_EM
-# else
-# define MCW_EM 0x0008001F
-# endif
-#endif
- _control87(MCW_EM, MCW_EM);
-#endif
-
-#if defined(Q_OS_LINUX) && !defined(__UCLIBC__)
- fenv_t envp;
- feholdexcept(&envp);
-#endif
-
- char *s = _qdtoa(d, mode, ndigits, decpt, sign, rve, resultp);
-
-#ifdef Q_OS_WIN
- _clear87();
-#ifndef _M_X64
- _control87(oldbits, 0xFFFFF);
-#else
-# ifndef _MCW_EM // Potentially missing on MinGW
-# define _MCW_EM 0x0008001f
-# endif
-# ifndef _MCW_RC
-# define _MCW_RC 0x00000300
-# endif
-# ifndef _MCW_DN
-# define _MCW_DN 0x03000000
-# endif
- _control87(oldbits, _MCW_EM|_MCW_DN|_MCW_RC);
-#endif //_M_X64
-#endif //Q_OS_WIN
+ bool nonNullSign = false;
+ int nonNullDecpt = 0;
+ int length = 0;
-#if defined(Q_OS_LINUX) && !defined(__UCLIBC__)
- fesetenv(&envp);
-#endif
-
- return s;
-}
+ // Some versions of libdouble-conversion like an extra digit, probably for '\0'
+ char result[QLocaleData::DoubleMaxSignificant + 1];
+ doubleToAscii(d, QLocaleData::DFSignificantDigits, QLocale::FloatingPointShortest, result,
+ QLocaleData::DoubleMaxSignificant + 1, nonNullSign, length, nonNullDecpt);
-static char *_qdtoa( NEEDS_VOLATILE double d, int mode, int ndigits, int *decpt, int *sign, char **rve, char **resultp)
-{
- /*
- Arguments ndigits, decpt, sign are similar to those
- of ecvt and fcvt; trailing zeros are suppressed from
- the returned string. If not null, *rve is set to point
- to the end of the return value. If d is +-Infinity or NaN,
- then *decpt is set to 9999.
-
- mode:
- 0 ==> shortest string that yields d when read in
- and rounded to nearest.
- 1 ==> like 0, but with Steele & White stopping rule;
- e.g. with IEEE P754 arithmetic , mode 0 gives
- 1e23 whereas mode 1 gives 9.999999999999999e22.
- 2 ==> max(1,ndigits) significant digits. This gives a
- return value similar to that of ecvt, except
- that trailing zeros are suppressed.
- 3 ==> through ndigits past the decimal point. This
- gives a return value similar to that from fcvt,
- except that trailing zeros are suppressed, and
- ndigits can be negative.
- 4-9 should give the same return values as 2-3, i.e.,
- 4 <= mode <= 9 ==> same return as mode
- 2 + (mode & 1). These modes are mainly for
- debugging; often they run slower but sometimes
- faster than modes 2-3.
- 4,5,8,9 ==> left-to-right digit generation.
- 6-9 ==> don't try fast floating-point estimate
- (if applicable).
-
- Values of mode other than 0-9 are treated as mode 0.
-
- Sufficient space is allocated to the return value
- to hold the suppressed trailing zeros.
- */
-
- int bbits, b2, b5, be, dig, i, ieps, ilim0,
- j, j1, k, k0, k_check, leftright, m2, m5, s2, s5,
- try_quick;
- int ilim = 0, ilim1 = 0, spec_case = 0; /* pacify gcc */
- Long L;
-#ifndef Sudden_Underflow
- int denorm;
- ULong x;
-#endif
- Bigint *b, *b1, *delta, *mhi, *S;
- Bigint *mlo = NULL; /* pacify gcc */
- double d2;
- double ds, eps;
- char *s, *s0;
-
- if (getWord0(d) & Sign_bit) {
- /* set sign for everything, including 0's and NaNs */
- *sign = 1;
- setWord0(&d, getWord0(d) & ~Sign_bit); /* clear sign bit */
- }
- else
- *sign = 0;
+ if (sign)
+ *sign = nonNullSign ? 1 : 0;
+ if (decpt)
+ *decpt = nonNullDecpt;
-#if defined(IEEE_Arith) + defined(VAX)
-#ifdef IEEE_Arith
- if ((getWord0(d) & Exp_mask) == Exp_mask)
-#else
- if (getWord0(d) == 0x8000)
-#endif
- {
- /* Infinity or NaN */
- *decpt = 9999;
- s =
-#ifdef IEEE_Arith
- !getWord1(d) && !(getWord0(d) & 0xfffff) ? const_cast<char*>("Infinity") :
-#endif
- const_cast<char*>("NaN");
- if (rve)
- *rve =
-#ifdef IEEE_Arith
- s[3] ? s + 8 :
-#endif
- s + 3;
- return s;
- }
-#endif
-#ifdef IBM
- d += 0; /* normalize */
-#endif
- if (d == g_double_zero)
- {
- *decpt = 1;
- s = const_cast<char*>("0");
- if (rve)
- *rve = s + 1;
- return s;
- }
-
- b = d2b(d, &be, &bbits);
- i = (int)(getWord0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
-#ifndef Sudden_Underflow
- if (i != 0) {
-#endif
- d2 = d;
- setWord0(&d2, getWord0(d2) & Frac_mask1);
- setWord0(&d2, getWord0(d2) | Exp_11);
-#ifdef IBM
- if (j = 11 - hi0bits(getWord0(d2) & Frac_mask))
- d2 /= 1 << j;
-#endif
-
- /* log(x) ~=~ log(1.5) + (x-1.5)/1.5
- * log10(x) = log(x) / log(10)
- * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
- * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
- *
- * This suggests computing an approximation k to log10(d) by
- *
- * k = (i - Bias)*0.301029995663981
- * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
- *
- * We want k to be too large rather than too small.
- * The error in the first-order Taylor series approximation
- * is in our favor, so we just round up the constant enough
- * to compensate for any error in the multiplication of
- * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
- * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
- * adding 1e-13 to the constant term more than suffices.
- * Hence we adjust the constant term to 0.1760912590558.
- * (We could get a more accurate k by invoking log10,
- * but this is probably not worthwhile.)
- */
-
- i -= Bias;
-#ifdef IBM
- i <<= 2;
- i += j;
-#endif
-#ifndef Sudden_Underflow
- denorm = 0;
- }
- else {
- /* d is denormalized */
-
- i = bbits + be + (Bias + (P-1) - 1);
- x = i > 32 ? getWord0(d) << (64 - i) | getWord1(d) >> (i - 32)
- : getWord1(d) << (32 - i);
- d2 = x;
- setWord0(&d2, getWord0(d2) - 31*Exp_msk1); /* adjust exponent */
- i -= (Bias + (P-1) - 1) + 1;
- denorm = 1;
- }
-#endif
- ds = (d2-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
- k = int(ds);
- if (ds < 0. && ds != k)
- k--; /* want k = floor(ds) */
- k_check = 1;
- if (k >= 0 && k <= Ten_pmax) {
- if (d < tens[k])
- k--;
- k_check = 0;
- }
- j = bbits - i - 1;
- if (j >= 0) {
- b2 = 0;
- s2 = j;
- }
- else {
- b2 = -j;
- s2 = 0;
- }
- if (k >= 0) {
- b5 = 0;
- s5 = k;
- s2 += k;
- }
- else {
- b2 -= k;
- b5 = -k;
- s5 = 0;
- }
- if (mode < 0 || mode > 9)
- mode = 0;
- try_quick = 1;
- if (mode > 5) {
- mode -= 4;
- try_quick = 0;
- }
- leftright = 1;
- switch(mode) {
- case 0:
- case 1:
- ilim = ilim1 = -1;
- i = 18;
- ndigits = 0;
- break;
- case 2:
- leftright = 0;
- /* no break */
- case 4:
- if (ndigits <= 0)
- ndigits = 1;
- ilim = ilim1 = i = ndigits;
- break;
- case 3:
- leftright = 0;
- /* no break */
- case 5:
- i = ndigits + k + 1;
- ilim = i;
- ilim1 = i - 1;
- if (i <= 0)
- i = 1;
- }
- QT_TRY {
- *resultp = static_cast<char *>(malloc(i + 1));
- Q_CHECK_PTR(*resultp);
- } QT_CATCH(...) {
- Bfree(b);
- QT_RETHROW;
- }
- s = s0 = *resultp;
-
- if (ilim >= 0 && ilim <= Quick_max && try_quick) {
-
- /* Try to get by with floating-point arithmetic. */
-
- i = 0;
- d2 = d;
- k0 = k;
- ilim0 = ilim;
- ieps = 2; /* conservative */
- if (k > 0) {
- ds = tens[k&0xf];
- j = k >> 4;
- if (j & Bletch) {
- /* prevent overflows */
- j &= Bletch - 1;
- d /= bigtens[n_bigtens-1];
- ieps++;
- }
- for(; j; j >>= 1, i++)
- if (j & 1) {
- ieps++;
- ds *= bigtens[i];
- }
- d /= ds;
- }
- else if ((j1 = -k) != 0) {
- d *= tens[j1 & 0xf];
- for(j = j1 >> 4; j; j >>= 1, i++)
- if (j & 1) {
- ieps++;
- d *= bigtens[i];
- }
- }
- if (k_check && d < 1. && ilim > 0) {
- if (ilim1 <= 0)
- goto fast_failed;
- ilim = ilim1;
- k--;
- d *= 10.;
- ieps++;
- }
- eps = ieps*d + 7.;
- setWord0(&eps, getWord0(eps) - (P-1)*Exp_msk1);
- if (ilim == 0) {
- S = mhi = 0;
- d -= 5.;
- if (d > eps)
- goto one_digit;
- if (d < -eps)
- goto no_digits;
- goto fast_failed;
- }
-#ifndef No_leftright
- if (leftright) {
- /* Use Steele & White method of only
- * generating digits needed.
- */
- eps = 0.5/tens[ilim-1] - eps;
- for(i = 0;;) {
- L = Long(d);
- d -= L;
- *s++ = '0' + int(L);
- if (d < eps)
- goto ret1;
- if (1. - d < eps)
- goto bump_up;
- if (++i >= ilim)
- break;
- eps *= 10.;
- d *= 10.;
- }
- }
- else {
-#endif
- /* Generate ilim digits, then fix them up. */
- eps *= tens[ilim-1];
- for(i = 1;; i++, d *= 10.) {
- L = Long(d);
- d -= L;
- *s++ = '0' + int(L);
- if (i == ilim) {
- if (d > 0.5 + eps)
- goto bump_up;
- else if (d < 0.5 - eps) {
- while(*--s == '0') {}
- s++;
- goto ret1;
- }
- break;
- }
- }
-#ifndef No_leftright
- }
-#endif
- fast_failed:
- s = s0;
- d = d2;
- k = k0;
- ilim = ilim0;
- }
-
- /* Do we have a "small" integer? */
-
- if (be >= 0 && k <= Int_max) {
- /* Yes. */
- ds = tens[k];
- if (ndigits < 0 && ilim <= 0) {
- S = mhi = 0;
- if (ilim < 0 || d <= 5*ds)
- goto no_digits;
- goto one_digit;
- }
- for(i = 1;; i++) {
- L = Long(d / ds);
- d -= L*ds;
-#ifdef Check_FLT_ROUNDS
- /* If FLT_ROUNDS == 2, L will usually be high by 1 */
- if (d < 0) {
- L--;
- d += ds;
- }
-#endif
- *s++ = '0' + int(L);
- if (i == ilim) {
- d += d;
- if (d > ds || (d == ds && L & 1)) {
- bump_up:
- while(*--s == '9')
- if (s == s0) {
- k++;
- *s = '0';
- break;
- }
- ++*s++;
- }
- break;
- }
- if ((d *= 10.) == g_double_zero)
- break;
- }
- goto ret1;
- }
-
- m2 = b2;
- m5 = b5;
- mhi = mlo = 0;
- if (leftright) {
- if (mode < 2) {
- i =
-#ifndef Sudden_Underflow
- denorm ? be + (Bias + (P-1) - 1 + 1) :
-#endif
-#ifdef IBM
- 1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3);
-#else
- 1 + P - bbits;
-#endif
- }
- else {
- j = ilim - 1;
- if (m5 >= j)
- m5 -= j;
- else {
- s5 += j -= m5;
- b5 += j;
- m5 = 0;
- }
- if ((i = ilim) < 0) {
- m2 -= i;
- i = 0;
- }
- }
- b2 += i;
- s2 += i;
- mhi = i2b(1);
- }
- if (m2 > 0 && s2 > 0) {
- i = m2 < s2 ? m2 : s2;
- b2 -= i;
- m2 -= i;
- s2 -= i;
- }
- if (b5 > 0) {
- if (leftright) {
- if (m5 > 0) {
- mhi = pow5mult(mhi, m5);
- b1 = mult(mhi, b);
- Bfree(b);
- b = b1;
- }
- if ((j = b5 - m5) != 0)
- b = pow5mult(b, j);
- }
- else
- b = pow5mult(b, b5);
- }
- S = i2b(1);
- if (s5 > 0)
- S = pow5mult(S, s5);
-
- /* Check for special case that d is a normalized power of 2. */
-
- if (mode < 2) {
- if (!getWord1(d) && !(getWord0(d) & Bndry_mask)
-#ifndef Sudden_Underflow
- && getWord0(d) & Exp_mask
-#endif
- ) {
- /* The special case */
- b2 += Log2P;
- s2 += Log2P;
- spec_case = 1;
- }
- else
- spec_case = 0;
- }
-
- /* Arrange for convenient computation of quotients:
- * shift left if necessary so divisor has 4 leading 0 bits.
- *
- * Perhaps we should just compute leading 28 bits of S once
- * and for all and pass them and a shift to quorem, so it
- * can do shifts and ors to compute the numerator for q.
- */
-#ifdef Pack_32
- if ((i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f) != 0)
- i = 32 - i;
-#else
- if (i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0xf)
- i = 16 - i;
-#endif
- if (i > 4) {
- i -= 4;
- b2 += i;
- m2 += i;
- s2 += i;
- }
- else if (i < 4) {
- i += 28;
- b2 += i;
- m2 += i;
- s2 += i;
- }
- if (b2 > 0)
- b = lshift(b, b2);
- if (s2 > 0)
- S = lshift(S, s2);
- if (k_check) {
- if (cmp(b,S) < 0) {
- k--;
- b = multadd(b, 10, 0); /* we botched the k estimate */
- if (leftright)
- mhi = multadd(mhi, 10, 0);
- ilim = ilim1;
- }
- }
- if (ilim <= 0 && mode > 2) {
- if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) {
- /* no digits, fcvt style */
- no_digits:
- k = -1 - ndigits;
- goto ret;
- }
- one_digit:
- *s++ = '1';
- k++;
- goto ret;
- }
- if (leftright) {
- if (m2 > 0)
- mhi = lshift(mhi, m2);
-
- /* Compute mlo -- check for special case
- * that d is a normalized power of 2.
- */
-
- mlo = mhi;
- if (spec_case) {
- mhi = Balloc(mhi->k);
- Bcopy(mhi, mlo);
- mhi = lshift(mhi, Log2P);
- }
-
- for(i = 1;;i++) {
- dig = quorem(b,S) + '0';
- /* Do we yet have the shortest decimal string
- * that will round to d?
- */
- j = cmp(b, mlo);
- delta = diff(S, mhi);
- j1 = delta->sign ? 1 : cmp(b, delta);
- Bfree(delta);
-#ifndef ROUND_BIASED
- if (j1 == 0 && !mode && !(getWord1(d) & 1)) {
- if (dig == '9')
- goto round_9_up;
- if (j > 0)
- dig++;
- *s++ = dig;
- goto ret;
- }
-#endif
- if (j < 0 || (j == 0 && !mode
-#ifndef ROUND_BIASED
- && !(getWord1(d) & 1)
-#endif
- )) {
- if (j1 > 0) {
- b = lshift(b, 1);
- j1 = cmp(b, S);
- if ((j1 > 0 || (j1 == 0 && dig & 1))
- && dig++ == '9')
- goto round_9_up;
- }
- *s++ = dig;
- goto ret;
- }
- if (j1 > 0) {
- if (dig == '9') { /* possible if i == 1 */
- round_9_up:
- *s++ = '9';
- goto roundoff;
- }
- *s++ = dig + 1;
- goto ret;
- }
- *s++ = dig;
- if (i == ilim)
- break;
- b = multadd(b, 10, 0);
- if (mlo == mhi)
- mlo = mhi = multadd(mhi, 10, 0);
- else {
- mlo = multadd(mlo, 10, 0);
- mhi = multadd(mhi, 10, 0);
- }
- }
- }
- else
- for(i = 1;; i++) {
- *s++ = dig = quorem(b,S) + '0';
- if (i >= ilim)
- break;
- b = multadd(b, 10, 0);
- }
-
- /* Round off last digit */
-
- b = lshift(b, 1);
- j = cmp(b, S);
- if (j > 0 || (j == 0 && dig & 1)) {
- roundoff:
- while(*--s == '9')
- if (s == s0) {
- k++;
- *s++ = '1';
- goto ret;
- }
- ++*s++;
- }
- else {
- while(*--s == '0') {}
- s++;
- }
- ret:
- Bfree(S);
- if (mhi) {
- if (mlo && mlo != mhi)
- Bfree(mlo);
- Bfree(mhi);
- }
- ret1:
- Bfree(b);
- if (s == s0) { /* don't return empty string */
- *s++ = '0';
- k = 0;
- }
- *s = 0;
- *decpt = k + 1;
- if (rve)
- *rve = s;
- return s0;
+ return QLatin1String(result, length);
}
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qlocale_tools_p.h b/src/corelib/tools/qlocale_tools_p.h
index 03f35209b4..3a8036c642 100644
--- a/src/corelib/tools/qlocale_tools_p.h
+++ b/src/corelib/tools/qlocale_tools_p.h
@@ -66,8 +66,13 @@
QT_BEGIN_NAMESPACE
+double asciiToDouble(const char *num, int numLen, bool &ok, int &processed);
+void doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, char *buf, int bufSize,
+ bool &sign, int &length, int &decpt);
+
QString qulltoa(qulonglong l, int base, const QChar _zero);
QString qlltoa(qlonglong l, int base, const QChar zero);
+Q_CORE_EXPORT QString qdtoa(qreal d, int *decpt, int *sign);
enum PrecisionMode {
PMDecimalDigits = 0x01,
@@ -76,15 +81,16 @@ enum PrecisionMode {
};
QString &decimalForm(QChar zero, QChar decimal, QChar group,
- QString &digits, int decpt, uint precision,
+ QString &digits, int decpt, int precision,
PrecisionMode pm,
bool always_show_decpt,
bool thousands_group);
QString &exponentForm(QChar zero, QChar decimal, QChar exponential,
QChar group, QChar plus, QChar minus,
- QString &digits, int decpt, uint precision,
+ QString &digits, int decpt, int precision,
PrecisionMode pm,
- bool always_show_decpt);
+ bool always_show_decpt,
+ bool leading_zero_in_exponent);
inline bool isZero(double d)
{
@@ -96,8 +102,6 @@ inline bool isZero(double d)
}
}
-Q_CORE_EXPORT char *qdtoa(double d, int mode, int ndigits, int *decpt,
- int *sign, char **rve, char **digits_str);
Q_CORE_EXPORT double qstrtod(const char *s00, char const **se, bool *ok);
qlonglong qstrtoll(const char *nptr, const char **endptr, int base, bool *ok);
qulonglong qstrtoull(const char *nptr, const char **endptr, int base, bool *ok);
diff --git a/src/corelib/tools/qpair.h b/src/corelib/tools/qpair.h
index d637067fa8..b21750f76c 100644
--- a/src/corelib/tools/qpair.h
+++ b/src/corelib/tools/qpair.h
@@ -46,30 +46,36 @@ struct QPair
typedef T2 second_type;
Q_DECL_CONSTEXPR QPair()
- Q_DECL_NOEXCEPT_EXPR(noexcept(T1()) && noexcept(T2()))
+ Q_DECL_NOEXCEPT_EXPR((std::is_nothrow_default_constructible<T1>::value &&
+ std::is_nothrow_default_constructible<T2>::value))
: first(), second() {}
Q_DECL_CONSTEXPR QPair(const T1 &t1, const T2 &t2)
- Q_DECL_NOEXCEPT_EXPR(noexcept(T1(t1)) && noexcept(T2(t2)))
+ Q_DECL_NOEXCEPT_EXPR((std::is_nothrow_copy_constructible<T1>::value &&
+ std::is_nothrow_copy_constructible<T2>::value))
: first(t1), second(t2) {}
// compiler-generated copy/move ctor/assignment operators are fine!
template <typename TT1, typename TT2>
Q_DECL_CONSTEXPR QPair(const QPair<TT1, TT2> &p)
- Q_DECL_NOEXCEPT_EXPR(noexcept(T1(p.first)) && noexcept(T2(p.second)))
+ Q_DECL_NOEXCEPT_EXPR((std::is_nothrow_constructible<T1, TT1&>::value &&
+ std::is_nothrow_constructible<T2, TT2&>::value))
: first(p.first), second(p.second) {}
template <typename TT1, typename TT2>
Q_DECL_RELAXED_CONSTEXPR QPair &operator=(const QPair<TT1, TT2> &p)
- Q_DECL_NOEXCEPT_EXPR(noexcept(std::declval<T1&>() = p.first) && noexcept(std::declval<T2&>() = p.second))
+ Q_DECL_NOEXCEPT_EXPR((std::is_nothrow_assignable<T1, TT1&>::value &&
+ std::is_nothrow_assignable<T2, TT2&>::value))
{ first = p.first; second = p.second; return *this; }
#ifdef Q_COMPILER_RVALUE_REFS
template <typename TT1, typename TT2>
Q_DECL_CONSTEXPR QPair(QPair<TT1, TT2> &&p)
+ Q_DECL_NOEXCEPT_EXPR((std::is_nothrow_constructible<T1, TT1>::value &&
+ std::is_nothrow_constructible<T2, TT2>::value))
// can't use std::move here as it's not constexpr in C++11:
- Q_DECL_NOEXCEPT_EXPR(noexcept(T1(static_cast<TT1 &&>(p.first))) && noexcept(T2(static_cast<TT2 &&>(p.second))))
: first(static_cast<TT1 &&>(p.first)), second(static_cast<TT2 &&>(p.second)) {}
template <typename TT1, typename TT2>
Q_DECL_RELAXED_CONSTEXPR QPair &operator=(QPair<TT1, TT2> &&p)
- Q_DECL_NOEXCEPT_EXPR(noexcept(std::declval<T1&>() = std::move(p.first)) && noexcept(std::declval<T2&>() = std::move(p.second)))
+ Q_DECL_NOEXCEPT_EXPR((std::is_nothrow_assignable<T1, TT1>::value &&
+ std::is_nothrow_assignable<T2, TT2>::value))
{ first = std::move(p.first); second = std::move(p.second); return *this; }
#endif
diff --git a/src/corelib/tools/qregexp.h b/src/corelib/tools/qregexp.h
index f384e6c51f..9c68c194e0 100644
--- a/src/corelib/tools/qregexp.h
+++ b/src/corelib/tools/qregexp.h
@@ -68,10 +68,9 @@ public:
~QRegExp();
QRegExp &operator=(const QRegExp &rx);
#ifdef Q_COMPILER_RVALUE_REFS
- inline QRegExp &operator=(QRegExp &&other)
- { qSwap(priv,other.priv); return *this; }
+ QRegExp &operator=(QRegExp &&other) Q_DECL_NOTHROW { swap(other); return *this; }
#endif
- inline void swap(QRegExp &other) { qSwap(priv, other.priv); }
+ void swap(QRegExp &other) Q_DECL_NOTHROW { qSwap(priv, other.priv); }
bool operator==(const QRegExp &rx) const;
inline bool operator!=(const QRegExp &rx) const { return !operator==(rx); }
diff --git a/src/corelib/tools/qringbuffer.cpp b/src/corelib/tools/qringbuffer.cpp
index 85cfdaf129..e9b655c01e 100644
--- a/src/corelib/tools/qringbuffer.cpp
+++ b/src/corelib/tools/qringbuffer.cpp
@@ -65,6 +65,8 @@ const char *QRingBuffer::readPointerAtPosition(qint64 pos, qint64 &length) const
void QRingBuffer::free(qint64 bytes)
{
+ Q_ASSERT(bytes <= bufferSize);
+
while (bytes > 0) {
const qint64 blockSize = buffers.first().size() - head;
@@ -100,20 +102,25 @@ char *QRingBuffer::reserve(qint64 bytes)
if (bytes <= 0 || bytes >= MaxByteArraySize)
return 0;
- const qint64 newSize = bytes + tail;
- // if need buffer reallocation
- if (newSize > buffers.last().size()) {
- if (newSize > buffers.last().capacity() && (tail >= basicBlockSize
- || newSize >= MaxByteArraySize)) {
- // shrink this buffer to its current size
- buffers.last().resize(tail);
-
- // create a new QByteArray
- buffers.append(QByteArray());
- ++tailBuffer;
- tail = 0;
+ if (buffers.isEmpty()) {
+ buffers.append(QByteArray());
+ buffers.first().resize(qMax(basicBlockSize, int(bytes)));
+ } else {
+ const qint64 newSize = bytes + tail;
+ // if need buffer reallocation
+ if (newSize > buffers.last().size()) {
+ if (newSize > buffers.last().capacity() && (tail >= basicBlockSize
+ || newSize >= MaxByteArraySize)) {
+ // shrink this buffer to its current size
+ buffers.last().resize(tail);
+
+ // create a new QByteArray
+ buffers.append(QByteArray());
+ ++tailBuffer;
+ tail = 0;
+ }
+ buffers.last().resize(qMax(basicBlockSize, tail + int(bytes)));
}
- buffers.last().resize(qMax(basicBlockSize, tail + int(bytes)));
}
char *writePtr = buffers.last().data() + tail;
@@ -134,9 +141,13 @@ char *QRingBuffer::reserveFront(qint64 bytes)
return 0;
if (head < bytes) {
- buffers.first().remove(0, head);
- if (tailBuffer == 0)
- tail -= head;
+ if (buffers.isEmpty()) {
+ buffers.append(QByteArray());
+ } else {
+ buffers.first().remove(0, head);
+ if (tailBuffer == 0)
+ tail -= head;
+ }
head = qMax(basicBlockSize, int(bytes));
if (bufferSize == 0) {
@@ -155,6 +166,8 @@ char *QRingBuffer::reserveFront(qint64 bytes)
void QRingBuffer::chop(qint64 bytes)
{
+ Q_ASSERT(bytes <= bufferSize);
+
while (bytes > 0) {
if (tailBuffer == 0 || tail > bytes) {
// keep a single block around if it does not exceed
@@ -185,6 +198,9 @@ void QRingBuffer::chop(qint64 bytes)
void QRingBuffer::clear()
{
+ if (buffers.isEmpty())
+ return;
+
buffers.erase(buffers.begin() + 1, buffers.end());
buffers.first().clear();
@@ -193,20 +209,32 @@ void QRingBuffer::clear()
bufferSize = 0;
}
-qint64 QRingBuffer::indexOf(char c, qint64 maxLength) const
+qint64 QRingBuffer::indexOf(char c, qint64 maxLength, qint64 pos) const
{
- qint64 index = 0;
- qint64 j = head;
- for (int i = 0; index < maxLength && i < buffers.size(); ++i) {
- const char *ptr = buffers[i].constData() + j;
- j = qMin(index + (i == tailBuffer ? tail : buffers[i].size()) - j, maxLength);
-
- while (index < j) {
- if (*ptr++ == c)
- return index;
- ++index;
+ if (maxLength <= 0 || pos < 0)
+ return -1;
+
+ qint64 index = -(pos + head);
+ for (int i = 0; i < buffers.size(); ++i) {
+ const qint64 nextBlockIndex = qMin(index + (i == tailBuffer ? tail : buffers[i].size()),
+ maxLength);
+
+ if (nextBlockIndex > 0) {
+ const char *ptr = buffers[i].constData();
+ if (index < 0) {
+ ptr -= index;
+ index = 0;
+ }
+
+ const char *findPtr = reinterpret_cast<const char *>(memchr(ptr, c,
+ nextBlockIndex - index));
+ if (findPtr)
+ return qint64(findPtr - ptr) + index + pos;
+
+ if (nextBlockIndex == maxLength)
+ return -1;
}
- j = 0;
+ index = nextBlockIndex;
}
return -1;
}
@@ -288,7 +316,10 @@ qint64 QRingBuffer::peek(char *data, qint64 maxLength, qint64 pos) const
void QRingBuffer::append(const QByteArray &qba)
{
if (tail == 0) {
- buffers.last() = qba;
+ if (buffers.isEmpty())
+ buffers.append(qba);
+ else
+ buffers.last() = qba;
} else {
buffers.last().resize(tail);
buffers.append(qba);
diff --git a/src/corelib/tools/qringbuffer_p.h b/src/corelib/tools/qringbuffer_p.h
index 68509a6a80..96c4f9acb6 100644
--- a/src/corelib/tools/qringbuffer_p.h
+++ b/src/corelib/tools/qringbuffer_p.h
@@ -54,9 +54,7 @@ class QRingBuffer
{
public:
explicit inline QRingBuffer(int growth = 4096) :
- head(0), tail(0), tailBuffer(0), basicBlockSize(growth), bufferSize(0) {
- buffers.append(QByteArray());
- }
+ head(0), tail(0), tailBuffer(0), basicBlockSize(growth), bufferSize(0) { }
inline qint64 nextDataBlockSize() const {
return (tailBuffer == 0 ? tail : buffers.first().size()) - head;
@@ -114,14 +112,17 @@ public:
Q_CORE_EXPORT void clear();
inline qint64 indexOf(char c) const { return indexOf(c, size()); }
- Q_CORE_EXPORT qint64 indexOf(char c, qint64 maxLength) const;
+ Q_CORE_EXPORT qint64 indexOf(char c, qint64 maxLength, qint64 pos = 0) const;
Q_CORE_EXPORT qint64 read(char *data, qint64 maxLength);
Q_CORE_EXPORT QByteArray read();
Q_CORE_EXPORT qint64 peek(char *data, qint64 maxLength, qint64 pos = 0) const;
Q_CORE_EXPORT void append(const QByteArray &qba);
inline qint64 skip(qint64 length) {
- return read(0, length);
+ qint64 bytesToSkip = qMin(length, bufferSize);
+
+ free(bytesToSkip);
+ return bytesToSkip;
}
Q_CORE_EXPORT qint64 readLine(char *data, qint64 maxLength);
diff --git a/src/corelib/tools/qsharedpointer.cpp b/src/corelib/tools/qsharedpointer.cpp
index 86f4c6a268..b5e27cc720 100644
--- a/src/corelib/tools/qsharedpointer.cpp
+++ b/src/corelib/tools/qsharedpointer.cpp
@@ -1292,6 +1292,17 @@
compile. Use qSharedPointerConstCast to cast away the constness.
*/
+/*!
+ \fn QDebug operator<<(QDebug debug, const QSharedPointer<T> &ptr)
+ \relates QSharedPointer
+ \since 5.7
+
+ Writes the pointer tracked by \a ptr into the debug object \a debug for
+ debugging purposes.
+
+ \sa {Debugging Techniques}
+*/
+
#include <qset.h>
#include <qmutex.h>
@@ -1497,7 +1508,7 @@ void QtSharedPointer::internalSafetyCheckAdd(const void *d_ptr, const volatile v
//qDebug("Adding d=%p value=%p", d_ptr, ptr);
const void *other_d_ptr = kp->dataPointers.value(ptr, 0);
- if (other_d_ptr) {
+ if (Q_UNLIKELY(other_d_ptr)) {
# ifdef BACKTRACE_SUPPORTED
printBacktrace(knownPointers()->dPointers.value(other_d_ptr).backtrace);
# endif
@@ -1528,7 +1539,7 @@ void QtSharedPointer::internalSafetyCheckRemove(const void *d_ptr)
QMutexLocker lock(&kp->mutex);
QHash<const void *, Data>::iterator it = kp->dPointers.find(d_ptr);
- if (it == kp->dPointers.end()) {
+ if (Q_UNLIKELY(it == kp->dPointers.end())) {
qFatal("QSharedPointer: internal self-check inconsistency: pointer %p was not tracked. "
"To use QT_SHAREDPOINTER_TRACK_POINTERS, you have to enable it throughout "
"in your code.", d_ptr);
@@ -1555,10 +1566,10 @@ void QtSharedPointer::internalSafetyCheckCleanCheck()
KnownPointers *const kp = knownPointers();
Q_ASSERT_X(kp, "internalSafetyCheckSelfCheck()", "Called after global statics deletion!");
- if (kp->dPointers.size() != kp->dataPointers.size())
+ if (Q_UNLIKELY(kp->dPointers.size() != kp->dataPointers.size()))
qFatal("Internal consistency error: the number of pointers is not equal!");
- if (!kp->dPointers.isEmpty())
+ if (Q_UNLIKELY(!kp->dPointers.isEmpty()))
qFatal("Pointer cleaning failed: %d entries remaining", kp->dPointers.size());
# endif
}
diff --git a/src/corelib/tools/qsharedpointer.h b/src/corelib/tools/qsharedpointer.h
index 279ec36a28..56e13d500f 100644
--- a/src/corelib/tools/qsharedpointer.h
+++ b/src/corelib/tools/qsharedpointer.h
@@ -153,6 +153,8 @@ template <class X, class T> QSharedPointer<X> qSharedPointerObjectCast(const QWe
template <class X, class T> QWeakPointer<X> qWeakPointerCast(const QWeakPointer<T> &src);
+template <class T> QDebug operator<<(QDebug debug, const QSharedPointer<T> &ptr);
+
QT_END_NAMESPACE
#endif // Q_QDOC
diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h
index bd98cb326c..6827483464 100644
--- a/src/corelib/tools/qsharedpointer_impl.h
+++ b/src/corelib/tools/qsharedpointer_impl.h
@@ -55,6 +55,7 @@ QT_END_NAMESPACE
#include <new>
#include <QtCore/qatomic.h>
#include <QtCore/qobject.h> // for qobject_cast
+#include <QtCore/qdebug.h>
#if QT_DEPRECATED_SINCE(5, 5)
#include <QtCore/qhash.h>
#endif
@@ -305,7 +306,7 @@ public:
inline T &operator*() const { return *data(); }
inline T *operator->() const { return data(); }
- QSharedPointer() : value(Q_NULLPTR), d(Q_NULLPTR) { }
+ QSharedPointer() Q_DECL_NOTHROW : value(Q_NULLPTR), d(Q_NULLPTR) {}
~QSharedPointer() { deref(); }
inline explicit QSharedPointer(T *ptr) : value(ptr) // noexcept
@@ -315,22 +316,22 @@ public:
inline QSharedPointer(T *ptr, Deleter deleter) : value(ptr) // throws
{ internalConstruct(ptr, deleter); }
- inline QSharedPointer(const QSharedPointer &other) : value(other.value), d(other.d)
+ QSharedPointer(const QSharedPointer &other) Q_DECL_NOTHROW : value(other.value), d(other.d)
{ if (d) ref(); }
- inline QSharedPointer &operator=(const QSharedPointer &other)
+ QSharedPointer &operator=(const QSharedPointer &other) Q_DECL_NOTHROW
{
QSharedPointer copy(other);
swap(copy);
return *this;
}
#ifdef Q_COMPILER_RVALUE_REFS
- inline QSharedPointer(QSharedPointer &&other)
+ QSharedPointer(QSharedPointer &&other) Q_DECL_NOTHROW
: value(other.value), d(other.d)
{
other.d = Q_NULLPTR;
other.value = Q_NULLPTR;
}
- inline QSharedPointer &operator=(QSharedPointer &&other)
+ QSharedPointer &operator=(QSharedPointer &&other) Q_DECL_NOTHROW
{
QSharedPointer moved(std::move(other));
swap(moved);
@@ -596,7 +597,7 @@ public:
inline bool operator !() const { return isNull(); }
inline T *data() const { return d == Q_NULLPTR || d->strongref.load() == 0 ? Q_NULLPTR : value; }
- inline QWeakPointer() : d(Q_NULLPTR), value(Q_NULLPTR) { }
+ inline QWeakPointer() Q_DECL_NOTHROW : d(Q_NULLPTR), value(Q_NULLPTR) { }
inline ~QWeakPointer() { if (d && !d->weakref.deref()) delete d; }
#ifndef QT_NO_QOBJECT
@@ -614,15 +615,26 @@ public:
{ return *this = QWeakPointer(ptr); }
#endif
- inline QWeakPointer(const QWeakPointer &o) : d(o.d), value(o.value)
+ QWeakPointer(const QWeakPointer &other) Q_DECL_NOTHROW : d(other.d), value(other.value)
{ if (d) d->weakref.ref(); }
- inline QWeakPointer &operator=(const QWeakPointer &o)
+#ifdef Q_COMPILER_RVALUE_REFS
+ QWeakPointer(QWeakPointer &&other) Q_DECL_NOTHROW
+ : d(other.d), value(other.value)
{
- internalSet(o.d, o.value);
+ other.d = Q_NULLPTR;
+ other.value = Q_NULLPTR;
+ }
+ QWeakPointer &operator=(QWeakPointer &&other) Q_DECL_NOTHROW
+ { QWeakPointer moved(std::move(other)); swap(moved); return *this; }
+#endif
+ QWeakPointer &operator=(const QWeakPointer &other) Q_DECL_NOTHROW
+ {
+ QWeakPointer copy(other);
+ swap(copy);
return *this;
}
- inline void swap(QWeakPointer &other)
+ void swap(QWeakPointer &other) Q_DECL_NOTHROW
{
qSwap(this->d, other.d);
qSwap(this->value, other.value);
@@ -858,6 +870,16 @@ inline void qSwap(QSharedPointer<T> &p1, QSharedPointer<T> &p2)
p1.swap(p2);
}
+#ifndef QT_NO_DEBUG_STREAM
+template <class T>
+Q_INLINE_TEMPLATE QDebug operator<<(QDebug debug, const QSharedPointer<T> &ptr)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << "QSharedPointer(" << ptr.data() << ")";
+ return debug;
+}
+#endif
+
QT_END_NAMESPACE
namespace std {
template <class T>
diff --git a/src/corelib/tools/qsimd.cpp b/src/corelib/tools/qsimd.cpp
index 3e4fdfaaf1..171e87df05 100644
--- a/src/corelib/tools/qsimd.cpp
+++ b/src/corelib/tools/qsimd.cpp
@@ -68,6 +68,8 @@
// copied from <linux/auxvec.h>
#define AT_HWCAP 16 /* arch dependent hints at CPU capabilities */
+#elif defined(Q_CC_GHS)
+#include <INTEGRITY_types.h>
#endif
QT_BEGIN_NAMESPACE
@@ -179,6 +181,10 @@ static int maxBasicCpuidSupported()
int info[4];
__cpuid(info, 0);
return info[0];
+#elif defined(Q_CC_GHS)
+ unsigned int info[4];
+ __CPUID(0, info);
+ return info[0];
#else
return 0;
#endif
@@ -198,6 +204,11 @@ static void cpuidFeatures01(uint &ecx, uint &edx)
__cpuid(info, 1);
ecx = info[2];
edx = info[3];
+#elif defined(Q_CC_GHS)
+ unsigned int info[4];
+ __CPUID(1, info);
+ ecx = info[2];
+ edx = info[3];
#endif
}
@@ -223,6 +234,11 @@ static void cpuidFeatures07_00(uint &ebx, uint &ecx)
__cpuidex(info, 7, 0);
ebx = info[1];
ecx = info[2];
+#elif defined(Q_CC_GHS)
+ unsigned int info[4];
+ __CPUIDEX(7, 0, info);
+ ebx = info[1];
+ ecx = info[2];
#endif
}
@@ -232,7 +248,7 @@ inline quint64 _xgetbv(__int64) { return 0; }
#endif
static void xgetbv(uint in, uint &eax, uint &edx)
{
-#if defined(Q_CC_GNU)
+#if defined(Q_CC_GNU) || defined(Q_CC_GHS)
asm (".byte 0x0F, 0x01, 0xD0" // xgetbv instruction
: "=a" (eax), "=d" (edx)
: "c" (in));
@@ -638,6 +654,15 @@ int ffsll(quint64 i)
#endif
#elif defined(Q_OS_ANDROID) || defined(Q_OS_QNX) || defined(Q_OS_OSX)
# define ffsll __builtin_ffsll
+#elif defined(Q_OS_INTEGRITY)
+int ffsll(quint64 i)
+{
+ unsigned long result;
+ result = __CLZ32(i);
+ if (!result)
+ result = 32 + __CLZ32(i >> 32);
+ return result;
+}
#endif
#ifdef Q_ATOMIC_INT64_IS_SUPPORTED
@@ -685,7 +710,7 @@ void qDetectCpuFeatures()
#else
bool runningOnValgrind = false;
#endif
- if (!runningOnValgrind && (minFeature != 0 && (f & minFeature) != minFeature)) {
+ if (Q_UNLIKELY(!runningOnValgrind && minFeature != 0 && (f & minFeature) != minFeature)) {
quint64 missing = minFeature & ~f;
fprintf(stderr, "Incompatible processor. This Qt build requires the following features:\n ");
for (int i = 0; i < features_count; ++i) {
diff --git a/src/corelib/tools/qsimd_p.h b/src/corelib/tools/qsimd_p.h
index 12a329f36c..dedee06e38 100644
--- a/src/corelib/tools/qsimd_p.h
+++ b/src/corelib/tools/qsimd_p.h
@@ -73,6 +73,7 @@
* SSE4_2 | x86 | I & C | I & C | I only |
* AVX | x86 | I & C | I & C | I & C |
* AVX2 | x86 | I & C | I & C | I only |
+ * AVX512xx | x86 | I & C | I & C | I only |
* I = intrinsics; C = code generation
*
* Code can use the following constructs to determine compiler support & status:
@@ -430,7 +431,23 @@ static inline quint64 qCpuFeatures()
#define qCpuHasFeature(feature) ((qCompilerCpuFeatures & (Q_UINT64_C(1) << CpuFeature ## feature)) \
|| (qCpuFeatures() & (Q_UINT64_C(1) << CpuFeature ## feature)))
-#ifdef Q_PROCESSOR_X86
+#if QT_HAS_BUILTIN(__builtin_clz) && QT_HAS_BUILTIN(__builtin_ctz) && defined(Q_CC_CLANG) && !defined(Q_CC_INTEL)
+static Q_ALWAYS_INLINE unsigned _bit_scan_reverse(unsigned val)
+{
+ Q_ASSERT(val != 0); // if val==0, the result is undefined.
+ unsigned result = static_cast<unsigned>(__builtin_clz(val)); // Count Leading Zeros
+ // Now Invert the result: clz will count *down* from the msb to the lsb, so the msb index is 31
+ // and the lsb inde is 0. The result for _bit_scan_reverse is expected to be the index when
+ // counting up: msb index is 0 (because it starts there), and the lsb index is 31.
+ result ^= sizeof(unsigned) * 8 - 1;
+ return result;
+}
+static Q_ALWAYS_INLINE unsigned _bit_scan_forward(unsigned val)
+{
+ Q_ASSERT(val != 0); // if val==0, the result is undefined.
+ return static_cast<unsigned>(__builtin_ctz(val)); // Count Trailing Zeros
+}
+#elif defined(Q_PROCESSOR_X86)
// Bit scan functions for x86
# if defined(Q_CC_MSVC) && !defined(Q_OS_WINCE)
// MSVC calls it _BitScanReverse and returns the carry flag, which we don't need
diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp
index 8c06ec4045..2f340477fc 100644
--- a/src/corelib/tools/qstring.cpp
+++ b/src/corelib/tools/qstring.cpp
@@ -40,6 +40,7 @@
#include <qtextcodec.h>
#endif
#include <private/qutfcodec_p.h>
+#include <private/qlocale_tools_p.h>
#include "qsimd_p.h"
#include <qnumeric.h>
#include <qdatastream.h>
@@ -2690,7 +2691,7 @@ QString &QString::replace(QChar c, QLatin1String after, Qt::CaseSensitivity cs)
expect. Consider sorting user-interface strings with
localeAwareCompare().
*/
-bool operator==(const QString &s1, const QString &s2)
+bool operator==(const QString &s1, const QString &s2) Q_DECL_NOTHROW
{
if (s1.d->size != s2.d->size)
return false;
@@ -2703,7 +2704,7 @@ bool operator==(const QString &s1, const QString &s2)
Returns \c true if this string is equal to \a other; otherwise
returns \c false.
*/
-bool QString::operator==(QLatin1String other) const
+bool QString::operator==(QLatin1String other) const Q_DECL_NOTHROW
{
if (d->size != other.size())
return false;
@@ -2754,7 +2755,7 @@ bool QString::operator==(QLatin1String other) const
expect. Consider sorting user-interface strings using the
QString::localeAwareCompare() function.
*/
-bool operator<(const QString &s1, const QString &s2)
+bool operator<(const QString &s1, const QString &s2) Q_DECL_NOTHROW
{
return ucstrcmp(s1.constData(), s1.length(), s2.constData(), s2.length()) < 0;
}
@@ -2764,7 +2765,7 @@ bool operator<(const QString &s1, const QString &s2)
Returns \c true if this string is lexically less than the parameter
string called \a other; otherwise returns \c false.
*/
-bool QString::operator<(QLatin1String other) const
+bool QString::operator<(QLatin1String other) const Q_DECL_NOTHROW
{
const uchar *c = (const uchar *) other.latin1();
if (!c || *c == 0)
@@ -2869,7 +2870,7 @@ bool QString::operator<(QLatin1String other) const
Returns \c true if this string is lexically greater than the parameter
string \a other; otherwise returns \c false.
*/
-bool QString::operator>(QLatin1String other) const
+bool QString::operator>(QLatin1String other) const Q_DECL_NOTHROW
{
const uchar *c = (const uchar *) other.latin1();
if (!c || *c == '\0')
@@ -5352,7 +5353,7 @@ QString& QString::fill(QChar ch, int size)
Same as compare(*this, \a other, \a cs).
*/
-int QString::compare(const QString &other, Qt::CaseSensitivity cs) const
+int QString::compare(const QString &other, Qt::CaseSensitivity cs) const Q_DECL_NOTHROW
{
if (cs == Qt::CaseSensitive)
return ucstrcmp(constData(), length(), other.constData(), other.length());
@@ -5364,7 +5365,7 @@ int QString::compare(const QString &other, Qt::CaseSensitivity cs) const
\since 4.5
*/
int QString::compare_helper(const QChar *data1, int length1, const QChar *data2, int length2,
- Qt::CaseSensitivity cs)
+ Qt::CaseSensitivity cs) Q_DECL_NOTHROW
{
if (cs == Qt::CaseSensitive)
return ucstrcmp(data1, length1, data2, length2);
@@ -5379,7 +5380,7 @@ int QString::compare_helper(const QChar *data1, int length1, const QChar *data2,
Same as compare(*this, \a other, \a cs).
*/
-int QString::compare(QLatin1String other, Qt::CaseSensitivity cs) const
+int QString::compare(QLatin1String other, Qt::CaseSensitivity cs) const Q_DECL_NOTHROW
{
return compare_helper(unicode(), length(), other, cs);
}
@@ -5415,7 +5416,7 @@ int QString::compare_helper(const QChar *data1, int length1, const char *data2,
\since 4.5
*/
int QString::compare_helper(const QChar *data1, int length1, QLatin1String s2,
- Qt::CaseSensitivity cs)
+ Qt::CaseSensitivity cs) Q_DECL_NOTHROW
{
const ushort *uc = reinterpret_cast<const ushort *>(data1);
const ushort *uce = uc + length1;
@@ -5886,6 +5887,72 @@ QString &QString::vsprintf(const char *cformat, va_list ap)
return *this = vasprintf(cformat, ap);
}
+static void append_utf8(QString &qs, const char *cs, int len)
+{
+ const int oldSize = qs.size();
+ qs.resize(oldSize + len);
+ const QChar *newEnd = QUtf8::convertToUnicode(qs.data() + oldSize, cs, len);
+ qs.resize(newEnd - qs.constData());
+}
+
+static uint parse_flag_characters(const char * &c) Q_DECL_NOTHROW
+{
+ uint flags = QLocaleData::ZeroPadExponent;
+ while (true) {
+ switch (*c) {
+ case '#': flags |= QLocaleData::Alternate; break;
+ case '0': flags |= QLocaleData::ZeroPadded; break;
+ case '-': flags |= QLocaleData::LeftAdjusted; break;
+ case ' ': flags |= QLocaleData::BlankBeforePositive; break;
+ case '+': flags |= QLocaleData::AlwaysShowSign; break;
+ case '\'': flags |= QLocaleData::ThousandsGroup; break;
+ default: return flags;
+ }
+ ++c;
+ }
+}
+
+static int parse_field_width(const char * &c)
+{
+ Q_ASSERT(qIsDigit(*c));
+
+ // can't be negative - started with a digit
+ // contains at least one digit
+ const char *endp;
+ bool ok;
+ const qulonglong result = qstrtoull(c, &endp, 10, &ok);
+ c = endp;
+ while (qIsDigit(*c)) // preserve Qt 5.5 behavior of consuming all digits, no matter how many
+ ++c;
+ return ok && result < qulonglong(std::numeric_limits<int>::max()) ? int(result) : 0;
+}
+
+enum LengthMod { lm_none, lm_hh, lm_h, lm_l, lm_ll, lm_L, lm_j, lm_z, lm_t };
+
+static inline bool can_consume(const char * &c, char ch) Q_DECL_NOTHROW
+{
+ if (*c == ch) {
+ ++c;
+ return true;
+ }
+ return false;
+}
+
+static LengthMod parse_length_modifier(const char * &c) Q_DECL_NOTHROW
+{
+ switch (*c++) {
+ case 'h': return can_consume(c, 'h') ? lm_hh : lm_h;
+ case 'l': return can_consume(c, 'l') ? lm_ll : lm_l;
+ case 'L': return lm_L;
+ case 'j': return lm_j;
+ case 'z':
+ case 'Z': return lm_z;
+ case 't': return lm_t;
+ }
+ --c; // don't consume *c - it wasn't a flag
+ return lm_none;
+}
+
/*!
\fn QString::vasprintf(const char *cformat, va_list ap)
\since 5.5
@@ -5916,7 +5983,7 @@ QString QString::vasprintf(const char *cformat, va_list ap)
const char *cb = c;
while (*c != '\0' && *c != '%')
c++;
- result.append(QString::fromUtf8(cb, (int)(c - cb)));
+ append_utf8(result, cb, int(c - cb));
if (*c == '\0')
break;
@@ -5935,23 +6002,7 @@ QString QString::vasprintf(const char *cformat, va_list ap)
continue;
}
- // Parse flag characters
- uint flags = 0;
- bool no_more_flags = false;
- do {
- switch (*c) {
- case '#': flags |= QLocaleData::Alternate; break;
- case '0': flags |= QLocaleData::ZeroPadded; break;
- case '-': flags |= QLocaleData::LeftAdjusted; break;
- case ' ': flags |= QLocaleData::BlankBeforePositive; break;
- case '+': flags |= QLocaleData::AlwaysShowSign; break;
- case '\'': flags |= QLocaleData::ThousandsGroup; break;
- default: no_more_flags = true; break;
- }
-
- if (!no_more_flags)
- ++c;
- } while (!no_more_flags);
+ uint flags = parse_flag_characters(c);
if (*c == '\0') {
result.append(QLatin1String(escape_start)); // incomplete escape, treat as non-escape text
@@ -5961,15 +6012,8 @@ QString QString::vasprintf(const char *cformat, va_list ap)
// Parse field width
int width = -1; // -1 means unspecified
if (qIsDigit(*c)) {
- QString width_str;
- while (*c != '\0' && qIsDigit(*c))
- width_str.append(QLatin1Char(*c++));
-
- // can't be negative - started with a digit
- // contains at least one digit
- width = width_str.toInt();
- }
- else if (*c == '*') {
+ width = parse_field_width(c);
+ } else if (*c == '*') { // can't parse this in another function, not portably, at least
width = va_arg(ap, int);
if (width < 0)
width = -1; // treat all negative numbers as unspecified
@@ -5986,15 +6030,8 @@ QString QString::vasprintf(const char *cformat, va_list ap)
if (*c == '.') {
++c;
if (qIsDigit(*c)) {
- QString precision_str;
- while (*c != '\0' && qIsDigit(*c))
- precision_str.append(QLatin1Char(*c++));
-
- // can't be negative - started with a digit
- // contains at least one digit
- precision = precision_str.toInt();
- }
- else if (*c == '*') {
+ precision = parse_field_width(c);
+ } else if (*c == '*') { // can't parse this in another function, not portably, at least
precision = va_arg(ap, int);
if (precision < 0)
precision = -1; // treat all negative numbers as unspecified
@@ -6007,53 +6044,7 @@ QString QString::vasprintf(const char *cformat, va_list ap)
break;
}
- // Parse the length modifier
- enum LengthMod { lm_none, lm_hh, lm_h, lm_l, lm_ll, lm_L, lm_j, lm_z, lm_t };
- LengthMod length_mod = lm_none;
- switch (*c) {
- case 'h':
- ++c;
- if (*c == 'h') {
- length_mod = lm_hh;
- ++c;
- }
- else
- length_mod = lm_h;
- break;
-
- case 'l':
- ++c;
- if (*c == 'l') {
- length_mod = lm_ll;
- ++c;
- }
- else
- length_mod = lm_l;
- break;
-
- case 'L':
- ++c;
- length_mod = lm_L;
- break;
-
- case 'j':
- ++c;
- length_mod = lm_j;
- break;
-
- case 'z':
- case 'Z':
- ++c;
- length_mod = lm_z;
- break;
-
- case 't':
- ++c;
- length_mod = lm_t;
- break;
-
- default: break;
- }
+ const LengthMod length_mod = parse_length_modifier(c);
if (*c == '\0') {
result.append(QLatin1String(escape_start)); // incomplete escape, treat as non-escape text
@@ -6195,8 +6186,7 @@ QString QString::vasprintf(const char *cformat, va_list ap)
}
case lm_ll: {
qint64 *n = va_arg(ap, qint64*);
- volatile uint tmp = result.length(); // egcs-2.91.66 gets internal
- *n = tmp; // compiler error without volatile
+ *n = result.length();
break;
}
default: {
@@ -6259,7 +6249,7 @@ qlonglong QString::toIntegral_helper(const QChar *data, int len, bool *ok, int b
}
#endif
- return QLocaleData::c()->stringToLongLong(data, len, base, ok, QLocaleData::FailOnGroupSeparators);
+ return QLocaleData::c()->stringToLongLong(data, len, base, ok, QLocale::RejectGroupSeparator);
}
@@ -6299,7 +6289,8 @@ qulonglong QString::toIntegral_helper(const QChar *data, uint len, bool *ok, int
}
#endif
- return QLocaleData::c()->stringToUnsLongLong(data, len, base, ok, QLocaleData::FailOnGroupSeparators);
+ return QLocaleData::c()->stringToUnsLongLong(data, len, base, ok,
+ QLocale::RejectGroupSeparator);
}
/*!
@@ -6500,7 +6491,7 @@ ushort QString::toUShort(bool *ok, int base) const
double QString::toDouble(bool *ok) const
{
- return QLocaleData::c()->stringToDouble(constData(), size(), ok, QLocaleData::FailOnGroupSeparators);
+ return QLocaleData::c()->stringToDouble(constData(), size(), ok, QLocale::RejectGroupSeparator);
}
/*!
@@ -7748,6 +7739,8 @@ QString QString::arg(double a, int fieldWidth, char fmt, int prec, QChar fillCha
if (!(locale.numberOptions() & QLocale::OmitGroupSeparator))
flags |= QLocaleData::ThousandsGroup;
+ if (!(locale.numberOptions() & QLocale::OmitLeadingZeroInExponent))
+ flags |= QLocaleData::ZeroPadExponent;
locale_arg = locale.d->m_data->doubleToString(a, prec, form, fieldWidth, flags);
}
@@ -8934,7 +8927,7 @@ QString QStringRef::toString() const {
Returns \c true if string reference \a s1 is lexically equal to string reference \a s2; otherwise
returns \c false.
*/
-bool operator==(const QStringRef &s1,const QStringRef &s2)
+bool operator==(const QStringRef &s1,const QStringRef &s2) Q_DECL_NOTHROW
{ return (s1.size() == s2.size() &&
qMemEquals((const ushort *)s1.unicode(), (const ushort *)s2.unicode(), s1.size()));
}
@@ -8944,7 +8937,7 @@ bool operator==(const QStringRef &s1,const QStringRef &s2)
Returns \c true if string \a s1 is lexically equal to string reference \a s2; otherwise
returns \c false.
*/
-bool operator==(const QString &s1,const QStringRef &s2)
+bool operator==(const QString &s1,const QStringRef &s2) Q_DECL_NOTHROW
{ return (s1.size() == s2.size() &&
qMemEquals((const ushort *)s1.unicode(), (const ushort *)s2.unicode(), s1.size()));
}
@@ -8954,7 +8947,7 @@ bool operator==(const QString &s1,const QStringRef &s2)
Returns \c true if string \a s1 is lexically equal to string reference \a s2; otherwise
returns \c false.
*/
-bool operator==(QLatin1String s1, const QStringRef &s2)
+bool operator==(QLatin1String s1, const QStringRef &s2) Q_DECL_NOTHROW
{
if (s1.size() != s2.size())
return false;
@@ -8976,7 +8969,7 @@ bool operator==(QLatin1String s1, const QStringRef &s2)
expect. Consider sorting user-interface strings using the
QString::localeAwareCompare() function.
*/
-bool operator<(const QStringRef &s1,const QStringRef &s2)
+bool operator<(const QStringRef &s1,const QStringRef &s2) Q_DECL_NOTHROW
{
return ucstrcmp(s1.constData(), s1.length(), s2.constData(), s2.length()) < 0;
}
@@ -10468,7 +10461,7 @@ ushort QStringRef::toUShort(bool *ok, int base) const
double QStringRef::toDouble(bool *ok) const
{
- return QLocaleData::c()->stringToDouble(constData(), size(), ok, QLocaleData::FailOnGroupSeparators);
+ return QLocaleData::c()->stringToDouble(constData(), size(), ok, QLocale::RejectGroupSeparator);
}
/*!
diff --git a/src/corelib/tools/qstring.h b/src/corelib/tools/qstring.h
index 1d04bcb457..75f94d7f93 100644
--- a/src/corelib/tools/qstring.h
+++ b/src/corelib/tools/qstring.h
@@ -387,25 +387,25 @@ public:
# define Q_REQUIRED_RESULT
# define Q_REQUIRED_RESULT_pushed
# endif
- QString toLower() const & Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QString toLower() const & Q_REQUIRED_RESULT
{ return toLower_helper(*this); }
- QString toLower() && Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QString toLower() && Q_REQUIRED_RESULT
{ return toLower_helper(*this); }
- QString toUpper() const & Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QString toUpper() const & Q_REQUIRED_RESULT
{ return toUpper_helper(*this); }
- QString toUpper() && Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QString toUpper() && Q_REQUIRED_RESULT
{ return toUpper_helper(*this); }
- QString toCaseFolded() const & Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QString toCaseFolded() const & Q_REQUIRED_RESULT
{ return toCaseFolded_helper(*this); }
- QString toCaseFolded() && Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QString toCaseFolded() && Q_REQUIRED_RESULT
{ return toCaseFolded_helper(*this); }
- QString trimmed() const & Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QString trimmed() const & Q_REQUIRED_RESULT
{ return trimmed_helper(*this); }
- QString trimmed() && Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QString trimmed() && Q_REQUIRED_RESULT
{ return trimmed_helper(*this); }
- QString simplified() const & Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QString simplified() const & Q_REQUIRED_RESULT
{ return simplified_helper(*this); }
- QString simplified() && Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QString simplified() && Q_REQUIRED_RESULT
{ return simplified_helper(*this); }
# ifdef Q_REQUIRED_RESULT_pushed
# pragma pop_macro("Q_REQUIRED_RESULT")
@@ -571,22 +571,23 @@ public:
QString &setUnicode(const QChar *unicode, int size);
inline QString &setUtf16(const ushort *utf16, int size);
- int compare(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int compare(QLatin1String other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ int compare(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW;
+ int compare(QLatin1String other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW;
- static inline int compare(const QString &s1, const QString &s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
+ static inline int compare(const QString &s1, const QString &s2,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW
{ return s1.compare(s2, cs); }
static inline int compare(const QString &s1, QLatin1String s2,
- Qt::CaseSensitivity cs = Qt::CaseSensitive)
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW
{ return s1.compare(s2, cs); }
static inline int compare(QLatin1String s1, const QString &s2,
- Qt::CaseSensitivity cs = Qt::CaseSensitive)
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW
{ return -s2.compare(s1, cs); }
- int compare(const QStringRef &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ int compare(const QStringRef &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW;
static int compare(const QString &s1, const QStringRef &s2,
- Qt::CaseSensitivity = Qt::CaseSensitive);
+ Qt::CaseSensitivity = Qt::CaseSensitive) Q_DECL_NOTHROW;
int localeAwareCompare(const QString& s) const;
static int localeAwareCompare(const QString& s1, const QString& s2)
@@ -626,19 +627,19 @@ public:
static QString number(qulonglong, int base=10);
static QString number(double, char f='g', int prec=6);
- friend Q_CORE_EXPORT bool operator==(const QString &s1, const QString &s2);
- friend Q_CORE_EXPORT bool operator<(const QString &s1, const QString &s2);
- friend inline bool operator>(const QString &s1, const QString &s2) { return s2 < s1; }
- friend inline bool operator!=(const QString &s1, const QString &s2) { return !(s1 == s2); }
- friend inline bool operator<=(const QString &s1, const QString &s2) { return !(s1 > s2); }
- friend inline bool operator>=(const QString &s1, const QString &s2) { return !(s1 < s2); }
+ friend Q_CORE_EXPORT bool operator==(const QString &s1, const QString &s2) Q_DECL_NOTHROW;
+ friend Q_CORE_EXPORT bool operator<(const QString &s1, const QString &s2) Q_DECL_NOTHROW;
+ friend inline bool operator>(const QString &s1, const QString &s2) Q_DECL_NOTHROW { return s2 < s1; }
+ friend inline bool operator!=(const QString &s1, const QString &s2) Q_DECL_NOTHROW { return !(s1 == s2); }
+ friend inline bool operator<=(const QString &s1, const QString &s2) Q_DECL_NOTHROW { return !(s1 > s2); }
+ friend inline bool operator>=(const QString &s1, const QString &s2) Q_DECL_NOTHROW { return !(s1 < s2); }
- bool operator==(QLatin1String s) const;
- bool operator<(QLatin1String s) const;
- bool operator>(QLatin1String s) const;
- inline bool operator!=(QLatin1String s) const { return !operator==(s); }
- inline bool operator<=(QLatin1String s) const { return !operator>(s); }
- inline bool operator>=(QLatin1String s) const { return !operator<(s); }
+ bool operator==(QLatin1String s) const Q_DECL_NOTHROW;
+ bool operator<(QLatin1String s) const Q_DECL_NOTHROW;
+ bool operator>(QLatin1String s) const Q_DECL_NOTHROW;
+ inline bool operator!=(QLatin1String s) const Q_DECL_NOTHROW { return !operator==(s); }
+ inline bool operator<=(QLatin1String s) const Q_DECL_NOTHROW { return !operator>(s); }
+ inline bool operator>=(QLatin1String s) const Q_DECL_NOTHROW { return !operator<(s); }
// ASCII compatibility
#if defined(QT_RESTRICTED_CAST_FROM_ASCII)
@@ -798,13 +799,13 @@ private:
QString multiArg(int numArgs, const QString **args) const;
static int compare_helper(const QChar *data1, int length1,
const QChar *data2, int length2,
- Qt::CaseSensitivity cs = Qt::CaseSensitive);
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW;
static int compare_helper(const QChar *data1, int length1,
const char *data2, int length2,
Qt::CaseSensitivity cs = Qt::CaseSensitive);
static int compare_helper(const QChar *data1, int length1,
QLatin1String s2,
- Qt::CaseSensitivity cs = Qt::CaseSensitive);
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW;
static int localeAwareCompare_helper(const QChar *data1, int length1,
const QChar *data2, int length2);
static QString toLower_helper(const QString &str);
@@ -953,8 +954,9 @@ inline int QString::toWCharArray(wchar_t *array) const
if (sizeof(wchar_t) == sizeof(QChar)) {
memcpy(array, d->data(), sizeof(QChar) * size());
return size();
+ } else {
+ return toUcs4_helper(d->data(), size(), reinterpret_cast<uint *>(array));
}
- return toUcs4_helper(d->data(), size(), reinterpret_cast<uint *>(array));
}
QT_WARNING_POP
@@ -1463,15 +1465,15 @@ public:
inline QT_ASCII_CAST_WARN bool operator>=(const char *s) const;
#endif
- int compare(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int compare(const QStringRef &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int compare(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
+ int compare(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW;
+ int compare(const QStringRef &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW;
+ int compare(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW;
static int compare(const QStringRef &s1, const QString &s2,
- Qt::CaseSensitivity = Qt::CaseSensitive);
+ Qt::CaseSensitivity = Qt::CaseSensitive) Q_DECL_NOTHROW;
static int compare(const QStringRef &s1, const QStringRef &s2,
- Qt::CaseSensitivity = Qt::CaseSensitive);
+ Qt::CaseSensitivity = Qt::CaseSensitive) Q_DECL_NOTHROW;
static int compare(const QStringRef &s1, QLatin1String s2,
- Qt::CaseSensitivity cs = Qt::CaseSensitive);
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW;
int localeAwareCompare(const QString &s) const;
int localeAwareCompare(const QStringRef &s) const;
@@ -1501,30 +1503,30 @@ inline QStringRef::QStringRef(const QString *aString, int aPosition, int aSize)
inline QStringRef::QStringRef(const QString *aString)
:m_string(aString), m_position(0), m_size(aString?aString->size() : 0){}
-Q_CORE_EXPORT bool operator==(const QStringRef &s1,const QStringRef &s2);
-inline bool operator!=(const QStringRef &s1,const QStringRef &s2)
+Q_CORE_EXPORT bool operator==(const QStringRef &s1, const QStringRef &s2) Q_DECL_NOTHROW;
+inline bool operator!=(const QStringRef &s1, const QStringRef &s2) Q_DECL_NOTHROW
{ return !(s1 == s2); }
-Q_CORE_EXPORT bool operator==(const QString &s1,const QStringRef &s2);
-inline bool operator!=(const QString &s1,const QStringRef &s2)
+Q_CORE_EXPORT bool operator==(const QString &s1, const QStringRef &s2) Q_DECL_NOTHROW;
+inline bool operator!=(const QString &s1, const QStringRef &s2) Q_DECL_NOTHROW
{ return !(s1 == s2); }
-inline bool operator==(const QStringRef &s1,const QString &s2)
+inline bool operator==(const QStringRef &s1, const QString &s2) Q_DECL_NOTHROW
{ return s2 == s1; }
-inline bool operator!=(const QStringRef &s1,const QString &s2)
+inline bool operator!=(const QStringRef &s1, const QString &s2) Q_DECL_NOTHROW
{ return s2 != s1; }
-Q_CORE_EXPORT bool operator==(QLatin1String s1, const QStringRef &s2);
-inline bool operator!=(QLatin1String s1, const QStringRef &s2)
+Q_CORE_EXPORT bool operator==(QLatin1String s1, const QStringRef &s2) Q_DECL_NOTHROW;
+inline bool operator!=(QLatin1String s1, const QStringRef &s2) Q_DECL_NOTHROW
{ return !(s1 == s2); }
-inline bool operator==(const QStringRef &s1, QLatin1String s2)
+inline bool operator==(const QStringRef &s1, QLatin1String s2) Q_DECL_NOTHROW
{ return s2 == s1; }
-inline bool operator!=(const QStringRef &s1, QLatin1String s2)
+inline bool operator!=(const QStringRef &s1, QLatin1String s2) Q_DECL_NOTHROW
{ return s2 != s1; }
-Q_CORE_EXPORT bool operator<(const QStringRef &s1,const QStringRef &s2);
-inline bool operator>(const QStringRef &s1, const QStringRef &s2)
+Q_CORE_EXPORT bool operator<(const QStringRef &s1, const QStringRef &s2) Q_DECL_NOTHROW;
+inline bool operator>(const QStringRef &s1, const QStringRef &s2) Q_DECL_NOTHROW
{ return s2 < s1; }
-inline bool operator<=(const QStringRef &s1, const QStringRef &s2)
+inline bool operator<=(const QStringRef &s1, const QStringRef &s2) Q_DECL_NOTHROW
{ return !(s1 > s2); }
-inline bool operator>=(const QStringRef &s1, const QStringRef &s2)
+inline bool operator>=(const QStringRef &s1, const QStringRef &s2) Q_DECL_NOTHROW
{ return !(s1 < s2); }
#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
@@ -1555,21 +1557,21 @@ inline QT_ASCII_CAST_WARN bool operator>=(const char *s1, const QStringRef &s2)
{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) >= 0; }
#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
-inline int QString::compare(const QStringRef &s, Qt::CaseSensitivity cs) const
+inline int QString::compare(const QStringRef &s, Qt::CaseSensitivity cs) const Q_DECL_NOTHROW
{ return QString::compare_helper(constData(), length(), s.constData(), s.length(), cs); }
-inline int QString::compare(const QString &s1, const QStringRef &s2, Qt::CaseSensitivity cs)
+inline int QString::compare(const QString &s1, const QStringRef &s2, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
{ return QString::compare_helper(s1.constData(), s1.length(), s2.constData(), s2.length(), cs); }
-inline int QStringRef::compare(const QString &s, Qt::CaseSensitivity cs) const
+inline int QStringRef::compare(const QString &s, Qt::CaseSensitivity cs) const Q_DECL_NOTHROW
{ return QString::compare_helper(constData(), length(), s.constData(), s.length(), cs); }
-inline int QStringRef::compare(const QStringRef &s, Qt::CaseSensitivity cs) const
+inline int QStringRef::compare(const QStringRef &s, Qt::CaseSensitivity cs) const Q_DECL_NOTHROW
{ return QString::compare_helper(constData(), length(), s.constData(), s.length(), cs); }
-inline int QStringRef::compare(QLatin1String s, Qt::CaseSensitivity cs) const
+inline int QStringRef::compare(QLatin1String s, Qt::CaseSensitivity cs) const Q_DECL_NOTHROW
{ return QString::compare_helper(constData(), length(), s, cs); }
-inline int QStringRef::compare(const QStringRef &s1, const QString &s2, Qt::CaseSensitivity cs)
+inline int QStringRef::compare(const QStringRef &s1, const QString &s2, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
{ return QString::compare_helper(s1.constData(), s1.length(), s2.constData(), s2.length(), cs); }
-inline int QStringRef::compare(const QStringRef &s1, const QStringRef &s2, Qt::CaseSensitivity cs)
+inline int QStringRef::compare(const QStringRef &s1, const QStringRef &s2, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
{ return QString::compare_helper(s1.constData(), s1.length(), s2.constData(), s2.length(), cs); }
-inline int QStringRef::compare(const QStringRef &s1, QLatin1String s2, Qt::CaseSensitivity cs)
+inline int QStringRef::compare(const QStringRef &s1, QLatin1String s2, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
{ return QString::compare_helper(s1.constData(), s1.length(), s2, cs); }
inline int QString::localeAwareCompare(const QStringRef &s) const
diff --git a/src/corelib/tools/qversionnumber.h b/src/corelib/tools/qversionnumber.h
index ebf1844f38..6a2718ca28 100644
--- a/src/corelib/tools/qversionnumber.h
+++ b/src/corelib/tools/qversionnumber.h
@@ -273,7 +273,7 @@ public:
Q_CORE_EXPORT static Q_DECL_PURE_FUNCTION QVersionNumber commonPrefix(const QVersionNumber &v1, const QVersionNumber &v2) Q_REQUIRED_RESULT;
Q_CORE_EXPORT QString toString() const Q_REQUIRED_RESULT;
- Q_CORE_EXPORT static Q_DECL_PURE_FUNCTION QVersionNumber fromString(const QString &string, int *suffixIndex = 0) Q_REQUIRED_RESULT;
+ Q_CORE_EXPORT static Q_DECL_PURE_FUNCTION QVersionNumber fromString(const QString &string, int *suffixIndex = Q_NULLPTR) Q_REQUIRED_RESULT;
private:
#ifndef QT_NO_DATASTREAM
diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri
index ed07f70e87..5cfeff5a4f 100644
--- a/src/corelib/tools/tools.pri
+++ b/src/corelib/tools/tools.pri
@@ -24,6 +24,7 @@ HEADERS += \
tools/qdatetime.h \
tools/qdatetime_p.h \
tools/qdatetimeparser_p.h \
+ tools/qdoublescanprint_p.h \
tools/qeasingcurve.h \
tools/qfreelist_p.h \
tools/qhash.h \
@@ -136,10 +137,6 @@ false: SOURCES += $$NO_PCH_SOURCES # Hack for QtCreator
tools/qbytearray_mac.mm \
tools/qdatetime_mac.mm
}
-else:blackberry {
- SOURCES += tools/qelapsedtimer_unix.cpp tools/qlocale_blackberry.cpp tools/qtimezoneprivate_tz.cpp
- HEADERS += tools/qlocale_blackberry.h
-}
else:android {
SOURCES += tools/qelapsedtimer_unix.cpp tools/qlocale_unix.cpp tools/qtimezoneprivate_android.cpp
}
@@ -198,6 +195,14 @@ INCLUDEPATH += ../3rdparty/md5 \
../3rdparty/md4 \
../3rdparty/sha3
+contains(QT_CONFIG, doubleconversion) {
+ include($$PWD/../../3rdparty/double-conversion/double-conversion.pri)
+} else:contains(QT_CONFIG, system-doubleconversion) {
+ LIBS_PRIVATE += -ldouble-conversion
+} else {
+ DEFINES += QT_NO_DOUBLECONVERSION
+}
+
# Note: libm should be present by default becaue this is C++
!macx-icc:!vxworks:!haiku:unix:LIBS_PRIVATE += -lm
diff --git a/src/corelib/xml/qxmlstream.h b/src/corelib/xml/qxmlstream.h
index 34f26cb953..5b5a2e552e 100644
--- a/src/corelib/xml/qxmlstream.h
+++ b/src/corelib/xml/qxmlstream.h
@@ -52,7 +52,10 @@ public:
inline QXmlStreamStringRef():m_position(0), m_size(0){}
inline QXmlStreamStringRef(const QStringRef &aString)
:m_string(aString.string()?*aString.string():QString()), m_position(aString.position()), m_size(aString.size()){}
- inline QXmlStreamStringRef(const QString &aString):m_string(aString), m_position(0), m_size(aString.size()){}
+ QXmlStreamStringRef(const QString &aString) : m_string(aString), m_position(0), m_size(m_string.size()) {}
+#ifdef Q_COMPILER_RVALUE_REFS
+ QXmlStreamStringRef(QString &&aString) Q_DECL_NOTHROW : m_string(std::move(aString)), m_position(0), m_size(m_string.size()) {}
+#endif
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
QXmlStreamStringRef(const QXmlStreamStringRef &other) // = default
diff --git a/src/dbus/qdbus_symbols.cpp b/src/dbus/qdbus_symbols.cpp
index 395a436869..3f5df41582 100644
--- a/src/dbus/qdbus_symbols.cpp
+++ b/src/dbus/qdbus_symbols.cpp
@@ -130,11 +130,11 @@ void (*qdbus_resolve_conditionally(const char *name))()
void (*qdbus_resolve_me(const char *name))()
{
#ifndef QT_NO_LIBRARY
- if (!qdbus_loadLibDBus())
+ if (Q_UNLIKELY(!qdbus_loadLibDBus()))
qFatal("Cannot find libdbus-1 in your system to resolve symbol '%s'.", name);
QFunctionPointer ptr = qdbus_libdbus->resolve(name);
- if (!ptr)
+ if (Q_UNLIKELY(!ptr))
qFatal("Cannot resolve '%s' in your libdbus-1.", name);
return ptr;
diff --git a/src/dbus/qdbusabstractinterface.cpp b/src/dbus/qdbusabstractinterface.cpp
index d63a317612..3f60721a52 100644
--- a/src/dbus/qdbusabstractinterface.cpp
+++ b/src/dbus/qdbusabstractinterface.cpp
@@ -364,7 +364,7 @@ bool QDBusAbstractInterface::isValid() const
}
/*!
- Returns the connection this interface is assocated with.
+ Returns the connection this interface is associated with.
*/
QDBusConnection QDBusAbstractInterface::connection() const
{
diff --git a/src/dbus/qdbusconnection.cpp b/src/dbus/qdbusconnection.cpp
index e9196173ad..d0f5c06ee5 100644
--- a/src/dbus/qdbusconnection.cpp
+++ b/src/dbus/qdbusconnection.cpp
@@ -1177,8 +1177,8 @@ void QDBusConnectionPrivate::createBusService()
ref.deref(); // busService has increased the refcounting to us
// avoid cyclic refcounting
- QObject::connect(this, SIGNAL(callWithCallbackFailed(QDBusError,QDBusMessage)),
- busService, SIGNAL(callWithCallbackFailed(QDBusError,QDBusMessage)),
+ QObject::connect(this, &QDBusConnectionPrivate::callWithCallbackFailed,
+ busService, emit &QDBusConnectionInterface::callWithCallbackFailed,
Qt::QueuedConnection);
}
diff --git a/src/dbus/qdbusconnectioninterface.cpp b/src/dbus/qdbusconnectioninterface.cpp
index ff923ba282..9dc0b3f9bd 100644
--- a/src/dbus/qdbusconnectioninterface.cpp
+++ b/src/dbus/qdbusconnectioninterface.cpp
@@ -158,10 +158,10 @@ QDBusConnectionInterface::QDBusConnectionInterface(const QDBusConnection &connec
QDBusUtil::dbusPath(),
DBUS_INTERFACE_DBUS, connection, parent)
{
- connect(this, SIGNAL(NameAcquired(QString)), this, SIGNAL(serviceRegistered(QString)));
- connect(this, SIGNAL(NameLost(QString)), this, SIGNAL(serviceUnregistered(QString)));
- connect(this, SIGNAL(NameOwnerChanged(QString,QString,QString)),
- this, SIGNAL(serviceOwnerChanged(QString,QString,QString)));
+ connect(this, &QDBusConnectionInterface::NameAcquired, this, emit &QDBusConnectionInterface::serviceRegistered);
+ connect(this, &QDBusConnectionInterface::NameLost, this, emit &QDBusConnectionInterface::serviceUnregistered);
+ connect(this, &QDBusConnectionInterface::NameOwnerChanged,
+ this, emit &QDBusConnectionInterface::serviceOwnerChanged);
}
/*!
diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
index c465706913..1aac16119b 100644
--- a/src/dbus/qdbusintegrator.cpp
+++ b/src/dbus/qdbusintegrator.cpp
@@ -208,14 +208,14 @@ static dbus_bool_t qDBusAddWatch(DBusWatch *watch, void *data)
watcher.watch = watch;
watcher.read = new QSocketNotifier(fd, QSocketNotifier::Read, d);
watcher.read->setEnabled(q_dbus_watch_get_enabled(watch));
- d->connect(watcher.read, SIGNAL(activated(int)), SLOT(socketRead(int)));
+ d->connect(watcher.read, &QSocketNotifier::activated, d, &QDBusConnectionPrivate::socketRead);
}
if (flags & DBUS_WATCH_WRITABLE) {
//qDebug("addWriteWatch %d", fd);
watcher.watch = watch;
watcher.write = new QSocketNotifier(fd, QSocketNotifier::Write, d);
watcher.write->setEnabled(q_dbus_watch_get_enabled(watch));
- d->connect(watcher.write, SIGNAL(activated(int)), SLOT(socketWrite(int)));
+ d->connect(watcher.write, &QSocketNotifier::activated, d, &QDBusConnectionPrivate::socketWrite);
}
d->watchers.insertMulti(fd, watcher);
@@ -868,7 +868,7 @@ void QDBusConnectionPrivate::deliverCall(QObject *object, int /*flags*/, const Q
*reinterpret_cast<const QDBusArgument *>(arg.constData());
QVariant &out = auxParameters[auxParameters.count() - 1];
- if (!QDBusMetaType::demarshall(in, out.userType(), out.data()))
+ if (Q_UNLIKELY(!QDBusMetaType::demarshall(in, out.userType(), out.data())))
qFatal("Internal error: demarshalling function for type '%s' (%d) failed!",
out.typeName(), out.userType());
@@ -1892,8 +1892,8 @@ QDBusMessage QDBusConnectionPrivate::sendWithReply(const QDBusMessage &message,
if (sendMode == QDBus::BlockWithGui) {
pcall->watcherHelper = new QDBusPendingCallWatcherHelper;
QEventLoop loop;
- loop.connect(pcall->watcherHelper, SIGNAL(reply(QDBusMessage)), SLOT(quit()));
- loop.connect(pcall->watcherHelper, SIGNAL(error(QDBusError,QDBusMessage)), SLOT(quit()));
+ loop.connect(pcall->watcherHelper, &QDBusPendingCallWatcherHelper::reply, &loop, &QEventLoop::quit);
+ loop.connect(pcall->watcherHelper, &QDBusPendingCallWatcherHelper::error, &loop, &QEventLoop::quit);
// enter the event loop and wait for a reply
loop.exec(QEventLoop::ExcludeUserInputEvents | QEventLoop::WaitForMoreEvents);
@@ -2078,7 +2078,7 @@ void QDBusConnectionPrivate::addSignalHook(const QString &key, const SignalHook
}
signalHooks.insertMulti(key, hook);
- connect(hook.obj, SIGNAL(destroyed(QObject*)), SLOT(objectDestroyed(QObject*)),
+ connect(hook.obj, &QObject::destroyed, this, &QDBusConnectionPrivate::objectDestroyed,
Qt::ConnectionType(Qt::BlockingQueuedConnection | Qt::UniqueConnection));
MatchRefCountHash::iterator mit = matchRefCounts.find(hook.matchRule);
@@ -2204,7 +2204,7 @@ QDBusConnectionPrivate::removeSignalHookNoLock(SignalHookHash::Iterator it)
void QDBusConnectionPrivate::registerObject(const ObjectTreeNode *node)
{
- connect(node->obj, SIGNAL(destroyed(QObject*)), SLOT(objectDestroyed(QObject*)),
+ connect(node->obj, &QObject::destroyed, this, &QDBusConnectionPrivate::objectDestroyed,
Qt::ConnectionType(Qt::BlockingQueuedConnection | Qt::UniqueConnection));
if (node->flags & (QDBusConnection::ExportAdaptors
diff --git a/src/dbus/qdbuspendingcall.cpp b/src/dbus/qdbuspendingcall.cpp
index c93d6acf84..c20b56f973 100644
--- a/src/dbus/qdbuspendingcall.cpp
+++ b/src/dbus/qdbuspendingcall.cpp
@@ -190,7 +190,7 @@ void QDBusPendingCallPrivate::setMetaTypes(int count, const int *types)
sig.reserve(count + count / 2);
for (int i = 0; i < count; ++i) {
const char *typeSig = QDBusMetaType::typeToSignature(types[i]);
- if (!typeSig) {
+ if (Q_UNLIKELY(!typeSig)) {
qFatal("QDBusPendingReply: type %s is not registered with QtDBus",
QMetaType::typeName(types[i]));
}
diff --git a/src/gui/accessible/accessible.pri b/src/gui/accessible/accessible.pri
index 86ed4c3a71..b7f341d5b7 100644
--- a/src/gui/accessible/accessible.pri
+++ b/src/gui/accessible/accessible.pri
@@ -17,5 +17,9 @@ contains(QT_CONFIG, accessibility) {
HEADERS += accessible/qaccessiblebridge.h
SOURCES += accessible/qaccessiblebridge.cpp
- OBJECTIVE_SOURCES += accessible/qaccessiblecache_mac.mm
+ mac {
+ OBJECTIVE_SOURCES += accessible/qaccessiblecache_mac.mm
+
+ LIBS_PRIVATE += -framework Foundation
+ }
}
diff --git a/src/gui/gui.pro b/src/gui/gui.pro
index aa05d72a3d..55837bcf3b 100644
--- a/src/gui/gui.pro
+++ b/src/gui/gui.pro
@@ -33,7 +33,7 @@ testcocoon {
load(testcocoon)
}
-mac:!ios: LIBS_PRIVATE += -framework Cocoa
+osx: LIBS_PRIVATE += -framework AppKit
CONFIG += simd optimize_full
diff --git a/src/gui/image/qicon.cpp b/src/gui/image/qicon.cpp
index d9e1347e4b..ca77b73033 100644
--- a/src/gui/image/qicon.cpp
+++ b/src/gui/image/qicon.cpp
@@ -920,7 +920,7 @@ void QIcon::paint(QPainter *painter, const QRect &rect, Qt::Alignment alignment,
*/
bool QIcon::isNull() const
{
- return !d;
+ return !d || d->engine->isNull();
}
/*!\internal
@@ -935,7 +935,12 @@ bool QIcon::isDetached() const
void QIcon::detach()
{
if (d) {
- if (d->ref.load() != 1) {
+ if (d->engine->isNull()) {
+ if (!d->ref.deref())
+ delete d;
+ d = 0;
+ return;
+ } else if (d->ref.load() != 1) {
QIconPrivate *x = new QIconPrivate;
x->engine = d->engine->clone();
if (!d->ref.deref())
@@ -959,11 +964,10 @@ void QIcon::addPixmap(const QPixmap &pixmap, Mode mode, State state)
{
if (pixmap.isNull())
return;
+ detach();
if (!d) {
d = new QIconPrivate;
d->engine = new QPixmapIconEngine;
- } else {
- detach();
}
d->engine->addPixmap(pixmap, mode, state);
}
@@ -1003,6 +1007,7 @@ void QIcon::addFile(const QString &fileName, const QSize &size, Mode mode, State
{
if (fileName.isEmpty())
return;
+ detach();
if (!d) {
#ifndef QT_NO_LIBRARY
QFileInfo info(fileName);
@@ -1025,8 +1030,6 @@ void QIcon::addFile(const QString &fileName, const QSize &size, Mode mode, State
d = new QIconPrivate;
d->engine = new QPixmapIconEngine;
}
- } else {
- detach();
}
d->engine->addFile(fileName, size, mode, state);
@@ -1136,8 +1139,7 @@ QString QIcon::themeName()
\since 4.6
Returns the QIcon corresponding to \a name in the current
- icon theme. If no such icon is found in the current theme
- \a fallback is returned instead.
+ icon theme.
The latest version of the freedesktop icon specification and naming
specification can be obtained here:
@@ -1151,19 +1153,18 @@ QString QIcon::themeName()
\snippet code/src_gui_image_qicon.cpp 3
- Or if you want to provide a guaranteed fallback for platforms that
- do not support theme icons, you can use the second argument:
-
- \snippet code/src_gui_image_qicon.cpp 4
-
\note By default, only X11 will support themed icons. In order to
use themed icons on Mac and Windows, you will have to bundle a
compliant theme in one of your themeSearchPaths() and set the
appropriate themeName().
+ \note Qt will make use of GTK's icon-theme.cache if present to speed up
+ the lookup. These caches can be generated using gtk-update-icon-cache:
+ \l{https://developer.gnome.org/gtk3/stable/gtk-update-icon-cache.html}.
+
\sa themeName(), setThemeName(), themeSearchPaths()
*/
-QIcon QIcon::fromTheme(const QString &name, const QIcon &fallback)
+QIcon QIcon::fromTheme(const QString &name)
{
QIcon icon;
@@ -1179,7 +1180,26 @@ QIcon QIcon::fromTheme(const QString &name, const QIcon &fallback)
qtIconCache()->insert(name, cachedIcon);
}
- if (qApp && icon.availableSizes().isEmpty())
+ return icon;
+}
+
+/*!
+ \overload
+
+ Returns the QIcon corresponding to \a name in the current
+ icon theme. If no such icon is found in the current theme
+ \a fallback is returned instead.
+
+ If you want to provide a guaranteed fallback for platforms that
+ do not support theme icons, you can use the second argument:
+
+ \snippet code/src_gui_image_qicon.cpp 4
+*/
+QIcon QIcon::fromTheme(const QString &name, const QIcon &fallback)
+{
+ QIcon icon = fromTheme(name);
+
+ if (icon.isNull() || icon.availableSizes().isEmpty())
return fallback;
return icon;
diff --git a/src/gui/image/qicon.h b/src/gui/image/qicon.h
index 9ed7336502..989e40bbb5 100644
--- a/src/gui/image/qicon.h
+++ b/src/gui/image/qicon.h
@@ -105,7 +105,8 @@ public:
void setIsMask(bool isMask);
bool isMask() const;
- static QIcon fromTheme(const QString &name, const QIcon &fallback = QIcon());
+ static QIcon fromTheme(const QString &name);
+ static QIcon fromTheme(const QString &name, const QIcon &fallback);
static bool hasThemeIcon(const QString &name);
static QStringList themeSearchPaths();
diff --git a/src/gui/image/qiconengine.cpp b/src/gui/image/qiconengine.cpp
index c09933d45f..7411dbb054 100644
--- a/src/gui/image/qiconengine.cpp
+++ b/src/gui/image/qiconengine.cpp
@@ -150,6 +150,11 @@ void QIconEngine::addFile(const QString &/*fileName*/, const QSize &/*size*/, QI
icon, for example when instantiating an icon using
QIcon::fromTheme().
+ \value IsNullHook Allow to query if this engine represents a null
+ icon. The \a data argument of the virtual_hook() is a pointer to a
+ bool that can be set to true if the icon is null. This enum value
+ was added in Qt 5.7.
+
\sa virtual_hook()
*/
@@ -283,4 +288,16 @@ QString QIconEngine::iconName() const
return name;
}
+/*!
+ \since 5.7
+
+ Returns true if this icon engine represent a null QIcon.
+ */
+bool QIconEngine::isNull() const
+{
+ bool isNull = false;
+ const_cast<QIconEngine *>(this)->virtual_hook(QIconEngine::IsNullHook, &isNull);
+ return isNull;
+}
+
QT_END_NAMESPACE
diff --git a/src/gui/image/qiconengine.h b/src/gui/image/qiconengine.h
index 9977113054..6c45cd216f 100644
--- a/src/gui/image/qiconengine.h
+++ b/src/gui/image/qiconengine.h
@@ -58,7 +58,7 @@ public:
virtual bool read(QDataStream &in);
virtual bool write(QDataStream &out) const;
- enum IconEngineHook { AvailableSizesHook = 1, IconNameHook };
+ enum IconEngineHook { AvailableSizesHook = 1, IconNameHook, IsNullHook };
struct AvailableSizesArgument
{
@@ -71,6 +71,7 @@ public:
QIcon::State state = QIcon::Off) const;
virtual QString iconName() const;
+ bool isNull() const; // ### Qt6 make virtual
virtual void virtual_hook(int id, void *data);
};
diff --git a/src/gui/image/qiconloader.cpp b/src/gui/image/qiconloader.cpp
index 3ead72dfbb..ecce7f9967 100644
--- a/src/gui/image/qiconloader.cpp
+++ b/src/gui/image/qiconloader.cpp
@@ -155,6 +155,141 @@ QStringList QIconLoader::themeSearchPaths() const
return m_iconDirs;
}
+/*!
+ \class QIconCacheGtkReader
+ \internal
+ Helper class that reads and looks up into the icon-theme.cache generated with
+ gtk-update-icon-cache. If at any point we detect a corruption in the file
+ (because the offsets point at wrong locations for example), the reader
+ is marked as invalid.
+*/
+class QIconCacheGtkReader
+{
+public:
+ explicit QIconCacheGtkReader(const QString &themeDir);
+ QVector<const char *> lookup(const QString &);
+ bool isValid() const { return m_isValid; }
+private:
+ QFile m_file;
+ const unsigned char *m_data;
+ quint64 m_size;
+ bool m_isValid;
+
+ quint16 read16(uint offset)
+ {
+ if (offset > m_size - 2 || (offset & 0x1)) {
+ m_isValid = false;
+ return 0;
+ }
+ return m_data[offset+1] | m_data[offset] << 8;
+ }
+ quint32 read32(uint offset)
+ {
+ if (offset > m_size - 4 || (offset & 0x3)) {
+ m_isValid = false;
+ return 0;
+ }
+ return m_data[offset+3] | m_data[offset+2] << 8
+ | m_data[offset+1] << 16 | m_data[offset] << 24;
+ }
+};
+
+
+QIconCacheGtkReader::QIconCacheGtkReader(const QString &dirName)
+ : m_isValid(false)
+{
+ QFileInfo info(dirName + QLatin1Literal("/icon-theme.cache"));
+ if (!info.exists() || info.lastModified() < QFileInfo(dirName).lastModified())
+ return;
+ m_file.setFileName(info.absoluteFilePath());
+ if (!m_file.open(QFile::ReadOnly))
+ return;
+ m_size = m_file.size();
+ m_data = m_file.map(0, m_size);
+ if (!m_data)
+ return;
+ if (read16(0) != 1) // VERSION_MAJOR
+ return;
+
+ m_isValid = true;
+
+ // Check that all the directories are older than the cache
+ auto lastModified = info.lastModified();
+ quint32 dirListOffset = read32(8);
+ quint32 dirListLen = read32(dirListOffset);
+ for (uint i = 0; i < dirListLen; ++i) {
+ quint32 offset = read32(dirListOffset + 4 + 4 * i);
+ if (!m_isValid || offset >= m_size || lastModified < QFileInfo(dirName + QLatin1Char('/')
+ + QString::fromUtf8(reinterpret_cast<const char*>(m_data + offset))).lastModified()) {
+ m_isValid = false;
+ return;
+ }
+ }
+}
+
+static quint32 icon_name_hash(const char *p)
+{
+ quint32 h = static_cast<signed char>(*p);
+ for (p += 1; *p != '\0'; p++)
+ h = (h << 5) - h + *p;
+ return h;
+}
+
+/*! \internal
+ lookup the icon name and return the list of subdirectories in which an icon
+ with this name is present. The char* are pointers to the mapped data.
+ For example, this would return { "32x32/apps", "24x24/apps" , ... }
+ */
+QVector<const char *> QIconCacheGtkReader::lookup(const QString &name)
+{
+ QVector<const char *> ret;
+ if (!isValid())
+ return ret;
+
+ QByteArray nameUtf8 = name.toUtf8();
+ quint32 hash = icon_name_hash(nameUtf8);
+
+ quint32 hashOffset = read32(4);
+ quint32 hashBucketCount = read32(hashOffset);
+
+ if (!isValid() || hashBucketCount == 0) {
+ m_isValid = false;
+ return ret;
+ }
+
+ quint32 bucketIndex = hash % hashBucketCount;
+ quint32 bucketOffset = read32(hashOffset + 4 + bucketIndex * 4);
+ while (bucketOffset > 0 && bucketOffset <= m_size - 12) {
+ quint32 nameOff = read32(bucketOffset + 4);
+ if (nameOff < m_size && strcmp(reinterpret_cast<const char*>(m_data + nameOff), nameUtf8) == 0) {
+ quint32 dirListOffset = read32(8);
+ quint32 dirListLen = read32(dirListOffset);
+
+ quint32 listOffset = read32(bucketOffset+8);
+ quint32 listLen = read32(listOffset);
+
+ if (!m_isValid || listOffset + 4 + 8 * listLen > m_size) {
+ m_isValid = false;
+ return ret;
+ }
+
+ ret.reserve(listLen);
+ for (uint j = 0; j < listLen && m_isValid; ++j) {
+ quint32 dirIndex = read16(listOffset + 4 + 8 * j);
+ quint32 o = read32(dirListOffset + 4 + dirIndex*4);
+ if (!m_isValid || dirIndex >= dirListLen || o >= m_size) {
+ m_isValid = false;
+ return ret;
+ }
+ ret.append(reinterpret_cast<const char*>(m_data) + o);
+ }
+ return ret;
+ }
+ bucketOffset = read32(bucketOffset);
+ }
+ return ret;
+}
+
QIconTheme::QIconTheme(const QString &themeName)
: m_valid(false)
{
@@ -166,8 +301,10 @@ QIconTheme::QIconTheme(const QString &themeName)
QString themeDir = iconDir.path() + QLatin1Char('/') + themeName;
QFileInfo themeDirInfo(themeDir);
- if (themeDirInfo.isDir())
+ if (themeDirInfo.isDir()) {
m_contentDirs << themeDir;
+ m_gtkCaches << QSharedPointer<QIconCacheGtkReader>::create(themeDir);
+ }
if (!m_valid) {
themeIndex.setFileName(themeDir + QLatin1String("/index.theme"));
@@ -257,7 +394,6 @@ QThemeIconInfo QIconLoader::findIconHelper(const QString &themeName,
}
const QStringList contentDirs = theme.contentDirs();
- const QVector<QIconDirInfo> subDirs = theme.keyList();
QString iconNameFallback = iconName;
@@ -268,6 +404,29 @@ QThemeIconInfo QIconLoader::findIconHelper(const QString &themeName,
// Add all relevant files
for (int i = 0; i < contentDirs.size(); ++i) {
+ QVector<QIconDirInfo> subDirs = theme.keyList();
+
+ // Try to reduce the amount of subDirs by looking in the GTK+ cache in order to save
+ // a massive amount of file stat (especially if the icon is not there)
+ auto cache = theme.m_gtkCaches.at(i);
+ if (cache->isValid()) {
+ auto result = cache->lookup(iconNameFallback);
+ if (cache->isValid()) {
+ const QVector<QIconDirInfo> subDirsCopy = subDirs;
+ subDirs.clear();
+ subDirs.reserve(result.count());
+ foreach (const char *s, result) {
+ QString path = QString::fromUtf8(s);
+ auto it = std::find_if(subDirsCopy.cbegin(), subDirsCopy.cend(),
+ [&](const QIconDirInfo &info) {
+ return info.path == path; } );
+ if (it != subDirsCopy.cend()) {
+ subDirs.append(*it);
+ }
+ }
+ }
+ }
+
QString contentDir = contentDirs.at(i) + QLatin1Char('/');
for (int j = 0; j < subDirs.size() ; ++j) {
const QIconDirInfo &dirInfo = subDirs.at(j);
@@ -587,6 +746,11 @@ void QIconLoaderEngine::virtual_hook(int id, void *data)
name = m_info.iconName;
}
break;
+ case QIconEngine::IsNullHook:
+ {
+ *reinterpret_cast<bool*>(data) = m_info.entries.isEmpty();
+ }
+ break;
default:
QIconEngine::virtual_hook(id, data);
}
diff --git a/src/gui/image/qiconloader_p.h b/src/gui/image/qiconloader_p.h
index ccf0a9d438..193154e44e 100644
--- a/src/gui/image/qiconloader_p.h
+++ b/src/gui/image/qiconloader_p.h
@@ -139,6 +139,8 @@ private:
friend class QIconLoader;
};
+class QIconCacheGtkReader;
+
class QIconTheme
{
public:
@@ -148,12 +150,13 @@ public:
QVector<QIconDirInfo> keyList() { return m_keyList; }
QStringList contentDirs() { return m_contentDirs; }
bool isValid() { return m_valid; }
-
private:
QStringList m_contentDirs;
QVector<QIconDirInfo> m_keyList;
QStringList m_parents;
bool m_valid;
+public:
+ QVector<QSharedPointer<QIconCacheGtkReader>> m_gtkCaches;
};
class Q_GUI_EXPORT QIconLoader
diff --git a/src/gui/image/qimage.h b/src/gui/image/qimage.h
index 888c7beb32..9d8e3efcc4 100644
--- a/src/gui/image/qimage.h
+++ b/src/gui/image/qimage.h
@@ -168,9 +168,9 @@ public:
Format format() const;
#if defined(Q_COMPILER_REF_QUALIFIERS) && !defined(QT_COMPILING_QIMAGE_COMPAT_CPP)
- QImage convertToFormat(Format f, Qt::ImageConversionFlags flags = Qt::AutoColor) const & Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QImage convertToFormat(Format f, Qt::ImageConversionFlags flags = Qt::AutoColor) const & Q_REQUIRED_RESULT
{ return convertToFormat_helper(f, flags); }
- QImage convertToFormat(Format f, Qt::ImageConversionFlags flags = Qt::AutoColor) && Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QImage convertToFormat(Format f, Qt::ImageConversionFlags flags = Qt::AutoColor) && Q_REQUIRED_RESULT
{
if (convertToFormat_inplace(f, flags))
return std::move(*this);
diff --git a/src/gui/image/qmovie.cpp b/src/gui/image/qmovie.cpp
index 09cd788c61..ba27fb355b 100644
--- a/src/gui/image/qmovie.cpp
+++ b/src/gui/image/qmovie.cpp
@@ -965,14 +965,16 @@ void QMovie::setScaledSize(const QSize &size)
QList<QByteArray> QMovie::supportedFormats()
{
QList<QByteArray> list = QImageReader::supportedImageFormats();
- QMutableListIterator<QByteArray> it(list);
+
QBuffer buffer;
buffer.open(QIODevice::ReadOnly);
- while (it.hasNext()) {
- QImageReader reader(&buffer, it.next());
- if (!reader.supportsAnimation())
- it.remove();
- }
+
+ const auto doesntSupportAnimation =
+ [&buffer](const QByteArray &format) {
+ return !QImageReader(&buffer, format).supportsAnimation();
+ };
+
+ list.erase(std::remove_if(list.begin(), list.end(), doesntSupportAnimation), list.end());
return list;
}
diff --git a/src/gui/image/qpixmap.cpp b/src/gui/image/qpixmap.cpp
index fb62889e40..9c42cd44a6 100644
--- a/src/gui/image/qpixmap.cpp
+++ b/src/gui/image/qpixmap.cpp
@@ -64,7 +64,7 @@ QT_BEGIN_NAMESPACE
static bool qt_pixmap_thread_test()
{
- if (!QCoreApplication::instance()) {
+ if (Q_UNLIKELY(!QCoreApplication::instance())) {
qFatal("QPixmap: Must construct a QGuiApplication before a QPixmap");
return false;
}
diff --git a/src/gui/image/qpixmapcache.cpp b/src/gui/image/qpixmapcache.cpp
index d29ddcf978..6265a0c16d 100644
--- a/src/gui/image/qpixmapcache.cpp
+++ b/src/gui/image/qpixmapcache.cpp
@@ -156,6 +156,16 @@ bool QPixmapCache::Key::operator ==(const Key &key) const
*/
/*!
+ Returns \c true if there is a cached pixmap associated with this key.
+ Otherwise, if pixmap was flushed, the key is no longer valid.
+ \since 5.7
+*/
+bool QPixmapCache::Key::isValid() const Q_DECL_NOTHROW
+{
+ return d && d->isValid;
+}
+
+/*!
\internal
*/
QPixmapCache::Key &QPixmapCache::Key::operator =(const Key &other)
diff --git a/src/gui/image/qpixmapcache.h b/src/gui/image/qpixmapcache.h
index 37a0588e06..ca18f299a7 100644
--- a/src/gui/image/qpixmapcache.h
+++ b/src/gui/image/qpixmapcache.h
@@ -59,6 +59,7 @@ public:
Key &operator =(const Key &other);
void swap(Key &other) Q_DECL_NOTHROW { qSwap(d, other.d); }
+ bool isValid() const Q_DECL_NOTHROW;
private:
KeyData *d;
diff --git a/src/gui/kernel/qdrag.cpp b/src/gui/kernel/qdrag.cpp
index 2736fac8e0..36527966b7 100644
--- a/src/gui/kernel/qdrag.cpp
+++ b/src/gui/kernel/qdrag.cpp
@@ -33,6 +33,8 @@
#include <qdrag.h>
#include "private/qguiapplication_p.h"
+#include "qpa/qplatformintegration.h"
+#include "qpa/qplatformdrag.h"
#include <qpixmap.h>
#include <qpoint.h>
#include "qdnd_p.h"
@@ -223,6 +225,8 @@ QObject *QDrag::target() const
loop. Other events are still delivered to the application while
the operation is performed. On Windows, the Qt event loop is
blocked during the operation.
+
+ \sa cancel()
*/
Qt::DropAction QDrag::exec(Qt::DropActions supportedActions)
@@ -377,6 +381,21 @@ Qt::DropAction QDrag::defaultAction() const
Q_D(const QDrag);
return d->default_action;
}
+
+/*!
+ Cancels a drag operation initiated by Qt.
+
+ \note This is currently implemented on Windows and X11.
+
+ \since 5.6
+ \sa exec()
+*/
+void QDrag::cancel()
+{
+ if (QPlatformDrag *platformDrag = QGuiApplicationPrivate::platformIntegration()->drag())
+ platformDrag->cancelDrag();
+}
+
/*!
\fn void QDrag::actionChanged(Qt::DropAction action)
diff --git a/src/gui/kernel/qdrag.h b/src/gui/kernel/qdrag.h
index 0672cb00f9..961d7c89d9 100644
--- a/src/gui/kernel/qdrag.h
+++ b/src/gui/kernel/qdrag.h
@@ -77,6 +77,8 @@ public:
Qt::DropActions supportedActions() const;
Qt::DropAction defaultAction() const;
+ static void cancel();
+
Q_SIGNALS:
void actionChanged(Qt::DropAction action);
void targetChanged(QObject *newTarget);
diff --git a/src/gui/kernel/qevent.cpp b/src/gui/kernel/qevent.cpp
index 2ca17692db..bd1b4d6393 100644
--- a/src/gui/kernel/qevent.cpp
+++ b/src/gui/kernel/qevent.cpp
@@ -37,6 +37,7 @@
#include "qpa/qplatformintegration.h"
#include "qpa/qplatformdrag.h"
#include "private/qevent_p.h"
+#include "qfile.h"
#include "qmetaobject.h"
#include "qmimedata.h"
#include "private/qdnd_p.h"
@@ -3963,9 +3964,11 @@ QDebug operator<<(QDebug dbg, const QEvent *e)
QtDebugUtils::formatQEnum(dbg, static_cast<const QApplicationStateChangeEvent *>(e)->applicationState());
dbg << ')';
break;
+# ifndef QT_NO_CONTEXTMENU
case QEvent::ContextMenu:
dbg << "QContextMenuEvent(" << static_cast<const QContextMenuEvent *>(e)->pos() << ')';
break;
+# endif // !QT_NO_CONTEXTMENU
# ifndef QT_NO_TABLETEVENT
case QEvent::TabletEnterProximity:
case QEvent::TabletLeaveProximity:
diff --git a/src/gui/kernel/qevent.h b/src/gui/kernel/qevent.h
index b90fce97e0..66e650c42d 100644
--- a/src/gui/kernel/qevent.h
+++ b/src/gui/kernel/qevent.h
@@ -35,20 +35,19 @@
#define QEVENT_H
#include <QtGui/qwindowdefs.h>
-#include <QtCore/qobject.h>
#include <QtGui/qregion.h>
#include <QtCore/qnamespace.h>
#include <QtCore/qstring.h>
#include <QtGui/qkeysequence.h>
#include <QtCore/qcoreevent.h>
#include <QtCore/qvariant.h>
-#include <QtCore/qmap.h>
+#include <QtCore/qmap.h> // ### Qt 6: Remove
#include <QtCore/qvector.h>
-#include <QtCore/qset.h>
+#include <QtCore/qset.h> // ### Qt 6: Remove
#include <QtCore/qurl.h>
-#include <QtCore/qfile.h>
+#include <QtCore/qfile.h> // ### Qt 6: Replace by <qiodevice.h> and forward declare QFile
#include <QtGui/qvector2d.h>
-#include <QtGui/qtouchdevice.h>
+#include <QtGui/qtouchdevice.h> // ### Qt 6: Replace by forward declaration
QT_BEGIN_NAMESPACE
diff --git a/src/gui/kernel/qgenericplugin.cpp b/src/gui/kernel/qgenericplugin.cpp
index 47f3ea5811..ae423b93e3 100644
--- a/src/gui/kernel/qgenericplugin.cpp
+++ b/src/gui/kernel/qgenericplugin.cpp
@@ -33,8 +33,6 @@
#include "qgenericplugin.h"
-#ifndef QT_NO_LIBRARY
-
QT_BEGIN_NAMESPACE
/*!
@@ -90,5 +88,3 @@ QGenericPlugin::~QGenericPlugin()
*/
QT_END_NAMESPACE
-
-#endif // QT_NO_LIBRARY
diff --git a/src/gui/kernel/qgenericplugin.h b/src/gui/kernel/qgenericplugin.h
index 03c1df7fba..21ae97f045 100644
--- a/src/gui/kernel/qgenericplugin.h
+++ b/src/gui/kernel/qgenericplugin.h
@@ -39,9 +39,6 @@
QT_BEGIN_NAMESPACE
-
-#ifndef QT_NO_LIBRARY
-
#define QGenericPluginFactoryInterface_iid "org.qt-project.Qt.QGenericPluginFactoryInterface"
class Q_GUI_EXPORT QGenericPlugin : public QObject
@@ -54,8 +51,6 @@ public:
virtual QObject* create(const QString& name, const QString &spec) = 0;
};
-#endif // QT_NO_LIBRARY
-
QT_END_NAMESPACE
#endif // QGENERICPLUGIN_H
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp
index 00245b25b0..6fa974829f 100644
--- a/src/gui/kernel/qguiapplication.cpp
+++ b/src/gui/kernel/qguiapplication.cpp
@@ -37,6 +37,7 @@
#include <qpa/qplatformintegrationfactory_p.h>
#include "private/qevent_p.h"
#include "qfont.h"
+#include "qtouchdevice.h"
#include <qpa/qplatformfontdatabase.h>
#include <qpa/qplatformwindow.h>
#include <qpa/qplatformnativeinterface.h>
@@ -123,8 +124,6 @@ Qt::KeyboardModifiers QGuiApplicationPrivate::modifier_buttons = Qt::NoModifier;
QPointF QGuiApplicationPrivate::lastCursorPosition(qInf(), qInf());
-Qt::MouseButtons QGuiApplicationPrivate::tabletState = Qt::NoButton;
-QWindow *QGuiApplicationPrivate::tabletPressTarget = 0;
QWindow *QGuiApplicationPrivate::currentMouseWindow = 0;
QString QGuiApplicationPrivate::styleOverride;
@@ -133,6 +132,8 @@ Qt::ApplicationState QGuiApplicationPrivate::applicationState = Qt::ApplicationI
bool QGuiApplicationPrivate::highDpiScalingUpdated = false;
+QVector<QGuiApplicationPrivate::TabletPointData> QGuiApplicationPrivate::tabletDevicePoints;
+
QPlatformIntegration *QGuiApplicationPrivate::platform_integration = 0;
QPlatformTheme *QGuiApplicationPrivate::platform_theme = 0;
@@ -150,6 +151,7 @@ QIcon *QGuiApplicationPrivate::app_icon = 0;
QString *QGuiApplicationPrivate::platform_name = 0;
QString *QGuiApplicationPrivate::displayName = 0;
+QString *QGuiApplicationPrivate::desktopFileName = 0;
QPalette *QGuiApplicationPrivate::app_pal = 0; // default application palette
@@ -607,6 +609,8 @@ QGuiApplication::~QGuiApplication()
QGuiApplicationPrivate::platform_name = 0;
delete QGuiApplicationPrivate::displayName;
QGuiApplicationPrivate::displayName = 0;
+ delete QGuiApplicationPrivate::desktopFileName;
+ QGuiApplicationPrivate::desktopFileName = 0;
}
QGuiApplicationPrivate::QGuiApplicationPrivate(int &argc, char **argv, int flags)
@@ -648,6 +652,34 @@ QString QGuiApplication::applicationDisplayName()
}
/*!
+ \property QGuiApplication::desktopFileName
+ \brief the base name of the desktop entry for this application
+ \since 5.7
+
+ This is the file name, without the full path, of the desktop entry
+ that represents this application according to the freedesktop desktop
+ entry specification.
+
+ This property gives a precise indication of what desktop entry represents
+ the application and it is needed by the windowing system to retrieve
+ such information without resorting to imprecise heuristics.
+
+ The latest version of the freedesktop desktop entry specification can be obtained
+ \l{http://standards.freedesktop.org/desktop-entry-spec/latest/}{here}.
+*/
+void QGuiApplication::setDesktopFileName(const QString &name)
+{
+ if (!QGuiApplicationPrivate::desktopFileName)
+ QGuiApplicationPrivate::desktopFileName = new QString;
+ *QGuiApplicationPrivate::desktopFileName = name;
+}
+
+QString QGuiApplication::desktopFileName()
+{
+ return QGuiApplicationPrivate::desktopFileName ? *QGuiApplicationPrivate::desktopFileName : QString();
+}
+
+/*!
Returns the most recently shown modal window. If no modal windows are
visible, this function returns zero.
@@ -1030,9 +1062,7 @@ static void init_platform(const QString &pluginArgument, const QString &platform
// Create the platform integration.
QGuiApplicationPrivate::platform_integration = QPlatformIntegrationFactory::create(name, arguments, argc, argv, platformPluginPath);
- if (QGuiApplicationPrivate::platform_integration) {
- QGuiApplicationPrivate::platform_name = new QString(name);
- } else {
+ if (Q_UNLIKELY(!QGuiApplicationPrivate::platform_integration)) {
QStringList keys = QPlatformIntegrationFactory::keys(platformPluginPath);
QString fatalMessage
@@ -1052,6 +1082,8 @@ static void init_platform(const QString &pluginArgument, const QString &platform
return;
}
+ QGuiApplicationPrivate::platform_name = new QString(name);
+
// Many platforms have created QScreens at this point. Finish initializing
// QHighDpiScaling to be prepared for early calls to qt_defaultDpi().
if (QGuiApplication::primaryScreen()) {
@@ -1371,16 +1403,16 @@ void QGuiApplicationPrivate::init()
if (loadTestability) {
QLibrary testLib(QStringLiteral("qttestability"));
- if (testLib.load()) {
+ if (Q_UNLIKELY(!testLib.load())) {
+ qCritical() << "Library qttestability load failed:" << testLib.errorString();
+ } else {
typedef void (*TasInitialize)(void);
TasInitialize initFunction = (TasInitialize)testLib.resolve("qt_testability_init");
- if (initFunction) {
- initFunction();
- } else {
+ if (Q_UNLIKELY(!initFunction)) {
qCritical() << "Library qttestability resolve failed!";
+ } else {
+ initFunction();
}
- } else {
- qCritical() << "Library qttestability load failed:" << testLib.errorString();
}
}
#else
@@ -2158,12 +2190,26 @@ void QGuiApplicationPrivate::processFileOpenEvent(QWindowSystemInterfacePrivate:
QGuiApplication::sendSpontaneousEvent(qApp, &event);
}
+QGuiApplicationPrivate::TabletPointData &QGuiApplicationPrivate::tabletDevicePoint(qint64 deviceId)
+{
+ for (int i = 0; i < tabletDevicePoints.size(); ++i) {
+ TabletPointData &pointData = tabletDevicePoints[i];
+ if (pointData.deviceId == deviceId)
+ return pointData;
+ }
+
+ tabletDevicePoints.append(TabletPointData(deviceId));
+ return tabletDevicePoints.last();
+}
+
void QGuiApplicationPrivate::processTabletEvent(QWindowSystemInterfacePrivate::TabletEvent *e)
{
#ifndef QT_NO_TABLETEVENT
+ TabletPointData &pointData = tabletDevicePoint(e->uid);
+
QEvent::Type type = QEvent::TabletMove;
- if (e->buttons != tabletState)
- type = (e->buttons > tabletState) ? QEvent::TabletPress : QEvent::TabletRelease;
+ if (e->buttons != pointData.state)
+ type = (e->buttons > pointData.state) ? QEvent::TabletPress : QEvent::TabletRelease;
QWindow *window = e->window.data();
modifier_buttons = e->modifiers;
@@ -2179,14 +2225,14 @@ void QGuiApplicationPrivate::processTabletEvent(QWindowSystemInterfacePrivate::T
}
if (!window)
return;
- tabletPressTarget = window;
+ pointData.target = window;
} else {
if (e->nullWindow()) {
- window = tabletPressTarget;
+ window = pointData.target;
localValid = false;
}
if (type == QEvent::TabletRelease)
- tabletPressTarget = 0;
+ pointData.target = Q_NULLPTR;
if (!window)
return;
}
@@ -2195,7 +2241,7 @@ void QGuiApplicationPrivate::processTabletEvent(QWindowSystemInterfacePrivate::T
QPointF delta = e->global - e->global.toPoint();
local = window->mapFromGlobal(e->global.toPoint()) + delta;
}
- Qt::MouseButtons stateChange = e->buttons ^ tabletState;
+ Qt::MouseButtons stateChange = e->buttons ^ pointData.state;
Qt::MouseButton button = Qt::NoButton;
for (int check = Qt::LeftButton; check <= int(Qt::MaxMouseButton); check = check << 1) {
if (check & stateChange) {
@@ -2209,7 +2255,7 @@ void QGuiApplicationPrivate::processTabletEvent(QWindowSystemInterfacePrivate::T
e->modifiers, e->uid, button, e->buttons);
ev.setTimestamp(e->timestamp);
QGuiApplication::sendSpontaneousEvent(window, &ev);
- tabletState = e->buttons;
+ pointData.state = e->buttons;
#else
Q_UNUSED(e)
#endif
@@ -2221,7 +2267,7 @@ void QGuiApplicationPrivate::processTabletEnterProximityEvent(QWindowSystemInter
QTabletEvent ev(QEvent::TabletEnterProximity, QPointF(), QPointF(),
e->device, e->pointerType, 0, 0, 0,
0, 0, 0,
- Qt::NoModifier, e->uid, Qt::NoButton, tabletState);
+ Qt::NoModifier, e->uid, Qt::NoButton, tabletDevicePoint(e->uid).state);
ev.setTimestamp(e->timestamp);
QGuiApplication::sendSpontaneousEvent(qGuiApp, &ev);
#else
@@ -2235,7 +2281,7 @@ void QGuiApplicationPrivate::processTabletLeaveProximityEvent(QWindowSystemInter
QTabletEvent ev(QEvent::TabletLeaveProximity, QPointF(), QPointF(),
e->device, e->pointerType, 0, 0, 0,
0, 0, 0,
- Qt::NoModifier, e->uid, Qt::NoButton, tabletState);
+ Qt::NoModifier, e->uid, Qt::NoButton, tabletDevicePoint(e->uid).state);
ev.setTimestamp(e->timestamp);
QGuiApplication::sendSpontaneousEvent(qGuiApp, &ev);
#else
@@ -3520,7 +3566,7 @@ void QGuiApplicationPrivate::_q_updateFocusObject(QObject *object)
emit q->focusObjectChanged(object);
}
-enum {
+enum MouseMasks {
MouseCapsMask = 0xFF,
MouseSourceMaskDst = 0xFF00,
MouseSourceMaskSrc = MouseCapsMask,
diff --git a/src/gui/kernel/qguiapplication.h b/src/gui/kernel/qguiapplication.h
index d995387d66..a773122d3e 100644
--- a/src/gui/kernel/qguiapplication.h
+++ b/src/gui/kernel/qguiapplication.h
@@ -67,6 +67,7 @@ class Q_GUI_EXPORT QGuiApplication : public QCoreApplication
Q_OBJECT
Q_PROPERTY(QIcon windowIcon READ windowIcon WRITE setWindowIcon)
Q_PROPERTY(QString applicationDisplayName READ applicationDisplayName WRITE setApplicationDisplayName)
+ Q_PROPERTY(QString desktopFileName READ desktopFileName WRITE setDesktopFileName)
Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged)
Q_PROPERTY(QString platformName READ platformName STORED false)
Q_PROPERTY(bool quitOnLastWindowClosed READ quitOnLastWindowClosed WRITE setQuitOnLastWindowClosed)
@@ -83,6 +84,9 @@ public:
static void setApplicationDisplayName(const QString &name);
static QString applicationDisplayName();
+ static void setDesktopFileName(const QString &name);
+ static QString desktopFileName();
+
static QWindowList allWindows();
static QWindowList topLevelWindows();
static QWindow *topLevelAt(const QPoint &pos);
diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h
index 7c7da9790b..5ef8dee8b7 100644
--- a/src/gui/kernel/qguiapplication_p.h
+++ b/src/gui/kernel/qguiapplication_p.h
@@ -183,6 +183,7 @@ public:
static QIcon *app_icon;
static QString *platform_name;
static QString *displayName;
+ static QString *desktopFileName;
QWindowList modalWindowList;
static void showModalWindow(QWindow *window);
@@ -197,13 +198,20 @@ public:
static int mousePressY;
static int mouse_double_click_distance;
static QPointF lastCursorPosition;
- static Qt::MouseButtons tabletState;
- static QWindow *tabletPressTarget;
static QWindow *currentMouseWindow;
static QWindow *currentMousePressWindow;
static Qt::ApplicationState applicationState;
static bool highDpiScalingUpdated;
+ struct TabletPointData {
+ TabletPointData(qint64 devId = 0) : deviceId(devId), state(Qt::NoButton), target(Q_NULLPTR) {}
+ qint64 deviceId;
+ Qt::MouseButtons state;
+ QWindow *target;
+ };
+ static QVector<TabletPointData> tabletDevicePoints;
+ static TabletPointData &tabletDevicePoint(qint64 deviceId);
+
#ifndef QT_NO_CLIPBOARD
static QClipboard *qt_clipboard;
#endif
diff --git a/src/gui/kernel/qinputdevicemanager_p.h b/src/gui/kernel/qinputdevicemanager_p.h
index d64793c23c..4c24b1bc93 100644
--- a/src/gui/kernel/qinputdevicemanager_p.h
+++ b/src/gui/kernel/qinputdevicemanager_p.h
@@ -61,7 +61,8 @@ public:
DeviceTypeUnknown,
DeviceTypePointer,
DeviceTypeKeyboard,
- DeviceTypeTouch
+ DeviceTypeTouch,
+ DeviceTypeTablet
};
QInputDeviceManager(QObject *parent = 0);
diff --git a/src/gui/kernel/qopenglcontext.cpp b/src/gui/kernel/qopenglcontext.cpp
index 85d05959de..3a51c2b7b2 100644
--- a/src/gui/kernel/qopenglcontext.cpp
+++ b/src/gui/kernel/qopenglcontext.cpp
@@ -948,7 +948,7 @@ bool QOpenGLContext::makeCurrent(QSurface *surface)
if (!isValid())
return false;
- if (thread() != QThread::currentThread())
+ if (Q_UNLIKELY(thread() != QThread::currentThread()))
qFatal("Cannot make QOpenGLContext current in a different thread");
if (!surface) {
diff --git a/src/gui/kernel/qplatformdrag.cpp b/src/gui/kernel/qplatformdrag.cpp
index d789c75d1d..11230194fc 100644
--- a/src/gui/kernel/qplatformdrag.cpp
+++ b/src/gui/kernel/qplatformdrag.cpp
@@ -155,6 +155,20 @@ Qt::DropAction QPlatformDrag::defaultAction(Qt::DropActions possibleActions,
}
/*!
+ \brief Cancels the currently active drag (only for drags of
+ the current application initiated by QPlatformDrag::drag()).
+
+ The default implementation does nothing.
+
+ \since 5.6
+ */
+
+void QPlatformDrag::cancelDrag()
+{
+ Q_UNIMPLEMENTED();
+}
+
+/*!
\brief Called to notify QDrag about changes of the current action.
*/
diff --git a/src/gui/kernel/qplatformdrag.h b/src/gui/kernel/qplatformdrag.h
index 10ee88477f..72e28d2745 100644
--- a/src/gui/kernel/qplatformdrag.h
+++ b/src/gui/kernel/qplatformdrag.h
@@ -92,6 +92,7 @@ public:
virtual QMimeData *platformDropData() = 0;
virtual Qt::DropAction drag(QDrag *m_drag) = 0;
+ virtual void cancelDrag();
void updateAction(Qt::DropAction action);
virtual Qt::DropAction defaultAction(Qt::DropActions possibleActions, Qt::KeyboardModifiers modifiers) const;
diff --git a/src/gui/kernel/qplatformintegration.cpp b/src/gui/kernel/qplatformintegration.cpp
index 14633d8b30..82cb4dd399 100644
--- a/src/gui/kernel/qplatformintegration.cpp
+++ b/src/gui/kernel/qplatformintegration.cpp
@@ -149,13 +149,11 @@ QPlatformServices *QPlatformIntegration::services() const
/*!
\fn QPlatformWindow *QPlatformIntegration::createPlatformWindow(QWindow *window) const
- Factory function for QPlatformWindow. The \a window parameter is a pointer to the top level
- window which the QPlatformWindow is supposed to be created for.
+ Factory function for QPlatformWindow. The \a window parameter is a pointer to the window
+ which the QPlatformWindow is supposed to be created for.
- All top level windows have to have a QPlatformWindow, and it will be created when the
- QPlatformWindow is set to be visible for the first time. If the top level window's flags are
- changed, or if the top level window's QPlatformWindowFormat is changed, then the top level
- window's QPlatformWindow is deleted and a new one is created.
+ All windows have to have a QPlatformWindow, and it will be created on-demand when the
+ QWindow is made visible for the first time, or explicitly through calling QWindow::create().
In the constructor, of the QPlatformWindow, the window flags, state, title and geometry
of the \a window should be applied to the underlying window. If the resulting flags or state
@@ -559,6 +557,17 @@ void QPlatformIntegration::sync()
{
}
+/*!
+ \since 5.7
+
+ Should sound a bell, using the default volume and sound.
+
+ \sa QApplication::beep()
+*/
+void QPlatformIntegration::beep() const
+{
+}
+
#ifndef QT_NO_OPENGL
/*!
Platform integration function for querying the OpenGL implementation type.
diff --git a/src/gui/kernel/qplatformintegration.h b/src/gui/kernel/qplatformintegration.h
index af89a73455..382e16b4ca 100644
--- a/src/gui/kernel/qplatformintegration.h
+++ b/src/gui/kernel/qplatformintegration.h
@@ -176,6 +176,8 @@ public:
void removeScreen(QScreen *screen);
+ virtual void beep() const;
+
protected:
void screenAdded(QPlatformScreen *screen, bool isPrimary = false);
void destroyScreen(QPlatformScreen *screen);
diff --git a/src/gui/kernel/qplatformintegrationfactory.cpp b/src/gui/kernel/qplatformintegrationfactory.cpp
index 5a1fb3ca83..d109ceb2f0 100644
--- a/src/gui/kernel/qplatformintegrationfactory.cpp
+++ b/src/gui/kernel/qplatformintegrationfactory.cpp
@@ -42,11 +42,13 @@
QT_BEGIN_NAMESPACE
-#ifndef QT_NO_LIBRARY
Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader,
(QPlatformIntegrationFactoryInterface_iid, QLatin1String("/platforms"), Qt::CaseInsensitive))
+
+#ifndef QT_NO_LIBRARY
Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, directLoader,
(QPlatformIntegrationFactoryInterface_iid, QLatin1String(""), Qt::CaseInsensitive))
+#endif // !QT_NO_LIBRARY
static inline QPlatformIntegration *loadIntegration(QFactoryLoader *loader, const QString &key, const QStringList &parameters, int &argc, char ** argv)
{
@@ -59,8 +61,6 @@ static inline QPlatformIntegration *loadIntegration(QFactoryLoader *loader, cons
return 0;
}
-#endif // !QT_NO_LIBRARY
-
QPlatformIntegration *QPlatformIntegrationFactory::create(const QString &platform, const QStringList &paramList, int &argc, char **argv, const QString &platformPluginPath)
{
#ifndef QT_NO_LIBRARY
@@ -70,16 +70,10 @@ QPlatformIntegration *QPlatformIntegrationFactory::create(const QString &platfor
if (QPlatformIntegration *ret = loadIntegration(directLoader(), platform, paramList, argc, argv))
return ret;
}
- if (QPlatformIntegration *ret = loadIntegration(loader(), platform, paramList, argc, argv))
- return ret;
#else
- Q_UNUSED(platform);
- Q_UNUSED(paramList);
- Q_UNUSED(argc);
- Q_UNUSED(argv);
Q_UNUSED(platformPluginPath);
#endif
- return 0;
+ return loadIntegration(loader(), platform, paramList, argc, argv);
}
/*!
diff --git a/src/gui/kernel/qplatformnativeinterface.cpp b/src/gui/kernel/qplatformnativeinterface.cpp
index 8fa8debcb9..48e6091571 100644
--- a/src/gui/kernel/qplatformnativeinterface.cpp
+++ b/src/gui/kernel/qplatformnativeinterface.cpp
@@ -80,6 +80,15 @@ void * QPlatformNativeInterface::nativeResourceForBackingStore(const QByteArray
return 0;
}
+#ifndef QT_NO_CURSOR
+void *QPlatformNativeInterface::nativeResourceForCursor(const QByteArray &resource, const QCursor &cursor)
+{
+ Q_UNUSED(resource);
+ Q_UNUSED(cursor);
+ return Q_NULLPTR;
+}
+#endif // !QT_NO_CURSOR
+
QPlatformNativeInterface::NativeResourceForIntegrationFunction QPlatformNativeInterface::nativeResourceFunctionForIntegration(const QByteArray &resource)
{
Q_UNUSED(resource);
diff --git a/src/gui/kernel/qplatformnativeinterface.h b/src/gui/kernel/qplatformnativeinterface.h
index 71a4e9c768..c8d868a41d 100644
--- a/src/gui/kernel/qplatformnativeinterface.h
+++ b/src/gui/kernel/qplatformnativeinterface.h
@@ -65,6 +65,9 @@ public:
virtual void *nativeResourceForScreen(const QByteArray &resource, QScreen *screen);
virtual void *nativeResourceForWindow(const QByteArray &resource, QWindow *window);
virtual void *nativeResourceForBackingStore(const QByteArray &resource, QBackingStore *backingStore);
+#ifndef QT_NO_CURSOR
+ virtual void *nativeResourceForCursor(const QByteArray &resource, const QCursor &cursor);
+#endif
typedef void * (*NativeResourceForIntegrationFunction)();
typedef void * (*NativeResourceForContextFunction)(QOpenGLContext *context);
diff --git a/src/gui/kernel/qplatformtheme.cpp b/src/gui/kernel/qplatformtheme.cpp
index ce8548f628..61dacfa076 100644
--- a/src/gui/kernel/qplatformtheme.cpp
+++ b/src/gui/kernel/qplatformtheme.cpp
@@ -682,6 +682,41 @@ QString QPlatformTheme::defaultStandardButtonText(int button)
return QString();
}
+QString QPlatformTheme::removeMnemonics(const QString &original)
+{
+ QString returnText(original.size(), 0);
+ int finalDest = 0;
+ int currPos = 0;
+ int l = original.length();
+ while (l) {
+ if (original.at(currPos) == QLatin1Char('&')
+ && (l == 1 || original.at(currPos + 1) != QLatin1Char('&'))) {
+ ++currPos;
+ --l;
+ if (l == 0)
+ break;
+ } else if (original.at(currPos) == QLatin1Char('(') && l >= 4 &&
+ original.at(currPos + 1) == QLatin1Char('&') &&
+ original.at(currPos + 2) != QLatin1Char('&') &&
+ original.at(currPos + 3) == QLatin1Char(')')) {
+ /* remove mnemonics its format is "\s*(&X)" */
+ int n = 0;
+ while (finalDest > n && returnText.at(finalDest - n - 1).isSpace())
+ ++n;
+ finalDest -= n;
+ currPos += 4;
+ l -= 4;
+ continue;
+ }
+ returnText[finalDest] = original.at(currPos);
+ ++currPos;
+ ++finalDest;
+ --l;
+ }
+ returnText.truncate(finalDest);
+ return returnText;
+}
+
unsigned QPlatformThemePrivate::currentKeyPlatforms()
{
const uint keyboardScheme = QGuiApplicationPrivate::platformTheme()->themeHint(QPlatformTheme::KeyboardScheme).toInt();
diff --git a/src/gui/kernel/qplatformtheme.h b/src/gui/kernel/qplatformtheme.h
index 36fa7a65aa..2bd35491fb 100644
--- a/src/gui/kernel/qplatformtheme.h
+++ b/src/gui/kernel/qplatformtheme.h
@@ -303,6 +303,7 @@ public:
static QVariant defaultThemeHint(ThemeHint hint);
static QString defaultStandardButtonText(int button);
+ static QString removeMnemonics(const QString &original);
protected:
explicit QPlatformTheme(QPlatformThemePrivate *priv);
diff --git a/src/gui/kernel/qsimpledrag.cpp b/src/gui/kernel/qsimpledrag.cpp
index 9f38c9b78a..706786385b 100644
--- a/src/gui/kernel/qsimpledrag.cpp
+++ b/src/gui/kernel/qsimpledrag.cpp
@@ -191,6 +191,14 @@ Qt::DropAction QBasicDrag::drag(QDrag *o)
return m_executed_drop_action;
}
+void QBasicDrag::cancelDrag()
+{
+ if (m_eventLoop) {
+ cancel();
+ m_eventLoop->quit();
+ }
+}
+
void QBasicDrag::restoreCursor()
{
if (m_restoreCursor) {
diff --git a/src/gui/kernel/qsimpledrag_p.h b/src/gui/kernel/qsimpledrag_p.h
index 055136c436..d5dacd8fd2 100644
--- a/src/gui/kernel/qsimpledrag_p.h
+++ b/src/gui/kernel/qsimpledrag_p.h
@@ -66,6 +66,7 @@ public:
virtual ~QBasicDrag();
virtual Qt::DropAction drag(QDrag *drag) Q_DECL_OVERRIDE;
+ void cancelDrag() Q_DECL_OVERRIDE;
virtual bool eventFilter(QObject *o, QEvent *e) Q_DECL_OVERRIDE;
diff --git a/src/gui/kernel/qstylehints.cpp b/src/gui/kernel/qstylehints.cpp
index 7fc89112e6..eea26c05ed 100644
--- a/src/gui/kernel/qstylehints.cpp
+++ b/src/gui/kernel/qstylehints.cpp
@@ -65,6 +65,7 @@ class QStyleHintsPrivate : public QObjectPrivate
public:
inline QStyleHintsPrivate()
: m_mouseDoubleClickInterval(-1)
+ , m_mousePressAndHoldInterval(-1)
, m_startDragDistance(-1)
, m_startDragTime(-1)
, m_keyboardInputInterval(-1)
@@ -72,6 +73,7 @@ public:
{}
int m_mouseDoubleClickInterval;
+ int m_mousePressAndHoldInterval;
int m_startDragDistance;
int m_startDragTime;
int m_keyboardInputInterval;
@@ -129,6 +131,21 @@ int QStyleHints::mouseDoubleClickInterval() const
}
/*!
+ Sets the \a mousePressAndHoldInterval.
+ \internal
+ \sa mousePressAndHoldInterval()
+ \since 5.7
+*/
+void QStyleHints::setMousePressAndHoldInterval(int mousePressAndHoldInterval)
+{
+ Q_D(QStyleHints);
+ if (d->m_mousePressAndHoldInterval == mousePressAndHoldInterval)
+ return;
+ d->m_mousePressAndHoldInterval = mousePressAndHoldInterval;
+ emit mousePressAndHoldIntervalChanged(mousePressAndHoldInterval);
+}
+
+/*!
\property QStyleHints::mousePressAndHoldInterval
\brief the time limit in milliseconds that activates
a press and hold.
@@ -137,7 +154,10 @@ int QStyleHints::mouseDoubleClickInterval() const
*/
int QStyleHints::mousePressAndHoldInterval() const
{
- return themeableHint(QPlatformTheme::MousePressAndHoldInterval, QPlatformIntegration::MousePressAndHoldInterval).toInt();
+ Q_D(const QStyleHints);
+ return d->m_mousePressAndHoldInterval >= 0 ?
+ d->m_mousePressAndHoldInterval :
+ themeableHint(QPlatformTheme::MousePressAndHoldInterval, QPlatformIntegration::MousePressAndHoldInterval).toInt();
}
/*!
diff --git a/src/gui/kernel/qstylehints.h b/src/gui/kernel/qstylehints.h
index c5b8241e07..7c46eaa746 100644
--- a/src/gui/kernel/qstylehints.h
+++ b/src/gui/kernel/qstylehints.h
@@ -51,7 +51,7 @@ class Q_GUI_EXPORT QStyleHints : public QObject
Q_PROPERTY(int keyboardAutoRepeatRate READ keyboardAutoRepeatRate STORED false CONSTANT FINAL)
Q_PROPERTY(int keyboardInputInterval READ keyboardInputInterval NOTIFY keyboardInputIntervalChanged FINAL)
Q_PROPERTY(int mouseDoubleClickInterval READ mouseDoubleClickInterval NOTIFY mouseDoubleClickIntervalChanged FINAL)
- Q_PROPERTY(int mousePressAndHoldInterval READ mousePressAndHoldInterval STORED false CONSTANT FINAL)
+ Q_PROPERTY(int mousePressAndHoldInterval READ mousePressAndHoldInterval NOTIFY mousePressAndHoldIntervalChanged FINAL)
Q_PROPERTY(QChar passwordMaskCharacter READ passwordMaskCharacter STORED false CONSTANT FINAL)
Q_PROPERTY(int passwordMaskDelay READ passwordMaskDelay STORED false CONSTANT FINAL)
Q_PROPERTY(bool setFocusOnTouchRelease READ setFocusOnTouchRelease STORED false CONSTANT FINAL)
@@ -67,6 +67,7 @@ class Q_GUI_EXPORT QStyleHints : public QObject
public:
void setMouseDoubleClickInterval(int mouseDoubleClickInterval);
int mouseDoubleClickInterval() const;
+ void setMousePressAndHoldInterval(int mousePressAndHoldInterval);
int mousePressAndHoldInterval() const;
void setStartDragDistance(int startDragDistance);
int startDragDistance() const;
@@ -92,6 +93,7 @@ Q_SIGNALS:
void cursorFlashTimeChanged(int cursorFlashTime);
void keyboardInputIntervalChanged(int keyboardInputInterval);
void mouseDoubleClickIntervalChanged(int mouseDoubleClickInterval);
+ void mousePressAndHoldIntervalChanged(int mousePressAndHoldInterval);
void startDragDistanceChanged(int startDragDistance);
void startDragTimeChanged(int startDragTime);
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp
index e728d32e4b..45e0acec63 100644
--- a/src/gui/kernel/qwindow.cpp
+++ b/src/gui/kernel/qwindow.cpp
@@ -212,7 +212,7 @@ void QWindowPrivate::init()
// If your application aborts here, you are probably creating a QWindow
// before the screen list is populated.
- if (!parentWindow && !topLevelScreen) {
+ if (Q_UNLIKELY(!parentWindow && !topLevelScreen)) {
qFatal("Cannot create window: no screens available");
exit(1);
}
@@ -392,6 +392,9 @@ void QWindowPrivate::create(bool recursive)
if (platformWindow)
return;
+ if (q->parent())
+ q->parent()->create();
+
platformWindow = QGuiApplicationPrivate::platformIntegration()->createPlatformWindow(q);
Q_ASSERT(platformWindow);
@@ -403,13 +406,21 @@ void QWindowPrivate::create(bool recursive)
QObjectList childObjects = q->children();
for (int i = 0; i < childObjects.size(); i ++) {
QObject *object = childObjects.at(i);
- if (object->isWindowType()) {
- QWindow *window = static_cast<QWindow *>(object);
- if (recursive)
- window->d_func()->create(true);
- if (window->d_func()->platformWindow)
- window->d_func()->platformWindow->setParent(platformWindow);
- }
+ if (!object->isWindowType())
+ continue;
+
+ QWindow *childWindow = static_cast<QWindow *>(object);
+ if (recursive)
+ childWindow->d_func()->create(recursive);
+
+ // The child may have had deferred creation due to this window not being created
+ // at the time setVisible was called, so we re-apply the visible state, which
+ // may result in creating the child, and emitting the appropriate signals.
+ if (childWindow->isVisible())
+ childWindow->setVisible(true);
+
+ if (QPlatformWindow *childPlatformWindow = childWindow->d_func()->platformWindow)
+ childPlatformWindow->setParent(this->platformWindow);
}
QPlatformSurfaceEvent e(QPlatformSurfaceEvent::SurfaceCreated);
@@ -474,14 +485,23 @@ void QWindow::setVisible(bool visible)
{
Q_D(QWindow);
- if (d->visible == visible)
+ if (d->visible != visible) {
+ d->visible = visible;
+ emit visibleChanged(visible);
+ d->updateVisibility();
+ } else if (d->platformWindow) {
+ // Visibility hasn't changed, and the platform window is in sync
return;
- d->visible = visible;
- emit visibleChanged(visible);
- d->updateVisibility();
+ }
- if (!d->platformWindow)
- create();
+ if (!d->platformWindow) {
+ // If we have a parent window, but the parent hasn't been created yet, we
+ // can defer creation until the parent is created or we're re-parented.
+ if (parent() && !parent()->handle())
+ return;
+ else
+ create();
+ }
if (visible) {
// remove posted quit events when showing a new window
@@ -520,6 +540,7 @@ void QWindow::setVisible(bool visible)
if (visible && (d->hasCursor || QGuiApplication::overrideCursor()))
d->applyCursor();
#endif
+
d->platformWindow->setVisible(visible);
if (!visible) {
@@ -609,20 +630,25 @@ void QWindow::setParent(QWindow *parent)
}
QObject::setParent(parent);
+ d->parentWindow = parent;
+
if (parent)
d->disconnectFromScreen();
else
d->connectToScreen(newScreen);
+ // If we were set visible, but not created because we were a child, and we're now
+ // re-parented into a created parent, or to being a top level, we need re-apply the
+ // visibility state, which will also create.
+ if (isVisible() && (!parent || parent->handle()))
+ setVisible(true);
+
if (d->platformWindow) {
- if (parent && parent->d_func()->platformWindow) {
- d->platformWindow->setParent(parent->d_func()->platformWindow);
- } else {
- d->platformWindow->setParent(0);
- }
- }
+ if (parent)
+ parent->create();
- d->parentWindow = parent;
+ d->platformWindow->setParent(parent ? parent->d_func()->platformWindow : 0);
+ }
QGuiApplicationPrivate::updateBlockedStatus(this);
}
@@ -1654,8 +1680,12 @@ void QWindow::destroy()
QGuiApplicationPrivate::currentMouseWindow = parent();
if (QGuiApplicationPrivate::currentMousePressWindow == this)
QGuiApplicationPrivate::currentMousePressWindow = parent();
- if (QGuiApplicationPrivate::tabletPressTarget == this)
- QGuiApplicationPrivate::tabletPressTarget = parent();
+
+ for (int i = 0; i < QGuiApplicationPrivate::tabletDevicePoints.size(); ++i) {
+ QGuiApplicationPrivate::TabletPointData &pointData = QGuiApplicationPrivate::tabletDevicePoints[i];
+ if (pointData.target == this)
+ pointData.target = parent();
+ }
bool wasVisible = isVisible();
d->visibilityOnDestroy = wasVisible && d->platformWindow;
diff --git a/src/gui/opengl/qopenglengineshadermanager.cpp b/src/gui/opengl/qopenglengineshadermanager.cpp
index 40f4ce94c2..7bdd3cb1bb 100644
--- a/src/gui/opengl/qopenglengineshadermanager.cpp
+++ b/src/gui/opengl/qopenglengineshadermanager.cpp
@@ -191,7 +191,7 @@ QOpenGLEngineSharedShaders::QOpenGLEngineSharedShaders(QOpenGLContext* context)
#if defined(QT_DEBUG)
// Check that all the elements have been filled:
for (int i = 0; i < TotalSnippetCount; ++i) {
- if (qShaderSnippets[i] == 0) {
+ if (Q_UNLIKELY(!qShaderSnippets[i])) {
qFatal("Shader snippet for %s (#%d) is missing!",
snippetNameStr(SnippetName(i)).constData(), i);
}
@@ -240,11 +240,11 @@ QOpenGLEngineSharedShaders::QOpenGLEngineSharedShaders(QOpenGLContext* context)
simpleShaderProg->link();
- if (simpleShaderProg->isLinked()) {
+ if (Q_UNLIKELY(!simpleShaderProg->isLinked())) {
+ qCritical("Errors linking simple shader: %s", qPrintable(simpleShaderProg->log()));
+ } else {
if (!inCache)
simpleShaderCache.store(simpleShaderProg, context);
- } else {
- qCritical("Errors linking simple shader: %s", qPrintable(simpleShaderProg->log()));
}
// Compile the blit shader:
@@ -281,11 +281,11 @@ QOpenGLEngineSharedShaders::QOpenGLEngineSharedShaders(QOpenGLContext* context)
}
blitShaderProg->link();
- if (blitShaderProg->isLinked()) {
+ if (Q_UNLIKELY(!blitShaderProg->isLinked())) {
+ qCritical("Errors linking blit shader: %s", qPrintable(blitShaderProg->log()));
+ } else {
if (!inCache)
blitShaderCache.store(blitShaderProg, context);
- } else {
- qCritical("Errors linking blit shader: %s", qPrintable(blitShaderProg->log()));
}
#ifdef QT_GL_SHARED_SHADER_DEBUG
diff --git a/src/gui/opengl/qopenglfunctions.cpp b/src/gui/opengl/qopenglfunctions.cpp
index d614ad8401..bfd30735b2 100644
--- a/src/gui/opengl/qopenglfunctions.cpp
+++ b/src/gui/opengl/qopenglfunctions.cpp
@@ -5795,7 +5795,9 @@ QOpenGLES3Helper::QOpenGLES3Helper()
{
m_supportedVersion = qMakePair(2, 0);
- if (init()) {
+ if (Q_UNLIKELY(!init())) {
+ qFatal("Failed to load libGLESv2");
+ } else {
const QPair<int, int> contextVersion = QOpenGLContext::currentContext()->format().version();
qCDebug(lcGLES3, "Resolving OpenGL ES 3.0 entry points");
@@ -5993,8 +5995,6 @@ QOpenGLES3Helper::QOpenGLES3Helper()
}
m_supportedVersion = qMakePair(3, 1);
}
- } else {
- qFatal("Failed to load libGLESv2");
}
}
diff --git a/src/gui/opengl/qtriangulator_p.h b/src/gui/opengl/qtriangulator_p.h
index 0ab3f7496c..4e13e5bdd0 100644
--- a/src/gui/opengl/qtriangulator_p.h
+++ b/src/gui/opengl/qtriangulator_p.h
@@ -88,12 +88,13 @@ public:
inline QVertexIndexVector &operator = (const QVertexIndexVector &other)
{
- if (t == UnsignedInt)
- indices32 = other.indices32;
- else
- indices16 = other.indices16;
+ if (t == UnsignedInt)
+ indices32 = other.indices32;
+ else
+ indices16 = other.indices16;
- return *this;
+ t = other.t;
+ return *this;
}
private:
diff --git a/src/gui/painting/painting.pri b/src/gui/painting/painting.pri
index 1e516e4581..a75e40e413 100644
--- a/src/gui/painting/painting.pri
+++ b/src/gui/painting/painting.pri
@@ -101,7 +101,7 @@ SSE4_1_SOURCES += painting/qdrawhelper_sse4.cpp \
painting/qimagescale_sse4.cpp
AVX2_SOURCES += painting/qdrawhelper_avx2.cpp
-NEON_SOURCES += painting/qdrawhelper_neon.cpp
+NEON_SOURCES += painting/qdrawhelper_neon.cpp painting/qimagescale_neon.cpp
NEON_HEADERS += painting/qdrawhelper_neon_p.h
NEON_ASM += ../3rdparty/pixman/pixman-arm-neon-asm.S painting/qdrawhelper_neon_asm.S
!ios:!contains(QT_ARCH, "arm64"): DEFINES += ENABLE_PIXMAN_DRAWHELPERS
diff --git a/src/gui/painting/qcosmeticstroker.cpp b/src/gui/painting/qcosmeticstroker.cpp
index 8c3fd2ce4f..3112d551b2 100644
--- a/src/gui/painting/qcosmeticstroker.cpp
+++ b/src/gui/painting/qcosmeticstroker.cpp
@@ -538,7 +538,7 @@ void QCosmeticStroker::drawPath(const QVectorPath &path)
QPointF p2 = QPointF(p[-2], p[-1]) * state->matrix;
calculateLastPoint(p1.x(), p1.y(), p2.x(), p2.y());
}
- int caps = (!closed & drawCaps) ? CapBegin : NoCaps;
+ int caps = (!closed && drawCaps) ? CapBegin : NoCaps;
// qDebug() << "closed =" << closed << capString(caps);
points += 2;
@@ -589,7 +589,7 @@ void QCosmeticStroker::drawPath(const QVectorPath &path)
const qreal *end = points + 2*path.elementCount();
// handle closed path case
bool closed = path.hasImplicitClose() || (points[0] == end[-2] && points[1] == end[-1]);
- int caps = (!closed & drawCaps) ? CapBegin : NoCaps;
+ int caps = (!closed && drawCaps) ? CapBegin : NoCaps;
if (closed) {
QPointF p2 = QPointF(end[-2], end[-1]) * state->matrix;
calculateLastPoint(p2.x(), p2.y(), p.x(), p.y());
diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp
index 87ceb9a89d..e7b81ebdd3 100644
--- a/src/gui/painting/qdrawhelper.cpp
+++ b/src/gui/painting/qdrawhelper.cpp
@@ -2337,8 +2337,8 @@ static const uint * QT_FASTCALL fetchTransformedBilinearARGB32PM(uint *buffer, c
uint bl = s2[x1];
uint br = s2[x2];
-#if defined(__SSE2__)
- // The SSE2 optimized interpolate_4_pixels is faster than interpolate_4_pixels_16.
+#if defined(__SSE2__) || defined(__ARM_NEON__)
+ // The optimized interpolate_4_pixels are faster than interpolate_4_pixels_16.
int distx = (fx & 0x0000ffff) >> 8;
int disty = (fy & 0x0000ffff) >> 8;
*b = interpolate_4_pixels(tl, tr, bl, br, distx, disty);
@@ -2567,12 +2567,8 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper
if ((fdx < 0 && fdx > -(fixed_scale / 8)) || std::abs(data->m22) < (1./8.)) { // scale up more than 8x
int disty = (fy & 0x0000ffff) >> 8;
for (int i = 0; i < len; ++i) {
- uint tl = buf1[i * 2 + 0];
- uint tr = buf1[i * 2 + 1];
- uint bl = buf2[i * 2 + 0];
- uint br = buf2[i * 2 + 1];
int distx = (fracX & 0x0000ffff) >> 8;
- b[i] = interpolate_4_pixels(tl, tr, bl, br, distx, disty);
+ b[i] = interpolate_4_pixels(buf1 + i * 2, buf2 + i * 2, distx, disty);
fracX += fdx;
}
} else { //scale down
@@ -2633,15 +2629,10 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper
if (std::abs(data->m11) > 8 || std::abs(data->m22) > 8) {
//if we are zooming more than 8 times, we use 8bit precision for the position.
for (int i = 0; i < len; ++i) {
- uint tl = buf1[i * 2 + 0];
- uint tr = buf1[i * 2 + 1];
- uint bl = buf2[i * 2 + 0];
- uint br = buf2[i * 2 + 1];
-
int distx = (fracX & 0x0000ffff) >> 8;
int disty = (fracY & 0x0000ffff) >> 8;
- b[i] = interpolate_4_pixels(tl, tr, bl, br, distx, disty);
+ b[i] = interpolate_4_pixels(buf1 + i * 2, buf2 + i * 2, distx, disty);
fracX += fdx;
fracY += fdy;
}
@@ -2731,12 +2722,7 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper
int distx = distxs[i];
int disty = distys[i];
- uint tl = buf1[i * 2 + 0];
- uint tr = buf1[i * 2 + 1];
- uint bl = buf2[i * 2 + 0];
- uint br = buf2[i * 2 + 1];
-
- b[i] = interpolate_4_pixels(tl, tr, bl, br, distx, disty);
+ b[i] = interpolate_4_pixels(buf1 + i * 2, buf2 + i * 2, distx, disty);
}
length -= len;
b += len;
diff --git a/src/gui/painting/qdrawhelper_p.h b/src/gui/painting/qdrawhelper_p.h
index 1ff19f4e04..fc24e22cac 100644
--- a/src/gui/painting/qdrawhelper_p.h
+++ b/src/gui/painting/qdrawhelper_p.h
@@ -629,31 +629,75 @@ static Q_ALWAYS_INLINE uint BYTE_MUL(uint x, uint a) {
}
#endif
-#ifdef __SSE2__
+#if defined(__SSE2__)
+static Q_ALWAYS_INLINE uint interpolate_4_pixels_sse2(__m128i vt, __m128i vb, uint distx, uint disty)
+{
+ // First interpolate top and bottom pixels in parallel.
+ vt = _mm_unpacklo_epi8(vt, _mm_setzero_si128());
+ vb = _mm_unpacklo_epi8(vb, _mm_setzero_si128());
+ vt = _mm_mullo_epi16(vt, _mm_set1_epi16(256 - disty));
+ vb = _mm_mullo_epi16(vb, _mm_set1_epi16(disty));
+ __m128i vlr = _mm_add_epi16(vt, vb);
+ vlr = _mm_srli_epi16(vlr, 8);
+ // vlr now contains the result of the first two interpolate calls vlr = unpacked((xright << 64) | xleft)
+
+ // Now the last interpolate between left and right..
+ const __m128i vidistx = _mm_shufflelo_epi16(_mm_cvtsi32_si128(256 - distx), _MM_SHUFFLE(0, 0, 0, 0));
+ const __m128i vdistx = _mm_shufflelo_epi16(_mm_cvtsi32_si128(distx), _MM_SHUFFLE(0, 0, 0, 0));
+ const __m128i vmulx = _mm_unpacklo_epi16(vidistx, vdistx);
+ vlr = _mm_unpacklo_epi16(vlr, _mm_srli_si128(vlr, 8));
+ // vlr now contains the colors of left and right interleaved { la, ra, lr, rr, lg, rg, lb, rb }
+ vlr = _mm_madd_epi16(vlr, vmulx); // Multiply and horizontal add.
+ vlr = _mm_srli_epi32(vlr, 8);
+ vlr = _mm_packs_epi32(vlr, vlr);
+ vlr = _mm_packus_epi16(vlr, vlr);
+ return _mm_cvtsi128_si32(vlr);
+}
+
+static inline uint interpolate_4_pixels(uint tl, uint tr, uint bl, uint br, uint distx, uint disty)
+{
+ __m128i vt = _mm_unpacklo_epi32(_mm_cvtsi32_si128(tl), _mm_cvtsi32_si128(tr));
+ __m128i vb = _mm_unpacklo_epi32(_mm_cvtsi32_si128(bl), _mm_cvtsi32_si128(br));
+ return interpolate_4_pixels_sse2(vt, vb, distx, disty);
+}
+
+static inline uint interpolate_4_pixels(const uint t[], const uint b[], uint distx, uint disty)
+{
+ __m128i vt = _mm_loadl_epi64((const __m128i*)t);
+ __m128i vb = _mm_loadl_epi64((const __m128i*)b);
+ return interpolate_4_pixels_sse2(vt, vb, distx, disty);
+}
+#elif defined(__ARM_NEON__)
+static Q_ALWAYS_INLINE uint interpolate_4_pixels_neon(uint32x2_t vt32, uint32x2_t vb32, uint distx, uint disty)
+{
+ uint16x8_t vt16 = vmovl_u8(vreinterpret_u8_u32(vt32));
+ uint16x8_t vb16 = vmovl_u8(vreinterpret_u8_u32(vb32));
+ vt16 = vmulq_n_u16(vt16, 256 - disty);
+ vt16 = vmlaq_n_u16(vt16, vb16, disty);
+ vt16 = vshrq_n_u16(vt16, 8);
+ uint16x4_t vl16 = vget_low_u16(vt16);
+ uint16x4_t vr16 = vget_high_u16(vt16);
+ vl16 = vmul_n_u16(vl16, 256 - distx);
+ vl16 = vmla_n_u16(vl16, vr16, distx);
+ vl16 = vshr_n_u16(vl16, 8);
+ uint8x8_t vr = vmovn_u16(vcombine_u16(vl16, vl16));
+ return vget_lane_u32(vreinterpret_u32_u8(vr), 0);
+}
+
static inline uint interpolate_4_pixels(uint tl, uint tr, uint bl, uint br, uint distx, uint disty)
{
- // First interpolate right and left pixels in parallel.
- __m128i vl = _mm_unpacklo_epi32(_mm_cvtsi32_si128(tl), _mm_cvtsi32_si128(bl));
- __m128i vr = _mm_unpacklo_epi32(_mm_cvtsi32_si128(tr), _mm_cvtsi32_si128(br));
- vl = _mm_unpacklo_epi8(vl, _mm_setzero_si128());
- vr = _mm_unpacklo_epi8(vr, _mm_setzero_si128());
- vl = _mm_mullo_epi16(vl, _mm_set1_epi16(256 - distx));
- vr = _mm_mullo_epi16(vr, _mm_set1_epi16(distx));
- __m128i vtb = _mm_add_epi16(vl, vr);
- vtb = _mm_srli_epi16(vtb, 8);
- // vtb now contains the result of the first two interpolate calls vtb = unpacked((xbot << 64) | xtop)
-
- // Now the last interpolate between top and bottom interpolations.
- const __m128i vidisty = _mm_shufflelo_epi16(_mm_cvtsi32_si128(256 - disty), _MM_SHUFFLE(0, 0, 0, 0));
- const __m128i vdisty = _mm_shufflelo_epi16(_mm_cvtsi32_si128(disty), _MM_SHUFFLE(0, 0, 0, 0));
- const __m128i vmuly = _mm_unpacklo_epi16(vidisty, vdisty);
- vtb = _mm_unpacklo_epi16(vtb, _mm_srli_si128(vtb, 8));
- // vtb now contains the colors of top and bottom interleaved { ta, ba, tr, br, tg, bg, tb, bb }
- vtb = _mm_madd_epi16(vtb, vmuly); // Multiply and horizontal add.
- vtb = _mm_srli_epi32(vtb, 8);
- vtb = _mm_packs_epi32(vtb, _mm_setzero_si128());
- vtb = _mm_packus_epi16(vtb, _mm_setzero_si128());
- return _mm_cvtsi128_si32(vtb);
+ uint32x2_t vt32 = vmov_n_u32(tl);
+ uint32x2_t vb32 = vmov_n_u32(bl);
+ vt32 = vset_lane_u32(tr, vt32, 1);
+ vb32 = vset_lane_u32(br, vb32, 1);
+ return interpolate_4_pixels_neon(vt32, vb32, distx, disty);
+}
+
+static inline uint interpolate_4_pixels(const uint t[], const uint b[], uint distx, uint disty)
+{
+ uint32x2_t vt32 = vld1_u32(t);
+ uint32x2_t vb32 = vld1_u32(b);
+ return interpolate_4_pixels_neon(vt32, vb32, distx, disty);
}
#else
static inline uint interpolate_4_pixels(uint tl, uint tr, uint bl, uint br, uint distx, uint disty)
@@ -664,6 +708,11 @@ static inline uint interpolate_4_pixels(uint tl, uint tr, uint bl, uint br, uint
uint xbot = INTERPOLATE_PIXEL_256(bl, idistx, br, distx);
return INTERPOLATE_PIXEL_256(xtop, idisty, xbot, disty);
}
+
+static inline uint interpolate_4_pixels(const uint t[], const uint b[], uint distx, uint disty)
+{
+ return interpolate_4_pixels(t[0], t[1], b[0], b[1], distx, disty);
+}
#endif
#if Q_BYTE_ORDER == Q_BIG_ENDIAN
diff --git a/src/gui/painting/qimagescale.cpp b/src/gui/painting/qimagescale.cpp
index 33dccc5374..9381afa8e7 100644
--- a/src/gui/painting/qimagescale.cpp
+++ b/src/gui/painting/qimagescale.cpp
@@ -277,6 +277,18 @@ void qt_qimageScaleAARGBA_down_xy_sse4(QImageScaleInfo *isi, unsigned int *dest,
int dw, int dh, int dow, int sow);
#endif
+#if defined(__ARM_NEON__)
+template<bool RGB>
+void qt_qimageScaleAARGBA_up_x_down_y_neon(QImageScaleInfo *isi, unsigned int *dest,
+ int dw, int dh, int dow, int sow);
+template<bool RGB>
+void qt_qimageScaleAARGBA_down_x_up_y_neon(QImageScaleInfo *isi, unsigned int *dest,
+ int dw, int dh, int dow, int sow);
+template<bool RGB>
+void qt_qimageScaleAARGBA_down_xy_neon(QImageScaleInfo *isi, unsigned int *dest,
+ int dw, int dh, int dow, int sow);
+#endif
+
static void qt_qimageScaleAARGBA_up_xy(QImageScaleInfo *isi, unsigned int *dest,
int dw, int dh, int dow, int sow)
{
@@ -296,7 +308,7 @@ static void qt_qimageScaleAARGBA_up_xy(QImageScaleInfo *isi, unsigned int *dest,
const unsigned int *pix = sptr + xpoints[x];
const int xap = xapoints[x];
if (xap > 0)
- *dptr = interpolate_4_pixels(pix[0], pix[1], pix[sow], pix[sow + 1], xap, yap);
+ *dptr = interpolate_4_pixels(pix, pix + sow, xap, yap);
else
*dptr = INTERPOLATE_PIXEL_256(pix[0], 256 - yap, pix[sow], yap);
dptr++;
@@ -329,6 +341,10 @@ static void qt_qimageScaleAARGBA(QImageScaleInfo *isi, unsigned int *dest,
if (qCpuHasFeature(SSE4_1))
qt_qimageScaleAARGBA_up_x_down_y_sse4<false>(isi, dest, dw, dh, dow, sow);
else
+#elif defined(__ARM_NEON__)
+ if (qCpuHasFeature(NEON))
+ qt_qimageScaleAARGBA_up_x_down_y_neon<false>(isi, dest, dw, dh, dow, sow);
+ else
#endif
qt_qimageScaleAARGBA_up_x_down_y(isi, dest, dw, dh, dow, sow);
}
@@ -338,6 +354,10 @@ static void qt_qimageScaleAARGBA(QImageScaleInfo *isi, unsigned int *dest,
if (qCpuHasFeature(SSE4_1))
qt_qimageScaleAARGBA_down_x_up_y_sse4<false>(isi, dest, dw, dh, dow, sow);
else
+#elif defined(__ARM_NEON__)
+ if (qCpuHasFeature(NEON))
+ qt_qimageScaleAARGBA_down_x_up_y_neon<false>(isi, dest, dw, dh, dow, sow);
+ else
#endif
qt_qimageScaleAARGBA_down_x_up_y(isi, dest, dw, dh, dow, sow);
}
@@ -347,6 +367,10 @@ static void qt_qimageScaleAARGBA(QImageScaleInfo *isi, unsigned int *dest,
if (qCpuHasFeature(SSE4_1))
qt_qimageScaleAARGBA_down_xy_sse4<false>(isi, dest, dw, dh, dow, sow);
else
+#elif defined(__ARM_NEON__)
+ if (qCpuHasFeature(NEON))
+ qt_qimageScaleAARGBA_down_xy_neon<false>(isi, dest, dw, dh, dow, sow);
+ else
#endif
qt_qimageScaleAARGBA_down_xy(isi, dest, dw, dh, dow, sow);
}
@@ -522,6 +546,10 @@ static void qt_qimageScaleAARGB(QImageScaleInfo *isi, unsigned int *dest,
if (qCpuHasFeature(SSE4_1))
qt_qimageScaleAARGBA_up_x_down_y_sse4<true>(isi, dest, dw, dh, dow, sow);
else
+#elif defined(__ARM_NEON__)
+ if (qCpuHasFeature(NEON))
+ qt_qimageScaleAARGBA_up_x_down_y_neon<true>(isi, dest, dw, dh, dow, sow);
+ else
#endif
qt_qimageScaleAARGB_up_x_down_y(isi, dest, dw, dh, dow, sow);
}
@@ -531,6 +559,10 @@ static void qt_qimageScaleAARGB(QImageScaleInfo *isi, unsigned int *dest,
if (qCpuHasFeature(SSE4_1))
qt_qimageScaleAARGBA_down_x_up_y_sse4<true>(isi, dest, dw, dh, dow, sow);
else
+#elif defined(__ARM_NEON__)
+ if (qCpuHasFeature(NEON))
+ qt_qimageScaleAARGBA_down_x_up_y_neon<true>(isi, dest, dw, dh, dow, sow);
+ else
#endif
qt_qimageScaleAARGB_down_x_up_y(isi, dest, dw, dh, dow, sow);
}
@@ -540,6 +572,10 @@ static void qt_qimageScaleAARGB(QImageScaleInfo *isi, unsigned int *dest,
if (qCpuHasFeature(SSE4_1))
qt_qimageScaleAARGBA_down_xy_sse4<true>(isi, dest, dw, dh, dow, sow);
else
+#elif defined(__ARM_NEON__)
+ if (qCpuHasFeature(NEON))
+ qt_qimageScaleAARGBA_down_xy_neon<true>(isi, dest, dw, dh, dow, sow);
+ else
#endif
qt_qimageScaleAARGB_down_xy(isi, dest, dw, dh, dow, sow);
}
diff --git a/src/gui/painting/qimagescale_neon.cpp b/src/gui/painting/qimagescale_neon.cpp
new file mode 100644
index 0000000000..88389bebb9
--- /dev/null
+++ b/src/gui/painting/qimagescale_neon.cpp
@@ -0,0 +1,209 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qimagescale_p.h"
+#include "qimage.h"
+#include <private/qsimd_p.h>
+
+#if defined(__ARM_NEON__)
+
+QT_BEGIN_NAMESPACE
+
+using namespace QImageScale;
+
+inline static uint32x4_t qt_qimageScaleAARGBA_helper(const unsigned int *pix, int xyap, int Cxy, int step)
+{
+ uint32x2_t vpix32 = vmov_n_u32(*pix);
+ uint16x4_t vpix16 = vget_low_u16(vmovl_u8(vreinterpret_u8_u32(vpix32)));
+ uint32x4_t vx = vmull_n_u16(vpix16, xyap);
+ int i;
+ for (i = (1 << 14) - xyap; i > Cxy; i -= Cxy) {
+ pix += step;
+ vpix32 = vmov_n_u32(*pix);
+ vpix16 = vget_low_u16(vmovl_u8(vreinterpret_u8_u32(vpix32)));
+ vx = vaddq_u32(vx, vmull_n_u16(vpix16, Cxy));
+ }
+ pix += step;
+ vpix32 = vmov_n_u32(*pix);
+ vpix16 = vget_low_u16(vmovl_u8(vreinterpret_u8_u32(vpix32)));
+ vx = vaddq_u32(vx, vmull_n_u16(vpix16, i));
+ return vx;
+}
+
+template<bool RGB>
+void qt_qimageScaleAARGBA_up_x_down_y_neon(QImageScaleInfo *isi, unsigned int *dest,
+ int dw, int dh, int dow, int sow)
+{
+ const unsigned int **ypoints = isi->ypoints;
+ int *xpoints = isi->xpoints;
+ int *xapoints = isi->xapoints;
+ int *yapoints = isi->yapoints;
+
+ /* go through every scanline in the output buffer */
+ for (int y = 0; y < dh; y++) {
+ int Cy = yapoints[y] >> 16;
+ int yap = yapoints[y] & 0xffff;
+
+ unsigned int *dptr = dest + (y * dow);
+ for (int x = 0; x < dw; x++) {
+ const unsigned int *sptr = ypoints[y] + xpoints[x];
+ uint32x4_t vx = qt_qimageScaleAARGBA_helper(sptr, yap, Cy, sow);
+
+ int xap = xapoints[x];
+ if (xap > 0) {
+ uint32x4_t vr = qt_qimageScaleAARGBA_helper(sptr + 1, yap, Cy, sow);
+
+ vx = vmulq_n_u32(vx, 256 - xap);
+ vr = vmulq_n_u32(vr, xap);
+ vx = vaddq_u32(vx, vr);
+ vx = vshrq_n_u32(vx, 8);
+ }
+ vx = vshrq_n_u32(vx, 14);
+ const uint16x4_t vx16 = vmovn_u32(vx);
+ const uint8x8_t vx8 = vmovn_u16(vcombine_u16(vx16, vx16));
+ *dptr = vget_lane_u32(vreinterpret_u32_u8(vx8), 0);
+ if (RGB)
+ *dptr |= 0xff000000;
+ dptr++;
+ }
+ }
+}
+
+template<bool RGB>
+void qt_qimageScaleAARGBA_down_x_up_y_neon(QImageScaleInfo *isi, unsigned int *dest,
+ int dw, int dh, int dow, int sow)
+{
+ const unsigned int **ypoints = isi->ypoints;
+ int *xpoints = isi->xpoints;
+ int *xapoints = isi->xapoints;
+ int *yapoints = isi->yapoints;
+
+ /* go through every scanline in the output buffer */
+ for (int y = 0; y < dh; y++) {
+ unsigned int *dptr = dest + (y * dow);
+ for (int x = 0; x < dw; x++) {
+ int Cx = xapoints[x] >> 16;
+ int xap = xapoints[x] & 0xffff;
+
+ const unsigned int *sptr = ypoints[y] + xpoints[x];
+ uint32x4_t vx = qt_qimageScaleAARGBA_helper(sptr, xap, Cx, 1);
+
+ int yap = yapoints[y];
+ if (yap > 0) {
+ uint32x4_t vr = qt_qimageScaleAARGBA_helper(sptr + sow, xap, Cx, 1);
+
+ vx = vmulq_n_u32(vx, 256 - yap);
+ vr = vmulq_n_u32(vr, yap);
+ vx = vaddq_u32(vx, vr);
+ vx = vshrq_n_u32(vx, 8);
+ }
+ vx = vshrq_n_u32(vx, 14);
+ const uint16x4_t vx16 = vmovn_u32(vx);
+ const uint8x8_t vx8 = vmovn_u16(vcombine_u16(vx16, vx16));
+ *dptr = vget_lane_u32(vreinterpret_u32_u8(vx8), 0);
+ if (RGB)
+ *dptr |= 0xff000000;
+ dptr++;
+ }
+ }
+}
+
+template<bool RGB>
+void qt_qimageScaleAARGBA_down_xy_neon(QImageScaleInfo *isi, unsigned int *dest,
+ int dw, int dh, int dow, int sow)
+{
+ const unsigned int **ypoints = isi->ypoints;
+ int *xpoints = isi->xpoints;
+ int *xapoints = isi->xapoints;
+ int *yapoints = isi->yapoints;
+
+ for (int y = 0; y < dh; y++) {
+ int Cy = yapoints[y] >> 16;
+ int yap = yapoints[y] & 0xffff;
+
+ unsigned int *dptr = dest + (y * dow);
+ for (int x = 0; x < dw; x++) {
+ const int Cx = xapoints[x] >> 16;
+ const int xap = xapoints[x] & 0xffff;
+
+ const unsigned int *sptr = ypoints[y] + xpoints[x];
+ uint32x4_t vx = qt_qimageScaleAARGBA_helper(sptr, xap, Cx, 1);
+ vx = vshrq_n_u32(vx, 4);
+ uint32x4_t vr = vmulq_n_u32(vx, yap);
+
+ int j;
+ for (j = (1 << 14) - yap; j > Cy; j -= Cy) {
+ sptr += sow;
+ vx = qt_qimageScaleAARGBA_helper(sptr, xap, Cx, 1);
+ vx = vshrq_n_u32(vx, 4);
+ vx = vmulq_n_u32(vx, Cy);
+ vr = vaddq_u32(vr, vx);
+ }
+ sptr += sow;
+ vx = qt_qimageScaleAARGBA_helper(sptr, xap, Cx, 1);
+ vx = vshrq_n_u32(vx, 4);
+ vx = vmulq_n_u32(vx, j);
+ vr = vaddq_u32(vr, vx);
+
+ vx = vshrq_n_u32(vr, 24);
+ const uint16x4_t vx16 = vmovn_u32(vx);
+ const uint8x8_t vx8 = vmovn_u16(vcombine_u16(vx16, vx16));
+ *dptr = vget_lane_u32(vreinterpret_u32_u8(vx8), 0);
+ if (RGB)
+ *dptr |= 0xff000000;
+ dptr++;
+ }
+ }
+}
+
+template void qt_qimageScaleAARGBA_up_x_down_y_neon<false>(QImageScaleInfo *isi, unsigned int *dest,
+ int dw, int dh, int dow, int sow);
+
+template void qt_qimageScaleAARGBA_up_x_down_y_neon<true>(QImageScaleInfo *isi, unsigned int *dest,
+ int dw, int dh, int dow, int sow);
+
+template void qt_qimageScaleAARGBA_down_x_up_y_neon<false>(QImageScaleInfo *isi, unsigned int *dest,
+ int dw, int dh, int dow, int sow);
+
+template void qt_qimageScaleAARGBA_down_x_up_y_neon<true>(QImageScaleInfo *isi, unsigned int *dest,
+ int dw, int dh, int dow, int sow);
+
+template void qt_qimageScaleAARGBA_down_xy_neon<false>(QImageScaleInfo *isi, unsigned int *dest,
+ int dw, int dh, int dow, int sow);
+
+template void qt_qimageScaleAARGBA_down_xy_neon<true>(QImageScaleInfo *isi, unsigned int *dest,
+ int dw, int dh, int dow, int sow);
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/gui/painting/qpaintengine_blitter.cpp b/src/gui/painting/qpaintengine_blitter.cpp
index a2bab58922..aa4a609d6c 100644
--- a/src/gui/painting/qpaintengine_blitter.cpp
+++ b/src/gui/painting/qpaintengine_blitter.cpp
@@ -190,7 +190,7 @@ private:
}
void setSourcePixmapMask() {
- updateStateBits(&drawPixmapMask, STATE_XFORM_SCALE, true);
+ updateStateBits(&drawPixmapMask, STATE_XFORM_SCALE, false);
updateStateBits(&drawPixmapMask, STATE_XFORM_COMPLEX, false);
updateStateBits(&drawPixmapMask, STATE_BRUSH_PATTERN, true);
@@ -212,7 +212,7 @@ private:
void setSourceOverScaledPixmapMask() {
setSourceOverPixmapMask();
- updateStateBits(&drawRectMask, STATE_XFORM_SCALE, true);
+ updateStateBits(&drawPixmapMask, STATE_XFORM_SCALE, true);
}
void setOpacityPixmapMask() {
diff --git a/src/gui/painting/qpaintengine_blitter_p.h b/src/gui/painting/qpaintengine_blitter_p.h
index ab44851ec7..17a648176c 100644
--- a/src/gui/painting/qpaintengine_blitter_p.h
+++ b/src/gui/painting/qpaintengine_blitter_p.h
@@ -60,46 +60,48 @@ class Q_GUI_EXPORT QBlitterPaintEngine : public QRasterPaintEngine
public:
QBlitterPaintEngine(QBlittablePlatformPixmap *p);
- virtual QPaintEngine::Type type() const { return Blitter; }
+ virtual QPaintEngine::Type type() const Q_DECL_OVERRIDE
+ { return Blitter; }
- virtual bool begin(QPaintDevice *pdev);
- virtual bool end();
+ virtual bool begin(QPaintDevice *pdev) Q_DECL_OVERRIDE;
+ virtual bool end() Q_DECL_OVERRIDE;
// Call down into QBlittable
- virtual void fill(const QVectorPath &path, const QBrush &brush);
- virtual void fillRect(const QRectF &rect, const QBrush &brush);
- virtual void fillRect(const QRectF &rect, const QColor &color);
- virtual void drawRects(const QRect *rects, int rectCount);
- virtual void drawRects(const QRectF *rects, int rectCount);
- void drawPixmap(const QPointF &p, const QPixmap &pm);
- void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr);
+ void fill(const QVectorPath &path, const QBrush &brush) Q_DECL_OVERRIDE;
+ void fillRect(const QRectF &rect, const QBrush &brush) Q_DECL_OVERRIDE;
+ void fillRect(const QRectF &rect, const QColor &color) Q_DECL_OVERRIDE;
+ void drawRects(const QRect *rects, int rectCount) Q_DECL_OVERRIDE;
+ void drawRects(const QRectF *rects, int rectCount) Q_DECL_OVERRIDE;
+ void drawPixmap(const QPointF &p, const QPixmap &pm) Q_DECL_OVERRIDE;
+ void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) Q_DECL_OVERRIDE;
// State tracking
- void setState(QPainterState *s);
- virtual void clipEnabledChanged();
- virtual void penChanged();
- virtual void brushChanged();
- virtual void opacityChanged();
- virtual void compositionModeChanged();
- virtual void renderHintsChanged();
- virtual void transformChanged();
+ void setState(QPainterState *s) Q_DECL_OVERRIDE;
+ virtual void clipEnabledChanged() Q_DECL_OVERRIDE;
+ virtual void penChanged() Q_DECL_OVERRIDE;
+ virtual void brushChanged() Q_DECL_OVERRIDE;
+ virtual void opacityChanged() Q_DECL_OVERRIDE;
+ virtual void compositionModeChanged() Q_DECL_OVERRIDE;
+ virtual void renderHintsChanged() Q_DECL_OVERRIDE;
+ virtual void transformChanged() Q_DECL_OVERRIDE;
// Override to lock the QBlittable before using raster
- void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode);
- void drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode);
- void fillPath(const QPainterPath &path, QSpanData *fillData);
- void fillPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode);
- void drawEllipse(const QRectF &rect);
- void drawImage(const QPointF &p, const QImage &img);
+ void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) Q_DECL_OVERRIDE;
+ void drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode) Q_DECL_OVERRIDE;
+ void fillPath(const QPainterPath &path, QSpanData *fillData) Q_DECL_OVERRIDE;
+ void fillPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) Q_DECL_OVERRIDE;
+ void drawEllipse(const QRectF &rect) Q_DECL_OVERRIDE;
+ void drawImage(const QPointF &p, const QImage &img) Q_DECL_OVERRIDE;
void drawImage(const QRectF &r, const QImage &pm, const QRectF &sr,
- Qt::ImageConversionFlags flags = Qt::AutoColor);
- void drawTiledPixmap(const QRectF &r, const QPixmap &pm, const QPointF &sr);
- void drawTextItem(const QPointF &p, const QTextItem &textItem);
- void drawPoints(const QPointF *points, int pointCount);
- void drawPoints(const QPoint *points, int pointCount);
- void stroke(const QVectorPath &path, const QPen &pen);
- void drawStaticTextItem(QStaticTextItem *);
- bool drawCachedGlyphs(int numGlyphs, const glyph_t *glyphs, const QFixedPoint *positions, QFontEngine *fontEngine);
+ Qt::ImageConversionFlags flags = Qt::AutoColor) Q_DECL_OVERRIDE;
+ void drawTiledPixmap(const QRectF &r, const QPixmap &pm, const QPointF &sr) Q_DECL_OVERRIDE;
+ void drawTextItem(const QPointF &p, const QTextItem &textItem) Q_DECL_OVERRIDE;
+ void drawPoints(const QPointF *points, int pointCount) Q_DECL_OVERRIDE;
+ void drawPoints(const QPoint *points, int pointCount) Q_DECL_OVERRIDE;
+ void stroke(const QVectorPath &path, const QPen &pen) Q_DECL_OVERRIDE;
+ void drawStaticTextItem(QStaticTextItem *) Q_DECL_OVERRIDE;
+ bool drawCachedGlyphs(int numGlyphs, const glyph_t *glyphs, const QFixedPoint *positions,
+ QFontEngine *fontEngine) Q_DECL_OVERRIDE;
};
QT_END_NAMESPACE
diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp
index 207e31d91a..8409481ad5 100644
--- a/src/gui/painting/qpaintengine_raster.cpp
+++ b/src/gui/painting/qpaintengine_raster.cpp
@@ -1338,9 +1338,9 @@ void QRasterPaintEngine::clip(const QRegion &region, Qt::ClipOperation op)
*/
-/*!
- \internal
-*/
+///*!
+// \internal
+//*/
void QRasterPaintEngine::fillPath(const QPainterPath &path, QSpanData *fillData)
{
#ifdef QT_DEBUG_DRAW
diff --git a/src/gui/painting/qpaintengine_raster_p.h b/src/gui/painting/qpaintengine_raster_p.h
index 4e6e0b2f73..7ac1630692 100644
--- a/src/gui/painting/qpaintengine_raster_p.h
+++ b/src/gui/painting/qpaintengine_raster_p.h
@@ -128,20 +128,20 @@ public:
QRasterPaintEngine(QPaintDevice *device);
~QRasterPaintEngine();
- bool begin(QPaintDevice *device);
- bool end();
-
- void penChanged();
- void brushChanged();
- void brushOriginChanged();
- void opacityChanged();
- void compositionModeChanged();
- void renderHintsChanged();
- void transformChanged();
- void clipEnabledChanged();
-
- void setState(QPainterState *s);
- QPainterState *createState(QPainterState *orig) const;
+ bool begin(QPaintDevice *device) Q_DECL_OVERRIDE;
+ bool end() Q_DECL_OVERRIDE;
+
+ void penChanged() Q_DECL_OVERRIDE;
+ void brushChanged() Q_DECL_OVERRIDE;
+ void brushOriginChanged() Q_DECL_OVERRIDE;
+ void opacityChanged() Q_DECL_OVERRIDE;
+ void compositionModeChanged() Q_DECL_OVERRIDE;
+ void renderHintsChanged() Q_DECL_OVERRIDE;
+ void transformChanged() Q_DECL_OVERRIDE;
+ void clipEnabledChanged() Q_DECL_OVERRIDE;
+
+ void setState(QPainterState *s) Q_DECL_OVERRIDE;
+ QPainterState *createState(QPainterState *orig) const Q_DECL_OVERRIDE;
inline QRasterPaintEngineState *state() {
return static_cast<QRasterPaintEngineState *>(QPaintEngineEx::state());
}
@@ -154,42 +154,43 @@ public:
void updateMatrix(const QTransform &matrix);
- void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode);
- void drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode);
- void fillPath(const QPainterPath &path, QSpanData *fillData);
- void fillPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode);
+ virtual void fillPath(const QPainterPath &path, QSpanData *fillData);
+ virtual void fillPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode);
- void drawEllipse(const QRectF &rect);
+ void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode) Q_DECL_OVERRIDE;
+ void drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode) Q_DECL_OVERRIDE;
- void fillRect(const QRectF &rect, const QBrush &brush);
- void fillRect(const QRectF &rect, const QColor &color);
+ void drawEllipse(const QRectF &rect) Q_DECL_OVERRIDE;
- void drawRects(const QRect *rects, int rectCount);
- void drawRects(const QRectF *rects, int rectCount);
+ void fillRect(const QRectF &rect, const QBrush &brush) Q_DECL_OVERRIDE;
+ void fillRect(const QRectF &rect, const QColor &color) Q_DECL_OVERRIDE;
- void drawPixmap(const QPointF &p, const QPixmap &pm);
- void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr);
- void drawImage(const QPointF &p, const QImage &img);
+ void drawRects(const QRect *rects, int rectCount) Q_DECL_OVERRIDE;
+ void drawRects(const QRectF *rects, int rectCount) Q_DECL_OVERRIDE;
+
+ void drawPixmap(const QPointF &p, const QPixmap &pm) Q_DECL_OVERRIDE;
+ void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) Q_DECL_OVERRIDE;
+ void drawImage(const QPointF &p, const QImage &img) Q_DECL_OVERRIDE;
void drawImage(const QRectF &r, const QImage &pm, const QRectF &sr,
- Qt::ImageConversionFlags flags = Qt::AutoColor);
- void drawTiledPixmap(const QRectF &r, const QPixmap &pm, const QPointF &sr);
- void drawTextItem(const QPointF &p, const QTextItem &textItem);
+ Qt::ImageConversionFlags flags = Qt::AutoColor) Q_DECL_OVERRIDE;
+ void drawTiledPixmap(const QRectF &r, const QPixmap &pm, const QPointF &sr) Q_DECL_OVERRIDE;
+ void drawTextItem(const QPointF &p, const QTextItem &textItem) Q_DECL_OVERRIDE;
- void drawLines(const QLine *line, int lineCount);
- void drawLines(const QLineF *line, int lineCount);
+ void drawLines(const QLine *line, int lineCount) Q_DECL_OVERRIDE;
+ void drawLines(const QLineF *line, int lineCount) Q_DECL_OVERRIDE;
- void drawPoints(const QPointF *points, int pointCount);
- void drawPoints(const QPoint *points, int pointCount);
+ void drawPoints(const QPointF *points, int pointCount) Q_DECL_OVERRIDE;
+ void drawPoints(const QPoint *points, int pointCount) Q_DECL_OVERRIDE;
- void stroke(const QVectorPath &path, const QPen &pen);
- void fill(const QVectorPath &path, const QBrush &brush);
+ void stroke(const QVectorPath &path, const QPen &pen) Q_DECL_OVERRIDE;
+ void fill(const QVectorPath &path, const QBrush &brush) Q_DECL_OVERRIDE;
- void clip(const QVectorPath &path, Qt::ClipOperation op);
- void clip(const QRect &rect, Qt::ClipOperation op);
- void clip(const QRegion &region, Qt::ClipOperation op);
+ void clip(const QVectorPath &path, Qt::ClipOperation op) Q_DECL_OVERRIDE;
+ void clip(const QRect &rect, Qt::ClipOperation op) Q_DECL_OVERRIDE;
+ void clip(const QRegion &region, Qt::ClipOperation op) Q_DECL_OVERRIDE;
inline const QClipData *clipData() const;
- void drawStaticTextItem(QStaticTextItem *textItem);
+ void drawStaticTextItem(QStaticTextItem *textItem) Q_DECL_OVERRIDE;
virtual bool drawCachedGlyphs(int numGlyphs, const glyph_t *glyphs, const QFixedPoint *positions,
QFontEngine *fontEngine);
@@ -219,12 +220,12 @@ public:
QRasterBuffer *rasterBuffer();
void alphaPenBlt(const void* src, int bpl, int depth, int rx,int ry,int w,int h);
- Type type() const { return Raster; }
+ Type type() const Q_DECL_OVERRIDE { return Raster; }
- QPoint coordinateOffset() const;
+ QPoint coordinateOffset() const Q_DECL_OVERRIDE;
- bool requiresPretransformedGlyphPositions(QFontEngine *fontEngine, const QTransform &m) const;
- bool shouldDrawCachedGlyphs(QFontEngine *fontEngine, const QTransform &m) const;
+ bool requiresPretransformedGlyphPositions(QFontEngine *fontEngine, const QTransform &m) const Q_DECL_OVERRIDE;
+ bool shouldDrawCachedGlyphs(QFontEngine *fontEngine, const QTransform &m) const Q_DECL_OVERRIDE;
protected:
QRasterPaintEngine(QRasterPaintEnginePrivate &d, QPaintDevice *);
diff --git a/src/gui/painting/qpainterpath.cpp b/src/gui/painting/qpainterpath.cpp
index 48010c0a71..558ab81847 100644
--- a/src/gui/painting/qpainterpath.cpp
+++ b/src/gui/painting/qpainterpath.cpp
@@ -1856,6 +1856,8 @@ bool QPainterPath::contains(const QPointF &pt) const
: ((winding_number % 2) != 0));
}
+enum PainterDirections { Left, Right, Top, Bottom };
+
static bool qt_painterpath_isect_line_rect(qreal x1, qreal y1, qreal x2, qreal y2,
const QRectF &rect)
{
@@ -1864,7 +1866,6 @@ static bool qt_painterpath_isect_line_rect(qreal x1, qreal y1, qreal x2, qreal y
qreal top = rect.top();
qreal bottom = rect.bottom();
- enum { Left, Right, Top, Bottom };
// clip the lines, after cohen-sutherland, see e.g. http://www.nondot.org/~sabre/graphpro/line6.html
int p1 = ((x1 < left) << Left)
| ((x1 > right) << Right)
diff --git a/src/gui/painting/qrgba64.h b/src/gui/painting/qrgba64.h
index fab9506ff2..51b37b2ef4 100644
--- a/src/gui/painting/qrgba64.h
+++ b/src/gui/painting/qrgba64.h
@@ -44,7 +44,7 @@ class QRgba64 {
// Make sure that the representation always has the order: red green blue alpha, independent
// of byte order. This way, vector operations that assume 4 16-bit values see the correct ones.
- enum {
+ enum Shifts {
#if Q_BYTE_ORDER == Q_BIG_ENDIAN
RedShift = 48,
GreenShift = 32,
diff --git a/src/gui/text/qfont.cpp b/src/gui/text/qfont.cpp
index 947c538234..ed4a932a32 100644
--- a/src/gui/text/qfont.cpp
+++ b/src/gui/text/qfont.cpp
@@ -549,7 +549,7 @@ QFont::QFont(const QFont &font, QPaintDevice *pd)
d->dpi = dpi;
d->screen = screen;
} else {
- d = font.d.data();
+ d = font.d;
}
}
@@ -654,7 +654,7 @@ QFont::QFont(const QString &family, int pointSize, int weight, bool italic)
Constructs a font that is a copy of \a font.
*/
QFont::QFont(const QFont &font)
- : d(font.d.data()), resolve_mask(font.resolve_mask)
+ : d(font.d), resolve_mask(font.resolve_mask)
{
}
@@ -670,7 +670,7 @@ QFont::~QFont()
*/
QFont &QFont::operator=(const QFont &font)
{
- d = font.d.data();
+ d = font.d;
resolve_mask = font.resolve_mask;
return *this;
}
@@ -1647,8 +1647,8 @@ bool QFont::operator<(const QFont &f) const
{
if (f.d == d) return false;
// the < operator for fontdefs ignores point sizes.
- QFontDef &r1 = f.d->request;
- QFontDef &r2 = d->request;
+ const QFontDef &r1 = f.d->request;
+ const QFontDef &r2 = d->request;
if (r1.pointSize != r2.pointSize) return r1.pointSize < r2.pointSize;
if (r1.pixelSize != r2.pixelSize) return r1.pixelSize < r2.pixelSize;
if (r1.weight != r2.weight) return r1.weight < r2.weight;
@@ -2388,7 +2388,7 @@ QDataStream &operator>>(QDataStream &s, QFont &font)
that is not screen-compatible.
*/
QFontInfo::QFontInfo(const QFont &font)
- : d(font.d.data())
+ : d(font.d)
{
}
@@ -2396,7 +2396,7 @@ QFontInfo::QFontInfo(const QFont &font)
Constructs a copy of \a fi.
*/
QFontInfo::QFontInfo(const QFontInfo &fi)
- : d(fi.d.data())
+ : d(fi.d)
{
}
@@ -2412,7 +2412,7 @@ QFontInfo::~QFontInfo()
*/
QFontInfo &QFontInfo::operator=(const QFontInfo &fi)
{
- d = fi.d.data();
+ d = fi.d;
return *this;
}
diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp
index 1b9852c20c..2f8af2315d 100644
--- a/src/gui/text/qfontdatabase.cpp
+++ b/src/gui/text/qfontdatabase.cpp
@@ -1388,7 +1388,7 @@ QString QFontDatabase::styleString(const QFontInfo &fontInfo)
*/
QFontDatabase::QFontDatabase()
{
- if (!qApp || !QGuiApplicationPrivate::platformIntegration())
+ if (Q_UNLIKELY(!qApp || !QGuiApplicationPrivate::platformIntegration()))
qFatal("QFontDatabase: Must construct a QGuiApplication before accessing QFontDatabase");
QMutexLocker locker(fontDatabaseMutex());
diff --git a/src/gui/text/qfontmetrics.cpp b/src/gui/text/qfontmetrics.cpp
index 5bc9fe3c7f..0fc7fc9242 100644
--- a/src/gui/text/qfontmetrics.cpp
+++ b/src/gui/text/qfontmetrics.cpp
@@ -145,7 +145,7 @@ extern void qt_format_text(const QFont& font, const QRectF &_r,
metrics that are compatible with a certain paint device.
*/
QFontMetrics::QFontMetrics(const QFont &font)
- : d(font.d.data())
+ : d(font.d)
{
}
@@ -171,7 +171,7 @@ QFontMetrics::QFontMetrics(const QFont &font, QPaintDevice *paintdevice)
d->dpi = dpi;
d->screen = screen;
} else {
- d = font.d.data();
+ d = font.d;
}
}
@@ -180,7 +180,7 @@ QFontMetrics::QFontMetrics(const QFont &font, QPaintDevice *paintdevice)
Constructs a copy of \a fm.
*/
QFontMetrics::QFontMetrics(const QFontMetrics &fm)
- : d(fm.d.data())
+ : d(fm.d)
{
}
@@ -197,7 +197,7 @@ QFontMetrics::~QFontMetrics()
*/
QFontMetrics &QFontMetrics::operator=(const QFontMetrics &fm)
{
- d = fm.d.data();
+ d = fm.d;
return *this;
}
@@ -995,7 +995,7 @@ int QFontMetrics::lineWidth() const
from the given \a fontMetrics object.
*/
QFontMetricsF::QFontMetricsF(const QFontMetrics &fontMetrics)
- : d(fontMetrics.d.data())
+ : d(fontMetrics.d)
{
}
@@ -1006,7 +1006,7 @@ QFontMetricsF::QFontMetricsF(const QFontMetrics &fontMetrics)
*/
QFontMetricsF &QFontMetricsF::operator=(const QFontMetrics &other)
{
- d = other.d.data();
+ d = other.d;
return *this;
}
@@ -1034,7 +1034,7 @@ QFontMetricsF &QFontMetricsF::operator=(const QFontMetrics &other)
metrics that are compatible with a certain paint device.
*/
QFontMetricsF::QFontMetricsF(const QFont &font)
- : d(font.d.data())
+ : d(font.d)
{
}
@@ -1060,7 +1060,7 @@ QFontMetricsF::QFontMetricsF(const QFont &font, QPaintDevice *paintdevice)
d->dpi = dpi;
d->screen = screen;
} else {
- d = font.d.data();
+ d = font.d;
}
}
@@ -1069,7 +1069,7 @@ QFontMetricsF::QFontMetricsF(const QFont &font, QPaintDevice *paintdevice)
Constructs a copy of \a fm.
*/
QFontMetricsF::QFontMetricsF(const QFontMetricsF &fm)
- : d(fm.d.data())
+ : d(fm.d)
{
}
@@ -1086,7 +1086,7 @@ QFontMetricsF::~QFontMetricsF()
*/
QFontMetricsF &QFontMetricsF::operator=(const QFontMetricsF &fm)
{
- d = fm.d.data();
+ d = fm.d;
return *this;
}
diff --git a/src/gui/text/qplatformfontdatabase.cpp b/src/gui/text/qplatformfontdatabase.cpp
index 0695c2eff4..113e1d89d4 100644
--- a/src/gui/text/qplatformfontdatabase.cpp
+++ b/src/gui/text/qplatformfontdatabase.cpp
@@ -511,7 +511,7 @@ static const quint8 requiredUnicodeBits[QFontDatabase::WritingSystemsCount][2] =
{ 14, 127 }, // Nko
};
-enum {
+enum CsbBits {
Latin1CsbBit = 0,
CentralEuropeCsbBit = 1,
TurkishCsbBit = 4,
diff --git a/src/gui/text/qrawfont.cpp b/src/gui/text/qrawfont.cpp
index 0fd5f510c7..b74ce23631 100644
--- a/src/gui/text/qrawfont.cpp
+++ b/src/gui/text/qrawfont.cpp
@@ -44,6 +44,7 @@
#include <qpa/qplatformfontdatabase.h>
#include <QtCore/qendian.h>
+#include <QtCore/qfile.h>
QT_BEGIN_NAMESPACE
@@ -687,7 +688,7 @@ extern int qt_script_for_writing_system(QFontDatabase::WritingSystem writingSyst
QRawFont QRawFont::fromFont(const QFont &font, QFontDatabase::WritingSystem writingSystem)
{
QRawFont rawFont;
- QFontPrivate *font_d = QFontPrivate::get(font);
+ const QFontPrivate *font_d = QFontPrivate::get(font);
int script = qt_script_for_writing_system(writingSystem);
QFontEngine *fe = font_d->engineForScript(script);
diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp
index 1c924175e2..2f755d0c25 100644
--- a/src/gui/text/qtextengine.cpp
+++ b/src/gui/text/qtextengine.cpp
@@ -1548,7 +1548,7 @@ void QTextEngine::validate() const
if (block.docHandle()) {
layoutData->string = block.text();
if (option.flags() & QTextOption::ShowLineAndParagraphSeparators)
- layoutData->string += QLatin1Char(block.next().isValid() ? 0xb6 : 0x20);
+ layoutData->string += QLatin1Char(block.next().isValid() ? 0xb6 : 0xA7);
} else {
layoutData->string = text;
}
diff --git a/src/gui/text/qtexthtmlparser.cpp b/src/gui/text/qtexthtmlparser.cpp
index f8f41bb53d..a09ed2c040 100644
--- a/src/gui/text/qtexthtmlparser.cpp
+++ b/src/gui/text/qtexthtmlparser.cpp
@@ -1140,6 +1140,7 @@ void QTextHtmlParserNode::setListStyle(const QVector<QCss::Value> &cssValues)
for (int i = 0; i < cssValues.count(); ++i) {
if (cssValues.at(i).type == QCss::Value::KnownIdentifier) {
switch (static_cast<QCss::KnownValue>(cssValues.at(i).variant.toInt())) {
+ case QCss::Value_None: hasOwnListStyle = true; listStyle = QTextListFormat::ListStyleUndefined; break;
case QCss::Value_Disc: hasOwnListStyle = true; listStyle = QTextListFormat::ListDisc; break;
case QCss::Value_Square: hasOwnListStyle = true; listStyle = QTextListFormat::ListSquare; break;
case QCss::Value_Circle: hasOwnListStyle = true; listStyle = QTextListFormat::ListCircle; break;
@@ -1495,6 +1496,8 @@ void QTextHtmlParser::applyAttributes(const QStringList &attributes)
node->listStyle = QTextListFormat::ListDisc;
else if (value == QLatin1String("circle"))
node->listStyle = QTextListFormat::ListCircle;
+ else if (value == QLatin1String("none"))
+ node->listStyle = QTextListFormat::ListStyleUndefined;
}
}
break;
diff --git a/src/gui/text/qtextimagehandler.cpp b/src/gui/text/qtextimagehandler.cpp
index 16d81a7d6d..d7a418e7c8 100644
--- a/src/gui/text/qtextimagehandler.cpp
+++ b/src/gui/text/qtextimagehandler.cpp
@@ -38,6 +38,7 @@
#include <qtextformat.h>
#include <qpainter.h>
#include <qdebug.h>
+#include <qfile.h>
#include <private/qtextengine_p.h>
#include <qpalette.h>
#include <qthread.h>
diff --git a/src/gui/text/qtextobject.cpp b/src/gui/text/qtextobject.cpp
index df7c8b9c71..6552309dcb 100644
--- a/src/gui/text/qtextobject.cpp
+++ b/src/gui/text/qtextobject.cpp
@@ -663,6 +663,8 @@ QTextFrame::iterator::iterator(QTextFrame *frame, int block, int begin, int end)
cb = block;
}
+#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
+
/*!
Copy constructor. Constructs a copy of the \a other iterator.
*/
@@ -689,6 +691,8 @@ QTextFrame::iterator &QTextFrame::iterator::operator=(const iterator &other)
return *this;
}
+#endif
+
/*!
Returns the current frame pointed to by the iterator, or 0 if the
iterator currently points to a block.
diff --git a/src/gui/text/qtextobject.h b/src/gui/text/qtextobject.h
index fbb90e42b0..29eeddc414 100644
--- a/src/gui/text/qtextobject.h
+++ b/src/gui/text/qtextobject.h
@@ -143,8 +143,10 @@ public:
iterator(QTextFrame *frame, int block, int begin, int end);
public:
iterator();
+#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
iterator(const iterator &o);
iterator &operator=(const iterator &o);
+#endif
QTextFrame *parentFrame() const { return f; }
@@ -248,7 +250,9 @@ public:
iterator(const QTextDocumentPrivate *priv, int begin, int end, int f) : p(priv), b(begin), e(end), n(f) {}
public:
iterator() : p(Q_NULLPTR), b(0), e(0), n(0) {}
+#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
iterator(const iterator &o) : p(o.p), b(o.b), e(o.e), n(o.n) {}
+#endif
QTextFragment fragment() const;
diff --git a/src/gui/util/qvalidator.cpp b/src/gui/util/qvalidator.cpp
index 31dfd20d1a..aceda62a2a 100644
--- a/src/gui/util/qvalidator.cpp
+++ b/src/gui/util/qvalidator.cpp
@@ -38,6 +38,7 @@
#ifndef QT_NO_VALIDATOR
#include "private/qobject_p.h"
#include "private/qlocale_p.h"
+#include "private/qnumeric_p.h"
#include <limits.h>
#include <cmath>
@@ -398,8 +399,8 @@ static qlonglong pow10(int exp)
QValidator::State QIntValidator::validate(QString & input, int&) const
{
QByteArray buff;
- if (!locale().d->m_data->validateChars(input, QLocaleData::IntegerMode, &buff,
- -1, locale().numberOptions() & QLocale::RejectGroupSeparator)) {
+ if (!locale().d->m_data->validateChars(input, QLocaleData::IntegerMode, &buff, -1,
+ locale().numberOptions())) {
return Invalid;
}
@@ -438,8 +439,8 @@ QValidator::State QIntValidator::validate(QString & input, int&) const
void QIntValidator::fixup(QString &input) const
{
QByteArray buff;
- if (!locale().d->m_data->validateChars(input, QLocaleData::IntegerMode, &buff,
- -1, locale().numberOptions() & QLocale::RejectGroupSeparator)) {
+ if (!locale().d->m_data->validateChars(input, QLocaleData::IntegerMode, &buff, -1,
+ locale().numberOptions())) {
return;
}
bool ok, overflow;
@@ -662,8 +663,7 @@ QValidator::State QDoubleValidatorPrivate::validateWithLocale(QString &input, QL
{
Q_Q(const QDoubleValidator);
QByteArray buff;
- if (!locale.d->m_data->validateChars(input, numMode, &buff, q->dec,
- locale.numberOptions() & QLocale::RejectGroupSeparator)) {
+ if (!locale.d->m_data->validateChars(input, numMode, &buff, q->dec, locale.numberOptions())) {
return QValidator::Invalid;
}
@@ -676,9 +676,9 @@ QValidator::State QDoubleValidatorPrivate::validateWithLocale(QString &input, QL
if (q->t < 0 && buff.startsWith('+'))
return QValidator::Invalid;
- bool ok, overflow;
- double i = QLocaleData::bytearrayToDouble(buff.constData(), &ok, &overflow);
- if (overflow)
+ bool ok = false;
+ double i = buff.toDouble(&ok); // returns 0.0 if !ok
+ if (i == qt_qnan())
return QValidator::Invalid;
if (!ok)
return QValidator::Intermediate;
diff --git a/src/network/access/access.pri b/src/network/access/access.pri
index e829d52cbe..42c7c80f3b 100644
--- a/src/network/access/access.pri
+++ b/src/network/access/access.pri
@@ -78,6 +78,8 @@ ios {
OBJECTIVE_SOURCES += \
access/qnetworkreplynsurlconnectionimpl.mm
+
+ LIBS_PRIVATE += -framework Foundation
}
include($$PWD/../../3rdparty/zlib_dependency.pri)
diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp
index c4cb8e65c0..bfe3eb9252 100644
--- a/src/network/access/qhttpnetworkconnection.cpp
+++ b/src/network/access/qhttpnetworkconnection.cpp
@@ -263,7 +263,7 @@ void QHttpNetworkConnectionPrivate::prepareRequest(HttpMessagePair &messagePair)
request.setContentLength(uploadByteDevice->size());
} else if (request.contentLength() != -1 && uploadByteDevice->size() == -1) {
// everything OK, the user supplied us the contentLength
- } else if (request.contentLength() == -1 && uploadByteDevice->size() == -1) {
+ } else if (Q_UNLIKELY(request.contentLength() == -1 && uploadByteDevice->size() == -1)) {
qFatal("QHttpNetworkConnectionPrivate: Neither content-length nor upload device size were given");
}
}
@@ -1131,7 +1131,7 @@ void QHttpNetworkConnectionPrivate::startHostInfoLookup()
}
-void QHttpNetworkConnectionPrivate::_q_hostLookupFinished(QHostInfo info)
+void QHttpNetworkConnectionPrivate::_q_hostLookupFinished(const QHostInfo &info)
{
bool bIpv4 = false;
bool bIpv6 = false;
diff --git a/src/network/access/qhttpnetworkconnection_p.h b/src/network/access/qhttpnetworkconnection_p.h
index 9af39d416a..fe7f7c9b55 100644
--- a/src/network/access/qhttpnetworkconnection_p.h
+++ b/src/network/access/qhttpnetworkconnection_p.h
@@ -224,7 +224,7 @@ public:
// private slots
void _q_startNextRequest(); // send the next request from the queue
- void _q_hostLookupFinished(QHostInfo info);
+ void _q_hostLookupFinished(const QHostInfo &info);
void _q_connectDelayedChannel();
void createAuthorization(QAbstractSocket *socket, QHttpNetworkRequest &request);
diff --git a/src/network/access/qhttpthreaddelegate_p.h b/src/network/access/qhttpthreaddelegate_p.h
index 784e9c14b8..eb22b40ba0 100644
--- a/src/network/access/qhttpthreaddelegate_p.h
+++ b/src/network/access/qhttpthreaddelegate_p.h
@@ -130,14 +130,14 @@ signals:
#ifndef QT_NO_SSL
void encrypted();
void sslErrors(const QList<QSslError> &, bool *, QList<QSslError> *);
- void sslConfigurationChanged(const QSslConfiguration);
+ void sslConfigurationChanged(const QSslConfiguration &);
void preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *);
#endif
- void downloadMetaData(QList<QPair<QByteArray,QByteArray> >, int, QString, bool,
+ void downloadMetaData(const QList<QPair<QByteArray,QByteArray> > &, int, const QString &, bool,
QSharedPointer<char>, qint64, bool);
void downloadProgress(qint64, qint64);
- void downloadData(QByteArray);
- void error(QNetworkReply::NetworkError, const QString);
+ void downloadData(const QByteArray &);
+ void error(QNetworkReply::NetworkError, const QString &);
void downloadFinished();
void redirected(const QUrl &url, int httpStatus, int maxRedirectsRemainig);
@@ -285,7 +285,7 @@ public:
public slots:
// From user thread:
- void haveDataSlot(qint64 pos, QByteArray dataArray, bool dataAtEnd, qint64 dataSize)
+ void haveDataSlot(qint64 pos, const QByteArray &dataArray, bool dataAtEnd, qint64 dataSize)
{
if (pos != m_pos) {
// Sometimes when re-sending a request in the qhttpnetwork* layer there is a pending haveData from the
diff --git a/src/network/access/qnetworkreplyhttpimpl.cpp b/src/network/access/qnetworkreplyhttpimpl.cpp
index ad8a5321b4..f50502167f 100644
--- a/src/network/access/qnetworkreplyhttpimpl.cpp
+++ b/src/network/access/qnetworkreplyhttpimpl.cpp
@@ -993,7 +993,7 @@ void QNetworkReplyHttpImplPrivate::initCacheSaveDevice()
q->connect(cacheSaveDevice, SIGNAL(aboutToClose()), SLOT(_q_cacheSaveDeviceAboutToClose()));
if (!cacheSaveDevice || (cacheSaveDevice && !cacheSaveDevice->isOpen())) {
- if (cacheSaveDevice && !cacheSaveDevice->isOpen())
+ if (Q_UNLIKELY(cacheSaveDevice && !cacheSaveDevice->isOpen()))
qCritical("QNetworkReplyImpl: network cache returned a device that is not open -- "
"class %s probably needs to be fixed",
managerPrivate->networkCache->metaObject()->className());
@@ -1162,11 +1162,10 @@ void QNetworkReplyHttpImplPrivate::checkForRedirect(const int statusCode)
}
}
-void QNetworkReplyHttpImplPrivate::replyDownloadMetaData
- (QList<QPair<QByteArray,QByteArray> > hm,
- int sc,QString rp,bool pu,
- QSharedPointer<char> db,
- qint64 contentLength, bool spdyWasUsed)
+void QNetworkReplyHttpImplPrivate::replyDownloadMetaData(const QList<QPair<QByteArray,QByteArray> > &hm,
+ int sc, const QString &rp, bool pu,
+ QSharedPointer<char> db,
+ qint64 contentLength, bool spdyWasUsed)
{
Q_Q(QNetworkReplyHttpImpl);
Q_UNUSED(contentLength);
@@ -1733,7 +1732,7 @@ void QNetworkReplyHttpImplPrivate::_q_startOperation()
// ensure this function is only being called once
if (state == Working) {
- qDebug("QNetworkReplyImpl::_q_startOperation was called more than once");
+ qDebug() << "QNetworkReplyHttpImplPrivate::_q_startOperation was called more than once" << url;
return;
}
state = Working;
@@ -2216,7 +2215,7 @@ void QNetworkReplyHttpImplPrivate::setCachingEnabled(bool enable)
return; // nothing to do either!
if (enable) {
- if (bytesDownloaded) {
+ if (Q_UNLIKELY(bytesDownloaded)) {
qDebug() << "setCachingEnabled: " << bytesDownloaded << " bytesDownloaded";
// refuse to enable in this case
qCritical("QNetworkReplyImpl: backend error: caching was enabled after some bytes had been written");
diff --git a/src/network/access/qnetworkreplyhttpimpl_p.h b/src/network/access/qnetworkreplyhttpimpl_p.h
index 44d51d82a4..25762be5f9 100644
--- a/src/network/access/qnetworkreplyhttpimpl_p.h
+++ b/src/network/access/qnetworkreplyhttpimpl_p.h
@@ -147,7 +147,7 @@ signals:
void startHttpRequestSynchronously();
- void haveUploadData(const qint64 pos, QByteArray dataArray, bool dataAtEnd, qint64 dataSize);
+ void haveUploadData(const qint64 pos, const QByteArray &dataArray, bool dataAtEnd, qint64 dataSize);
};
class QNetworkReplyHttpImplPrivate: public QNetworkReplyPrivate
@@ -273,8 +273,8 @@ public:
// From HTTP thread:
void replyDownloadData(QByteArray);
void replyFinished();
- void replyDownloadMetaData(QList<QPair<QByteArray,QByteArray> >, int, QString, bool,
- QSharedPointer<char>, qint64, bool);
+ void replyDownloadMetaData(const QList<QPair<QByteArray,QByteArray> > &, int, const QString &,
+ bool, QSharedPointer<char>, qint64, bool);
void replyDownloadProgressSlot(qint64,qint64);
void httpAuthenticationRequired(const QHttpNetworkRequest &request, QAuthenticator *auth);
void httpError(QNetworkReply::NetworkError error, const QString &errorString);
diff --git a/src/network/access/qnetworkreplyimpl.cpp b/src/network/access/qnetworkreplyimpl.cpp
index 7961a1dbae..681c88e87b 100644
--- a/src/network/access/qnetworkreplyimpl.cpp
+++ b/src/network/access/qnetworkreplyimpl.cpp
@@ -67,7 +67,7 @@ void QNetworkReplyImplPrivate::_q_startOperation()
{
// ensure this function is only being called once
if (state == Working || state == Finished) {
- qDebug("QNetworkReplyImpl::_q_startOperation was called more than once");
+ qDebug() << "QNetworkReplyImpl::_q_startOperation was called more than once" << url;
return;
}
state = Working;
@@ -517,7 +517,7 @@ void QNetworkReplyImplPrivate::setCachingEnabled(bool enable)
return; // nothing to do either!
if (enable) {
- if (bytesDownloaded) {
+ if (Q_UNLIKELY(bytesDownloaded)) {
// refuse to enable in this case
qCritical("QNetworkReplyImpl: backend error: caching was enabled after some bytes had been written");
return;
@@ -606,7 +606,7 @@ void QNetworkReplyImplPrivate::initCacheSaveDevice()
cacheSaveDevice = networkCache()->prepare(metaData);
if (!cacheSaveDevice || (cacheSaveDevice && !cacheSaveDevice->isOpen())) {
- if (cacheSaveDevice && !cacheSaveDevice->isOpen())
+ if (Q_UNLIKELY(cacheSaveDevice && !cacheSaveDevice->isOpen()))
qCritical("QNetworkReplyImpl: network cache returned a device that is not open -- "
"class %s probably needs to be fixed",
networkCache()->metaObject()->className());
@@ -680,7 +680,7 @@ void QNetworkReplyImplPrivate::appendDownstreamData(QIODevice *data)
return;
// read until EOF from data
- if (copyDevice) {
+ if (Q_UNLIKELY(copyDevice)) {
qCritical("QNetworkReplyImpl: copy from QIODevice already in progress -- "
"backend probly needs to be fixed");
return;
diff --git a/src/network/access/qspdyprotocolhandler.cpp b/src/network/access/qspdyprotocolhandler.cpp
index 5f9697ab92..ea0f152eb0 100644
--- a/src/network/access/qspdyprotocolhandler.cpp
+++ b/src/network/access/qspdyprotocolhandler.cpp
@@ -601,7 +601,7 @@ void QSpdyProtocolHandler::sendControlFrame(FrameType type,
Q_UNUSED(written); // silence -Wunused-variable
}
-void QSpdyProtocolHandler::sendSYN_STREAM(HttpMessagePair messagePair,
+void QSpdyProtocolHandler::sendSYN_STREAM(const HttpMessagePair &messagePair,
qint32 streamID, qint32 associatedToStreamID)
{
QHttpNetworkRequest request = messagePair.first;
diff --git a/src/network/access/qspdyprotocolhandler_p.h b/src/network/access/qspdyprotocolhandler_p.h
index ed71878cd4..35f5b47360 100644
--- a/src/network/access/qspdyprotocolhandler_p.h
+++ b/src/network/access/qspdyprotocolhandler_p.h
@@ -166,7 +166,7 @@ private:
void sendControlFrame(FrameType type, ControlFrameFlags flags, const char *data, quint32 length);
- void sendSYN_STREAM(HttpMessagePair pair, qint32 streamID,
+ void sendSYN_STREAM(const HttpMessagePair &pair, qint32 streamID,
qint32 associatedToStreamID);
void sendRST_STREAM(qint32 streamID, RST_STREAM_STATUS_CODE statusCode);
void sendPING(quint32 pingID);
diff --git a/src/network/bearer/qnetworkconfiguration.cpp b/src/network/bearer/qnetworkconfiguration.cpp
index 378245ce3e..b68abce380 100644
--- a/src/network/bearer/qnetworkconfiguration.cpp
+++ b/src/network/bearer/qnetworkconfiguration.cpp
@@ -35,11 +35,6 @@
#include "qnetworkconfiguration_p.h"
#include <QDebug>
-#ifdef Q_OS_BLACKBERRY
-#include "private/qcore_unix_p.h" // qt_safe_open
-#include <sys/pps.h>
-#endif // Q_OS_BLACKBERRY
-
QT_BEGIN_NAMESPACE
/*!
@@ -202,77 +197,6 @@ QT_BEGIN_NAMESPACE
\value BearerLTE The configuration is for a LTE (4G) interface.
*/
-#ifdef Q_OS_BLACKBERRY
-static const char cellularStatusFile[] = "/pps/services/radioctrl/modem0/status_public";
-
-static QNetworkConfiguration::BearerType cellularStatus()
-{
- QNetworkConfiguration::BearerType ret = QNetworkConfiguration::BearerUnknown;
-
- int cellularStatusFD;
- if ((cellularStatusFD = qt_safe_open(cellularStatusFile, O_RDONLY)) == -1) {
- qWarning() << "failed to open" << cellularStatusFile;
- return ret;
- }
- char buf[2048];
- if (qt_safe_read(cellularStatusFD, &buf, sizeof(buf)) == -1) {
- qWarning() << "read from PPS file failed:" << strerror(errno);
- qt_safe_close(cellularStatusFD);
- return ret;
- }
- pps_decoder_t ppsDecoder;
- if (pps_decoder_initialize(&ppsDecoder, buf) != PPS_DECODER_OK) {
- qWarning("failed to initialize PPS decoder");
- qt_safe_close(cellularStatusFD);
- return ret;
- }
- pps_decoder_error_t err;
- if ((err = pps_decoder_push(&ppsDecoder, 0)) != PPS_DECODER_OK) {
- qWarning() << "pps_decoder_push failed" << err;
- pps_decoder_cleanup(&ppsDecoder);
- qt_safe_close(cellularStatusFD);
- return ret;
- }
- if (!pps_decoder_is_integer(&ppsDecoder, "network_technology")) {
- qWarning("field has not the expected data type");
- pps_decoder_cleanup(&ppsDecoder);
- qt_safe_close(cellularStatusFD);
- return ret;
- }
- int type;
- if (!pps_decoder_get_int(&ppsDecoder, "network_technology", &type)
- == PPS_DECODER_OK) {
- qWarning("could not read bearer type from PPS");
- pps_decoder_cleanup(&ppsDecoder);
- qt_safe_close(cellularStatusFD);
- return ret;
- }
- switch (type) {
- case 0: // 0 == NONE
- break; // unhandled
- case 1: // fallthrough, 1 == GSM
- case 4: // 4 == CDMA_1X
- ret = QNetworkConfiguration::Bearer2G;
- break;
- case 2: // 2 == UMTS
- ret = QNetworkConfiguration::BearerWCDMA;
- break;
- case 8: // 8 == EVDO
- ret = QNetworkConfiguration::BearerEVDO;
- break;
- case 16: // 16 == LTE
- ret = QNetworkConfiguration::BearerLTE;
- break;
- default:
- qWarning() << "unhandled bearer type" << type;
- break;
- }
- pps_decoder_cleanup(&ppsDecoder);
- qt_safe_close(cellularStatusFD);
- return ret;
-}
-#endif // Q_OS_BLACKBERRY
-
/*!
Constructs an invalid configuration object.
@@ -494,19 +418,6 @@ QNetworkConfiguration::BearerType QNetworkConfiguration::bearerType() const
return BearerUnknown;
QMutexLocker locker(&d->mutex);
-
-#ifdef Q_OS_BLACKBERRY
- // for cellular configurations, we need to determine the exact
- // type right now, because it might have changed after the last scan
- if (d->bearerType == QNetworkConfiguration::Bearer2G) {
- QNetworkConfiguration::BearerType type = cellularStatus();
- // if reading the status failed for some reason, just
- // fall back to 2G
- return (type == QNetworkConfiguration::BearerUnknown)
- ? QNetworkConfiguration::Bearer2G : type;
- }
-#endif // Q_OS_BLACKBERRY
-
return d->bearerType;
}
@@ -639,20 +550,6 @@ QString QNetworkConfiguration::bearerTypeName() const
case BearerWLAN:
return QStringLiteral("WLAN");
case Bearer2G:
-#ifdef Q_OS_BLACKBERRY
- {
- // for cellular configurations, we need to determine the exact
- // type right now, because it might have changed after the last scan
- QNetworkConfiguration::BearerType type = cellularStatus();
- if (type == QNetworkConfiguration::BearerWCDMA) {
- return QStringLiteral("WCDMA");
- } else if (type == QNetworkConfiguration::BearerEVDO) {
- return QStringLiteral("EVDO");
- }else if (type == QNetworkConfiguration::BearerLTE) {
- return QStringLiteral("LTE");
- }
- }
-#endif // Q_OS_BLACKBERRY
return QStringLiteral("2G");
case Bearer3G:
return QStringLiteral("3G");
diff --git a/src/network/bearer/qnetworkconfiguration_p.h b/src/network/bearer/qnetworkconfiguration_p.h
index 75df36fbd9..c8d926e32f 100644
--- a/src/network/bearer/qnetworkconfiguration_p.h
+++ b/src/network/bearer/qnetworkconfiguration_p.h
@@ -51,10 +51,6 @@
#include <QtCore/qmutex.h>
#include <QtCore/qmap.h>
-#ifdef Q_OS_BLACKBERRY
-#include <bps/netstatus.h>
-#endif
-
QT_BEGIN_NAMESPACE
typedef QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> QNetworkConfigurationPrivatePointer;
@@ -66,9 +62,6 @@ public:
type(QNetworkConfiguration::Invalid),
purpose(QNetworkConfiguration::UnknownPurpose),
bearerType(QNetworkConfiguration::BearerUnknown),
-#ifdef Q_OS_BLACKBERRY
- oldIpStatus(NETSTATUS_IP_STATUS_ERROR_UNKNOWN),
-#endif
isValid(false), roamingSupported(false)
{}
virtual ~QNetworkConfigurationPrivate()
@@ -89,10 +82,6 @@ public:
QNetworkConfiguration::Purpose purpose;
QNetworkConfiguration::BearerType bearerType;
-#ifdef Q_OS_BLACKBERRY
- netstatus_ip_status_t oldIpStatus;
-#endif
-
bool isValid;
bool roamingSupported;
diff --git a/src/network/bearer/qnetworksession_p.h b/src/network/bearer/qnetworksession_p.h
index f2ecf9902a..652687f07d 100644
--- a/src/network/bearer/qnetworksession_p.h
+++ b/src/network/bearer/qnetworksession_p.h
@@ -106,7 +106,7 @@ protected:
}
inline void setPrivateConfiguration(QNetworkConfiguration &config,
- QNetworkConfigurationPrivatePointer ptr) const
+ const QNetworkConfigurationPrivatePointer &ptr) const
{
config.d = ptr;
}
diff --git a/src/network/bearer/qsharednetworksession.cpp b/src/network/bearer/qsharednetworksession.cpp
index 0879bfbc2b..d2a3c78207 100644
--- a/src/network/bearer/qsharednetworksession.cpp
+++ b/src/network/bearer/qsharednetworksession.cpp
@@ -56,7 +56,7 @@ static void doDeleteLater(QObject* obj)
obj->deleteLater();
}
-QSharedPointer<QNetworkSession> QSharedNetworkSessionManager::getSession(QNetworkConfiguration config)
+QSharedPointer<QNetworkSession> QSharedNetworkSessionManager::getSession(const QNetworkConfiguration &config)
{
QSharedNetworkSessionManager *m(sharedNetworkSessionManager());
//if already have a session, return it
@@ -71,7 +71,7 @@ QSharedPointer<QNetworkSession> QSharedNetworkSessionManager::getSession(QNetwor
return session;
}
-void QSharedNetworkSessionManager::setSession(QNetworkConfiguration config, QSharedPointer<QNetworkSession> session)
+void QSharedNetworkSessionManager::setSession(const QNetworkConfiguration &config, QSharedPointer<QNetworkSession> session)
{
QSharedNetworkSessionManager *m(sharedNetworkSessionManager());
m->sessions[config] = session;
diff --git a/src/network/bearer/qsharednetworksession_p.h b/src/network/bearer/qsharednetworksession_p.h
index 3525c8359c..149e978e4f 100644
--- a/src/network/bearer/qsharednetworksession_p.h
+++ b/src/network/bearer/qsharednetworksession_p.h
@@ -61,8 +61,8 @@ uint qHash(const QNetworkConfiguration& config);
class QSharedNetworkSessionManager
{
public:
- static QSharedPointer<QNetworkSession> getSession(QNetworkConfiguration config);
- static void setSession(QNetworkConfiguration config, QSharedPointer<QNetworkSession> session);
+ static QSharedPointer<QNetworkSession> getSession(const QNetworkConfiguration &config);
+ static void setSession(const QNetworkConfiguration &config, QSharedPointer<QNetworkSession> session);
private:
QHash<QNetworkConfiguration, QWeakPointer<QNetworkSession> > sessions;
};
diff --git a/src/network/kernel/kernel.pri b/src/network/kernel/kernel.pri
index 435bfd6c27..8ca9366b0a 100644
--- a/src/network/kernel/kernel.pri
+++ b/src/network/kernel/kernel.pri
@@ -55,10 +55,6 @@ mac {
mac:!ios:SOURCES += kernel/qnetworkproxy_mac.cpp
else:win32:SOURCES += kernel/qnetworkproxy_win.cpp
-else:blackberry {
- SOURCES += kernel/qnetworkproxy_blackberry.cpp
- LIBS_PRIVATE += -lbps
-}
else:contains(QT_CONFIG, libproxy) {
SOURCES += kernel/qnetworkproxy_libproxy.cpp
LIBS_PRIVATE += -lproxy
diff --git a/src/network/kernel/qdnslookup_unix.cpp b/src/network/kernel/qdnslookup_unix.cpp
index dc8ec5a300..b78db338ce 100644
--- a/src/network/kernel/qdnslookup_unix.cpp
+++ b/src/network/kernel/qdnslookup_unix.cpp
@@ -37,6 +37,7 @@
#include <qscopedpointer.h>
#include <qurl.h>
#include <private/qmutexpool_p.h>
+#include <private/qnativesocketengine_p.h>
#include <sys/types.h>
#include <netinet/in.h>
@@ -160,6 +161,7 @@ void QDnsLookupRunnable::query(const int requestType, const QByteArray &requestN
state._u._ext.nscount6 = 1;
ns->sin6_family = AF_INET6;
ns->sin6_port = htons(53);
+ SetSALen::set(ns, sizeof(*ns));
Q_IPV6ADDR ipv6Address = nameserver.toIPv6Address();
for (int i=0; i<16; i++) {
diff --git a/src/network/kernel/qnetworkinterface.cpp b/src/network/kernel/qnetworkinterface.cpp
index 4a527052d1..81906edc47 100644
--- a/src/network/kernel/qnetworkinterface.cpp
+++ b/src/network/kernel/qnetworkinterface.cpp
@@ -519,6 +519,31 @@ QList<QNetworkAddressEntry> QNetworkInterface::addressEntries() const
}
/*!
+ \since 5.7
+
+ Returns the index of the interface whose name is \a name or 0 if there is
+ no interface with that name. This function should produce the same result
+ as the following code, but will probably execute faster.
+
+ \code
+ QNetworkInterface::interfaceFromName(name).index()
+ \endcode
+
+ \sa interfaceFromName(), interfaceNameFromIndex(), QUdpDatagram::interfaceIndex()
+*/
+int QNetworkInterface::interfaceIndexFromName(const QString &name)
+{
+ if (name.isEmpty())
+ return 0;
+
+ bool ok;
+ uint id = name.toUInt(&ok);
+ if (!ok)
+ id = QNetworkInterfaceManager::interfaceIndexFromName(name);
+ return int(id);
+}
+
+/*!
Returns a QNetworkInterface object for the interface named \a
name. If no such interface exists, this function returns an
invalid QNetworkInterface object.
@@ -553,6 +578,27 @@ QNetworkInterface QNetworkInterface::interfaceFromIndex(int index)
}
/*!
+ \since 5.7
+
+ Returns the name of the interface whose index is \a index or an empty
+ string if there is no interface with that index. This function should
+ produce the same result as the following code, but will probably execute
+ faster.
+
+ \code
+ QNetworkInterface::interfaceFromIndex(index).name()
+ \endcode
+
+ \sa interfaceFromIndex(), interfaceIndexFromName(), QUdpDatagram::interfaceIndex()
+*/
+QString QNetworkInterface::interfaceNameFromIndex(int index)
+{
+ if (!index)
+ return QString();
+ return QNetworkInterfaceManager::interfaceNameFromIndex(index);
+}
+
+/*!
Returns a listing of all the network interfaces found on the host
machine. In case of failure it returns a list with zero elements.
*/
diff --git a/src/network/kernel/qnetworkinterface.h b/src/network/kernel/qnetworkinterface.h
index b3daa3d4a0..bd57aea1cb 100644
--- a/src/network/kernel/qnetworkinterface.h
+++ b/src/network/kernel/qnetworkinterface.h
@@ -113,8 +113,10 @@ public:
QString hardwareAddress() const;
QList<QNetworkAddressEntry> addressEntries() const;
+ static int interfaceIndexFromName(const QString &name);
static QNetworkInterface interfaceFromName(const QString &name);
static QNetworkInterface interfaceFromIndex(int index);
+ static QString interfaceNameFromIndex(int index);
static QList<QNetworkInterface> allInterfaces();
static QList<QHostAddress> allAddresses();
diff --git a/src/network/kernel/qnetworkinterface_p.h b/src/network/kernel/qnetworkinterface_p.h
index 140a28c536..146ba7820c 100644
--- a/src/network/kernel/qnetworkinterface_p.h
+++ b/src/network/kernel/qnetworkinterface_p.h
@@ -100,6 +100,9 @@ public:
QSharedDataPointer<QNetworkInterfacePrivate> interfaceFromIndex(int index);
QList<QSharedDataPointer<QNetworkInterfacePrivate> > allInterfaces();
+ static uint interfaceIndexFromName(const QString &name);
+ static QString interfaceNameFromIndex(uint index);
+
// convenience:
QSharedDataPointer<QNetworkInterfacePrivate> empty;
diff --git a/src/network/kernel/qnetworkinterface_unix.cpp b/src/network/kernel/qnetworkinterface_unix.cpp
index 5e6d24dd44..e7b62effcb 100644
--- a/src/network/kernel/qnetworkinterface_unix.cpp
+++ b/src/network/kernel/qnetworkinterface_unix.cpp
@@ -1,6 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2015 The Qt Company Ltd.
+** Copyright (C) 2015 Intel Corporation.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the QtNetwork module of the Qt Toolkit.
@@ -93,14 +94,8 @@ static QHostAddress addressFromSockaddr(sockaddr *sa, int ifindex = 0, const QSt
// this is the most likely scenario:
// a scope ID in a socket is that of the interface this address came from
address.setScopeId(ifname);
- } else if (scope) {
-#ifndef QT_NO_IPV6IFNAME
- char scopeid[IFNAMSIZ];
- if (::if_indextoname(scope, scopeid)) {
- address.setScopeId(QLatin1String(scopeid));
- } else
-#endif
- address.setScopeId(QString::number(uint(scope)));
+ } else if (scope) {
+ address.setScopeId(QNetworkInterfaceManager::interfaceNameFromIndex(scope));
}
}
return address;
@@ -124,6 +119,53 @@ static QNetworkInterface::InterfaceFlags convertFlags(uint rawFlags)
return flags;
}
+uint QNetworkInterfaceManager::interfaceIndexFromName(const QString &name)
+{
+#ifndef QT_NO_IPV6IFNAME
+ return ::if_nametoindex(name.toLatin1());
+#elif defined(SIOCGIFINDEX)
+ struct ifreq req;
+ int socket = qt_safe_socket(AF_INET, SOCK_STREAM, 0);
+ if (socket < 0)
+ return 0;
+
+ QByteArray name8bit = name.toLatin1();
+ memset(&req, 0, sizeof(ifreq));
+ memcpy(req.ifr_name, name8bit, qMin<int>(name8bit.length() + 1, sizeof(req.ifr_name) - 1));
+
+ uint id = 0;
+ if (qt_safe_ioctl(socket, SIOCGIFINDEX, &req) >= 0)
+ id = req.ifr_ifindex;
+ qt_safe_close(socket);
+ return id;
+#else
+ return 0;
+#endif
+}
+
+QString QNetworkInterfaceManager::interfaceNameFromIndex(uint index)
+{
+#ifndef QT_NO_IPV6IFNAME
+ char buf[IF_NAMESIZE];
+ if (::if_indextoname(index, buf))
+ return QString::fromLatin1(buf);
+#elif defined(SIOCGIFNAME)
+ struct ifreq req;
+ int socket = qt_safe_socket(AF_INET, SOCK_STREAM, 0);
+ if (socket >= 0) {
+ memset(&req, 0, sizeof(ifreq));
+ req.ifr_ifindex = index;
+
+ if (qt_safe_ioctl(socket, SIOCGIFNAME, &req) >= 0) {
+ qt_safe_close(socket);
+ return QString::fromLatin1(req.ifr_name);
+ }
+ qt_safe_close(socket);
+ }
+#endif
+ return QString::number(uint(index));
+}
+
#ifdef QT_NO_GETIFADDRS
// getifaddrs not available
@@ -189,7 +231,11 @@ static QNetworkInterfacePrivate *findInterface(int socket, QList<QNetworkInterfa
// Get the interface index
# ifdef SIOCGIFINDEX
if (qt_safe_ioctl(socket, SIOCGIFINDEX, &req) >= 0)
+# if defined(Q_OS_HAIKU)
+ ifindex = req.ifr_index;
+# else
ifindex = req.ifr_ifindex;
+# endif
# else
ifindex = if_nametoindex(req.ifr_name);
# endif
diff --git a/src/network/kernel/qnetworkinterface_win.cpp b/src/network/kernel/qnetworkinterface_win.cpp
index 907638f73e..238f913846 100644
--- a/src/network/kernel/qnetworkinterface_win.cpp
+++ b/src/network/kernel/qnetworkinterface_win.cpp
@@ -57,8 +57,14 @@
QT_BEGIN_NAMESPACE
+typedef NETIO_STATUS (WINAPI *PtrConvertInterfaceIndexToLuid)(NET_IFINDEX, PNET_LUID);
typedef NETIO_STATUS (WINAPI *PtrConvertInterfaceLuidToName)(const NET_LUID *, PWSTR, SIZE_T);
+typedef NETIO_STATUS (WINAPI *PtrConvertInterfaceLuidToIndex)(const NET_LUID *, PNET_IFINDEX);
+typedef NETIO_STATUS (WINAPI *PtrConvertInterfaceNameToLuid)(const WCHAR *, PNET_LUID);
+static PtrConvertInterfaceIndexToLuid ptrConvertInterfaceIndexToLuid = 0;
static PtrConvertInterfaceLuidToName ptrConvertInterfaceLuidToName = 0;
+static PtrConvertInterfaceLuidToIndex ptrConvertInterfaceLuidToIndex = 0;
+static PtrConvertInterfaceNameToLuid ptrConvertInterfaceNameToLuid = 0;
static void resolveLibs()
{
@@ -71,10 +77,16 @@ static void resolveLibs()
#if defined(Q_OS_WINCE)
// since Windows Embedded Compact 7
+ ptrConvertInterfaceIndexToLuid = (PtrConvertInterfaceIndexToLuid)GetProcAddress(iphlpapiHnd, L"ConvertInterfaceIndexToLuid");
ptrConvertInterfaceLuidToName = (PtrConvertInterfaceLuidToName)GetProcAddress(iphlpapiHnd, L"ConvertInterfaceLuidToNameW");
+ ptrConvertInterfaceLuidToIndex = (PtrConvertInterfaceLuidToIndex)GetProcAddress(iphlpapiHnd, L"ConvertInterfaceLuidToIndex");
+ ptrConvertInterfaceNameToLuid = (PtrConvertInterfaceNameToLuid)GetProcAddress(iphlpapiHnd, L"ConvertInterfaceNameToLuidW");
#else
// since Windows Vista
+ ptrConvertInterfaceIndexToLuid = (PtrConvertInterfaceIndexToLuid)GetProcAddress(iphlpapiHnd, "ConvertInterfaceIndexToLuid");
ptrConvertInterfaceLuidToName = (PtrConvertInterfaceLuidToName)GetProcAddress(iphlpapiHnd, "ConvertInterfaceLuidToNameW");
+ ptrConvertInterfaceLuidToIndex = (PtrConvertInterfaceLuidToIndex)GetProcAddress(iphlpapiHnd, "ConvertInterfaceLuidToIndex");
+ ptrConvertInterfaceNameToLuid = (PtrConvertInterfaceNameToLuid)GetProcAddress(iphlpapiHnd, "ConvertInterfaceNameToLuidW");
#endif
done = true;
}
@@ -92,13 +104,42 @@ static QHostAddress addressFromSockaddr(sockaddr *sa)
address.setAddress(((sockaddr_in6 *)sa)->sin6_addr.s6_addr);
int scope = ((sockaddr_in6 *)sa)->sin6_scope_id;
if (scope)
- address.setScopeId(QString::number(scope));
+ address.setScopeId(QNetworkInterfaceManager::interfaceNameFromIndex(scope));
} else
qWarning("Got unknown socket family %d", sa->sa_family);
return address;
}
+uint QNetworkInterfaceManager::interfaceIndexFromName(const QString &name)
+{
+ resolveLibs();
+ if (!ptrConvertInterfaceNameToLuid || !ptrConvertInterfaceLuidToIndex)
+ return 0;
+
+ NET_IFINDEX id;
+ NET_LUID luid;
+ if (ptrConvertInterfaceNameToLuid(reinterpret_cast<const wchar_t *>(name.constData()), &luid) == NO_ERROR
+ && ptrConvertInterfaceLuidToIndex(&luid, &id) == NO_ERROR)
+ return uint(id);
+ return 0;
+}
+
+QString QNetworkInterfaceManager::interfaceNameFromIndex(uint index)
+{
+ resolveLibs();
+ if (ptrConvertInterfaceIndexToLuid && ptrConvertInterfaceLuidToName) {
+ NET_LUID luid;
+ if (ptrConvertInterfaceIndexToLuid(index, &luid) == NO_ERROR) {
+ WCHAR buf[IF_MAX_STRING_SIZE + 1];
+ if (ptrConvertInterfaceLuidToName(&luid, buf, sizeof(buf)/sizeof(buf[0])) == NO_ERROR)
+ return QString::fromWCharArray(buf);
+ }
+ }
+
+ return QString::number(index);
+}
+
static QHash<QHostAddress, QHostAddress> ipv4Netmasks()
{
//Retrieve all the IPV4 addresses & netmasks
diff --git a/src/network/kernel/qnetworkinterface_winrt.cpp b/src/network/kernel/qnetworkinterface_winrt.cpp
index 1945b2427f..1e22ab15da 100644
--- a/src/network/kernel/qnetworkinterface_winrt.cpp
+++ b/src/network/kernel/qnetworkinterface_winrt.cpp
@@ -61,6 +61,19 @@ struct HostNameInfo {
QString address;
};
+uint QNetworkInterfaceManager::interfaceIndexFromName(const QString &name)
+{
+ // TBD - may not be possible
+ Q_UNUSED(name);
+ return 0;
+}
+
+QString QNetworkInterfaceManager::interfaceNameFromIndex(uint index)
+{
+ // TBD - may not be possible
+ return QString::number(index);
+}
+
static QNetworkInterfacePrivate *interfaceFromProfile(IConnectionProfile *profile, QList<HostNameInfo> *hostList)
{
if (!profile)
diff --git a/src/network/kernel/qnetworkproxy.cpp b/src/network/kernel/qnetworkproxy.cpp
index 4c7c0c5442..4263938fdf 100644
--- a/src/network/kernel/qnetworkproxy.cpp
+++ b/src/network/kernel/qnetworkproxy.cpp
@@ -1530,12 +1530,6 @@ void QNetworkProxyFactory::setApplicationProxyFactory(QNetworkProxyFactory *fact
SOCKS server for all queries. If SOCKS isn't enabled, it will use
the HTTPS proxy for all TcpSocket and UrlRequest queries.
- On BlackBerry, this function obtains proxy settings for the default
- configuration using system configuration. The type will be set based on
- protocol tag "http", "https", "ftp", respectively. By default, it
- assumes http type. Proxy username and password are also set during
- the query using system configuration.
-
On other systems, this function will pick up proxy settings from
the "http_proxy" environment variable. This variable must be a URL
using one of the following schemes: "http", "socks5" or "socks5h".
@@ -1552,10 +1546,6 @@ void QNetworkProxyFactory::setApplicationProxyFactory(QNetworkProxyFactory *fact
\li On Windows platforms, this function may take several seconds to
execute depending on the configuration of the user's system.
-
- \li On BlackBerry, only UrlRequest and TcpSocket queries are supported. SOCKS is
- not supported. The proxy credentials are only retrieved for the
- default configuration.
\endlist
*/
diff --git a/src/network/kernel/qnetworkproxy_blackberry.cpp b/src/network/kernel/qnetworkproxy_blackberry.cpp
deleted file mode 100644
index ca30a65397..0000000000
--- a/src/network/kernel/qnetworkproxy_blackberry.cpp
+++ /dev/null
@@ -1,165 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Research In Motion
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/**
- * Some notes about the code:
- *
- * ** It is assumed that the system proxies are for url based requests
- * ie. HTTP/HTTPS based.
- */
-
-#include <QtNetwork/qnetworkproxy.h>
-
-#ifndef QT_NO_NETWORKPROXY
-
-
-#include <QtCore/qflags.h>
-#include <QtCore/qurl.h>
-#include <QtNetwork/qnetworkconfiguration.h>
-
-#include <bps/netstatus.h>
-#include <errno.h>
-
-
-QT_BEGIN_NAMESPACE
-
-QList<QNetworkProxy> QNetworkProxyFactory::systemProxyForQuery(const QNetworkProxyQuery &query)
-{
- if (query.url().scheme() == QLatin1String("file")
- || query.url().scheme() == QLatin1String("qrc"))
- return QList<QNetworkProxy>() << QNetworkProxy(QNetworkProxy::NoProxy);
-
- if (query.queryType() != QNetworkProxyQuery::UrlRequest
- && query.queryType() != QNetworkProxyQuery::TcpSocket) {
- qWarning("Unsupported query type: %d", query.queryType());
- return QList<QNetworkProxy>() << QNetworkProxy(QNetworkProxy::NoProxy);
- }
-
- QUrl url;
- if (query.queryType() == QNetworkProxyQuery::UrlRequest) {
- url = query.url();
- } else if (query.queryType() == QNetworkProxyQuery::TcpSocket
- && !query.peerHostName().isEmpty()) {
- url.setHost(query.peerHostName());
- switch (query.peerPort()) {
- case 443:
- url.setScheme(QStringLiteral("https"));
- break;
- case 21:
- url.setScheme(QStringLiteral("ftp"));
- break;
- default:
- // for unknown ports, we just pretend we are dealing
- // with a HTTP URL, otherwise we will not get a proxy
- // from the netstatus API
- url.setScheme(QStringLiteral("http"));
- }
- }
-
- if (!url.isValid()) {
- qWarning("Invalid URL: %s", qPrintable(url.toString()));
- return QList<QNetworkProxy>() << QNetworkProxy(QNetworkProxy::NoProxy);
- }
-
- netstatus_proxy_details_t details;
- memset(&details, 0, sizeof(netstatus_proxy_details_t));
-
-#if BPS_VERSION >= 3001001
-
- QByteArray bUrl(url.toEncoded());
- QString sInterface(query.networkConfiguration().name());
- QByteArray bInterface;
- if (!sInterface.isEmpty()) {
- if (query.networkConfiguration().type() != QNetworkConfiguration::InternetAccessPoint) {
- qWarning("Unsupported configuration type: %d", query.networkConfiguration().type());
- return QList<QNetworkProxy>() << QNetworkProxy(QNetworkProxy::NoProxy);
- }
- bInterface = sInterface.toUtf8();
- }
-
- if (netstatus_get_proxy_details_for_url(bUrl.constData(), (bInterface.isEmpty() ? NULL : bInterface.constData()), &details) != BPS_SUCCESS) {
- qWarning("netstatus_get_proxy_details_for_url failed! errno: %d", errno);
- return QList<QNetworkProxy>() << QNetworkProxy(QNetworkProxy::NoProxy);
- }
-
-#else
-
- if (netstatus_get_proxy_details(&details) != BPS_SUCCESS) {
- qWarning("netstatus_get_proxy_details failed! errno: %d", errno);
- return QList<QNetworkProxy>() << QNetworkProxy(QNetworkProxy::NoProxy);
- }
-
-#endif
-
- if (details.http_proxy_host == NULL) { // No proxy
- netstatus_free_proxy_details(&details);
- return QList<QNetworkProxy>() << QNetworkProxy(QNetworkProxy::NoProxy);
- }
-
- QNetworkProxy proxy;
-
- QString protocol = query.protocolTag();
- if (protocol.startsWith(QLatin1String("http"), Qt::CaseInsensitive)) { // http, https
- proxy.setType((QNetworkProxy::HttpProxy));
- } else if (protocol == QLatin1String("ftp")) {
- proxy.setType(QNetworkProxy::FtpCachingProxy);
- } else { // assume http proxy
- qDebug("Proxy type: %s assumed to be http proxy", qPrintable(protocol));
- proxy.setType((QNetworkProxy::HttpProxy));
- }
-
- // Set host
- // Note: ftp and https proxy type fields *are* obsolete.
- // The user interface allows only one host/port which gets duplicated
- // to all proxy type fields.
- proxy.setHostName(QString::fromUtf8(details.http_proxy_host));
-
- // Set port
- proxy.setPort(details.http_proxy_port);
-
- // Set username
- if (details.http_proxy_login_user)
- proxy.setUser(QString::fromUtf8(details.http_proxy_login_user));
-
- // Set password
- if (details.http_proxy_login_password)
- proxy.setPassword(QString::fromUtf8(details.http_proxy_login_password));
-
- netstatus_free_proxy_details(&details);
-
- return QList<QNetworkProxy>() << proxy;
-}
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp
index 1831d25718..ed86dbbbae 100644
--- a/src/network/socket/qabstractsocket.cpp
+++ b/src/network/socket/qabstractsocket.cpp
@@ -722,19 +722,9 @@ bool QAbstractSocketPrivate::canReadNotification()
}
}
- // only emit readyRead() when not recursing, and only if there is data available
- bool hasData = newBytes > 0
-#ifndef QT_NO_UDPSOCKET
- || (!isBuffered && socketType != QAbstractSocket::TcpSocket && socketEngine && socketEngine->hasPendingDatagrams())
-#endif
- || (!isBuffered && socketType == QAbstractSocket::TcpSocket && socketEngine)
- ;
-
- if (!emittedReadyRead && hasData) {
- QScopedValueRollback<bool> r(emittedReadyRead);
- emittedReadyRead = true;
- emit q->readyRead();
- }
+ // Only emit readyRead() if there is data available.
+ if (newBytes > 0 || !isBuffered)
+ emitReadyRead();
// If we were closed as a result of the readyRead() signal,
// return.
@@ -792,12 +782,12 @@ void QAbstractSocketPrivate::canCloseNotification()
// then occur when we read from the socket again and fail
// in canReadNotification or by the manually created
// closeNotification below.
- emit q->readyRead();
+ emitReadyRead();
QMetaObject::invokeMethod(socketEngine, "closeNotification", Qt::QueuedConnection);
}
} else if (socketType == QAbstractSocket::TcpSocket && socketEngine) {
- emit q->readyRead();
+ emitReadyRead();
}
}
@@ -817,8 +807,7 @@ bool QAbstractSocketPrivate::canWriteNotification()
#if defined (QABSTRACTSOCKET_DEBUG)
qDebug("QAbstractSocketPrivate::canWriteNotification() flushing");
#endif
- qint64 tmp = writeBuffer.size();
- flush();
+ bool dataWasWritten = writeToSocket();
if (socketEngine) {
#if defined (Q_OS_WIN)
@@ -830,7 +819,7 @@ bool QAbstractSocketPrivate::canWriteNotification()
#endif
}
- return (writeBuffer.size() < tmp);
+ return dataWasWritten;
}
/*! \internal
@@ -852,21 +841,20 @@ void QAbstractSocketPrivate::connectionNotification()
/*! \internal
- Writes pending data in the write buffers to the socket. The
- function writes as much as it can without blocking.
+ Writes one pending data block in the write buffer to the socket.
It is usually invoked by canWriteNotification after one or more
calls to write().
Emits bytesWritten().
*/
-bool QAbstractSocketPrivate::flush()
+bool QAbstractSocketPrivate::writeToSocket()
{
Q_Q(QAbstractSocket);
if (!socketEngine || !socketEngine->isValid() || (writeBuffer.isEmpty()
&& socketEngine->bytesToWrite() == 0)) {
#if defined (QABSTRACTSOCKET_DEBUG)
- qDebug("QAbstractSocketPrivate::flush() nothing to do: valid ? %s, writeBuffer.isEmpty() ? %s",
+ qDebug("QAbstractSocketPrivate::writeToSocket() nothing to do: valid ? %s, writeBuffer.isEmpty() ? %s",
(socketEngine && socketEngine->isValid()) ? "yes" : "no", writeBuffer.isEmpty() ? "yes" : "no");
#endif
@@ -884,7 +872,8 @@ bool QAbstractSocketPrivate::flush()
qint64 written = socketEngine->write(ptr, nextSize);
if (written < 0) {
#if defined (QABSTRACTSOCKET_DEBUG)
- qDebug() << "QAbstractSocketPrivate::flush() write error, aborting." << socketEngine->errorString();
+ qDebug() << "QAbstractSocketPrivate::writeToSocket() write error, aborting."
+ << socketEngine->errorString();
#endif
setErrorAndEmit(socketEngine->error(), socketEngine->errorString());
// an unexpected error so close the socket.
@@ -893,7 +882,7 @@ bool QAbstractSocketPrivate::flush()
}
#if defined (QABSTRACTSOCKET_DEBUG)
- qDebug("QAbstractSocketPrivate::flush() %lld bytes written to the network",
+ qDebug("QAbstractSocketPrivate::writeToSocket() %lld bytes written to the network",
written);
#endif
@@ -914,7 +903,23 @@ bool QAbstractSocketPrivate::flush()
if (state == QAbstractSocket::ClosingState)
q->disconnectFromHost();
- return true;
+ return written > 0;
+}
+
+/*! \internal
+
+ Writes pending data in the write buffers to the socket. The function
+ writes as much as it can without blocking. If any data was written,
+ this function returns true; otherwise false is returned.
+*/
+bool QAbstractSocketPrivate::flush()
+{
+ bool dataWasWritten = false;
+
+ while (!writeBuffer.isEmpty() && writeToSocket())
+ dataWasWritten = true;
+
+ return dataWasWritten;
}
#ifndef QT_NO_NETWORKPROXY
@@ -1248,10 +1253,7 @@ void QAbstractSocketPrivate::_q_forceDisconnect()
*/
bool QAbstractSocketPrivate::readFromSocket()
{
-#ifdef QABSTRACTSOCKET_DEBUG
Q_Q(QAbstractSocket);
-#endif
-
// Find how many bytes we can read from the socket layer.
qint64 bytesToRead = socketEngine->bytesAvailable();
if (bytesToRead == 0) {
@@ -1280,7 +1282,7 @@ bool QAbstractSocketPrivate::readFromSocket()
buffer.chop(bytesToRead);
return true;
}
- buffer.chop(bytesToRead - (readBytes < 0 ? qint64(0) : readBytes));
+ buffer.chop(bytesToRead - ((readBytes < 0 || !q->isReadable()) ? qint64(0) : readBytes));
#if defined(QABSTRACTSOCKET_DEBUG)
qDebug("QAbstractSocketPrivate::readFromSocket() got %lld bytes, buffer size = %lld",
readBytes, buffer.size());
@@ -1301,6 +1303,21 @@ bool QAbstractSocketPrivate::readFromSocket()
/*! \internal
+ Prevents from the recursive readyRead() emission.
+*/
+void QAbstractSocketPrivate::emitReadyRead()
+{
+ Q_Q(QAbstractSocket);
+ // Only emit readyRead() when not recursing.
+ if (!emittedReadyRead) {
+ QScopedValueRollback<bool> r(emittedReadyRead);
+ emittedReadyRead = true;
+ emit q->readyRead();
+ }
+}
+
+/*! \internal
+
Sets up the internal state after the connection has succeeded.
*/
void QAbstractSocketPrivate::fetchConnectionParameters()
@@ -2378,7 +2395,7 @@ bool QAbstractSocket::isSequential() const
*/
bool QAbstractSocket::atEnd() const
{
- return QIODevice::atEnd() && (!isOpen() || d_func()->buffer.isEmpty());
+ return QIODevice::atEnd();
}
/*!
diff --git a/src/network/socket/qabstractsocket.h b/src/network/socket/qabstractsocket.h
index 23f0d26cbd..f8edc74a24 100644
--- a/src/network/socket/qabstractsocket.h
+++ b/src/network/socket/qabstractsocket.h
@@ -176,7 +176,7 @@ public:
// from QIODevice
void close() Q_DECL_OVERRIDE;
bool isSequential() const Q_DECL_OVERRIDE;
- bool atEnd() const Q_DECL_OVERRIDE;
+ bool atEnd() const Q_DECL_OVERRIDE; // ### Qt6: remove me
bool flush();
// for synchronous access
diff --git a/src/network/socket/qabstractsocket_p.h b/src/network/socket/qabstractsocket_p.h
index a905625b19..ba129b48df 100644
--- a/src/network/socket/qabstractsocket_p.h
+++ b/src/network/socket/qabstractsocket_p.h
@@ -135,6 +135,8 @@ public:
void fetchConnectionParameters();
void setupSocketNotifiers();
bool readFromSocket();
+ bool writeToSocket();
+ void emitReadyRead();
void setError(QAbstractSocket::SocketError errorCode, const QString &errorString);
void setErrorAndEmit(QAbstractSocket::SocketError errorCode, const QString &errorString);
diff --git a/src/network/socket/qhttpsocketengine.cpp b/src/network/socket/qhttpsocketengine.cpp
index 92ca76b560..3f20e5c046 100644
--- a/src/network/socket/qhttpsocketengine.cpp
+++ b/src/network/socket/qhttpsocketengine.cpp
@@ -768,7 +768,6 @@ void QHttpSocketEngine::emitPendingConnectionNotification()
void QHttpSocketEngine::emitReadNotification()
{
Q_D(QHttpSocketEngine);
- d->readNotificationActivated = true;
// if there is a connection notification pending we have to emit the readNotification
// incase there is connection error. This is only needed for Windows, but it does not
// hurt in other cases.
@@ -781,7 +780,6 @@ void QHttpSocketEngine::emitReadNotification()
void QHttpSocketEngine::emitWriteNotification()
{
Q_D(QHttpSocketEngine);
- d->writeNotificationActivated = true;
if (d->writeNotificationEnabled && !d->writeNotificationPending) {
d->writeNotificationPending = true;
QMetaObject::invokeMethod(this, "emitPendingWriteNotification", Qt::QueuedConnection);
@@ -801,8 +799,6 @@ QHttpSocketEnginePrivate::QHttpSocketEnginePrivate()
: readNotificationEnabled(false)
, writeNotificationEnabled(false)
, exceptNotificationEnabled(false)
- , readNotificationActivated(false)
- , writeNotificationActivated(false)
, readNotificationPending(false)
, writeNotificationPending(false)
, connectionNotificationPending(false)
diff --git a/src/network/socket/qhttpsocketengine_p.h b/src/network/socket/qhttpsocketengine_p.h
index 41c63fe11e..b34e5b0dc3 100644
--- a/src/network/socket/qhttpsocketengine_p.h
+++ b/src/network/socket/qhttpsocketengine_p.h
@@ -172,8 +172,6 @@ public:
bool readNotificationEnabled;
bool writeNotificationEnabled;
bool exceptNotificationEnabled;
- bool readNotificationActivated;
- bool writeNotificationActivated;
bool readNotificationPending;
bool writeNotificationPending;
bool connectionNotificationPending;
diff --git a/src/network/socket/qnativesocketengine_p.h b/src/network/socket/qnativesocketengine_p.h
index 9a76e23013..2dc4bbaced 100644
--- a/src/network/socket/qnativesocketengine_p.h
+++ b/src/network/socket/qnativesocketengine_p.h
@@ -45,6 +45,7 @@
// We mean it.
//
#include "QtNetwork/qhostaddress.h"
+#include "QtNetwork/qnetworkinterface.h"
#include "private/qabstractsocketengine_p.h"
#ifndef Q_OS_WIN
# include "qplatformdefs.h"
@@ -98,6 +99,16 @@ union qt_sockaddr {
sockaddr_in6 a6;
};
+namespace {
+namespace SetSALen {
+ template <typename T> void set(T *sa, typename QtPrivate::QEnableIf<(&T::sa_len, true), QT_SOCKLEN_T>::Type len)
+ { sa->sa_len = len; }
+ template <typename T> void set(T *sin6, typename QtPrivate::QEnableIf<(&T::sin6_len, true), QT_SOCKLEN_T>::Type len)
+ { sin6->sin6_len = len; }
+ template <typename T> void set(T *, ...) {}
+}
+}
+
class QNativeSocketEnginePrivate;
#ifndef QT_NO_NETWORKINTERFACE
class QNetworkInterface;
@@ -266,7 +277,8 @@ public:
bool checkProxy(const QHostAddress &address);
bool fetchConnectionParameters();
- static uint scopeIdFromString(const QString &scopeid);
+ static uint scopeIdFromString(const QString &scopeid)
+ { return QNetworkInterface::interfaceIndexFromName(scopeid); }
/*! \internal
Sets \a address and \a port in the \a aa sockaddr structure and the size in \a sockAddrSize.
@@ -285,12 +297,14 @@ public:
Q_IPV6ADDR tmp = address.toIPv6Address();
memcpy(&aa->a6.sin6_addr, &tmp, sizeof(tmp));
*sockAddrSize = sizeof(sockaddr_in6);
+ SetSALen::set(&aa->a, sizeof(sockaddr_in6));
} else {
memset(&aa->a, 0, sizeof(sockaddr_in));
aa->a4.sin_family = AF_INET;
aa->a4.sin_port = htons(port);
aa->a4.sin_addr.s_addr = htonl(address.toIPv4Address());
*sockAddrSize = sizeof(sockaddr_in);
+ SetSALen::set(&aa->a, sizeof(sockaddr_in));
}
}
diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp
index 8626a6be0f..2ed39fcc0a 100644
--- a/src/network/socket/qnativesocketengine_unix.cpp
+++ b/src/network/socket/qnativesocketengine_unix.cpp
@@ -107,15 +107,8 @@ static inline void qt_socket_getPortAndAddress(const qt_sockaddr *s, quint16 *po
QHostAddress tmpAddress;
tmpAddress.setAddress(tmp);
*addr = tmpAddress;
- if (s->a6.sin6_scope_id) {
-#ifndef QT_NO_IPV6IFNAME
- char scopeid[IFNAMSIZ];
- if (::if_indextoname(s->a6.sin6_scope_id, scopeid)) {
- addr->setScopeId(QLatin1String(scopeid));
- } else
-#endif
- addr->setScopeId(QString::number(s->a6.sin6_scope_id));
- }
+ if (s->a6.sin6_scope_id)
+ addr->setScopeId(QNetworkInterface::interfaceNameFromIndex(s->a6.sin6_scope_id));
}
if (port)
*port = ntohs(s->a6.sin6_port);
@@ -131,21 +124,6 @@ static inline void qt_socket_getPortAndAddress(const qt_sockaddr *s, quint16 *po
}
}
-// inline on purpose
-inline uint QNativeSocketEnginePrivate::scopeIdFromString(const QString &scopeid)
-{
- if (scopeid.isEmpty())
- return 0;
-
- bool ok;
- uint id = scopeid.toUInt(&ok);
-#ifndef QT_NO_IPV6IFNAME
- if (!ok)
- id = ::if_nametoindex(scopeid.toLatin1());
-#endif
- return id;
-}
-
static void convertToLevelAndOption(QNativeSocketEngine::SocketOption opt,
QAbstractSocket::NetworkLayerProtocol socketProtocol, int &level, int &n)
{
@@ -1207,53 +1185,6 @@ qint64 QNativeSocketEnginePrivate::nativeRead(char *data, qint64 maxSize)
return qint64(r);
}
-#ifdef Q_OS_BLACKBERRY
-int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool selectForRead) const
-{
- fd_set fds;
- FD_ZERO(&fds);
- FD_SET(socketDescriptor, &fds);
-
- int retval;
- QList<QSocketNotifier *> notifiers;
- if (selectForRead) {
- notifiers << readNotifier;
- retval = bb_select(notifiers, socketDescriptor + 1, &fds, 0, timeout);
- } else {
- notifiers << writeNotifier;
- retval = bb_select(notifiers, socketDescriptor + 1, 0, &fds, timeout);
- }
-
- return retval;
-}
-
-int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool checkWrite,
- bool *selectForRead, bool *selectForWrite) const
-{
- fd_set fdread;
- FD_ZERO(&fdread);
- if (checkRead)
- FD_SET(socketDescriptor, &fdread);
-
- fd_set fdwrite;
- FD_ZERO(&fdwrite);
- if (checkWrite)
- FD_SET(socketDescriptor, &fdwrite);
-
- QList<QSocketNotifier *> notifiers;
- notifiers << readNotifier << writeNotifier;
- int ret = bb_select(notifiers, socketDescriptor + 1, &fdread, &fdwrite, timeout);
-
- if (ret <= 0)
- return ret;
- *selectForRead = FD_ISSET(socketDescriptor, &fdread);
- *selectForWrite = FD_ISSET(socketDescriptor, &fdwrite);
-
- return ret;
-}
-
-#else // not Q_OS_BLACKBERRY:
-
int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool selectForRead) const
{
fd_set fds;
@@ -1300,6 +1231,5 @@ int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool c
return ret;
}
-#endif // Q_OS_BLACKBERRY
QT_END_NAMESPACE
diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp
index 9aed0caa25..1379ed93ba 100644
--- a/src/network/socket/qnativesocketengine_win.cpp
+++ b/src/network/socket/qnativesocketengine_win.cpp
@@ -322,12 +322,6 @@ static inline int qt_socket_getMaxMsgSize(qintptr socketDescriptor)
# define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR,12)
#endif
-// inline on purpose
-inline uint QNativeSocketEnginePrivate::scopeIdFromString(const QString &scopeid)
-{
- return scopeid.toUInt();
-}
-
bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType socketType, QAbstractSocket::NetworkLayerProtocol &socketProtocol)
{
@@ -657,6 +651,13 @@ bool QNativeSocketEnginePrivate::nativeConnect(const QHostAddress &address, quin
int tries = 0;
do {
if (::getsockopt(socketDescriptor, SOL_SOCKET, SO_ERROR, (char *) &value, &valueSize) == 0) {
+ if (value != NOERROR) {
+ // MSDN says getsockopt with SO_ERROR clears the error, but it's not actually cleared
+ // and this can affect all subsequent WSAConnect attempts, so clear it now.
+ const int val = NO_ERROR;
+ ::setsockopt(socketDescriptor, SOL_SOCKET, SO_ERROR, reinterpret_cast<const char*>(&val), sizeof val);
+ }
+
if (value == WSAECONNREFUSED) {
setError(QAbstractSocket::ConnectionRefusedError, ConnectionRefusedErrorString);
socketState = QAbstractSocket::UnconnectedState;
diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp
index 805adc734f..1dfd87a0f8 100644
--- a/src/network/ssl/qsslsocket.cpp
+++ b/src/network/ssl/qsslsocket.cpp
@@ -1507,6 +1507,10 @@ QList<QSslCertificate> QSslSocket::defaultCaCertificates()
returned by defaultCaCertificates(). You can replace that database
with your own with setDefaultCaCertificates().
+ \note: On OS X, only certificates that are either trusted for all
+ purposes or trusted for the purpose of SSL in the keychain will be
+ returned.
+
\sa caCertificates(), defaultCaCertificates(), setDefaultCaCertificates()
*/
QList<QSslCertificate> QSslSocket::systemCaCertificates()
diff --git a/src/network/ssl/qsslsocket_mac.cpp b/src/network/ssl/qsslsocket_mac.cpp
index 4e090f96cb..326686fad0 100644
--- a/src/network/ssl/qsslsocket_mac.cpp
+++ b/src/network/ssl/qsslsocket_mac.cpp
@@ -491,29 +491,6 @@ void QSslSocketPrivate::resetDefaultEllipticCurves()
Q_UNIMPLEMENTED();
}
-
-QList<QSslCertificate> QSslSocketPrivate::systemCaCertificates()
-{
- QList<QSslCertificate> systemCerts;
-#ifdef Q_OS_OSX
- // SecTrustSettingsCopyCertificates is not defined on iOS.
- QCFType<CFArrayRef> cfCerts;
- OSStatus status = SecTrustSettingsCopyCertificates(kSecTrustSettingsDomainSystem, &cfCerts);
- if (status == noErr) {
- const CFIndex size = CFArrayGetCount(cfCerts);
- for (CFIndex i = 0; i < size; ++i) {
- SecCertificateRef cfCert = (SecCertificateRef)CFArrayGetValueAtIndex(cfCerts, i);
- QCFType<CFDataRef> derData = SecCertificateCopyData(cfCert);
- systemCerts << QSslCertificate(QByteArray::fromCFData(derData), QSsl::Der);
- }
- } else {
- // no detailed error handling here
- qCWarning(lcSsl) << "SecTrustSettingsCopyCertificates failed:" << status;
- }
-#endif
- return systemCerts;
-}
-
QSslSocketBackendPrivate::QSslSocketBackendPrivate()
: context(Q_NULLPTR)
{
@@ -867,6 +844,9 @@ QSslCipher QSslSocketBackendPrivate::QSslCipher_from_SSLCipherSuite(SSLCipherSui
case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
ciph.d->name = QLatin1String("ECDHE-RSA-AES256-SHA384");
break;
+ case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
+ ciph.d->name = QLatin1String("ECDHE-RSA-AES256-GCM-SHA384");
+ break;
default:
return ciph;
}
@@ -914,6 +894,10 @@ QSslCipher QSslSocketBackendPrivate::QSslCipher_from_SSLCipherSuite(SSLCipherSui
ciph.d->encryptionMethod = QLatin1String("AES(128)");
ciph.d->bits = 128;
ciph.d->supportedBits = 128;
+ } else if (ciph.d->name.contains("AES256-GCM")) {
+ ciph.d->encryptionMethod = QLatin1String("AESGCM(256)");
+ ciph.d->bits = 256;
+ ciph.d->supportedBits = 256;
} else if (ciph.d->name.contains("AES256-")) {
ciph.d->encryptionMethod = QLatin1String("AES(256)");
ciph.d->bits = 256;
diff --git a/src/network/ssl/qsslsocket_mac_shared.cpp b/src/network/ssl/qsslsocket_mac_shared.cpp
new file mode 100644
index 0000000000..f44b20e938
--- /dev/null
+++ b/src/network/ssl/qsslsocket_mac_shared.cpp
@@ -0,0 +1,149 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Copyright (C) 2015 ownCloud Inc
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the QtNetwork module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//#define QSSLSOCKET_DEBUG
+//#define QT_DECRYPT_SSL_TRAFFIC
+
+#include "qssl_p.h"
+#include "qsslsocket.h"
+
+#ifndef QT_NO_OPENSSL
+# include "qsslsocket_openssl_p.h"
+# include "qsslsocket_openssl_symbols_p.h"
+#endif
+
+#include "qsslcertificate_p.h"
+
+#ifdef Q_OS_DARWIN
+# include <private/qcore_mac_p.h>
+#endif
+
+#include <QtCore/qdebug.h>
+
+#ifdef Q_OS_OSX
+# include <Security/Security.h>
+#endif
+
+
+QT_BEGIN_NAMESPACE
+
+#ifdef Q_OS_OSX
+namespace {
+
+bool hasTrustedSslServerPolicy(SecPolicyRef policy, CFDictionaryRef props) {
+ QCFType<CFDictionaryRef> policyProps = SecPolicyCopyProperties(policy);
+ // only accept certificates with policies for SSL server validation for now
+ if (CFEqual(CFDictionaryGetValue(policyProps, kSecPolicyOid), kSecPolicyAppleSSL)) {
+ CFBooleanRef policyClient;
+ if (CFDictionaryGetValueIfPresent(policyProps, kSecPolicyClient, reinterpret_cast<const void**>(&policyClient)) &&
+ CFEqual(policyClient, kCFBooleanTrue)) {
+ return false; // no client certs
+ }
+ if (!CFDictionaryContainsKey(props, kSecTrustSettingsResult)) {
+ // as per the docs, no trust settings result implies full trust
+ return true;
+ }
+ CFNumberRef number = static_cast<CFNumberRef>(CFDictionaryGetValue(props, kSecTrustSettingsResult));
+ SecTrustSettingsResult settingsResult;
+ CFNumberGetValue(number, kCFNumberSInt32Type, &settingsResult);
+ switch (settingsResult) {
+ case kSecTrustSettingsResultTrustRoot:
+ case kSecTrustSettingsResultTrustAsRoot:
+ return true;
+ default:
+ return false;
+ }
+ }
+ return false;
+}
+
+bool isCaCertificateTrusted(SecCertificateRef cfCert, int domain)
+{
+ QCFType<CFArrayRef> cfTrustSettings;
+ OSStatus status = SecTrustSettingsCopyTrustSettings(cfCert, SecTrustSettingsDomain(domain), &cfTrustSettings);
+ if (status == noErr) {
+ CFIndex size = CFArrayGetCount(cfTrustSettings);
+ // if empty, trust for everything (as per the Security Framework documentation)
+ if (size == 0) {
+ return true;
+ } else {
+ for (CFIndex i = 0; i < size; ++i) {
+ CFDictionaryRef props = static_cast<CFDictionaryRef>(CFArrayGetValueAtIndex(cfTrustSettings, i));
+ if (CFDictionaryContainsKey(props, kSecTrustSettingsPolicy)) {
+ if (hasTrustedSslServerPolicy((SecPolicyRef)CFDictionaryGetValue(props, kSecTrustSettingsPolicy), props))
+ return true;
+ }
+ }
+ }
+ } else {
+ qCWarning(lcSsl, "Error receiving trust for a CA certificate");
+ }
+ return false;
+}
+
+} // anon namespace
+#endif // Q_OS_OSX
+
+QList<QSslCertificate> QSslSocketPrivate::systemCaCertificates()
+{
+ ensureInitialized();
+
+ QList<QSslCertificate> systemCerts;
+ // SecTrustSettingsCopyCertificates is not defined on iOS.
+#ifdef Q_OS_OSX
+ QCFType<CFArrayRef> cfCerts;
+ // iterate through all enum members, order:
+ // kSecTrustSettingsDomainUser, kSecTrustSettingsDomainAdmin, kSecTrustSettingsDomainSystem
+ for (int dom = kSecTrustSettingsDomainUser; dom <= int(kSecTrustSettingsDomainSystem); dom++) {
+ OSStatus status = SecTrustSettingsCopyCertificates(SecTrustSettingsDomain(dom), &cfCerts);
+ if (status == noErr) {
+ const CFIndex size = CFArrayGetCount(cfCerts);
+ for (CFIndex i = 0; i < size; ++i) {
+ SecCertificateRef cfCert = (SecCertificateRef)CFArrayGetValueAtIndex(cfCerts, i);
+ QCFType<CFDataRef> derData = SecCertificateCopyData(cfCert);
+ if (::isCaCertificateTrusted(cfCert, dom)) {
+ if (derData == NULL) {
+ qCWarning(lcSsl, "Error retrieving a CA certificate from the system store");
+ } else {
+ systemCerts << QSslCertificate(QByteArray::fromCFData(derData), QSsl::Der);
+ }
+ }
+ }
+ }
+ }
+#endif
+ return systemCerts;
+}
+
+QT_END_NAMESPACE
diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp
index dd47dfc45f..bbd712317c 100644
--- a/src/network/ssl/qsslsocket_openssl.cpp
+++ b/src/network/ssl/qsslsocket_openssl.cpp
@@ -78,12 +78,7 @@
QT_BEGIN_NAMESPACE
-#if defined(Q_OS_MACX)
-#define kSecTrustSettingsDomainSystem 2 // so we do not need to include the header file
- PtrSecCertificateCopyData QSslSocketPrivate::ptrSecCertificateCopyData = 0;
- PtrSecTrustSettingsCopyCertificates QSslSocketPrivate::ptrSecTrustSettingsCopyCertificates = 0;
- PtrSecTrustCopyAnchorCertificates QSslSocketPrivate::ptrSecTrustCopyAnchorCertificates = 0;
-#elif defined(Q_OS_WIN)
+#if defined(Q_OS_WIN)
PtrCertOpenSystemStoreW QSslSocketPrivate::ptrCertOpenSystemStoreW = 0;
PtrCertFindCertificateInStore QSslSocketPrivate::ptrCertFindCertificateInStore = 0;
PtrCertCloseStore QSslSocketPrivate::ptrCertCloseStore = 0;
@@ -506,23 +501,7 @@ void QSslSocketPrivate::ensureCiphersAndCertsLoaded()
#ifndef QT_NO_LIBRARY
//load symbols needed to receive certificates from system store
-#if defined(Q_OS_MACX)
- QLibrary securityLib("/System/Library/Frameworks/Security.framework/Versions/Current/Security");
- if (securityLib.load()) {
- ptrSecCertificateCopyData = (PtrSecCertificateCopyData) securityLib.resolve("SecCertificateCopyData");
- if (!ptrSecCertificateCopyData)
- qCWarning(lcSsl, "could not resolve symbols in security library"); // should never happen
-
- ptrSecTrustSettingsCopyCertificates = (PtrSecTrustSettingsCopyCertificates) securityLib.resolve("SecTrustSettingsCopyCertificates");
- if (!ptrSecTrustSettingsCopyCertificates) { // method was introduced in Leopard, use legacy method if it's not there
- ptrSecTrustCopyAnchorCertificates = (PtrSecTrustCopyAnchorCertificates) securityLib.resolve("SecTrustCopyAnchorCertificates");
- if (!ptrSecTrustCopyAnchorCertificates)
- qCWarning(lcSsl, "could not resolve symbols in security library"); // should never happen
- }
- } else {
- qCWarning(lcSsl, "could not load security library");
- }
-#elif defined(Q_OS_WIN)
+#if defined(Q_OS_WIN)
HINSTANCE hLib = LoadLibraryW(L"Crypt32");
if (hLib) {
#if defined(Q_OS_WINCE)
@@ -680,6 +659,7 @@ void QSslSocketPrivate::resetDefaultEllipticCurves()
setDefaultSupportedEllipticCurves(curves);
}
+#ifndef Q_OS_DARWIN // Apple implementation in qsslsocket_mac_shared.cpp
QList<QSslCertificate> QSslSocketPrivate::systemCaCertificates()
{
ensureInitialized();
@@ -688,43 +668,7 @@ QList<QSslCertificate> QSslSocketPrivate::systemCaCertificates()
timer.start();
#endif
QList<QSslCertificate> systemCerts;
-#if defined(Q_OS_MACX)
- CFArrayRef cfCerts;
- OSStatus status = 1;
-
- CFDataRef SecCertificateCopyData (
- SecCertificateRef certificate
- );
-
- if (ptrSecCertificateCopyData) {
- if (ptrSecTrustSettingsCopyCertificates)
- status = ptrSecTrustSettingsCopyCertificates(kSecTrustSettingsDomainSystem, &cfCerts);
- else if (ptrSecTrustCopyAnchorCertificates)
- status = ptrSecTrustCopyAnchorCertificates(&cfCerts);
- if (!status) {
- CFIndex size = CFArrayGetCount(cfCerts);
- for (CFIndex i = 0; i < size; ++i) {
- SecCertificateRef cfCert = (SecCertificateRef)CFArrayGetValueAtIndex(cfCerts, i);
- CFDataRef data;
-
- data = ptrSecCertificateCopyData(cfCert);
-
- if (data == NULL) {
- qCWarning(lcSsl, "error retrieving a CA certificate from the system store");
- } else {
- QByteArray rawCert = QByteArray::fromRawData((const char *)CFDataGetBytePtr(data), CFDataGetLength(data));
- systemCerts.append(QSslCertificate::fromData(rawCert, QSsl::Der));
- CFRelease(data);
- }
- }
- CFRelease(cfCerts);
- }
- else {
- // no detailed error handling here
- qCWarning(lcSsl, "could not retrieve system CA certificates");
- }
- }
-#elif defined(Q_OS_WIN)
+#if defined(Q_OS_WIN)
if (ptrCertOpenSystemStoreW && ptrCertFindCertificateInStore && ptrCertCloseStore) {
HCERTSTORE hSystemStore;
#if defined(Q_OS_WINCE)
@@ -801,6 +745,7 @@ QList<QSslCertificate> QSslSocketPrivate::systemCaCertificates()
return systemCerts;
}
+#endif // Q_OS_DARWIN
void QSslSocketBackendPrivate::startClientEncryption()
{
diff --git a/src/network/ssl/qsslsocket_p.h b/src/network/ssl/qsslsocket_p.h
index d6519718d9..17cc7b4259 100644
--- a/src/network/ssl/qsslsocket_p.h
+++ b/src/network/ssl/qsslsocket_p.h
@@ -151,11 +151,7 @@ public:
static bool isMatchingHostname(const QSslCertificate &cert, const QString &peerName);
Q_AUTOTEST_EXPORT static bool isMatchingHostname(const QString &cn, const QString &hostname);
-#if defined(Q_OS_MACX)
- static PtrSecCertificateCopyData ptrSecCertificateCopyData;
- static PtrSecTrustSettingsCopyCertificates ptrSecTrustSettingsCopyCertificates;
- static PtrSecTrustCopyAnchorCertificates ptrSecTrustCopyAnchorCertificates;
-#elif defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
+#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
static PtrCertOpenSystemStoreW ptrCertOpenSystemStoreW;
static PtrCertFindCertificateInStore ptrCertFindCertificateInStore;
static PtrCertCloseStore ptrCertCloseStore;
diff --git a/src/network/ssl/ssl.pri b/src/network/ssl/ssl.pri
index 29c47cd7c6..2173bf6ccc 100644
--- a/src/network/ssl/ssl.pri
+++ b/src/network/ssl/ssl.pri
@@ -46,6 +46,7 @@ contains(QT_CONFIG, ssl) | contains(QT_CONFIG, openssl) | contains(QT_CONFIG, op
SOURCES += ssl/qsslcertificate_qt.cpp \
ssl/qsslkey_qt.cpp \
ssl/qsslkey_mac.cpp \
+ ssl/qsslsocket_mac_shared.cpp \
ssl/qsslsocket_mac.cpp \
ssl/qsslellipticcurve_dummy.cpp
}
@@ -62,7 +63,9 @@ contains(QT_CONFIG, openssl) | contains(QT_CONFIG, openssl-linked) {
ssl/qsslsocket_openssl.cpp \
ssl/qsslsocket_openssl_symbols.cpp
-android:!android-no-sdk: SOURCES += ssl/qsslsocket_openssl_android.cpp
+ darwin:SOURCES += ssl/qsslsocket_mac_shared.cpp
+
+ android:!android-no-sdk: SOURCES += ssl/qsslsocket_openssl_android.cpp
# Add optional SSL libs
# Static linking of OpenSSL with msvc:
diff --git a/src/opengl/gl2paintengineex/qglengineshadermanager.cpp b/src/opengl/gl2paintengineex/qglengineshadermanager.cpp
index 903f34f939..984590435d 100644
--- a/src/opengl/gl2paintengineex/qglengineshadermanager.cpp
+++ b/src/opengl/gl2paintengineex/qglengineshadermanager.cpp
@@ -188,7 +188,7 @@ QGLEngineSharedShaders::QGLEngineSharedShaders(const QGLContext* context)
#if defined(QT_DEBUG)
// Check that all the elements have been filled:
for (int i = 0; i < TotalSnippetCount; ++i) {
- if (qShaderSnippets[i] == 0) {
+ if (Q_UNLIKELY(!qShaderSnippets[i])) {
qFatal("Shader snippet for %s (#%d) is missing!",
snippetNameStr(SnippetName(i)).constData(), i);
}
@@ -237,11 +237,11 @@ QGLEngineSharedShaders::QGLEngineSharedShaders(const QGLContext* context)
simpleShaderProg->link();
- if (simpleShaderProg->isLinked()) {
+ if (Q_UNLIKELY(!simpleShaderProg->isLinked())) {
+ qCritical("Errors linking simple shader: %s", qPrintable(simpleShaderProg->log()));
+ } else {
if (!inCache)
simpleShaderCache.store(simpleShaderProg, context);
- } else {
- qCritical("Errors linking simple shader: %s", qPrintable(simpleShaderProg->log()));
}
// Compile the blit shader:
@@ -278,11 +278,11 @@ QGLEngineSharedShaders::QGLEngineSharedShaders(const QGLContext* context)
}
blitShaderProg->link();
- if (blitShaderProg->isLinked()) {
+ if (Q_UNLIKELY(!blitShaderProg->isLinked())) {
+ qCritical("Errors linking blit shader: %s", qPrintable(blitShaderProg->log()));
+ } else {
if (!inCache)
blitShaderCache.store(blitShaderProg, context);
- } else {
- qCritical("Errors linking blit shader: %s", qPrintable(blitShaderProg->log()));
}
#ifdef QT_GL_SHARED_SHADER_DEBUG
diff --git a/src/platformsupport/cglconvenience/cglconvenience.mm b/src/platformsupport/cglconvenience/cglconvenience.mm
index 6b0a91e13f..b20f324442 100644
--- a/src/platformsupport/cglconvenience/cglconvenience.mm
+++ b/src/platformsupport/cglconvenience/cglconvenience.mm
@@ -34,7 +34,7 @@
#include "cglconvenience_p.h"
#include <QtCore/qglobal.h>
#include <QtCore/private/qcore_mac_p.h>
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <QVector>
void (*qcgl_getProcAddress(const QByteArray &procName))()
diff --git a/src/platformsupport/cglconvenience/cglconvenience.pri b/src/platformsupport/cglconvenience/cglconvenience.pri
index 0e86ddb208..1de38bbd08 100644
--- a/src/platformsupport/cglconvenience/cglconvenience.pri
+++ b/src/platformsupport/cglconvenience/cglconvenience.pri
@@ -1,4 +1,4 @@
-mac:!ios {
+osx {
INCLUDEPATH += $$PWD
HEADERS += \
@@ -7,5 +7,5 @@ mac:!ios {
OBJECTIVE_SOURCES += \
$$PWD/cglconvenience.mm
- LIBS_PRIVATE += -framework Cocoa -framework OpenGL
+ LIBS_PRIVATE += -framework AppKit -framework OpenGL
}
diff --git a/src/platformsupport/clipboard/qmacmime.mm b/src/platformsupport/clipboard/qmacmime.mm
index ffa548bf83..5fec32c650 100644
--- a/src/platformsupport/clipboard/qmacmime.mm
+++ b/src/platformsupport/clipboard/qmacmime.mm
@@ -32,10 +32,13 @@
****************************************************************************/
#include <QtCore/qsystemdetection.h>
+
+#if defined(Q_OS_OSX)
+#import <AppKit/AppKit.h>
+#endif
+
#if defined(Q_OS_IOS)
#import <UIKit/UIKit.h>
-#elif defined(Q_OS_OSX)
-#import <Cocoa/Cocoa.h>
#endif
#include "qmacmime_p.h"
diff --git a/src/platformsupport/devicediscovery/qdevicediscovery_static.cpp b/src/platformsupport/devicediscovery/qdevicediscovery_static.cpp
index 3aab785b34..de2f3415af 100644
--- a/src/platformsupport/devicediscovery/qdevicediscovery_static.cpp
+++ b/src/platformsupport/devicediscovery/qdevicediscovery_static.cpp
@@ -56,6 +56,12 @@
#ifndef ABS_CNT
#define ABS_CNT (ABS_MAX+1)
#endif
+#ifndef ABS_MT_POSITION_X
+#define ABS_MT_POSITION_X 0x35
+#endif
+#ifndef ABS_MT_POSITION_Y
+#define ABS_MT_POSITION_Y 0x36
+#endif
#define LONG_BITS (sizeof(long) * 8 )
#define LONG_FIELD_SIZE(bits) ((bits / LONG_BITS) + 1)
@@ -113,67 +119,71 @@ QStringList QDeviceDiscoveryStatic::scanConnectedDevices()
bool QDeviceDiscoveryStatic::checkDeviceType(const QString &device)
{
- bool ret = false;
int fd = QT_OPEN(device.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0);
if (!fd) {
qWarning() << "Device discovery cannot open device" << device;
return false;
}
+ qCDebug(lcDD) << "doing static device discovery for " << device;
+
+ if ((m_types & Device_DRM) && device.contains(QString::fromLatin1(QT_DRM_DEVICE_PREFIX)))
+ return true;
+
+ long bitsAbs[LONG_FIELD_SIZE(ABS_CNT)];
long bitsKey[LONG_FIELD_SIZE(KEY_CNT)];
- if (ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(bitsKey)), bitsKey) >= 0 ) {
- if (!ret && (m_types & Device_Keyboard)) {
- if (testBit(KEY_Q, bitsKey)) {
- qCDebug(lcDD) << "Found keyboard at" << device;
- ret = true;
- }
- }
+ long bitsRel[LONG_FIELD_SIZE(REL_CNT)];
+ memset(bitsAbs, 0, sizeof(bitsAbs));
+ memset(bitsKey, 0, sizeof(bitsKey));
+ memset(bitsRel, 0, sizeof(bitsRel));
- if (!ret && (m_types & Device_Mouse)) {
- long bitsRel[LONG_FIELD_SIZE(REL_CNT)];
- if (ioctl(fd, EVIOCGBIT(EV_REL, sizeof(bitsRel)), bitsRel) >= 0 ) {
- if (testBit(REL_X, bitsRel) && testBit(REL_Y, bitsRel) && testBit(BTN_MOUSE, bitsKey)) {
- qCDebug(lcDD) << "Found mouse at" << device;
- ret = true;
- }
- }
+ ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(bitsAbs)), bitsAbs);
+ ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(bitsKey)), bitsKey);
+ ioctl(fd, EVIOCGBIT(EV_REL, sizeof(bitsRel)), bitsRel);
+
+ QT_CLOSE(fd);
+
+ if ((m_types & Device_Keyboard)) {
+ if (testBit(KEY_Q, bitsKey)) {
+ qCDebug(lcDD) << "Found keyboard at" << device;
+ return true;
}
+ }
- if (!ret && (m_types & (Device_Touchpad | Device_Touchscreen))) {
- long bitsAbs[LONG_FIELD_SIZE(ABS_CNT)];
- if (ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(bitsAbs)), bitsAbs) >= 0 ) {
- if (testBit(ABS_X, bitsAbs) && testBit(ABS_Y, bitsAbs)) {
- if ((m_types & Device_Touchpad) && testBit(BTN_TOOL_FINGER, bitsKey)) {
- qCDebug(lcDD) << "Found touchpad at" << device;
- ret = true;
- } else if ((m_types & Device_Touchscreen) && testBit(BTN_TOUCH, bitsKey)) {
- qCDebug(lcDD) << "Found touchscreen at" << device;
- ret = true;
- } else if ((m_types & Device_Tablet) && (testBit(BTN_STYLUS, bitsKey) || testBit(BTN_TOOL_PEN, bitsKey))) {
- qCDebug(lcDD) << "Found tablet at" << device;
- ret = true;
- }
- }
- }
+ if ((m_types & Device_Mouse)) {
+ if (testBit(REL_X, bitsRel) && testBit(REL_Y, bitsRel) && testBit(BTN_MOUSE, bitsKey)) {
+ qCDebug(lcDD) << "Found mouse at" << device;
+ return true;
}
+ }
- if (!ret && (m_types & Device_Joystick)) {
- long bitsAbs[LONG_FIELD_SIZE(ABS_CNT)];
- if (ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(bitsAbs)), bitsAbs) >= 0 ) {
- if ((m_types & Device_Joystick)
- && (testBit(BTN_A, bitsKey) || testBit(BTN_TRIGGER, bitsKey) || testBit(ABS_RX, bitsAbs))) {
- qCDebug(lcDD) << "Found joystick/gamepad at" << device;
- ret = true;
- }
+ if ((m_types & (Device_Touchpad | Device_Touchscreen))) {
+ if (testBit(ABS_X, bitsAbs) && testBit(ABS_Y, bitsAbs)) {
+ if ((m_types & Device_Touchpad) && testBit(BTN_TOOL_FINGER, bitsKey)) {
+ qCDebug(lcDD) << "Found touchpad at" << device;
+ return true;
+ } else if ((m_types & Device_Touchscreen) && testBit(BTN_TOUCH, bitsKey)) {
+ qCDebug(lcDD) << "Found touchscreen at" << device;
+ return true;
+ } else if ((m_types & Device_Tablet) && (testBit(BTN_STYLUS, bitsKey) || testBit(BTN_TOOL_PEN, bitsKey))) {
+ qCDebug(lcDD) << "Found tablet at" << device;
+ return true;
}
+ } else if (testBit(ABS_MT_POSITION_X, bitsAbs) &&
+ testBit(ABS_MT_POSITION_Y, bitsAbs)) {
+ qCDebug(lcDD) << "Found new-style touchscreen at" << device;
+ return true;
}
}
- if (!ret && (m_types & Device_DRM) && device.contains(QString::fromLatin1(QT_DRM_DEVICE_PREFIX)))
- ret = true;
+ if ((m_types & Device_Joystick)) {
+ if (testBit(BTN_A, bitsKey) || testBit(BTN_TRIGGER, bitsKey) || testBit(ABS_RX, bitsAbs)) {
+ qCDebug(lcDD) << "Found joystick/gamepad at" << device;
+ return true;
+ }
+ }
- QT_CLOSE(fd);
- return ret;
+ return false;
}
QT_END_NAMESPACE
diff --git a/src/platformsupport/devicediscovery/qdevicediscovery_udev.cpp b/src/platformsupport/devicediscovery/qdevicediscovery_udev.cpp
index f285e61a9f..334eb51a86 100644
--- a/src/platformsupport/devicediscovery/qdevicediscovery_udev.cpp
+++ b/src/platformsupport/devicediscovery/qdevicediscovery_udev.cpp
@@ -185,11 +185,11 @@ void QDeviceDiscoveryUDev::handleUDevNotification()
// if we cannot determine a type, walk up the device tree
if (!checkDeviceType(dev)) {
// does not increase the refcount
- dev = udev_device_get_parent_with_subsystem_devtype(dev, subsystem, 0);
- if (!dev)
+ struct udev_device *parent_dev = udev_device_get_parent_with_subsystem_devtype(dev, subsystem, 0);
+ if (!parent_dev)
goto cleanup;
- if (!checkDeviceType(dev))
+ if (!checkDeviceType(parent_dev))
goto cleanup;
}
diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
index a5fe88871d..02217a7179 100644
--- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
+++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
@@ -36,6 +36,7 @@
#include <QtCore/QList>
#include <QtCore/QElapsedTimer>
+#include <QtCore/QFile>
#include <qpa/qplatformnativeinterface.h>
#include <qpa/qplatformscreen.h>
diff --git a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
index 0af779097c..a87443cc85 100644
--- a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
+++ b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
@@ -35,8 +35,8 @@
#include <sys/param.h>
-#if defined(Q_OS_MACX)
-#import <Cocoa/Cocoa.h>
+#if defined(Q_OS_OSX)
+#import <AppKit/AppKit.h>
#import <IOKit/graphics/IOGraphicsLib.h>
#elif defined(Q_OS_IOS)
#import <UIKit/UIFont.h>
diff --git a/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm b/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
index 732aead62a..be1696dfe8 100644
--- a/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
+++ b/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
@@ -215,6 +215,8 @@ void QCoreTextFontEngine::init()
Q_ASSERT((void *)(&ctfont + 1) == (void *)&cgFont);
faceData.user_data = &ctfont;
faceData.get_font_table = ct_getSfntTable;
+
+ kerningPairsLoaded = false;
}
glyph_t QCoreTextFontEngine::glyphIndex(uint ucs4) const
@@ -788,4 +790,17 @@ QFontEngine::Properties QCoreTextFontEngine::properties() const
return result;
}
+void QCoreTextFontEngine::doKerning(QGlyphLayout *g, ShaperFlags flags) const
+{
+ if (!kerningPairsLoaded) {
+ kerningPairsLoaded = true;
+ qreal emSquare = CTFontGetUnitsPerEm(ctfont);
+ qreal scale = emSquare / CTFontGetSize(ctfont);
+
+ const_cast<QCoreTextFontEngine *>(this)->loadKerningPairs(QFixed::fromReal(scale));
+ }
+
+ QFontEngine::doKerning(g, flags);
+}
+
QT_END_NAMESPACE
diff --git a/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h b/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h
index 1c33ae7d84..c22d1ddc0a 100644
--- a/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h
+++ b/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h
@@ -97,6 +97,7 @@ public:
glyph_metrics_t alphaMapBoundingBox(glyph_t glyph, QFixed, const QTransform &matrix, GlyphFormat) Q_DECL_OVERRIDE;
QImage bitmapForGlyph(glyph_t, QFixed subPixelPosition, const QTransform &t) Q_DECL_OVERRIDE;
QFixed emSquareSize() const Q_DECL_OVERRIDE;
+ void doKerning(QGlyphLayout *g, ShaperFlags flags) const Q_DECL_OVERRIDE;
bool supportsTransformation(const QTransform &transform) const Q_DECL_OVERRIDE;
@@ -134,6 +135,7 @@ private:
CGAffineTransform transform;
QFixed avgCharWidth;
QFontEngine::FaceId face_id;
+ mutable bool kerningPairsLoaded;
};
CGAffineTransform qt_transform_from_fontdef(const QFontDef &fontDef);
diff --git a/src/platformsupport/graphics/graphics.pri b/src/platformsupport/graphics/graphics.pri
new file mode 100644
index 0000000000..43062682aa
--- /dev/null
+++ b/src/platformsupport/graphics/graphics.pri
@@ -0,0 +1,2 @@
+HEADERS += $$PWD/qrasterbackingstore_p.h
+SOURCES += $$PWD/qrasterbackingstore.cpp
diff --git a/src/platformsupport/graphics/qrasterbackingstore.cpp b/src/platformsupport/graphics/qrasterbackingstore.cpp
new file mode 100644
index 0000000000..a64a4cfa40
--- /dev/null
+++ b/src/platformsupport/graphics/qrasterbackingstore.cpp
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qrasterbackingstore_p.h"
+
+#include <QtGui/qpainter.h>
+
+QT_BEGIN_NAMESPACE
+
+QRasterBackingStore::QRasterBackingStore(QWindow *window)
+ : QPlatformBackingStore(window)
+{
+}
+
+QRasterBackingStore::~QRasterBackingStore()
+{
+}
+
+void QRasterBackingStore::resize(const QSize &size, const QRegion &staticContents)
+{
+ Q_UNUSED(staticContents);
+
+ int windowDevicePixelRatio = window()->devicePixelRatio();
+ QSize effectiveBufferSize = size * windowDevicePixelRatio;
+
+ if (m_image.size() == effectiveBufferSize)
+ return;
+
+ QImage::Format format = window()->format().hasAlpha() ? QImage::Format_ARGB32_Premultiplied : QImage::Format_RGB32;
+ m_image = QImage(effectiveBufferSize, format);
+ m_image.setDevicePixelRatio(windowDevicePixelRatio);
+ if (format == QImage::Format_ARGB32_Premultiplied)
+ m_image.fill(Qt::transparent);
+}
+
+QPaintDevice *QRasterBackingStore::paintDevice()
+{
+ return &m_image;
+}
+
+QImage QRasterBackingStore::toImage() const
+{
+ return m_image;
+}
+
+bool QRasterBackingStore::scroll(const QRegion &region, int dx, int dy)
+{
+ if (window()->surfaceType() != QSurface::RasterSurface)
+ return false;
+
+ extern void qt_scrollRectInImage(QImage &, const QRect &, const QPoint &);
+
+ const qreal devicePixelRatio = m_image.devicePixelRatio();
+ const QPoint delta(dx * devicePixelRatio, dy * devicePixelRatio);
+
+ foreach (const QRect &rect, region.rects())
+ qt_scrollRectInImage(m_image, QRect(rect.topLeft() * devicePixelRatio, rect.size() * devicePixelRatio), delta);
+
+ return true;
+}
+
+void QRasterBackingStore::beginPaint(const QRegion &region)
+{
+ if (!m_image.hasAlphaChannel())
+ return;
+
+ QPainter painter(&m_image);
+ painter.setCompositionMode(QPainter::CompositionMode_Source);
+ const QColor blank = Qt::transparent;
+ foreach (const QRect &rect, region.rects())
+ painter.fillRect(rect, blank);
+}
+
+QT_END_NAMESPACE
diff --git a/src/platformsupport/graphics/qrasterbackingstore_p.h b/src/platformsupport/graphics/qrasterbackingstore_p.h
new file mode 100644
index 0000000000..314a6e6e79
--- /dev/null
+++ b/src/platformsupport/graphics/qrasterbackingstore_p.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QRASTERBACKINGSTORE_P_H
+#define QRASTERBACKINGSTORE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <qpa/qplatformbackingstore.h>
+
+
+QT_BEGIN_NAMESPACE
+
+class QRasterBackingStore : public QPlatformBackingStore
+{
+public:
+ QRasterBackingStore(QWindow *window);
+ ~QRasterBackingStore();
+
+ QPaintDevice *paintDevice() Q_DECL_OVERRIDE;
+ QImage toImage() const Q_DECL_OVERRIDE;
+ void resize (const QSize &size, const QRegion &) Q_DECL_OVERRIDE;
+ bool scroll(const QRegion &area, int dx, int dy) Q_DECL_OVERRIDE;
+ void beginPaint(const QRegion &region) Q_DECL_OVERRIDE;
+
+protected:
+ QImage m_image;
+};
+
+QT_END_NAMESPACE
+
+#endif // QRASTERBACKINGSTORE_P_H
diff --git a/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp b/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp
index 06751de0ef..d467a62abd 100644
--- a/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp
+++ b/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp
@@ -35,6 +35,7 @@
#include <qplatformdefs.h>
+#include <QFile>
#include <QSocketNotifier>
#include <QStringList>
#include <QCoreApplication>
diff --git a/src/platformsupport/input/evdevtablet/evdevtablet.pri b/src/platformsupport/input/evdevtablet/evdevtablet.pri
index 5ace0df61d..fb9489353c 100644
--- a/src/platformsupport/input/evdevtablet/evdevtablet.pri
+++ b/src/platformsupport/input/evdevtablet/evdevtablet.pri
@@ -1,8 +1,10 @@
HEADERS += \
- $$PWD/qevdevtablet_p.h
+ $$PWD/qevdevtablethandler_p.h \
+ $$PWD/qevdevtabletmanager_p.h
SOURCES += \
- $$PWD/qevdevtablet.cpp
+ $$PWD/qevdevtablethandler.cpp \
+ $$PWD/qevdevtabletmanager.cpp
contains(QT_CONFIG, libudev) {
LIBS_PRIVATE += $$QMAKE_LIBS_LIBUDEV
diff --git a/src/platformsupport/input/evdevtablet/qevdevtablet.cpp b/src/platformsupport/input/evdevtablet/qevdevtablethandler.cpp
index c6f952c64d..aa87340112 100644
--- a/src/platformsupport/input/evdevtablet/qevdevtablet.cpp
+++ b/src/platformsupport/input/evdevtablet/qevdevtablethandler.cpp
@@ -31,14 +31,14 @@
**
****************************************************************************/
-#include "qevdevtablet_p.h"
-#include <qpa/qwindowsysteminterface.h>
+#include "qevdevtablethandler_p.h"
+
#include <QStringList>
#include <QSocketNotifier>
#include <QGuiApplication>
#include <QLoggingCategory>
#include <QtCore/private/qcore_unix_p.h>
-#include <QtPlatformSupport/private/qdevicediscovery_p.h>
+#include <qpa/qwindowsysteminterface.h>
#include <linux/input.h>
QT_BEGIN_NAMESPACE
@@ -49,16 +49,11 @@ class QEvdevTabletData
{
public:
QEvdevTabletData(QEvdevTabletHandler *q_ptr);
- bool queryLimits();
- void testGrab();
+
void processInputEvent(input_event *ev);
- void reportProximityEnter();
- void reportProximityLeave();
void report();
QEvdevTabletHandler *q;
- QSocketNotifier *notifier;
- int fd;
int lastEventType;
QString devName;
struct {
@@ -73,57 +68,13 @@ public:
};
QEvdevTabletData::QEvdevTabletData(QEvdevTabletHandler *q_ptr)
- : q(q_ptr), notifier(0), fd(-1), lastEventType(0)
+ : q(q_ptr), lastEventType(0)
{
memset(&minValues, 0, sizeof(minValues));
memset(&maxValues, 0, sizeof(maxValues));
memset(&state, 0, sizeof(state));
}
-bool QEvdevTabletData::queryLimits()
-{
- bool ok = true;
- input_absinfo absInfo;
- memset(&absInfo, 0, sizeof(input_absinfo));
- ok &= ioctl(fd, EVIOCGABS(ABS_X), &absInfo) >= 0;
- if (ok) {
- minValues.x = absInfo.minimum;
- maxValues.x = absInfo.maximum;
- qCDebug(qLcEvdevTablet, "evdevtablet: min X: %d max X: %d", minValues.x, maxValues.x);
- }
- ok &= ioctl(fd, EVIOCGABS(ABS_Y), &absInfo) >= 0;
- if (ok) {
- minValues.y = absInfo.minimum;
- maxValues.y = absInfo.maximum;
- qCDebug(qLcEvdevTablet, "evdevtablet: min Y: %d max Y: %d", minValues.y, maxValues.y);
- }
- if (ioctl(fd, EVIOCGABS(ABS_PRESSURE), &absInfo) >= 0) {
- minValues.p = absInfo.minimum;
- maxValues.p = absInfo.maximum;
- qCDebug(qLcEvdevTablet, "evdevtablet: min pressure: %d max pressure: %d", minValues.p, maxValues.p);
- }
- if (ioctl(fd, EVIOCGABS(ABS_DISTANCE), &absInfo) >= 0) {
- minValues.d = absInfo.minimum;
- maxValues.d = absInfo.maximum;
- qCDebug(qLcEvdevTablet, "evdevtablet: min distance: %d max distance: %d", minValues.d, maxValues.d);
- }
- char name[128];
- if (ioctl(fd, EVIOCGNAME(sizeof(name) - 1), name) >= 0) {
- devName = QString::fromLocal8Bit(name);
- qCDebug(qLcEvdevTablet, "evdevtablet: device name: %s", name);
- }
- return ok;
-}
-
-void QEvdevTabletData::testGrab()
-{
- bool grabSuccess = !ioctl(fd, EVIOCGRAB, (void *) 1);
- if (grabSuccess)
- ioctl(fd, EVIOCGRAB, (void *) 0);
- else
- qWarning("evdevtablet: ERROR: The device is grabbed by another process. No events will be read.");
-}
-
void QEvdevTabletData::processInputEvent(input_event *ev)
{
if (ev->type == EV_ABS) {
@@ -167,20 +118,10 @@ void QEvdevTabletData::processInputEvent(input_event *ev)
lastEventType = ev->type;
}
-void QEvdevTabletData::reportProximityEnter()
-{
- QWindowSystemInterface::handleTabletEnterProximityEvent(QTabletEvent::Stylus, state.tool, 1);
-}
-
-void QEvdevTabletData::reportProximityLeave()
-{
- QWindowSystemInterface::handleTabletLeaveProximityEvent(QTabletEvent::Stylus, state.tool, 1);
-}
-
void QEvdevTabletData::report()
{
if (!state.lastReportTool && state.tool)
- reportProximityEnter();
+ QWindowSystemInterface::handleTabletEnterProximityEvent(QTabletEvent::Stylus, state.tool, q->deviceId());
qreal nx = (state.x - minValues.x) / qreal(maxValues.x - minValues.x);
qreal ny = (state.y - minValues.y) / qreal(maxValues.y - minValues.y);
@@ -194,16 +135,17 @@ void QEvdevTabletData::report()
pointer = state.lastReportTool;
}
- qreal pressure = (state.p - minValues.p) / qreal(maxValues.p - minValues.p);
+ int pressureRange = maxValues.p - minValues.p;
+ qreal pressure = pressureRange ? (state.p - minValues.p) / qreal(pressureRange) : qreal(1);
if (state.down || state.lastReportDown) {
QWindowSystemInterface::handleTabletEvent(0, state.down, QPointF(), globalPos,
QTabletEvent::Stylus, pointer,
- pressure, 0, 0, 0, 0, 0, 1, qGuiApp->keyboardModifiers());
+ pressure, 0, 0, 0, 0, 0, q->deviceId(), qGuiApp->keyboardModifiers());
}
if (state.lastReportTool && !state.tool)
- reportProximityLeave();
+ QWindowSystemInterface::handleTabletLeaveProximityEvent(QTabletEvent::Stylus, state.tool, q->deviceId());
state.lastReportDown = state.down;
state.lastReportTool = state.tool;
@@ -211,69 +153,104 @@ void QEvdevTabletData::report()
}
-QEvdevTabletHandler::QEvdevTabletHandler(const QString &spec, QObject *parent)
- : QObject(parent), d(0)
+QEvdevTabletHandler::QEvdevTabletHandler(const QString &device, const QString &spec, QObject *parent)
+ : QObject(parent), m_fd(-1), m_device(device), m_notifier(0), d(0)
{
+ Q_UNUSED(spec)
+
setObjectName(QLatin1String("Evdev Tablet Handler"));
- d = new QEvdevTabletData(this);
- QString dev;
- QStringList args = spec.split(QLatin1Char(':'));
- for (int i = 0; i < args.count(); ++i) {
- if (args.at(i).startsWith(QLatin1String("/dev/"))) {
- dev = args.at(i);
- break;
- }
- }
- if (dev.isEmpty()) {
- QScopedPointer<QDeviceDiscovery> deviceDiscovery(
- QDeviceDiscovery::create(QDeviceDiscovery::Device_Tablet, this));
- if (deviceDiscovery) {
- QStringList devices = deviceDiscovery->scanConnectedDevices();
- if (!devices.isEmpty())
- dev = devices.at(0);
- }
- }
- if (!dev.isEmpty()) {
- qCDebug(qLcEvdevTablet, "evdevtablet: using %s", qPrintable(dev));
- d->fd = QT_OPEN(dev.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0);
- if (d->fd >= 0) {
- d->testGrab();
- if (d->queryLimits()) {
- d->notifier = new QSocketNotifier(d->fd, QSocketNotifier::Read, this);
- connect(d->notifier, SIGNAL(activated(int)), this, SLOT(readData()));
- }
- } else {
- qErrnoWarning(errno, "evdevtablet: Cannot open input device");
- }
+
+ qCDebug(qLcEvdevTablet, "evdevtablet: using %s", qPrintable(device));
+
+ m_fd = QT_OPEN(device.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0);
+ if (m_fd < 0) {
+ qErrnoWarning(errno, "evdevtablet: Cannot open input device %s", qPrintable(device));
+ return;
}
+
+ bool grabSuccess = !ioctl(m_fd, EVIOCGRAB, (void *) 1);
+ if (grabSuccess)
+ ioctl(m_fd, EVIOCGRAB, (void *) 0);
+ else
+ qWarning("evdevtablet: %s: The device is grabbed by another process. No events will be read.", qPrintable(device));
+
+ d = new QEvdevTabletData(this);
+ if (!queryLimits())
+ qWarning("evdevtablet: %s: Unset or invalid ABS limits. Behavior will be unspecified.", qPrintable(device));
+
+ m_notifier = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
+ connect(m_notifier, &QSocketNotifier::activated, this, &QEvdevTabletHandler::readData);
}
QEvdevTabletHandler::~QEvdevTabletHandler()
{
- delete d->notifier;
- if (d->fd >= 0)
- QT_CLOSE(d->fd);
+ if (m_fd >= 0)
+ QT_CLOSE(m_fd);
delete d;
}
+qint64 QEvdevTabletHandler::deviceId() const
+{
+ return m_fd;
+}
+
+bool QEvdevTabletHandler::queryLimits()
+{
+ bool ok = true;
+ input_absinfo absInfo;
+ memset(&absInfo, 0, sizeof(input_absinfo));
+ ok &= ioctl(m_fd, EVIOCGABS(ABS_X), &absInfo) >= 0;
+ if (ok) {
+ d->minValues.x = absInfo.minimum;
+ d->maxValues.x = absInfo.maximum;
+ qCDebug(qLcEvdevTablet, "evdevtablet: %s: min X: %d max X: %d", qPrintable(m_device),
+ d->minValues.x, d->maxValues.x);
+ }
+ ok &= ioctl(m_fd, EVIOCGABS(ABS_Y), &absInfo) >= 0;
+ if (ok) {
+ d->minValues.y = absInfo.minimum;
+ d->maxValues.y = absInfo.maximum;
+ qCDebug(qLcEvdevTablet, "evdevtablet: %s: min Y: %d max Y: %d", qPrintable(m_device),
+ d->minValues.y, d->maxValues.y);
+ }
+ if (ioctl(m_fd, EVIOCGABS(ABS_PRESSURE), &absInfo) >= 0) {
+ d->minValues.p = absInfo.minimum;
+ d->maxValues.p = absInfo.maximum;
+ qCDebug(qLcEvdevTablet, "evdevtablet: %s: min pressure: %d max pressure: %d", qPrintable(m_device),
+ d->minValues.p, d->maxValues.p);
+ }
+ if (ioctl(m_fd, EVIOCGABS(ABS_DISTANCE), &absInfo) >= 0) {
+ d->minValues.d = absInfo.minimum;
+ d->maxValues.d = absInfo.maximum;
+ qCDebug(qLcEvdevTablet, "evdevtablet: %s: min distance: %d max distance: %d", qPrintable(m_device),
+ d->minValues.d, d->maxValues.d);
+ }
+ char name[128];
+ if (ioctl(m_fd, EVIOCGNAME(sizeof(name) - 1), name) >= 0) {
+ d->devName = QString::fromLocal8Bit(name);
+ qCDebug(qLcEvdevTablet, "evdevtablet: %s: device name: %s", qPrintable(m_device), name);
+ }
+ return ok;
+}
+
void QEvdevTabletHandler::readData()
{
static input_event buffer[32];
int n = 0;
for (; ;) {
- int result = QT_READ(d->fd, reinterpret_cast<char*>(buffer) + n, sizeof(buffer) - n);
+ int result = QT_READ(m_fd, reinterpret_cast<char*>(buffer) + n, sizeof(buffer) - n);
if (!result) {
- qWarning("evdevtablet: Got EOF from input device");
+ qWarning("evdevtablet: %s: Got EOF from input device", qPrintable(m_device));
return;
} else if (result < 0) {
if (errno != EINTR && errno != EAGAIN) {
- qErrnoWarning(errno, "evdevtablet: Could not read from input device");
+ qErrnoWarning(errno, "evdevtablet: %s: Could not read from input device", qPrintable(m_device));
if (errno == ENODEV) { // device got disconnected -> stop reading
- delete d->notifier;
- d->notifier = 0;
- QT_CLOSE(d->fd);
- d->fd = -1;
+ delete m_notifier;
+ m_notifier = 0;
+ QT_CLOSE(m_fd);
+ m_fd = -1;
}
return;
}
@@ -291,8 +268,8 @@ void QEvdevTabletHandler::readData()
}
-QEvdevTabletHandlerThread::QEvdevTabletHandlerThread(const QString &spec, QObject *parent)
- : QDaemonThread(parent), m_spec(spec), m_handler(0)
+QEvdevTabletHandlerThread::QEvdevTabletHandlerThread(const QString &device, const QString &spec, QObject *parent)
+ : QDaemonThread(parent), m_device(device), m_spec(spec), m_handler(0)
{
start();
}
@@ -305,7 +282,7 @@ QEvdevTabletHandlerThread::~QEvdevTabletHandlerThread()
void QEvdevTabletHandlerThread::run()
{
- m_handler = new QEvdevTabletHandler(m_spec);
+ m_handler = new QEvdevTabletHandler(m_device, m_spec);
exec();
delete m_handler;
m_handler = 0;
diff --git a/src/platformsupport/input/evdevtablet/qevdevtablet_p.h b/src/platformsupport/input/evdevtablet/qevdevtablethandler_p.h
index f546f9a88a..4a9b2bab34 100644
--- a/src/platformsupport/input/evdevtablet/qevdevtablet_p.h
+++ b/src/platformsupport/input/evdevtablet/qevdevtablethandler_p.h
@@ -31,8 +31,8 @@
**
****************************************************************************/
-#ifndef QEVDEVTABLET_P_H
-#define QEVDEVTABLET_P_H
+#ifndef QEVDEVTABLETHANDLER_P_H
+#define QEVDEVTABLETHANDLER_P_H
//
// W A R N I N G
@@ -52,6 +52,7 @@
QT_BEGIN_NAMESPACE
+class QSocketNotifier;
class QEvdevTabletData;
class QEvdevTabletHandler : public QObject
@@ -59,29 +60,37 @@ class QEvdevTabletHandler : public QObject
Q_OBJECT
public:
- explicit QEvdevTabletHandler(const QString &spec = QString(), QObject *parent = 0);
+ explicit QEvdevTabletHandler(const QString &device, const QString &spec = QString(), QObject *parent = 0);
~QEvdevTabletHandler();
+ qint64 deviceId() const;
+
private slots:
void readData();
private:
+ bool queryLimits();
+
+ int m_fd;
+ QString m_device;
+ QSocketNotifier *m_notifier;
QEvdevTabletData *d;
};
class QEvdevTabletHandlerThread : public QDaemonThread
{
public:
- explicit QEvdevTabletHandlerThread(const QString &spec, QObject *parent = 0);
+ explicit QEvdevTabletHandlerThread(const QString &device, const QString &spec, QObject *parent = 0);
~QEvdevTabletHandlerThread();
void run() Q_DECL_OVERRIDE;
QEvdevTabletHandler *handler() { return m_handler; }
private:
+ QString m_device;
QString m_spec;
QEvdevTabletHandler *m_handler;
};
QT_END_NAMESPACE
-#endif // QEVDEVTABLET_P_H
+#endif // QEVDEVTABLETHANDLER_P_H
diff --git a/src/platformsupport/input/evdevtablet/qevdevtabletmanager.cpp b/src/platformsupport/input/evdevtablet/qevdevtabletmanager.cpp
new file mode 100644
index 0000000000..05fd6e655c
--- /dev/null
+++ b/src/platformsupport/input/evdevtablet/qevdevtabletmanager.cpp
@@ -0,0 +1,122 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the plugins module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qevdevtabletmanager_p.h"
+#include "qevdevtablethandler_p.h"
+
+#include <QStringList>
+#include <QGuiApplication>
+#include <QLoggingCategory>
+#include <QtPlatformSupport/private/qdevicediscovery_p.h>
+#include <private/qguiapplication_p.h>
+#include <private/qinputdevicemanager_p_p.h>
+
+QT_BEGIN_NAMESPACE
+
+Q_DECLARE_LOGGING_CATEGORY(qLcEvdevTablet)
+
+QEvdevTabletManager::QEvdevTabletManager(const QString &key, const QString &specification, QObject *parent)
+ : QObject(parent)
+{
+ Q_UNUSED(key);
+
+ if (qEnvironmentVariableIsSet("QT_QPA_EVDEV_DEBUG"))
+ const_cast<QLoggingCategory &>(qLcEvdevTablet()).setEnabled(QtDebugMsg, true);
+
+ QString spec = QString::fromLocal8Bit(qgetenv("QT_QPA_EVDEV_TABLET_PARAMETERS"));
+
+ if (spec.isEmpty())
+ spec = specification;
+
+ QStringList args = spec.split(QLatin1Char(':'));
+ QStringList devices;
+
+ foreach (const QString &arg, args) {
+ if (arg.startsWith(QLatin1String("/dev/"))) {
+ devices.append(arg);
+ args.removeAll(arg);
+ }
+ }
+
+ // build new specification without /dev/ elements
+ m_spec = args.join(QLatin1Char(':'));
+
+ foreach (const QString &device, devices)
+ addDevice(device);
+
+ // when no devices specified, use device discovery to scan and monitor
+ if (devices.isEmpty()) {
+ qCDebug(qLcEvdevTablet) << "evdevtablet: Using device discovery";
+ m_deviceDiscovery = QDeviceDiscovery::create(QDeviceDiscovery::Device_Tablet, this);
+ if (m_deviceDiscovery) {
+ QStringList devices = m_deviceDiscovery->scanConnectedDevices();
+ foreach (const QString &device, devices)
+ addDevice(device);
+ connect(m_deviceDiscovery, SIGNAL(deviceDetected(QString)), this, SLOT(addDevice(QString)));
+ connect(m_deviceDiscovery, SIGNAL(deviceRemoved(QString)), this, SLOT(removeDevice(QString)));
+ }
+ }
+}
+
+QEvdevTabletManager::~QEvdevTabletManager()
+{
+ qDeleteAll(m_activeDevices);
+}
+
+void QEvdevTabletManager::addDevice(const QString &deviceNode)
+{
+ qCDebug(qLcEvdevTablet) << "Adding device at" << deviceNode;
+ QEvdevTabletHandlerThread *handler;
+ handler = new QEvdevTabletHandlerThread(deviceNode, m_spec);
+ if (handler) {
+ m_activeDevices.insert(deviceNode, handler);
+ QInputDeviceManagerPrivate::get(QGuiApplicationPrivate::inputDeviceManager())->setDeviceCount(
+ QInputDeviceManager::DeviceTypeTablet, m_activeDevices.count());
+ } else {
+ qWarning("evdevtablet: Failed to open tablet device %s", qPrintable(deviceNode));
+ }
+}
+
+void QEvdevTabletManager::removeDevice(const QString &deviceNode)
+{
+ if (m_activeDevices.contains(deviceNode)) {
+ qCDebug(qLcEvdevTablet) << "Removing device at" << deviceNode;
+ QEvdevTabletHandlerThread *handler = m_activeDevices.value(deviceNode);
+ m_activeDevices.remove(deviceNode);
+ QInputDeviceManagerPrivate::get(QGuiApplicationPrivate::inputDeviceManager())->setDeviceCount(
+ QInputDeviceManager::DeviceTypeTablet, m_activeDevices.count());
+ delete handler;
+ }
+}
+
+QT_END_NAMESPACE
diff --git a/src/widgets/styles/qgtkglobal_p.h b/src/platformsupport/input/evdevtablet/qevdevtabletmanager_p.h
index 7d729d7fc0..893ff03fa7 100644
--- a/src/widgets/styles/qgtkglobal_p.h
+++ b/src/platformsupport/input/evdevtablet/qevdevtabletmanager_p.h
@@ -3,7 +3,7 @@
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
-** This file is part of the QtWidgets module of the Qt Toolkit.
+** This file is part of the QtGui module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL21$
** Commercial License Usage
@@ -31,8 +31,8 @@
**
****************************************************************************/
-#ifndef QGTKGLOBAL_P_H
-#define QGTKGLOBAL_P_H
+#ifndef QEVDEVTABLETMANAGER_P_H
+#define QEVDEVTABLETMANAGER_P_H
//
// W A R N I N G
@@ -45,38 +45,32 @@
// We mean it.
//
-#include <QtCore/qglobal.h>
-#if !defined(QT_NO_STYLE_GTK)
+#include <QObject>
+#include <QHash>
+#include <QSocketNotifier>
-#undef signals // Collides with GTK symbols
-#include <gtk/gtk.h>
-
-typedef unsigned long XID;
+QT_BEGIN_NAMESPACE
-#undef GTK_OBJECT_FLAGS
-#define GTK_OBJECT_FLAGS(obj)(((GtkObject*)(obj))->flags)
+class QDeviceDiscovery;
+class QEvdevTabletHandlerThread;
-#define QLS(x) QLatin1String(x)
+class QEvdevTabletManager : public QObject
+{
+ Q_OBJECT
+public:
+ QEvdevTabletManager(const QString &key, const QString &spec, QObject *parent = 0);
+ ~QEvdevTabletManager();
-QT_BEGIN_NAMESPACE
+private slots:
+ void addDevice(const QString &deviceNode);
+ void removeDevice(const QString &deviceNode);
-#if Q_BYTE_ORDER == Q_BIG_ENDIAN
-# define QT_RED 3
-# define QT_GREEN 2
-# define QT_BLUE 1
-# define QT_ALPHA 0
-#else
-# define QT_RED 0
-# define QT_GREEN 1
-# define QT_BLUE 2
-# define QT_ALPHA 3
-#endif
-# define GTK_RED 2
-# define GTK_GREEN 1
-# define GTK_BLUE 0
-# define GTK_ALPHA 3
+private:
+ QString m_spec;
+ QDeviceDiscovery *m_deviceDiscovery;
+ QHash<QString, QEvdevTabletHandlerThread *> m_activeDevices;
+};
QT_END_NAMESPACE
-#endif // !QT_NO_STYLE_GTK
-#endif // QGTKGLOBAL_P_H
+#endif // QEVDEVTABLETMANAGER_P_H
diff --git a/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp b/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp
index ad348cc083..dc40f728e1 100644
--- a/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp
+++ b/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp
@@ -36,6 +36,7 @@
#include <QHash>
#include <QSocketNotifier>
#include <QGuiApplication>
+#include <QTouchDevice>
#include <QLoggingCategory>
#include <QtCore/private/qcore_unix_p.h>
#include <QtGui/private/qhighdpiscaling_p.h>
diff --git a/src/platformsupport/input/libinput/qlibinputhandler.cpp b/src/platformsupport/input/libinput/qlibinputhandler.cpp
index 5aa66a4eaf..58fbaacd2b 100644
--- a/src/platformsupport/input/libinput/qlibinputhandler.cpp
+++ b/src/platformsupport/input/libinput/qlibinputhandler.cpp
@@ -85,18 +85,18 @@ QLibInputHandler::QLibInputHandler(const QString &key, const QString &spec)
Q_UNUSED(spec);
m_udev = udev_new();
- if (!m_udev)
+ if (Q_UNLIKELY(!m_udev))
qFatal("Failed to get udev context for libinput");
m_li = libinput_udev_create_context(&liInterface, Q_NULLPTR, m_udev);
- if (!m_li)
+ if (Q_UNLIKELY(!m_li))
qFatal("Failed to get libinput context");
libinput_log_set_handler(m_li, liLogHandler);
if (qLcLibInput().isDebugEnabled())
libinput_log_set_priority(m_li, LIBINPUT_LOG_PRIORITY_DEBUG);
- if (libinput_udev_assign_seat(m_li, "seat0"))
+ if (Q_UNLIKELY(libinput_udev_assign_seat(m_li, "seat0")))
qFatal("Failed to assign seat");
m_liFd = libinput_get_fd(m_li);
diff --git a/src/platformsupport/platformsupport.pro b/src/platformsupport/platformsupport.pro
index 1ea6d0eb69..81c7faa389 100644
--- a/src/platformsupport/platformsupport.pro
+++ b/src/platformsupport/platformsupport.pro
@@ -25,5 +25,6 @@ contains(QT_CONFIG, dbus) {
include(dbusmenu/dbusmenu.pri)
include(dbustray/dbustray.pri)
}
+ios: include(graphics/graphics.pri)
load(qt_module)
diff --git a/src/platformsupport/services/genericunix/qgenericunixservices.cpp b/src/platformsupport/services/genericunix/qgenericunixservices.cpp
index 33cb4391f0..01efa1449f 100644
--- a/src/platformsupport/services/genericunix/qgenericunixservices.cpp
+++ b/src/platformsupport/services/genericunix/qgenericunixservices.cpp
@@ -42,6 +42,8 @@
QT_BEGIN_NAMESPACE
+#ifndef QT_NO_MULTIPROCESS
+
enum { debug = 0 };
static inline QByteArray detectDesktopEnvironment()
@@ -149,4 +151,24 @@ bool QGenericUnixServices::openDocument(const QUrl &url)
return launch(m_documentLauncher, url);
}
+#else
+QByteArray QGenericUnixServices::desktopEnvironment() const
+{
+ return QByteArrayLiteral("UNKNOWN");
+}
+
+bool QGenericUnixServices::openUrl(const QUrl &url)
+{
+ qWarning("openUrl() not supported on this platform");
+ return false;
+}
+
+bool QGenericUnixServices::openDocument(const QUrl &url)
+{
+ qWarning("openDocument() not supported on this platform");
+ return false;
+}
+
+#endif // QT_NO_MULTIPROCESS
+
QT_END_NAMESPACE
diff --git a/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp b/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp
index 8f6171f217..ee62710913 100644
--- a/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp
+++ b/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp
@@ -616,7 +616,7 @@ QVariant QGnomeTheme::themeHint(QPlatformTheme::ThemeHint hint) const
return QVariant(QGenericUnixTheme::xdgIconThemePaths());
case QPlatformTheme::StyleNames: {
QStringList styleNames;
- styleNames << QStringLiteral("GTK+") << QStringLiteral("fusion") << QStringLiteral("windows");
+ styleNames << QStringLiteral("fusion") << QStringLiteral("windows");
return QVariant(styleNames);
}
case QPlatformTheme::KeyboardScheme:
@@ -714,9 +714,9 @@ QStringList QGenericUnixTheme::themeNames()
result.push_back(QLatin1String(QKdeTheme::name));
#endif
} else if (gtkBasedEnvironments.contains(desktopName)) {
- // prefer the GTK2 theme implementation with native dialogs etc.
- result.push_back(QStringLiteral("gtk2"));
- // fallback to the generic Gnome theme if loading the GTK2 theme fails
+ // prefer the GTK3 theme implementation with native dialogs etc.
+ result.push_back(QStringLiteral("gtk3"));
+ // fallback to the generic Gnome theme if loading the GTK3 theme fails
result.push_back(QLatin1String(QGnomeTheme::name));
}
}
diff --git a/src/plugins/bearer/android/src/wrappers/androidconnectivitymanager.cpp b/src/plugins/bearer/android/src/wrappers/androidconnectivitymanager.cpp
index da5f042abd..d422353c90 100644
--- a/src/plugins/bearer/android/src/wrappers/androidconnectivitymanager.cpp
+++ b/src/plugins/bearer/android/src/wrappers/androidconnectivitymanager.cpp
@@ -321,10 +321,6 @@ int AndroidConnectivityManager::getNetworkPreference() const
bool AndroidConnectivityManager::isActiveNetworkMetered() const
{
- // This function was added in JB
- if (QtAndroidPrivate::androidSdkVersion() < 16)
- return false;
-
return m_connectivityManager.callMethod<jboolean>("isActiveNetworkMetered");
}
diff --git a/src/plugins/bearer/bearer.pro b/src/plugins/bearer/bearer.pro
index a1434fc2ea..61e6f46ebc 100644
--- a/src/plugins/bearer/bearer.pro
+++ b/src/plugins/bearer/bearer.pro
@@ -7,7 +7,6 @@ TEMPLATE = subdirs
#win32:SUBDIRS += nla
win32:SUBDIRS += generic
-blackberry:SUBDIRS += blackberry
win32:!wince:!winrt: SUBDIRS += nativewifi
mac:contains(QT_CONFIG, corewlan):SUBDIRS += corewlan
mac:SUBDIRS += generic
diff --git a/src/plugins/bearer/blackberry/blackberry.json b/src/plugins/bearer/blackberry/blackberry.json
deleted file mode 100644
index 233f05cf53..0000000000
--- a/src/plugins/bearer/blackberry/blackberry.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "Keys": [ "blackberry" ]
-}
diff --git a/src/plugins/bearer/blackberry/blackberry.pro b/src/plugins/bearer/blackberry/blackberry.pro
deleted file mode 100644
index c75de3aaad..0000000000
--- a/src/plugins/bearer/blackberry/blackberry.pro
+++ /dev/null
@@ -1,20 +0,0 @@
-TARGET = qbbbearer
-
-PLUGIN_TYPE = bearer
-PLUGIN_CLASS_NAME = QBBEnginePlugin
-load(qt_plugin)
-
-QT = core-private network-private
-
-# Uncomment this to enable debugging output for the plugin
-#DEFINES += QBBENGINE_DEBUG
-
-HEADERS += qbbengine.h \
- ../qnetworksession_impl.h \
- ../qbearerengine_impl.h
-
-SOURCES += qbbengine.cpp \
- ../qnetworksession_impl.cpp \
- main.cpp
-
-OTHER_FILES += blackberry.json
diff --git a/src/plugins/bearer/blackberry/qbbengine.cpp b/src/plugins/bearer/blackberry/qbbengine.cpp
deleted file mode 100644
index 5483c48eaa..0000000000
--- a/src/plugins/bearer/blackberry/qbbengine.cpp
+++ /dev/null
@@ -1,413 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Research In Motion
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qbbengine.h"
-#include "../qnetworksession_impl.h"
-
-#include <QDebug>
-#include <QThreadStorage>
-#include <QStringList>
-#include <QTimer>
-
-#include <bps/netstatus.h>
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-#ifdef QBBENGINE_DEBUG
-#define qBearerDebug qDebug
-#else
-#define qBearerDebug QT_NO_QDEBUG_MACRO
-#endif
-
-struct NetstatusInterfaceListCleanupHelper
-{
- static inline void cleanup(netstatus_interface_list_t *list)
- {
- netstatus_free_interfaces(list);
- }
-};
-
-struct NetstatusInterfaceCleanupHelper
-{
- static inline void cleanup(char *interface)
- {
- bps_free(interface);
- }
-};
-
-struct EngineInstanceHolder
-{
- EngineInstanceHolder(QBBEngine *engine) :
- instance(engine) {}
-
- QBBEngine *instance;
-};
-
-Q_GLOBAL_STATIC(QThreadStorage<EngineInstanceHolder *>, instanceStorage);
-
-static QNetworkConfiguration::BearerType
-interfaceType(netstatus_interface_type_t type)
-{
- switch (type) {
- case NETSTATUS_INTERFACE_TYPE_USB:
- case NETSTATUS_INTERFACE_TYPE_WIRED:
- return QNetworkConfiguration::BearerEthernet;
-
- case NETSTATUS_INTERFACE_TYPE_WIFI:
- return QNetworkConfiguration::BearerWLAN;
-
- case NETSTATUS_INTERFACE_TYPE_BLUETOOTH_DUN:
- return QNetworkConfiguration::BearerBluetooth;
-
- case NETSTATUS_INTERFACE_TYPE_CELLULAR:
- // The exact bearer type is determined in QNetworkConfiguration
- // at the time this info is queried, because opposed to the
- // information here the type might change quickly.
- return QNetworkConfiguration::Bearer2G;
-
- case NETSTATUS_INTERFACE_TYPE_VPN:
- case NETSTATUS_INTERFACE_TYPE_BB:
- case NETSTATUS_INTERFACE_TYPE_UNKNOWN:
- break;
- }
-
- return QNetworkConfiguration::BearerUnknown;
-}
-
-static QString idForName(const QString &name)
-{
- return QStringLiteral("bps:") + name;
-}
-
-QT_BEGIN_NAMESPACE
-
-
-QBBEngine::QBBEngine(QObject *parent) :
- QBearerEngineImpl(parent),
- pollingRequired(false),
- initialized(false)
-{
-}
-
-QBBEngine::~QBBEngine()
-{
-}
-
-
-QString QBBEngine::getInterfaceFromId(const QString &id)
-{
- const QMutexLocker locker(&mutex);
-
- return configurationInterface.value(id);
-}
-
-bool QBBEngine::hasIdentifier(const QString &id)
-{
- const QMutexLocker locker(&mutex);
-
- return configurationInterface.contains(id);
-}
-
-void QBBEngine::connectToId(const QString &id)
-{
- Q_EMIT connectionError(id, OperationNotSupported);
-}
-
-void QBBEngine::disconnectFromId(const QString &id)
-{
- Q_EMIT connectionError(id, OperationNotSupported);
-}
-
-void QBBEngine::initialize()
-{
- if (initialized) {
- qWarning("called, but instance already initialized.");
- return;
- }
-
- instanceStorage()->setLocalData(new EngineInstanceHolder(this));
-
- if (netstatus_request_events(0) != BPS_SUCCESS) {
- qWarning("cannot register for network events. Polling enabled.");
-
- const QMutexLocker locker(&pollingMutex);
- pollingRequired = true;
- } else {
- QAbstractEventDispatcher::instance()->installEventFilter(this);
- }
-
- doRequestUpdate();
-}
-
-void QBBEngine::requestUpdate()
-{
- doRequestUpdate();
-}
-
-void QBBEngine::doRequestUpdate()
-{
- qBearerDebug("entered method");
-
- netstatus_interface_list_t interfaceList;
-
- if ((netstatus_get_interfaces(&interfaceList)) != BPS_SUCCESS) {
- qBearerDebug("cannot retrieve interface list");
- return;
- }
-
- const QScopedPointer<netstatus_interface_list_t,
- NetstatusInterfaceListCleanupHelper> holder(&interfaceList);
-
- QSet<QString> currentConfigurations;
-
- for (int i = 0; i < interfaceList.num_interfaces; i++) {
- const char *interface = interfaceList.interfaces[i];
-
- qBearerDebug() << "discovered interface" << interface;
-
- updateConfiguration(interface);
-
- currentConfigurations << idForName(QString::fromLatin1(interface));
- }
-
- QMutexLocker locker(&mutex);
-
- const QStringList keys = accessPointConfigurations.uniqueKeys();
-
- locker.unlock();
-
- Q_FOREACH (const QString &id, keys) {
- if (!currentConfigurations.contains(id))
- removeConfiguration(id);
- }
-
- Q_EMIT updateCompleted();
-}
-
-QNetworkSession::State QBBEngine::sessionStateForId(const QString &id)
-{
- const QMutexLocker locker(&mutex);
-
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
-
- if (!ptr || !ptr->isValid)
- return QNetworkSession::Invalid;
-
- if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active)
- return QNetworkSession::Connected;
- else if ((ptr->state & QNetworkConfiguration::Discovered) == QNetworkConfiguration::Discovered)
- return QNetworkSession::Disconnected;
- else if ((ptr->state & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined)
- return QNetworkSession::NotAvailable;
- else if ((ptr->state & QNetworkConfiguration::Undefined) == QNetworkConfiguration::Undefined)
- return QNetworkSession::NotAvailable;
-
- return QNetworkSession::Invalid;
-}
-
-QNetworkConfigurationManager::Capabilities QBBEngine::capabilities() const
-{
- return QNetworkConfigurationManager::ForcedRoaming;
-}
-
-QNetworkSessionPrivate *QBBEngine::createSessionBackend()
-{
- return new QNetworkSessionPrivateImpl;
-}
-
-QNetworkConfigurationPrivatePointer QBBEngine::defaultConfiguration()
-{
- char *interface = 0;
-
- if (netstatus_get_default_interface(&interface) != BPS_SUCCESS)
- return QNetworkConfigurationPrivatePointer();
-
- if (!interface)
- return QNetworkConfigurationPrivatePointer();
-
- const QScopedPointer<char, NetstatusInterfaceCleanupHelper> holder(interface);
-
- const QString id = idForName(QString::fromLatin1(interface));
-
- const QMutexLocker locker(&mutex);
-
- if (accessPointConfigurations.contains(id)) {
- qBearerDebug() << "found default interface:" << id;
-
- return accessPointConfigurations.value(id);
- }
-
- return QNetworkConfigurationPrivatePointer();
-}
-
-bool QBBEngine::requiresPolling() const
-{
- const QMutexLocker locker(&pollingMutex);
-
- return pollingRequired;
-}
-
-bool QBBEngine::nativeEventFilter(const QByteArray &eventType, void *message, long *result)
-{
- Q_UNUSED(eventType);
- Q_UNUSED(result);
-
- bps_event_t * const event = static_cast<bps_event_t *>(message);
-
- Q_ASSERT(event);
-
- if (bps_event_get_domain(event) == netstatus_get_domain()) {
- qBearerDebug("got update request.");
- doRequestUpdate();
- }
-
- return false;
-}
-
-void QBBEngine::updateConfiguration(const char *interface)
-{
- netstatus_interface_details_t *details = 0;
-
- if (netstatus_get_interface_details(interface, &details) != BPS_SUCCESS) {
- qBearerDebug() << "cannot retrieve details for interface" << interface;
-
- return;
- }
-
- const QString name = QString::fromLatin1(netstatus_interface_get_name(details));
- const QString id = idForName(name);
-
-
- const netstatus_interface_type_t type = netstatus_interface_get_type(details);
- const netstatus_ip_status_t ipStatus = netstatus_interface_get_ip_status(details);
-
- netstatus_free_interface_details(&details);
-
- QNetworkConfiguration::StateFlags state = QNetworkConfiguration::Defined;
-
- if (ipStatus == NETSTATUS_IP_STATUS_OK)
- state |= QNetworkConfiguration::Active;
-
- QMutexLocker locker(&mutex);
-
- if (accessPointConfigurations.contains(id)) {
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
-
- bool changed = false;
-
- QMutexLocker ptrLocker(&ptr->mutex);
-
- if (!ptr->isValid) {
- ptr->isValid = true;
- changed = true;
- }
-
- if (ptr->name != name) {
- ptr->name = name;
- changed = true;
- }
-
- if (ptr->id != id) {
- ptr->id = id;
- changed = true;
- }
-
- if (ptr->state != state) {
- ptr->state = state;
- changed = true;
- }
-
- const netstatus_ip_status_t oldIpStatus = ptr->oldIpStatus;
- ptr->oldIpStatus = ipStatus;
-
- ptrLocker.unlock();
-
- locker.unlock();
-
- if (changed) {
- qBearerDebug() << "configuration changed:" << interface;
-
- Q_EMIT configurationChanged(ptr);
- } else {
- // maybe Wifi has changed but gateway not yet ready etc.
- qBearerDebug("configuration has not changed.");
- if (oldIpStatus != ipStatus) { // if IP status changed
- if (ipStatus != NETSTATUS_IP_STATUS_OK
- && ipStatus != NETSTATUS_IP_STATUS_ERROR_NOT_UP
- && ipStatus != NETSTATUS_IP_STATUS_ERROR_NOT_CONFIGURED) {
- // work around race condition in netstatus API by just checking
- // again in 300 ms
- QTimer::singleShot(300, this, SLOT(doRequestUpdate()));
- }
- }
- }
-
- return;
- }
-
- QNetworkConfigurationPrivatePointer ptr(new QNetworkConfigurationPrivate);
-
- ptr->name = name;
- ptr->isValid = true;
- ptr->id = id;
- ptr->state = state;
- ptr->type = QNetworkConfiguration::InternetAccessPoint;
- ptr->bearerType = interfaceType(type);
-
- accessPointConfigurations.insert(id, ptr);
- configurationInterface.insert(id, name);
-
- locker.unlock();
-
- qBearerDebug() << "configuration added:" << interface;
-
- Q_EMIT configurationAdded(ptr);
-}
-
-void QBBEngine::removeConfiguration(const QString &id)
-{
- QMutexLocker locker(&mutex);
-
- QNetworkConfigurationPrivatePointer ptr =
- accessPointConfigurations.take(id);
-
- configurationInterface.remove(ptr->id);
-
- locker.unlock();
-
- Q_EMIT configurationRemoved(ptr);
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/bearer/blackberry/qbbengine.h b/src/plugins/bearer/blackberry/qbbengine.h
deleted file mode 100644
index 08790797ea..0000000000
--- a/src/plugins/bearer/blackberry/qbbengine.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Research In Motion
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QBBENGINE_H
-#define QBBENGINE_H
-
-#include "../qbearerengine_impl.h"
-
-#include <QAbstractEventDispatcher>
-#include <QAbstractNativeEventFilter>
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-struct bps_event_t;
-
-QT_BEGIN_NAMESPACE
-
-class QNetworkConfigurationPrivate;
-class QNetworkSessionPrivate;
-
-class QBBEngine : public QBearerEngineImpl, public QAbstractNativeEventFilter
-{
- Q_OBJECT
-
-public:
- explicit QBBEngine(QObject *parent = 0);
- ~QBBEngine();
-
- QString getInterfaceFromId(const QString &id) Q_DECL_OVERRIDE;
- bool hasIdentifier(const QString &id) Q_DECL_OVERRIDE;
-
- void connectToId(const QString &id) Q_DECL_OVERRIDE;
- void disconnectFromId(const QString &id) Q_DECL_OVERRIDE;
-
- Q_INVOKABLE void initialize() Q_DECL_OVERRIDE;
- Q_INVOKABLE void requestUpdate() Q_DECL_OVERRIDE;
-
- QNetworkSession::State sessionStateForId(const QString &id) Q_DECL_OVERRIDE;
-
- QNetworkConfigurationManager::Capabilities capabilities() const Q_DECL_OVERRIDE;
-
- QNetworkSessionPrivate *createSessionBackend() Q_DECL_OVERRIDE;
-
- QNetworkConfigurationPrivatePointer defaultConfiguration() Q_DECL_OVERRIDE;
-
- bool requiresPolling() const Q_DECL_OVERRIDE;
-
- bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) Q_DECL_OVERRIDE;
-
-protected:
- void updateConfiguration(const char *interface);
- void removeConfiguration(const QString &id);
-
-private Q_SLOTS:
- void doRequestUpdate();
-
-private:
- QHash<QString, QString> configurationInterface;
-
- mutable QMutex pollingMutex;
-
- bool pollingRequired;
- bool initialized;
-};
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_BEARERMANAGEMENT
-
-#endif // QBBENGINE_H
diff --git a/src/plugins/generic/evdevtablet/main.cpp b/src/plugins/generic/evdevtablet/main.cpp
index 62524e8f33..3a9fd4f1dd 100644
--- a/src/plugins/generic/evdevtablet/main.cpp
+++ b/src/plugins/generic/evdevtablet/main.cpp
@@ -32,7 +32,7 @@
****************************************************************************/
#include <QtGui/qgenericplugin.h>
-#include <QtPlatformSupport/private/qevdevtablet_p.h>
+#include <QtPlatformSupport/private/qevdevtabletmanager_p.h>
QT_BEGIN_NAMESPACE
@@ -44,7 +44,6 @@ class QEvdevTabletPlugin : public QGenericPlugin
public:
QEvdevTabletPlugin();
- QStringList keys() const;
QObject* create(const QString &key, const QString &specification) Q_DECL_OVERRIDE;
};
@@ -52,16 +51,11 @@ QEvdevTabletPlugin::QEvdevTabletPlugin()
{
}
-QStringList QEvdevTabletPlugin::keys() const
-{
- return QStringList() << "EvdevTablet";
-}
-
-QObject *QEvdevTabletPlugin::create(const QString &key,
+QObject* QEvdevTabletPlugin::create(const QString &key,
const QString &spec)
{
if (!key.compare(QLatin1String("EvdevTablet"), Qt::CaseInsensitive))
- return new QEvdevTabletHandlerThread(spec);
+ return new QEvdevTabletManager(key, spec);
return 0;
}
diff --git a/src/plugins/generic/tuiotouch/qtuiohandler.cpp b/src/plugins/generic/tuiotouch/qtuiohandler.cpp
index 2b42889cb1..2598bc5caf 100644
--- a/src/plugins/generic/tuiotouch/qtuiohandler.cpp
+++ b/src/plugins/generic/tuiotouch/qtuiohandler.cpp
@@ -36,6 +36,7 @@
#include <QRect>
#include <QWindow>
#include <QGuiApplication>
+#include <QTouchDevice>
#include <qpa/qwindowsysteminterface.h>
diff --git a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp
index a952123576..0148d36a6c 100644
--- a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp
+++ b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp
@@ -397,6 +397,7 @@ void QIBusPlatformInputContext::filterEventFinished(QDBusPendingCallWatcher *cal
bool retval = reply.value();
qCDebug(qtQpaInputMethods) << "filterEventFinished return" << code << sym << state << retval;
if (!retval) {
+#ifndef QT_NO_CONTEXTMENU
if (type == QEvent::KeyPress && qtcode == Qt::Key_Menu
&& window != NULL) {
const QPoint globalPos = window->screen()->handle()->cursor()->pos();
@@ -404,6 +405,7 @@ void QIBusPlatformInputContext::filterEventFinished(QDBusPendingCallWatcher *cal
QWindowSystemInterface::handleContextMenuEvent(window, false, pos,
globalPos, modifiers);
}
+#endif // QT_NO_CONTEXTMENU
QWindowSystemInterface::handleExtendedKeyEvent(window, time, type, qtcode, modifiers,
code, sym, state, string, isAutoRepeat);
diff --git a/src/plugins/platforms/android/androidjniaccessibility.cpp b/src/plugins/platforms/android/androidjniaccessibility.cpp
index 69f8bdbad7..385ad3b672 100644
--- a/src/plugins/platforms/android/androidjniaccessibility.cpp
+++ b/src/plugins/platforms/android/androidjniaccessibility.cpp
@@ -68,10 +68,6 @@ namespace QtAndroidAccessibility
void initialize()
{
- // API level > 16 is required.
- if (QtAndroidPrivate::androidSdkVersion() < 16)
- return;
-
QJNIObjectPrivate::callStaticMethod<void>(QtAndroid::applicationClass(),
"initializeAccessibility");
}
@@ -299,9 +295,6 @@ if (!clazz) { \
bool registerNatives(JNIEnv *env)
{
- if (QtAndroidPrivate::androidSdkVersion() < 16)
- return true; // We need API level 16 or higher
-
jclass clazz;
FIND_AND_CHECK_CLASS("org/qtproject/qt5/android/accessibility/QtNativeAccessibility");
jclass appClass = static_cast<jclass>(env->NewGlobalRef(clazz));
diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp
index dd9154f8d2..7045533fca 100644
--- a/src/plugins/platforms/android/androidjnimain.cpp
+++ b/src/plugins/platforms/android/androidjnimain.cpp
@@ -494,7 +494,7 @@ static jboolean startQtApplication(JNIEnv *env, jobject /*object*/, jstring para
// Obtain a handle to the main library (the library that contains the main() function).
// This library should already be loaded, and calling dlopen() will just return a reference to it.
m_mainLibraryHnd = dlopen(m_applicationParams.first().data(), 0);
- if (m_mainLibraryHnd == nullptr) {
+ if (Q_UNLIKELY(!m_mainLibraryHnd)) {
qCritical() << "dlopen failed:" << dlerror();
return false;
}
@@ -504,7 +504,7 @@ static jboolean startQtApplication(JNIEnv *env, jobject /*object*/, jstring para
m_main = (Main)dlsym(RTLD_DEFAULT, "main");
}
- if (!m_main) {
+ if (Q_UNLIKELY(!m_main)) {
qCritical() << "dlsym failed:" << dlerror() << endl
<< "Could not find main method";
return false;
diff --git a/src/plugins/platforms/android/androidjnimenu.cpp b/src/plugins/platforms/android/androidjnimenu.cpp
index 8018cef1dc..3f44a3c4b9 100644
--- a/src/plugins/platforms/android/androidjnimenu.cpp
+++ b/src/plugins/platforms/android/androidjnimenu.cpp
@@ -87,14 +87,7 @@ namespace QtAndroidMenu
void showContextMenu(QAndroidPlatformMenu *menu, const QRect &anchorRect, JNIEnv *env)
{
QMutexLocker lock(&visibleMenuMutex);
- if (QtAndroidPrivate::androidSdkVersion() > 10 &&
- QtAndroidPrivate::androidSdkVersion() < 14 &&
- anchorRect.isValid()) {
- pendingContextMenus.clear();
- } else if (visibleMenu) {
- pendingContextMenus.append(visibleMenu);
- }
-
+ pendingContextMenus.append(visibleMenu);
visibleMenu = menu;
menu->aboutToShow();
env->CallStaticVoidMethod(applicationClass(), openContextMenuMethodID, anchorRect.x(), anchorRect.y(), anchorRect.width(), anchorRect.height());
diff --git a/src/plugins/platforms/android/qandroideventdispatcher.cpp b/src/plugins/platforms/android/qandroideventdispatcher.cpp
index aecea0d4e1..3f1cfe18b9 100644
--- a/src/plugins/platforms/android/qandroideventdispatcher.cpp
+++ b/src/plugins/platforms/android/qandroideventdispatcher.cpp
@@ -77,8 +77,11 @@ void QAndroidEventDispatcher::goingToStop(bool stop)
wakeUp();
}
-int QAndroidEventDispatcher::select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, timespec *timeout)
+bool QAndroidEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags)
{
+ if (m_goingToStop.load())
+ flags |= QEventLoop::ExcludeSocketNotifiers | QEventLoop::X11ExcludeTimers;
+
{
AndroidDeadlockProtector protector;
if (protector.acquire() && m_stopRequest.testAndSetAcquire(StopRequest, Stopping)) {
@@ -86,21 +89,10 @@ int QAndroidEventDispatcher::select(int nfds, fd_set *readfds, fd_set *writefds,
wakeUp();
}
}
- return QUnixEventDispatcherQPA::select(nfds, readfds, writefds, exceptfds, timeout);
-}
-bool QAndroidEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags)
-{
- if (m_goingToStop.load()) {
- return QUnixEventDispatcherQPA::processEvents(flags /*| QEventLoop::ExcludeUserInputEvents*/
- | QEventLoop::ExcludeSocketNotifiers
- | QEventLoop::X11ExcludeTimers);
- } else {
- return QUnixEventDispatcherQPA::processEvents(flags);
- }
+ return QUnixEventDispatcherQPA::processEvents(flags);
}
-
QAndroidEventDispatcherStopper *QAndroidEventDispatcherStopper::instance()
{
static QAndroidEventDispatcherStopper androidEventDispatcherStopper;
diff --git a/src/plugins/platforms/android/qandroideventdispatcher.h b/src/plugins/platforms/android/qandroideventdispatcher.h
index 946bae5b20..e2c4770467 100644
--- a/src/plugins/platforms/android/qandroideventdispatcher.h
+++ b/src/plugins/platforms/android/qandroideventdispatcher.h
@@ -50,9 +50,6 @@ public:
void goingToStop(bool stop);
protected:
- int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
- timespec *timeout);
-
bool processEvents(QEventLoop::ProcessEventsFlags flags);
private:
diff --git a/src/plugins/platforms/android/qandroidinputcontext.cpp b/src/plugins/platforms/android/qandroidinputcontext.cpp
index 0eddb26959..2e4c3d71ab 100644
--- a/src/plugins/platforms/android/qandroidinputcontext.cpp
+++ b/src/plugins/platforms/android/qandroidinputcontext.cpp
@@ -339,7 +339,7 @@ QAndroidInputContext::QAndroidInputContext()
: QPlatformInputContext(), m_composingTextStart(-1), m_blockUpdateSelection(false), m_batchEditNestingLevel(0), m_focusObject(0)
{
jclass clazz = QJNIEnvironmentPrivate::findClass(QtNativeInputConnectionClassName);
- if (clazz == NULL) {
+ if (Q_UNLIKELY(!clazz)) {
qCritical() << "Native registration unable to find class '"
<< QtNativeInputConnectionClassName
<< '\'';
@@ -347,7 +347,7 @@ QAndroidInputContext::QAndroidInputContext()
}
QJNIEnvironmentPrivate env;
- if (env->RegisterNatives(clazz, methods, sizeof(methods) / sizeof(methods[0])) < 0) {
+ if (Q_UNLIKELY(env->RegisterNatives(clazz, methods, sizeof(methods) / sizeof(methods[0])) < 0)) {
qCritical() << "RegisterNatives failed for '"
<< QtNativeInputConnectionClassName
<< '\'';
@@ -355,7 +355,7 @@ QAndroidInputContext::QAndroidInputContext()
}
clazz = QJNIEnvironmentPrivate::findClass(QtExtractedTextClassName);
- if (clazz == NULL) {
+ if (Q_UNLIKELY(!clazz)) {
qCritical() << "Native registration unable to find class '"
<< QtExtractedTextClassName
<< '\'';
@@ -364,43 +364,43 @@ QAndroidInputContext::QAndroidInputContext()
m_extractedTextClass = static_cast<jclass>(env->NewGlobalRef(clazz));
m_classConstructorMethodID = env->GetMethodID(m_extractedTextClass, "<init>", "()V");
- if (m_classConstructorMethodID == NULL) {
+ if (Q_UNLIKELY(!m_classConstructorMethodID)) {
qCritical() << "GetMethodID failed";
return;
}
m_partialEndOffsetFieldID = env->GetFieldID(m_extractedTextClass, "partialEndOffset", "I");
- if (m_partialEndOffsetFieldID == NULL) {
+ if (Q_UNLIKELY(!m_partialEndOffsetFieldID)) {
qCritical() << "Can't find field partialEndOffset";
return;
}
m_partialStartOffsetFieldID = env->GetFieldID(m_extractedTextClass, "partialStartOffset", "I");
- if (m_partialStartOffsetFieldID == NULL) {
+ if (Q_UNLIKELY(!m_partialStartOffsetFieldID)) {
qCritical() << "Can't find field partialStartOffset";
return;
}
m_selectionEndFieldID = env->GetFieldID(m_extractedTextClass, "selectionEnd", "I");
- if (m_selectionEndFieldID == NULL) {
+ if (Q_UNLIKELY(!m_selectionEndFieldID)) {
qCritical() << "Can't find field selectionEnd";
return;
}
m_selectionStartFieldID = env->GetFieldID(m_extractedTextClass, "selectionStart", "I");
- if (m_selectionStartFieldID == NULL) {
+ if (Q_UNLIKELY(!m_selectionStartFieldID)) {
qCritical() << "Can't find field selectionStart";
return;
}
m_startOffsetFieldID = env->GetFieldID(m_extractedTextClass, "startOffset", "I");
- if (m_startOffsetFieldID == NULL) {
+ if (Q_UNLIKELY(!m_startOffsetFieldID)) {
qCritical() << "Can't find field startOffset";
return;
}
m_textFieldID = env->GetFieldID(m_extractedTextClass, "text", "Ljava/lang/String;");
- if (m_textFieldID == NULL) {
+ if (Q_UNLIKELY(!m_textFieldID)) {
qCritical() << "Can't find field text";
return;
}
diff --git a/src/plugins/platforms/android/qandroidplatformfontdatabase.cpp b/src/plugins/platforms/android/qandroidplatformfontdatabase.cpp
index 5725f5793e..a21aac51b4 100644
--- a/src/plugins/platforms/android/qandroidplatformfontdatabase.cpp
+++ b/src/plugins/platforms/android/qandroidplatformfontdatabase.cpp
@@ -47,7 +47,7 @@ void QAndroidPlatformFontDatabase::populateFontDatabase()
QString fontpath = fontDir();
QDir dir(fontpath);
- if (!dir.exists()) {
+ if (Q_UNLIKELY(!dir.exists())) {
qFatal("QFontDatabase: Cannot find font directory %s - is Qt installed correctly?",
qPrintable(fontpath));
}
diff --git a/src/plugins/platforms/android/qandroidplatformintegration.cpp b/src/plugins/platforms/android/qandroidplatformintegration.cpp
index 2a127f5c3c..23d242a95f 100644
--- a/src/plugins/platforms/android/qandroidplatformintegration.cpp
+++ b/src/plugins/platforms/android/qandroidplatformintegration.cpp
@@ -120,14 +120,14 @@ QAndroidPlatformIntegration::QAndroidPlatformIntegration(const QStringList &para
m_androidPlatformNativeInterface = new QAndroidPlatformNativeInterface();
m_eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
- if (m_eglDisplay == EGL_NO_DISPLAY)
+ if (Q_UNLIKELY(m_eglDisplay == EGL_NO_DISPLAY))
qFatal("Could not open egl display");
EGLint major, minor;
- if (!eglInitialize(m_eglDisplay, &major, &minor))
+ if (Q_UNLIKELY(!eglInitialize(m_eglDisplay, &major, &minor)))
qFatal("Could not initialize egl display");
- if (!eglBindAPI(EGL_OPENGL_ES_API))
+ if (Q_UNLIKELY(!eglBindAPI(EGL_OPENGL_ES_API)))
qFatal("Could not bind GL_ES API");
m_primaryScreen = new QAndroidPlatformScreen();
diff --git a/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp b/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp
index 57d3bfaf22..85f51d7d29 100644
--- a/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp
+++ b/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp
@@ -175,7 +175,7 @@ void QAndroidPlatformOpenGLWindow::createEgl(EGLConfig config)
m_androidSurfaceObject = QJNIObjectPrivate();
m_eglSurface = eglCreateWindowSurface(m_eglDisplay, config, m_nativeWindow, NULL);
m_format = q_glFormatFromConfig(m_eglDisplay, config, window()->requestedFormat());
- if (m_eglSurface == EGL_NO_SURFACE) {
+ if (Q_UNLIKELY(m_eglSurface == EGL_NO_SURFACE)) {
EGLint error = eglGetError();
eglTerminate(m_eglDisplay);
qFatal("EGL Error : Could not create the egl surface: error = 0x%x\n", error);
diff --git a/src/plugins/platforms/android/qandroidplatformtheme.cpp b/src/plugins/platforms/android/qandroidplatformtheme.cpp
index 5531910555..94e132fc9a 100644
--- a/src/plugins/platforms/android/qandroidplatformtheme.cpp
+++ b/src/plugins/platforms/android/qandroidplatformtheme.cpp
@@ -204,12 +204,12 @@ QJsonObject AndroidStyle::loadStyleData()
QJsonParseError error;
QJsonDocument document = QJsonDocument::fromJson(f.readAll(), &error);
- if (document.isNull()) {
+ if (Q_UNLIKELY(document.isNull())) {
qCritical() << error.errorString();
return QJsonObject();
}
- if (!document.isObject()) {
+ if (Q_UNLIKELY(!document.isObject())) {
qCritical() << "Style.json does not contain a valid style.";
return QJsonObject();
}
@@ -219,7 +219,7 @@ QJsonObject AndroidStyle::loadStyleData()
static std::shared_ptr<AndroidStyle> loadAndroidStyle(QPalette *defaultPalette)
{
double pixelDensity = QHighDpiScaling::isActive() ? QtAndroid::pixelDensity() : 1.0;
- std::shared_ptr<AndroidStyle> style(new AndroidStyle);
+ std::shared_ptr<AndroidStyle> style = std::make_shared<AndroidStyle>();
style->m_styleData = AndroidStyle::loadStyleData();
if (style->m_styleData.isEmpty())
return std::shared_ptr<AndroidStyle>();
diff --git a/src/plugins/platforms/cocoa/cocoa.pro b/src/plugins/platforms/cocoa/cocoa.pro
index ba0e6b001a..fec1da334f 100644
--- a/src/plugins/platforms/cocoa/cocoa.pro
+++ b/src/plugins/platforms/cocoa/cocoa.pro
@@ -84,7 +84,7 @@ contains(QT_CONFIG, opengl.*) {
RESOURCES += qcocoaresources.qrc
-LIBS += -framework Cocoa -framework Carbon -framework IOKit -lcups
+LIBS += -framework AppKit -framework Carbon -framework IOKit -lcups
QT += core-private gui-private platformsupport-private
diff --git a/src/plugins/platforms/cocoa/main.mm b/src/plugins/platforms/cocoa/main.mm
index 43ff715161..4ec2b4ffc4 100644
--- a/src/plugins/platforms/cocoa/main.mm
+++ b/src/plugins/platforms/cocoa/main.mm
@@ -31,7 +31,7 @@
**
****************************************************************************/
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <qpa/qplatformintegrationplugin.h>
#include <qpa/qplatformthemeplugin.h>
diff --git a/src/plugins/platforms/cocoa/qcocoaaccessibility.h b/src/plugins/platforms/cocoa/qcocoaaccessibility.h
index 228643ab26..2d1aa41a9a 100644
--- a/src/plugins/platforms/cocoa/qcocoaaccessibility.h
+++ b/src/plugins/platforms/cocoa/qcocoaaccessibility.h
@@ -33,7 +33,7 @@
#ifndef QCOCOAACCESIBILITY_H
#define QCOCOAACCESIBILITY_H
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <QtGui>
#include <qpa/qplatformaccessibility.h>
diff --git a/src/plugins/platforms/cocoa/qcocoaaccessibility.mm b/src/plugins/platforms/cocoa/qcocoaaccessibility.mm
index 723c341e59..e8d69e9dbb 100644
--- a/src/plugins/platforms/cocoa/qcocoaaccessibility.mm
+++ b/src/plugins/platforms/cocoa/qcocoaaccessibility.mm
@@ -336,6 +336,7 @@ bool hasValueAttribute(QAccessibleInterface *interface)
Q_ASSERT(interface);
const QAccessible::Role qtrole = interface->role();
if (qtrole == QAccessible::EditableText
+ || qtrole == QAccessible::StaticText
|| interface->valueInterface()
|| interface->state().checkable) {
return true;
@@ -347,6 +348,9 @@ bool hasValueAttribute(QAccessibleInterface *interface)
id getValueAttribute(QAccessibleInterface *interface)
{
const QAccessible::Role qtrole = interface->role();
+ if (qtrole == QAccessible::StaticText) {
+ return QCFString::toNSString(interface->text(QAccessible::Name));
+ }
if (qtrole == QAccessible::EditableText) {
if (QAccessibleTextInterface *textInterface = interface->textInterface()) {
// VoiceOver will read out the entire text string at once when returning
diff --git a/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm b/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm
index b55393c7dc..5b2ee1c284 100644
--- a/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm
+++ b/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm
@@ -292,6 +292,8 @@ static void convertLineOffset(QAccessibleTextInterface *text, int &line, int &of
QSize qtSize = iface->rect().size();
return [NSValue valueWithSize: NSMakeSize(qtSize.width(), qtSize.height())];
} else if ([attribute isEqualToString:NSAccessibilityTitleAttribute]) {
+ if (iface->role() == QAccessible::StaticText)
+ return nil;
return QCFString::toNSString(iface->text(QAccessible::Name));
} else if ([attribute isEqualToString:NSAccessibilityDescriptionAttribute]) {
return QCFString::toNSString(iface->text(QAccessible::Description));
diff --git a/src/plugins/platforms/cocoa/qcocoaapplication.mm b/src/plugins/platforms/cocoa/qcocoaapplication.mm
index d9919f1120..7d0018a595 100644
--- a/src/plugins/platforms/cocoa/qcocoaapplication.mm
+++ b/src/plugins/platforms/cocoa/qcocoaapplication.mm
@@ -181,7 +181,7 @@ QT_BEGIN_NAMESPACE
void qt_redirectNSApplicationSendEvent()
{
- if (QCoreApplication::testAttribute(Qt::AA_MacPluginApplication))
+ if (QCoreApplication::testAttribute(Qt::AA_PluginApplication))
// In a plugin we cannot chain sendEvent hooks: a second plugin could
// store the implementation of the first, which during the program flow
// can be unloaded.
@@ -207,7 +207,7 @@ void qt_redirectNSApplicationSendEvent()
void qt_resetNSApplicationSendEvent()
{
- if (QCoreApplication::testAttribute(Qt::AA_MacPluginApplication))
+ if (QCoreApplication::testAttribute(Qt::AA_PluginApplication))
return;
diff --git a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.h b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.h
index abaaba91a5..a0eb8cc6fd 100644
--- a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.h
+++ b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.h
@@ -79,7 +79,7 @@
//
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#include <qglobal.h>
#include <private/qcore_mac_p.h>
diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.h b/src/plugins/platforms/cocoa/qcocoabackingstore.h
index 5a199de4a5..839b536863 100644
--- a/src/plugins/platforms/cocoa/qcocoabackingstore.h
+++ b/src/plugins/platforms/cocoa/qcocoabackingstore.h
@@ -34,7 +34,7 @@
#ifndef QBACKINGSTORE_COCOA_H
#define QBACKINGSTORE_COCOA_H
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include "qcocoawindow.h"
#include "qnsview.h"
diff --git a/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm
index 8843e009a2..ddc2938855 100644
--- a/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm
+++ b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm
@@ -31,13 +31,13 @@
**
****************************************************************************/
-#include "qcocoacolordialoghelper.h"
-
#ifndef QT_NO_COLORDIALOG
#include <QtCore/qdebug.h>
#include <QtCore/qtimer.h>
+#include <qpa/qplatformtheme.h>
+#include "qcocoacolordialoghelper.h"
#include "qcocoahelpers.h"
#import <AppKit/AppKit.h>
@@ -52,7 +52,7 @@ static NSButton *macCreateButton(const char *text, NSView *superview)
[button setButtonType:NSMomentaryLightButton];
[button setBezelStyle:NSRoundedBezelStyle];
[button setTitle:(NSString*)(CFStringRef)QCFString(
- qt_mac_removeMnemonics(QCoreApplication::translate("QDialogButtonBox", text)))];
+ QPlatformTheme::removeMnemonics(QCoreApplication::translate("QDialogButtonBox", text)))];
[[button cell] setFont:[NSFont systemFontOfSize:
[NSFont systemFontSizeForControlSize:NSRegularControlSize]]];
[superview addSubview:button];
diff --git a/src/plugins/platforms/cocoa/qcocoacursor.h b/src/plugins/platforms/cocoa/qcocoacursor.h
index d104939f0c..58be5414f1 100644
--- a/src/plugins/platforms/cocoa/qcocoacursor.h
+++ b/src/plugins/platforms/cocoa/qcocoacursor.h
@@ -34,7 +34,7 @@
#ifndef QWINDOWSCURSOR_H
#define QWINDOWSCURSOR_H
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <QtCore>
#include <qpa/qplatformcursor.h>
diff --git a/src/plugins/platforms/cocoa/qcocoadrag.h b/src/plugins/platforms/cocoa/qcocoadrag.h
index c1eeb34679..51de5dd5ed 100644
--- a/src/plugins/platforms/cocoa/qcocoadrag.h
+++ b/src/plugins/platforms/cocoa/qcocoadrag.h
@@ -34,7 +34,7 @@
#ifndef QCOCOADRAG_H
#define QCOCOADRAG_H
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <QtGui>
#include <qpa/qplatformdrag.h>
#include <private/qsimpledrag_p.h>
diff --git a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
index 1865624d57..117eba1b2a 100644
--- a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
+++ b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
@@ -80,7 +80,7 @@
#include <qdebug.h>
#undef slots
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <Carbon/Carbon.h>
QT_BEGIN_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm
index 9dc013ba4d..0bfb105a5d 100644
--- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm
+++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm
@@ -31,6 +31,8 @@
**
****************************************************************************/
+#include <qpa/qplatformtheme.h>
+
#include "qcocoafiledialoghelper.h"
#ifndef QT_NO_FILEDIALOG
@@ -180,7 +182,7 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSOpenSavePanelDelegate);
static QString strippedText(QString s)
{
s.remove( QString::fromLatin1("...") );
- return qt_mac_removeMnemonics(s).trimmed();
+ return QPlatformTheme::removeMnemonics(s).trimmed();
}
- (NSString *)strip:(const QString &)label
diff --git a/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm
index d1802fe4f9..c1c871f02b 100644
--- a/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm
+++ b/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm
@@ -31,17 +31,17 @@
**
****************************************************************************/
-#include "qcocoafontdialoghelper.h"
-
#ifndef QT_NO_FONTDIALOG
#include <QtCore/qtimer.h>
#include <QtGui/qfontdatabase.h>
+#include <qpa/qplatformtheme.h>
#include <private/qfont_p.h>
#include <private/qfontengine_p.h>
#include <private/qfontengine_coretext_p.h>
+#include "qcocoafontdialoghelper.h"
#include "qcocoahelpers.h"
#import <AppKit/AppKit.h>
@@ -72,7 +72,7 @@ static NSButton *macCreateButton(const char *text, NSView *superview)
[button setButtonType:NSMomentaryLightButton];
[button setBezelStyle:NSRoundedBezelStyle];
[button setTitle:(NSString*)(CFStringRef)QCFString(
- qt_mac_removeMnemonics(QCoreApplication::translate("QDialogButtonBox", text)))];
+ QPlatformTheme::removeMnemonics(QCoreApplication::translate("QDialogButtonBox", text)))];
[[button cell] setFont:[NSFont systemFontOfSize:
[NSFont systemFontSizeForControlSize:NSRegularControlSize]]];
[superview addSubview:button];
diff --git a/src/plugins/platforms/cocoa/qcocoaglcontext.h b/src/plugins/platforms/cocoa/qcocoaglcontext.h
index fa6db018a7..cac53b14f9 100644
--- a/src/plugins/platforms/cocoa/qcocoaglcontext.h
+++ b/src/plugins/platforms/cocoa/qcocoaglcontext.h
@@ -40,7 +40,7 @@
#include <QtGui/QWindow>
#undef slots
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
QT_BEGIN_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoaglcontext.mm b/src/plugins/platforms/cocoa/qcocoaglcontext.mm
index 0f9b8b900d..d43c8e5ee9 100644
--- a/src/plugins/platforms/cocoa/qcocoaglcontext.mm
+++ b/src/plugins/platforms/cocoa/qcocoaglcontext.mm
@@ -39,7 +39,7 @@
#include <QtPlatformSupport/private/cglconvenience_p.h>
#include <QtPlatformHeaders/qcocoanativecontext.h>
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
QT_BEGIN_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoahelpers.h b/src/plugins/platforms/cocoa/qcocoahelpers.h
index b86a17ca12..b83977c7d8 100644
--- a/src/plugins/platforms/cocoa/qcocoahelpers.h
+++ b/src/plugins/platforms/cocoa/qcocoahelpers.h
@@ -46,6 +46,7 @@
//
#include "qt_mac_p.h"
#include <private/qguiapplication_p.h>
+#include <QtGui/qpalette.h>
#include <QtGui/qscreen.h>
QT_BEGIN_NAMESPACE
@@ -66,6 +67,7 @@ NSImage *qt_mac_create_nsimage(const QIcon &icon);
CGImageRef qt_mac_toCGImage(const QImage &qImage);
CGImageRef qt_mac_toCGImageMask(const QImage &qImage);
QImage qt_mac_toQImage(CGImageRef image);
+QPixmap qt_mac_toQPixmap(const NSImage *image, const QSizeF &size);
NSSize qt_mac_toNSSize(const QSize &qtSize);
NSRect qt_mac_toNSRect(const QRect &rect);
@@ -74,6 +76,8 @@ QRect qt_mac_toQRect(const NSRect &rect);
QColor qt_mac_toQColor(const NSColor *color);
QColor qt_mac_toQColor(CGColorRef color);
+QBrush qt_mac_toQBrush(CGColorRef color);
+QBrush qt_mac_toQBrush(const NSColor *color, QPalette::ColorGroup colorGroup = QPalette::Normal);
// Creates a mutable shape, it's the caller's responsibility to release.
HIMutableShapeRef qt_mac_QRegionToHIMutableShape(const QRegion &region);
@@ -90,7 +94,6 @@ Qt::DropActions qt_mac_mapNSDragOperations(NSDragOperation nsActions);
// Misc
void qt_mac_transformProccessToForegroundApplication();
-QString qt_mac_removeMnemonics(const QString &original);
CGColorSpaceRef qt_mac_genericColorSpace();
CGColorSpaceRef qt_mac_displayColorSpace(const QWidget *widget);
CGColorSpaceRef qt_mac_colorSpaceForDeviceType(const QPaintDevice *paintDevice);
diff --git a/src/plugins/platforms/cocoa/qcocoahelpers.mm b/src/plugins/platforms/cocoa/qcocoahelpers.mm
index f51c21ee9b..657295c29c 100644
--- a/src/plugins/platforms/cocoa/qcocoahelpers.mm
+++ b/src/plugins/platforms/cocoa/qcocoahelpers.mm
@@ -31,6 +31,8 @@
**
****************************************************************************/
+#include <qpa/qplatformtheme.h>
+
#include "qcocoahelpers.h"
@@ -46,6 +48,27 @@
#include <algorithm>
+#include <Carbon/Carbon.h>
+
+@interface NSGraphicsContext (QtAdditions)
+
++ (NSGraphicsContext *)qt_graphicsContextWithCGContext:(CGContextRef)graphicsPort flipped:(BOOL)initialFlippedState;
+
+@end
+
+@implementation NSGraphicsContext (QtAdditions)
+
++ (NSGraphicsContext *)qt_graphicsContextWithCGContext:(CGContextRef)graphicsPort flipped:(BOOL)initialFlippedState
+{
+#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_10, __IPHONE_NA)
+ if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_10)
+ return [self graphicsContextWithCGContext:graphicsPort flipped:initialFlippedState];
+#endif
+ return [self graphicsContextWithGraphicsPort:graphicsPort flipped:initialFlippedState];
+}
+
+@end
+
QT_BEGIN_NAMESPACE
//
@@ -236,6 +259,125 @@ QColor qt_mac_toQColor(CGColorRef color)
return qtColor;
}
+QBrush qt_mac_toQBrush(CGColorRef color)
+{
+ QBrush qtBrush;
+ CGColorSpaceModel model = CGColorSpaceGetModel(CGColorGetColorSpace(color));
+ if (model == kCGColorSpaceModelPattern) {
+ // Colorspace we can't deal with; the color is drawn directly using a callback.
+ qWarning("Qt: qt_mac_toQBrush: cannot convert from colorspace model: %d", model);
+ Q_ASSERT(false);
+ } else {
+ qtBrush.setStyle(Qt::SolidPattern);
+ qtBrush.setColor(qt_mac_toQColor(color));
+ }
+ return qtBrush;
+}
+
+static bool qt_mac_isSystemColorOrInstance(const NSColor *color, NSString *colorNameComponent, NSString *className)
+{
+ // We specifically do not want isKindOfClass: here
+ if ([color.className isEqualToString:className]) // NSPatternColorSpace
+ return true;
+ if ([color.catalogNameComponent isEqualToString:@"System"] &&
+ [color.colorNameComponent isEqualToString:colorNameComponent] &&
+ [color.colorSpaceName isEqualToString:NSNamedColorSpace])
+ return true;
+ return false;
+}
+
+QBrush qt_mac_toQBrush(const NSColor *color, QPalette::ColorGroup colorGroup)
+{
+ QBrush qtBrush;
+
+ // QTBUG-49773: This calls NSDrawMenuItemBackground to render a 1 by n gradient; could use HITheme
+ if ([color.className isEqualToString:@"NSMenuItemHighlightColor"]) {
+ qWarning("Qt: qt_mac_toQBrush: cannot convert from NSMenuItemHighlightColor");
+ return qtBrush;
+ }
+
+ // Not a catalog color or a manifestation of System.windowBackgroundColor;
+ // only retrieved from NSWindow.backgroundColor directly
+ if ([color.className isEqualToString:@"NSMetalPatternColor"]) {
+ // NSTexturedBackgroundWindowMask, could theoretically handle this without private API by
+ // creating a window with the appropriate properties and then calling NSWindow.backgroundColor.patternImage,
+ // which returns a texture sized 1 by (window height, including frame), backed by a CGPattern
+ // which follows the window key state... probably need to allow QBrush to store a function pointer
+ // like CGPattern does
+ qWarning("Qt: qt_mac_toQBrush: cannot convert from NSMetalPatternColor");
+ return qtBrush;
+ }
+
+ // No public API to get these colors/stops;
+ // both accurately obtained through runtime object inspection on OS X 10.11
+ // (the NSColor object has NSGradient i-vars for both color groups)
+ if (qt_mac_isSystemColorOrInstance(color, @"_sourceListBackgroundColor", @"NSSourceListBackgroundColor")) {
+ QLinearGradient gradient;
+ if (colorGroup == QPalette::Active) {
+ gradient.setColorAt(0, QColor(233, 237, 242));
+ gradient.setColorAt(0.5, QColor(225, 229, 235));
+ gradient.setColorAt(1, QColor(209, 216, 224));
+ } else {
+ gradient.setColorAt(0, QColor(248, 248, 248));
+ gradient.setColorAt(0.5, QColor(240, 240, 240));
+ gradient.setColorAt(1, QColor(235, 235, 235));
+ }
+ return QBrush(gradient);
+ }
+
+ // A couple colors are special... they are actually instances of NSGradientPatternColor, which
+ // override set/setFill/setStroke to instead initialize an internal color
+ // ([NSColor colorWithCalibratedWhite:0.909804 alpha:1.000000]) while still returning the
+ // ruled lines pattern image (from OS X 10.4) to the user from -[NSColor patternImage]
+ // (and providing no public API to get the underlying color without this insanity)
+ if (qt_mac_isSystemColorOrInstance(color, @"controlColor", @"NSGradientPatternColor") ||
+ qt_mac_isSystemColorOrInstance(color, @"windowBackgroundColor", @"NSGradientPatternColor")) {
+ static QColor newColor;
+ if (!newColor.isValid()) {
+#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_8, __IPHONE_NA)
+ if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_8) {
+ newColor = qt_mac_toQColor(color.CGColor);
+ } else
+#endif
+ {
+ NSBitmapImageRep *offscreenRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:nil
+ pixelsWide:1
+ pixelsHigh:1
+ bitsPerSample:8
+ samplesPerPixel:4
+ hasAlpha:YES
+ isPlanar:NO
+ colorSpaceName:NSDeviceRGBColorSpace
+ bytesPerRow:4
+ bitsPerPixel:32];
+ [NSGraphicsContext saveGraphicsState];
+ [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithBitmapImageRep:offscreenRep]];
+ NSEraseRect(NSMakeRect(0, 0, 1, 1));
+ [color drawSwatchInRect:NSMakeRect(0, 0, 1, 1)];
+ [NSGraphicsContext restoreGraphicsState];
+ NSUInteger pixel[4];
+ [offscreenRep getPixel:pixel atX:0 y:0];
+ [offscreenRep release];
+ newColor = QColor(pixel[0], pixel[1], pixel[2], pixel[3]);
+ }
+ }
+
+ qtBrush.setStyle(Qt::SolidPattern);
+ qtBrush.setColor(newColor);
+ return qtBrush;
+ }
+
+ if (NSColor *patternColor = [color colorUsingColorSpaceName:NSPatternColorSpace]) {
+ NSImage *patternImage = patternColor.patternImage;
+ const QSizeF sz(patternImage.size.width, patternImage.size.height);
+ qtBrush.setTexture(qt_mac_toQPixmap(patternImage, sz)); // QTBUG-49774
+ } else {
+ qtBrush.setStyle(Qt::SolidPattern);
+ qtBrush.setColor(qt_mac_toQColor(color));
+ }
+ return qtBrush;
+}
+
// Use this method to keep all the information in the TextSegment. As long as it is ordered
// we are in OK shape, and we can influence that ourselves.
struct KeyPair
@@ -439,88 +581,49 @@ Qt::DropActions qt_mac_mapNSDragOperations(NSDragOperation nsActions)
// Misc
//
-// Changes the process type for this process to kProcessTransformToForegroundApplication,
+// Sets the activation policy for this process to NSApplicationActivationPolicyRegular,
// unless either LSUIElement or LSBackgroundOnly is set in the Info.plist.
void qt_mac_transformProccessToForegroundApplication()
{
- ProcessSerialNumber psn;
- if (GetCurrentProcess(&psn) == noErr) {
- bool forceTransform = true;
- CFTypeRef value = CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(),
- CFSTR("LSUIElement"));
+ bool forceTransform = true;
+ CFTypeRef value = CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(),
+ CFSTR("LSUIElement"));
+ if (value) {
+ CFTypeID valueType = CFGetTypeID(value);
+ // Officially it's supposed to be a string, a boolean makes sense, so we'll check.
+ // A number less so, but OK.
+ if (valueType == CFStringGetTypeID())
+ forceTransform = !(QCFString::toQString(static_cast<CFStringRef>(value)).toInt());
+ else if (valueType == CFBooleanGetTypeID())
+ forceTransform = !CFBooleanGetValue(static_cast<CFBooleanRef>(value));
+ else if (valueType == CFNumberGetTypeID()) {
+ int valueAsInt;
+ CFNumberGetValue(static_cast<CFNumberRef>(value), kCFNumberIntType, &valueAsInt);
+ forceTransform = !valueAsInt;
+ }
+ }
+
+ if (forceTransform) {
+ value = CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(),
+ CFSTR("LSBackgroundOnly"));
if (value) {
CFTypeID valueType = CFGetTypeID(value);
- // Officially it's supposed to be a string, a boolean makes sense, so we'll check.
- // A number less so, but OK.
- if (valueType == CFStringGetTypeID())
- forceTransform = !(QCFString::toQString(static_cast<CFStringRef>(value)).toInt());
- else if (valueType == CFBooleanGetTypeID())
+ if (valueType == CFBooleanGetTypeID())
forceTransform = !CFBooleanGetValue(static_cast<CFBooleanRef>(value));
+ else if (valueType == CFStringGetTypeID())
+ forceTransform = !(QCFString::toQString(static_cast<CFStringRef>(value)).toInt());
else if (valueType == CFNumberGetTypeID()) {
int valueAsInt;
CFNumberGetValue(static_cast<CFNumberRef>(value), kCFNumberIntType, &valueAsInt);
forceTransform = !valueAsInt;
}
}
-
- if (forceTransform) {
- value = CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(),
- CFSTR("LSBackgroundOnly"));
- if (value) {
- CFTypeID valueType = CFGetTypeID(value);
- if (valueType == CFBooleanGetTypeID())
- forceTransform = !CFBooleanGetValue(static_cast<CFBooleanRef>(value));
- else if (valueType == CFStringGetTypeID())
- forceTransform = !(QCFString::toQString(static_cast<CFStringRef>(value)).toInt());
- else if (valueType == CFNumberGetTypeID()) {
- int valueAsInt;
- CFNumberGetValue(static_cast<CFNumberRef>(value), kCFNumberIntType, &valueAsInt);
- forceTransform = !valueAsInt;
- }
- }
- }
-
- if (forceTransform) {
- TransformProcessType(&psn, kProcessTransformToForegroundApplication);
- }
}
-}
-QString qt_mac_removeMnemonics(const QString &original)
-{
- QString returnText(original.size(), 0);
- int finalDest = 0;
- int currPos = 0;
- int l = original.length();
- while (l) {
- if (original.at(currPos) == QLatin1Char('&')
- && (l == 1 || original.at(currPos + 1) != QLatin1Char('&'))) {
- ++currPos;
- --l;
- if (l == 0)
- break;
- } else if (original.at(currPos) == QLatin1Char('(') && l >= 4 &&
- original.at(currPos + 1) == QLatin1Char('&') &&
- original.at(currPos + 2) != QLatin1Char('&') &&
- original.at(currPos + 3) == QLatin1Char(')')) {
- /* remove mnemonics its format is "\s*(&X)" */
- int n = 0;
- while (finalDest > n && returnText.at(finalDest - n - 1).isSpace())
- ++n;
- finalDest -= n;
- currPos += 4;
- l -= 4;
- continue;
- }
- returnText[finalDest] = original.at(currPos);
- ++currPos;
- ++finalDest;
- --l;
+ if (forceTransform) {
+ [[NSApplication sharedApplication] setActivationPolicy:NSApplicationActivationPolicyRegular];
}
- returnText.truncate(finalDest);
- return returnText;
}
-
static CGColorSpaceRef m_genericColorSpace = 0;
static QHash<CGDirectDisplayID, CGColorSpaceRef> m_displayColorSpaceHash;
static bool m_postRoutineRegistered = false;
@@ -774,7 +877,7 @@ bool qt_mac_execute_apple_script(const QString &script, AEDesc *ret)
QString qt_mac_removeAmpersandEscapes(QString s)
{
- return qt_mac_removeMnemonics(s).trimmed();
+ return QPlatformTheme::removeMnemonics(s).trimmed();
}
/*! \internal
@@ -820,6 +923,26 @@ CGContextRef qt_mac_cg_context(QPaintDevice *pdev)
return ret;
}
+QPixmap qt_mac_toQPixmap(const NSImage *image, const QSizeF &size)
+{
+ const NSSize pixmapSize = NSMakeSize(size.width(), size.height());
+ QPixmap pixmap(pixmapSize.width, pixmapSize.height);
+ pixmap.fill(Qt::transparent);
+ [image setSize:pixmapSize];
+ const NSRect iconRect = NSMakeRect(0, 0, pixmapSize.width, pixmapSize.height);
+ QMacCGContext ctx(&pixmap);
+ if (!ctx)
+ return QPixmap();
+ NSGraphicsContext *gc = [NSGraphicsContext qt_graphicsContextWithCGContext:ctx flipped:YES];
+ if (!gc)
+ return QPixmap();
+ [NSGraphicsContext saveGraphicsState];
+ [NSGraphicsContext setCurrentContext:gc];
+ [image drawInRect:iconRect fromRect:iconRect operation:NSCompositeSourceOver fraction:1.0 respectFlipped:YES hints:nil];
+ [NSGraphicsContext restoreGraphicsState];
+ return pixmap;
+}
+
QImage qt_mac_toQImage(CGImageRef image)
{
const size_t w = CGImageGetWidth(image),
diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.h b/src/plugins/platforms/cocoa/qcocoaintegration.h
index e7e21c356a..7943926ba3 100644
--- a/src/plugins/platforms/cocoa/qcocoaintegration.h
+++ b/src/plugins/platforms/cocoa/qcocoaintegration.h
@@ -34,7 +34,7 @@
#ifndef QPLATFORMINTEGRATION_COCOA_H
#define QPLATFORMINTEGRATION_COCOA_H
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include "qcocoacursor.h"
#include "qcocoawindow.h"
@@ -148,6 +148,9 @@ public:
QList<QCocoaWindow *> *popupWindowStack();
void setApplicationIcon(const QIcon &icon) const Q_DECL_OVERRIDE;
+
+ void beep() const Q_DECL_OVERRIDE;
+
private:
static QCocoaIntegration *mInstance;
Options mOptions;
diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.mm b/src/plugins/platforms/cocoa/qcocoaintegration.mm
index 6bec6b191d..245cfe33be 100644
--- a/src/plugins/platforms/cocoa/qcocoaintegration.mm
+++ b/src/plugins/platforms/cocoa/qcocoaintegration.mm
@@ -317,7 +317,7 @@ QCocoaIntegration::QCocoaIntegration(const QStringList &paramList)
// ### For AA_MacPluginApplication we don't want to load the menu nib.
// Qt 4 also does not set the application delegate, so that behavior
// is matched here.
- if (!QCoreApplication::testAttribute(Qt::AA_MacPluginApplication)) {
+ if (!QCoreApplication::testAttribute(Qt::AA_PluginApplication)) {
// Set app delegate, link to the current delegate (if any)
QCocoaApplicationDelegate *newDelegate = [QCocoaApplicationDelegate sharedDelegate];
@@ -344,7 +344,7 @@ QCocoaIntegration::~QCocoaIntegration()
qt_resetNSApplicationSendEvent();
QMacAutoReleasePool pool;
- if (!QCoreApplication::testAttribute(Qt::AA_MacPluginApplication)) {
+ if (!QCoreApplication::testAttribute(Qt::AA_PluginApplication)) {
// remove the apple event handlers installed by QCocoaApplicationDelegate
QCocoaApplicationDelegate *delegate = [QCocoaApplicationDelegate sharedDelegate];
[delegate removeAppleEventHandlers];
@@ -614,4 +614,9 @@ void QCocoaIntegration::setApplicationIcon(const QIcon &icon) const
[image release];
}
+void QCocoaIntegration::beep() const
+{
+ NSBeep();
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoakeymapper.h b/src/plugins/platforms/cocoa/qcocoakeymapper.h
index 11bbdc5426..9e79d634ab 100644
--- a/src/plugins/platforms/cocoa/qcocoakeymapper.h
+++ b/src/plugins/platforms/cocoa/qcocoakeymapper.h
@@ -36,7 +36,7 @@
#include <qcocoahelpers.h>
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <Carbon/Carbon.h>
#include <QtCore/QList>
diff --git a/src/plugins/platforms/cocoa/qcocoamenubar.mm b/src/plugins/platforms/cocoa/qcocoamenubar.mm
index 1a516f874b..d404438db6 100644
--- a/src/plugins/platforms/cocoa/qcocoamenubar.mm
+++ b/src/plugins/platforms/cocoa/qcocoamenubar.mm
@@ -31,7 +31,7 @@
**
****************************************************************************/
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include "qcocoamenubar.h"
#include "qcocoawindow.h"
diff --git a/src/plugins/platforms/cocoa/qcocoamenuitem.mm b/src/plugins/platforms/cocoa/qcocoamenuitem.mm
index 0f551bcd7d..968d1a2a4d 100644
--- a/src/plugins/platforms/cocoa/qcocoamenuitem.mm
+++ b/src/plugins/platforms/cocoa/qcocoamenuitem.mm
@@ -31,6 +31,8 @@
**
****************************************************************************/
+#include <qpa/qplatformtheme.h>
+
#include "qcocoamenuitem.h"
#include "qcocoamenu.h"
@@ -318,7 +320,7 @@ NSMenuItem *QCocoaMenuItem::sync()
if (accel.count() > 1)
text += QLatin1String(" (") + accel.toString(QKeySequence::NativeText) + QLatin1String(")");
- QString finalString = qt_mac_removeMnemonics(text);
+ QString finalString = QPlatformTheme::removeMnemonics(text);
bool useAttributedTitle = false;
// Cocoa Font and title
if (m_font.resolve()) {
diff --git a/src/plugins/platforms/cocoa/qcocoamenuloader.h b/src/plugins/platforms/cocoa/qcocoamenuloader.h
index bdc943f78a..a3eea8bc15 100644
--- a/src/plugins/platforms/cocoa/qcocoamenuloader.h
+++ b/src/plugins/platforms/cocoa/qcocoamenuloader.h
@@ -45,7 +45,7 @@
// We mean it.
//
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#include <QtCore/private/qcore_mac_p.h>
@interface QT_MANGLE_NAMESPACE(QCocoaMenuLoader) : NSResponder
diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.h b/src/plugins/platforms/cocoa/qcocoanativeinterface.h
index d018c05635..e46a622d3a 100644
--- a/src/plugins/platforms/cocoa/qcocoanativeinterface.h
+++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.h
@@ -60,8 +60,6 @@ public:
NativeResourceForIntegrationFunction nativeResourceFunctionForIntegration(const QByteArray &resource) Q_DECL_OVERRIDE;
- Q_INVOKABLE void beep();
-
#ifndef QT_NO_OPENGL
static void *cglContextForContext(QOpenGLContext *context);
static void *nsOpenGLContextForContext(QOpenGLContext* context);
diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm
index 41ea1fa49c..f776f746de 100644
--- a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm
+++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm
@@ -60,7 +60,7 @@
#include <QtPlatformHeaders/qcocoawindowfunctions.h>
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
QT_BEGIN_NAMESPACE
@@ -139,11 +139,6 @@ QPlatformNativeInterface::NativeResourceForIntegrationFunction QCocoaNativeInter
return 0;
}
-void QCocoaNativeInterface::beep()
-{
- NSBeep();
-}
-
QPlatformPrinterSupport *QCocoaNativeInterface::createPlatformPrinterSupport()
{
#if !defined(QT_NO_WIDGETS) && !defined(QT_NO_PRINTER)
diff --git a/src/plugins/platforms/cocoa/qcocoaservices.mm b/src/plugins/platforms/cocoa/qcocoaservices.mm
index 6f3f6c4e1d..75fc32f338 100644
--- a/src/plugins/platforms/cocoa/qcocoaservices.mm
+++ b/src/plugins/platforms/cocoa/qcocoaservices.mm
@@ -33,8 +33,6 @@
#include "qcocoaservices.h"
-#include "qt_mac_p.h"
-
#include <AppKit/NSWorkspace.h>
#include <Foundation/NSURL.h>
@@ -47,7 +45,7 @@ bool QCocoaServices::openUrl(const QUrl &url)
const QString scheme = url.scheme();
if (scheme.isEmpty())
return openDocument(url);
- return [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:QCFString::toNSString(url.toString(QUrl::FullyEncoded))]];
+ return [[NSWorkspace sharedWorkspace] openURL:url.toNSURL()];
}
bool QCocoaServices::openDocument(const QUrl &url)
@@ -55,7 +53,7 @@ bool QCocoaServices::openDocument(const QUrl &url)
if (!url.isValid())
return false;
- return [[NSWorkspace sharedWorkspace] openFile:QCFString::toNSString(url.toLocalFile())];
+ return [[NSWorkspace sharedWorkspace] openFile:url.toLocalFile().toNSString()];
}
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoasystemsettings.mm b/src/plugins/platforms/cocoa/qcocoasystemsettings.mm
index 93f8b2ba6f..91a3214da3 100644
--- a/src/plugins/platforms/cocoa/qcocoasystemsettings.mm
+++ b/src/plugins/platforms/cocoa/qcocoasystemsettings.mm
@@ -42,13 +42,13 @@
QT_BEGIN_NAMESPACE
-QColor qt_mac_colorForTheme(ThemeBrush brush)
+QBrush qt_mac_brushForTheme(ThemeBrush brush)
{
QMacAutoReleasePool pool;
QCFType<CGColorRef> cgClr = 0;
HIThemeBrushCreateCGColor(brush, &cgClr);
- return qt_mac_toQColor(cgClr);
+ return qt_mac_toQBrush(cgClr);
}
QColor qt_mac_colorForThemeTextColor(ThemeTextColor themeColor)
@@ -86,25 +86,29 @@ QPalette * qt_mac_createSystemPalette()
QColor qc;
// Standard palette initialization (copied from Qt 4 styles)
- QColor background = QColor(237, 237, 237);
+ QBrush backgroundBrush = qt_mac_toQBrush([NSColor windowBackgroundColor]);
+ QColor background = backgroundBrush.color();
QColor light(background.lighter(110));
QColor dark(background.darker(160));
QColor mid(background.darker(140));
QPalette *palette = new QPalette(Qt::black, background, light, dark, mid, Qt::black, Qt::white);
+ palette->setBrush(QPalette::Window, backgroundBrush);
+
palette->setBrush(QPalette::Disabled, QPalette::WindowText, dark);
palette->setBrush(QPalette::Disabled, QPalette::Text, dark);
palette->setBrush(QPalette::Disabled, QPalette::ButtonText, dark);
- palette->setBrush(QPalette::Disabled, QPalette::Base, background);
+ palette->setBrush(QPalette::Disabled, QPalette::Base, backgroundBrush);
palette->setColor(QPalette::Disabled, QPalette::Dark, QColor(191, 191, 191));
palette->setColor(QPalette::Active, QPalette::Dark, QColor(191, 191, 191));
palette->setColor(QPalette::Inactive, QPalette::Dark, QColor(191, 191, 191));
// System palette initialization:
- palette->setBrush(QPalette::Active, QPalette::Highlight, qt_mac_colorForTheme(kThemeBrushPrimaryHighlightColor));
- qc = qt_mac_colorForTheme(kThemeBrushSecondaryHighlightColor);
- palette->setBrush(QPalette::Inactive, QPalette::Highlight, qc);
- palette->setBrush(QPalette::Disabled, QPalette::Highlight, qc);
+ palette->setBrush(QPalette::Active, QPalette::Highlight,
+ qt_mac_toQBrush([NSColor selectedControlColor]));
+ QBrush br = qt_mac_toQBrush([NSColor secondarySelectedControlColor]);
+ palette->setBrush(QPalette::Inactive, QPalette::Highlight, br);
+ palette->setBrush(QPalette::Disabled, QPalette::Highlight, br);
palette->setBrush(QPalette::Shadow, background.darker(170));
@@ -168,8 +172,7 @@ QHash<QPlatformTheme::Palette, QPalette*> qt_mac_createRolePalettes()
pal.setColor(QPalette::Disabled, QPalette::HighlightedText, qc);
}
if (mac_widget_colors[i].paletteRole == QPlatformTheme::MenuPalette) {
- qc = qt_mac_colorForTheme(kThemeBrushMenuBackground);
- pal.setBrush(QPalette::Background, qc);
+ pal.setBrush(QPalette::Background, qt_mac_brushForTheme(kThemeBrushMenuBackground));
qc = qt_mac_colorForThemeTextColor(kThemeTextColorMenuItemActive);
pal.setBrush(QPalette::ButtonText, qc);
qc = qt_mac_colorForThemeTextColor(kThemeTextColorMenuItemSelected);
@@ -186,9 +189,9 @@ QHash<QPlatformTheme::Palette, QPalette*> qt_mac_createRolePalettes()
pal.color(QPalette::Active, QPalette::Text));
} else if (mac_widget_colors[i].paletteRole == QPlatformTheme::ItemViewPalette) {
pal.setBrush(QPalette::Active, QPalette::Highlight,
- qt_mac_colorForTheme(kThemeBrushAlternatePrimaryHighlightColor));
- qc = qt_mac_colorForThemeTextColor(kThemeTextColorMenuItemSelected);
- pal.setBrush(QPalette::Active, QPalette::HighlightedText, qc);
+ qt_mac_toQBrush([NSColor alternateSelectedControlColor]));
+ pal.setBrush(QPalette::Active, QPalette::HighlightedText,
+ qt_mac_toQBrush([NSColor alternateSelectedControlTextColor]));
pal.setBrush(QPalette::Inactive, QPalette::Text,
pal.brush(QPalette::Active, QPalette::Text));
pal.setBrush(QPalette::Inactive, QPalette::HighlightedText,
diff --git a/src/plugins/platforms/cocoa/qcocoatheme.h b/src/plugins/platforms/cocoa/qcocoatheme.h
index 0cd7b7d4c8..5ec0b30786 100644
--- a/src/plugins/platforms/cocoa/qcocoatheme.h
+++ b/src/plugins/platforms/cocoa/qcocoatheme.h
@@ -37,6 +37,8 @@
#include <QtCore/QHash>
#include <qpa/qplatformtheme.h>
+Q_FORWARD_DECLARE_OBJC_CLASS(QT_MANGLE_NAMESPACE(QCocoaThemeNotificationReceiver));
+
QT_BEGIN_NAMESPACE
class QPalette;
@@ -46,6 +48,8 @@ public:
QCocoaTheme();
~QCocoaTheme();
+ void reset();
+
QPlatformMenuItem* createPlatformMenuItem() const Q_DECL_OVERRIDE;
QPlatformMenu* createPlatformMenu() const Q_DECL_OVERRIDE;
QPlatformMenuBar* createPlatformMenuBar() const Q_DECL_OVERRIDE;
@@ -73,6 +77,7 @@ private:
mutable QPalette *m_systemPalette;
mutable QHash<QPlatformTheme::Palette, QPalette*> m_palettes;
mutable QHash<QPlatformTheme::Font, QFont*> m_fonts;
+ mutable QCocoaThemeNotificationReceiver *m_notificationReceiver;
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoatheme.mm b/src/plugins/platforms/cocoa/qcocoatheme.mm
index 4b73d0af08..1fd40c49f1 100644
--- a/src/plugins/platforms/cocoa/qcocoatheme.mm
+++ b/src/plugins/platforms/cocoa/qcocoatheme.mm
@@ -31,7 +31,7 @@
**
****************************************************************************/
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#include "qcocoatheme.h"
#include "messages.h"
@@ -55,6 +55,33 @@
#include <qpa/qplatformintegration.h>
#include <qpa/qplatformnativeinterface.h>
+#include <Carbon/Carbon.h>
+
+@interface QT_MANGLE_NAMESPACE(QCocoaThemeNotificationReceiver) : NSObject {
+QCocoaTheme *mPrivate;
+}
+- (id)initWithPrivate:(QCocoaTheme *)priv;
+- (void)systemColorsDidChange:(NSNotification *)notification;
+@end
+
+QT_NAMESPACE_ALIAS_OBJC_CLASS(QCocoaThemeNotificationReceiver);
+
+@implementation QCocoaThemeNotificationReceiver
+- (id)initWithPrivate:(QCocoaTheme *)priv
+{
+ self = [super init];
+ mPrivate = priv;
+ return self;
+}
+
+- (void)systemColorsDidChange:(NSNotification *)notification
+{
+ Q_UNUSED(notification);
+ mPrivate->reset();
+ QWindowSystemInterface::handleThemeChange(Q_NULLPTR);
+}
+@end
+
QT_BEGIN_NAMESPACE
const char *QCocoaTheme::name = "cocoa";
@@ -62,14 +89,27 @@ const char *QCocoaTheme::name = "cocoa";
QCocoaTheme::QCocoaTheme()
:m_systemPalette(0)
{
-
+ m_notificationReceiver = [[QT_MANGLE_NAMESPACE(QCocoaThemeNotificationReceiver) alloc] initWithPrivate:this];
+ [[NSNotificationCenter defaultCenter] addObserver:m_notificationReceiver
+ selector:@selector(systemColorsDidChange:)
+ name:NSSystemColorsDidChangeNotification
+ object:nil];
}
QCocoaTheme::~QCocoaTheme()
{
+ [[NSNotificationCenter defaultCenter] removeObserver:m_notificationReceiver];
+ [m_notificationReceiver release];
+ reset();
+ qDeleteAll(m_fonts);
+}
+
+void QCocoaTheme::reset()
+{
delete m_systemPalette;
+ m_systemPalette = Q_NULLPTR;
qDeleteAll(m_palettes);
- qDeleteAll(m_fonts);
+ m_palettes.clear();
}
bool QCocoaTheme::usePlatformNativeDialog(DialogType dialogType) const
@@ -257,18 +297,7 @@ QPixmap QCocoaTheme::fileIconPixmap(const QFileInfo &fileInfo, const QSizeF &siz
NSImage *iconImage = [[NSWorkspace sharedWorkspace] iconForFile:QCFString::toNSString(fileInfo.canonicalFilePath())];
if (!iconImage)
return QPixmap();
- NSSize pixmapSize = NSMakeSize(size.width(), size.height());
- QPixmap pixmap(pixmapSize.width, pixmapSize.height);
- pixmap.fill(Qt::transparent);
- [iconImage setSize:pixmapSize];
- NSRect iconRect = NSMakeRect(0, 0, pixmapSize.width, pixmapSize.height);
- CGContextRef ctx = qt_mac_cg_context(&pixmap);
- NSGraphicsContext *gc = [NSGraphicsContext graphicsContextWithGraphicsPort:ctx flipped:YES];
- [NSGraphicsContext saveGraphicsState];
- [NSGraphicsContext setCurrentContext:gc];
- [iconImage drawInRect:iconRect fromRect:iconRect operation:NSCompositeSourceOver fraction:1.0 respectFlipped:YES hints:nil];
- [NSGraphicsContext restoreGraphicsState];
- return pixmap;
+ return qt_mac_toQPixmap(iconImage, size);
}
QVariant QCocoaTheme::themeHint(ThemeHint hint) const
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h
index 05e6cf3c9e..e830be212a 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.h
+++ b/src/plugins/platforms/cocoa/qcocoawindow.h
@@ -34,7 +34,7 @@
#ifndef QCOCOAWINDOW_H
#define QCOCOAWINDOW_H
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <qpa/qplatformwindow.h>
#include <QRect>
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
index 3b5909a37e..2d8abba189 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -47,8 +47,7 @@
#include <qpa/qwindowsysteminterface.h>
#include <qpa/qplatformscreen.h>
-#include <Cocoa/Cocoa.h>
-#include <Carbon/Carbon.h>
+#include <AppKit/AppKit.h>
#include <QDebug>
@@ -689,7 +688,16 @@ void QCocoaWindow::setVisible(bool visible)
cocoaEventDispatcherPrivate->beginModalSession(window());
m_hasModalSession = true;
} else if ([m_nsWindow canBecomeKeyWindow]) {
- [m_nsWindow makeKeyAndOrderFront:nil];
+ QCocoaEventDispatcher *cocoaEventDispatcher = qobject_cast<QCocoaEventDispatcher *>(QGuiApplication::instance()->eventDispatcher());
+ QCocoaEventDispatcherPrivate *cocoaEventDispatcherPrivate = 0;
+ if (cocoaEventDispatcher)
+ cocoaEventDispatcherPrivate = static_cast<QCocoaEventDispatcherPrivate *>(QObjectPrivate::get(cocoaEventDispatcher));
+
+ if (!(cocoaEventDispatcherPrivate && cocoaEventDispatcherPrivate->currentModalSession()))
+ [m_nsWindow makeKeyAndOrderFront:nil];
+ else
+ [m_nsWindow orderFront:nil];
+
foreach (QCocoaWindow *childWindow, m_childWindows)
childWindow->show(true);
} else {
@@ -1345,6 +1353,9 @@ void QCocoaWindow::recreateWindow(const QPlatformWindow *parentWindow)
}
} else {
// Child windows have no NSWindow, link the NSViews instead.
+ if ([m_contentView superview])
+ [m_contentView removeFromSuperview];
+
[m_parentCocoaWindow->m_contentView addSubview : m_contentView];
QRect rect = windowGeometry();
// Prevent setting a (0,0) window size; causes opengl context
diff --git a/src/plugins/platforms/cocoa/qmacclipboard.h b/src/plugins/platforms/cocoa/qmacclipboard.h
index 0d1f195f48..8b290866c6 100644
--- a/src/plugins/platforms/cocoa/qmacclipboard.h
+++ b/src/plugins/platforms/cocoa/qmacclipboard.h
@@ -39,7 +39,7 @@
#undef slots
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
QT_BEGIN_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qmacdefines_mac.h b/src/plugins/platforms/cocoa/qmacdefines_mac.h
index b2773a2b9f..fd540e7c34 100644
--- a/src/plugins/platforms/cocoa/qmacdefines_mac.h
+++ b/src/plugins/platforms/cocoa/qmacdefines_mac.h
@@ -92,7 +92,7 @@ typedef signed long OSStatus;
# define old_slots slots
# undef slots
# endif
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
# ifdef old_slots
# undef slots
# define slots
diff --git a/src/plugins/platforms/cocoa/qmultitouch_mac_p.h b/src/plugins/platforms/cocoa/qmultitouch_mac_p.h
index e4eec41295..0af0505a47 100644
--- a/src/plugins/platforms/cocoa/qmultitouch_mac_p.h
+++ b/src/plugins/platforms/cocoa/qmultitouch_mac_p.h
@@ -47,7 +47,7 @@
#include <QtCore/qglobal.h>
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#include <qpa/qwindowsysteminterface.h>
#include <qhash.h>
diff --git a/src/plugins/platforms/cocoa/qnsview.h b/src/plugins/platforms/cocoa/qnsview.h
index 50b456cab7..a3541829c6 100644
--- a/src/plugins/platforms/cocoa/qnsview.h
+++ b/src/plugins/platforms/cocoa/qnsview.h
@@ -34,7 +34,7 @@
#ifndef QNSVIEW_H
#define QNSVIEW_H
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <QtCore/QPointer>
#include <QtGui/QImage>
diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm
index 3faa292ae0..528e6f120f 100644
--- a/src/plugins/platforms/cocoa/qnsview.mm
+++ b/src/plugins/platforms/cocoa/qnsview.mm
@@ -33,7 +33,6 @@
#include <QtCore/qglobal.h>
-#include <Carbon/Carbon.h>
#include <dlfcn.h>
#include "qnsview.h"
diff --git a/src/plugins/platforms/cocoa/qnsviewaccessibility.mm b/src/plugins/platforms/cocoa/qnsviewaccessibility.mm
index 1f15da5b3b..d44b02549d 100644
--- a/src/plugins/platforms/cocoa/qnsviewaccessibility.mm
+++ b/src/plugins/platforms/cocoa/qnsviewaccessibility.mm
@@ -31,8 +31,6 @@
**
****************************************************************************/
-#include <Carbon/Carbon.h>
-
#include "qnsview.h"
#include "qcocoahelpers.h"
#include "qcocoaaccessibility.h"
diff --git a/src/plugins/platforms/cocoa/qnswindowdelegate.h b/src/plugins/platforms/cocoa/qnswindowdelegate.h
index b8d344aa0e..794059bc68 100644
--- a/src/plugins/platforms/cocoa/qnswindowdelegate.h
+++ b/src/plugins/platforms/cocoa/qnswindowdelegate.h
@@ -34,7 +34,7 @@
#ifndef QNSWINDOWDELEGATE_H
#define QNSWINDOWDELEGATE_H
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include "qcocoawindow.h"
diff --git a/src/plugins/platforms/cocoa/qprintengine_mac.mm b/src/plugins/platforms/cocoa/qprintengine_mac.mm
index edd1d656f0..6edfd75a14 100644
--- a/src/plugins/platforms/cocoa/qprintengine_mac.mm
+++ b/src/plugins/platforms/cocoa/qprintengine_mac.mm
@@ -251,7 +251,7 @@ void QMacPrintEnginePrivate::initialize()
setPageSize(m_pageLayout.pageSize());
QHash<QMacPrintEngine::PrintEnginePropertyKey, QVariant>::const_iterator propC;
- for (propC = valueCache.constBegin(); propC != valueCache.constEnd(); propC++) {
+ for (propC = valueCache.constBegin(); propC != valueCache.constEnd(); ++propC) {
q->setProperty(propC.key(), propC.value());
}
}
diff --git a/src/plugins/platforms/cocoa/qt_mac_p.h b/src/plugins/platforms/cocoa/qt_mac_p.h
index 576e0f9729..9a20c31720 100644
--- a/src/plugins/platforms/cocoa/qt_mac_p.h
+++ b/src/plugins/platforms/cocoa/qt_mac_p.h
@@ -48,7 +48,7 @@
#include "qmacdefines_mac.h"
#ifdef __OBJC__
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <objc/runtime.h>
#endif
@@ -63,30 +63,10 @@
#include "QtGui/qpainter.h"
-#include <Carbon/Carbon.h>
-
QT_BEGIN_NAMESPACE
class QWidget;
class QDragMoveEvent;
-/* Event masks */
-// internal Qt types
-
-enum {
- //AE types
- typeAEClipboardChanged = 1,
- //types
- typeQWidget = 1, /* QWidget * */
- //params
- kEventParamQWidget = 'qwid', /* typeQWidget */
- //events
- kEventQtRequestContext = 13,
- kEventQtRequestMenubarUpdate = 14,
- kEventQtRequestShowSheet = 17,
- kEventQtRequestActivate = 18,
- kEventQtRequestWindowChange = 20
-};
-
// Simple class to manage short-lived regions
class QMacSmartQuickDrawRegion
{
@@ -103,8 +83,6 @@ public:
}
};
-QString qt_mac_removeMnemonics(const QString &original); //implemented in qmacstyle_mac.cpp
-
class Q_WIDGETS_EXPORT QMacWindowChangeEvent
{
private:
@@ -127,8 +105,8 @@ class QMacCGContext
public:
QMacCGContext(QPainter *p); //qpaintengine_mac.mm
inline QMacCGContext() { context = 0; }
- inline QMacCGContext(const QPaintDevice *pdev) {
- extern CGContextRef qt_mac_cg_context(const QPaintDevice *);
+ inline QMacCGContext(QPaintDevice *pdev) {
+ extern CGContextRef qt_mac_cg_context(QPaintDevice *);
context = qt_mac_cg_context(pdev);
}
inline QMacCGContext(CGContextRef cg, bool takeOwnership=false) {
@@ -173,10 +151,6 @@ extern QPoint qt_mac_nativeMapFromParent(const QWidget *child, const QPoint &pt)
# undef check
#endif
-QFont qfontForThemeFont(ThemeFontID themeID);
-
-QColor qcolorForThemeTextColor(ThemeTextColor themeColor);
-
struct QMacDndAnswerRecord {
QRect rect;
Qt::KeyboardModifiers modifiers;
diff --git a/src/plugins/platforms/direct2d/qwindowsdirect2ddevicecontext.cpp b/src/plugins/platforms/direct2d/qwindowsdirect2ddevicecontext.cpp
index 154023fb11..418c2e3745 100644
--- a/src/plugins/platforms/direct2d/qwindowsdirect2ddevicecontext.cpp
+++ b/src/plugins/platforms/direct2d/qwindowsdirect2ddevicecontext.cpp
@@ -51,7 +51,7 @@ public:
HRESULT hr = QWindowsDirect2DContext::instance()->d2dDevice()->CreateDeviceContext(
D2D1_DEVICE_CONTEXT_OPTIONS_NONE,
&deviceContext);
- if (FAILED(hr))
+ if (Q_UNLIKELY(FAILED(hr)))
qFatal("%s: Couldn't create Direct2D Device Context: %#x", __FUNCTION__, hr);
}
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsdevice.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsdevice.cpp
index c29d64c06d..38b61f8f8b 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsdevice.cpp
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsdevice.cpp
@@ -280,12 +280,18 @@ QEglFSKmsScreen *QEglFSKmsDevice::screenForConnector(drmModeResPtr resources, dr
qCDebug(qLcEglfsKmsDebug) << "Selected mode" << selected_mode << ":" << width << "x" << height
<< '@' << refresh << "hz for output" << connectorName;
}
-
+ static const int width = qEnvironmentVariableIntValue("QT_QPA_EGLFS_PHYSICAL_WIDTH");
+ static const int height = qEnvironmentVariableIntValue("QT_QPA_EGLFS_PHYSICAL_HEIGHT");
+ QSizeF size(width, height);
+ if (size.isEmpty()) {
+ size.setWidth(connector->mmWidth);
+ size.setHeight(connector->mmHeight);
+ }
QEglFSKmsOutput output = {
QString::fromUtf8(connectorName),
connector->connector_id,
crtc_id,
- QSizeF(connector->mmWidth, connector->mmHeight),
+ size,
selected_mode,
false,
drmModeGetCrtc(m_dri_fd, crtc_id),
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsintegration.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsintegration.cpp
index d1814fb85d..789f2fa86f 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsintegration.cpp
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsintegration.cpp
@@ -77,7 +77,7 @@ void QEglFSKmsIntegration::platformInit()
qCDebug(qLcEglfsKmsDebug) << "Found the following video devices:" << devices;
d->deleteLater();
- if (devices.isEmpty())
+ if (Q_UNLIKELY(devices.isEmpty()))
qFatal("Could not find DRM device!");
m_devicePath = devices.first();
@@ -85,7 +85,7 @@ void QEglFSKmsIntegration::platformInit()
}
m_device = new QEglFSKmsDevice(this, m_devicePath);
- if (!m_device->open())
+ if (Q_UNLIKELY(!m_device->open()))
qFatal("Could not open device %s - aborting!", qPrintable(m_devicePath));
}
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 f7450708ab..03cfea72b8 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp
@@ -53,20 +53,20 @@ QEglFSKmsEglDeviceIntegration::QEglFSKmsEglDeviceIntegration()
void QEglFSKmsEglDeviceIntegration::platformInit()
{
- if (!query_egl_device())
+ if (Q_UNLIKELY(!query_egl_device()))
qFatal("Could not set up EGL device!");
const char *deviceName = m_funcs->query_device_string(m_egl_device, EGL_DRM_DEVICE_FILE_EXT);
- if (!deviceName)
+ if (Q_UNLIKELY(!deviceName))
qFatal("Failed to query device name from EGLDevice");
qCDebug(qLcEglfsKmsDebug, "Opening %s", deviceName);
m_dri_fd = drmOpen(deviceName, Q_NULLPTR);
- if (m_dri_fd < 0)
+ if (Q_UNLIKELY(m_dri_fd < 0))
qFatal("Could not open DRM device");
- if (!setup_kms())
+ if (Q_UNLIKELY(!setup_kms()))
qFatal("Could not set up KMS on device %s!", m_device.constData());
qCDebug(qLcEglfsKmsDebug, "DRM/KMS initialized");
@@ -101,14 +101,14 @@ EGLDisplay QEglFSKmsEglDeviceIntegration::createDisplay(EGLNativeDisplayType nat
display = eglGetDisplay(nativeDisplay);
}
- if (display == EGL_NO_DISPLAY)
+ if (Q_UNLIKELY(display == EGL_NO_DISPLAY))
qFatal("Could not get EGL display");
EGLint major, minor;
- if (!eglInitialize(display, &major, &minor))
+ if (Q_UNLIKELY(!eglInitialize(display, &major, &minor)))
qFatal("Could not initialize egl display");
- if (!eglBindAPI(EGL_OPENGL_ES_API))
+ if (Q_UNLIKELY(!eglBindAPI(EGL_OPENGL_ES_API)))
qFatal("Failed to bind EGL_OPENGL_ES_API\n");
return display;
@@ -267,8 +267,8 @@ QEglFSWindow *QEglFSKmsEglDeviceIntegration::createWindow(QWindow *window) const
QEglJetsonTK1Window *eglWindow = new QEglJetsonTK1Window(window, this);
m_funcs->initialize(eglWindow->screen()->display());
- if (!(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)))
qFatal("Required extensions missing!");
return eglWindow;
@@ -310,7 +310,7 @@ void QEglFSKmsEglDeviceIntegration::waitForVSync(QPlatformSurface *) const
-1, 0, 0,
&m_drm_connector->connector_id, 1,
const_cast<const drmModeModeInfoPtr>(&m_drm_mode));
- if (ret)
+ if (Q_UNLIKELY(ret))
qFatal("drmModeSetCrtc failed");
}
}
@@ -379,7 +379,7 @@ bool QEglFSKmsEglDeviceIntegration::setup_kms()
}
}
- if (crtc == 0)
+ if (Q_UNLIKELY(crtc == 0))
qFatal("No suitable CRTC available");
m_drm_connector = connector;
@@ -399,7 +399,7 @@ bool QEglFSKmsEglDeviceIntegration::setup_kms()
bool QEglFSKmsEglDeviceIntegration::query_egl_device()
{
m_funcs = new QEGLStreamConvenience;
- if (!m_funcs->has_egl_device_base)
+ if (Q_UNLIKELY(!m_funcs->has_egl_device_base))
qFatal("EGL_EXT_device_base missing");
EGLint num_devices = 0;
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/qeglfsx11integration.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/qeglfsx11integration.cpp
index 4d29b96608..ef586622e2 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/qeglfsx11integration.cpp
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/qeglfsx11integration.cpp
@@ -172,7 +172,7 @@ void QEglFSX11Integration::sendConnectionEvent(xcb_atom_t a)
void QEglFSX11Integration::platformInit()
{
m_display = XOpenDisplay(0);
- if (!m_display)
+ if (Q_UNLIKELY(!m_display))
qFatal("Could not open display");
XSetEventQueueOwner(DISPLAY, XCBOwnsEventQueue);
diff --git a/src/plugins/platforms/eglfs/qeglfscursor.cpp b/src/plugins/platforms/eglfs/qeglfscursor.cpp
index eea130a754..bfb69d3e8f 100644
--- a/src/plugins/platforms/eglfs/qeglfscursor.cpp
+++ b/src/plugins/platforms/eglfs/qeglfscursor.cpp
@@ -38,6 +38,7 @@
#include <qpa/qwindowsysteminterface.h>
#include <QtGui/QOpenGLContext>
#include <QtGui/QOpenGLShaderProgram>
+#include <QtCore/QFile>
#include <QtCore/QJsonDocument>
#include <QtCore/QJsonArray>
#include <QtCore/QJsonObject>
diff --git a/src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp b/src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp
index 8af48a893b..d64cc457f3 100644
--- a/src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp
+++ b/src/plugins/platforms/eglfs/qeglfsdeviceintegration.cpp
@@ -155,7 +155,7 @@ void QEGLDeviceIntegration::platformInit()
framebuffer = qt_safe_open(fbDev, O_RDONLY);
- if (framebuffer == -1) {
+ if (Q_UNLIKELY(framebuffer == -1)) {
qWarning("EGLFS: Failed to open %s", fbDev.constData());
qFatal("EGLFS: Can't continue without a display");
}
diff --git a/src/plugins/platforms/eglfs/qeglfsintegration.cpp b/src/plugins/platforms/eglfs/qeglfsintegration.cpp
index 2086ce56e2..001dd76803 100644
--- a/src/plugins/platforms/eglfs/qeglfsintegration.cpp
+++ b/src/plugins/platforms/eglfs/qeglfsintegration.cpp
@@ -118,11 +118,11 @@ void QEglFSIntegration::initialize()
qt_egl_device_integration()->platformInit();
m_display = qt_egl_device_integration()->createDisplay(nativeDisplay());
- if (m_display == EGL_NO_DISPLAY)
+ if (Q_UNLIKELY(m_display == EGL_NO_DISPLAY))
qFatal("Could not open egl display");
EGLint major, minor;
- if (!eglInitialize(m_display, &major, &minor))
+ if (Q_UNLIKELY(!eglInitialize(m_display, &major, &minor)))
qFatal("Could not initialize egl display");
m_inputContext = QPlatformInputContextFactory::create();
diff --git a/src/plugins/platforms/eglfs/qeglfswindow.cpp b/src/plugins/platforms/eglfs/qeglfswindow.cpp
index 8301be8c17..b29981bc98 100644
--- a/src/plugins/platforms/eglfs/qeglfswindow.cpp
+++ b/src/plugins/platforms/eglfs/qeglfswindow.cpp
@@ -102,17 +102,15 @@ void QEglFSWindow::create()
QEglFSScreen *screen = this->screen();
QOpenGLCompositor *compositor = QOpenGLCompositor::instance();
if (screen->primarySurface() != EGL_NO_SURFACE) {
- if (isRaster() && compositor->targetWindow()) {
- m_format = compositor->targetWindow()->format();
- return;
- }
-
+ if (Q_UNLIKELY(!isRaster() || !compositor->targetWindow())) {
#if !defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_NO_SDK)
- // We can have either a single OpenGL window or multiple raster windows.
- // Other combinations cannot work.
- qFatal("EGLFS: OpenGL windows cannot be mixed with others.");
+ // We can have either a single OpenGL window or multiple raster windows.
+ // Other combinations cannot work.
+ qFatal("EGLFS: OpenGL windows cannot be mixed with others.");
#endif
-
+ return;
+ }
+ m_format = compositor->targetWindow()->format();
return;
}
@@ -122,7 +120,7 @@ void QEglFSWindow::create()
resetSurface();
- if (m_surface == EGL_NO_SURFACE) {
+ if (Q_UNLIKELY(m_surface == EGL_NO_SURFACE)) {
EGLint error = eglGetError();
eglTerminate(screen->display());
qFatal("EGL Error : Could not create the egl surface: error = 0x%x\n", error);
@@ -135,7 +133,7 @@ void QEglFSWindow::create()
context->setShareContext(qt_gl_global_share_context());
context->setFormat(m_format);
context->setScreen(window()->screen());
- if (!context->create())
+ if (Q_UNLIKELY(!context->create()))
qFatal("EGLFS: Failed to create compositing context");
compositor->setTarget(context, window());
}
diff --git a/src/plugins/platforms/haiku/qhaikuwindow.cpp b/src/plugins/platforms/haiku/qhaikuwindow.cpp
index 9622d12111..1576e7c04e 100644
--- a/src/plugins/platforms/haiku/qhaikuwindow.cpp
+++ b/src/plugins/platforms/haiku/qhaikuwindow.cpp
@@ -127,7 +127,7 @@ QHaikuWindow::QHaikuWindow(QWindow *window)
m_window = haikuWindow;
- if (!m_window)
+ if (Q_UNLIKELY(!m_window))
qFatal("QHaikuWindow: failed to create window");
setGeometry(rect);
diff --git a/src/plugins/platforms/ios/ios.pro b/src/plugins/platforms/ios/ios.pro
index bf7849b740..b1075d3c0f 100644
--- a/src/plugins/platforms/ios/ios.pro
+++ b/src/plugins/platforms/ios/ios.pro
@@ -6,7 +6,7 @@ PLUGIN_CLASS_NAME = QIOSIntegrationPlugin
load(qt_plugin)
QT += core-private gui-private platformsupport-private
-LIBS += -framework Foundation -framework UIKit -framework QuartzCore -framework AssetsLibrary
+LIBS += -framework Foundation -framework UIKit -framework QuartzCore -framework AssetsLibrary -framework AudioToolbox
OBJECTIVE_SOURCES = \
plugin.mm \
@@ -30,7 +30,8 @@ OBJECTIVE_SOURCES = \
qiostextresponder.mm \
qiosmenu.mm \
qiosfileengineassetslibrary.mm \
- qiosfiledialog.mm
+ qiosfiledialog.mm \
+ qiosmessagedialog.mm
HEADERS = \
qiosintegration.h \
@@ -54,7 +55,8 @@ HEADERS = \
qiosmenu.h \
qiosfileenginefactory.h \
qiosfileengineassetslibrary.h \
- qiosfiledialog.h
+ qiosfiledialog.h \
+ qiosmessagedialog.h
OTHER_FILES = \
quiview_textinput.mm \
diff --git a/src/plugins/platforms/ios/qiosbackingstore.h b/src/plugins/platforms/ios/qiosbackingstore.h
index 5d2ae429f1..387a286447 100644
--- a/src/plugins/platforms/ios/qiosbackingstore.h
+++ b/src/plugins/platforms/ios/qiosbackingstore.h
@@ -36,34 +36,31 @@
#include <qpa/qplatformbackingstore.h>
+#include <QtPlatformSupport/private/qrasterbackingstore_p.h>
+
QT_BEGIN_NAMESPACE
class QOpenGLPaintDevice;
-class QOpenGLFramebufferObject;
-class QOffscreenSurface;
-class QIOSBackingStore : public QPlatformBackingStore
+class QIOSBackingStore : public QRasterBackingStore
{
public:
QIOSBackingStore(QWindow *window);
~QIOSBackingStore();
- QPaintDevice *paintDevice();
+ QPaintDevice *paintDevice() Q_DECL_OVERRIDE;
- void beginPaint(const QRegion &);
- void endPaint();
+ void beginPaint(const QRegion &) Q_DECL_OVERRIDE;
+ void endPaint() Q_DECL_OVERRIDE;
- void flush(QWindow *window, const QRegion &region, const QPoint &offset);
- void resize(const QSize &size, const QRegion &staticContents);
- GLuint toTexture(const QRegion &dirtyRegion, QSize *textureSize, TextureFlags *flags) const;
+ void flush(QWindow *window, const QRegion &region, const QPoint &offset) Q_DECL_OVERRIDE;
+ void resize(const QSize &size, const QRegion &staticContents) Q_DECL_OVERRIDE;
void makeCurrent();
private:
QOpenGLContext *m_context;
- QOpenGLPaintDevice *m_device;
- QOpenGLFramebufferObject *m_fbo;
- QOffscreenSurface *m_surface;
+ QOpenGLPaintDevice *m_glDevice;
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/ios/qiosbackingstore.mm b/src/plugins/platforms/ios/qiosbackingstore.mm
index 875d06dc80..f408c13af3 100644
--- a/src/plugins/platforms/ios/qiosbackingstore.mm
+++ b/src/plugins/platforms/ios/qiosbackingstore.mm
@@ -38,6 +38,7 @@
#include <QtGui/QOpenGLPaintDevice>
#include <QtGui/QOpenGLFramebufferObject>
#include <QtGui/QOffscreenSurface>
+#include <QtGui/qpainter.h>
#include <QtGui/private/qwindow_p.h>
#include <QtDebug>
@@ -58,13 +59,12 @@ void QIOSPaintDevice::ensureActiveTarget()
}
QIOSBackingStore::QIOSBackingStore(QWindow *window)
- : QPlatformBackingStore(window)
+ : QRasterBackingStore(window)
, m_context(new QOpenGLContext)
- , m_device(0)
- , m_fbo(0)
- , m_surface(0)
+ , m_glDevice(nullptr)
{
QSurfaceFormat fmt = window->requestedFormat();
+
// Due to sharing QIOSContext redirects our makeCurrent on window() attempts to
// the global share context. Hence it is essential to have a compatible format.
fmt.setDepthBufferSize(QSurfaceFormat::defaultFormat().depthBufferSize());
@@ -73,8 +73,10 @@ QIOSBackingStore::QIOSBackingStore(QWindow *window)
if (fmt.depthBufferSize() == 0)
qWarning("No depth in default format, expect rendering errors");
+ // We use the surface both for raster operations and for GL drawing (when
+ // we blit the raster image), so the type needs to cover both use cases.
if (window->surfaceType() == QSurface::RasterSurface)
- window->setSurfaceType(QSurface::OpenGLSurface);
+ window->setSurfaceType(QSurface::RasterGLSurface);
m_context->setFormat(fmt);
m_context->setScreen(window->screen());
@@ -85,75 +87,44 @@ QIOSBackingStore::QIOSBackingStore(QWindow *window)
QIOSBackingStore::~QIOSBackingStore()
{
- delete m_fbo;
- delete m_surface;
delete m_context;
- delete m_device;
+ delete m_glDevice;
}
void QIOSBackingStore::makeCurrent()
{
- QSurface *surface = m_surface ? m_surface : static_cast<QSurface *>(window());
- if (!m_context->makeCurrent(surface))
+ if (!m_context->makeCurrent(window()))
qWarning("QIOSBackingStore: makeCurrent() failed");
- if (m_fbo)
- m_fbo->bind();
}
-void QIOSBackingStore::beginPaint(const QRegion &)
+void QIOSBackingStore::beginPaint(const QRegion &region)
{
- if (qt_window_private(window())->compositing) {
- if (!m_fbo) {
- delete m_device;
- m_device = 0;
- }
- if (!m_surface) {
- m_surface = new QOffscreenSurface;
- m_surface->setFormat(m_context->format());
- m_surface->create();
- }
- if (!m_context->makeCurrent(m_surface))
- qWarning("QIOSBackingStore: Failed to make offscreen surface current");
- const QSize size = window()->size() * window()->devicePixelRatio();
- if (m_fbo && m_fbo->size() != size) {
- delete m_fbo;
- m_fbo = 0;
- }
- if (!m_fbo)
- m_fbo = new QOpenGLFramebufferObject(size, QOpenGLFramebufferObject::CombinedDepthStencil);
- } else if (m_fbo) {
- delete m_fbo;
- m_fbo = 0;
- delete m_surface;
- m_surface = 0;
- delete m_device;
- m_device = 0;
- }
-
makeCurrent();
- if (!m_device)
- m_device = new QIOSPaintDevice(this);
+ if (!m_glDevice)
+ m_glDevice = new QIOSPaintDevice(this);
+
+ if (window()->surfaceType() == QSurface::RasterGLSurface)
+ QRasterBackingStore::beginPaint(region);
}
void QIOSBackingStore::endPaint()
{
- if (m_fbo) {
- m_fbo->release();
- glFlush();
- }
}
QPaintDevice *QIOSBackingStore::paintDevice()
{
- Q_ASSERT(m_device);
+ Q_ASSERT(m_glDevice);
// Keep paint device size and device pixel ratio in sync with window
qreal devicePixelRatio = window()->devicePixelRatio();
- m_device->setSize(window()->size() * devicePixelRatio);
- m_device->setDevicePixelRatio(devicePixelRatio);
+ m_glDevice->setSize(window()->size() * devicePixelRatio);
+ m_glDevice->setDevicePixelRatio(devicePixelRatio);
- return m_device;
+ if (window()->surfaceType() == QSurface::RasterGLSurface)
+ return QRasterBackingStore::paintDevice();
+ else
+ return m_glDevice;
}
void QIOSBackingStore::flush(QWindow *window, const QRegion &region, const QPoint &offset)
@@ -171,6 +142,11 @@ void QIOSBackingStore::flush(QWindow *window, const QRegion &region, const QPoin
return;
}
+ if (window->surfaceType() == QSurface::RasterGLSurface) {
+ QPainter painter(m_glDevice);
+ painter.drawImage(QPoint(), m_image);
+ }
+
m_context->makeCurrent(window);
m_context->swapBuffers(window);
}
@@ -179,31 +155,20 @@ void QIOSBackingStore::resize(const QSize &size, const QRegion &staticContents)
{
Q_UNUSED(staticContents);
- // Resizing the backing store would in our case mean resizing the QWindow,
- // as we cheat and use an QOpenGLPaintDevice that we target at the window.
- // That's probably not what the user intended, so we ignore resizes of the
- // backing store and always keep the paint device's size in sync with the
- // window size in beginPaint().
+ if (window()->surfaceType() == QSurface::OpenGLSurface) {
+ // Resizing the backing store would in this case mean resizing the QWindow,
+ // as we use an QOpenGLPaintDevice that we target at the window. That's
+ // probably not what the user intended, so we ignore resizes of the backing
+ // store and always keep the paint device's size in sync with the window
+ // size in beginPaint().
- if (size != window()->size() && !window()->inherits("QWidgetWindow"))
- qWarning() << "QIOSBackingStore needs to have the same size as its window";
-}
-
-GLuint QIOSBackingStore::toTexture(const QRegion &dirtyRegion, QSize *textureSize, TextureFlags *flags) const
-{
- Q_ASSERT(qt_window_private(window())->compositing);
- Q_UNUSED(dirtyRegion);
-
- if (flags)
- *flags = TextureFlip;
+ if (size != window()->size() && !window()->inherits("QWidgetWindow"))
+ qWarning() << "QIOSBackingStore needs to have the same size as its window";
- if (!m_fbo)
- return 0;
-
- if (textureSize)
- *textureSize = m_fbo->size();
+ return;
+ }
- return m_fbo->texture();
+ QRasterBackingStore::resize(size, staticContents);
}
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/ios/qioseventdispatcher.mm b/src/plugins/platforms/ios/qioseventdispatcher.mm
index 0e9f176487..e1c6071c38 100644
--- a/src/plugins/platforms/ios/qioseventdispatcher.mm
+++ b/src/plugins/platforms/ios/qioseventdispatcher.mm
@@ -129,7 +129,7 @@ namespace
// Which we verify, just in case
struct rlimit stackLimit = {0, 0};
- if (getrlimit(RLIMIT_STACK, &stackLimit) == 0 && stackSize > stackLimit.rlim_cur)
+ if (Q_UNLIKELY(getrlimit(RLIMIT_STACK, &stackLimit) == 0 && stackSize > stackLimit.rlim_cur))
qFatal("Unexpectedly exceeded stack limit");
return stackSize;
@@ -250,7 +250,7 @@ static void __attribute__((noinline, noreturn)) user_main_trampoline()
unsigned int bufferSize = [arg lengthOfBytesUsingEncoding:cStringEncoding] + 1;
argv[i] = reinterpret_cast<char *>(malloc(bufferSize));
- if (![arg getCString:argv[i] maxLength:bufferSize encoding:cStringEncoding])
+ if (Q_UNLIKELY(![arg getCString:argv[i] maxLength:bufferSize encoding:cStringEncoding]))
qFatal("Could not convert argv[%d] to C string", i);
}
diff --git a/src/plugins/platforms/ios/qiosintegration.h b/src/plugins/platforms/ios/qiosintegration.h
index 7d23fe1d62..e670d83a8d 100644
--- a/src/plugins/platforms/ios/qiosintegration.h
+++ b/src/plugins/platforms/ios/qiosintegration.h
@@ -82,6 +82,8 @@ public:
void addScreen(QPlatformScreen *screen) { screenAdded(screen); }
void destroyScreen(QPlatformScreen *screen) { QPlatformIntegration::destroyScreen(screen); }
+ void beep() const Q_DECL_OVERRIDE;
+
static QIOSIntegration *instance();
// -- QPlatformNativeInterface --
diff --git a/src/plugins/platforms/ios/qiosintegration.mm b/src/plugins/platforms/ios/qiosintegration.mm
index 0e3da8dce8..37b3866299 100644
--- a/src/plugins/platforms/ios/qiosintegration.mm
+++ b/src/plugins/platforms/ios/qiosintegration.mm
@@ -53,6 +53,8 @@
#include <QtPlatformSupport/private/qmacmime_p.h>
#include <QDir>
+#import <AudioToolbox/AudioServices.h>
+
#include <QtDebug>
QT_BEGIN_NAMESPACE
@@ -70,7 +72,7 @@ QIOSIntegration::QIOSIntegration()
, m_accessibility(0)
, m_debugWindowManagement(false)
{
- if (![UIApplication sharedApplication]) {
+ if (Q_UNLIKELY(![UIApplication sharedApplication])) {
qFatal("Error: You are creating QApplication before calling UIApplicationMain.\n" \
"If you are writing a native iOS application, and only want to use Qt for\n" \
"parts of the application, a good place to create QApplication is from within\n" \
@@ -266,6 +268,13 @@ QPlatformNativeInterface *QIOSIntegration::nativeInterface() const
return const_cast<QIOSIntegration *>(this);
}
+void QIOSIntegration::beep() const
+{
+#if !TARGET_IPHONE_SIMULATOR
+ AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
+#endif
+}
+
// ---------------------------------------------------------
void *QIOSIntegration::nativeResourceForWindow(const QByteArray &resource, QWindow *window)
diff --git a/src/plugins/platforms/ios/qiosmenu.h b/src/plugins/platforms/ios/qiosmenu.h
index ec23b55507..3beb58b503 100644
--- a/src/plugins/platforms/ios/qiosmenu.h
+++ b/src/plugins/platforms/ios/qiosmenu.h
@@ -74,9 +74,6 @@ public:
bool m_separator;
QIOSMenu *m_menu;
QKeySequence m_shortcut;
-
-private:
- QString removeMnemonics(const QString &original);
};
typedef QList<QIOSMenuItem *> QIOSMenuItemList;
diff --git a/src/plugins/platforms/ios/qiosmenu.mm b/src/plugins/platforms/ios/qiosmenu.mm
index 612f8c43a2..5f9346816a 100644
--- a/src/plugins/platforms/ios/qiosmenu.mm
+++ b/src/plugins/platforms/ios/qiosmenu.mm
@@ -33,6 +33,7 @@
#include <qglobal.h>
#include <qguiapplication.h>
+#include <qpa/qplatformtheme.h>
#include "qiosglobal.h"
#include "qiosmenu.h"
@@ -271,7 +272,7 @@ quintptr QIOSMenuItem::tag() const
void QIOSMenuItem::setText(const QString &text)
{
- m_text = removeMnemonics(text);
+ m_text = QPlatformTheme::removeMnemonics(text);
}
void QIOSMenuItem::setMenu(QPlatformMenu *menu)
@@ -304,41 +305,6 @@ void QIOSMenuItem::setEnabled(bool enabled)
m_enabled = enabled;
}
-QString QIOSMenuItem::removeMnemonics(const QString &original)
-{
- // Copied from qcocoahelpers
- QString returnText(original.size(), 0);
- int finalDest = 0;
- int currPos = 0;
- int l = original.length();
- while (l) {
- if (original.at(currPos) == QLatin1Char('&')
- && (l == 1 || original.at(currPos + 1) != QLatin1Char('&'))) {
- ++currPos;
- --l;
- if (l == 0)
- break;
- } else if (original.at(currPos) == QLatin1Char('(') && l >= 4 &&
- original.at(currPos + 1) == QLatin1Char('&') &&
- original.at(currPos + 2) != QLatin1Char('&') &&
- original.at(currPos + 3) == QLatin1Char(')')) {
- /* remove mnemonics its format is "\s*(&X)" */
- int n = 0;
- while (finalDest > n && returnText.at(finalDest - n - 1).isSpace())
- ++n;
- finalDest -= n;
- currPos += 4;
- l -= 4;
- continue;
- }
- returnText[finalDest] = original.at(currPos);
- ++currPos;
- ++finalDest;
- --l;
- }
- returnText.truncate(finalDest);
- return returnText;
-}
QIOSMenu::QIOSMenu()
: QPlatformMenu()
diff --git a/src/plugins/bearer/blackberry/main.cpp b/src/plugins/platforms/ios/qiosmessagedialog.h
index ddeaefa75c..a9bd42324e 100644
--- a/src/plugins/bearer/blackberry/main.cpp
+++ b/src/plugins/platforms/ios/qiosmessagedialog.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2012 Research In Motion
+** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the plugins of the Qt Toolkit.
@@ -31,33 +31,35 @@
**
****************************************************************************/
-#include "qbbengine.h"
+#ifndef QIOSMESSAGEDIALOG_H
+#define QIOSMESSAGEDIALOG_H
-#include <QtNetwork/private/qbearerplugin_p.h>
-
-#ifndef QT_NO_BEARERMANAGEMENT
+#include <QtCore/qeventloop.h>
+#include <qpa/qplatformdialoghelper.h>
QT_BEGIN_NAMESPACE
-class QBBEnginePlugin : public QBearerEnginePlugin
-{
- Q_OBJECT
- Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QBearerEngineFactoryInterface" FILE "blackberry.json")
+Q_FORWARD_DECLARE_OBJC_CLASS(UIAlertController);
+Q_FORWARD_DECLARE_OBJC_CLASS(UIAlertAction);
+class QIOSMessageDialog : public QPlatformMessageDialogHelper
+{
public:
- QBearerEngine *create(const QString &key) const;
-};
+ QIOSMessageDialog();
+ ~QIOSMessageDialog();
-QBearerEngine *QBBEnginePlugin::create(const QString &key) const
-{
- if (key == QLatin1String("blackberry"))
- return new QBBEngine;
+ void exec() Q_DECL_OVERRIDE;
+ bool show(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent) Q_DECL_OVERRIDE;
+ void hide() Q_DECL_OVERRIDE;
- return 0;
-}
+private:
+ QEventLoop m_eventLoop;
+ UIAlertController *m_alertController;
+ QString messageTextPlain();
+ UIAlertAction *createAction(StandardButton button);
+};
QT_END_NAMESPACE
-#include "main.moc"
+#endif // QIOSMESSAGEDIALOG_H
-#endif // QT_NO_BEARERMANAGEMENT
diff --git a/src/plugins/platforms/ios/qiosmessagedialog.mm b/src/plugins/platforms/ios/qiosmessagedialog.mm
new file mode 100644
index 0000000000..39f7d4b1cd
--- /dev/null
+++ b/src/plugins/platforms/ios/qiosmessagedialog.mm
@@ -0,0 +1,135 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#import <UIKit/UIKit.h>
+
+#include <QtGui/qwindow.h>
+#include <QtGui/private/qguiapplication_p.h>
+#include <qpa/qplatformtheme.h>
+
+#include "qiosglobal.h"
+#include "quiview.h"
+#include "qiosmessagedialog.h"
+
+QIOSMessageDialog::QIOSMessageDialog()
+ : m_alertController(Q_NULLPTR)
+{
+}
+
+QIOSMessageDialog::~QIOSMessageDialog()
+{
+ hide();
+}
+
+inline QString QIOSMessageDialog::messageTextPlain()
+{
+ // Concatenate text fragments, and remove HTML tags
+ const QSharedPointer<QMessageDialogOptions> &opt = options();
+ const QString &lineShift = QStringLiteral("\n\n");
+ const QString &informativeText = opt->informativeText();
+ const QString &detailedText = opt->detailedText();
+
+ QString text = opt->text();
+ if (!informativeText.isEmpty())
+ text += lineShift + informativeText;
+ if (!detailedText.isEmpty())
+ text += lineShift + detailedText;
+
+ text.replace(QLatin1String("<p>"), QStringLiteral("\n"), Qt::CaseInsensitive);
+ text.remove(QRegularExpression(QStringLiteral("<[^>]*>")));
+
+ return text;
+}
+
+inline UIAlertAction *QIOSMessageDialog::createAction(StandardButton button)
+{
+ const StandardButton labelButton = button == NoButton ? Ok : button;
+ const QString &standardLabel = QGuiApplicationPrivate::platformTheme()->standardButtonText(labelButton);
+ const QString &label = QPlatformTheme::removeMnemonics(standardLabel);
+
+ UIAlertActionStyle style = UIAlertActionStyleDefault;
+ if (button == Cancel)
+ style = UIAlertActionStyleCancel;
+ else if (button == Discard)
+ style = UIAlertActionStyleDestructive;
+
+ return [UIAlertAction actionWithTitle:label.toNSString() style:style handler:^(UIAlertAction *) {
+ hide();
+ if (button == NoButton)
+ emit reject();
+ else
+ emit clicked(button, buttonRole(button));
+ }];
+}
+
+void QIOSMessageDialog::exec()
+{
+ m_eventLoop.exec(QEventLoop::DialogExec);
+}
+
+bool QIOSMessageDialog::show(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent)
+{
+ Q_UNUSED(windowFlags);
+ if (m_alertController // Ensure that the dialog is not showing already
+ || !options() // Some message dialogs don't have options (QErrorMessage)
+ || windowModality != Qt::ApplicationModal // We can only do app modal dialogs
+ || QSysInfo::MacintoshVersion < QSysInfo::MV_IOS_8_0) // API limitation
+ return false;
+
+ m_alertController = [[UIAlertController
+ alertControllerWithTitle:options()->windowTitle().toNSString()
+ message:messageTextPlain().toNSString()
+ preferredStyle:UIAlertControllerStyleAlert] retain];
+
+ if (StandardButtons buttons = options()->standardButtons()) {
+ for (int i = FirstButton; i < LastButton; i<<=1) {
+ if (i & buttons)
+ [m_alertController addAction:createAction(StandardButton(i))];
+ }
+ } else {
+ // We need at least one button to allow the user close the dialog
+ [m_alertController addAction:createAction(NoButton)];
+ }
+
+ UIWindow *window = parent ? reinterpret_cast<UIView *>(parent->winId()).window : [UIApplication sharedApplication].keyWindow;
+ [window.rootViewController presentViewController:m_alertController animated:YES completion:nil];
+ return true;
+}
+
+void QIOSMessageDialog::hide()
+{
+ m_eventLoop.exit();
+ [m_alertController dismissViewControllerAnimated:YES completion:nil];
+ [m_alertController release];
+ m_alertController = Q_NULLPTR;
+}
diff --git a/src/plugins/platforms/ios/qiostheme.mm b/src/plugins/platforms/ios/qiostheme.mm
index bc40069670..dccacb2c0e 100644
--- a/src/plugins/platforms/ios/qiostheme.mm
+++ b/src/plugins/platforms/ios/qiostheme.mm
@@ -47,6 +47,7 @@
#include "qiosmenu.h"
#include "qiosfiledialog.h"
+#include "qiosmessagedialog.h"
QT_BEGIN_NAMESPACE
@@ -85,6 +86,7 @@ bool QIOSTheme::usePlatformNativeDialog(QPlatformTheme::DialogType type) const
{
switch (type) {
case FileDialog:
+ case MessageDialog:
return true;
default:
return false;
@@ -97,6 +99,9 @@ QPlatformDialogHelper *QIOSTheme::createPlatformDialogHelper(QPlatformTheme::Dia
case FileDialog:
return new QIOSFileDialog();
break;
+ case MessageDialog:
+ return new QIOSMessageDialog();
+ break;
default:
return 0;
}
diff --git a/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp b/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp
index 91708c0a47..45f66db75d 100644
--- a/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp
+++ b/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp
@@ -34,6 +34,7 @@
#include "qlinuxfbscreen.h"
#include <QtPlatformSupport/private/qfbcursor_p.h>
#include <QtPlatformSupport/private/qfbwindow_p.h>
+#include <QtCore/QFile>
#include <QtCore/QRegularExpression>
#include <QtGui/QPainter>
diff --git a/src/plugins/platforms/minimalegl/qminimaleglscreen.cpp b/src/plugins/platforms/minimalegl/qminimaleglscreen.cpp
index 59062338cb..093a1c689c 100644
--- a/src/plugins/platforms/minimalegl/qminimaleglscreen.cpp
+++ b/src/plugins/platforms/minimalegl/qminimaleglscreen.cpp
@@ -74,19 +74,19 @@ QMinimalEglScreen::QMinimalEglScreen(EGLNativeDisplayType display)
EGLint major, minor;
- if (!eglBindAPI(EGL_OPENGL_ES_API)) {
+ if (Q_UNLIKELY(!eglBindAPI(EGL_OPENGL_ES_API))) {
qWarning("Could not bind GL_ES API\n");
qFatal("EGL error");
}
m_dpy = eglGetDisplay(display);
- if (m_dpy == EGL_NO_DISPLAY) {
+ if (Q_UNLIKELY(m_dpy == EGL_NO_DISPLAY)) {
qWarning("Could not open egl display\n");
qFatal("EGL error");
}
qWarning("Opened display %p\n", m_dpy);
- if (!eglInitialize(m_dpy, &major, &minor)) {
+ if (Q_UNLIKELY(!eglInitialize(m_dpy, &major, &minor))) {
qWarning("Could not initialize egl display\n");
qFatal("EGL error");
}
@@ -135,9 +135,9 @@ void QMinimalEglScreen::createAndSetPlatformContext()
EGLNativeWindowType eglWindow = 0;
#ifdef Q_OPENKODE
- if (kdInitializeNV() == KD_ENOTINITIALIZED) {
+ if (Q_UNLIKELY(kdInitializeNV() == KD_ENOTINITIALIZED))
qFatal("Did not manage to initialize openkode");
- }
+
KDWindow *window = kdCreateWindow(m_dpy,config,0);
kdRealizeWindow(window,&eglWindow);
@@ -148,7 +148,7 @@ void QMinimalEglScreen::createAndSetPlatformContext()
#endif
m_surface = eglCreateWindowSurface(m_dpy, config, eglWindow, NULL);
- if (m_surface == EGL_NO_SURFACE) {
+ if (Q_UNLIKELY(m_surface == EGL_NO_SURFACE)) {
qWarning("Could not create the egl surface: error = 0x%x\n", eglGetError());
eglTerminate(m_dpy);
qFatal("EGL error");
diff --git a/src/plugins/platforms/mirclient/qmirclientclipboard.cpp b/src/plugins/platforms/mirclient/qmirclientclipboard.cpp
index aa2ddf2103..4494847b54 100644
--- a/src/plugins/platforms/mirclient/qmirclientclipboard.cpp
+++ b/src/plugins/platforms/mirclient/qmirclientclipboard.cpp
@@ -100,7 +100,7 @@ void QMirClientClipboard::onDBusClipboardGetContentsFinished(QDBusPendingCallWat
Q_ASSERT(call == mPendingGetContentsCall.data());
QDBusPendingReply<QByteArray> reply = *call;
- if (reply.isError()) {
+ if (Q_UNLIKELY(reply.isError())) {
qCritical("QMirClientClipboard - Failed to get system clipboard contents via D-Bus. %s, %s",
qPrintable(reply.error().name()), qPrintable(reply.error().message()));
// TODO: Might try again later a number of times...
@@ -114,7 +114,7 @@ void QMirClientClipboard::onDBusClipboardGetContentsFinished(QDBusPendingCallWat
void QMirClientClipboard::onDBusClipboardSetContentsFinished(QDBusPendingCallWatcher *call)
{
QDBusPendingReply<void> reply = *call;
- if (reply.isError()) {
+ if (Q_UNLIKELY(reply.isError())) {
qCritical("QMirClientClipboard - Failed to set the system clipboard contents via D-Bus. %s, %s",
qPrintable(reply.error().name()), qPrintable(reply.error().message()));
// TODO: Might try again later a number of times...
@@ -148,9 +148,8 @@ void QMirClientClipboard::setupDBus()
"com.canonical.QtMir.Clipboard",
"ContentsChanged",
this, SLOT(updateMimeData(QByteArray)));
- if (!ok) {
+ if (Q_UNLIKELY(!ok))
qCritical("QMirClientClipboard - Failed to connect to ContentsChanged signal form the D-Bus system clipboard.");
- }
mDBusClipboard = new QDBusInterface("com.canonical.QtMir",
"/com/canonical/QtMir/Clipboard",
diff --git a/src/plugins/platforms/mirclient/qmirclientglcontext.cpp b/src/plugins/platforms/mirclient/qmirclientglcontext.cpp
index bfba5051e5..bbd7f5ee75 100644
--- a/src/plugins/platforms/mirclient/qmirclientglcontext.cpp
+++ b/src/plugins/platforms/mirclient/qmirclientglcontext.cpp
@@ -39,6 +39,7 @@
#include "qmirclientwindow.h"
#include "qmirclientlogging.h"
#include <QtPlatformSupport/private/qeglconvenience_p.h>
+#include <QtGui/private/qopenglcontext_p.h>
#if !defined(QT_NO_DEBUG)
static void printOpenGLESConfig() {
@@ -103,6 +104,15 @@ bool QMirClientOpenGLContext::makeCurrent(QPlatformSurface* surface)
ASSERT(eglMakeCurrent(mEglDisplay, eglSurface, eglSurface, mEglContext) == EGL_TRUE);
printOpenGLESConfig();
#endif
+
+ // When running on the emulator, shaders will be compiled using a thin wrapper around the desktop drivers.
+ // These wrappers might not support the precision qualifiers, so set the workaround flag to true.
+ const char *rendererString = reinterpret_cast<const char *>(glGetString(GL_RENDERER));
+ if (rendererString != 0 && qstrncmp(rendererString, "Android Emulator", 16) == 0) {
+ QOpenGLContextPrivate *ctx_d = QOpenGLContextPrivate::get(context());
+ ctx_d->workaround_missingPrecisionQualifiers = true;
+ }
+
return true;
}
diff --git a/src/plugins/platforms/mirclient/qmirclientintegration.cpp b/src/plugins/platforms/mirclient/qmirclientintegration.cpp
index a234f4eac6..87d2002c56 100644
--- a/src/plugins/platforms/mirclient/qmirclientintegration.cpp
+++ b/src/plugins/platforms/mirclient/qmirclientintegration.cpp
@@ -95,7 +95,7 @@ QMirClientClientIntegration::QMirClientClientIntegration()
// Create new application instance
mInstance = u_application_instance_new_from_description_with_options(mDesc, mOptions);
- if (mInstance == nullptr)
+ if (Q_UNLIKELY(!mInstance))
qFatal("QMirClientClientIntegration: connection to Mir server failed. Check that a Mir server is\n"
"running, and the correct socket is being used and is accessible. The shell may have\n"
"rejected the incoming connection, so check its log file");
diff --git a/src/plugins/platforms/offscreen/qoffscreenintegration_x11.cpp b/src/plugins/platforms/offscreen/qoffscreenintegration_x11.cpp
index eb704f2dfa..dfaaa43c1d 100644
--- a/src/plugins/platforms/offscreen/qoffscreenintegration_x11.cpp
+++ b/src/plugins/platforms/offscreen/qoffscreenintegration_x11.cpp
@@ -143,7 +143,7 @@ static Window createDummyWindow(QOffscreenX11Info *x11, XVisualInfo *visualInfo)
static Window createDummyWindow(QOffscreenX11Info *x11, GLXFBConfig config)
{
XVisualInfo *visualInfo = glXGetVisualFromFBConfig(x11->display(), config);
- if (!visualInfo)
+ if (Q_UNLIKELY(!visualInfo))
qFatal("Could not initialize GLX");
Window window = createDummyWindow(x11, visualInfo);
XFree(visualInfo);
@@ -177,7 +177,7 @@ QOffscreenX11GLXContext::QOffscreenX11GLXContext(QOffscreenX11Info *x11, QOpenGL
d->window = createDummyWindow(x11, config);
} else {
XVisualInfo *visualInfo = qglx_findVisualInfo(x11->display(), 0, &d->format);
- if (!visualInfo)
+ if (Q_UNLIKELY(!visualInfo))
qFatal("Could not initialize GLX");
d->context = glXCreateContext(x11->display(), visualInfo, d->shareContext, true);
if (!d->context && d->shareContext) {
diff --git a/src/plugins/platforms/openwfd/qopenwfdport.cpp b/src/plugins/platforms/openwfd/qopenwfdport.cpp
index 8da1e9bd34..c1646fbdf9 100644
--- a/src/plugins/platforms/openwfd/qopenwfdport.cpp
+++ b/src/plugins/platforms/openwfd/qopenwfdport.cpp
@@ -96,9 +96,8 @@ void QOpenWFDPort::attach()
mPhysicalSize = QSizeF(physicalWFDSize[0],physicalWFDSize[1]);
WFDint numAvailablePipelines = wfdGetPortAttribi(mDevice->handle(),mPort,WFD_PORT_PIPELINE_ID_COUNT);
- if (!numAvailablePipelines) {
+ if (Q_UNLIKELY(!numAvailablePipelines))
qFatal("Not possible to make screen that is not possible to create WFPort with no pipline");
- }
WFDint pipeIds[numAvailablePipelines];
wfdGetPortAttribiv(mDevice->handle(),mPort,WFD_PORT_BINDABLE_PIPELINE_IDS,numAvailablePipelines,pipeIds);
@@ -109,9 +108,9 @@ void QOpenWFDPort::attach()
mDevice-> addToUsedPipelineSet(mPipelineId,this);
mPipeline = wfdCreatePipeline(mDevice->handle(),mPipelineId,WFD_NONE);
- if (mPipeline == WFD_INVALID_HANDLE) {
+ if (Q_UNLIKELY(mPipeline == WFD_INVALID_HANDLE))
qFatal("Failed to create pipeline for port %p", this);
- }
+
break;
}
}
diff --git a/src/plugins/platforms/qnx/qblackberrytheme.cpp b/src/plugins/platforms/qnx/qblackberrytheme.cpp
deleted file mode 100644
index f75e8f3766..0000000000
--- a/src/plugins/platforms/qnx/qblackberrytheme.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2012 Research In Motion
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qblackberrytheme.h"
-
-#include "qqnxfiledialoghelper.h"
-#include "qqnxsystemsettings.h"
-#include "qqnxintegration.h"
-
-QT_BEGIN_NAMESPACE
-
-QBlackberryTheme::QBlackberryTheme(const QQnxIntegration *integration) : m_integration(integration)
-{
- // Set the dark theme as default palette
- QColor color = QColor(211, 211, 211);
- m_defaultPalette.setBrush(QPalette::ButtonText, color);
- m_defaultPalette.setBrush(QPalette::WindowText, color);
- m_defaultPalette.setBrush(QPalette::Text, color);
-
- color.setAlpha(179);
- m_defaultPalette.setBrush(QPalette::Disabled, QPalette::ButtonText, color);
- m_defaultPalette.setBrush(QPalette::Disabled, QPalette::WindowText, color);
- m_defaultPalette.setBrush(QPalette::Disabled, QPalette::Text, color);
-
- color.setRgb(18, 18, 18);
- m_defaultPalette.setColor(QPalette::Window, color);
- m_defaultPalette.setColor(QPalette::Base, color);
- m_defaultPalette.setColor(QPalette::AlternateBase, QColor(50, 50, 50));
- m_defaultPalette.setColor(QPalette::Button, color);
-
- m_defaultPalette.setBrush(QPalette::Highlight, QColor(0, 168, 223));
- m_defaultPalette.setBrush(QPalette::HighlightedText, QColor(250, 250,250));
-}
-
-QBlackberryTheme::~QBlackberryTheme()
-{
- qDeleteAll(m_fonts);
-}
-
-bool QBlackberryTheme::usePlatformNativeDialog(DialogType type) const
-{
- if (type == QPlatformTheme::FileDialog)
- return true;
-#if !defined(QT_NO_COLORDIALOG)
- if (type == QPlatformTheme::ColorDialog)
- return false;
-#endif
-#if !defined(QT_NO_FONTDIALOG)
- if (type == QPlatformTheme::FontDialog)
- return false;
-#endif
- return false;
-}
-
-QPlatformDialogHelper *QBlackberryTheme::createPlatformDialogHelper(DialogType type) const
-{
- switch (type) {
- case QPlatformTheme::FileDialog:
- return new QQnxFileDialogHelper(m_integration);
-#if !defined(QT_NO_COLORDIALOG)
- case QPlatformTheme::ColorDialog:
-#endif
-#if !defined(QT_NO_FONTDIALOG)
- case QPlatformTheme::FontDialog:
-#endif
- default:
- return 0;
- }
-}
-
-const QFont *QBlackberryTheme::font(Font type) const
-{
- QPlatformFontDatabase *fontDatabase = m_integration->fontDatabase();
-
- if (fontDatabase && m_fonts.isEmpty())
- m_fonts = qt_qnx_createRoleFonts(fontDatabase);
- return m_fonts.value(type, 0);
-}
-
-const QPalette *QBlackberryTheme::palette(Palette type) const
-{
- // Return the default palette
- if (type == SystemPalette)
- return &m_defaultPalette;
-
- return QPlatformTheme::palette(type);
-}
-
-QT_END_NAMESPACE
diff --git a/src/plugins/platforms/qnx/qblackberrytheme.h b/src/plugins/platforms/qnx/qblackberrytheme.h
deleted file mode 100644
index bcef4e5ef4..0000000000
--- a/src/plugins/platforms/qnx/qblackberrytheme.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2012 Research In Motion
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QBLACKBERRYTHEME_H
-#define QBLACKBERRYTHEME_H
-
-#include <qpa/qplatformtheme.h>
-
-#include <QtGui/qfont.h>
-
-#include <QtCore/qhash.h>
-#include <QtCore/qstring.h>
-
-#include <QtGui/QPalette>
-
-QT_BEGIN_NAMESPACE
-
-class QQnxIntegration;
-
-class QBlackberryTheme : public QPlatformTheme
-{
-public:
- explicit QBlackberryTheme(const QQnxIntegration *);
- ~QBlackberryTheme();
-
- static QString name() { return QStringLiteral("blackberry"); }
-
- bool usePlatformNativeDialog(DialogType type) const;
- QPlatformDialogHelper *createPlatformDialogHelper(DialogType type) const;
-
- const QFont *font(Font type = SystemFont) const;
-
- const QPalette *palette(Palette type = SystemPalette) const;
-
-private:
- mutable QHash<QPlatformTheme::Font, QFont*> m_fonts;
- const QQnxIntegration *m_integration;
- QPalette m_defaultPalette;
-};
-
-QT_END_NAMESPACE
-
-#endif // QBLACKBERRYTHEME_H
diff --git a/src/plugins/platforms/qnx/qnx.pro b/src/plugins/platforms/qnx/qnx.pro
index 95a8e44cb8..5a0f4f5c98 100644
--- a/src/plugins/platforms/qnx/qnx.pro
+++ b/src/plugins/platforms/qnx/qnx.pro
@@ -5,10 +5,9 @@ QT += platformsupport-private core-private gui-private
# Uncomment this to build with support for IMF once it becomes available in the BBNDK
#CONFIG += qqnx_imf
-!blackberry:CONFIG += qqnx_screeneventthread
+CONFIG += qqnx_screeneventthread
# Uncomment these to enable debugging output for various aspects of the plugin
-#DEFINES += QQNXBPSEVENTFILTER_DEBUG
#DEFINES += QQNXBUFFER_DEBUG
#DEFINES += QQNXBUTTON_DEBUG
#DEFINES += QQNXCLIPBOARD_DEBUG
@@ -86,52 +85,20 @@ contains(QT_CONFIG, opengles2) {
LIBS += -lEGL
}
-CONFIG(blackberry) {
- SOURCES += qqnxnavigatorbps.cpp \
- qqnxeventdispatcher_blackberry.cpp \
- qqnxbpseventfilter.cpp \
- qqnxvirtualkeyboardbps.cpp \
- qblackberrytheme.cpp \
- qqnxsystemsettings.cpp
-
- HEADERS += qqnxnavigatorbps.h \
- qqnxeventdispatcher_blackberry.h \
- qqnxbpseventfilter.h \
- qqnxvirtualkeyboardbps.h \
- qblackberrytheme.h \
- qqnxsystemsettings.h \
- qqnxfiledialoghelper.h
-
- LIBS += -lbps
-}
-
-CONFIG(blackberry) {
- SOURCES += qqnxfiledialoghelper_bb10.cpp \
- qqnxfilepicker.cpp \
- qqnxnavigatorcover.cpp
-
- HEADERS += qqnxfilepicker.h \
- qqnxnavigatorcover.h
-}
-
CONFIG(qqnx_pps) {
DEFINES += QQNX_PPS
SOURCES += qqnxclipboard.cpp \
- qqnxbuttoneventnotifier.cpp
+ qqnxbuttoneventnotifier.cpp \
+ qqnxnavigatorpps.cpp \
+ qqnxnavigatoreventnotifier.cpp \
+ qqnxvirtualkeyboardpps.cpp
HEADERS += qqnxclipboard.h \
- qqnxbuttoneventnotifier.h
-
- !blackberry {
- SOURCES += qqnxnavigatorpps.cpp \
- qqnxnavigatoreventnotifier.cpp \
- qqnxvirtualkeyboardpps.cpp
-
- HEADERS += qqnxnavigatorpps.h \
- qqnxnavigatoreventnotifier.h \
- qqnxvirtualkeyboardpps.h
- }
+ qqnxbuttoneventnotifier.h \
+ qqnxnavigatorpps.h \
+ qqnxnavigatoreventnotifier.h \
+ qqnxvirtualkeyboardpps.h
LIBS += -lpps
!contains(DEFINES, QT_NO_CLIPBOARD): LIBS += -lclipboard
diff --git a/src/plugins/platforms/qnx/qqnxbpseventfilter.cpp b/src/plugins/platforms/qnx/qqnxbpseventfilter.cpp
deleted file mode 100644
index 66843283b6..0000000000
--- a/src/plugins/platforms/qnx/qqnxbpseventfilter.cpp
+++ /dev/null
@@ -1,229 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2012 Research In Motion
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qqnxbpseventfilter.h"
-#include "qqnxnavigatoreventhandler.h"
-#include "qqnxscreen.h"
-#include "qqnxscreeneventhandler.h"
-#include "qqnxvirtualkeyboardbps.h"
-#include "qqnxfiledialoghelper.h"
-
-#include <QCoreApplication>
-#include <QAbstractEventDispatcher>
-#include <QDebug>
-
-#include <bps/event.h>
-#include <bps/navigator.h>
-#include <bps/screen.h>
-
-#if defined(QQNXBPSEVENTFILTER_DEBUG)
-#define qBpsEventFilterDebug qDebug
-#else
-#define qBpsEventFilterDebug QT_NO_QDEBUG_MACRO
-#endif
-
-QT_BEGIN_NAMESPACE
-
-static QQnxBpsEventFilter *s_instance = 0;
-
-QQnxBpsEventFilter::QQnxBpsEventFilter(QQnxNavigatorEventHandler *navigatorEventHandler,
- QQnxScreenEventHandler *screenEventHandler,
- QQnxVirtualKeyboardBps *virtualKeyboard, QObject *parent)
- : QObject(parent)
- , m_navigatorEventHandler(navigatorEventHandler)
- , m_screenEventHandler(screenEventHandler)
- , m_virtualKeyboard(virtualKeyboard)
-{
- Q_ASSERT(s_instance == 0);
-
- s_instance = this;
-}
-
-QQnxBpsEventFilter::~QQnxBpsEventFilter()
-{
- Q_ASSERT(s_instance == this);
-
- s_instance = 0;
-}
-
-void QQnxBpsEventFilter::installOnEventDispatcher(QAbstractEventDispatcher *dispatcher)
-{
- qBpsEventFilterDebug() << "dispatcher=" << dispatcher;
-
- if (navigator_request_events(NAVIGATOR_EXTENDED_DATA) != BPS_SUCCESS)
- qWarning("QQNX: failed to register for navigator events");
-
- dispatcher->installNativeEventFilter(this);
-}
-
-void QQnxBpsEventFilter::registerForScreenEvents(QQnxScreen *screen)
-{
- if (!m_screenEventHandler) {
- qWarning("QQNX: trying to register for screen events, but no handler provided.");
- return;
- }
-
- int attached;
- if (screen_get_display_property_iv(screen->nativeDisplay(), SCREEN_PROPERTY_ATTACHED, &attached) != BPS_SUCCESS) {
- qWarning() << "QQNX: unable to query display attachment";
- return;
- }
-
- if (!attached) {
- qBpsEventFilterDebug() << "skipping event registration for non-attached screen";
- return;
- }
-
- if (screen_request_events(screen->nativeContext()) != BPS_SUCCESS)
- qWarning("QQNX: failed to register for screen events on screen %p", screen->nativeContext());
-}
-
-void QQnxBpsEventFilter::unregisterForScreenEvents(QQnxScreen *screen)
-{
- if (!m_screenEventHandler) {
- qWarning("QQNX: trying to unregister for screen events, but no handler provided.");
- return;
- }
-
- if (screen_stop_events(screen->nativeContext()) != BPS_SUCCESS)
- qWarning("QQNX: failed to unregister for screen events on screen %p", screen->nativeContext());
-}
-
-bool QQnxBpsEventFilter::nativeEventFilter(const QByteArray &eventType, void *message, long *result)
-{
- Q_UNUSED(eventType);
- Q_UNUSED(result);
- bps_event_t *event = static_cast<bps_event_t *>(message);
- const int eventDomain = bps_event_get_domain(event);
- qBpsEventFilterDebug() << "event=" << event << "domain=" << eventDomain;
-
- if (eventDomain == screen_get_domain()) {
- if (!m_screenEventHandler) {
- qWarning("QQNX: registered for screen events, but no handler provided.");
- return false;
- }
-
- screen_event_t screenEvent = screen_event_get_event(event);
- return m_screenEventHandler->handleEvent(screenEvent);
- }
-
- if (eventDomain == navigator_get_domain())
- return handleNavigatorEvent(event);
-
- if (m_virtualKeyboard->handleEvent(event))
- return true;
-
- return false;
-}
-
-bool QQnxBpsEventFilter::handleNavigatorEvent(bps_event_t *event)
-{
- switch (bps_event_get_code(event)) {
- case NAVIGATOR_ORIENTATION_CHECK: {
- const int angle = navigator_event_get_orientation_angle(event);
- qBpsEventFilterDebug() << "ORIENTATION CHECK event. angle=" << angle;
-
- const bool result = m_navigatorEventHandler->handleOrientationCheck(angle);
- qBpsEventFilterDebug() << "ORIENTATION CHECK event. result=" << result;
-
- // reply to navigator whether orientation is acceptable
- navigator_orientation_check_response(event, result);
- break;
- }
-
- case NAVIGATOR_ORIENTATION: {
- const int angle = navigator_event_get_orientation_angle(event);
- qBpsEventFilterDebug() << "ORIENTATION event. angle=" << angle;
- m_navigatorEventHandler->handleOrientationChange(angle);
-
- navigator_done_orientation(event);
- break;
- }
-
- case NAVIGATOR_SWIPE_DOWN:
- qBpsEventFilterDebug("SWIPE DOWN event");
- m_navigatorEventHandler->handleSwipeDown();
- break;
-
- case NAVIGATOR_EXIT:
- qBpsEventFilterDebug("EXIT event");
- m_navigatorEventHandler->handleExit();
- break;
-
- case NAVIGATOR_WINDOW_STATE: {
- qBpsEventFilterDebug("WINDOW STATE event");
- const navigator_window_state_t state = navigator_event_get_window_state(event);
- const QByteArray id(navigator_event_get_groupid(event));
-
- switch (state) {
- case NAVIGATOR_WINDOW_FULLSCREEN:
- m_navigatorEventHandler->handleWindowGroupStateChanged(id, Qt::WindowFullScreen);
- break;
- case NAVIGATOR_WINDOW_THUMBNAIL:
- m_navigatorEventHandler->handleWindowGroupStateChanged(id, Qt::WindowMinimized);
- break;
- case NAVIGATOR_WINDOW_INVISIBLE:
- break;
- }
-
- break;
- }
-
- case NAVIGATOR_WINDOW_ACTIVE: {
- qBpsEventFilterDebug("WINDOW ACTIVE event");
- const QByteArray id(navigator_event_get_groupid(event));
- m_navigatorEventHandler->handleWindowGroupActivated(id);
- break;
- }
-
- case NAVIGATOR_WINDOW_INACTIVE: {
- qBpsEventFilterDebug("WINDOW INACTIVE event");
- const QByteArray id(navigator_event_get_groupid(event));
- m_navigatorEventHandler->handleWindowGroupDeactivated(id);
- break;
- }
-
- case NAVIGATOR_LOW_MEMORY:
- qWarning() << "QGuiApplication based process" << QCoreApplication::applicationPid()
- << "received \"NAVIGATOR_LOW_MEMORY\" event";
- return false;
-
- default:
- qBpsEventFilterDebug() << "Unhandled navigator event. code=" << bps_event_get_code(event);
- return false;
- }
-
- return true;
-}
-
-QT_END_NAMESPACE
diff --git a/src/plugins/platforms/qnx/qqnxbpseventfilter.h b/src/plugins/platforms/qnx/qqnxbpseventfilter.h
deleted file mode 100644
index f1d67848e8..0000000000
--- a/src/plugins/platforms/qnx/qqnxbpseventfilter.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2012 Research In Motion
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQNXBPSEVENTFILTER_H
-#define QQNXBPSEVENTFILTER_H
-
-#include <QObject>
-#include <QHash>
-#include <QAbstractNativeEventFilter>
-
-#include <bps/dialog.h>
-
-struct bps_event_t;
-
-QT_BEGIN_NAMESPACE
-
-class QAbstractEventDispatcher;
-class QQnxNavigatorEventHandler;
-class QQnxFileDialogHelper;
-class QQnxScreen;
-class QQnxScreenEventHandler;
-class QQnxVirtualKeyboardBps;
-
-class QQnxBpsEventFilter : public QObject, public QAbstractNativeEventFilter
-{
- Q_OBJECT
-public:
- QQnxBpsEventFilter(QQnxNavigatorEventHandler *navigatorEventHandler,
- QQnxScreenEventHandler *screenEventHandler,
- QQnxVirtualKeyboardBps *virtualKeyboard, QObject *parent = 0);
- ~QQnxBpsEventFilter();
-
- void installOnEventDispatcher(QAbstractEventDispatcher *dispatcher);
-
- void registerForScreenEvents(QQnxScreen *screen);
- void unregisterForScreenEvents(QQnxScreen *screen);
-
-private:
- bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) Q_DECL_OVERRIDE;
-
- bool handleNavigatorEvent(bps_event_t *event);
-
-private:
- QQnxNavigatorEventHandler *m_navigatorEventHandler;
- QQnxScreenEventHandler *m_screenEventHandler;
- QQnxVirtualKeyboardBps *m_virtualKeyboard;
- QHash<dialog_instance_t, QQnxFileDialogHelper*> m_dialogMapper;
-};
-
-QT_END_NAMESPACE
-
-#endif // QQNXBPSEVENTFILTER_H
diff --git a/src/plugins/platforms/qnx/qqnxbuffer.cpp b/src/plugins/platforms/qnx/qqnxbuffer.cpp
index 7ee6664676..5d838ac189 100644
--- a/src/plugins/platforms/qnx/qqnxbuffer.cpp
+++ b/src/plugins/platforms/qnx/qqnxbuffer.cpp
@@ -76,7 +76,7 @@ QQnxBuffer::QQnxBuffer(screen_buffer_t buffer)
screen_get_buffer_property_pv(buffer, SCREEN_PROPERTY_POINTER, (void **)&dataPtr),
"Failed to query buffer pointer");
- if (dataPtr == 0)
+ if (Q_UNLIKELY(!dataPtr))
qFatal("QQNX: buffer pointer is NULL, errno=%d", errno);
// Get format of buffer
@@ -131,13 +131,13 @@ void QQnxBuffer::invalidateInCache()
qBufferDebug();
// Verify native buffer exists
- if (m_buffer == 0)
+ if (Q_UNLIKELY(!m_buffer))
qFatal("QQNX: can't invalidate cache for null buffer");
// Evict buffer's data from cache
errno = 0;
int result = msync(m_image.bits(), m_image.height() * m_image.bytesPerLine(), MS_INVALIDATE | MS_CACHE_ONLY);
- if (result != 0)
+ if (Q_UNLIKELY(result != 0))
qFatal("QQNX: failed to invalidate cache, errno=%d", errno);
}
diff --git a/src/plugins/platforms/qnx/qqnxbuttoneventnotifier.cpp b/src/plugins/platforms/qnx/qqnxbuttoneventnotifier.cpp
index 614bfc381f..ec30e79ab5 100644
--- a/src/plugins/platforms/qnx/qqnxbuttoneventnotifier.cpp
+++ b/src/plugins/platforms/qnx/qqnxbuttoneventnotifier.cpp
@@ -82,7 +82,7 @@ void QQnxButtonEventNotifier::start()
errno = 0;
m_fd = qt_safe_open(ppsPath, O_RDONLY);
if (m_fd == -1) {
-#if defined(Q_OS_BLACKBERRY) || defined (QQNXBUTTON_DEBUG)
+#if defined (QQNXBUTTON_DEBUG)
qWarning("QQNX: failed to open buttons pps, errno=%d", errno);
#endif
return;
diff --git a/src/plugins/platforms/qnx/qqnxeglwindow.cpp b/src/plugins/platforms/qnx/qqnxeglwindow.cpp
index 00eaf2bf03..5f80b39fe6 100644
--- a/src/plugins/platforms/qnx/qqnxeglwindow.cpp
+++ b/src/plugins/platforms/qnx/qqnxeglwindow.cpp
@@ -59,7 +59,7 @@ QQnxEglWindow::QQnxEglWindow(QWindow *window, screen_context_t context, bool nee
// Set window usage
const int val = SCREEN_USAGE_OPENGL_ES2;
const int result = screen_set_window_property_iv(nativeHandle(), SCREEN_PROPERTY_USAGE, &val);
- if (result != 0)
+ if (Q_UNLIKELY(result != 0))
qFatal("QQnxEglWindow: failed to set window alpha usage, errno=%d", errno);
m_requestedBufferSize = shouldMakeFullScreen() ? screen()->geometry().size() : window->geometry().size();
@@ -106,7 +106,7 @@ void QQnxEglWindow::destroyEGLSurface()
// Destroy EGL surface if it exists
if (m_eglSurface != EGL_NO_SURFACE) {
EGLBoolean eglResult = eglDestroySurface(platformOpenGLContext()->getEglDisplay(), m_eglSurface);
- if (eglResult != EGL_TRUE)
+ if (Q_UNLIKELY(eglResult != EGL_TRUE))
qFatal("QQNX: failed to destroy EGL surface, err=%d", eglGetError());
}
@@ -118,12 +118,12 @@ void QQnxEglWindow::swapEGLBuffers()
qEglWindowDebug();
// Set current rendering API
EGLBoolean eglResult = eglBindAPI(EGL_OPENGL_ES_API);
- if (eglResult != EGL_TRUE)
+ if (Q_UNLIKELY(eglResult != EGL_TRUE))
qFatal("QQNX: failed to set EGL API, err=%d", eglGetError());
// Post EGL surface to window
eglResult = eglSwapBuffers(m_platformOpenGLContext->getEglDisplay(), m_eglSurface);
- if (eglResult != EGL_TRUE)
+ if (Q_UNLIKELY(eglResult != EGL_TRUE))
qFatal("QQNX: failed to swap EGL buffers, err=%d", eglGetError());
windowPosted();
@@ -178,15 +178,15 @@ int QQnxEglWindow::pixelFormat() const
const QSurfaceFormat format = m_platformOpenGLContext->format();
// Extract size of color channels from window format
const int redSize = format.redBufferSize();
- if (redSize == -1)
+ if (Q_UNLIKELY(redSize == -1))
qFatal("QQnxWindow: red size not defined");
const int greenSize = format.greenBufferSize();
- if (greenSize == -1)
+ if (Q_UNLIKELY(greenSize == -1))
qFatal("QQnxWindow: green size not defined");
const int blueSize = format.blueBufferSize();
- if (blueSize == -1)
+ if (Q_UNLIKELY(blueSize == -1))
qFatal("QQnxWindow: blue size not defined");
// select matching native format
diff --git a/src/plugins/platforms/qnx/qqnxeventdispatcher_blackberry.cpp b/src/plugins/platforms/qnx/qqnxeventdispatcher_blackberry.cpp
deleted file mode 100644
index 30596fe08f..0000000000
--- a/src/plugins/platforms/qnx/qqnxeventdispatcher_blackberry.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2012 Research In Motion
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qqnxeventdispatcher_blackberry.h"
-
-#include <qpa/qwindowsysteminterface.h>
-#include <private/qguiapplication_p.h>
-
-QT_BEGIN_NAMESPACE
-
-
-QQnxEventDispatcherBlackberry::QQnxEventDispatcherBlackberry(QObject *parent)
- : QEventDispatcherBlackberry(parent)
-{
-}
-
-QQnxEventDispatcherBlackberry::~QQnxEventDispatcherBlackberry()
-{
-}
-
-bool QQnxEventDispatcherBlackberry::processEvents(QEventLoop::ProcessEventsFlags flags)
-{
- const bool didSendEvents = QEventDispatcherBlackberry::processEvents(flags);
- return QWindowSystemInterface::sendWindowSystemEvents(flags) || didSendEvents;
-}
-
-bool QQnxEventDispatcherBlackberry::hasPendingEvents()
-{
- return QEventDispatcherBlackberry::hasPendingEvents() || QWindowSystemInterface::windowSystemEventsQueued();
-}
-
-void QQnxEventDispatcherBlackberry::flush()
-{
- if (qApp)
- qApp->sendPostedEvents();
-}
-
-QT_END_NAMESPACE
diff --git a/src/plugins/platforms/qnx/qqnxeventdispatcher_blackberry.h b/src/plugins/platforms/qnx/qqnxeventdispatcher_blackberry.h
deleted file mode 100644
index 036bf126ab..0000000000
--- a/src/plugins/platforms/qnx/qqnxeventdispatcher_blackberry.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2012 Research In Motion
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQNXEVENTDISPATCHER_BLACKBERRY_H
-#define QQNXEVENTDISPATCHER_BLACKBERRY_H
-
-#include <qglobal.h>
-#include <private/qeventdispatcher_blackberry_p.h>
-
-QT_BEGIN_NAMESPACE
-
-class QQnxEventDispatcherBlackberry : public QEventDispatcherBlackberry
-{
- Q_OBJECT
-
-public:
- explicit QQnxEventDispatcherBlackberry(QObject *parent = 0);
- ~QQnxEventDispatcherBlackberry();
-
- bool processEvents(QEventLoop::ProcessEventsFlags flags);
- bool hasPendingEvents();
-
- void flush();
-};
-
-QT_END_NAMESPACE
-
-#endif // QQNXEVENTDISPATCHER_BLACKBERRY_H
diff --git a/src/plugins/platforms/qnx/qqnxfiledialoghelper.h b/src/plugins/platforms/qnx/qqnxfiledialoghelper.h
deleted file mode 100644
index 76cceafcfe..0000000000
--- a/src/plugins/platforms/qnx/qqnxfiledialoghelper.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2012 Research In Motion
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQNXFILEDIALOGHELPER_H
-#define QQNXFILEDIALOGHELPER_H
-
-#include <qpa/qplatformdialoghelper.h>
-
-
-QT_BEGIN_NAMESPACE
-
-class QQnxIntegration;
-
-class QQnxFilePicker;
-
-class QQnxFileDialogHelper : public QPlatformFileDialogHelper
-{
- Q_OBJECT
-public:
- explicit QQnxFileDialogHelper(const QQnxIntegration *);
- ~QQnxFileDialogHelper();
-
- void exec();
-
- bool show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent);
- void hide();
-
- bool defaultNameFilterDisables() const;
- void setDirectory(const QUrl &directory) Q_DECL_OVERRIDE;
- QUrl directory() const Q_DECL_OVERRIDE;
- void selectFile(const QUrl &fileName) Q_DECL_OVERRIDE;
- QList<QUrl> selectedFiles() const Q_DECL_OVERRIDE;
- void setFilter();
- void selectNameFilter(const QString &filter);
- QString selectedNameFilter() const;
-
- QQnxFilePicker *nativeDialog() const { return m_dialog; }
-
-Q_SIGNALS:
- void dialogClosed();
-
-private Q_SLOTS:
- void emitSignals();
-
-private:
- void setNameFilter(const QString &filter);
- void setNameFilters(const QStringList &filters);
-
- const QQnxIntegration *m_integration;
- QQnxFilePicker *m_dialog;
- QFileDialogOptions::AcceptMode m_acceptMode;
- QString m_selectedFilter;
-};
-
-QT_END_NAMESPACE
-
-#endif // QQNXFILEDIALOGHELPER_H
diff --git a/src/plugins/platforms/qnx/qqnxfiledialoghelper_bb10.cpp b/src/plugins/platforms/qnx/qqnxfiledialoghelper_bb10.cpp
deleted file mode 100644
index 3bc84686e0..0000000000
--- a/src/plugins/platforms/qnx/qqnxfiledialoghelper_bb10.cpp
+++ /dev/null
@@ -1,212 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2013 Research In Motion
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qqnxfiledialoghelper.h"
-
-#include "qqnxfilepicker.h"
-#include "qqnxbpseventfilter.h"
-#include "qqnxscreen.h"
-#include "qqnxintegration.h"
-
-#include <QDebug>
-#include <QEventLoop>
-#include <QScreen>
-#include <QTimer>
-#include <QWindow>
-
-#ifdef QQNXFILEDIALOGHELPER_DEBUG
-#define qFileDialogHelperDebug qDebug
-#else
-#define qFileDialogHelperDebug QT_NO_QDEBUG_MACRO
-#endif
-
-QT_BEGIN_NAMESPACE
-
-QQnxFileDialogHelper::QQnxFileDialogHelper(const QQnxIntegration *integration)
- : QPlatformFileDialogHelper(),
- m_integration(integration),
- m_dialog(new QQnxFilePicker),
- m_acceptMode(QFileDialogOptions::AcceptOpen),
- m_selectedFilter()
-{
- connect(m_dialog, &QQnxFilePicker::closed, this, &QQnxFileDialogHelper::emitSignals);
-}
-
-QQnxFileDialogHelper::~QQnxFileDialogHelper()
-{
- delete m_dialog;
-}
-
-void QQnxFileDialogHelper::exec()
-{
- qFileDialogHelperDebug();
-
- // Clear any previous results
- m_dialog->setDirectories(QStringList());
-
- QEventLoop loop;
- connect(m_dialog, SIGNAL(closed()), &loop, SLOT(quit()));
- loop.exec();
-}
-
-bool QQnxFileDialogHelper::show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent)
-{
- Q_UNUSED(flags);
- Q_UNUSED(parent);
- Q_UNUSED(modality);
-
- qFileDialogHelperDebug();
-
- // Create dialog
- const QSharedPointer<QFileDialogOptions> &opts = options();
- if (opts->acceptMode() == QFileDialogOptions::AcceptOpen) {
- // Select one or many files?
- const QQnxFilePicker::Mode mode = (opts->fileMode() == QFileDialogOptions::ExistingFiles)
- ? QQnxFilePicker::PickerMultiple : QQnxFilePicker::Picker;
-
- m_dialog->setMode(mode);
-
- // Set the actual list of extensions
- if (!opts->nameFilters().isEmpty())
- setNameFilters(opts->nameFilters());
- else
- setNameFilter(tr("All files (*.*)"));
- } else {
- const QQnxFilePicker::Mode mode = (opts->initiallySelectedFiles().count() >= 2)
- ? QQnxFilePicker::SaverMultiple : QQnxFilePicker::Saver;
-
- m_dialog->setMode(mode);
-
- if (!opts->initiallySelectedFiles().isEmpty()) {
- QStringList files;
- Q_FOREACH ( const QUrl &url, opts->initiallySelectedFiles() )
- files.append(url.toLocalFile());
- m_dialog->setDefaultSaveFileNames(files);
- }
- }
-
- // Cache the accept mode so we know which functions to use to get the results back
- m_acceptMode = opts->acceptMode();
- m_dialog->setTitle(opts->windowTitle());
- m_dialog->open();
-
- return true;
-}
-
-void QQnxFileDialogHelper::hide()
-{
- qFileDialogHelperDebug();
- m_dialog->close();
-}
-
-bool QQnxFileDialogHelper::defaultNameFilterDisables() const
-{
- qFileDialogHelperDebug();
- return false;
-}
-
-void QQnxFileDialogHelper::setDirectory(const QUrl &directory)
-{
- m_dialog->addDirectory(directory.toLocalFile());
-}
-
-QUrl QQnxFileDialogHelper::directory() const
-{
- qFileDialogHelperDebug();
- if (!m_dialog->directories().isEmpty())
- return QUrl::fromLocalFile(m_dialog->directories().first());
-
- return QUrl();
-}
-
-void QQnxFileDialogHelper::selectFile(const QUrl &fileName)
-{
- m_dialog->addDefaultSaveFileName(fileName.toLocalFile());
-}
-
-QList<QUrl> QQnxFileDialogHelper::selectedFiles() const
-{
- qFileDialogHelperDebug();
- QList<QUrl> urls;
- QStringList files = m_dialog->selectedFiles();
- Q_FOREACH (const QString &file, files)
- urls.append(QUrl::fromLocalFile(file));
- return urls;
-}
-
-void QQnxFileDialogHelper::setFilter()
-{
- // No native api to support setting a filter from QDir::Filters
- qFileDialogHelperDebug();
-}
-
-void QQnxFileDialogHelper::selectNameFilter(const QString &filter)
-{
- qFileDialogHelperDebug() << "filter =" << filter;
- setNameFilter(filter);
-}
-
-QString QQnxFileDialogHelper::selectedNameFilter() const
-{
- // For now there is no way for the user to change the selected filter
- // so this just reflects what the developer has set programmatically.
- qFileDialogHelperDebug();
- return m_selectedFilter;
-}
-
-void QQnxFileDialogHelper::emitSignals()
-{
- if (m_dialog->selectedFiles().isEmpty())
- Q_EMIT reject();
- else
- Q_EMIT accept();
-}
-
-void QQnxFileDialogHelper::setNameFilter(const QString &filter)
-{
- qFileDialogHelperDebug() << "filter =" << filter;
-
- setNameFilters(QPlatformFileDialogHelper::cleanFilterList(filter));
-}
-
-void QQnxFileDialogHelper::setNameFilters(const QStringList &filters)
-{
- qFileDialogHelperDebug() << "filters =" << filters;
-
- Q_ASSERT(!filters.isEmpty());
-
- m_dialog->setFilters(filters);
- m_selectedFilter = filters.first();
-}
-
-QT_END_NAMESPACE
diff --git a/src/plugins/platforms/qnx/qqnxfilepicker.cpp b/src/plugins/platforms/qnx/qqnxfilepicker.cpp
deleted file mode 100644
index ca8d731e66..0000000000
--- a/src/plugins/platforms/qnx/qqnxfilepicker.cpp
+++ /dev/null
@@ -1,322 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2013 Research In Motion
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qqnxfilepicker.h"
-
-#include <QAbstractEventDispatcher>
-#include <QCoreApplication>
-#include <QDebug>
-#include <QJsonDocument>
-#include <QJsonObject>
-#include <QJsonArray>
-#include <QJsonParseError>
-#include <QMimeDatabase>
-#include <QUrl>
-#include <private/qppsobject_p.h>
-
-#include <bps/navigator.h>
-#include <bps/navigator_invoke.h>
-
-#include <errno.h>
-
-#ifdef QQNXFILEPICKER_DEBUG
-#define qFilePickerDebug qDebug
-#else
-#define qFilePickerDebug QT_NO_QDEBUG_MACRO
-#endif
-
-QT_BEGIN_NAMESPACE
-
-static const char s_filePickerTarget[] = "sys.filepicker.target";
-
-QQnxFilePicker::QQnxFilePicker(QObject *parent)
- : QObject(parent)
- , m_invocationHandle(0)
- , m_mode(QQnxFilePicker::Picker)
- , m_title(tr("Pick a file"))
-{
- QCoreApplication::eventDispatcher()->installNativeEventFilter(this);
-}
-
-QQnxFilePicker::~QQnxFilePicker()
-{
- cleanup();
-
- QCoreApplication::eventDispatcher()->removeNativeEventFilter(this);
-}
-
-void QQnxFilePicker::open()
-{
- if (m_invocationHandle)
- return;
-
- // Clear any previous results
- m_selectedFiles.clear();
-
- int errorCode = BPS_SUCCESS;
-
- errorCode = navigator_invoke_invocation_create(&m_invocationHandle);
- if (errorCode != BPS_SUCCESS) {
- qWarning() << "QQnxFilePicker: unable to create invocation:" << strerror(errno);
- return;
- }
-
- errorCode = navigator_invoke_invocation_set_target(m_invocationHandle, s_filePickerTarget);
-
- if (errorCode != BPS_SUCCESS) {
- cleanup();
- qWarning() << "QQnxFilePicker: unable to set target:" << strerror(errno);
- return;
- }
-
- errorCode = navigator_invoke_invocation_set_action(m_invocationHandle, "bb.action.OPEN");
- if (errorCode != BPS_SUCCESS) {
- cleanup();
- qWarning() << "QQnxFilePicker: unable to set action:" << strerror(errno);
- return;
- }
-
- errorCode = navigator_invoke_invocation_set_type(m_invocationHandle, "application/vnd.blackberry.file_picker");
- if (errorCode != BPS_SUCCESS) {
- cleanup();
- qWarning() << "QQnxFilePicker: unable to set mime type:" << strerror(errno);
- return;
- }
-
- QVariantMap map;
- map[QStringLiteral("Type")] = filePickerType();
- map[QStringLiteral("Mode")] = modeToString(m_mode);
- map[QStringLiteral("Title")] = m_title;
- map[QStringLiteral("ViewMode")] = QStringLiteral("Default");
- map[QStringLiteral("SortBy")] = QStringLiteral("Default");
- map[QStringLiteral("SortOrder")] = QStringLiteral("Default");
- map[QStringLiteral("ImageCrop")] = false;
- map[QStringLiteral("AllowOverwrite")] = false;
-
- if (!m_defaultSaveFileNames.isEmpty())
- map[QStringLiteral("DefaultFileNames")] = m_defaultSaveFileNames.join(QLatin1Char(','));
- if (!m_filters.isEmpty())
- map[QStringLiteral("Filter")] = m_filters.join(QLatin1Char(';'));
-
- QByteArray ppsData;
- ppsData = QPpsObject::encode(map);
-
- errorCode = navigator_invoke_invocation_set_data(m_invocationHandle, ppsData.constData(), ppsData.size());
- if (errorCode != BPS_SUCCESS) {
- cleanup();
- qWarning() << "QQnxFilePicker: unable to set data:" << strerror(errno);
- return;
- }
-
- navigator_invoke_invocation_send(m_invocationHandle);
-}
-
-void QQnxFilePicker::close()
-{
- navigator_card_close_child();
- cleanup();
-}
-
-bool QQnxFilePicker::nativeEventFilter(const QByteArray&, void *message, long*)
-{
- bps_event_t * const event = static_cast<bps_event_t*>(message);
- if (!event)
- return false;
-
- if (bps_event_get_code(event) == NAVIGATOR_INVOKE_TARGET_RESULT) {
- const char *id = navigator_event_get_id(event);
- const char *err = navigator_event_get_err(event);
- qFilePickerDebug("received invocation response: id=%s err=%s", id, err);
- } else if (bps_event_get_code(event) == NAVIGATOR_CHILD_CARD_CLOSED) {
- const char *data = navigator_event_get_card_closed_data(event);
- qFilePickerDebug("received data: data='%s'", data);
- handleFilePickerResponse(data);
- }
-
- return false; // do not drop the event
-}
-
-void QQnxFilePicker::setMode(QQnxFilePicker::Mode mode)
-{
- m_mode = mode;
-}
-
-void QQnxFilePicker::setDefaultSaveFileNames(const QStringList &fileNames)
-{
- m_defaultSaveFileNames = fileNames;
-}
-
-void QQnxFilePicker::addDefaultSaveFileName(const QString &fileName)
-{
- m_defaultSaveFileNames.append(fileName);
-}
-
-void QQnxFilePicker::setDirectories(const QStringList &directories)
-{
- m_directories = directories;
-}
-
-void QQnxFilePicker::addDirectory(const QString &directory)
-{
- m_directories.append(directory);
-}
-
-void QQnxFilePicker::setFilters(const QStringList &filters)
-{
- m_filters = filters;
-}
-
-void QQnxFilePicker::setTitle(const QString &title)
-{
- m_title = title;
-}
-
-QQnxFilePicker::Mode QQnxFilePicker::mode() const
-{
- return m_mode;
-}
-
-QStringList QQnxFilePicker::defaultSaveFileNames() const
-{
- return m_defaultSaveFileNames;
-}
-
-QStringList QQnxFilePicker::directories() const
-{
- return m_directories;
-}
-
-QStringList QQnxFilePicker::filters() const
-{
- return m_filters;
-}
-
-QStringList QQnxFilePicker::selectedFiles() const
-{
- return m_selectedFiles;
-}
-
-QString QQnxFilePicker::title() const
-{
- return m_title;
-}
-
-void QQnxFilePicker::cleanup()
-{
- if (m_invocationHandle) {
- navigator_invoke_invocation_destroy(m_invocationHandle);
- m_invocationHandle = 0;
- }
-}
-
-void QQnxFilePicker::handleFilePickerResponse(const char *data)
-{
- QJsonParseError jsonError;
- QJsonDocument document = QJsonDocument::fromJson(data, &jsonError);
-
- if (jsonError.error != QJsonParseError::NoError) {
- qFilePickerDebug() << "Error parsing FilePicker response: "
- << jsonError.errorString();
- Q_EMIT closed();
- cleanup();
- return;
- }
-
- // The response is a list of Json objects.
- const QVariantList array = document.array().toVariantList();
-
- foreach (const QVariant &variant, array) {
- const QJsonObject object = QJsonObject::fromVariantMap(variant.toMap());
- const QUrl url(object.value(QStringLiteral("uri")).toString());
- const QString localFile = url.toLocalFile(); // strip "file://"
-
- if (!localFile.isEmpty())
- m_selectedFiles << localFile;
-
- qFilePickerDebug() << "FilePicker uri response:" << localFile;
- }
-
- Q_EMIT closed();
- cleanup();
-}
-
-QString QQnxFilePicker::filePickerType() const
-{
- bool images = false;
- bool video = false;
- bool music = false;
- QMimeDatabase mimeDb;
- for (int i = 0; i < m_filters.count(); i++) {
- QList<QMimeType> mimeTypes = mimeDb.mimeTypesForFileName(m_filters.at(i));
- if (mimeTypes.isEmpty())
- return QStringLiteral("Other");
-
- if (mimeTypes.first().name().startsWith(QLatin1String("image")))
- images = true;
- else if (mimeTypes.first().name().startsWith(QLatin1String("audio")))
- music = true;
- else if (mimeTypes.first().name().startsWith(QLatin1String("video")))
- video = true;
- else
- return QStringLiteral("Other");
- }
-
- if (!video && !music)
- return QStringLiteral("Picture");
-
- if (!images && !music)
- return QStringLiteral("Video");
-
- if (!images && !video)
- return QStringLiteral("Music");
-
- return QStringLiteral("Other");
-}
-
-QString QQnxFilePicker::modeToString(QQnxFilePicker::Mode mode) const
-{
- switch (mode) {
- case Picker:
- return QStringLiteral("Picker");
- case Saver:
- return QStringLiteral("Saver");
- case PickerMultiple:
- return QStringLiteral("PickerMultiple");
- case SaverMultiple:
- return QStringLiteral("SaverMultiple");
- }
-
- return QStringLiteral("Picker");
-}
-
-QT_END_NAMESPACE
diff --git a/src/plugins/platforms/qnx/qqnxfilepicker.h b/src/plugins/platforms/qnx/qqnxfilepicker.h
deleted file mode 100644
index 7e4f9010cc..0000000000
--- a/src/plugins/platforms/qnx/qqnxfilepicker.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2013 Research In Motion
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQNXFILEPICKER_H
-#define QQNXFILEPICKER_H
-
-#include <QAbstractNativeEventFilter>
-#include <QObject>
-#include <QStringList>
-
-QT_BEGIN_NAMESPACE
-
-struct navigator_invoke_invocation_t;
-
-class QQnxFilePicker : public QObject, public QAbstractNativeEventFilter
-{
- Q_OBJECT
-
-public:
- explicit QQnxFilePicker(QObject *parent = 0);
- ~QQnxFilePicker();
-
- enum Mode {
- Picker,
- Saver,
- PickerMultiple,
- SaverMultiple
- };
-
- bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) Q_DECL_OVERRIDE;
-
- void setMode(Mode mode);
- void setDefaultSaveFileNames(const QStringList &fileNames);
- void addDefaultSaveFileName(const QString &fileName);
- void setDirectories(const QStringList &directories);
- void addDirectory(const QString &directory);
- void setFilters(const QStringList &filters);
- void setTitle(const QString &title);
-
- Mode mode() const;
-
- QStringList defaultSaveFileNames() const;
- QStringList directories() const;
- QStringList filters() const;
- QStringList selectedFiles() const;
-
- QString title() const;
-
-Q_SIGNALS:
- void closed();
-
-public Q_SLOTS:
- void open();
- void close();
-
-private:
- void cleanup();
- void handleFilePickerResponse(const char *data);
- QString filePickerType() const;
-
- QString modeToString(Mode mode) const;
-
- navigator_invoke_invocation_t *m_invocationHandle;
-
- Mode m_mode;
-
- QStringList m_defaultSaveFileNames;
- QStringList m_directories;
- QStringList m_filters;
- QStringList m_selectedFiles;
-
- QString m_title;
-};
-
-QT_END_NAMESPACE
-
-#endif // QQNXFILEPICKER_H
diff --git a/src/plugins/platforms/qnx/qqnxglcontext.cpp b/src/plugins/platforms/qnx/qqnxglcontext.cpp
index 5ef8d72926..20930af524 100644
--- a/src/plugins/platforms/qnx/qqnxglcontext.cpp
+++ b/src/plugins/platforms/qnx/qqnxglcontext.cpp
@@ -61,7 +61,7 @@ QQnxGLContext::QQnxGLContext(QOpenGLContext *glContext)
// Set current rendering API
EGLBoolean eglResult = eglBindAPI(EGL_OPENGL_ES_API);
- if (eglResult != EGL_TRUE)
+ if (Q_UNLIKELY(eglResult != EGL_TRUE))
qFatal("QQNX: failed to set EGL API, err=%d", eglGetError());
// Get colour channel sizes from window format
@@ -113,7 +113,7 @@ QQnxGLContext::QQnxGLContext(QOpenGLContext *glContext)
// Select EGL config based on requested window format
m_eglConfig = q_configFromGLFormat(ms_eglDisplay, format);
- if (m_eglConfig == 0)
+ if (Q_UNLIKELY(m_eglConfig == 0))
qFatal("QQnxGLContext: failed to find EGL config");
QQnxGLContext *glShareContext = static_cast<QQnxGLContext*>(m_glContext->shareHandle());
@@ -121,7 +121,7 @@ QQnxGLContext::QQnxGLContext(QOpenGLContext *glContext)
m_eglContext = eglCreateContext(ms_eglDisplay, m_eglConfig, m_eglShareContext,
contextAttrs(format));
- if (m_eglContext == EGL_NO_CONTEXT) {
+ if (Q_UNLIKELY(m_eglContext == EGL_NO_CONTEXT)) {
checkEGLError("eglCreateContext");
qFatal("QQnxGLContext: failed to create EGL context, err=%d", eglGetError());
}
@@ -170,13 +170,13 @@ void QQnxGLContext::initializeContext()
// Initialize connection to EGL
ms_eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
- if (ms_eglDisplay == EGL_NO_DISPLAY) {
+ if (Q_UNLIKELY(ms_eglDisplay == EGL_NO_DISPLAY)) {
checkEGLError("eglGetDisplay");
qFatal("QQnxGLContext: failed to obtain EGL display");
}
EGLBoolean eglResult = eglInitialize(ms_eglDisplay, 0, 0);
- if (eglResult != EGL_TRUE) {
+ if (Q_UNLIKELY(eglResult != EGL_TRUE)) {
checkEGLError("eglInitialize");
qFatal("QQnxGLContext: failed to initialize EGL display, err=%d", eglGetError());
}
@@ -198,7 +198,7 @@ bool QQnxGLContext::makeCurrent(QPlatformSurface *surface)
// Set current rendering API
EGLBoolean eglResult = eglBindAPI(EGL_OPENGL_ES_API);
- if (eglResult != EGL_TRUE)
+ if (Q_UNLIKELY(eglResult != EGL_TRUE))
qFatal("QQnxGLContext: failed to set EGL API, err=%d", eglGetError());
QQnxEglWindow *platformWindow = dynamic_cast<QQnxEglWindow*>(surface);
@@ -227,12 +227,12 @@ void QQnxGLContext::doneCurrent()
// set current rendering API
EGLBoolean eglResult = eglBindAPI(EGL_OPENGL_ES_API);
- if (eglResult != EGL_TRUE)
+ if (Q_UNLIKELY(eglResult != EGL_TRUE))
qFatal("QQNX: failed to set EGL API, err=%d", eglGetError());
// clear curent EGL context and unbind EGL surface
eglResult = eglMakeCurrent(ms_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
- if (eglResult != EGL_TRUE)
+ if (Q_UNLIKELY(eglResult != EGL_TRUE))
qFatal("QQNX: failed to clear current EGL context, err=%d", eglGetError());
}
@@ -252,7 +252,7 @@ QFunctionPointer QQnxGLContext::getProcAddress(const QByteArray &procName)
// Set current rendering API
EGLBoolean eglResult = eglBindAPI(EGL_OPENGL_ES_API);
- if (eglResult != EGL_TRUE)
+ if (Q_UNLIKELY(eglResult != EGL_TRUE))
qFatal("QQNX: failed to set EGL API, err=%d", eglGetError());
// Lookup EGL extension function pointer
diff --git a/src/plugins/platforms/qnx/qqnxglobal.cpp b/src/plugins/platforms/qnx/qqnxglobal.cpp
index 01e7675839..4d2599746e 100644
--- a/src/plugins/platforms/qnx/qqnxglobal.cpp
+++ b/src/plugins/platforms/qnx/qqnxglobal.cpp
@@ -44,8 +44,8 @@ void qScreenCheckError(int rc, const char *funcInfo, const char *message, bool c
rc = screen_flush_context(QQnxIntegration::screenContext(), 0);
}
- if (rc) {
- if (critical)
+ if (Q_UNLIKELY(rc)) {
+ if (Q_UNLIKELY(critical))
qCritical("%s - Screen: %s - Error: %s (%i)", funcInfo, message, strerror(errno), errno);
else
qWarning("%s - Screen: %s - Error: %s (%i)", funcInfo, message, strerror(errno), errno);
diff --git a/src/plugins/platforms/qnx/qqnxinputcontext_imf.cpp b/src/plugins/platforms/qnx/qqnxinputcontext_imf.cpp
index 3af481b991..5aa8b9bfee 100644
--- a/src/plugins/platforms/qnx/qqnxinputcontext_imf.cpp
+++ b/src/plugins/platforms/qnx/qqnxinputcontext_imf.cpp
@@ -530,29 +530,28 @@ static bool imfAvailable()
if ( p_imf_client_init == 0 ) {
void *handle = dlopen("libinput_client.so.1", 0);
- if ( handle ) {
- p_imf_client_init = (int32_t (*)()) dlsym(handle, "imf_client_init");
- p_imf_client_disconnect = (void (*)()) dlsym(handle, "imf_client_disconnect");
- p_ictrl_open_session = (const input_session_t *(*)(connection_interface_t *))dlsym(handle, "ictrl_open_session");
- p_ictrl_close_session = (void (*)(input_session_t *))dlsym(handle, "ictrl_close_session");
- p_ictrl_dispatch_event = (int32_t (*)(event_t *))dlsym(handle, "ictrl_dispatch_event");
- p_vkb_init_selection_service = (int32_t (*)())dlsym(handle, "vkb_init_selection_service");
- p_ictrl_get_num_active_sessions = (int32_t (*)())dlsym(handle, "ictrl_get_num_active_sessions");
- } else {
+ if (Q_UNLIKELY(!handle)) {
qCritical("libinput_client.so.1 is not present - IMF services are disabled.");
s_imfDisabled = true;
return false;
}
-
- if ( p_imf_client_init && p_ictrl_open_session && p_ictrl_dispatch_event ) {
- s_imfReady = true;
- } else {
+ p_imf_client_init = (int32_t (*)()) dlsym(handle, "imf_client_init");
+ p_imf_client_disconnect = (void (*)()) dlsym(handle, "imf_client_disconnect");
+ p_ictrl_open_session = (const input_session_t *(*)(connection_interface_t *))dlsym(handle, "ictrl_open_session");
+ p_ictrl_close_session = (void (*)(input_session_t *))dlsym(handle, "ictrl_close_session");
+ p_ictrl_dispatch_event = (int32_t (*)(event_t *))dlsym(handle, "ictrl_dispatch_event");
+ p_vkb_init_selection_service = (int32_t (*)())dlsym(handle, "vkb_init_selection_service");
+ p_ictrl_get_num_active_sessions = (int32_t (*)())dlsym(handle, "ictrl_get_num_active_sessions");
+
+ if (Q_UNLIKELY(!p_imf_client_init || !p_ictrl_open_session || !p_ictrl_dispatch_event)) {
p_ictrl_open_session = 0;
p_ictrl_dispatch_event = 0;
s_imfDisabled = true;
qCritical("libinput_client.so.1 did not contain the correct symbols, library mismatch? IMF services are disabled.");
return false;
}
+
+ s_imfReady = true;
}
return s_imfReady;
@@ -581,7 +580,7 @@ QQnxInputContext::QQnxInputContext(QQnxIntegration *integration, QQnxAbstractVir
Q_ASSERT(sInputContextInstance == 0);
sInputContextInstance = this;
- if (p_imf_client_init() != 0) {
+ if (Q_UNLIKELY(p_imf_client_init() != 0)) {
s_imfInitFailed = true;
qCritical("imf_client_init failed - IMF services will be unavailable");
}
diff --git a/src/plugins/platforms/qnx/qqnxintegration.cpp b/src/plugins/platforms/qnx/qqnxintegration.cpp
index 6548c82310..0616ac626f 100644
--- a/src/plugins/platforms/qnx/qqnxintegration.cpp
+++ b/src/plugins/platforms/qnx/qqnxintegration.cpp
@@ -52,12 +52,7 @@
#include "qqnxeglwindow.h"
#endif
-#if defined(Q_OS_BLACKBERRY)
-#include "qqnxbpseventfilter.h"
-#include "qqnxnavigatorbps.h"
-#include "qblackberrytheme.h"
-#include "qqnxvirtualkeyboardbps.h"
-#elif defined(QQNX_PPS)
+#if defined(QQNX_PPS)
#include "qqnxnavigatorpps.h"
#include "qqnxnavigatoreventnotifier.h"
#include "qqnxvirtualkeyboardpps.h"
@@ -75,12 +70,7 @@
#endif
#include "private/qgenericunixfontdatabase_p.h"
-
-#if defined(Q_OS_BLACKBERRY)
-#include "qqnxeventdispatcher_blackberry.h"
-#else
#include "private/qgenericunixeventdispatcher_p.h"
-#endif
#include <qpa/qplatformwindow.h>
#include <qpa/qwindowsysteminterface.h>
@@ -120,16 +110,10 @@ static inline QQnxIntegration::Options parseOptions(const QStringList &paramList
options |= QQnxIntegration::AlwaysFlushScreenContext;
}
-// On Blackberry the first window is treated as a root window
-#ifdef Q_OS_BLACKBERRY
- if (!paramList.contains(QLatin1String("no-rootwindow"))) {
- options |= QQnxIntegration::RootWindow;
- }
-#else
if (paramList.contains(QLatin1String("rootwindow"))) {
options |= QQnxIntegration::RootWindow;
}
-#endif
+
return options;
}
@@ -147,12 +131,7 @@ QQnxIntegration::QQnxIntegration(const QStringList &paramList)
#endif
, m_services(0)
, m_fontDatabase(new QGenericUnixFontDatabase())
-#if defined(Q_OS_BLACKBERRY)
- , m_eventDispatcher(new QQnxEventDispatcherBlackberry())
- , m_bpsEventFilter(0)
-#else
, m_eventDispatcher(createUnixEventDispatcher())
-#endif
, m_nativeInterface(new QQnxNativeInterface(this))
, m_screenEventHandler(new QQnxScreenEventHandler(this))
#if !defined(QT_NO_CLIPBOARD)
@@ -169,8 +148,7 @@ QQnxIntegration::QQnxIntegration(const QStringList &paramList)
Q_SCREEN_CRITICALERROR(screen_create_context(&ms_screenContext, SCREEN_APPLICATION_CONTEXT),
"Failed to create screen context");
- // Not on BlackBerry, it has specialized event dispatcher which also handles navigator events
-#if !defined(Q_OS_BLACKBERRY) && defined(QQNX_PPS)
+#if defined(QQNX_PPS)
// Create/start navigator event notifier
m_navigatorEventNotifier = new QQnxNavigatorEventNotifier(m_navigatorEventHandler);
@@ -190,8 +168,7 @@ QQnxIntegration::QQnxIntegration(const QStringList &paramList)
m_screenEventThread->start();
#endif
- // Not on BlackBerry, it has specialized event dispatcher which also handles virtual keyboard events
-#if !defined(Q_OS_BLACKBERRY) && defined(QQNX_PPS)
+#if defined(QQNX_PPS)
// Create/start the keyboard class.
m_virtualKeyboard = new QQnxVirtualKeyboardPps();
@@ -200,9 +177,7 @@ QQnxIntegration::QQnxIntegration(const QStringList &paramList)
QMetaObject::invokeMethod(m_virtualKeyboard, "start", Qt::QueuedConnection);
#endif
-#if defined(Q_OS_BLACKBERRY)
- m_navigator = new QQnxNavigatorBps();
-#elif defined(QQNX_PPS)
+#if defined(QQNX_PPS)
m_navigator = new QQnxNavigatorPps();
#endif
@@ -210,34 +185,8 @@ QQnxIntegration::QQnxIntegration(const QStringList &paramList)
if (m_navigator)
m_services = new QQnxServices(m_navigator);
-#if defined(Q_OS_BLACKBERRY)
- QQnxVirtualKeyboardBps* virtualKeyboardBps = new QQnxVirtualKeyboardBps;
-
-#if defined(QQNX_SCREENEVENTTHREAD)
- m_bpsEventFilter = new QQnxBpsEventFilter(m_navigatorEventHandler, 0, virtualKeyboardBps);
-#else
- m_bpsEventFilter = new QQnxBpsEventFilter(m_navigatorEventHandler, m_screenEventHandler, virtualKeyboardBps);
-#endif
-
- m_bpsEventFilter->installOnEventDispatcher(m_eventDispatcher);
-
- m_virtualKeyboard = virtualKeyboardBps;
-#endif
-
- // Create displays for all possible screens (which may not be attached). We have to do this
- // *after* the call to m_bpsEventFilter->installOnEventDispatcher(m_eventDispatcher). The
- // reason for this is that we have to be registered for NAVIGATOR events before we create the
- // QQnxScreen objects, and hence the QQnxRootWindow's. It is when the NAVIGATOR service sees
- // the window creation that it starts sending us messages which results in a race if we
- // create the displays first.
createDisplays();
-#if !defined(QQNX_SCREENEVENTTHREAD) && defined(Q_OS_BLACKBERRY)
- // Register for screen domain events with bps
- Q_FOREACH (QQnxScreen *screen, m_screens)
- m_bpsEventFilter->registerForScreenEvents(screen);
-#endif
-
if (m_virtualKeyboard) {
// TODO check if we need to do this for all screens or only the primary one
QObject::connect(m_virtualKeyboard, SIGNAL(heightChanged(int)),
@@ -275,7 +224,7 @@ QQnxIntegration::~QQnxIntegration()
#endif
// Stop/destroy navigator event notifier
-#if !defined(Q_OS_BLACKBERRY) && defined(QQNX_PPS)
+#if defined(QQNX_PPS)
delete m_navigatorEventNotifier;
#endif
delete m_navigatorEventHandler;
@@ -283,13 +232,6 @@ QQnxIntegration::~QQnxIntegration()
#if defined(QQNX_SCREENEVENTTHREAD)
// Stop/destroy screen event thread
delete m_screenEventThread;
-#elif defined(Q_OS_BLACKBERRY)
- Q_FOREACH (QQnxScreen *screen, m_screens)
- m_bpsEventFilter->unregisterForScreenEvents(screen);
-#endif
-
-#if defined(Q_OS_BLACKBERRY)
- delete m_bpsEventFilter;
#endif
// In case the event-dispatcher was never transferred to QCoreApplication
@@ -450,21 +392,6 @@ QPlatformServices * QQnxIntegration::services() const
return m_services;
}
-#if defined(Q_OS_BLACKBERRY)
-QStringList QQnxIntegration::themeNames() const
-{
- return QStringList(QBlackberryTheme::name());
-}
-
-QPlatformTheme *QQnxIntegration::createPlatformTheme(const QString &name) const
-{
- qIntegrationDebug() << "name =" << name;
- if (name == QBlackberryTheme::name())
- return new QBlackberryTheme(this);
- return 0;
-}
-#endif
-
QWindow *QQnxIntegration::window(screen_window_t qnxWindow)
{
qIntegrationDebug();
@@ -498,7 +425,7 @@ void QQnxIntegration::createDisplays()
&displayCount);
Q_SCREEN_CRITICALERROR(result, "Failed to query display count");
- if (displayCount < 1) {
+ if (Q_UNLIKELY(displayCount < 1)) {
// Never happens, even if there's no display, libscreen returns 1
qFatal("QQnxIntegration: displayCount=%d", displayCount);
}
@@ -601,7 +528,7 @@ QQnxIntegration::Options QQnxIntegration::ms_options = 0;
bool QQnxIntegration::supportsNavigatorEvents() const
{
- // If QQNX_PPS or Q_OS_BLACKBERRY is defined then we have navigator
+ // If QQNX_PPS is defined then we have navigator
return m_navigator != 0;
}
diff --git a/src/plugins/platforms/qnx/qqnxintegration.h b/src/plugins/platforms/qnx/qqnxintegration.h
index 04250cdba0..3a4a1380ab 100644
--- a/src/plugins/platforms/qnx/qqnxintegration.h
+++ b/src/plugins/platforms/qnx/qqnxintegration.h
@@ -42,7 +42,6 @@
QT_BEGIN_NAMESPACE
-class QQnxBpsEventFilter;
#if defined(QQNX_SCREENEVENTTHREAD)
class QQnxScreenEventThread;
#endif
@@ -117,12 +116,6 @@ public:
QPlatformServices *services() const;
-#if defined(Q_OS_BLACKBERRY)
- QStringList themeNames() const;
- QPlatformTheme *createPlatformTheme(const QString &name) const;
- QQnxBpsEventFilter *bpsEventFilter() const { return m_bpsEventFilter; }
-#endif
-
static QWindow *window(screen_window_t qnxWindow);
QQnxScreen *screenForNative(screen_display_t qnxScreen) const;
@@ -156,9 +149,6 @@ private:
QQnxServices *m_services;
QPlatformFontDatabase *m_fontDatabase;
mutable QAbstractEventDispatcher *m_eventDispatcher;
-#if defined(Q_OS_BLACKBERRY)
- QQnxBpsEventFilter *m_bpsEventFilter;
-#endif
QQnxNativeInterface *m_nativeInterface;
QList<QQnxScreen*> m_screens;
QQnxScreenEventHandler *m_screenEventHandler;
diff --git a/src/plugins/platforms/qnx/qqnxnativeinterface.cpp b/src/plugins/platforms/qnx/qqnxnativeinterface.cpp
index 549e0209bf..8c22f7cea0 100644
--- a/src/plugins/platforms/qnx/qqnxnativeinterface.cpp
+++ b/src/plugins/platforms/qnx/qqnxnativeinterface.cpp
@@ -85,11 +85,6 @@ void *QQnxNativeInterface::nativeResourceForScreen(const QByteArray &resource, Q
void *QQnxNativeInterface::nativeResourceForIntegration(const QByteArray &resource)
{
-#ifdef Q_OS_BLACKBERRY
- if (resource == "navigatorEventHandler")
- return m_integration->navigatorEventHandler();
-#endif
-
return 0;
}
diff --git a/src/plugins/platforms/qnx/qqnxnavigatorbps.cpp b/src/plugins/platforms/qnx/qqnxnavigatorbps.cpp
deleted file mode 100644
index 0d730d6f57..0000000000
--- a/src/plugins/platforms/qnx/qqnxnavigatorbps.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2012 Research In Motion
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qqnxnavigatorbps.h"
-
-#include <QDebug>
-
-#include <bps/navigator.h>
-
-QT_BEGIN_NAMESPACE
-
-QQnxNavigatorBps::QQnxNavigatorBps(QObject *parent)
- : QQnxAbstractNavigator(parent)
-{
- bps_initialize();
-}
-
-QQnxNavigatorBps::~QQnxNavigatorBps()
-{
- bps_shutdown();
-}
-
-bool QQnxNavigatorBps::requestInvokeUrl(const QByteArray &encodedUrl)
-{
- char *error = 0;
-
- int ret = navigator_invoke(encodedUrl, &error);
- if (error) {
- qWarning() << "error=" << error;
- bps_free(error);
- }
-
- return (ret == BPS_SUCCESS);
-}
-
-QT_END_NAMESPACE
diff --git a/src/plugins/platforms/qnx/qqnxnavigatorbps.h b/src/plugins/platforms/qnx/qqnxnavigatorbps.h
deleted file mode 100644
index b006695de6..0000000000
--- a/src/plugins/platforms/qnx/qqnxnavigatorbps.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2012 Research In Motion
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQNXNAVIGATORBPS_H
-#define QQNXNAVIGATORBPS_H
-
-#include "qqnxabstractnavigator.h"
-
-QT_BEGIN_NAMESPACE
-
-class QQnxNavigatorBps : public QQnxAbstractNavigator
-{
- Q_OBJECT
-public:
- explicit QQnxNavigatorBps(QObject *parent = 0);
- ~QQnxNavigatorBps();
-
-protected:
- bool requestInvokeUrl(const QByteArray &encodedUrl);
-};
-
-QT_END_NAMESPACE
-
-#endif // QQNXNAVIGATORBPS_H
diff --git a/src/plugins/platforms/qnx/qqnxnavigatorcover.cpp b/src/plugins/platforms/qnx/qqnxnavigatorcover.cpp
deleted file mode 100644
index 6d30677b30..0000000000
--- a/src/plugins/platforms/qnx/qqnxnavigatorcover.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2013 BlackBerry Limited. All rights reserved.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qqnxnavigatorcover.h"
-
-QQnxNavigatorCover::QQnxNavigatorCover()
-{
- navigator_window_cover_attribute_create(&m_coverAttribute);
-}
-
-QQnxNavigatorCover::~QQnxNavigatorCover()
-{
- if (m_coverAttribute)
- navigator_window_cover_attribute_destroy(m_coverAttribute);
-
- navigator_window_cover_reset();
-}
-
-void QQnxNavigatorCover::updateCover()
-{
- if (m_coverAttribute) {
- navigator_window_cover_attribute_set_transition(m_coverAttribute,
- NAVIGATOR_WINDOW_COVER_TRANSITION_NONE);
- navigator_window_cover_attribute_set_alternate_window(m_coverAttribute);
- navigator_window_cover_update(m_coverAttribute);
- }
-}
diff --git a/src/plugins/platforms/qnx/qqnxnavigatorcover.h b/src/plugins/platforms/qnx/qqnxnavigatorcover.h
deleted file mode 100644
index 5e9ed9f7bd..0000000000
--- a/src/plugins/platforms/qnx/qqnxnavigatorcover.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2013 BlackBerry Limited. All rights reserved.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQNXNAVIGATORCOVER_H
-#define QQNXNAVIGATORCOVER_H
-
-#include "qqnxabstractcover.h"
-#include <bps/navigator.h>
-
-class QQnxNavigatorCover : public QQnxAbstractCover
-{
-public:
- QQnxNavigatorCover();
- ~QQnxNavigatorCover();
-
- void updateCover();
-
-private:
- navigator_window_cover_attribute_t *m_coverAttribute;
-};
-
-#endif // QQNXNAVIGATORCOVER_H
diff --git a/src/plugins/platforms/qnx/qqnxnavigatoreventnotifier.cpp b/src/plugins/platforms/qnx/qqnxnavigatoreventnotifier.cpp
index 6199eb8e11..8098c9970e 100644
--- a/src/plugins/platforms/qnx/qqnxnavigatoreventnotifier.cpp
+++ b/src/plugins/platforms/qnx/qqnxnavigatoreventnotifier.cpp
@@ -102,7 +102,7 @@ void QQnxNavigatorEventNotifier::parsePPS(const QByteArray &ppsData, QByteArray
QList<QByteArray> lines = ppsData.split('\n');
// validate pps object
- if (lines.size() == 0 || lines.at(0) != "@control")
+ if (Q_UNLIKELY(lines.empty() || lines.at(0) != "@control"))
qFatal("QQNX: unrecognized pps object, data=%s", ppsData.constData());
// parse pps object attributes and extract values
@@ -160,7 +160,7 @@ void QQnxNavigatorEventNotifier::replyPPS(const QByteArray &res, const QByteArra
// send pps message to navigator
errno = 0;
int bytes = write(m_fd, ppsData.constData(), ppsData.size());
- if (bytes == -1)
+ if (Q_UNLIKELY(bytes == -1))
qFatal("QQNX: failed to write navigator pps, errno=%d", errno);
}
@@ -198,7 +198,7 @@ void QQnxNavigatorEventNotifier::readData()
// attempt to read pps data
errno = 0;
int bytes = qt_safe_read(m_fd, buffer, ppsBufferSize - 1);
- if (bytes == -1)
+ if (Q_UNLIKELY(bytes == -1))
qFatal("QQNX: failed to read navigator pps, errno=%d", errno);
// check if pps data was received
diff --git a/src/plugins/platforms/qnx/qqnxnavigatorpps.cpp b/src/plugins/platforms/qnx/qqnxnavigatorpps.cpp
index b139471669..ca8e2bd3ab 100644
--- a/src/plugins/platforms/qnx/qqnxnavigatorpps.cpp
+++ b/src/plugins/platforms/qnx/qqnxnavigatorpps.cpp
@@ -100,7 +100,7 @@ bool QQnxNavigatorPps::sendPpsMessage(const QByteArray &message, const QByteArra
// send pps message to navigator
errno = 0;
int bytes = qt_safe_write(m_fd, ppsMessage.constData(), ppsMessage.size());
- if (bytes == -1)
+ if (Q_UNLIKELY(bytes == -1))
qFatal("QQNX: failed to write navigator pps, errno=%d", errno);
// allocate buffer for pps data
@@ -110,7 +110,7 @@ bool QQnxNavigatorPps::sendPpsMessage(const QByteArray &message, const QByteArra
do {
errno = 0;
bytes = qt_safe_read(m_fd, buffer, ppsBufferSize - 1);
- if (bytes == -1)
+ if (Q_UNLIKELY(bytes == -1))
qFatal("QQNX: failed to read navigator pps, errno=%d", errno);
} while (bytes == 0);
@@ -125,7 +125,7 @@ bool QQnxNavigatorPps::sendPpsMessage(const QByteArray &message, const QByteArra
parsePPS(ppsData, responseFields);
if (responseFields.contains("res") && responseFields.value("res") == message) {
- if (responseFields.contains("err")) {
+ if (Q_UNLIKELY(responseFields.contains("err"))) {
qCritical() << "navigator responded with error: " << responseFields.value("err");
return false;
}
@@ -142,7 +142,7 @@ void QQnxNavigatorPps::parsePPS(const QByteArray &ppsData, QHash<QByteArray, QBy
QList<QByteArray> lines = ppsData.split('\n');
// validate pps object
- if (lines.size() == 0 || lines.at(0) != "@control")
+ if (Q_UNLIKELY(lines.empty() || lines.at(0) != "@control"))
qFatal("QQNX: unrecognized pps object, data=%s", ppsData.constData());
// parse pps object attributes and extract values
diff --git a/src/plugins/platforms/qnx/qqnxrasterwindow.cpp b/src/plugins/platforms/qnx/qqnxrasterwindow.cpp
index 933fce0e33..771986d763 100644
--- a/src/plugins/platforms/qnx/qqnxrasterwindow.cpp
+++ b/src/plugins/platforms/qnx/qqnxrasterwindow.cpp
@@ -61,7 +61,7 @@ QQnxRasterWindow::QQnxRasterWindow(QWindow *window, screen_context_t context, bo
const int val = SCREEN_USAGE_NATIVE | SCREEN_USAGE_READ | SCREEN_USAGE_WRITE;
const int result = screen_set_window_property_iv(nativeHandle(), SCREEN_PROPERTY_USAGE, &val);
- if (result != 0)
+ if (Q_UNLIKELY(result != 0))
qFatal("QQnxRasterWindow: failed to set window alpha usage, errno=%d", errno);
}
diff --git a/src/plugins/platforms/qnx/qqnxscreen.cpp b/src/plugins/platforms/qnx/qqnxscreen.cpp
index c4125ef177..7eaf50318c 100644
--- a/src/plugins/platforms/qnx/qqnxscreen.cpp
+++ b/src/plugins/platforms/qnx/qqnxscreen.cpp
@@ -584,10 +584,6 @@ void QQnxScreen::addWindow(QQnxWindow *window)
else
m_childWindows.push_back(window);
updateHierarchy();
- } else {
-#if defined(Q_OS_BLACKBERRY)
- m_coverWindow = window;
-#endif
}
}
diff --git a/src/plugins/platforms/qnx/qqnxscreeneventhandler.cpp b/src/plugins/platforms/qnx/qqnxscreeneventhandler.cpp
index 6c9532c428..781c6f28af 100644
--- a/src/plugins/platforms/qnx/qqnxscreeneventhandler.cpp
+++ b/src/plugins/platforms/qnx/qqnxscreeneventhandler.cpp
@@ -254,13 +254,8 @@ void QQnxScreenEventHandler::handleKeyboardEvent(screen_event_t event)
"Failed to query event cap");
int sequenceId = 0;
-#if defined(Q_OS_BLACKBERRY)
- Q_SCREEN_CHECKERROR(
- screen_get_event_property_iv(event, SCREEN_PROPERTY_SEQUENCE_ID, &sequenceId),
- "Failed to query event seqId");
-#endif
-
bool inject = true;
+
Q_FOREACH (QQnxScreenEventFilter *filter, m_eventFilters) {
if (filter->handleKeyboardEvent(flags, sym, modifiers, scan, cap, sequenceId)) {
inject = false;
@@ -584,12 +579,12 @@ void QQnxScreenEventHandler::handlePropertyEvent(screen_event_t event)
errno = 0;
screen_window_t window = 0;
- if (screen_get_event_property_pv(event, SCREEN_PROPERTY_WINDOW, (void**)&window) != 0)
+ if (Q_UNLIKELY(screen_get_event_property_pv(event, SCREEN_PROPERTY_WINDOW, (void**)&window) != 0))
qFatal("QQnx: failed to query window property, errno=%d", errno);
errno = 0;
int property;
- if (screen_get_event_property_iv(event, SCREEN_PROPERTY_NAME, &property) != 0)
+ if (Q_UNLIKELY(screen_get_event_property_iv(event, SCREEN_PROPERTY_NAME, &property) != 0))
qFatal("QQnx: failed to query window property, errno=%d", errno);
switch (property) {
@@ -606,7 +601,7 @@ void QQnxScreenEventHandler::handleKeyboardFocusPropertyEvent(screen_window_t wi
{
errno = 0;
int focus = 0;
- if (window && screen_get_window_property_iv(window, SCREEN_PROPERTY_KEYBOARD_FOCUS, &focus) != 0)
+ if (Q_UNLIKELY(window && screen_get_window_property_iv(window, SCREEN_PROPERTY_KEYBOARD_FOCUS, &focus) != 0))
qFatal("QQnx: failed to query keyboard focus property, errno=%d", errno);
QWindow *focusWindow = QQnxIntegration::window(window);
diff --git a/src/plugins/platforms/qnx/qqnxsystemsettings.cpp b/src/plugins/platforms/qnx/qqnxsystemsettings.cpp
deleted file mode 100644
index 243630ec85..0000000000
--- a/src/plugins/platforms/qnx/qqnxsystemsettings.cpp
+++ /dev/null
@@ -1,74 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2012 Research In Motion
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qqnxsystemsettings.h"
-
-#include <QFont>
-#include <qpa/qplatformfontdatabase.h>
-
-QT_BEGIN_NAMESPACE
-
-QHash<QPlatformTheme::Font, QFont *> qt_qnx_createRoleFonts(QPlatformFontDatabase *fontDatabase)
-{
- // See http://docs.blackberry.com/en/developers/deliverables/41577/typography.jsp
- // which recommends using
- // - small font size of 6 points
- // - normal font size of 8 points
- // - 11 points for titles (not covered by the theme system).
- QFont baseFont = fontDatabase->defaultFont();
- baseFont.setPointSize(8);
-
- QHash<QPlatformTheme::Font, QFont *> fonts;
- fonts.insert(QPlatformTheme::SystemFont, new QFont(baseFont));
- fonts.insert(QPlatformTheme::PushButtonFont, new QFont(baseFont));
- fonts.insert(QPlatformTheme::ListViewFont, new QFont(baseFont));
- fonts.insert(QPlatformTheme::ListBoxFont, new QFont(baseFont));
- fonts.insert(QPlatformTheme::TitleBarFont, new QFont(baseFont));
- fonts.insert(QPlatformTheme::MenuFont, new QFont(baseFont));
- fonts.insert(QPlatformTheme::ComboMenuItemFont, new QFont(baseFont));
- fonts.insert(QPlatformTheme::HeaderViewFont, new QFont(baseFont));
- fonts.insert(QPlatformTheme::TipLabelFont, new QFont(baseFont));
- fonts.insert(QPlatformTheme::LabelFont, new QFont(baseFont));
- fonts.insert(QPlatformTheme::ToolButtonFont, new QFont(baseFont));
- fonts.insert(QPlatformTheme::MenuItemFont, new QFont(baseFont));
- fonts.insert(QPlatformTheme::ComboLineEditFont, new QFont(baseFont));
-
- QFont smallFont(baseFont);
- smallFont.setPointSize(6);
- fonts.insert(QPlatformTheme::SmallFont, new QFont(smallFont));
- fonts.insert(QPlatformTheme::MiniFont, new QFont(smallFont));
-
- return fonts;
-}
-
-QT_END_NAMESPACE
diff --git a/src/plugins/platforms/qnx/qqnxsystemsettings.h b/src/plugins/platforms/qnx/qqnxsystemsettings.h
deleted file mode 100644
index 6a99d5a70c..0000000000
--- a/src/plugins/platforms/qnx/qqnxsystemsettings.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2012 Research In Motion
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQNXSYSTEMSETTINGS_H
-#define QQNXSYSTEMSETTINGS_H
-
-#include <QtCore/qhash.h>
-#include <qpa/qplatformtheme.h>
-
-QT_BEGIN_NAMESPACE
-
-class QPlatformFontDatabase;
-
-QHash<QPlatformTheme::Font, QFont *> qt_qnx_createRoleFonts(QPlatformFontDatabase *fontDatabase);
-
-QT_END_NAMESPACE
-
-#endif // QQNXSYSTEMSETTINGS_H
diff --git a/src/plugins/platforms/qnx/qqnxvirtualkeyboardbps.cpp b/src/plugins/platforms/qnx/qqnxvirtualkeyboardbps.cpp
deleted file mode 100644
index b55ae842ed..0000000000
--- a/src/plugins/platforms/qnx/qqnxvirtualkeyboardbps.cpp
+++ /dev/null
@@ -1,217 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2013 BlackBerry Limited. All rights reserved.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qqnxvirtualkeyboardbps.h"
-
-#include <QDebug>
-
-#include <bps/event.h>
-#include <bps/locale.h>
-#include <bps/virtualkeyboard.h>
-#if defined(Q_OS_BLACKBERRY)
-#include <bbndk.h>
-#endif
-
-#if defined(QQNXVIRTUALKEYBOARD_DEBUG)
-#define qVirtualKeyboardDebug qDebug
-#else
-#define qVirtualKeyboardDebug QT_NO_QDEBUG_MACRO
-#endif
-
-QT_BEGIN_NAMESPACE
-
-QQnxVirtualKeyboardBps::QQnxVirtualKeyboardBps(QObject *parent)
- : QQnxAbstractVirtualKeyboard(parent)
-{
- if (locale_request_events(0) != BPS_SUCCESS)
- qWarning("QQNX: Failed to register for locale events");
-
- if (virtualkeyboard_request_events(0) != BPS_SUCCESS)
- qWarning("QQNX: Failed to register for virtual keyboard events");
-
- int height = 0;
- if (virtualkeyboard_get_height(&height) != BPS_SUCCESS)
- qWarning("QQNX: Failed to get virtual keyboard height");
-
- setHeight(height);
-}
-
-bool QQnxVirtualKeyboardBps::handleEvent(bps_event_t *event)
-{
- const int eventDomain = bps_event_get_domain(event);
- if (eventDomain == locale_get_domain())
- return handleLocaleEvent(event);
-
- if (eventDomain == virtualkeyboard_get_domain())
- return handleVirtualKeyboardEvent(event);
-
- return false;
-}
-
-bool QQnxVirtualKeyboardBps::showKeyboard()
-{
- qVirtualKeyboardDebug() << "current visibility=" << isVisible();
-
- // They keyboard's mode is global between applications, we have to set it each time
- if ( !isVisible() )
- applyKeyboardOptions();
-
- virtualkeyboard_show();
- return true;
-}
-
-bool QQnxVirtualKeyboardBps::hideKeyboard()
-{
- qVirtualKeyboardDebug() << "current visibility=" << isVisible();
- virtualkeyboard_hide();
- return true;
-}
-
-void QQnxVirtualKeyboardBps::applyKeyboardOptions()
-{
- virtualkeyboard_layout_t layout = keyboardLayout();
- virtualkeyboard_enter_t enter = enterKey();
-
- qVirtualKeyboardDebug() << "mode=" << keyboardMode() << "enterKey=" << enterKeyType();
-
- virtualkeyboard_change_options(layout, enter);
-}
-
-virtualkeyboard_layout_t QQnxVirtualKeyboardBps::keyboardLayout() const
-{
- switch (keyboardMode()) {
- case Url:
- return VIRTUALKEYBOARD_LAYOUT_URL;
- case Email:
- return VIRTUALKEYBOARD_LAYOUT_EMAIL;
- case Web:
- return VIRTUALKEYBOARD_LAYOUT_WEB;
- case NumPunc:
- return VIRTUALKEYBOARD_LAYOUT_NUM_PUNC;
- case Number:
- return VIRTUALKEYBOARD_LAYOUT_NUMBER;
- case Symbol:
- return VIRTUALKEYBOARD_LAYOUT_SYMBOL;
- case Phone:
- return VIRTUALKEYBOARD_LAYOUT_PHONE;
- case Pin:
- return VIRTUALKEYBOARD_LAYOUT_PIN;
- case Password:
- return VIRTUALKEYBOARD_LAYOUT_PASSWORD;
-#if defined(Q_OS_BLACKBERRY)
-#if BBNDK_VERSION_AT_LEAST(10, 2, 1)
- case Alphanumeric:
- return VIRTUALKEYBOARD_LAYOUT_ALPHANUMERIC;
-#endif
-#endif
- case Default: // fall through
- default:
- return VIRTUALKEYBOARD_LAYOUT_DEFAULT;
- }
-
- return VIRTUALKEYBOARD_LAYOUT_DEFAULT;
-}
-
-virtualkeyboard_enter_t QQnxVirtualKeyboardBps::enterKey() const
-{
- switch (enterKeyType()) {
- case Connect:
- return VIRTUALKEYBOARD_ENTER_CONNECT;
- case Done:
- return VIRTUALKEYBOARD_ENTER_DONE;
- case Go:
- return VIRTUALKEYBOARD_ENTER_GO;
- case Join:
- return VIRTUALKEYBOARD_ENTER_JOIN;
- case Next:
- return VIRTUALKEYBOARD_ENTER_NEXT;
- case Search:
- return VIRTUALKEYBOARD_ENTER_SEARCH;
- case Send:
- return VIRTUALKEYBOARD_ENTER_SEND;
- case Submit:
- return VIRTUALKEYBOARD_ENTER_SUBMIT;
- case Default: // fall through
- default:
- return VIRTUALKEYBOARD_ENTER_DEFAULT;
- }
-
- return VIRTUALKEYBOARD_ENTER_DEFAULT;
-}
-
-bool QQnxVirtualKeyboardBps::handleLocaleEvent(bps_event_t *event)
-{
- if (bps_event_get_code(event) == LOCALE_INFO) {
- const QString language = QString::fromLatin1(locale_event_get_language(event));
- const QString country = QString::fromLatin1(locale_event_get_country(event));
- const QLocale newLocale(language + QLatin1Char('_') + country);
-
- qVirtualKeyboardDebug() << "current locale" << locale() << "new locale=" << newLocale;
- setLocale(newLocale);
- return true;
- }
-
- qVirtualKeyboardDebug() << "Unhandled locale event. code=" << bps_event_get_code(event);
-
- return false;
-}
-
-bool QQnxVirtualKeyboardBps::handleVirtualKeyboardEvent(bps_event_t *event)
-{
- switch (bps_event_get_code(event)) {
- case VIRTUALKEYBOARD_EVENT_VISIBLE:
- qVirtualKeyboardDebug() << "EVENT VISIBLE: current visibility=" << isVisible();
- setVisible(true);
- break;
-
- case VIRTUALKEYBOARD_EVENT_HIDDEN:
- qVirtualKeyboardDebug() << "EVENT HIDDEN: current visibility=" << isVisible();
- setVisible(false);
- break;
-
- case VIRTUALKEYBOARD_EVENT_INFO: {
- const int newHeight = virtualkeyboard_event_get_height(event);
- qVirtualKeyboardDebug() << "EVENT INFO: current height=" << height() << "new height=" << newHeight;
- setHeight(newHeight);
- break;
- }
-
- default:
- qVirtualKeyboardDebug() << "Unhandled virtual keyboard event. code=" << bps_event_get_code(event);
- return false;
- }
-
- return true;
-}
-
-QT_END_NAMESPACE
diff --git a/src/plugins/platforms/qnx/qqnxvirtualkeyboardbps.h b/src/plugins/platforms/qnx/qqnxvirtualkeyboardbps.h
deleted file mode 100644
index a720c5d894..0000000000
--- a/src/plugins/platforms/qnx/qqnxvirtualkeyboardbps.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2012 Research In Motion
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QQNXVIRTUALKEYBOARDBPS_H
-#define QQNXVIRTUALKEYBOARDBPS_H
-
-#include "qqnxabstractvirtualkeyboard.h"
-#include <bps/virtualkeyboard.h>
-
-struct bps_event_t;
-
-QT_BEGIN_NAMESPACE
-
-class QQnxVirtualKeyboardBps : public QQnxAbstractVirtualKeyboard
-{
- Q_OBJECT
-public:
- explicit QQnxVirtualKeyboardBps(QObject *parent = 0);
-
- bool handleEvent(bps_event_t *event);
-
- bool showKeyboard();
- bool hideKeyboard();
-
-protected:
- void applyKeyboardOptions();
-
-private:
- bool handleLocaleEvent(bps_event_t *event);
- bool handleVirtualKeyboardEvent(bps_event_t *event);
-
- virtualkeyboard_layout_t keyboardLayout() const;
- virtualkeyboard_enter_t enterKey() const;
-};
-
-QT_END_NAMESPACE
-
-#endif // QQNXVIRTUALKEYBOARDBPS_H
diff --git a/src/plugins/platforms/qnx/qqnxvirtualkeyboardpps.cpp b/src/plugins/platforms/qnx/qqnxvirtualkeyboardpps.cpp
index d5a9a49ac6..880a914c84 100644
--- a/src/plugins/platforms/qnx/qqnxvirtualkeyboardpps.cpp
+++ b/src/plugins/platforms/qnx/qqnxvirtualkeyboardpps.cpp
@@ -127,7 +127,7 @@ bool QQnxVirtualKeyboardPps::connect()
}
m_buffer = new char[ms_bufferSize];
- if (!m_buffer) {
+ if (Q_UNLIKELY(!m_buffer)) {
qCritical("QQnxVirtualKeyboard: Unable to allocate buffer of %d bytes. "
"Size is unavailable.", ms_bufferSize);
return false;
@@ -170,7 +170,7 @@ void QQnxVirtualKeyboardPps::ppsDataReady()
return;
// nread is the real space necessary, not the amount read.
- if (static_cast<size_t>(nread) > ms_bufferSize - 1) {
+ if (Q_UNLIKELY(static_cast<size_t>(nread) > ms_bufferSize - 1)) {
qCritical("QQnxVirtualKeyboard: Keyboard buffer size too short; need %u.", nread + 1);
connect(); // reconnect
return;
@@ -184,7 +184,7 @@ void QQnxVirtualKeyboardPps::ppsDataReady()
#endif
const char *value;
- if (pps_decoder_get_string(m_decoder, "error", &value) == PPS_DECODER_OK) {
+ if (Q_UNLIKELY(pps_decoder_get_string(m_decoder, "error", &value) == PPS_DECODER_OK)) {
qCritical("QQnxVirtualKeyboard: Keyboard PPS decoder error: %s", value ? value : "[null]");
return;
}
@@ -214,11 +214,11 @@ void QQnxVirtualKeyboardPps::handleKeyboardInfoMessage()
{
int newHeight = 0;
- if (pps_decoder_push(m_decoder, "dat") != PPS_DECODER_OK) {
+ if (Q_UNLIKELY(pps_decoder_push(m_decoder, "dat") != PPS_DECODER_OK)) {
qCritical("QQnxVirtualKeyboard: Keyboard PPS dat object not found");
return;
}
- if (pps_decoder_get_int(m_decoder, "size", &newHeight) != PPS_DECODER_OK) {
+ if (Q_UNLIKELY(pps_decoder_get_int(m_decoder, "size", &newHeight) != PPS_DECODER_OK)) {
qCritical("QQnxVirtualKeyboard: Keyboard PPS size field not found");
return;
}
diff --git a/src/plugins/platforms/qnx/qqnxwindow.cpp b/src/plugins/platforms/qnx/qqnxwindow.cpp
index 4dc1248bd1..47888178c4 100644
--- a/src/plugins/platforms/qnx/qqnxwindow.cpp
+++ b/src/plugins/platforms/qnx/qqnxwindow.cpp
@@ -47,12 +47,6 @@
#include <QtCore/QDebug>
-#if defined(Q_OS_BLACKBERRY)
-#include "qqnxnavigatorcover.h"
-#include <sys/pps.h>
-#include <bps/navigator.h>
-#endif
-
#include <errno.h>
#if defined(QQNXWINDOW_DEBUG)
@@ -378,7 +372,7 @@ void QQnxWindow::setBufferSize(const QSize &size)
screen_get_window_property_iv(m_window, SCREEN_PROPERTY_RENDER_BUFFER_COUNT, &bufferCount),
"Failed to query render buffer count");
- if (bufferCount != MAX_BUFFER_COUNT) {
+ if (Q_UNLIKELY(bufferCount != MAX_BUFFER_COUNT)) {
qFatal("QQnxWindow: invalid buffer count. Expected = %d, got = %d.",
MAX_BUFFER_COUNT, bufferCount);
}
@@ -456,10 +450,10 @@ void QQnxWindow::removeFromParent()
qWindowDebug() << "window =" << window();
// Remove from old Hierarchy position
if (m_parentWindow) {
- if (m_parentWindow->m_childWindows.removeAll(this))
- m_parentWindow = 0;
- else
+ if (Q_UNLIKELY(!m_parentWindow->m_childWindows.removeAll(this)))
qFatal("QQnxWindow: Window Hierarchy broken; window has parent, but parent hasn't got child.");
+ else
+ m_parentWindow = 0;
} else if (m_screen) {
m_screen->removeWindow(this);
}
@@ -633,23 +627,7 @@ QQnxWindow *QQnxWindow::findWindow(screen_window_t windowHandle)
void QQnxWindow::minimize()
{
-#if defined(Q_OS_BLACKBERRY)
- qWindowDebug();
-
- pps_encoder_t encoder;
-
- pps_encoder_initialize(&encoder, false);
- pps_encoder_add_string(&encoder, "msg", "minimizeWindow");
-
- if (navigator_raw_write(pps_encoder_buffer(&encoder),
- pps_encoder_length(&encoder)) != BPS_SUCCESS) {
- qWindowDebug() << "navigator_raw_write failed:" << strerror(errno);
- }
-
- pps_encoder_cleanup(&encoder);
-#else
qWarning("Qt::WindowMinimized is not supported by this OS version");
-#endif
}
void QQnxWindow::setRotation(int rotation)
@@ -686,18 +664,8 @@ void QQnxWindow::initWindow()
QQnxScreen *platformScreen = static_cast<QQnxScreen *>(window()->screen()->handle());
setScreen(platformScreen);
- if (window()->type() == Qt::CoverWindow) {
-#if defined(Q_OS_BLACKBERRY)
- if (platformScreen->rootWindow()) {
- screen_set_window_property_pv(m_screen->rootWindow()->nativeHandle(),
- SCREEN_PROPERTY_ALTERNATE_WINDOW, (void**)&m_window);
- m_cover.reset(new QQnxNavigatorCover);
- } else {
- qWarning("No root window for cover window");
- }
-#endif
+ if (window()->type() == Qt::CoverWindow)
m_exposed = false;
- }
// Add window to plugin's window mapper
QQnxIntegration::addWindow(m_window, window());
diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp
index f2f6402889..217444d129 100644
--- a/src/plugins/platforms/windows/qwindowscontext.cpp
+++ b/src/plugins/platforms/windows/qwindowscontext.cpp
@@ -188,7 +188,7 @@ void QWindowsUser32DLL::init()
// MinGW (g++ 3.4.5) accepts only C casts.
setLayeredWindowAttributes = (SetLayeredWindowAttributes)(library.resolve("SetLayeredWindowAttributes"));
updateLayeredWindow = (UpdateLayeredWindow)(library.resolve("UpdateLayeredWindow"));
- if (!setLayeredWindowAttributes || !updateLayeredWindow)
+ if (Q_UNLIKELY(!setLayeredWindowAttributes || !updateLayeredWindow))
qFatal("This version of Windows is not supported (User32.dll is missing the symbols 'SetLayeredWindowAttributes', 'UpdateLayeredWindow').");
updateLayeredWindowIndirect = (UpdateLayeredWindowIndirect)(library.resolve("UpdateLayeredWindowIndirect"));
diff --git a/src/plugins/platforms/windows/qwindowscursor.cpp b/src/plugins/platforms/windows/qwindowscursor.cpp
index c769eb04a4..b946c34a2b 100644
--- a/src/plugins/platforms/windows/qwindowscursor.cpp
+++ b/src/plugins/platforms/windows/qwindowscursor.cpp
@@ -780,6 +780,21 @@ QPixmap QWindowsCursor::dragDefaultCursor(Qt::DropAction action) const
return m_ignoreDragCursor;
}
+HCURSOR QWindowsCursor::hCursor(const QCursor &c) const
+{
+ const Qt::CursorShape shape = c.shape();
+ if (shape == Qt::BitmapCursor) {
+ const auto pit = m_pixmapCursorCache.constFind(QWindowsPixmapCursorCacheKey(c));
+ if (pit != m_pixmapCursorCache.constEnd())
+ return pit.value()->handle();
+ } else {
+ const auto sit = m_standardCursorCache.constFind(shape);
+ if (sit != m_standardCursorCache.constEnd())
+ return sit.value()->handle();
+ }
+ return HCURSOR(0);
+}
+
/*!
\class QWindowsWindowCursor
\brief Per-Window cursor. Contains a QCursor and manages its associated system
diff --git a/src/plugins/platforms/windows/qwindowscursor.h b/src/plugins/platforms/windows/qwindowscursor.h
index e93f779f94..0e080f725a 100644
--- a/src/plugins/platforms/windows/qwindowscursor.h
+++ b/src/plugins/platforms/windows/qwindowscursor.h
@@ -115,6 +115,8 @@ public:
QPixmap dragDefaultCursor(Qt::DropAction action) const;
+ HCURSOR hCursor(const QCursor &c) const;
+
private:
typedef QHash<Qt::CursorShape, CursorHandlePtr> StandardCursorCache;
typedef QHash<QWindowsPixmapCursorCacheKey, CursorHandlePtr> PixmapCursorCache;
diff --git a/src/plugins/platforms/windows/qwindowsdrag.cpp b/src/plugins/platforms/windows/qwindowsdrag.cpp
index 021058fa33..c68f05b5bb 100644
--- a/src/plugins/platforms/windows/qwindowsdrag.cpp
+++ b/src/plugins/platforms/windows/qwindowsdrag.cpp
@@ -230,8 +230,6 @@ private:
};
typedef QMap<Qt::DropAction, CursorEntry> ActionCursorMap;
- typedef ActionCursorMap::Iterator ActionCursorMapIt;
- typedef ActionCursorMap::ConstIterator ActionCursorMapConstIt;
const Mode m_mode;
QWindowsDrag *m_drag;
@@ -312,7 +310,7 @@ void QWindowsOleDropSource::createCursors()
if (cursorPixmap.isNull() && platformCursor)
cursorPixmap = static_cast<QWindowsCursor *>(platformCursor)->dragDefaultCursor(action);
const qint64 cacheKey = cursorPixmap.cacheKey();
- const ActionCursorMapIt it = m_cursors.find(action);
+ const auto it = m_cursors.find(action);
if (it != m_cursors.end() && it.value().cacheKey == cacheKey)
continue;
if (cursorPixmap.isNull()) {
@@ -393,7 +391,7 @@ QWindowsOleDropSource::QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState)
{
HRESULT hr = S_OK;
do {
- if (fEscapePressed) {
+ if (fEscapePressed || QWindowsDrag::isCanceled()) {
hr = ResultFromScode(DRAGDROP_S_CANCEL);
break;
}
@@ -441,7 +439,7 @@ QWindowsOleDropSource::GiveFeedback(DWORD dwEffect)
m_drag->updateAction(action);
const qint64 currentCacheKey = m_drag->currentDrag()->dragCursor(action).cacheKey();
- ActionCursorMapConstIt it = m_cursors.constFind(action);
+ auto it = m_cursors.constFind(action);
// If a custom drag cursor is set, check its cache key to detect changes.
if (it == m_cursors.constEnd() || (currentCacheKey && currentCacheKey != it.value().cacheKey)) {
createCursors();
@@ -673,6 +671,8 @@ QWindowsOleDropTarget::Drop(LPDATAOBJECT pDataObj, DWORD grfKeyState,
\ingroup qt-lighthouse-win
*/
+bool QWindowsDrag::m_canceled = false;
+
QWindowsDrag::QWindowsDrag() :
m_dropDataObject(0), m_cachedDropTargetHelper(0)
{
@@ -714,6 +714,7 @@ Qt::DropAction QWindowsDrag::drag(QDrag *drag)
Qt::DropAction dragResult = Qt::IgnoreAction;
DWORD resultEffect;
+ QWindowsDrag::m_canceled = false;
QWindowsOleDropSource *windowDropSource = new QWindowsOleDropSource(this);
windowDropSource->createCursors();
QWindowsOleDataObject *dropDataObject = new QWindowsOleDataObject(dropData);
diff --git a/src/plugins/platforms/windows/qwindowsdrag.h b/src/plugins/platforms/windows/qwindowsdrag.h
index 890ad6c142..ebe949a6af 100644
--- a/src/plugins/platforms/windows/qwindowsdrag.h
+++ b/src/plugins/platforms/windows/qwindowsdrag.h
@@ -90,6 +90,8 @@ public:
Qt::DropAction drag(QDrag *drag) Q_DECL_OVERRIDE;
static QWindowsDrag *instance();
+ void cancelDrag() Q_DECL_OVERRIDE { QWindowsDrag::m_canceled = true; }
+ static bool isCanceled() { return QWindowsDrag::m_canceled; }
IDataObject *dropDataObject() const { return m_dropDataObject; }
void setDropDataObject(IDataObject *dataObject) { m_dropDataObject = dataObject; }
@@ -99,6 +101,8 @@ public:
IDropTargetHelper* dropHelper();
private:
+ static bool m_canceled;
+
QWindowsDropMimeData m_dropData;
IDataObject *m_dropDataObject;
diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp
index 8a2fbe1f6d..8d1bbc75a6 100644
--- a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp
+++ b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp
@@ -44,6 +44,7 @@
#include <QtCore/qmath.h>
#include <QtCore/QDebug>
+#include <QtCore/QFile>
#include <QtCore/QtEndian>
#include <QtCore/QThreadStorage>
#include <QtCore/private/qsystemlibrary_p.h>
@@ -1062,7 +1063,7 @@ QSharedPointer<QWindowsFontEngineData> sharedFontData()
{
FontEngineThreadLocalData *data = fontEngineThreadLocalData();
if (!data->hasLocalData())
- data->setLocalData(QSharedPointer<QWindowsFontEngineData>(new QWindowsFontEngineData));
+ data->setLocalData(QSharedPointer<QWindowsFontEngineData>::create());
return data->localData();
}
#else // !QT_NO_THREAD
@@ -1072,7 +1073,7 @@ QWindowsFontEngineDataPtr sharedFontData()
{
QWindowsFontEngineDataPtr *data = fontEngineData();
if (data->isNull())
- *data = QWindowsFontEngineDataPtr(new QWindowsFontEngineData);
+ *data = QWindowsFontEngineDataPtr::create();
return *data;
}
#endif // QT_NO_THREAD
@@ -1605,7 +1606,7 @@ LOGFONT QWindowsFontDatabase::fontDefToLOGFONT(const QFontDef &request)
lf.lfPitchAndFamily = DEFAULT_PITCH | hint;
QString fam = request.family;
- if (fam.size() >= LF_FACESIZE) {
+ if (Q_UNLIKELY(fam.size() >= LF_FACESIZE)) {
qCritical("%s: Family name '%s' is too long.", __FUNCTION__, qPrintable(fam));
fam.truncate(LF_FACESIZE - 1);
}
diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp
index 1b6ee0f383..183c198806 100644
--- a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp
+++ b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp
@@ -145,10 +145,8 @@ static FontKeys &fontKeys()
static const FontKey *findFontKey(const QString &name, int *indexIn = Q_NULLPTR)
{
- typedef FontKeys::ConstIterator ConstIt;
-
const FontKeys &keys = fontKeys();
- for (ConstIt it = keys.constBegin(), cend = keys.constEnd(); it != cend; ++it) {
+ for (auto it = keys.constBegin(), cend = keys.constEnd(); it != cend; ++it) {
const int index = it->fontNames.indexOf(name);
if (index >= 0) {
if (indexIn)
diff --git a/src/plugins/platforms/windows/qwindowsfontengine.cpp b/src/plugins/platforms/windows/qwindowsfontengine.cpp
index 30417f7cee..41fa8c015d 100644
--- a/src/plugins/platforms/windows/qwindowsfontengine.cpp
+++ b/src/plugins/platforms/windows/qwindowsfontengine.cpp
@@ -54,6 +54,7 @@
#include <QtGui/private/qpaintengine_raster_p.h>
#include <QtCore/QtEndian>
+#include <QtCore/QFile>
#include <QtCore/qmath.h>
#include <QtCore/QThreadStorage>
#include <QtCore/private/qsystemlibrary_p.h>
@@ -196,7 +197,7 @@ void QWindowsFontEngine::getCMap()
designToDevice = QFixed((int)otm->otmEMSquare)/QFixed::fromReal(fontDef.pixelSize);
unitsPerEm = otm->otmEMSquare;
x_height = (int)otm->otmsXHeight;
- loadKerningPairs(QFixed((int)otm->otmEMSquare)/int(otm->otmTextMetrics.tmHeight));
+ loadKerningPairs(designToDevice);
_faceId.filename = QFile::encodeName(QString::fromWCharArray((wchar_t *)((char *)otm + (quintptr)otm->otmpFullName)));
lineWidth = otm->otmsUnderscoreSize;
fsType = otm->otmfsType;
diff --git a/src/plugins/platforms/windows/qwindowsinputcontext.cpp b/src/plugins/platforms/windows/qwindowsinputcontext.cpp
index 7e1cc563cb..56b5561756 100644
--- a/src/plugins/platforms/windows/qwindowsinputcontext.cpp
+++ b/src/plugins/platforms/windows/qwindowsinputcontext.cpp
@@ -484,7 +484,8 @@ bool QWindowsInputContext::composition(HWND hwnd, LPARAM lParamIn)
if (lParam & GCS_RESULTSTR) {
// A fixed result, return the converted string
event->setCommitString(getCompositionString(himc, GCS_RESULTSTR));
- endContextComposition();
+ if (!(lParam & GCS_DELTASTART))
+ endContextComposition();
}
const bool result = QCoreApplication::sendEvent(m_compositionContext.focusObject, event.data());
qCDebug(lcQpaInputMethods) << '<' << __FUNCTION__ << "sending markup="
diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp
index 55e6d55e5b..f43265be67 100644
--- a/src/plugins/platforms/windows/qwindowsintegration.cpp
+++ b/src/plugins/platforms/windows/qwindowsintegration.cpp
@@ -61,6 +61,7 @@
#if !defined(Q_OS_WINCE) && !defined(QT_NO_SESSIONMANAGER)
# include "qwindowssessionmanager.h"
#endif
+#include <QtGui/qtouchdevice.h>
#include <QtGui/private/qguiapplication_p.h>
#include <QtGui/private/qhighdpiscaling_p.h>
#include <QtGui/qpa/qplatforminputcontextfactory_p.h>
@@ -220,11 +221,13 @@ QWindowsIntegrationPrivate::QWindowsIntegrationPrivate(const QStringList &paramL
if (tabletAbsoluteRange >= 0)
m_context.setTabletAbsoluteRange(tabletAbsoluteRange);
if (!dpiAwarenessSet) { // Set only once in case of repeated instantiations of QGuiApplication.
- m_context.setProcessDpiAwareness(dpiAwareness);
+ if (!QCoreApplication::testAttribute(Qt::AA_PluginApplication)) {
+ m_context.setProcessDpiAwareness(dpiAwareness);
+ qCDebug(lcQpaWindows)
+ << __FUNCTION__ << "DpiAwareness=" << dpiAwareness;
+ }
dpiAwarenessSet = true;
}
- qCDebug(lcQpaWindows)
- << __FUNCTION__ << "DpiAwareness=" << dpiAwareness;
m_context.initTouch(m_options);
}
@@ -593,4 +596,9 @@ QPlatformServices *QWindowsIntegration::services() const
return &d->m_services;
}
+void QWindowsIntegration::beep() const
+{
+ MessageBeep(MB_OK); // For QApplication
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/windows/qwindowsintegration.h b/src/plugins/platforms/windows/qwindowsintegration.h
index cb10bf08f5..a93e2c9856 100644
--- a/src/plugins/platforms/windows/qwindowsintegration.h
+++ b/src/plugins/platforms/windows/qwindowsintegration.h
@@ -96,6 +96,8 @@ public:
unsigned options() const;
+ void beep() const Q_DECL_OVERRIDE;
+
#if !defined(Q_OS_WINCE) && !defined(QT_NO_SESSIONMANAGER)
QPlatformSessionManager *createPlatformSessionManager(const QString &id, const QString &key) const Q_DECL_OVERRIDE;
#endif
diff --git a/src/plugins/platforms/windows/qwindowsmousehandler.cpp b/src/plugins/platforms/windows/qwindowsmousehandler.cpp
index e26010b5c4..80f3d3e2b8 100644
--- a/src/plugins/platforms/windows/qwindowsmousehandler.cpp
+++ b/src/plugins/platforms/windows/qwindowsmousehandler.cpp
@@ -41,6 +41,7 @@
#include <qpa/qwindowsysteminterface.h>
#include <QtGui/QGuiApplication>
#include <QtGui/QScreen>
+#include <QtGui/QTouchDevice>
#include <QtGui/QWindow>
#include <QtGui/QCursor>
diff --git a/src/plugins/platforms/windows/qwindowsnativeimage.cpp b/src/plugins/platforms/windows/qwindowsnativeimage.cpp
index 66e64e64b4..56e18e20d7 100644
--- a/src/plugins/platforms/windows/qwindowsnativeimage.cpp
+++ b/src/plugins/platforms/windows/qwindowsnativeimage.cpp
@@ -96,7 +96,7 @@ static inline HBITMAP createDIB(HDC hdc, int width, int height,
void *bits = 0;
HBITMAP bitmap = CreateDIBSection(hdc, reinterpret_cast<BITMAPINFO *>(&bmi),
DIB_RGB_COLORS, &bits, 0, 0);
- if (!bitmap || !bits)
+ if (Q_UNLIKELY(!bitmap || !bits))
qFatal("%s: CreateDIBSection failed.", __FUNCTION__);
*bitsIn = (uchar*)bits;
diff --git a/src/plugins/platforms/windows/qwindowsnativeinterface.cpp b/src/plugins/platforms/windows/qwindowsnativeinterface.cpp
index 659ef79c18..c5c60aa882 100644
--- a/src/plugins/platforms/windows/qwindowsnativeinterface.cpp
+++ b/src/plugins/platforms/windows/qwindowsnativeinterface.cpp
@@ -34,6 +34,7 @@
#include "qwindowsnativeinterface.h"
#include "qwindowswindow.h"
#include "qwindowscontext.h"
+#include "qwindowscursor.h"
#include "qwindowsfontdatabase.h"
#include "qwindowsopenglcontext.h"
#include "qwindowsopengltester.h"
@@ -42,6 +43,8 @@
#include <QtGui/QWindow>
#include <QtGui/QOpenGLContext>
+#include <QtGui/QScreen>
+#include <qpa/qplatformscreen.h>
QT_BEGIN_NAMESPACE
@@ -102,6 +105,19 @@ void *QWindowsNativeInterface::nativeResourceForWindow(const QByteArray &resourc
return 0;
}
+#ifndef QT_NO_CURSOR
+void *QWindowsNativeInterface::nativeResourceForCursor(const QByteArray &resource, const QCursor &cursor)
+{
+ if (resource == QByteArrayLiteral("hcursor")) {
+ if (const QScreen *primaryScreen = QGuiApplication::primaryScreen()) {
+ if (const QPlatformCursor *pCursor= primaryScreen->handle()->cursor())
+ return static_cast<const QWindowsCursor *>(pCursor)->hCursor(cursor);
+ }
+ }
+ return Q_NULLPTR;
+}
+#endif // !QT_NO_CURSOR
+
static const char customMarginPropertyC[] = "WindowsCustomMargins";
QVariant QWindowsNativeInterface::windowProperty(QPlatformWindow *window, const QString &name) const
@@ -195,11 +211,6 @@ QString QWindowsNativeInterface::registerWindowClass(const QString &classNameIn,
return QWindowsContext::instance()->registerWindowClass(classNameIn, (WNDPROC)eventProc);
}
-void QWindowsNativeInterface::beep()
-{
- MessageBeep(MB_OK); // For QApplication
-}
-
bool QWindowsNativeInterface::asyncExpose() const
{
return QWindowsContext::instance()->asyncExpose();
diff --git a/src/plugins/platforms/windows/qwindowsnativeinterface.h b/src/plugins/platforms/windows/qwindowsnativeinterface.h
index 97839ae1ae..48de0f514d 100644
--- a/src/plugins/platforms/windows/qwindowsnativeinterface.h
+++ b/src/plugins/platforms/windows/qwindowsnativeinterface.h
@@ -66,15 +66,15 @@ public:
void *nativeResourceForContext(const QByteArray &resource, QOpenGLContext *context) Q_DECL_OVERRIDE;
#endif
void *nativeResourceForWindow(const QByteArray &resource, QWindow *window) Q_DECL_OVERRIDE;
-
+#ifndef QT_NO_CURSOR
+ void *nativeResourceForCursor(const QByteArray &resource, const QCursor &cursor) Q_DECL_OVERRIDE;
+#endif
Q_INVOKABLE void *createMessageWindow(const QString &classNameTemplate,
const QString &windowName,
void *eventProc) const;
Q_INVOKABLE QString registerWindowClass(const QString &classNameIn, void *eventProc) const;
- Q_INVOKABLE void beep();
-
Q_INVOKABLE void registerWindowsMime(void *mimeIn);
Q_INVOKABLE void unregisterWindowsMime(void *mime);
Q_INVOKABLE int registerMimeType(const QString &mimeType);
diff --git a/src/plugins/platforms/windows/qwindowstabletsupport.cpp b/src/plugins/platforms/windows/qwindowstabletsupport.cpp
index b27811df9e..d5aae9746d 100644
--- a/src/plugins/platforms/windows/qwindowstabletsupport.cpp
+++ b/src/plugins/platforms/windows/qwindowstabletsupport.cpp
@@ -391,6 +391,7 @@ bool QWindowsTabletSupport::translateTabletPacketEvent()
const int currentDevice = m_devices.at(m_currentDevice).currentDevice;
const int currentPointer = m_devices.at(m_currentDevice).currentPointerType;
+ const qint64 uniqueId = m_devices.at(m_currentDevice).uniqueId;
// The tablet can be used in 2 different modes, depending on it settings:
// 1) Absolute (pen) mode:
@@ -407,7 +408,7 @@ bool QWindowsTabletSupport::translateTabletPacketEvent()
const QRect virtualDesktopArea = QGuiApplication::primaryScreen()->virtualGeometry();
qCDebug(lcQpaTablet) << __FUNCTION__ << "processing " << packetCount
- << "target:" << QGuiApplicationPrivate::tabletPressTarget;
+ << "target:" << QGuiApplicationPrivate::tabletDevicePoint(uniqueId).target;
const Qt::KeyboardModifiers keyboardModifiers = QWindowsKeyMapper::queryKeyboardModifiers();
@@ -420,7 +421,7 @@ bool QWindowsTabletSupport::translateTabletPacketEvent()
QPointF globalPosF = m_oldGlobalPosF;
m_oldGlobalPosF = m_devices.at(m_currentDevice).scaleCoordinates(packet.pkX, packet.pkY, virtualDesktopArea);
- QWindow *target = QGuiApplicationPrivate::tabletPressTarget; // Pass to window that grabbed it.
+ QWindow *target = QGuiApplicationPrivate::tabletDevicePoint(uniqueId).target; // Pass to window that grabbed it.
QPoint globalPos = globalPosF.toPoint();
// Get Mouse Position and compare to tablet info
@@ -484,7 +485,7 @@ bool QWindowsTabletSupport::translateTabletPacketEvent()
static_cast<Qt::MouseButtons>(packet.pkButtons),
pressureNew, tiltX, tiltY,
tangentialPressure, rotation, z,
- m_devices.at(m_currentDevice).uniqueId,
+ uniqueId,
keyboardModifiers);
}
return true;
diff --git a/src/plugins/platforms/winrt/qwinrteglcontext.cpp b/src/plugins/platforms/winrt/qwinrteglcontext.cpp
index 3fd0278360..1008e1c5e8 100644
--- a/src/plugins/platforms/winrt/qwinrteglcontext.cpp
+++ b/src/plugins/platforms/winrt/qwinrteglcontext.cpp
@@ -55,7 +55,7 @@ struct WinRTEGLDisplay
{
WinRTEGLDisplay() {
eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
- if (eglDisplay == EGL_NO_DISPLAY)
+ if (Q_UNLIKELY(eglDisplay == EGL_NO_DISPLAY))
qCritical("Failed to initialize EGL display: 0x%x", eglGetError());
}
~WinRTEGLDisplay() {
@@ -114,10 +114,10 @@ void QWinRTEGLContext::initialize()
EGL_NONE,
};
g->eglDisplay = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, displayAttributes);
- if (g->eglDisplay == EGL_NO_DISPLAY)
+ if (Q_UNLIKELY(g->eglDisplay == EGL_NO_DISPLAY))
qCritical("Failed to initialize EGL display: 0x%x", eglGetError());
- if (!eglInitialize(g->eglDisplay, nullptr, nullptr))
+ if (Q_UNLIKELY(!eglInitialize(g->eglDisplay, nullptr, nullptr)))
qCritical("Failed to initialize EGL: 0x%x", eglGetError());
d->eglConfig = q_configFromGLFormat(g->eglDisplay, d->format);
diff --git a/src/plugins/platforms/winrt/qwinrtwindow.cpp b/src/plugins/platforms/winrt/qwinrtwindow.cpp
index bec94c1e51..8a53047d1e 100644
--- a/src/plugins/platforms/winrt/qwinrtwindow.cpp
+++ b/src/plugins/platforms/winrt/qwinrtwindow.cpp
@@ -180,7 +180,7 @@ QWinRTWindow::~QWinRTWindow()
EGLBoolean value = eglDestroySurface(d->display, d->surface);
d->surface = EGL_NO_SURFACE;
- if (value == EGL_FALSE)
+ if (Q_UNLIKELY(value == EGL_FALSE))
qCritical("Failed to destroy EGL window surface: 0x%x", eglGetError());
}
@@ -321,7 +321,7 @@ void QWinRTWindow::createEglSurface(EGLDisplay display, EGLConfig config)
d->surface = eglCreateWindowSurface(display, config,
reinterpret_cast<EGLNativeWindowType>(winId()),
nullptr);
- if (d->surface == EGL_NO_SURFACE)
+ if (Q_UNLIKELY(d->surface == EGL_NO_SURFACE))
qCritical("Failed to create EGL window surface: 0x%x", eglGetError());
return S_OK;
});
diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
index 37f01d4eed..e1fb63fbc4 100644
--- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
+++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
@@ -99,7 +99,7 @@ static Window createDummyWindow(Display *dpy, XVisualInfo *visualInfo, int scree
static Window createDummyWindow(Display *dpy, GLXFBConfig config, int screenNumber, Window rootWin)
{
XVisualInfo *visualInfo = glXGetVisualFromFBConfig(dpy, config);
- if (!visualInfo)
+ if (Q_UNLIKELY(!visualInfo))
qFatal("Could not initialize GLX");
Window window = createDummyWindow(dpy, visualInfo, screenNumber, rootWin);
XFree(visualInfo);
@@ -301,7 +301,7 @@ void QGLXContext::init(QXcbScreen *screen, QPlatformOpenGLContext *share)
// Note that m_format gets updated with the used surface format
visualInfo = qglx_findVisualInfo(m_display, screen->screenNumber(), &m_format);
- if (!visualInfo)
+ if (Q_UNLIKELY(!visualInfo))
qFatal("Could not initialize GLX");
m_context = glXCreateContext(m_display, visualInfo, m_shareContext, true);
if (!m_context && m_shareContext) {
diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index 231fe9af3f..e28d84cf92 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -555,7 +555,7 @@ QXcbConnection::QXcbConnection(QXcbNativeInterface *nativeInterface, bool canGra
m_connection = xcb_connect(m_displayName.constData(), &m_primaryScreenNumber);
#endif //XCB_USE_XLIB
- if (!m_connection || xcb_connection_has_error(m_connection))
+ if (Q_UNLIKELY(!m_connection || xcb_connection_has_error(m_connection)))
qFatal("QXcbConnection: Could not connect to display %s", m_displayName.constData());
@@ -965,17 +965,20 @@ void QXcbConnection::handleXcbError(xcb_generic_error_t *error)
int i = 0;
for (; i < m_callLog.size(); ++i) {
if (m_callLog.at(i).sequence == error->sequence) {
- qDebug("Caused by: %s:%d", qPrintable(m_callLog.at(i).file), m_callLog.at(i).line);
+ qDebug("Caused by: %s:%d", m_callLog.at(i).file.constData(), m_callLog.at(i).line);
break;
} else if (m_callLog.at(i).sequence > error->sequence) {
- qDebug("Caused some time before: %s:%d", qPrintable(m_callLog.at(i).file), m_callLog.at(i).line);
+ qDebug("Caused some time before: %s:%d", m_callLog.at(i).file.constData(),
+ m_callLog.at(i).line);
if (i > 0)
- qDebug("and after: %s:%d", qPrintable(m_callLog.at(i-1).file), m_callLog.at(i-1).line);
+ qDebug("and after: %s:%d", m_callLog.at(i-1).file.constData(),
+ m_callLog.at(i-1).line);
break;
}
}
if (i == m_callLog.size() && !m_callLog.isEmpty())
- qDebug("Caused some time after: %s:%d", qPrintable(m_callLog.first().file), m_callLog.first().line);
+ qDebug("Caused some time after: %s:%d", m_callLog.first().file.constData(),
+ m_callLog.first().line);
#endif
}
diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h
index fb7cc137b9..4acca7d374 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.h
+++ b/src/plugins/platforms/xcb/qxcbconnection.h
@@ -628,7 +628,11 @@ private:
QMutex m_callLogMutex;
void log(const char *file, int line, int sequence);
template <typename cookie_t>
- friend cookie_t q_xcb_call_template(const cookie_t &cookie, QXcbConnection *connection, const char *file, int line);
+ friend cookie_t q_xcb_call_template(const cookie_t &cookie, QXcbConnection *connection,
+ const char *file, int line);
+ template <typename reply_t>
+ friend reply_t *q_xcb_call_template(reply_t *reply, QXcbConnection *connection,
+ const char *file, int line);
#endif
WindowMapper m_mapper;
@@ -691,11 +695,19 @@ private:
#ifdef Q_XCB_DEBUG
template <typename cookie_t>
-cookie_t q_xcb_call_template(const cookie_t &cookie, QXcbConnection *connection, const char *file, int line)
+cookie_t q_xcb_call_template(const cookie_t &cookie, QXcbConnection *connection, const char *file,
+ int line)
{
connection->log(file, line, cookie.sequence);
return cookie;
}
+
+template <typename reply_t>
+reply_t *q_xcb_call_template(reply_t *reply, QXcbConnection *connection, const char *file, int line)
+{
+ connection->log(file, line, reply->sequence);
+ return reply;
+}
#define Q_XCB_CALL(x) q_xcb_call_template(x, connection(), __FILE__, __LINE__)
#define Q_XCB_CALL2(x, connection) q_xcb_call_template(x, connection, __FILE__, __LINE__)
#define Q_XCB_NOOP(c) q_xcb_call_template(xcb_no_operation(c->xcb_connection()), c, __FILE__, __LINE__);
diff --git a/src/plugins/platforms/xcb/qxcbcursor.h b/src/plugins/platforms/xcb/qxcbcursor.h
index 3c6dece1f2..f6c1d9db90 100644
--- a/src/plugins/platforms/xcb/qxcbcursor.h
+++ b/src/plugins/platforms/xcb/qxcbcursor.h
@@ -77,6 +77,11 @@ public:
static void queryPointer(QXcbConnection *c, QXcbVirtualDesktop **virtualDesktop, QPoint *pos, int *keybMask = 0);
+#ifndef QT_NO_CURSOR
+ xcb_cursor_t xcbCursor(const QCursor &c) const
+ { return m_cursorHash.value(QXcbCursorCacheKey(c), xcb_cursor_t(0)); }
+#endif
+
private:
#ifndef QT_NO_CURSOR
typedef QHash<QXcbCursorCacheKey, xcb_cursor_t> CursorHash;
diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp
index 19e8b1de7d..c42ea627a8 100644
--- a/src/plugins/platforms/xcb/qxcbintegration.cpp
+++ b/src/plugins/platforms/xcb/qxcbintegration.cpp
@@ -454,4 +454,17 @@ void QXcbIntegration::sync()
}
}
+// For QApplication::beep()
+void QXcbIntegration::beep() const
+{
+ QScreen *priScreen = QGuiApplication::primaryScreen();
+ if (!priScreen)
+ return;
+ QPlatformScreen *screen = priScreen->handle();
+ if (!screen)
+ return;
+ xcb_connection_t *connection = static_cast<QXcbScreen *>(screen)->xcb_connection();
+ xcb_bell(connection, 0);
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/xcb/qxcbintegration.h b/src/plugins/platforms/xcb/qxcbintegration.h
index 4e2a3c2bbd..f833015596 100644
--- a/src/plugins/platforms/xcb/qxcbintegration.h
+++ b/src/plugins/platforms/xcb/qxcbintegration.h
@@ -104,6 +104,8 @@ public:
void sync() Q_DECL_OVERRIDE;
+ void beep() const Q_DECL_OVERRIDE;
+
static QXcbIntegration *instance() { return m_instance; }
private:
diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
index 2e088d3ca5..0bfefc962e 100644
--- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp
+++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
@@ -1511,11 +1511,13 @@ void QXcbKeyboard::handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type,
QWindow *window = targetWindow->window();
if (!filtered) {
+#ifndef QT_NO_CONTEXTMENU
if (type == QEvent::KeyPress && qtcode == Qt::Key_Menu) {
const QPoint globalPos = window->screen()->handle()->cursor()->pos();
const QPoint pos = window->mapFromGlobal(globalPos);
QWindowSystemInterface::handleContextMenuEvent(window, false, pos, globalPos, modifiers);
}
+#endif // QT_NO_CONTEXTMENU
QWindowSystemInterface::handleExtendedKeyEvent(window, time, type, qtcode, modifiers,
code, sym, state, string, isAutoRepeat);
}
diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
index dfb0a125e2..1403cee622 100644
--- a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
+++ b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
@@ -33,6 +33,7 @@
#include "qxcbnativeinterface.h"
+#include "qxcbcursor.h"
#include "qxcbscreen.h"
#include "qxcbwindow.h"
#include "qxcbintegration.h"
@@ -91,18 +92,6 @@ QXcbNativeInterface::QXcbNativeInterface() :
{
}
-void QXcbNativeInterface::beep() // For QApplication::beep()
-{
- QScreen *priScreen = QGuiApplication::primaryScreen();
- if (!priScreen)
- return;
- QPlatformScreen *screen = priScreen->handle();
- if (!screen)
- return;
- xcb_connection_t *connection = static_cast<QXcbScreen *>(screen)->xcb_connection();
- xcb_bell(connection, 0);
-}
-
static inline QXcbSystemTrayTracker *systemTrayTracker(const QScreen *s)
{
if (!s)
@@ -288,6 +277,20 @@ void *QXcbNativeInterface::nativeResourceForBackingStore(const QByteArray &resou
return result;
}
+#ifndef QT_NO_CURSOR
+void *QXcbNativeInterface::nativeResourceForCursor(const QByteArray &resource, const QCursor &cursor)
+{
+ if (resource == QByteArrayLiteral("xcbcursor")) {
+ if (const QScreen *primaryScreen = QGuiApplication::primaryScreen()) {
+ if (const QPlatformCursor *pCursor= primaryScreen->handle()->cursor()) {
+ xcb_cursor_t xcbCursor = static_cast<const QXcbCursor *>(pCursor)->xcbCursor(cursor);
+ return reinterpret_cast<void *>(quintptr(xcbCursor));
+ }
+ }
+ }
+ return Q_NULLPTR;
+}
+#endif // !QT_NO_CURSOR
QPlatformNativeInterface::NativeResourceForIntegrationFunction QXcbNativeInterface::nativeResourceFunctionForIntegration(const QByteArray &resource)
{
@@ -444,11 +447,15 @@ void *QXcbNativeInterface::atspiBus()
QXcbConnection *defaultConnection = integration->defaultConnection();
if (defaultConnection) {
xcb_atom_t atspiBusAtom = defaultConnection->internAtom("AT_SPI_BUS");
- xcb_get_property_cookie_t cookie = Q_XCB_CALL(xcb_get_property(defaultConnection->xcb_connection(), false,
- defaultConnection->rootWindow(),
- atspiBusAtom,
- XCB_ATOM_STRING, 0, 128));
- xcb_get_property_reply_t *reply = Q_XCB_CALL(xcb_get_property_reply(defaultConnection->xcb_connection(), cookie, 0));
+ xcb_get_property_cookie_t cookie = Q_XCB_CALL2(xcb_get_property(
+ defaultConnection->xcb_connection(),
+ false, defaultConnection->rootWindow(),
+ atspiBusAtom, XCB_ATOM_STRING, 0, 128),
+ defaultConnection);
+ xcb_get_property_reply_t *reply = Q_XCB_CALL2(xcb_get_property_reply(
+ defaultConnection->xcb_connection(),
+ cookie, 0),
+ defaultConnection);
Q_ASSERT(!reply->bytes_after);
char *data = (char *)xcb_get_property_value(reply);
int length = xcb_get_property_value_length(reply);
diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.h b/src/plugins/platforms/xcb/qxcbnativeinterface.h
index f88b710864..fdda10e307 100644
--- a/src/plugins/platforms/xcb/qxcbnativeinterface.h
+++ b/src/plugins/platforms/xcb/qxcbnativeinterface.h
@@ -78,6 +78,9 @@ public:
void *nativeResourceForScreen(const QByteArray &resource, QScreen *screen) Q_DECL_OVERRIDE;
void *nativeResourceForWindow(const QByteArray &resourceString, QWindow *window) Q_DECL_OVERRIDE;
void *nativeResourceForBackingStore(const QByteArray &resource, QBackingStore *backingStore) Q_DECL_OVERRIDE;
+#ifndef QT_NO_CURSOR
+ void *nativeResourceForCursor(const QByteArray &resource, const QCursor &cursor) Q_DECL_OVERRIDE;
+#endif
NativeResourceForIntegrationFunction nativeResourceFunctionForIntegration(const QByteArray &resource) Q_DECL_OVERRIDE;
NativeResourceForContextFunction nativeResourceFunctionForContext(const QByteArray &resource) Q_DECL_OVERRIDE;
@@ -105,7 +108,6 @@ public:
static void setAppTime(QScreen *screen, xcb_timestamp_t time);
static void setAppUserTime(QScreen *screen, xcb_timestamp_t time);
- Q_INVOKABLE void beep();
Q_INVOKABLE bool systemTrayAvailable(const QScreen *screen) const;
Q_INVOKABLE void setParentRelativeBackPixmap(QWindow *window);
Q_INVOKABLE bool systrayVisualHasAlphaChannel();
diff --git a/src/plugins/platforms/xcb/qxcbscreen.cpp b/src/plugins/platforms/xcb/qxcbscreen.cpp
index f05432ef68..9b1b9fcbb0 100644
--- a/src/plugins/platforms/xcb/qxcbscreen.cpp
+++ b/src/plugins/platforms/xcb/qxcbscreen.cpp
@@ -188,8 +188,6 @@ QXcbScreen::QXcbScreen(QXcbConnection *connection, QXcbVirtualDesktop *virtualDe
updateRefreshRate(crtc->mode);
free(crtc);
}
- } else {
- updateGeometry(output ? output->timestamp : 0);
}
if (m_geometry.isEmpty()) {
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index bec167fec2..ae81674eca 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -393,7 +393,7 @@ void QXcbWindow::create()
if (!visualInfo)
visualInfo = static_cast<XVisualInfo *>(createVisual());
- if (!visualInfo && window()->surfaceType() == QSurface::OpenGLSurface)
+ if (Q_UNLIKELY(!visualInfo && window()->surfaceType() == QSurface::OpenGLSurface))
qFatal("Could not initialize OpenGL");
if (!visualInfo && window()->surfaceType() == QSurface::RasterGLSurface) {
@@ -1083,6 +1083,7 @@ void QXcbWindow::setWindowFlags(Qt::WindowFlags flags)
}
setWmWindowType(wmWindowTypes, flags);
+ setNetWmStateWindowFlags(flags);
setMotifWindowFlags(flags);
setTransparentForMouseEvents(flags & Qt::WindowTransparentForInput);
@@ -1316,6 +1317,15 @@ void QXcbWindow::updateNetWmStateBeforeMap()
setNetWmStates(states);
}
+void QXcbWindow::setNetWmStateWindowFlags(Qt::WindowFlags flags)
+{
+ changeNetWmState(flags & Qt::WindowStaysOnTopHint,
+ atom(QXcbAtom::_NET_WM_STATE_ABOVE),
+ atom(QXcbAtom::_NET_WM_STATE_STAYS_ON_TOP));
+ changeNetWmState(flags & Qt::WindowStaysOnBottomHint,
+ atom(QXcbAtom::_NET_WM_STATE_BELOW));
+}
+
void QXcbWindow::updateNetWmUserTime(xcb_timestamp_t timestamp)
{
xcb_window_t wid = m_window;
diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h
index 69c0819959..587be22915 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.h
+++ b/src/plugins/platforms/xcb/qxcbwindow.h
@@ -183,6 +183,7 @@ protected:
void setNetWmStates(NetWmStates);
void setMotifWindowFlags(Qt::WindowFlags flags);
+ void setNetWmStateWindowFlags(Qt::WindowFlags flags);
void updateMotifWmHintsBeforeMap();
void updateNetWmStateBeforeMap();
diff --git a/src/plugins/platformthemes/gtk2/gtk2.json b/src/plugins/platformthemes/gtk2/gtk2.json
deleted file mode 100644
index 86dd8e58fa..0000000000
--- a/src/plugins/platformthemes/gtk2/gtk2.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "Keys": [ "gtk2" ]
-}
diff --git a/src/plugins/platformthemes/gtk2/gtk2.pro b/src/plugins/platformthemes/gtk2/gtk2.pro
deleted file mode 100644
index 73c156f82b..0000000000
--- a/src/plugins/platformthemes/gtk2/gtk2.pro
+++ /dev/null
@@ -1,21 +0,0 @@
-TARGET = qgtk2
-
-PLUGIN_TYPE = platformthemes
-PLUGIN_EXTENDS = -
-PLUGIN_CLASS_NAME = QGtk2ThemePlugin
-load(qt_plugin)
-
-QT += core-private gui-private platformsupport-private
-
-CONFIG += X11
-QMAKE_CXXFLAGS += $$QT_CFLAGS_QGTK2
-LIBS += $$QT_LIBS_QGTK2
-
-HEADERS += \
- qgtk2dialoghelpers.h \
- qgtk2theme.h
-
-SOURCES += \
- main.cpp \
- qgtk2dialoghelpers.cpp \
- qgtk2theme.cpp \
diff --git a/src/plugins/platformthemes/gtk3/gtk3.json b/src/plugins/platformthemes/gtk3/gtk3.json
new file mode 100644
index 0000000000..3887248353
--- /dev/null
+++ b/src/plugins/platformthemes/gtk3/gtk3.json
@@ -0,0 +1,3 @@
+{
+ "Keys": [ "gtk3" ]
+}
diff --git a/src/plugins/platformthemes/gtk3/gtk3.pro b/src/plugins/platformthemes/gtk3/gtk3.pro
new file mode 100644
index 0000000000..cd19e73ed8
--- /dev/null
+++ b/src/plugins/platformthemes/gtk3/gtk3.pro
@@ -0,0 +1,21 @@
+TARGET = qgtk3
+
+PLUGIN_TYPE = platformthemes
+PLUGIN_EXTENDS = -
+PLUGIN_CLASS_NAME = QGtk3ThemePlugin
+load(qt_plugin)
+
+QT += core-private gui-private platformsupport-private
+
+CONFIG += X11
+QMAKE_CXXFLAGS += $$QT_CFLAGS_QGTK3
+LIBS += $$QT_LIBS_QGTK3
+
+HEADERS += \
+ qgtk3dialoghelpers.h \
+ qgtk3theme.h
+
+SOURCES += \
+ main.cpp \
+ qgtk3dialoghelpers.cpp \
+ qgtk3theme.cpp
diff --git a/src/plugins/platformthemes/gtk2/main.cpp b/src/plugins/platformthemes/gtk3/main.cpp
index 34ac3ffc07..c3e81b18e3 100644
--- a/src/plugins/platformthemes/gtk2/main.cpp
+++ b/src/plugins/platformthemes/gtk3/main.cpp
@@ -32,24 +32,24 @@
****************************************************************************/
#include <qpa/qplatformthemeplugin.h>
-#include "qgtk2theme.h"
+#include "qgtk3theme.h"
QT_BEGIN_NAMESPACE
-class QGtk2ThemePlugin : public QPlatformThemePlugin
+class QGtk3ThemePlugin : public QPlatformThemePlugin
{
Q_OBJECT
- Q_PLUGIN_METADATA(IID QPlatformThemeFactoryInterface_iid FILE "gtk2.json")
+ Q_PLUGIN_METADATA(IID QPlatformThemeFactoryInterface_iid FILE "gtk3.json")
public:
QPlatformTheme *create(const QString &key, const QStringList &params) Q_DECL_OVERRIDE;
};
-QPlatformTheme *QGtk2ThemePlugin::create(const QString &key, const QStringList &params)
+QPlatformTheme *QGtk3ThemePlugin::create(const QString &key, const QStringList &params)
{
Q_UNUSED(params);
- if (!key.compare(QLatin1String(QGtk2Theme::name), Qt::CaseInsensitive))
- return new QGtk2Theme;
+ if (!key.compare(QLatin1String(QGtk3Theme::name), Qt::CaseInsensitive))
+ return new QGtk3Theme;
return 0;
}
diff --git a/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp b/src/plugins/platformthemes/gtk3/qgtk3dialoghelpers.cpp
index 2f0bceafe6..2a3585464f 100644
--- a/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp
+++ b/src/plugins/platformthemes/gtk3/qgtk3dialoghelpers.cpp
@@ -31,7 +31,7 @@
**
****************************************************************************/
-#include "qgtk2dialoghelpers.h"
+#include "qgtk3dialoghelpers.h"
#include <qeventloop.h>
#include <qwindow.h>
@@ -50,13 +50,13 @@
QT_BEGIN_NAMESPACE
-class QGtk2Dialog : public QWindow
+class QGtk3Dialog : public QWindow
{
Q_OBJECT
public:
- QGtk2Dialog(GtkWidget *gtkWidget);
- ~QGtk2Dialog();
+ QGtk3Dialog(GtkWidget *gtkWidget);
+ ~QGtk3Dialog();
GtkDialog *gtkDialog() const;
@@ -69,30 +69,30 @@ Q_SIGNALS:
void reject();
protected:
- static void onResponse(QGtk2Dialog *dialog, int response);
+ static void onResponse(QGtk3Dialog *dialog, int response);
private:
GtkWidget *gtkWidget;
};
-QGtk2Dialog::QGtk2Dialog(GtkWidget *gtkWidget) : gtkWidget(gtkWidget)
+QGtk3Dialog::QGtk3Dialog(GtkWidget *gtkWidget) : gtkWidget(gtkWidget)
{
g_signal_connect_swapped(G_OBJECT(gtkWidget), "response", G_CALLBACK(onResponse), this);
g_signal_connect(G_OBJECT(gtkWidget), "delete-event", G_CALLBACK(gtk_widget_hide_on_delete), NULL);
}
-QGtk2Dialog::~QGtk2Dialog()
+QGtk3Dialog::~QGtk3Dialog()
{
gtk_clipboard_store(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD));
gtk_widget_destroy(gtkWidget);
}
-GtkDialog *QGtk2Dialog::gtkDialog() const
+GtkDialog *QGtk3Dialog::gtkDialog() const
{
return GTK_DIALOG(gtkWidget);
}
-void QGtk2Dialog::exec()
+void QGtk3Dialog::exec()
{
if (modality() == Qt::ApplicationModal) {
// block input to the whole app, including other GTK dialogs
@@ -106,7 +106,7 @@ void QGtk2Dialog::exec()
}
}
-bool QGtk2Dialog::show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent)
+bool QGtk3Dialog::show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent)
{
setParent(parent);
setFlags(flags);
@@ -114,29 +114,31 @@ bool QGtk2Dialog::show(Qt::WindowFlags flags, Qt::WindowModality modality, QWind
gtk_widget_realize(gtkWidget); // creates X window
+ GdkWindow *gdkWindow = gtk_widget_get_window(gtkWidget);
if (parent) {
- XSetTransientForHint(gdk_x11_drawable_get_xdisplay(gtkWidget->window),
- gdk_x11_drawable_get_xid(gtkWidget->window),
+ GdkDisplay *gdkDisplay = gdk_window_get_display(gdkWindow);
+ XSetTransientForHint(gdk_x11_display_get_xdisplay(gdkDisplay),
+ gdk_x11_window_get_xid(gdkWindow),
parent->winId());
}
if (modality != Qt::NonModal) {
- gdk_window_set_modal_hint(gtkWidget->window, true);
+ gdk_window_set_modal_hint(gdkWindow, true);
QGuiApplicationPrivate::showModalWindow(this);
}
gtk_widget_show(gtkWidget);
- gdk_window_focus(gtkWidget->window, 0);
+ gdk_window_focus(gdkWindow, GDK_CURRENT_TIME);
return true;
}
-void QGtk2Dialog::hide()
+void QGtk3Dialog::hide()
{
QGuiApplicationPrivate::hideModalWindow(this);
gtk_widget_hide(gtkWidget);
}
-void QGtk2Dialog::onResponse(QGtk2Dialog *dialog, int response)
+void QGtk3Dialog::onResponse(QGtk3Dialog *dialog, int response)
{
if (response == GTK_RESPONSE_OK)
emit dialog->accept();
@@ -144,95 +146,78 @@ void QGtk2Dialog::onResponse(QGtk2Dialog *dialog, int response)
emit dialog->reject();
}
-QGtk2ColorDialogHelper::QGtk2ColorDialogHelper()
+QGtk3ColorDialogHelper::QGtk3ColorDialogHelper()
{
- d.reset(new QGtk2Dialog(gtk_color_selection_dialog_new("")));
+ d.reset(new QGtk3Dialog(gtk_color_chooser_dialog_new("", 0)));
connect(d.data(), SIGNAL(accept()), this, SLOT(onAccepted()));
connect(d.data(), SIGNAL(reject()), this, SIGNAL(reject()));
- GtkWidget *gtkColorSelection = gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(d->gtkDialog()));
- g_signal_connect_swapped(gtkColorSelection, "color-changed", G_CALLBACK(onColorChanged), this);
+ g_signal_connect_swapped(d->gtkDialog(), "color-activated", G_CALLBACK(onColorChanged), this);
}
-QGtk2ColorDialogHelper::~QGtk2ColorDialogHelper()
+QGtk3ColorDialogHelper::~QGtk3ColorDialogHelper()
{
}
-bool QGtk2ColorDialogHelper::show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent)
+bool QGtk3ColorDialogHelper::show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent)
{
applyOptions();
return d->show(flags, modality, parent);
}
-void QGtk2ColorDialogHelper::exec()
+void QGtk3ColorDialogHelper::exec()
{
d->exec();
}
-void QGtk2ColorDialogHelper::hide()
+void QGtk3ColorDialogHelper::hide()
{
d->hide();
}
-void QGtk2ColorDialogHelper::setCurrentColor(const QColor &color)
+void QGtk3ColorDialogHelper::setCurrentColor(const QColor &color)
{
GtkDialog *gtkDialog = d->gtkDialog();
- GtkWidget *gtkColorSelection = gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(gtkDialog));
- GdkColor gdkColor;
- gdkColor.red = color.red() << 8;
- gdkColor.green = color.green() << 8;
- gdkColor.blue = color.blue() << 8;
- gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(gtkColorSelection), &gdkColor);
- if (color.alpha() < 255) {
- gtk_color_selection_set_has_opacity_control(GTK_COLOR_SELECTION(gtkColorSelection), true);
- gtk_color_selection_set_current_alpha(GTK_COLOR_SELECTION(gtkColorSelection), color.alpha() << 8);
- }
+ if (color.alpha() < 255)
+ gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(gtkDialog), true);
+ GdkRGBA gdkColor;
+ gdkColor.red = color.redF();
+ gdkColor.green = color.greenF();
+ gdkColor.blue = color.blueF();
+ gdkColor.alpha = color.alphaF();
+ gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(gtkDialog), &gdkColor);
}
-QColor QGtk2ColorDialogHelper::currentColor() const
+QColor QGtk3ColorDialogHelper::currentColor() const
{
GtkDialog *gtkDialog = d->gtkDialog();
- GtkWidget *gtkColorSelection = gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(gtkDialog));
- GdkColor gdkColor;
- gtk_color_selection_get_current_color(GTK_COLOR_SELECTION(gtkColorSelection), &gdkColor);
- guint16 alpha = gtk_color_selection_get_current_alpha(GTK_COLOR_SELECTION(gtkColorSelection));
- return QColor(gdkColor.red >> 8, gdkColor.green >> 8, gdkColor.blue >> 8, alpha >> 8);
+ GdkRGBA gdkColor;
+ gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(gtkDialog), &gdkColor);
+ return QColor::fromRgbF(gdkColor.red, gdkColor.green, gdkColor.blue, gdkColor.alpha);
}
-void QGtk2ColorDialogHelper::onAccepted()
+void QGtk3ColorDialogHelper::onAccepted()
{
emit accept();
emit colorSelected(currentColor());
}
-void QGtk2ColorDialogHelper::onColorChanged(QGtk2ColorDialogHelper *dialog)
+void QGtk3ColorDialogHelper::onColorChanged(QGtk3ColorDialogHelper *dialog)
{
emit dialog->currentColorChanged(dialog->currentColor());
}
-void QGtk2ColorDialogHelper::applyOptions()
+void QGtk3ColorDialogHelper::applyOptions()
{
GtkDialog *gtkDialog = d->gtkDialog();
gtk_window_set_title(GTK_WINDOW(gtkDialog), options()->windowTitle().toUtf8());
- GtkWidget *gtkColorSelection = gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(gtkDialog));
- gtk_color_selection_set_has_opacity_control(GTK_COLOR_SELECTION(gtkColorSelection), options()->testOption(QColorDialogOptions::ShowAlphaChannel));
-
- GtkWidget *okButton = 0;
- GtkWidget *cancelButton = 0;
- GtkWidget *helpButton = 0;
- g_object_get(G_OBJECT(gtkDialog), "ok-button", &okButton, "cancel-button", &cancelButton, "help-button", &helpButton, NULL);
- if (okButton)
- g_object_set(G_OBJECT(okButton), "visible", !options()->testOption(QColorDialogOptions::NoButtons), NULL);
- if (cancelButton)
- g_object_set(G_OBJECT(cancelButton), "visible", !options()->testOption(QColorDialogOptions::NoButtons), NULL);
- if (helpButton)
- gtk_widget_hide(helpButton);
+ gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(gtkDialog), options()->testOption(QColorDialogOptions::ShowAlphaChannel));
}
-QGtk2FileDialogHelper::QGtk2FileDialogHelper()
+QGtk3FileDialogHelper::QGtk3FileDialogHelper()
{
- d.reset(new QGtk2Dialog(gtk_file_chooser_dialog_new("", 0,
+ d.reset(new QGtk3Dialog(gtk_file_chooser_dialog_new("", 0,
GTK_FILE_CHOOSER_ACTION_OPEN,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_OK, GTK_RESPONSE_OK, NULL)));
@@ -243,11 +228,11 @@ QGtk2FileDialogHelper::QGtk2FileDialogHelper()
g_signal_connect_swapped(GTK_FILE_CHOOSER(d->gtkDialog()), "current-folder-changed", G_CALLBACK(onCurrentFolderChanged), this);
}
-QGtk2FileDialogHelper::~QGtk2FileDialogHelper()
+QGtk3FileDialogHelper::~QGtk3FileDialogHelper()
{
}
-bool QGtk2FileDialogHelper::show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent)
+bool QGtk3FileDialogHelper::show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent)
{
_dir.clear();
_selection.clear();
@@ -256,12 +241,12 @@ bool QGtk2FileDialogHelper::show(Qt::WindowFlags flags, Qt::WindowModality modal
return d->show(flags, modality, parent);
}
-void QGtk2FileDialogHelper::exec()
+void QGtk3FileDialogHelper::exec()
{
d->exec();
}
-void QGtk2FileDialogHelper::hide()
+void QGtk3FileDialogHelper::hide()
{
// After GtkFileChooserDialog has been hidden, gtk_file_chooser_get_current_folder()
// & gtk_file_chooser_get_filenames() will return bogus values -> cache the actual
@@ -272,18 +257,18 @@ void QGtk2FileDialogHelper::hide()
d->hide();
}
-bool QGtk2FileDialogHelper::defaultNameFilterDisables() const
+bool QGtk3FileDialogHelper::defaultNameFilterDisables() const
{
return false;
}
-void QGtk2FileDialogHelper::setDirectory(const QUrl &directory)
+void QGtk3FileDialogHelper::setDirectory(const QUrl &directory)
{
GtkDialog *gtkDialog = d->gtkDialog();
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(gtkDialog), directory.toLocalFile().toUtf8());
}
-QUrl QGtk2FileDialogHelper::directory() const
+QUrl QGtk3FileDialogHelper::directory() const
{
// While GtkFileChooserDialog is hidden, gtk_file_chooser_get_current_folder()
// returns a bogus value -> return the cached value before hiding
@@ -300,7 +285,7 @@ QUrl QGtk2FileDialogHelper::directory() const
return QUrl::fromLocalFile(ret);
}
-void QGtk2FileDialogHelper::selectFile(const QUrl &filename)
+void QGtk3FileDialogHelper::selectFile(const QUrl &filename)
{
GtkDialog *gtkDialog = d->gtkDialog();
if (options()->acceptMode() == QFileDialogOptions::AcceptSave) {
@@ -312,7 +297,7 @@ void QGtk2FileDialogHelper::selectFile(const QUrl &filename)
}
}
-QList<QUrl> QGtk2FileDialogHelper::selectedFiles() const
+QList<QUrl> QGtk3FileDialogHelper::selectedFiles() const
{
// While GtkFileChooserDialog is hidden, gtk_file_chooser_get_filenames()
// returns a bogus value -> return the cached value before hiding
@@ -328,12 +313,12 @@ QList<QUrl> QGtk2FileDialogHelper::selectedFiles() const
return selection;
}
-void QGtk2FileDialogHelper::setFilter()
+void QGtk3FileDialogHelper::setFilter()
{
applyOptions();
}
-void QGtk2FileDialogHelper::selectNameFilter(const QString &filter)
+void QGtk3FileDialogHelper::selectNameFilter(const QString &filter)
{
GtkFileFilter *gtkFilter = _filters.value(filter);
if (gtkFilter) {
@@ -342,14 +327,14 @@ void QGtk2FileDialogHelper::selectNameFilter(const QString &filter)
}
}
-QString QGtk2FileDialogHelper::selectedNameFilter() const
+QString QGtk3FileDialogHelper::selectedNameFilter() const
{
GtkDialog *gtkDialog = d->gtkDialog();
GtkFileFilter *gtkFilter = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(gtkDialog));
return _filterNames.value(gtkFilter);
}
-void QGtk2FileDialogHelper::onAccepted()
+void QGtk3FileDialogHelper::onAccepted()
{
emit accept();
@@ -363,7 +348,7 @@ void QGtk2FileDialogHelper::onAccepted()
emit fileSelected(files.first());
}
-void QGtk2FileDialogHelper::onSelectionChanged(GtkDialog *gtkDialog, QGtk2FileDialogHelper *helper)
+void QGtk3FileDialogHelper::onSelectionChanged(GtkDialog *gtkDialog, QGtk3FileDialogHelper *helper)
{
QString selection;
gchar *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(gtkDialog));
@@ -374,7 +359,7 @@ void QGtk2FileDialogHelper::onSelectionChanged(GtkDialog *gtkDialog, QGtk2FileDi
emit helper->currentChanged(QUrl::fromLocalFile(selection));
}
-void QGtk2FileDialogHelper::onCurrentFolderChanged(QGtk2FileDialogHelper *dialog)
+void QGtk3FileDialogHelper::onCurrentFolderChanged(QGtk3FileDialogHelper *dialog)
{
emit dialog->directoryEntered(dialog->directory());
}
@@ -399,7 +384,7 @@ static GtkFileChooserAction gtkFileChooserAction(const QSharedPointer<QFileDialo
}
}
-void QGtk2FileDialogHelper::applyOptions()
+void QGtk3FileDialogHelper::applyOptions()
{
GtkDialog *gtkDialog = d->gtkDialog();
const QSharedPointer<QFileDialogOptions> &opts = options();
@@ -430,7 +415,6 @@ void QGtk2FileDialogHelper::applyOptions()
if (!initialNameFilter.isEmpty())
selectNameFilter(initialNameFilter);
-#if GTK_CHECK_VERSION(2, 20, 0)
GtkWidget *acceptButton = gtk_dialog_get_widget_for_response(gtkDialog, GTK_RESPONSE_OK);
if (acceptButton) {
if (opts->isLabelExplicitlySet(QFileDialogOptions::Accept))
@@ -448,10 +432,9 @@ void QGtk2FileDialogHelper::applyOptions()
else
gtk_button_set_label(GTK_BUTTON(rejectButton), GTK_STOCK_CANCEL);
}
-#endif
}
-void QGtk2FileDialogHelper::setNameFilters(const QStringList &filters)
+void QGtk3FileDialogHelper::setNameFilters(const QStringList &filters)
{
GtkDialog *gtkDialog = d->gtkDialog();
foreach (GtkFileFilter *filter, _filters)
@@ -476,29 +459,29 @@ void QGtk2FileDialogHelper::setNameFilters(const QStringList &filters)
}
}
-QGtk2FontDialogHelper::QGtk2FontDialogHelper()
+QGtk3FontDialogHelper::QGtk3FontDialogHelper()
{
- d.reset(new QGtk2Dialog(gtk_font_selection_dialog_new("")));
+ d.reset(new QGtk3Dialog(gtk_font_chooser_dialog_new("", 0)));
connect(d.data(), SIGNAL(accept()), this, SLOT(onAccepted()));
connect(d.data(), SIGNAL(reject()), this, SIGNAL(reject()));
}
-QGtk2FontDialogHelper::~QGtk2FontDialogHelper()
+QGtk3FontDialogHelper::~QGtk3FontDialogHelper()
{
}
-bool QGtk2FontDialogHelper::show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent)
+bool QGtk3FontDialogHelper::show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent)
{
applyOptions();
return d->show(flags, modality, parent);
}
-void QGtk2FontDialogHelper::exec()
+void QGtk3FontDialogHelper::exec()
{
d->exec();
}
-void QGtk2FontDialogHelper::hide()
+void QGtk3FontDialogHelper::hide()
{
d->hide();
}
@@ -569,43 +552,36 @@ static QFont qt_fontFromString(const QString &name)
return font;
}
-void QGtk2FontDialogHelper::setCurrentFont(const QFont &font)
+void QGtk3FontDialogHelper::setCurrentFont(const QFont &font)
{
- GtkFontSelectionDialog *gtkDialog = GTK_FONT_SELECTION_DIALOG(d->gtkDialog());
- gtk_font_selection_dialog_set_font_name(gtkDialog, qt_fontToString(font).toUtf8());
+ GtkFontChooser *gtkDialog = GTK_FONT_CHOOSER(d->gtkDialog());
+ gtk_font_chooser_set_font(gtkDialog, qt_fontToString(font).toUtf8());
}
-QFont QGtk2FontDialogHelper::currentFont() const
+QFont QGtk3FontDialogHelper::currentFont() const
{
- GtkFontSelectionDialog *gtkDialog = GTK_FONT_SELECTION_DIALOG(d->gtkDialog());
- gchar *name = gtk_font_selection_dialog_get_font_name(gtkDialog);
+ GtkFontChooser *gtkDialog = GTK_FONT_CHOOSER(d->gtkDialog());
+ gchar *name = gtk_font_chooser_get_font(gtkDialog);
QFont font = qt_fontFromString(QString::fromUtf8(name));
g_free(name);
return font;
}
-void QGtk2FontDialogHelper::onAccepted()
+void QGtk3FontDialogHelper::onAccepted()
{
emit currentFontChanged(currentFont());
emit accept();
emit fontSelected(currentFont());
}
-void QGtk2FontDialogHelper::applyOptions()
+void QGtk3FontDialogHelper::applyOptions()
{
GtkDialog *gtkDialog = d->gtkDialog();
const QSharedPointer<QFontDialogOptions> &opts = options();
gtk_window_set_title(GTK_WINDOW(gtkDialog), opts->windowTitle().toUtf8());
-
- GtkWidget *okButton = gtk_font_selection_dialog_get_ok_button(GTK_FONT_SELECTION_DIALOG(gtkDialog));
- GtkWidget *cancelButton = gtk_font_selection_dialog_get_cancel_button(GTK_FONT_SELECTION_DIALOG(gtkDialog));
- if (okButton)
- gtk_widget_set_visible(okButton, !options()->testOption(QFontDialogOptions::NoButtons));
- if (cancelButton)
- gtk_widget_set_visible(cancelButton, !options()->testOption(QFontDialogOptions::NoButtons));
}
QT_END_NAMESPACE
-#include "qgtk2dialoghelpers.moc"
+#include "qgtk3dialoghelpers.moc"
diff --git a/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.h b/src/plugins/platformthemes/gtk3/qgtk3dialoghelpers.h
index 141056637e..438dee861b 100644
--- a/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.h
+++ b/src/plugins/platformthemes/gtk3/qgtk3dialoghelpers.h
@@ -31,8 +31,8 @@
**
****************************************************************************/
-#ifndef QGTK2DIALOGHELPERS_P_H
-#define QGTK2DIALOGHELPERS_P_H
+#ifndef QGTK3DIALOGHELPERS_H
+#define QGTK3DIALOGHELPERS_H
#include <QtCore/qhash.h>
#include <QtCore/qlist.h>
@@ -46,16 +46,16 @@ typedef struct _GtkFileFilter GtkFileFilter;
QT_BEGIN_NAMESPACE
-class QGtk2Dialog;
+class QGtk3Dialog;
class QColor;
-class QGtk2ColorDialogHelper : public QPlatformColorDialogHelper
+class QGtk3ColorDialogHelper : public QPlatformColorDialogHelper
{
Q_OBJECT
public:
- QGtk2ColorDialogHelper();
- ~QGtk2ColorDialogHelper();
+ QGtk3ColorDialogHelper();
+ ~QGtk3ColorDialogHelper();
bool show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent) Q_DECL_OVERRIDE;
void exec() Q_DECL_OVERRIDE;
@@ -68,19 +68,19 @@ private Q_SLOTS:
void onAccepted();
private:
- static void onColorChanged(QGtk2ColorDialogHelper *helper);
+ static void onColorChanged(QGtk3ColorDialogHelper *helper);
void applyOptions();
- QScopedPointer<QGtk2Dialog> d;
+ QScopedPointer<QGtk3Dialog> d;
};
-class QGtk2FileDialogHelper : public QPlatformFileDialogHelper
+class QGtk3FileDialogHelper : public QPlatformFileDialogHelper
{
Q_OBJECT
public:
- QGtk2FileDialogHelper();
- ~QGtk2FileDialogHelper();
+ QGtk3FileDialogHelper();
+ ~QGtk3FileDialogHelper();
bool show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent) Q_DECL_OVERRIDE;
void exec() Q_DECL_OVERRIDE;
@@ -99,8 +99,8 @@ private Q_SLOTS:
void onAccepted();
private:
- static void onSelectionChanged(GtkDialog *dialog, QGtk2FileDialogHelper *helper);
- static void onCurrentFolderChanged(QGtk2FileDialogHelper *helper);
+ static void onSelectionChanged(GtkDialog *dialog, QGtk3FileDialogHelper *helper);
+ static void onCurrentFolderChanged(QGtk3FileDialogHelper *helper);
void applyOptions();
void setNameFilters(const QStringList &filters);
@@ -108,16 +108,16 @@ private:
QList<QUrl> _selection;
QHash<QString, GtkFileFilter*> _filters;
QHash<GtkFileFilter*, QString> _filterNames;
- QScopedPointer<QGtk2Dialog> d;
+ QScopedPointer<QGtk3Dialog> d;
};
-class QGtk2FontDialogHelper : public QPlatformFontDialogHelper
+class QGtk3FontDialogHelper : public QPlatformFontDialogHelper
{
Q_OBJECT
public:
- QGtk2FontDialogHelper();
- ~QGtk2FontDialogHelper();
+ QGtk3FontDialogHelper();
+ ~QGtk3FontDialogHelper();
bool show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent) Q_DECL_OVERRIDE;
void exec() Q_DECL_OVERRIDE;
@@ -132,9 +132,9 @@ private Q_SLOTS:
private:
void applyOptions();
- QScopedPointer<QGtk2Dialog> d;
+ QScopedPointer<QGtk3Dialog> d;
};
QT_END_NAMESPACE
-#endif // QGTK2DIALOGHELPERS_P_H
+#endif // QGTK3DIALOGHELPERS_H
diff --git a/src/plugins/platformthemes/gtk2/qgtk2theme.cpp b/src/plugins/platformthemes/gtk3/qgtk3theme.cpp
index a7f08bc047..76afc441a4 100644
--- a/src/plugins/platformthemes/gtk2/qgtk2theme.cpp
+++ b/src/plugins/platformthemes/gtk3/qgtk3theme.cpp
@@ -31,8 +31,8 @@
**
****************************************************************************/
-#include "qgtk2theme.h"
-#include "qgtk2dialoghelpers.h"
+#include "qgtk3theme.h"
+#include "qgtk3dialoghelpers.h"
#include <QVariant>
#undef signals
@@ -42,7 +42,7 @@
QT_BEGIN_NAMESPACE
-const char *QGtk2Theme::name = "gtk2";
+const char *QGtk3Theme::name = "gtk3";
static QString gtkSetting(const gchar *propertyName)
{
@@ -54,7 +54,21 @@ static QString gtkSetting(const gchar *propertyName)
return str;
}
-QGtk2Theme::QGtk2Theme()
+void gtkMessageHandler(const gchar *log_domain,
+ GLogLevelFlags log_level,
+ const gchar *message,
+ gpointer unused_data) {
+ /* Silence false-positive Gtk warnings (we are using Xlib to set
+ * the WM_TRANSIENT_FOR hint).
+ */
+ if (g_strcmp0(message, "GtkDialog mapped without a transient parent. "
+ "This is discouraged.") != 0) {
+ /* For other messages, call the default handler. */
+ g_log_default_handler(log_domain, log_level, message, unused_data);
+ }
+}
+
+QGtk3Theme::QGtk3Theme()
{
// gtk_init will reset the Xlib error handler, and that causes
// Qt applications to quit on X errors. Therefore, we need to manually restore it.
@@ -63,9 +77,18 @@ QGtk2Theme::QGtk2Theme()
gtk_init(0, 0);
XSetErrorHandler(oldErrorHandler);
+
+ /* Initialize some types here so that Gtk+ does not crash when reading
+ * the treemodel for GtkFontChooser.
+ */
+ g_type_ensure(PANGO_TYPE_FONT_FAMILY);
+ g_type_ensure(PANGO_TYPE_FONT_FACE);
+
+ /* Use our custom log handler. */
+ g_log_set_handler("Gtk", G_LOG_LEVEL_MESSAGE, gtkMessageHandler, NULL);
}
-QVariant QGtk2Theme::themeHint(QPlatformTheme::ThemeHint hint) const
+QVariant QGtk3Theme::themeHint(QPlatformTheme::ThemeHint hint) const
{
switch (hint) {
case QPlatformTheme::SystemIconThemeName:
@@ -77,7 +100,7 @@ QVariant QGtk2Theme::themeHint(QPlatformTheme::ThemeHint hint) const
}
}
-QString QGtk2Theme::gtkFontName() const
+QString QGtk3Theme::gtkFontName() const
{
QString cfgFontName = gtkSetting("gtk-font-name");
if (!cfgFontName.isEmpty())
@@ -85,7 +108,7 @@ QString QGtk2Theme::gtkFontName() const
return QGnomeTheme::gtkFontName();
}
-bool QGtk2Theme::usePlatformNativeDialog(DialogType type) const
+bool QGtk3Theme::usePlatformNativeDialog(DialogType type) const
{
switch (type) {
case ColorDialog:
@@ -99,15 +122,15 @@ bool QGtk2Theme::usePlatformNativeDialog(DialogType type) const
}
}
-QPlatformDialogHelper *QGtk2Theme::createPlatformDialogHelper(DialogType type) const
+QPlatformDialogHelper *QGtk3Theme::createPlatformDialogHelper(DialogType type) const
{
switch (type) {
case ColorDialog:
- return new QGtk2ColorDialogHelper;
+ return new QGtk3ColorDialogHelper;
case FileDialog:
- return new QGtk2FileDialogHelper;
+ return new QGtk3FileDialogHelper;
case FontDialog:
- return new QGtk2FontDialogHelper;
+ return new QGtk3FontDialogHelper;
default:
return 0;
}
diff --git a/src/plugins/platformthemes/gtk2/qgtk2theme.h b/src/plugins/platformthemes/gtk3/qgtk3theme.h
index 8798fed1f7..1597f6e911 100644
--- a/src/plugins/platformthemes/gtk2/qgtk2theme.h
+++ b/src/plugins/platformthemes/gtk3/qgtk3theme.h
@@ -31,17 +31,17 @@
**
****************************************************************************/
-#ifndef QGTK2THEME_H
-#define QGTK2THEME_H
+#ifndef QGTK3THEME_H
+#define QGTK3THEME_H
#include <private/qgenericunixthemes_p.h>
QT_BEGIN_NAMESPACE
-class QGtk2Theme : public QGnomeTheme
+class QGtk3Theme : public QGnomeTheme
{
public:
- QGtk2Theme();
+ QGtk3Theme();
virtual QVariant themeHint(ThemeHint hint) const Q_DECL_OVERRIDE;
virtual QString gtkFontName() const Q_DECL_OVERRIDE;
@@ -54,4 +54,4 @@ public:
QT_END_NAMESPACE
-#endif // QGTK2THEME_H
+#endif // QGTK3THEME_H
diff --git a/src/plugins/platformthemes/platformthemes.pro b/src/plugins/platformthemes/platformthemes.pro
index 23dcda2c82..f5f54068a2 100644
--- a/src/plugins/platformthemes/platformthemes.pro
+++ b/src/plugins/platformthemes/platformthemes.pro
@@ -1,3 +1,3 @@
TEMPLATE = subdirs
-contains(QT_CONFIG, gtk2): SUBDIRS += gtk2
+contains(QT_CONFIG, gtk3): SUBDIRS += gtk3
diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro
index 03b7dc266b..55660ce31c 100644
--- a/src/plugins/plugins.pro
+++ b/src/plugins/plugins.pro
@@ -8,7 +8,6 @@ qtHaveModule(gui) {
!contains(QT_DISABLED_FEATURES, imageformatplugin): SUBDIRS *= imageformats
!contains(QT_DISABLED_FEATURES, library): SUBDIRS *= generic
}
-qtHaveModule(widgets): SUBDIRS *= styles
!winrt:!wince*:qtHaveModule(widgets):!contains(QT_DISABLED_FEATURES, printer) {
SUBDIRS += printsupport
diff --git a/src/plugins/printsupport/cocoa/cocoa.pro b/src/plugins/printsupport/cocoa/cocoa.pro
index a3b9e2dfcf..c993b42574 100644
--- a/src/plugins/printsupport/cocoa/cocoa.pro
+++ b/src/plugins/printsupport/cocoa/cocoa.pro
@@ -5,7 +5,7 @@ PLUGIN_CLASS_NAME = QCocoaPrinterSupportPlugin
load(qt_plugin)
QT += gui-private printsupport-private
-LIBS += -framework Cocoa
+LIBS += -framework AppKit
SOURCES += main.cpp
diff --git a/src/plugins/styles/bb10style/bb10lightstyle.qrc b/src/plugins/styles/bb10style/bb10lightstyle.qrc
deleted file mode 100644
index 0777e009bb..0000000000
--- a/src/plugins/styles/bb10style/bb10lightstyle.qrc
+++ /dev/null
@@ -1,54 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>light/button/core_button_disabled.png</file>
- <file>light/button/core_button_inactive.png</file>
- <file>light/button/core_button_pressed.png</file>
- <file>light/checkbox/core_checkbox_checked.png</file>
- <file>light/checkbox/core_checkbox_disabled.png</file>
- <file>light/checkbox/core_checkbox_disabledchecked.png</file>
- <file>light/checkbox/core_checkbox_enabled.png</file>
- <file>light/checkbox/core_checkbox_pressed.png</file>
- <file>light/checkbox/core_checkbox_pressedchecked.png</file>
- <file>light/radiobutton/core_radiobutton_checked.png</file>
- <file>light/radiobutton/core_radiobutton_disabled.png</file>
- <file>light/radiobutton/core_radiobutton_disabledchecked.png</file>
- <file>light/radiobutton/core_radiobutton_enabled.png</file>
- <file>light/radiobutton/core_radiobutton_pressed.png</file>
- <file>light/slider/core_slider_active.png</file>
- <file>light/slider/core_slider_disabled.png</file>
- <file>light/slider/core_slider_handle.png</file>
- <file>light/slider/core_slider_handle_disabled.png</file>
- <file>light/slider/core_slider_handle_pressed.png</file>
- <file>light/slider/core_slider_inactive.png</file>
- <file>light/slider/core_slider_vactive.png</file>
- <file>light/slider/core_slider_vdisabled.png</file>
- <file>light/slider/core_slider_vinactive.png</file>
- <file>light/slider/core_slider_black.png</file>
- <file>light/slider/core_slider_enabled.png</file>
- <file>light/slider/core_slider_vblack.png</file>
- <file>light/slider/core_slider_venabled.png</file>
- <file>light/button/core_button_active.png</file>
- <file>light/lineedit/core_textinput_bg.png</file>
- <file>light/lineedit/core_textinput_bg_disabled.png</file>
- <file>light/lineedit/core_textinput_bg_focused.png</file>
- <file>light/progressbar/core_progressindicator_bg.png</file>
- <file>light/progressbar/core_progressindicator_complete.png</file>
- <file>light/progressbar/core_progressindicator_fill.png</file>
- <file>light/progressbar/core_progressindicator_vbg.png</file>
- <file>light/progressbar/core_progressindicator_vcomplete.png</file>
- <file>light/progressbar/core_progressindicator_vfill.png</file>
- <file>light/combobox/core_dropdown_button.png</file>
- <file>light/combobox/core_dropdown_button_arrowdown.png</file>
- <file>light/combobox/core_dropdown_button_arrowdown_pressed.png</file>
- <file>light/combobox/core_dropdown_button_arrowup.png</file>
- <file>light/combobox/core_dropdown_button_disabled.png</file>
- <file>light/combobox/core_dropdown_button_pressed.png</file>
- <file>light/combobox/core_dropdown_checkmark.png</file>
- <file>light/combobox/core_dropdown_divider.png</file>
- <file>light/combobox/core_dropdown_menu.png</file>
- <file>light/combobox/core_dropdown_menuup.png</file>
- <file>light/combobox/core_listitem_active.png</file>
- <file>light/listitem/core_listitem_active.png</file>
- <file>light/listitem/core_listitem_divider.png</file>
- </qresource>
-</RCC>
diff --git a/src/plugins/styles/bb10style/bb10style.pro b/src/plugins/styles/bb10style/bb10style.pro
deleted file mode 100644
index ad35df6de7..0000000000
--- a/src/plugins/styles/bb10style/bb10style.pro
+++ /dev/null
@@ -1,28 +0,0 @@
-TARGET = bb10styleplugin
-
-PLUGIN_TYPE = styles
-PLUGIN_CLASS_NAME = BlackBerry10StylePlugin
-load(qt_plugin)
-
-INCLUDEPATH += $$PWD
-
-QT += widgets
-
-HEADERS += \
- qpixmapstyle.h \
- qbb10brightstyle.h \
- qbb10darkstyle.h \
- qbb10styleplugin.h
-
-SOURCES += \
- qpixmapstyle.cpp \
- qbb10brightstyle.cpp \
- qbb10darkstyle.cpp \
- qbb10styleplugin.cpp
-
-RESOURCES += \
- qbb10brightstyle.qrc \
- qbb10darkstyle.qrc
-
-OTHER_FILES += qbb10styleplugin.json
-
diff --git a/src/plugins/styles/bb10style/bright/button/core_button_disabled.png b/src/plugins/styles/bb10style/bright/button/core_button_disabled.png
deleted file mode 100644
index 578a2383b8..0000000000
--- a/src/plugins/styles/bb10style/bright/button/core_button_disabled.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/button/core_button_disabled_selected.png b/src/plugins/styles/bb10style/bright/button/core_button_disabled_selected.png
deleted file mode 100644
index 7cd998af46..0000000000
--- a/src/plugins/styles/bb10style/bright/button/core_button_disabled_selected.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/button/core_button_enabled_selected.png b/src/plugins/styles/bb10style/bright/button/core_button_enabled_selected.png
deleted file mode 100644
index ff0850f616..0000000000
--- a/src/plugins/styles/bb10style/bright/button/core_button_enabled_selected.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/button/core_button_inactive.png b/src/plugins/styles/bb10style/bright/button/core_button_inactive.png
deleted file mode 100644
index 7769f15e44..0000000000
--- a/src/plugins/styles/bb10style/bright/button/core_button_inactive.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/button/core_button_pressed.png b/src/plugins/styles/bb10style/bright/button/core_button_pressed.png
deleted file mode 100644
index 59b5bfa7c2..0000000000
--- a/src/plugins/styles/bb10style/bright/button/core_button_pressed.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/checkbox/core_checkbox_checked.png b/src/plugins/styles/bb10style/bright/checkbox/core_checkbox_checked.png
deleted file mode 100644
index c59f60633c..0000000000
--- a/src/plugins/styles/bb10style/bright/checkbox/core_checkbox_checked.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/checkbox/core_checkbox_disabled.png b/src/plugins/styles/bb10style/bright/checkbox/core_checkbox_disabled.png
deleted file mode 100644
index 49d9cfdf94..0000000000
--- a/src/plugins/styles/bb10style/bright/checkbox/core_checkbox_disabled.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/checkbox/core_checkbox_disabled_checked.png b/src/plugins/styles/bb10style/bright/checkbox/core_checkbox_disabled_checked.png
deleted file mode 100644
index 35751553e1..0000000000
--- a/src/plugins/styles/bb10style/bright/checkbox/core_checkbox_disabled_checked.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/checkbox/core_checkbox_enabled.png b/src/plugins/styles/bb10style/bright/checkbox/core_checkbox_enabled.png
deleted file mode 100644
index 2a0c56b503..0000000000
--- a/src/plugins/styles/bb10style/bright/checkbox/core_checkbox_enabled.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/checkbox/core_checkbox_pressed.png b/src/plugins/styles/bb10style/bright/checkbox/core_checkbox_pressed.png
deleted file mode 100644
index f1c2ee3bed..0000000000
--- a/src/plugins/styles/bb10style/bright/checkbox/core_checkbox_pressed.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/checkbox/core_checkbox_pressed_checked.png b/src/plugins/styles/bb10style/bright/checkbox/core_checkbox_pressed_checked.png
deleted file mode 100644
index d58df47cbf..0000000000
--- a/src/plugins/styles/bb10style/bright/checkbox/core_checkbox_pressed_checked.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/combobox/core_dropdown_button.png b/src/plugins/styles/bb10style/bright/combobox/core_dropdown_button.png
deleted file mode 100644
index 1aa844309f..0000000000
--- a/src/plugins/styles/bb10style/bright/combobox/core_dropdown_button.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/combobox/core_dropdown_button_arrowdown.png b/src/plugins/styles/bb10style/bright/combobox/core_dropdown_button_arrowdown.png
deleted file mode 100644
index 9ac049fb3d..0000000000
--- a/src/plugins/styles/bb10style/bright/combobox/core_dropdown_button_arrowdown.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/combobox/core_dropdown_button_arrowdown_pressed.png b/src/plugins/styles/bb10style/bright/combobox/core_dropdown_button_arrowdown_pressed.png
deleted file mode 100644
index d11af56b71..0000000000
--- a/src/plugins/styles/bb10style/bright/combobox/core_dropdown_button_arrowdown_pressed.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/combobox/core_dropdown_button_arrowup.png b/src/plugins/styles/bb10style/bright/combobox/core_dropdown_button_arrowup.png
deleted file mode 100644
index d10779d8d7..0000000000
--- a/src/plugins/styles/bb10style/bright/combobox/core_dropdown_button_arrowup.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/combobox/core_dropdown_button_disabled.png b/src/plugins/styles/bb10style/bright/combobox/core_dropdown_button_disabled.png
deleted file mode 100644
index f9e1c9465b..0000000000
--- a/src/plugins/styles/bb10style/bright/combobox/core_dropdown_button_disabled.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/combobox/core_dropdown_button_pressed.png b/src/plugins/styles/bb10style/bright/combobox/core_dropdown_button_pressed.png
deleted file mode 100644
index 27a321e387..0000000000
--- a/src/plugins/styles/bb10style/bright/combobox/core_dropdown_button_pressed.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/combobox/core_dropdown_checkmark.png b/src/plugins/styles/bb10style/bright/combobox/core_dropdown_checkmark.png
deleted file mode 100644
index a8270aed56..0000000000
--- a/src/plugins/styles/bb10style/bright/combobox/core_dropdown_checkmark.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/combobox/core_dropdown_divider.png b/src/plugins/styles/bb10style/bright/combobox/core_dropdown_divider.png
deleted file mode 100644
index 0198293ad6..0000000000
--- a/src/plugins/styles/bb10style/bright/combobox/core_dropdown_divider.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/combobox/core_dropdown_menu.png b/src/plugins/styles/bb10style/bright/combobox/core_dropdown_menu.png
deleted file mode 100644
index 47e7b2d4b6..0000000000
--- a/src/plugins/styles/bb10style/bright/combobox/core_dropdown_menu.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/combobox/core_dropdown_menuup.png b/src/plugins/styles/bb10style/bright/combobox/core_dropdown_menuup.png
deleted file mode 100644
index 2bde84e71d..0000000000
--- a/src/plugins/styles/bb10style/bright/combobox/core_dropdown_menuup.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/combobox/core_listitem_active.png b/src/plugins/styles/bb10style/bright/combobox/core_listitem_active.png
deleted file mode 100644
index 4935d13c05..0000000000
--- a/src/plugins/styles/bb10style/bright/combobox/core_listitem_active.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/lineedit/core_textinput_bg.png b/src/plugins/styles/bb10style/bright/lineedit/core_textinput_bg.png
deleted file mode 100644
index 07b8ea21bf..0000000000
--- a/src/plugins/styles/bb10style/bright/lineedit/core_textinput_bg.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/lineedit/core_textinput_bg_disabled.png b/src/plugins/styles/bb10style/bright/lineedit/core_textinput_bg_disabled.png
deleted file mode 100644
index ab1083e9fa..0000000000
--- a/src/plugins/styles/bb10style/bright/lineedit/core_textinput_bg_disabled.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/lineedit/core_textinput_bg_highlight.png b/src/plugins/styles/bb10style/bright/lineedit/core_textinput_bg_highlight.png
deleted file mode 100644
index 55f8aee066..0000000000
--- a/src/plugins/styles/bb10style/bright/lineedit/core_textinput_bg_highlight.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/listitem/core_listitem_active.png b/src/plugins/styles/bb10style/bright/listitem/core_listitem_active.png
deleted file mode 100644
index 34daccc27e..0000000000
--- a/src/plugins/styles/bb10style/bright/listitem/core_listitem_active.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/listitem/core_listitem_divider.png b/src/plugins/styles/bb10style/bright/listitem/core_listitem_divider.png
deleted file mode 100644
index 7a1e22321d..0000000000
--- a/src/plugins/styles/bb10style/bright/listitem/core_listitem_divider.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_bg.png b/src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_bg.png
deleted file mode 100644
index 3ff930dea7..0000000000
--- a/src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_bg.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_complete.png b/src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_complete.png
deleted file mode 100644
index 87974668ff..0000000000
--- a/src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_complete.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_fill.png b/src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_fill.png
deleted file mode 100644
index 8ff257dad3..0000000000
--- a/src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_fill.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_vbg.png b/src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_vbg.png
deleted file mode 100644
index 66cf8cac8f..0000000000
--- a/src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_vbg.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_vcomplete.png b/src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_vcomplete.png
deleted file mode 100644
index f18e0abafb..0000000000
--- a/src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_vcomplete.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_vfill.png b/src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_vfill.png
deleted file mode 100644
index 94e388a7aa..0000000000
--- a/src/plugins/styles/bb10style/bright/progressbar/core_progressindicator_vfill.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/radiobutton/core_radiobutton_checked.png b/src/plugins/styles/bb10style/bright/radiobutton/core_radiobutton_checked.png
deleted file mode 100644
index 5dc5e52d88..0000000000
--- a/src/plugins/styles/bb10style/bright/radiobutton/core_radiobutton_checked.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/radiobutton/core_radiobutton_disabled.png b/src/plugins/styles/bb10style/bright/radiobutton/core_radiobutton_disabled.png
deleted file mode 100644
index 077aa79c65..0000000000
--- a/src/plugins/styles/bb10style/bright/radiobutton/core_radiobutton_disabled.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/radiobutton/core_radiobutton_disabled_checked.png b/src/plugins/styles/bb10style/bright/radiobutton/core_radiobutton_disabled_checked.png
deleted file mode 100644
index 439499040a..0000000000
--- a/src/plugins/styles/bb10style/bright/radiobutton/core_radiobutton_disabled_checked.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/radiobutton/core_radiobutton_inactive.png b/src/plugins/styles/bb10style/bright/radiobutton/core_radiobutton_inactive.png
deleted file mode 100644
index cb4c6a8136..0000000000
--- a/src/plugins/styles/bb10style/bright/radiobutton/core_radiobutton_inactive.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/radiobutton/core_radiobutton_pressed.png b/src/plugins/styles/bb10style/bright/radiobutton/core_radiobutton_pressed.png
deleted file mode 100644
index 88fd1344d2..0000000000
--- a/src/plugins/styles/bb10style/bright/radiobutton/core_radiobutton_pressed.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/scrollbar/core_scrollbar.png b/src/plugins/styles/bb10style/bright/scrollbar/core_scrollbar.png
deleted file mode 100644
index 79154e0568..0000000000
--- a/src/plugins/styles/bb10style/bright/scrollbar/core_scrollbar.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/scrollbar/core_scrollbar_v.png b/src/plugins/styles/bb10style/bright/scrollbar/core_scrollbar_v.png
deleted file mode 100644
index 169a4e1656..0000000000
--- a/src/plugins/styles/bb10style/bright/scrollbar/core_scrollbar_v.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/slider/core_slider_active.png b/src/plugins/styles/bb10style/bright/slider/core_slider_active.png
deleted file mode 100644
index c23c0ebc26..0000000000
--- a/src/plugins/styles/bb10style/bright/slider/core_slider_active.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/slider/core_slider_cache.png b/src/plugins/styles/bb10style/bright/slider/core_slider_cache.png
deleted file mode 100644
index 6b7224d702..0000000000
--- a/src/plugins/styles/bb10style/bright/slider/core_slider_cache.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/slider/core_slider_disabled.png b/src/plugins/styles/bb10style/bright/slider/core_slider_disabled.png
deleted file mode 100644
index 9de7567e68..0000000000
--- a/src/plugins/styles/bb10style/bright/slider/core_slider_disabled.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/slider/core_slider_enabled.png b/src/plugins/styles/bb10style/bright/slider/core_slider_enabled.png
deleted file mode 100644
index ad5c35076c..0000000000
--- a/src/plugins/styles/bb10style/bright/slider/core_slider_enabled.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/slider/core_slider_handle.png b/src/plugins/styles/bb10style/bright/slider/core_slider_handle.png
deleted file mode 100644
index 076e272794..0000000000
--- a/src/plugins/styles/bb10style/bright/slider/core_slider_handle.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/slider/core_slider_handle_disabled.png b/src/plugins/styles/bb10style/bright/slider/core_slider_handle_disabled.png
deleted file mode 100644
index 5989fcaaeb..0000000000
--- a/src/plugins/styles/bb10style/bright/slider/core_slider_handle_disabled.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/slider/core_slider_handle_pressed.png b/src/plugins/styles/bb10style/bright/slider/core_slider_handle_pressed.png
deleted file mode 100644
index 8cb79118b9..0000000000
--- a/src/plugins/styles/bb10style/bright/slider/core_slider_handle_pressed.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/slider/core_slider_inactive.png b/src/plugins/styles/bb10style/bright/slider/core_slider_inactive.png
deleted file mode 100644
index 8836534923..0000000000
--- a/src/plugins/styles/bb10style/bright/slider/core_slider_inactive.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/slider/core_slider_vactive.png b/src/plugins/styles/bb10style/bright/slider/core_slider_vactive.png
deleted file mode 100644
index 03062326f2..0000000000
--- a/src/plugins/styles/bb10style/bright/slider/core_slider_vactive.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/slider/core_slider_vcache.png b/src/plugins/styles/bb10style/bright/slider/core_slider_vcache.png
deleted file mode 100644
index b0d94d7127..0000000000
--- a/src/plugins/styles/bb10style/bright/slider/core_slider_vcache.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/slider/core_slider_vdisabled.png b/src/plugins/styles/bb10style/bright/slider/core_slider_vdisabled.png
deleted file mode 100644
index ce99b1a3ac..0000000000
--- a/src/plugins/styles/bb10style/bright/slider/core_slider_vdisabled.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/slider/core_slider_venabled.png b/src/plugins/styles/bb10style/bright/slider/core_slider_venabled.png
deleted file mode 100644
index 910b6627d4..0000000000
--- a/src/plugins/styles/bb10style/bright/slider/core_slider_venabled.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/bright/slider/core_slider_vinactive.png b/src/plugins/styles/bb10style/bright/slider/core_slider_vinactive.png
deleted file mode 100644
index 18a9819af8..0000000000
--- a/src/plugins/styles/bb10style/bright/slider/core_slider_vinactive.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/button/core_button_disabled.png b/src/plugins/styles/bb10style/dark/button/core_button_disabled.png
deleted file mode 100644
index 79245dbf11..0000000000
--- a/src/plugins/styles/bb10style/dark/button/core_button_disabled.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/button/core_button_disabled_selected.png b/src/plugins/styles/bb10style/dark/button/core_button_disabled_selected.png
deleted file mode 100644
index 5eb86b70f3..0000000000
--- a/src/plugins/styles/bb10style/dark/button/core_button_disabled_selected.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/button/core_button_enabled_selected.png b/src/plugins/styles/bb10style/dark/button/core_button_enabled_selected.png
deleted file mode 100644
index 7b1a6ce40b..0000000000
--- a/src/plugins/styles/bb10style/dark/button/core_button_enabled_selected.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/button/core_button_inactive.png b/src/plugins/styles/bb10style/dark/button/core_button_inactive.png
deleted file mode 100644
index 97842e1ac4..0000000000
--- a/src/plugins/styles/bb10style/dark/button/core_button_inactive.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/button/core_button_pressed.png b/src/plugins/styles/bb10style/dark/button/core_button_pressed.png
deleted file mode 100644
index c149b64a26..0000000000
--- a/src/plugins/styles/bb10style/dark/button/core_button_pressed.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/checkbox/core_checkbox_checked.png b/src/plugins/styles/bb10style/dark/checkbox/core_checkbox_checked.png
deleted file mode 100644
index 5a8af33094..0000000000
--- a/src/plugins/styles/bb10style/dark/checkbox/core_checkbox_checked.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/checkbox/core_checkbox_disabled.png b/src/plugins/styles/bb10style/dark/checkbox/core_checkbox_disabled.png
deleted file mode 100644
index 74a24522fa..0000000000
--- a/src/plugins/styles/bb10style/dark/checkbox/core_checkbox_disabled.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/checkbox/core_checkbox_disabled_checked.png b/src/plugins/styles/bb10style/dark/checkbox/core_checkbox_disabled_checked.png
deleted file mode 100644
index 1e953221b6..0000000000
--- a/src/plugins/styles/bb10style/dark/checkbox/core_checkbox_disabled_checked.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/checkbox/core_checkbox_enabled.png b/src/plugins/styles/bb10style/dark/checkbox/core_checkbox_enabled.png
deleted file mode 100644
index 5e51e7f39b..0000000000
--- a/src/plugins/styles/bb10style/dark/checkbox/core_checkbox_enabled.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/checkbox/core_checkbox_pressed.png b/src/plugins/styles/bb10style/dark/checkbox/core_checkbox_pressed.png
deleted file mode 100644
index 507a77b3ea..0000000000
--- a/src/plugins/styles/bb10style/dark/checkbox/core_checkbox_pressed.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/checkbox/core_checkbox_pressed_checked.png b/src/plugins/styles/bb10style/dark/checkbox/core_checkbox_pressed_checked.png
deleted file mode 100644
index 7fa85428a0..0000000000
--- a/src/plugins/styles/bb10style/dark/checkbox/core_checkbox_pressed_checked.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/combobox/core_dropdown_button.png b/src/plugins/styles/bb10style/dark/combobox/core_dropdown_button.png
deleted file mode 100644
index a68d93acb5..0000000000
--- a/src/plugins/styles/bb10style/dark/combobox/core_dropdown_button.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/combobox/core_dropdown_button_arrowdown.png b/src/plugins/styles/bb10style/dark/combobox/core_dropdown_button_arrowdown.png
deleted file mode 100644
index 4c1d085360..0000000000
--- a/src/plugins/styles/bb10style/dark/combobox/core_dropdown_button_arrowdown.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/combobox/core_dropdown_button_arrowdown_pressed.png b/src/plugins/styles/bb10style/dark/combobox/core_dropdown_button_arrowdown_pressed.png
deleted file mode 100644
index 1ee578e07c..0000000000
--- a/src/plugins/styles/bb10style/dark/combobox/core_dropdown_button_arrowdown_pressed.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/combobox/core_dropdown_button_arrowup.png b/src/plugins/styles/bb10style/dark/combobox/core_dropdown_button_arrowup.png
deleted file mode 100644
index 3239ef4bd6..0000000000
--- a/src/plugins/styles/bb10style/dark/combobox/core_dropdown_button_arrowup.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/combobox/core_dropdown_button_disabled.png b/src/plugins/styles/bb10style/dark/combobox/core_dropdown_button_disabled.png
deleted file mode 100644
index af6793b87c..0000000000
--- a/src/plugins/styles/bb10style/dark/combobox/core_dropdown_button_disabled.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/combobox/core_dropdown_button_pressed.png b/src/plugins/styles/bb10style/dark/combobox/core_dropdown_button_pressed.png
deleted file mode 100644
index df6d402554..0000000000
--- a/src/plugins/styles/bb10style/dark/combobox/core_dropdown_button_pressed.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/combobox/core_dropdown_checkmark.png b/src/plugins/styles/bb10style/dark/combobox/core_dropdown_checkmark.png
deleted file mode 100644
index 578c80aa5f..0000000000
--- a/src/plugins/styles/bb10style/dark/combobox/core_dropdown_checkmark.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/combobox/core_dropdown_divider.png b/src/plugins/styles/bb10style/dark/combobox/core_dropdown_divider.png
deleted file mode 100644
index 43b1025d36..0000000000
--- a/src/plugins/styles/bb10style/dark/combobox/core_dropdown_divider.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/combobox/core_dropdown_menu.png b/src/plugins/styles/bb10style/dark/combobox/core_dropdown_menu.png
deleted file mode 100644
index 1f52362050..0000000000
--- a/src/plugins/styles/bb10style/dark/combobox/core_dropdown_menu.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/combobox/core_dropdown_menuup.png b/src/plugins/styles/bb10style/dark/combobox/core_dropdown_menuup.png
deleted file mode 100644
index 62c7a2e558..0000000000
--- a/src/plugins/styles/bb10style/dark/combobox/core_dropdown_menuup.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/combobox/core_listitem_active.png b/src/plugins/styles/bb10style/dark/combobox/core_listitem_active.png
deleted file mode 100644
index 1df4a7aad9..0000000000
--- a/src/plugins/styles/bb10style/dark/combobox/core_listitem_active.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/lineedit/core_textinput_bg.png b/src/plugins/styles/bb10style/dark/lineedit/core_textinput_bg.png
deleted file mode 100644
index 07b8ea21bf..0000000000
--- a/src/plugins/styles/bb10style/dark/lineedit/core_textinput_bg.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/lineedit/core_textinput_bg_disabled.png b/src/plugins/styles/bb10style/dark/lineedit/core_textinput_bg_disabled.png
deleted file mode 100644
index 6bcaf91f87..0000000000
--- a/src/plugins/styles/bb10style/dark/lineedit/core_textinput_bg_disabled.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/lineedit/core_textinput_bg_highlight.png b/src/plugins/styles/bb10style/dark/lineedit/core_textinput_bg_highlight.png
deleted file mode 100644
index 9b115897e8..0000000000
--- a/src/plugins/styles/bb10style/dark/lineedit/core_textinput_bg_highlight.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/listitem/core_listitem_active.png b/src/plugins/styles/bb10style/dark/listitem/core_listitem_active.png
deleted file mode 100644
index 52aa4e4aa2..0000000000
--- a/src/plugins/styles/bb10style/dark/listitem/core_listitem_active.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/listitem/core_listitem_divider.png b/src/plugins/styles/bb10style/dark/listitem/core_listitem_divider.png
deleted file mode 100644
index 39e3a8a4f5..0000000000
--- a/src/plugins/styles/bb10style/dark/listitem/core_listitem_divider.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_bg.png b/src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_bg.png
deleted file mode 100644
index 95fcafb437..0000000000
--- a/src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_bg.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_complete.png b/src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_complete.png
deleted file mode 100644
index e849c8f179..0000000000
--- a/src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_complete.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_fill.png b/src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_fill.png
deleted file mode 100644
index e8fd3b0173..0000000000
--- a/src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_fill.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_vbg.png b/src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_vbg.png
deleted file mode 100644
index 1433f3ec33..0000000000
--- a/src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_vbg.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_vcomplete.png b/src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_vcomplete.png
deleted file mode 100644
index d750e4671c..0000000000
--- a/src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_vcomplete.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_vfill.png b/src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_vfill.png
deleted file mode 100644
index 2c3c0a5e6c..0000000000
--- a/src/plugins/styles/bb10style/dark/progressbar/core_progressindicator_vfill.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/radiobutton/core_radiobutton_checked.png b/src/plugins/styles/bb10style/dark/radiobutton/core_radiobutton_checked.png
deleted file mode 100644
index 1721586ac5..0000000000
--- a/src/plugins/styles/bb10style/dark/radiobutton/core_radiobutton_checked.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/radiobutton/core_radiobutton_disabled.png b/src/plugins/styles/bb10style/dark/radiobutton/core_radiobutton_disabled.png
deleted file mode 100644
index e646c9174b..0000000000
--- a/src/plugins/styles/bb10style/dark/radiobutton/core_radiobutton_disabled.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/radiobutton/core_radiobutton_disabled_checked.png b/src/plugins/styles/bb10style/dark/radiobutton/core_radiobutton_disabled_checked.png
deleted file mode 100644
index 93b3118e8d..0000000000
--- a/src/plugins/styles/bb10style/dark/radiobutton/core_radiobutton_disabled_checked.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/radiobutton/core_radiobutton_inactive.png b/src/plugins/styles/bb10style/dark/radiobutton/core_radiobutton_inactive.png
deleted file mode 100644
index fd61937d65..0000000000
--- a/src/plugins/styles/bb10style/dark/radiobutton/core_radiobutton_inactive.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/radiobutton/core_radiobutton_pressed.png b/src/plugins/styles/bb10style/dark/radiobutton/core_radiobutton_pressed.png
deleted file mode 100644
index 58a1a57b4c..0000000000
--- a/src/plugins/styles/bb10style/dark/radiobutton/core_radiobutton_pressed.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/scrollbar/core_scrollbar.png b/src/plugins/styles/bb10style/dark/scrollbar/core_scrollbar.png
deleted file mode 100644
index 384f60758a..0000000000
--- a/src/plugins/styles/bb10style/dark/scrollbar/core_scrollbar.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/scrollbar/core_scrollbar_v.png b/src/plugins/styles/bb10style/dark/scrollbar/core_scrollbar_v.png
deleted file mode 100644
index 2542f2acaf..0000000000
--- a/src/plugins/styles/bb10style/dark/scrollbar/core_scrollbar_v.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/slider/core_slider_active.png b/src/plugins/styles/bb10style/dark/slider/core_slider_active.png
deleted file mode 100644
index 6bdb413ced..0000000000
--- a/src/plugins/styles/bb10style/dark/slider/core_slider_active.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/slider/core_slider_cache.png b/src/plugins/styles/bb10style/dark/slider/core_slider_cache.png
deleted file mode 100644
index eea5b3d78e..0000000000
--- a/src/plugins/styles/bb10style/dark/slider/core_slider_cache.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/slider/core_slider_disabled.png b/src/plugins/styles/bb10style/dark/slider/core_slider_disabled.png
deleted file mode 100644
index 6a233315e4..0000000000
--- a/src/plugins/styles/bb10style/dark/slider/core_slider_disabled.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/slider/core_slider_enabled.png b/src/plugins/styles/bb10style/dark/slider/core_slider_enabled.png
deleted file mode 100644
index 2b297e5ca2..0000000000
--- a/src/plugins/styles/bb10style/dark/slider/core_slider_enabled.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/slider/core_slider_handle.png b/src/plugins/styles/bb10style/dark/slider/core_slider_handle.png
deleted file mode 100644
index fbd37e5584..0000000000
--- a/src/plugins/styles/bb10style/dark/slider/core_slider_handle.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/slider/core_slider_handle_disabled.png b/src/plugins/styles/bb10style/dark/slider/core_slider_handle_disabled.png
deleted file mode 100644
index 49cb6a42a7..0000000000
--- a/src/plugins/styles/bb10style/dark/slider/core_slider_handle_disabled.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/slider/core_slider_handle_pressed.png b/src/plugins/styles/bb10style/dark/slider/core_slider_handle_pressed.png
deleted file mode 100644
index 803c374015..0000000000
--- a/src/plugins/styles/bb10style/dark/slider/core_slider_handle_pressed.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/slider/core_slider_inactive.png b/src/plugins/styles/bb10style/dark/slider/core_slider_inactive.png
deleted file mode 100644
index 08a1aecb6c..0000000000
--- a/src/plugins/styles/bb10style/dark/slider/core_slider_inactive.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/slider/core_slider_vactive.png b/src/plugins/styles/bb10style/dark/slider/core_slider_vactive.png
deleted file mode 100644
index c8e467d9e6..0000000000
--- a/src/plugins/styles/bb10style/dark/slider/core_slider_vactive.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/slider/core_slider_vcache.png b/src/plugins/styles/bb10style/dark/slider/core_slider_vcache.png
deleted file mode 100644
index ff160cbb1d..0000000000
--- a/src/plugins/styles/bb10style/dark/slider/core_slider_vcache.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/slider/core_slider_vdisabled.png b/src/plugins/styles/bb10style/dark/slider/core_slider_vdisabled.png
deleted file mode 100644
index 27d348122b..0000000000
--- a/src/plugins/styles/bb10style/dark/slider/core_slider_vdisabled.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/slider/core_slider_venabled.png b/src/plugins/styles/bb10style/dark/slider/core_slider_venabled.png
deleted file mode 100644
index ff8a74a19f..0000000000
--- a/src/plugins/styles/bb10style/dark/slider/core_slider_venabled.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/dark/slider/core_slider_vinactive.png b/src/plugins/styles/bb10style/dark/slider/core_slider_vinactive.png
deleted file mode 100644
index b2b19a5460..0000000000
--- a/src/plugins/styles/bb10style/dark/slider/core_slider_vinactive.png
+++ /dev/null
Binary files differ
diff --git a/src/plugins/styles/bb10style/qbb10brightstyle.cpp b/src/plugins/styles/bb10style/qbb10brightstyle.cpp
deleted file mode 100644
index 9f14e3b134..0000000000
--- a/src/plugins/styles/bb10style/qbb10brightstyle.cpp
+++ /dev/null
@@ -1,344 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2014 BlackBerry Limited. All rights reserved.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qbb10brightstyle.h"
-
-#include <QApplication>
-#include <QFont>
-#include <QStyleOption>
-#include <QProgressBar>
-#include <QComboBox>
-#include <QAbstractItemView>
-#include <QPainter>
-
-QT_BEGIN_NAMESPACE
-
-QBB10BrightStyle::QBB10BrightStyle() :
- QPixmapStyle()
-{
- addDescriptor(PB_Enabled,
- QLatin1String("://bright/button/core_button_inactive.png"),
- QMargins(13, 13, 13, 13),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(PB_Checked,
- QLatin1String("://bright/button/core_button_enabled_selected.png"),
- QMargins(13, 13, 13, 13),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(PB_Pressed,
- QLatin1String("://bright/button/core_button_pressed.png"),
- QMargins(13, 13, 13, 13),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(PB_Disabled,
- QLatin1String("://bright/button/core_button_disabled.png"),
- QMargins(13, 13, 13, 13),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(PB_PressedDisabled,
- QLatin1String("://bright/button/core_button_disabled_selected.png"),
- QMargins(13, 13, 13, 13),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
-
- addDescriptor(LE_Enabled,
- QLatin1String("://bright/lineedit/core_textinput_bg.png"),
- QMargins(8, 8, 8, 8));
- addDescriptor(LE_Disabled,
- QLatin1String("://bright/lineedit/core_textinput_bg_disabled.png"),
- QMargins(8, 8, 8, 8));
- addDescriptor(LE_Focused,
- QLatin1String("://bright/lineedit/core_textinput_bg_highlight.png"),
- QMargins(8, 8, 8, 8));
-
- copyDescriptor(LE_Enabled, TE_Enabled);
- copyDescriptor(LE_Disabled, TE_Disabled);
- copyDescriptor(LE_Focused, TE_Focused);
-
- addPixmap(CB_Enabled,
- QLatin1String("://bright/checkbox/core_checkbox_enabled.png"),
- QMargins(16, 16, 16, 16));
- addPixmap(CB_Checked,
- QLatin1String("://bright/checkbox/core_checkbox_checked.png"),
- QMargins(16, 16, 16, 16));
- addPixmap(CB_Pressed,
- QLatin1String("://bright/checkbox/core_checkbox_pressed.png"),
- QMargins(16, 16, 16, 16));
- addPixmap(CB_PressedChecked,
- QLatin1String("://bright/checkbox/core_checkbox_pressed_checked.png"),
- QMargins(16, 16, 16, 16));
- addPixmap(CB_Disabled,
- QLatin1String("://bright/checkbox/core_checkbox_disabled.png"),
- QMargins(16, 16, 16, 16));
- addPixmap(CB_DisabledChecked,
- QLatin1String("://bright/checkbox/core_checkbox_disabled_checked.png"),
- QMargins(16, 16, 16, 16));
-
- addPixmap(RB_Enabled,
- QLatin1String("://bright/radiobutton/core_radiobutton_inactive.png"),
- QMargins(16, 16, 16, 16));
- addPixmap(RB_Checked,
- QLatin1String("://bright/radiobutton/core_radiobutton_checked.png"),
- QMargins(16, 16, 16, 16));
- addPixmap(RB_Pressed,
- QLatin1String("://bright/radiobutton/core_radiobutton_pressed.png"),
- QMargins(16, 16, 16, 16));
- addPixmap(RB_Disabled,
- QLatin1String("://bright/radiobutton/core_radiobutton_disabled.png"),
- QMargins(16, 16, 16, 16));
- addPixmap(RB_DisabledChecked,
- QLatin1String("://bright/radiobutton/core_radiobutton_disabled_checked.png"),
- QMargins(16, 16, 16, 16));
-
- addDescriptor(PB_HBackground,
- QLatin1String("://bright/progressbar/core_progressindicator_bg.png"),
- QMargins(10, 10, 10, 10),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(PB_HContent,
- QLatin1String("://bright/progressbar/core_progressindicator_fill.png"),
- QMargins(10, 10, 10, 10),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(PB_HComplete,
- QLatin1String("://bright/progressbar/core_progressindicator_complete.png"),
- QMargins(10, 10, 10, 10),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(PB_VBackground,
- QLatin1String("://bright/progressbar/core_progressindicator_vbg.png"),
- QMargins(10, 10, 10, 10),
- QTileRules(Qt::StretchTile, Qt::RepeatTile));
- addDescriptor(PB_VContent,
- QLatin1String("://bright/progressbar/core_progressindicator_vfill.png"),
- QMargins(10, 10, 10, 10),
- QTileRules(Qt::StretchTile, Qt::RepeatTile));
- addDescriptor(PB_VComplete,
- QLatin1String("://bright/progressbar/core_progressindicator_vcomplete.png"),
- QMargins(10, 10, 10, 10),
- QTileRules(Qt::StretchTile, Qt::RepeatTile));
-
- addDescriptor(SG_HEnabled,
- QLatin1String("://bright/slider/core_slider_enabled.png"),
- QMargins(50, 50, 50, 50),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(SG_HDisabled,
- QLatin1String("://bright/slider/core_slider_disabled.png"),
- QMargins(50, 50, 50, 50),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(SG_HActiveEnabled,
- QLatin1String("://bright/slider/core_slider_inactive.png"),
- QMargins(50, 50, 50, 50),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(SG_HActivePressed,
- QLatin1String("://bright/slider/core_slider_active.png"),
- QMargins(50, 50, 50, 50),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(SG_HActiveDisabled,
- QLatin1String("://bright/slider/core_slider_cache.png"),
- QMargins(50, 50, 50, 50),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(SG_VEnabled,
- QLatin1String("://bright/slider/core_slider_venabled.png"),
- QMargins(50, 50, 50, 50),
- QTileRules(Qt::StretchTile, Qt::RepeatTile));
- addDescriptor(SG_VDisabled,
- QLatin1String("://bright/slider/core_slider_vdisabled.png"),
- QMargins(50, 50, 50, 50),
- QTileRules(Qt::StretchTile, Qt::RepeatTile));
- addDescriptor(SG_VActiveEnabled,
- QLatin1String("://bright/slider/core_slider_vinactive.png"),
- QMargins(50, 50, 50, 50),
- QTileRules(Qt::StretchTile, Qt::RepeatTile));
- addDescriptor(SG_VActivePressed,
- QLatin1String("://bright/slider/core_slider_vactive.png"),
- QMargins(50, 50, 50, 50),
- QTileRules(Qt::StretchTile, Qt::RepeatTile));
- addDescriptor(SG_VActiveDisabled,
- QLatin1String("://bright/slider/core_slider_vcache.png"),
- QMargins(50, 50, 50, 50),
- QTileRules(Qt::StretchTile, Qt::RepeatTile));
-
- addPixmap(SH_HEnabled,
- QLatin1String("://bright/slider/core_slider_handle.png"));
- addPixmap(SH_HDisabled,
- QLatin1String("://bright/slider/core_slider_handle_disabled.png"));
- addPixmap(SH_HPressed,
- QLatin1String("://bright/slider/core_slider_handle_pressed.png"));
- addPixmap(SH_VEnabled,
- QLatin1String("://bright/slider/core_slider_handle.png"));
- addPixmap(SH_VDisabled,
- QLatin1String("://bright/slider/core_slider_handle_disabled.png"));
- addPixmap(SH_VPressed,
- QLatin1String("://bright/slider/core_slider_handle_pressed.png"));
-
- addDescriptor(DD_ButtonEnabled,
- QLatin1String("://bright/combobox/core_dropdown_button.png"),
- QMargins(14, 14, 14, 14),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(DD_ButtonDisabled,
- QLatin1String("://bright/combobox/core_dropdown_button_disabled.png"),
- QMargins(14, 14, 14, 14),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(DD_ButtonPressed,
- QLatin1String("://bright/combobox/core_dropdown_button_pressed.png"),
- QMargins(14, 14, 14, 14),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(DD_ItemSelected,
- QLatin1String("://bright/combobox/core_listitem_active.png"));
-
- addPixmap(DD_ArrowEnabled,
- QLatin1String("://bright/combobox/core_dropdown_button_arrowdown.png"),
- QMargins(35, 39, 35, 39));
- copyPixmap(DD_ArrowEnabled, DD_ArrowDisabled);
- addPixmap(DD_ArrowPressed,
- QLatin1String("://bright/combobox/core_dropdown_button_arrowdown_pressed.png"),
- QMargins(35, 39, 35, 39));
- addPixmap(DD_ArrowOpen,
- QLatin1String("://bright/combobox/core_dropdown_button_arrowup.png"),
- QMargins(35, 39, 35, 39));
- addDescriptor(DD_PopupDown,
- QLatin1String("://bright/combobox/core_dropdown_menu.png"),
- QMargins(12, 12, 12, 12),
- QTileRules(Qt::StretchTile, Qt::StretchTile));
- addDescriptor(DD_PopupUp,
- QLatin1String("://bright/combobox/core_dropdown_menuup.png"),
- QMargins(12, 12, 12, 12),
- QTileRules(Qt::StretchTile, Qt::StretchTile));
- addPixmap(DD_ItemSeparator,
- QLatin1String("://bright/combobox/core_dropdown_divider.png"),
- QMargins(5, 0, 5, 0));
-
- addDescriptor(ID_Selected,
- QLatin1String("://bright/listitem/core_listitem_active.png"));
- addPixmap(ID_Separator,
- QLatin1String("://bright/listitem/core_listitem_divider.png"));
-
- addDescriptor(SB_Horizontal,
- QLatin1String("://bright/scrollbar/core_scrollbar.png"),
- QMargins(7, 8, 7, 8),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(SB_Vertical,
- QLatin1String("://bright/scrollbar/core_scrollbar_v.png"),
- QMargins(8, 7, 8, 7),
- QTileRules(Qt::StretchTile, Qt::RepeatTile));
-}
-
-QBB10BrightStyle::~QBB10BrightStyle()
-{
-}
-
-void QBB10BrightStyle::polish(QApplication *application)
-{
- QPixmapStyle::polish(application);
-}
-
-void QBB10BrightStyle::polish(QWidget *widget)
-{
- // Hide the text by default
- if (QProgressBar *pb = qobject_cast<QProgressBar*>(widget))
- pb->setTextVisible(false);
-
- if (QComboBox *cb = qobject_cast<QComboBox*>(widget)) {
- QAbstractItemView *list = cb->view();
- QPalette p = list->palette();
- p.setBrush(QPalette::HighlightedText, p.brush(QPalette::Text));
- list->setPalette(p);
- }
-
- if (qobject_cast<QAbstractItemView*>(widget)) {
- QPalette p = widget->palette();
- p.setBrush(QPalette::Disabled, QPalette::HighlightedText, p.brush(QPalette::Text));
- widget->setPalette(p);
- }
-
- QPixmapStyle::polish(widget);
-}
-
-QPalette QBB10BrightStyle::standardPalette() const
-{
- QPalette p;
-
- QColor color = QColor(38, 38, 38);
- p.setBrush(QPalette::ButtonText, color);
- p.setBrush(QPalette::WindowText, color);
- p.setBrush(QPalette::Text, color);
-
- color.setAlpha(179);
- p.setBrush(QPalette::Disabled, QPalette::ButtonText, color);
- p.setBrush(QPalette::Disabled, QPalette::WindowText, color);
- p.setBrush(QPalette::Disabled, QPalette::Text, color);
-
- p.setColor(QPalette::Window, QColor(248, 248, 248));
-
- p.setBrush(QPalette::Highlight, QColor(0, 168, 223));
- p.setBrush(QPalette::HighlightedText, QColor(250, 250,250));
-
- return p;
-}
-
-void QBB10BrightStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option,
- QPainter *painter, const QWidget *widget) const
-{
- switch (element) {
- case CE_PushButtonLabel:
- {
- const bool on = option->state & State_On || option->state & State_Sunken;
- const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton*>(option);
- QStyleOptionButton newOpt = *button;
- if (on)
- newOpt.palette.setBrush(QPalette::ButtonText, QColor(250, 250, 250));
- QPixmapStyle::drawControl(CE_PushButtonLabel, &newOpt, painter, widget);
- break;
- }
- case CE_ProgressBarLabel:
- // Don't draw the progress bar label
- break;
- default:
- QPixmapStyle::drawControl(element, option, painter, widget);
- }
-}
-
-void QBB10BrightStyle::drawPrimitive(QStyle::PrimitiveElement element, const QStyleOption *option,
- QPainter *painter, const QWidget *widget) const
-{
- QPixmapStyle::drawPrimitive(element, option, painter, widget);
-
- if (element == PE_PanelItemViewItem) {
- // Draw the checkbox for current item
- if (widget->property("_pixmap_combobox_list").toBool()
- && option->state & QStyle::State_Selected) {
- QPixmap pix(QLatin1String("://bright/combobox/core_dropdown_checkmark.png"));
- QRect rect = option->rect;
- const int margin = rect.height() / 2;
- QPoint pos(rect.right() - margin - pix.width() / 2,
- rect.top() + margin - pix.height() / 2);
- painter->drawPixmap(pos, pix);
- }
- }
-}
-
-QT_END_NAMESPACE
diff --git a/src/plugins/styles/bb10style/qbb10brightstyle.qrc b/src/plugins/styles/bb10style/qbb10brightstyle.qrc
deleted file mode 100644
index 2172536fa3..0000000000
--- a/src/plugins/styles/bb10style/qbb10brightstyle.qrc
+++ /dev/null
@@ -1,57 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>bright/button/core_button_disabled.png</file>
- <file>bright/button/core_button_disabled_selected.png</file>
- <file>bright/button/core_button_inactive.png</file>
- <file>bright/button/core_button_enabled_selected.png</file>
- <file>bright/button/core_button_pressed.png</file>
- <file>bright/checkbox/core_checkbox_checked.png</file>
- <file>bright/checkbox/core_checkbox_disabled.png</file>
- <file>bright/checkbox/core_checkbox_disabled_checked.png</file>
- <file>bright/checkbox/core_checkbox_enabled.png</file>
- <file>bright/checkbox/core_checkbox_pressed.png</file>
- <file>bright/checkbox/core_checkbox_pressed_checked.png</file>
- <file>bright/combobox/core_dropdown_button.png</file>
- <file>bright/combobox/core_dropdown_button_arrowdown.png</file>
- <file>bright/combobox/core_dropdown_button_arrowdown_pressed.png</file>
- <file>bright/combobox/core_dropdown_button_arrowup.png</file>
- <file>bright/combobox/core_dropdown_button_disabled.png</file>
- <file>bright/combobox/core_dropdown_button_pressed.png</file>
- <file>bright/combobox/core_dropdown_checkmark.png</file>
- <file>bright/combobox/core_dropdown_divider.png</file>
- <file>bright/combobox/core_dropdown_menu.png</file>
- <file>bright/combobox/core_dropdown_menuup.png</file>
- <file>bright/combobox/core_listitem_active.png</file>
- <file>bright/lineedit/core_textinput_bg.png</file>
- <file>bright/lineedit/core_textinput_bg_disabled.png</file>
- <file>bright/lineedit/core_textinput_bg_highlight.png</file>
- <file>bright/listitem/core_listitem_active.png</file>
- <file>bright/listitem/core_listitem_divider.png</file>
- <file>bright/progressbar/core_progressindicator_bg.png</file>
- <file>bright/progressbar/core_progressindicator_complete.png</file>
- <file>bright/progressbar/core_progressindicator_fill.png</file>
- <file>bright/progressbar/core_progressindicator_vbg.png</file>
- <file>bright/progressbar/core_progressindicator_vcomplete.png</file>
- <file>bright/progressbar/core_progressindicator_vfill.png</file>
- <file>bright/radiobutton/core_radiobutton_checked.png</file>
- <file>bright/radiobutton/core_radiobutton_disabled.png</file>
- <file>bright/radiobutton/core_radiobutton_disabled_checked.png</file>
- <file>bright/radiobutton/core_radiobutton_inactive.png</file>
- <file>bright/radiobutton/core_radiobutton_pressed.png</file>
- <file>bright/scrollbar/core_scrollbar.png</file>
- <file>bright/scrollbar/core_scrollbar_v.png</file>
- <file>bright/slider/core_slider_active.png</file>
- <file>bright/slider/core_slider_cache.png</file>
- <file>bright/slider/core_slider_disabled.png</file>
- <file>bright/slider/core_slider_enabled.png</file>
- <file>bright/slider/core_slider_handle.png</file>
- <file>bright/slider/core_slider_handle_disabled.png</file>
- <file>bright/slider/core_slider_handle_pressed.png</file>
- <file>bright/slider/core_slider_inactive.png</file>
- <file>bright/slider/core_slider_vactive.png</file>
- <file>bright/slider/core_slider_vcache.png</file>
- <file>bright/slider/core_slider_vdisabled.png</file>
- <file>bright/slider/core_slider_venabled.png</file>
- <file>bright/slider/core_slider_vinactive.png</file>
- </qresource>
-</RCC>
diff --git a/src/plugins/styles/bb10style/qbb10darkstyle.cpp b/src/plugins/styles/bb10style/qbb10darkstyle.cpp
deleted file mode 100644
index be2697510e..0000000000
--- a/src/plugins/styles/bb10style/qbb10darkstyle.cpp
+++ /dev/null
@@ -1,349 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2014 BlackBerry Limited. All rights reserved.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qbb10darkstyle.h"
-
-#include <QApplication>
-#include <QFont>
-#include <QStyleOption>
-#include <QProgressBar>
-#include <QComboBox>
-#include <QAbstractItemView>
-#include <QPainter>
-#include <QLineEdit>
-#include <QTextEdit>
-
-QT_BEGIN_NAMESPACE
-
-QBB10DarkStyle::QBB10DarkStyle() :
- QPixmapStyle()
-{
- addDescriptor(PB_Enabled,
- QLatin1String("://dark/button/core_button_inactive.png"),
- QMargins(13, 13, 13, 13),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(PB_Checked,
- QLatin1String("://dark/button/core_button_enabled_selected.png"),
- QMargins(13, 13, 13, 13),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(PB_Pressed,
- QLatin1String("://dark/button/core_button_pressed.png"),
- QMargins(13, 13, 13, 13),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(PB_Disabled,
- QLatin1String("://dark/button/core_button_disabled.png"),
- QMargins(13, 13, 13, 13),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(PB_PressedDisabled,
- QLatin1String("://dark/button/core_button_disabled_selected.png"),
- QMargins(13, 13, 13, 13),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
-
- addDescriptor(LE_Enabled,
- QLatin1String("://dark/lineedit/core_textinput_bg.png"),
- QMargins(8, 8, 8, 8));
- addDescriptor(LE_Disabled,
- QLatin1String("://dark/lineedit/core_textinput_bg_disabled.png"),
- QMargins(8, 8, 8, 8));
- addDescriptor(LE_Focused,
- QLatin1String("://dark/lineedit/core_textinput_bg_highlight.png"),
- QMargins(8, 8, 8, 8));
-
- copyDescriptor(LE_Enabled, TE_Enabled);
- copyDescriptor(LE_Disabled, TE_Disabled);
- copyDescriptor(LE_Focused, TE_Focused);
-
- addPixmap(CB_Enabled,
- QLatin1String("://dark/checkbox/core_checkbox_enabled.png"),
- QMargins(16, 16, 16, 16));
- addPixmap(CB_Checked,
- QLatin1String("://dark/checkbox/core_checkbox_checked.png"),
- QMargins(16, 16, 16, 16));
- addPixmap(CB_Pressed,
- QLatin1String("://dark/checkbox/core_checkbox_pressed.png"),
- QMargins(16, 16, 16, 16));
- addPixmap(CB_PressedChecked,
- QLatin1String("://dark/checkbox/core_checkbox_pressed_checked.png"),
- QMargins(16, 16, 16, 16));
- addPixmap(CB_Disabled,
- QLatin1String("://dark/checkbox/core_checkbox_disabled.png"),
- QMargins(16, 16, 16, 16));
- addPixmap(CB_DisabledChecked,
- QLatin1String("://dark/checkbox/core_checkbox_disabled_checked.png"),
- QMargins(16, 16, 16, 16));
-
- addPixmap(RB_Enabled,
- QLatin1String("://dark/radiobutton/core_radiobutton_inactive.png"),
- QMargins(16, 16, 16, 16));
- addPixmap(RB_Checked,
- QLatin1String("://dark/radiobutton/core_radiobutton_checked.png"),
- QMargins(16, 16, 16, 16));
- addPixmap(RB_Pressed,
- QLatin1String("://dark/radiobutton/core_radiobutton_pressed.png"),
- QMargins(16, 16, 16, 16));
- addPixmap(RB_Disabled,
- QLatin1String("://dark/radiobutton/core_radiobutton_disabled.png"),
- QMargins(16, 16, 16, 16));
- addPixmap(RB_DisabledChecked,
- QLatin1String("://dark/radiobutton/core_radiobutton_disabled_checked.png"),
- QMargins(16, 16, 16, 16));
-
- addDescriptor(PB_HBackground,
- QLatin1String("://dark/progressbar/core_progressindicator_bg.png"),
- QMargins(10, 10, 10, 10),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(PB_HContent,
- QLatin1String("://dark/progressbar/core_progressindicator_fill.png"),
- QMargins(10, 10, 10, 10),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(PB_HComplete,
- QLatin1String("://dark/progressbar/core_progressindicator_complete.png"),
- QMargins(10, 10, 10, 10),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(PB_VBackground,
- QLatin1String("://dark/progressbar/core_progressindicator_vbg.png"),
- QMargins(10, 10, 10, 10),
- QTileRules(Qt::StretchTile, Qt::RepeatTile));
- addDescriptor(PB_VContent,
- QLatin1String("://dark/progressbar/core_progressindicator_vfill.png"),
- QMargins(10, 10, 10, 10),
- QTileRules(Qt::StretchTile, Qt::RepeatTile));
- addDescriptor(PB_VComplete,
- QLatin1String("://dark/progressbar/core_progressindicator_vcomplete.png"),
- QMargins(10, 10, 10, 10),
- QTileRules(Qt::StretchTile, Qt::RepeatTile));
-
- addDescriptor(SG_HEnabled,
- QLatin1String("://dark/slider/core_slider_enabled.png"),
- QMargins(50, 50, 50, 50),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(SG_HDisabled,
- QLatin1String("://dark/slider/core_slider_disabled.png"),
- QMargins(50, 50, 50, 50),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(SG_HActiveEnabled,
- QLatin1String("://dark/slider/core_slider_inactive.png"),
- QMargins(50, 50, 50, 50),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(SG_HActivePressed,
- QLatin1String("://dark/slider/core_slider_active.png"),
- QMargins(50, 50, 50, 50),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(SG_HActiveDisabled,
- QLatin1String("://dark/slider/core_slider_cache.png"),
- QMargins(50, 50, 50, 50),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(SG_VEnabled,
- QLatin1String("://dark/slider/core_slider_venabled.png"),
- QMargins(50, 50, 50, 50),
- QTileRules(Qt::StretchTile, Qt::RepeatTile));
- addDescriptor(SG_VDisabled,
- QLatin1String("://dark/slider/core_slider_vdisabled.png"),
- QMargins(50, 50, 50, 50),
- QTileRules(Qt::StretchTile, Qt::RepeatTile));
- addDescriptor(SG_VActiveEnabled,
- QLatin1String("://dark/slider/core_slider_vinactive.png"),
- QMargins(50, 50, 50, 50),
- QTileRules(Qt::StretchTile, Qt::RepeatTile));
- addDescriptor(SG_VActivePressed,
- QLatin1String("://dark/slider/core_slider_vactive.png"),
- QMargins(50, 50, 50, 50),
- QTileRules(Qt::StretchTile, Qt::RepeatTile));
- addDescriptor(SG_VActiveDisabled,
- QLatin1String("://dark/slider/core_slider_vcache.png"),
- QMargins(50, 50, 50, 50),
- QTileRules(Qt::StretchTile, Qt::RepeatTile));
-
- addPixmap(SH_HEnabled,
- QLatin1String("://dark/slider/core_slider_handle.png"));
- addPixmap(SH_HDisabled,
- QLatin1String("://dark/slider/core_slider_handle_disabled.png"));
- addPixmap(SH_HPressed,
- QLatin1String("://dark/slider/core_slider_handle_pressed.png"));
- addPixmap(SH_VEnabled,
- QLatin1String("://dark/slider/core_slider_handle.png"));
- addPixmap(SH_VDisabled,
- QLatin1String("://dark/slider/core_slider_handle_disabled.png"));
- addPixmap(SH_VPressed,
- QLatin1String("://dark/slider/core_slider_handle_pressed.png"));
-
- addDescriptor(DD_ButtonEnabled,
- QLatin1String("://dark/combobox/core_dropdown_button.png"),
- QMargins(14, 14, 14, 14),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(DD_ButtonDisabled,
- QLatin1String("://dark/combobox/core_dropdown_button_disabled.png"),
- QMargins(14, 14, 14, 14),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(DD_ButtonPressed,
- QLatin1String("://dark/combobox/core_dropdown_button_pressed.png"),
- QMargins(14, 14, 14, 14),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(DD_ItemSelected,
- QLatin1String("://dark/combobox/core_listitem_active.png"));
- addPixmap(DD_ArrowEnabled,
- QLatin1String("://dark/combobox/core_dropdown_button_arrowdown.png"),
- QMargins(35, 39, 35, 39));
- copyPixmap(DD_ArrowEnabled, DD_ArrowDisabled);
- addPixmap(DD_ArrowPressed,
- QLatin1String("://dark/combobox/core_dropdown_button_arrowdown_pressed.png"),
- QMargins(35, 39, 35, 39));
- addPixmap(DD_ArrowOpen,
- QLatin1String("://dark/combobox/core_dropdown_button_arrowup.png"),
- QMargins(35, 39, 35, 39));
- addDescriptor(DD_PopupDown,
- QLatin1String("://dark/combobox/core_dropdown_menu.png"),
- QMargins(12, 12, 12, 12), QTileRules(Qt::StretchTile, Qt::StretchTile));
- addDescriptor(DD_PopupUp,
- QLatin1String("://dark/combobox/core_dropdown_menuup.png"),
- QMargins(12, 12, 12, 12), QTileRules(Qt::StretchTile, Qt::StretchTile));
- addPixmap(DD_ItemSeparator,
- QLatin1String("://dark/combobox/core_dropdown_divider.png"),
- QMargins(5, 0, 5, 0));
-
- addDescriptor(ID_Selected,
- QLatin1String("://dark/listitem/core_listitem_active.png"));
- addPixmap(ID_Separator,
- QLatin1String("://dark/listitem/core_listitem_divider.png"));
-
- addDescriptor(SB_Horizontal,
- QLatin1String("://dark/scrollbar/core_scrollbar.png"),
- QMargins(7, 8, 7, 8),
- QTileRules(Qt::RepeatTile, Qt::StretchTile));
- addDescriptor(SB_Vertical,
- QLatin1String("://dark/scrollbar/core_scrollbar_v.png"),
- QMargins(8, 7, 8, 7),
- QTileRules(Qt::StretchTile, Qt::RepeatTile));
-}
-
-QBB10DarkStyle::~QBB10DarkStyle()
-{
-}
-
-void QBB10DarkStyle::polish(QApplication *application)
-{
- QPixmapStyle::polish(application);
-}
-
-void QBB10DarkStyle::polish(QWidget *widget)
-{
- // Hide the text by default
- if (QProgressBar *pb = qobject_cast<QProgressBar*>(widget))
- pb->setTextVisible(false);
-
- if (QComboBox *cb = qobject_cast<QComboBox*>(widget)) {
- QAbstractItemView *list = cb->view();
- QPalette p = list->palette();
- p.setBrush(QPalette::HighlightedText, p.brush(QPalette::Text));
- list->setPalette(p);
- }
-
- if (qobject_cast<QLineEdit*>(widget) || qobject_cast<QTextEdit*>(widget)) {
- QPalette p = widget->palette();
- p.setBrush(QPalette::Text, QColor(38, 38, 38));
- widget->setPalette(p);
- }
-
- if (qobject_cast<QAbstractItemView*>(widget)) {
- QPalette p = widget->palette();
- p.setBrush(QPalette::Disabled, QPalette::HighlightedText, p.brush(QPalette::Text));
- widget->setPalette(p);
- }
-
- QPixmapStyle::polish(widget);
-}
-
-QPalette QBB10DarkStyle::standardPalette() const
-{
- QPalette p;
-
- QColor color = QColor(250, 250, 250);
- p.setBrush(QPalette::ButtonText, color);
- p.setBrush(QPalette::WindowText, color);
- p.setBrush(QPalette::Text, color);
-
- color.setAlpha(179);
- p.setBrush(QPalette::Disabled, QPalette::ButtonText, color);
- p.setBrush(QPalette::Disabled, QPalette::WindowText, color);
- p.setBrush(QPalette::Disabled, QPalette::Text, color);
-
- p.setColor(QPalette::Window, QColor(18, 18, 18));
-
- p.setBrush(QPalette::Highlight, QColor(0, 168, 223));
- p.setBrush(QPalette::HighlightedText, QColor(250, 250,250));
-
- return p;
-}
-
-void QBB10DarkStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option,
- QPainter *painter, const QWidget *widget) const
-{
- switch (element) {
- case CE_PushButtonLabel:
- {
- const bool on = option->state & State_On || option->state & State_Sunken;
- const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton*>(option);
- QStyleOptionButton newOpt = *button;
- if (on)
- newOpt.palette.setBrush(QPalette::ButtonText, QColor(38, 38, 38));
- QPixmapStyle::drawControl(CE_PushButtonLabel, &newOpt, painter, widget);
- break;
- }
- case CE_ProgressBarLabel:
- // Don't draw the progress bar label
- break;
- default:
- QPixmapStyle::drawControl(element, option, painter, widget);
- }
-}
-
-void QBB10DarkStyle::drawPrimitive(QStyle::PrimitiveElement element, const QStyleOption *option,
- QPainter *painter, const QWidget *widget) const
-{
- QPixmapStyle::drawPrimitive(element, option, painter, widget);
-
- if (element == PE_PanelItemViewItem) {
- // Draw the checkbox for current item
- if (widget->property("_pixmap_combobox_list").toBool()
- && option->state & QStyle::State_Selected) {
- QPixmap pix(QLatin1String("://dark/combobox/core_dropdown_checkmark.png"));
- QRect rect = option->rect;
- const int margin = rect.height() / 2;
- QPoint pos(rect.right() - margin - pix.width() / 2,
- rect.top() + margin - pix.height() / 2);
- painter->drawPixmap(pos, pix);
- }
- }
-}
-
-QT_END_NAMESPACE
diff --git a/src/plugins/styles/bb10style/qbb10darkstyle.h b/src/plugins/styles/bb10style/qbb10darkstyle.h
deleted file mode 100644
index 65ba7cd283..0000000000
--- a/src/plugins/styles/bb10style/qbb10darkstyle.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2014 BlackBerry Limited. All rights reserved.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QBB10DARKSTYLE_H
-#define QBB10DARKSTYLE_H
-
-#include "qpixmapstyle.h"
-
-QT_BEGIN_NAMESPACE
-
-class QBB10DarkStyle : public QPixmapStyle
-{
- Q_OBJECT
-
-public:
- QBB10DarkStyle();
- ~QBB10DarkStyle();
-
- void polish(QApplication *application);
- void polish(QWidget *widget);
-
- QPalette standardPalette() const;
-
- void drawControl(ControlElement element, const QStyleOption *option,
- QPainter *painter, const QWidget *widget = 0) const;
- void drawPrimitive(PrimitiveElement element, const QStyleOption *option,
- QPainter *painter, const QWidget *widget) const;
-};
-
-QT_END_NAMESPACE
-
-#endif // QBB10DARKSTYLE_H
diff --git a/src/plugins/styles/bb10style/qbb10darkstyle.qrc b/src/plugins/styles/bb10style/qbb10darkstyle.qrc
deleted file mode 100644
index 31a5236207..0000000000
--- a/src/plugins/styles/bb10style/qbb10darkstyle.qrc
+++ /dev/null
@@ -1,57 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>dark/button/core_button_disabled.png</file>
- <file>dark/button/core_button_disabled_selected.png</file>
- <file>dark/button/core_button_inactive.png</file>
- <file>dark/button/core_button_enabled_selected.png</file>
- <file>dark/button/core_button_pressed.png</file>
- <file>dark/checkbox/core_checkbox_checked.png</file>
- <file>dark/checkbox/core_checkbox_disabled.png</file>
- <file>dark/checkbox/core_checkbox_disabled_checked.png</file>
- <file>dark/checkbox/core_checkbox_enabled.png</file>
- <file>dark/checkbox/core_checkbox_pressed.png</file>
- <file>dark/checkbox/core_checkbox_pressed_checked.png</file>
- <file>dark/combobox/core_dropdown_button.png</file>
- <file>dark/combobox/core_dropdown_button_arrowdown.png</file>
- <file>dark/combobox/core_dropdown_button_arrowdown_pressed.png</file>
- <file>dark/combobox/core_dropdown_button_arrowup.png</file>
- <file>dark/combobox/core_dropdown_button_disabled.png</file>
- <file>dark/combobox/core_dropdown_button_pressed.png</file>
- <file>dark/combobox/core_dropdown_checkmark.png</file>
- <file>dark/combobox/core_dropdown_divider.png</file>
- <file>dark/combobox/core_dropdown_menu.png</file>
- <file>dark/combobox/core_dropdown_menuup.png</file>
- <file>dark/combobox/core_listitem_active.png</file>
- <file>dark/lineedit/core_textinput_bg.png</file>
- <file>dark/lineedit/core_textinput_bg_disabled.png</file>
- <file>dark/lineedit/core_textinput_bg_highlight.png</file>
- <file>dark/listitem/core_listitem_active.png</file>
- <file>dark/listitem/core_listitem_divider.png</file>
- <file>dark/progressbar/core_progressindicator_bg.png</file>
- <file>dark/progressbar/core_progressindicator_complete.png</file>
- <file>dark/progressbar/core_progressindicator_fill.png</file>
- <file>dark/progressbar/core_progressindicator_vbg.png</file>
- <file>dark/progressbar/core_progressindicator_vcomplete.png</file>
- <file>dark/progressbar/core_progressindicator_vfill.png</file>
- <file>dark/radiobutton/core_radiobutton_checked.png</file>
- <file>dark/radiobutton/core_radiobutton_disabled.png</file>
- <file>dark/radiobutton/core_radiobutton_disabled_checked.png</file>
- <file>dark/radiobutton/core_radiobutton_inactive.png</file>
- <file>dark/radiobutton/core_radiobutton_pressed.png</file>
- <file>dark/scrollbar/core_scrollbar.png</file>
- <file>dark/scrollbar/core_scrollbar_v.png</file>
- <file>dark/slider/core_slider_active.png</file>
- <file>dark/slider/core_slider_cache.png</file>
- <file>dark/slider/core_slider_disabled.png</file>
- <file>dark/slider/core_slider_enabled.png</file>
- <file>dark/slider/core_slider_handle.png</file>
- <file>dark/slider/core_slider_handle_disabled.png</file>
- <file>dark/slider/core_slider_handle_pressed.png</file>
- <file>dark/slider/core_slider_inactive.png</file>
- <file>dark/slider/core_slider_vactive.png</file>
- <file>dark/slider/core_slider_vcache.png</file>
- <file>dark/slider/core_slider_vdisabled.png</file>
- <file>dark/slider/core_slider_venabled.png</file>
- <file>dark/slider/core_slider_vinactive.png</file>
- </qresource>
-</RCC>
diff --git a/src/plugins/styles/bb10style/qbb10styleplugin.cpp b/src/plugins/styles/bb10style/qbb10styleplugin.cpp
deleted file mode 100644
index 98607f174a..0000000000
--- a/src/plugins/styles/bb10style/qbb10styleplugin.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2014 BlackBerry Limited. All rights reserved.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qbb10styleplugin.h"
-#include "qbb10darkstyle.h"
-#include "qbb10brightstyle.h"
-
-QT_BEGIN_NAMESPACE
-
-QBB10StylePlugin::QBB10StylePlugin()
-{
-}
-
-QBB10StylePlugin::~QBB10StylePlugin()
-{
-}
-
-QStyle *QBB10StylePlugin::create(const QString &key)
-{
- const QString keyLower(key.toLower());
- if (keyLower == QLatin1String("bb10bright"))
- return new QBB10BrightStyle;
- else if (keyLower == QLatin1String("bb10dark"))
- return new QBB10DarkStyle;
-
- return 0;
-}
-
-QStringList QBB10StylePlugin::keys() const
-{
- return QStringList() << QLatin1String("bb10bright") << QLatin1String("bb10dark");
-}
-
-QT_END_NAMESPACE
-
-#include "moc_qbb10styleplugin.cpp"
diff --git a/src/plugins/styles/bb10style/qbb10styleplugin.h b/src/plugins/styles/bb10style/qbb10styleplugin.h
deleted file mode 100644
index 8058e4859e..0000000000
--- a/src/plugins/styles/bb10style/qbb10styleplugin.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/***************************************************************************
-**
-** Copyright (C) 2014 BlackBerry Limited. All rights reserved.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QBB10STYLEPLUGIN_H
-#define QBB10STYLEPLUGIN_H
-
-#include <QStylePlugin>
-
-QT_BEGIN_NAMESPACE
-
-class QBB10StylePlugin : public QStylePlugin
-{
- Q_OBJECT
- Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QStyleFactoryInterface" FILE "qbb10styleplugin.json")
-
-public:
- QBB10StylePlugin();
- ~QBB10StylePlugin();
-
- QStyle *create(const QString &key);
- QStringList keys() const;
-};
-
-QT_END_NAMESPACE
-
-#endif // QBB10STYLEPLUGIN_H
diff --git a/src/plugins/styles/bb10style/qbb10styleplugin.json b/src/plugins/styles/bb10style/qbb10styleplugin.json
deleted file mode 100644
index 8f79b706c3..0000000000
--- a/src/plugins/styles/bb10style/qbb10styleplugin.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "Keys": [ "bb10bright", "bb10dark" ]
-}
diff --git a/src/plugins/styles/styles.pro b/src/plugins/styles/styles.pro
deleted file mode 100644
index 88b3f90e0c..0000000000
--- a/src/plugins/styles/styles.pro
+++ /dev/null
@@ -1,3 +0,0 @@
-TEMPLATE = subdirs
-
-blackberry:SUBDIRS += bb10style
diff --git a/src/printsupport/dialogs/dialogs.pri b/src/printsupport/dialogs/dialogs.pri
index bb07167f68..7b520a05de 100644
--- a/src/printsupport/dialogs/dialogs.pri
+++ b/src/printsupport/dialogs/dialogs.pri
@@ -8,10 +8,10 @@ HEADERS += \
dialogs/qprintdialog.h \
dialogs/qprintpreviewdialog.h
-mac:!ios {
+osx {
OBJECTIVE_SOURCES += dialogs/qpagesetupdialog_mac.mm \
dialogs/qprintdialog_mac.mm
- LIBS_PRIVATE += -framework Cocoa
+ LIBS_PRIVATE += -framework AppKit
}
win32 {
diff --git a/src/printsupport/dialogs/qpagesetupdialog_mac.mm b/src/printsupport/dialogs/qpagesetupdialog_mac.mm
index b86de31883..3147ccb58e 100644
--- a/src/printsupport/dialogs/qpagesetupdialog_mac.mm
+++ b/src/printsupport/dialogs/qpagesetupdialog_mac.mm
@@ -32,7 +32,7 @@
****************************************************************************/
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include "qpagesetupdialog.h"
diff --git a/src/printsupport/dialogs/qprintdialog_mac.mm b/src/printsupport/dialogs/qprintdialog_mac.mm
index 030526954d..e7948c2a37 100644
--- a/src/printsupport/dialogs/qprintdialog_mac.mm
+++ b/src/printsupport/dialogs/qprintdialog_mac.mm
@@ -31,7 +31,7 @@
**
****************************************************************************/
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include "qprintdialog.h"
#include "qabstractprintdialog_p.h"
diff --git a/src/printsupport/kernel/qprinter.cpp b/src/printsupport/kernel/qprinter.cpp
index 2cecf61573..734691d504 100644
--- a/src/printsupport/kernel/qprinter.cpp
+++ b/src/printsupport/kernel/qprinter.cpp
@@ -695,7 +695,7 @@ QPrinter::QPrinter(const QPrinterInfo& printer, PrinterMode mode)
void QPrinterPrivate::init(const QPrinterInfo &printer, QPrinter::PrinterMode mode)
{
- if (!QCoreApplication::instance()) {
+ if (Q_UNLIKELY(!QCoreApplication::instance())) {
qFatal("QPrinter: Must construct a QCoreApplication before a QPrinter");
return;
}
diff --git a/src/sql/drivers/db2/qsql_db2.cpp b/src/sql/drivers/db2/qsql_db2.cpp
index 78b396f423..cc16a68916 100644
--- a/src/sql/drivers/db2/qsql_db2.cpp
+++ b/src/sql/drivers/db2/qsql_db2.cpp
@@ -32,7 +32,6 @@
****************************************************************************/
#include "qsql_db2_p.h"
-#include <QtSql/private/qsqldriver_p.h>
#include <qcoreapplication.h>
#include <qdatetime.h>
#include <qsqlfield.h>
@@ -43,6 +42,8 @@
#include <qvarlengtharray.h>
#include <qvector.h>
#include <QDebug>
+#include <QtSql/private/qsqldriver_p.h>
+#include <QtSql/private/qsqlresult_p.h>
#if defined(Q_CC_BOR)
// DB2's sqlsystm.h (included through sqlcli1.h) defines the SQL_BIGINT_TYPE
@@ -65,6 +66,8 @@ static const SQLSMALLINT qParamType[4] = { SQL_PARAM_INPUT, SQL_PARAM_INPUT, SQL
class QDB2DriverPrivate : public QSqlDriverPrivate
{
+ Q_DECLARE_PUBLIC(QDB2Driver)
+
public:
QDB2DriverPrivate() : QSqlDriverPrivate(), hEnv(0), hDbc(0) { dbmsType = QSqlDriver::DB2; }
SQLHANDLE hEnv;
@@ -72,10 +75,44 @@ public:
QString user;
};
-class QDB2ResultPrivate
+class QDB2ResultPrivate;
+
+class QDB2Result: public QSqlResult
{
+ Q_DECLARE_PRIVATE(QDB2Result)
+
public:
- QDB2ResultPrivate(const QDB2DriverPrivate* d): dp(d), hStmt(0)
+ QDB2Result(const QDB2Driver *drv);
+ ~QDB2Result();
+ bool prepare(const QString &query) Q_DECL_OVERRIDE;
+ bool exec() Q_DECL_OVERRIDE;
+ QVariant handle() const Q_DECL_OVERRIDE;
+
+protected:
+ QVariant data(int field) Q_DECL_OVERRIDE;
+ bool reset(const QString &query) Q_DECL_OVERRIDE;
+ bool fetch(int i) Q_DECL_OVERRIDE;
+ bool fetchNext() Q_DECL_OVERRIDE;
+ bool fetchFirst() Q_DECL_OVERRIDE;
+ bool fetchLast() Q_DECL_OVERRIDE;
+ bool isNull(int i) Q_DECL_OVERRIDE;
+ int size() Q_DECL_OVERRIDE;
+ int numRowsAffected() Q_DECL_OVERRIDE;
+ QSqlRecord record() const Q_DECL_OVERRIDE;
+ void virtual_hook(int id, void *data) Q_DECL_OVERRIDE;
+ void detachFromResultSet() Q_DECL_OVERRIDE;
+ bool nextResult() Q_DECL_OVERRIDE;
+};
+
+class QDB2ResultPrivate: public QSqlResultPrivate
+{
+ Q_DECLARE_PUBLIC(QDB2Result)
+
+public:
+ Q_DECLARE_SQLDRIVER_PRIVATE(QDB2Driver)
+ QDB2ResultPrivate(QDB2Result *q, const QDB2Driver *drv)
+ : QSqlResultPrivate(q, drv),
+ hStmt(0)
{}
~QDB2ResultPrivate()
{
@@ -94,7 +131,6 @@ public:
valueCache.clear();
}
- const QDB2DriverPrivate* dp;
SQLHANDLE hStmt;
QSqlRecord recInf;
QVector<QVariant*> valueCache;
@@ -140,8 +176,8 @@ static QString qDB2Warn(const QDB2DriverPrivate* d)
static QString qDB2Warn(const QDB2ResultPrivate* d)
{
- return (qWarnDB2Handle(SQL_HANDLE_ENV, d->dp->hEnv) + QLatin1Char(' ')
- + qWarnDB2Handle(SQL_HANDLE_DBC, d->dp->hDbc)
+ return (qWarnDB2Handle(SQL_HANDLE_ENV, d->drv_d_func()->hEnv) + QLatin1Char(' ')
+ + qWarnDB2Handle(SQL_HANDLE_DBC, d->drv_d_func()->hDbc)
+ qWarnDB2Handle(SQL_HANDLE_STMT, d->hStmt));
}
@@ -466,7 +502,7 @@ static bool qMakeStatement(QDB2ResultPrivate* d, bool forwardOnly, bool setForwa
SQLRETURN r;
if (!d->hStmt) {
r = SQLAllocHandle(SQL_HANDLE_STMT,
- d->dp->hDbc,
+ d->drv_d_func()->hDbc,
&d->hStmt);
if (r != SQL_SUCCESS) {
qSqlWarning(QLatin1String("QDB2Result::reset: Unable to allocate statement handle"), d);
@@ -505,30 +541,31 @@ static bool qMakeStatement(QDB2ResultPrivate* d, bool forwardOnly, bool setForwa
QVariant QDB2Result::handle() const
{
+ Q_D(const QDB2Result);
return QVariant(qRegisterMetaType<SQLHANDLE>("SQLHANDLE"), &d->hStmt);
}
/************************************/
-QDB2Result::QDB2Result(const QDB2Driver* dr, const QDB2DriverPrivate* dp)
- : QSqlResult(dr)
+QDB2Result::QDB2Result(const QDB2Driver *drv)
+ : QSqlResult(*new QDB2ResultPrivate(this, drv))
{
- d = new QDB2ResultPrivate(dp);
}
QDB2Result::~QDB2Result()
{
+ Q_D(const QDB2Result);
if (d->hStmt) {
SQLRETURN r = SQLFreeHandle(SQL_HANDLE_STMT, d->hStmt);
if (r != SQL_SUCCESS)
qSqlWarning(QLatin1String("QDB2Driver: Unable to free statement handle ")
+ QString::number(r), d);
}
- delete d;
}
bool QDB2Result::reset (const QString& query)
{
+ Q_D(QDB2Result);
setActive(false);
setAt(QSql::BeforeFirstRow);
SQLRETURN r;
@@ -565,6 +602,7 @@ bool QDB2Result::reset (const QString& query)
bool QDB2Result::prepare(const QString& query)
{
+ Q_D(QDB2Result);
setActive(false);
setAt(QSql::BeforeFirstRow);
SQLRETURN r;
@@ -589,6 +627,7 @@ bool QDB2Result::prepare(const QString& query)
bool QDB2Result::exec()
{
+ Q_D(QDB2Result);
QList<QByteArray> tmpStorage; // holds temporary ptrs
QVarLengthArray<SQLINTEGER, 32> indicators(boundValues().count());
@@ -840,6 +879,7 @@ bool QDB2Result::exec()
bool QDB2Result::fetch(int i)
{
+ Q_D(QDB2Result);
if (isForwardOnly() && i < at())
return false;
if (i == at())
@@ -874,6 +914,7 @@ bool QDB2Result::fetch(int i)
bool QDB2Result::fetchNext()
{
+ Q_D(QDB2Result);
SQLRETURN r;
d->clearValueCache();
r = SQLFetchScroll(d->hStmt,
@@ -891,6 +932,7 @@ bool QDB2Result::fetchNext()
bool QDB2Result::fetchFirst()
{
+ Q_D(QDB2Result);
if (isForwardOnly() && at() != QSql::BeforeFirstRow)
return false;
if (isForwardOnly())
@@ -912,6 +954,7 @@ bool QDB2Result::fetchFirst()
bool QDB2Result::fetchLast()
{
+ Q_D(QDB2Result);
d->clearValueCache();
int i = at();
@@ -943,6 +986,7 @@ bool QDB2Result::fetchLast()
QVariant QDB2Result::data(int field)
{
+ Q_D(QDB2Result);
if (field >= d->recInf.count()) {
qWarning("QDB2Result::data: column %d out of range", field);
return QVariant();
@@ -1049,6 +1093,7 @@ QVariant QDB2Result::data(int field)
bool QDB2Result::isNull(int i)
{
+ Q_D(const QDB2Result);
if (i >= d->valueCache.size())
return true;
@@ -1059,6 +1104,7 @@ bool QDB2Result::isNull(int i)
int QDB2Result::numRowsAffected()
{
+ Q_D(const QDB2Result);
SQLINTEGER affectedRowCount = 0;
SQLRETURN r = SQLRowCount(d->hStmt, &affectedRowCount);
if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO)
@@ -1075,6 +1121,7 @@ int QDB2Result::size()
QSqlRecord QDB2Result::record() const
{
+ Q_D(const QDB2Result);
if (isActive())
return d->recInf;
return QSqlRecord();
@@ -1082,6 +1129,7 @@ QSqlRecord QDB2Result::record() const
bool QDB2Result::nextResult()
{
+ Q_D(QDB2Result);
setActive(false);
setAt(QSql::BeforeFirstRow);
d->recInf.clear();
@@ -1117,6 +1165,7 @@ void QDB2Result::virtual_hook(int id, void *data)
void QDB2Result::detachFromResultSet()
{
+ Q_D(QDB2Result);
if (d->hStmt)
SQLCloseCursor(d->hStmt);
}
@@ -1132,8 +1181,8 @@ QDB2Driver::QDB2Driver(Qt::HANDLE env, Qt::HANDLE con, QObject* parent)
: QSqlDriver(*new QDB2DriverPrivate, parent)
{
Q_D(QDB2Driver);
- d->hEnv = (SQLHANDLE)env;
- d->hDbc = (SQLHANDLE)con;
+ d->hEnv = reinterpret_cast<intptr_t>(env);
+ d->hDbc = reinterpret_cast<intptr_t>(con);
if (env && con) {
setOpen(true);
setOpenError(false);
@@ -1197,10 +1246,10 @@ bool QDB2Driver::open(const QString& db, const QString& user, const QString& pas
tmp.toLocal8Bit().constData());
continue;
}
- r = SQLSetConnectAttr(d->hDbc, SQL_ATTR_ACCESS_MODE, (SQLPOINTER) v, 0);
+ r = SQLSetConnectAttr(d->hDbc, SQL_ATTR_ACCESS_MODE, reinterpret_cast<SQLPOINTER>(v), 0);
} else if (opt == QLatin1String("SQL_ATTR_LOGIN_TIMEOUT")) {
v = val.toUInt();
- r = SQLSetConnectAttr(d->hDbc, SQL_ATTR_LOGIN_TIMEOUT, (SQLPOINTER) v, 0);
+ r = SQLSetConnectAttr(d->hDbc, SQL_ATTR_LOGIN_TIMEOUT, reinterpret_cast<SQLPOINTER>(v), 0);
} else if (opt.compare(QLatin1String("PROTOCOL"), Qt::CaseInsensitive) == 0) {
protocol = tmp;
}
@@ -1278,8 +1327,7 @@ void QDB2Driver::close()
QSqlResult *QDB2Driver::createResult() const
{
- Q_D(const QDB2Driver);
- return new QDB2Result(this, d);
+ return new QDB2Result(this);
}
QSqlRecord QDB2Driver::record(const QString& tableName) const
@@ -1506,6 +1554,7 @@ bool QDB2Driver::hasFeature(DriverFeature f) const
case LastInsertId:
case SimpleLocking:
case EventNotifications:
+ case CancelQuery:
return false;
case BLOB:
case Transactions:
@@ -1572,7 +1621,7 @@ bool QDB2Driver::setAutoCommit(bool autoCommit)
SQLUINTEGER ac = autoCommit ? SQL_AUTOCOMMIT_ON : SQL_AUTOCOMMIT_OFF;
SQLRETURN r = SQLSetConnectAttr(d->hDbc,
SQL_ATTR_AUTOCOMMIT,
- (SQLPOINTER)ac,
+ reinterpret_cast<SQLPOINTER>(ac),
sizeof(ac));
if (r != SQL_SUCCESS) {
setLastError(qMakeError(tr("Unable to set autocommit"),
diff --git a/src/sql/drivers/db2/qsql_db2_p.h b/src/sql/drivers/db2/qsql_db2_p.h
index 7b5d751b89..0b07456122 100644
--- a/src/sql/drivers/db2/qsql_db2_p.h
+++ b/src/sql/drivers/db2/qsql_db2_p.h
@@ -53,70 +53,40 @@
#define Q_EXPORT_SQLDRIVER_DB2 Q_SQL_EXPORT
#endif
-#include <QtSql/qsqlresult.h>
#include <QtSql/qsqldriver.h>
QT_BEGIN_NAMESPACE
-class QDB2Driver;
class QDB2DriverPrivate;
-class QDB2ResultPrivate;
-class QSqlRecord;
-
-class QDB2Result : public QSqlResult
-{
-public:
- QDB2Result(const QDB2Driver* dr, const QDB2DriverPrivate* dp);
- ~QDB2Result();
- bool prepare(const QString& query);
- bool exec();
- QVariant handle() const;
-
-protected:
- QVariant data(int field);
- bool reset (const QString& query);
- bool fetch(int i);
- bool fetchNext();
- bool fetchFirst();
- bool fetchLast();
- bool isNull(int i);
- int size();
- int numRowsAffected();
- QSqlRecord record() const;
- void virtual_hook(int id, void *data);
- void detachFromResultSet();
- bool nextResult();
-
-private:
- QDB2ResultPrivate* d;
-};
class Q_EXPORT_SQLDRIVER_DB2 QDB2Driver : public QSqlDriver
{
Q_DECLARE_PRIVATE(QDB2Driver)
Q_OBJECT
+ friend class QDB2ResultPrivate;
+
public:
explicit QDB2Driver(QObject* parent = 0);
QDB2Driver(Qt::HANDLE env, Qt::HANDLE con, QObject* parent = 0);
~QDB2Driver();
- bool hasFeature(DriverFeature) const;
- void close();
- QSqlRecord record(const QString& tableName) const;
- QStringList tables(QSql::TableType type) const;
- QSqlResult *createResult() const;
- QSqlIndex primaryIndex(const QString& tablename) const;
- bool beginTransaction();
- bool commitTransaction();
- bool rollbackTransaction();
- QString formatValue(const QSqlField &field, bool trimStrings) const;
- QVariant handle() const;
- bool open(const QString& db,
- const QString& user,
- const QString& password,
- const QString& host,
+ bool hasFeature(DriverFeature) const Q_DECL_OVERRIDE;
+ void close() Q_DECL_OVERRIDE;
+ QSqlRecord record(const QString &tableName) const Q_DECL_OVERRIDE;
+ QStringList tables(QSql::TableType type) const Q_DECL_OVERRIDE;
+ QSqlResult *createResult() const Q_DECL_OVERRIDE;
+ QSqlIndex primaryIndex(const QString &tablename) const Q_DECL_OVERRIDE;
+ bool beginTransaction() Q_DECL_OVERRIDE;
+ bool commitTransaction() Q_DECL_OVERRIDE;
+ bool rollbackTransaction() Q_DECL_OVERRIDE;
+ QString formatValue(const QSqlField &field, bool trimStrings) const Q_DECL_OVERRIDE;
+ QVariant handle() const Q_DECL_OVERRIDE;
+ bool open(const QString &db,
+ const QString &user,
+ const QString &password,
+ const QString &host,
int port,
- const QString& connOpts);
- QString escapeIdentifier(const QString &identifier, IdentifierType type) const;
+ const QString& connOpts) Q_DECL_OVERRIDE;
+ QString escapeIdentifier(const QString &identifier, IdentifierType type) const Q_DECL_OVERRIDE;
private:
bool setAutoCommit(bool autoCommit);
diff --git a/src/sql/drivers/ibase/qsql_ibase.cpp b/src/sql/drivers/ibase/qsql_ibase.cpp
index d68ac276ef..c45415b56b 100644
--- a/src/sql/drivers/ibase/qsql_ibase.cpp
+++ b/src/sql/drivers/ibase/qsql_ibase.cpp
@@ -345,36 +345,37 @@ class QIBaseResultPrivate;
class QIBaseResult : public QSqlCachedResult
{
- friend class QIBaseResultPrivate;
+ Q_DECLARE_PRIVATE(QIBaseResult)
public:
explicit QIBaseResult(const QIBaseDriver* db);
- virtual ~QIBaseResult();
- bool prepare(const QString& query);
- bool exec();
- QVariant handle() const;
+ bool prepare(const QString &query) Q_DECL_OVERRIDE;
+ bool exec() Q_DECL_OVERRIDE;
+ QVariant handle() const Q_DECL_OVERRIDE;
protected:
- bool gotoNext(QSqlCachedResult::ValueCache& row, int rowIdx);
- bool reset (const QString& query);
- int size();
- int numRowsAffected();
- QSqlRecord record() const;
-
-private:
- QIBaseResultPrivate* d;
+ bool gotoNext(QSqlCachedResult::ValueCache& row, int rowIdx) Q_DECL_OVERRIDE;
+ bool reset (const QString &query) Q_DECL_OVERRIDE;
+ int size() Q_DECL_OVERRIDE;
+ int numRowsAffected() Q_DECL_OVERRIDE;
+ QSqlRecord record() const Q_DECL_OVERRIDE;
};
-class QIBaseResultPrivate
+class QIBaseResultPrivate: public QSqlCachedResultPrivate
{
+ Q_DECLARE_PUBLIC(QIBaseResult)
+
public:
- QIBaseResultPrivate(QIBaseResult *d, const QIBaseDriver *ddb);
+ Q_DECLARE_SQLDRIVER_PRIVATE(QIBaseDriver)
+
+ QIBaseResultPrivate(QIBaseResult *q, const QIBaseDriver *drv);
~QIBaseResultPrivate() { cleanup(); }
void cleanup();
bool isError(const char *msg, QSqlError::ErrorType typ = QSqlError::UnknownError)
{
+ Q_Q(QIBaseResult);
QString imsg;
ISC_LONG sqlcode;
if (!getIBaseError(imsg, status, sqlcode, tc))
@@ -395,8 +396,6 @@ public:
bool writeArray(int i, const QList<QVariant> &list);
public:
- QIBaseResult *q;
- const QIBaseDriver *db;
ISC_STATUS status[20];
isc_tr_handle trans;
//indicator whether we have a local transaction or a transaction on driver level
@@ -410,14 +409,22 @@ public:
};
-QIBaseResultPrivate::QIBaseResultPrivate(QIBaseResult *d, const QIBaseDriver *ddb):
- q(d), db(ddb), trans(0), stmt(0), ibase(ddb->d_func()->ibase), sqlda(0), inda(0), queryType(-1), tc(ddb->d_func()->tc)
+QIBaseResultPrivate::QIBaseResultPrivate(QIBaseResult *q, const QIBaseDriver *drv)
+ : QSqlCachedResultPrivate(q, drv),
+ trans(0),
+ localTransaction(!drv_d_func()->ibase),
+ stmt(0),
+ ibase(drv_d_func()->ibase),
+ sqlda(0),
+ inda(0),
+ queryType(-1),
+ tc(drv_d_func()->tc)
{
- localTransaction = (ddb->d_func()->ibase == 0);
}
void QIBaseResultPrivate::cleanup()
{
+ Q_Q(QIBaseResult);
commit();
if (!localTransaction)
trans = 0;
@@ -779,6 +786,7 @@ static char* createArrayBuffer(char *buffer, const QList<QVariant> &list,
bool QIBaseResultPrivate::writeArray(int column, const QList<QVariant> &list)
{
+ Q_Q(QIBaseResult);
QString error;
ISC_QUAD *arrayId = (ISC_QUAD*) inda->sqlvar[column].sqldata;
ISC_ARRAY_DESC desc;
@@ -854,9 +862,9 @@ bool QIBaseResultPrivate::transaction()
{
if (trans)
return true;
- if (db->d_func()->trans) {
+ if (drv_d_func()->trans) {
localTransaction = false;
- trans = db->d_func()->trans;
+ trans = drv_d_func()->trans;
return true;
}
localTransaction = true;
@@ -887,19 +895,14 @@ bool QIBaseResultPrivate::commit()
//////////
-QIBaseResult::QIBaseResult(const QIBaseDriver* db):
- QSqlCachedResult(db)
-{
- d = new QIBaseResultPrivate(this, db);
-}
-
-QIBaseResult::~QIBaseResult()
+QIBaseResult::QIBaseResult(const QIBaseDriver *db)
+ : QSqlCachedResult(*new QIBaseResultPrivate(this, db))
{
- delete d;
}
bool QIBaseResult::prepare(const QString& query)
{
+ Q_D(QIBaseResult);
// qDebug("prepare: %s", qPrintable(query));
if (!driver() || !driver()->isOpen() || driver()->isOpenError())
return false;
@@ -976,6 +979,7 @@ bool QIBaseResult::prepare(const QString& query)
bool QIBaseResult::exec()
{
+ Q_D(QIBaseResult);
bool ok = true;
if (!d->trans)
@@ -1113,6 +1117,7 @@ bool QIBaseResult::reset (const QString& query)
bool QIBaseResult::gotoNext(QSqlCachedResult::ValueCache& row, int rowIdx)
{
+ Q_D(QIBaseResult);
ISC_STATUS stat = 0;
// Stored Procedures are special - they populate our d->sqlda when executing,
@@ -1307,6 +1312,7 @@ int QIBaseResult::size()
int QIBaseResult::numRowsAffected()
{
+ Q_D(QIBaseResult);
static char acCountInfo[] = {isc_info_sql_records};
char cCountType;
bool bIsProcedure = false;
@@ -1361,6 +1367,7 @@ int QIBaseResult::numRowsAffected()
QSqlRecord QIBaseResult::record() const
{
+ Q_D(const QIBaseResult);
QSqlRecord rec;
if (!isActive() || !d->sqlda)
return rec;
@@ -1374,7 +1381,7 @@ QSqlRecord QIBaseResult::record() const
f.setPrecision(qAbs(v.sqlscale));
f.setRequiredStatus((v.sqltype & 1) == 0 ? QSqlField::Required : QSqlField::Optional);
if(v.sqlscale < 0) {
- QSqlQuery q(new QIBaseResult(d->db));
+ QSqlQuery q(driver()->createResult());
q.setForwardOnly(true);
q.exec(QLatin1String("select b.RDB$FIELD_PRECISION, b.RDB$FIELD_SCALE, b.RDB$FIELD_LENGTH, a.RDB$NULL_FLAG "
"FROM RDB$RELATION_FIELDS a, RDB$FIELDS b "
@@ -1400,6 +1407,7 @@ QSqlRecord QIBaseResult::record() const
QVariant QIBaseResult::handle() const
{
+ Q_D(const QIBaseResult);
return QVariant(qRegisterMetaType<isc_stmt_handle>("isc_stmt_handle"), &d->stmt);
}
@@ -1910,7 +1918,7 @@ void QIBaseDriver::qHandleEventNotification(void *updatedResultBuffer)
(isc_callback)qEventCallback,
#endif
eBuffer->resultBuffer);
- if (status[0] == 1 && status[1]) {
+ if (Q_UNLIKELY(status[0] == 1 && status[1])) {
qCritical("QIBaseDriver::qHandleEventNotification: could not resubscribe to '%s'",
qPrintable(i.key()));
}
diff --git a/src/sql/drivers/ibase/qsql_ibase_p.h b/src/sql/drivers/ibase/qsql_ibase_p.h
index 3a61f3394b..e052e83641 100644
--- a/src/sql/drivers/ibase/qsql_ibase_p.h
+++ b/src/sql/drivers/ibase/qsql_ibase_p.h
@@ -45,16 +45,21 @@
// We mean it.
//
-#include <QtSql/qsqlresult.h>
#include <QtSql/qsqldriver.h>
#include <ibase.h>
+#ifdef QT_PLUGIN
+#define Q_EXPORT_SQLDRIVER_IBASE
+#else
+#define Q_EXPORT_SQLDRIVER_IBASE Q_SQL_EXPORT
+#endif
+
QT_BEGIN_NAMESPACE
+class QSqlResult;
class QIBaseDriverPrivate;
-class QIBaseDriver;
-class QIBaseDriver : public QSqlDriver
+class Q_EXPORT_SQLDRIVER_IBASE QIBaseDriver : public QSqlDriver
{
friend class QIBaseResultPrivate;
Q_DECLARE_PRIVATE(QIBaseDriver)
@@ -63,36 +68,36 @@ public:
explicit QIBaseDriver(QObject *parent = 0);
explicit QIBaseDriver(isc_db_handle connection, QObject *parent = 0);
virtual ~QIBaseDriver();
- bool hasFeature(DriverFeature f) const;
- bool open(const QString & db,
- const QString & user,
- const QString & password,
- const QString & host,
+ bool hasFeature(DriverFeature f) const Q_DECL_OVERRIDE;
+ bool open(const QString &db,
+ const QString &user,
+ const QString &password,
+ const QString &host,
int port,
- const QString & connOpts);
- bool open(const QString & db,
- const QString & user,
- const QString & password,
- const QString & host,
- int port) { return open (db, user, password, host, port, QString()); }
- void close();
- QSqlResult *createResult() const;
- bool beginTransaction();
- bool commitTransaction();
- bool rollbackTransaction();
- QStringList tables(QSql::TableType) const;
+ const QString &connOpts) Q_DECL_OVERRIDE;
+ bool open(const QString &db,
+ const QString &user,
+ const QString &password,
+ const QString &host,
+ int port) { return open(db, user, password, host, port, QString()); }
+ void close() Q_DECL_OVERRIDE;
+ QSqlResult *createResult() const Q_DECL_OVERRIDE;
+ bool beginTransaction() Q_DECL_OVERRIDE;
+ bool commitTransaction() Q_DECL_OVERRIDE;
+ bool rollbackTransaction() Q_DECL_OVERRIDE;
+ QStringList tables(QSql::TableType) const Q_DECL_OVERRIDE;
- QSqlRecord record(const QString& tablename) const;
- QSqlIndex primaryIndex(const QString &table) const;
+ QSqlRecord record(const QString& tablename) const Q_DECL_OVERRIDE;
+ QSqlIndex primaryIndex(const QString &table) const Q_DECL_OVERRIDE;
- QString formatValue(const QSqlField &field, bool trimStrings) const;
- QVariant handle() const;
+ QString formatValue(const QSqlField &field, bool trimStrings) const Q_DECL_OVERRIDE;
+ QVariant handle() const Q_DECL_OVERRIDE;
- QString escapeIdentifier(const QString &identifier, IdentifierType type) const;
+ QString escapeIdentifier(const QString &identifier, IdentifierType type) const Q_DECL_OVERRIDE;
- bool subscribeToNotification(const QString &name);
- bool unsubscribeFromNotification(const QString &name);
- QStringList subscribedToNotifications() const;
+ bool subscribeToNotification(const QString &name) Q_DECL_OVERRIDE;
+ bool unsubscribeFromNotification(const QString &name) Q_DECL_OVERRIDE;
+ QStringList subscribedToNotifications() const Q_DECL_OVERRIDE;
private Q_SLOTS:
void qHandleEventNotification(void* updatedResultBuffer);
diff --git a/src/sql/drivers/mysql/qsql_mysql.cpp b/src/sql/drivers/mysql/qsql_mysql.cpp
index 96bdcc42fa..99f351a2bb 100644
--- a/src/sql/drivers/mysql/qsql_mysql.cpp
+++ b/src/sql/drivers/mysql/qsql_mysql.cpp
@@ -33,7 +33,6 @@
#include "qsql_mysql_p.h"
-#include <QtSql/private/qsqldriver_p.h>
#include <qcoreapplication.h>
#include <qvariant.h>
#include <qdatetime.h>
@@ -46,8 +45,9 @@
#include <qtextcodec.h>
#include <qvector.h>
#include <qfile.h>
-
#include <qdebug.h>
+#include <QtSql/private/qsqldriver_p.h>
+#include <QtSql/private/qsqlresult_p.h>
#ifdef Q_OS_WIN32
// comment the next line out if you want to use MySQL/embedded on Win32 systems.
@@ -72,6 +72,8 @@ QT_BEGIN_NAMESPACE
class QMYSQLDriverPrivate : public QSqlDriverPrivate
{
+ Q_DECLARE_PUBLIC(QMYSQLDriver)
+
public:
QMYSQLDriverPrivate() : QSqlDriverPrivate(), mysql(0),
#ifndef QT_NO_TEXTCODEC
@@ -156,24 +158,60 @@ static inline QVariant qDateTimeFromString(QString &val)
#endif
}
-class QMYSQLResultPrivate : public QObject
+class QMYSQLResultPrivate;
+
+class QMYSQLResult : public QSqlResult
{
- Q_OBJECT
+ Q_DECLARE_PRIVATE(QMYSQLResult)
+ friend class QMYSQLDriver;
+
public:
- QMYSQLResultPrivate(const QMYSQLDriver* dp, const QMYSQLResult* d) : driver(dp), result(0), q(d),
- rowsAffected(0), hasBlobs(false)
+ explicit QMYSQLResult(const QMYSQLDriver *db);
+ ~QMYSQLResult();
+
+ QVariant handle() const Q_DECL_OVERRIDE;
+protected:
+ void cleanup();
+ bool fetch(int i) Q_DECL_OVERRIDE;
+ bool fetchNext() Q_DECL_OVERRIDE;
+ bool fetchLast() Q_DECL_OVERRIDE;
+ bool fetchFirst() Q_DECL_OVERRIDE;
+ QVariant data(int field) Q_DECL_OVERRIDE;
+ bool isNull(int field) Q_DECL_OVERRIDE;
+ bool reset (const QString& query) Q_DECL_OVERRIDE;
+ int size() Q_DECL_OVERRIDE;
+ int numRowsAffected() Q_DECL_OVERRIDE;
+ QVariant lastInsertId() const Q_DECL_OVERRIDE;
+ QSqlRecord record() const Q_DECL_OVERRIDE;
+ void virtual_hook(int id, void *data) Q_DECL_OVERRIDE;
+ bool nextResult() Q_DECL_OVERRIDE;
+
+#if MYSQL_VERSION_ID >= 40108
+ bool prepare(const QString &stmt) Q_DECL_OVERRIDE;
+ bool exec() Q_DECL_OVERRIDE;
+#endif
+};
+
+class QMYSQLResultPrivate: public QSqlResultPrivate
+{
+ Q_DECLARE_PUBLIC(QMYSQLResult)
+
+public:
+ Q_DECLARE_SQLDRIVER_PRIVATE(QMYSQLDriver)
+
+ QMYSQLResultPrivate(QMYSQLResult *q, const QMYSQLDriver *drv)
+ : QSqlResultPrivate(q, drv),
+ result(0),
+ rowsAffected(0),
+ hasBlobs(false)
#if MYSQL_VERSION_ID >= 40108
, stmt(0), meta(0), inBinds(0), outBinds(0)
#endif
, preparedQuery(false)
- {
- connect(dp, SIGNAL(destroyed()), this, SLOT(driverDestroyed()));
- }
+ { }
- const QMYSQLDriver* driver;
MYSQL_RES *result;
MYSQL_ROW row;
- const QMYSQLResult* q;
int rowsAffected;
@@ -205,9 +243,6 @@ public:
#endif
bool preparedQuery;
-
-private Q_SLOTS:
- void driverDestroyed() { driver = NULL; }
};
#ifndef QT_NO_TEXTCODEC
@@ -396,19 +431,18 @@ bool QMYSQLResultPrivate::bindInValues()
#endif
QMYSQLResult::QMYSQLResult(const QMYSQLDriver* db)
-: QSqlResult(db)
+ : QSqlResult(*new QMYSQLResultPrivate(this, db))
{
- d = new QMYSQLResultPrivate(db, this);
}
QMYSQLResult::~QMYSQLResult()
{
cleanup();
- delete d;
}
QVariant QMYSQLResult::handle() const
{
+ Q_D(const QMYSQLResult);
#if MYSQL_VERSION_ID >= 40108
if(d->preparedQuery)
return d->meta ? QVariant::fromValue(d->meta) : QVariant::fromValue(d->stmt);
@@ -419,14 +453,15 @@ QVariant QMYSQLResult::handle() const
void QMYSQLResult::cleanup()
{
+ Q_D(QMYSQLResult);
if (d->result)
mysql_free_result(d->result);
// must iterate trough leftover result sets from multi-selects or stored procedures
// if this isn't done subsequent queries will fail with "Commands out of sync"
#if MYSQL_VERSION_ID >= 40100
- while (d->driver && d->driver->d_func()->mysql && mysql_next_result(d->driver->d_func()->mysql) == 0) {
- MYSQL_RES *res = mysql_store_result(d->driver->d_func()->mysql);
+ while (driver() && d->drv_d_func()->mysql && mysql_next_result(d->drv_d_func()->mysql) == 0) {
+ MYSQL_RES *res = mysql_store_result(d->drv_d_func()->mysql);
if (res)
mysql_free_result(res);
}
@@ -469,7 +504,8 @@ void QMYSQLResult::cleanup()
bool QMYSQLResult::fetch(int i)
{
- if(!d->driver)
+ Q_D(QMYSQLResult);
+ if (!driver())
return false;
if (isForwardOnly()) { // fake a forward seek
if (at() < i) {
@@ -513,7 +549,8 @@ bool QMYSQLResult::fetch(int i)
bool QMYSQLResult::fetchNext()
{
- if(!d->driver)
+ Q_D(QMYSQLResult);
+ if (!driver())
return false;
if (d->preparedQuery) {
#if MYSQL_VERSION_ID >= 40108
@@ -542,7 +579,8 @@ bool QMYSQLResult::fetchNext()
bool QMYSQLResult::fetchLast()
{
- if(!d->driver)
+ Q_D(QMYSQLResult);
+ if (!driver())
return false;
if (isForwardOnly()) { // fake this since MySQL can't seek on forward only queries
bool success = fetchNext(); // did we move at all?
@@ -579,13 +617,13 @@ bool QMYSQLResult::fetchFirst()
QVariant QMYSQLResult::data(int field)
{
-
+ Q_D(QMYSQLResult);
if (!isSelect() || field >= d->fields.count()) {
qWarning("QMYSQLResult::data: column %d out of range", field);
return QVariant();
}
- if (!d->driver)
+ if (!driver())
return QVariant();
int fieldLength = 0;
@@ -599,7 +637,7 @@ QVariant QMYSQLResult::data(int field)
return QVariant(f.type, f.outField);
if (f.type != QVariant::ByteArray)
- val = toUnicode(d->driver->d_func()->tc, f.outField, f.bufLength);
+ val = toUnicode(d->drv_d_func()->tc, f.outField, f.bufLength);
} else {
if (d->row[field] == NULL) {
// NULL value
@@ -609,7 +647,7 @@ QVariant QMYSQLResult::data(int field)
fieldLength = mysql_fetch_lengths(d->result)[field];
if (f.type != QVariant::ByteArray)
- val = toUnicode(d->driver->d_func()->tc, d->row[field], fieldLength);
+ val = toUnicode(d->drv_d_func()->tc, d->row[field], fieldLength);
}
switch (static_cast<int>(f.type)) {
@@ -677,6 +715,7 @@ QVariant QMYSQLResult::data(int field)
bool QMYSQLResult::isNull(int field)
{
+ Q_D(const QMYSQLResult);
if (field < 0 || field >= d->fields.count())
return true;
if (d->preparedQuery)
@@ -687,29 +726,30 @@ bool QMYSQLResult::isNull(int field)
bool QMYSQLResult::reset (const QString& query)
{
- if (!driver() || !driver()->isOpen() || driver()->isOpenError() || !d->driver)
+ Q_D(QMYSQLResult);
+ if (!driver() || !driver()->isOpen() || driver()->isOpenError())
return false;
d->preparedQuery = false;
cleanup();
- const QByteArray encQuery(fromUnicode(d->driver->d_func()->tc, query));
- if (mysql_real_query(d->driver->d_func()->mysql, encQuery.data(), encQuery.length())) {
+ const QByteArray encQuery(fromUnicode(d->drv_d_func()->tc, query));
+ if (mysql_real_query(d->drv_d_func()->mysql, encQuery.data(), encQuery.length())) {
setLastError(qMakeError(QCoreApplication::translate("QMYSQLResult", "Unable to execute query"),
- QSqlError::StatementError, d->driver->d_func()));
+ QSqlError::StatementError, d->drv_d_func()));
return false;
}
- d->result = mysql_store_result(d->driver->d_func()->mysql);
- if (!d->result && mysql_field_count(d->driver->d_func()->mysql) > 0) {
+ d->result = mysql_store_result(d->drv_d_func()->mysql);
+ if (!d->result && mysql_field_count(d->drv_d_func()->mysql) > 0) {
setLastError(qMakeError(QCoreApplication::translate("QMYSQLResult", "Unable to store result"),
- QSqlError::StatementError, d->driver->d_func()));
+ QSqlError::StatementError, d->drv_d_func()));
return false;
}
- int numFields = mysql_field_count(d->driver->d_func()->mysql);
+ int numFields = mysql_field_count(d->drv_d_func()->mysql);
setSelect(numFields != 0);
d->fields.resize(numFields);
- d->rowsAffected = mysql_affected_rows(d->driver->d_func()->mysql);
+ d->rowsAffected = mysql_affected_rows(d->drv_d_func()->mysql);
if (isSelect()) {
for(int i = 0; i < numFields; i++) {
@@ -724,7 +764,8 @@ bool QMYSQLResult::reset (const QString& query)
int QMYSQLResult::size()
{
- if (d->driver && isSelect())
+ Q_D(const QMYSQLResult);
+ if (driver() && isSelect())
if (d->preparedQuery)
#if MYSQL_VERSION_ID >= 40108
return mysql_stmt_num_rows(d->stmt);
@@ -739,12 +780,14 @@ int QMYSQLResult::size()
int QMYSQLResult::numRowsAffected()
{
+ Q_D(const QMYSQLResult);
return d->rowsAffected;
}
QVariant QMYSQLResult::lastInsertId() const
{
- if (!isActive() || !d->driver)
+ Q_D(const QMYSQLResult);
+ if (!isActive() || !driver())
return QVariant();
if (d->preparedQuery) {
@@ -754,7 +797,7 @@ QVariant QMYSQLResult::lastInsertId() const
return QVariant(id);
#endif
} else {
- quint64 id = mysql_insert_id(d->driver->d_func()->mysql);
+ quint64 id = mysql_insert_id(d->drv_d_func()->mysql);
if (id)
return QVariant(id);
}
@@ -763,9 +806,10 @@ QVariant QMYSQLResult::lastInsertId() const
QSqlRecord QMYSQLResult::record() const
{
+ Q_D(const QMYSQLResult);
QSqlRecord info;
MYSQL_RES *res;
- if (!isActive() || !isSelect() || !d->driver)
+ if (!isActive() || !isSelect() || !driver())
return info;
#if MYSQL_VERSION_ID >= 40108
@@ -774,11 +818,11 @@ QSqlRecord QMYSQLResult::record() const
res = d->result;
#endif
- if (!mysql_errno(d->driver->d_func()->mysql)) {
+ if (!mysql_errno(d->drv_d_func()->mysql)) {
mysql_field_seek(res, 0);
MYSQL_FIELD* field = mysql_fetch_field(res);
while(field) {
- info.append(qToField(field, d->driver->d_func()->tc));
+ info.append(qToField(field, d->drv_d_func()->tc));
field = mysql_fetch_field(res);
}
}
@@ -788,7 +832,8 @@ QSqlRecord QMYSQLResult::record() const
bool QMYSQLResult::nextResult()
{
- if(!d->driver)
+ Q_D(QMYSQLResult);
+ if (!driver())
return false;
#if MYSQL_VERSION_ID >= 40100
setAt(-1);
@@ -803,26 +848,26 @@ bool QMYSQLResult::nextResult()
delete[] d->fields[i].outField;
d->fields.clear();
- int status = mysql_next_result(d->driver->d_func()->mysql);
+ int status = mysql_next_result(d->drv_d_func()->mysql);
if (status > 0) {
setLastError(qMakeError(QCoreApplication::translate("QMYSQLResult", "Unable to execute next query"),
- QSqlError::StatementError, d->driver->d_func()));
+ QSqlError::StatementError, d->drv_d_func()));
return false;
} else if (status == -1) {
return false; // No more result sets
}
- d->result = mysql_store_result(d->driver->d_func()->mysql);
- int numFields = mysql_field_count(d->driver->d_func()->mysql);
+ d->result = mysql_store_result(d->drv_d_func()->mysql);
+ int numFields = mysql_field_count(d->drv_d_func()->mysql);
if (!d->result && numFields > 0) {
setLastError(qMakeError(QCoreApplication::translate("QMYSQLResult", "Unable to store next result"),
- QSqlError::StatementError, d->driver->d_func()));
+ QSqlError::StatementError, d->drv_d_func()));
return false;
}
setSelect(numFields > 0);
d->fields.resize(numFields);
- d->rowsAffected = mysql_affected_rows(d->driver->d_func()->mysql);
+ d->rowsAffected = mysql_affected_rows(d->drv_d_func()->mysql);
if (isSelect()) {
for (int i = 0; i < numFields; i++) {
@@ -871,11 +916,12 @@ static MYSQL_TIME *toMySqlDate(QDate date, QTime time, QVariant::Type type)
bool QMYSQLResult::prepare(const QString& query)
{
- if(!d->driver)
+ Q_D(QMYSQLResult);
+ if (!driver())
return false;
#if MYSQL_VERSION_ID >= 40108
cleanup();
- if (!d->driver->d_func()->preparedQuerysEnabled)
+ if (!d->drv_d_func()->preparedQuerysEnabled)
return QSqlResult::prepare(query);
int r;
@@ -884,14 +930,14 @@ bool QMYSQLResult::prepare(const QString& query)
return false;
if (!d->stmt)
- d->stmt = mysql_stmt_init(d->driver->d_func()->mysql);
+ d->stmt = mysql_stmt_init(d->drv_d_func()->mysql);
if (!d->stmt) {
setLastError(qMakeError(QCoreApplication::translate("QMYSQLResult", "Unable to prepare statement"),
- QSqlError::StatementError, d->driver->d_func()));
+ QSqlError::StatementError, d->drv_d_func()));
return false;
}
- const QByteArray encQuery(fromUnicode(d->driver->d_func()->tc, query));
+ const QByteArray encQuery(fromUnicode(d->drv_d_func()->tc, query));
r = mysql_stmt_prepare(d->stmt, encQuery.constData(), encQuery.length());
if (r != 0) {
setLastError(qMakeStmtError(QCoreApplication::translate("QMYSQLResult",
@@ -914,7 +960,8 @@ bool QMYSQLResult::prepare(const QString& query)
bool QMYSQLResult::exec()
{
- if (!d->driver)
+ Q_D(QMYSQLResult);
+ if (!driver())
return false;
if (!d->preparedQuery)
return QSqlResult::exec();
@@ -1011,7 +1058,7 @@ bool QMYSQLResult::exec()
break;
case QVariant::String:
default: {
- QByteArray ba = fromUnicode(d->driver->d_func()->tc, val.toString());
+ QByteArray ba = fromUnicode(d->drv_d_func()->tc, val.toString());
stringVector.append(ba);
currBind->buffer_type = MYSQL_TYPE_STRING;
currBind->buffer = const_cast<char *>(ba.constData());
@@ -1610,5 +1657,3 @@ bool QMYSQLDriver::isIdentifierEscaped(const QString &identifier, IdentifierType
}
QT_END_NAMESPACE
-
-#include "qsql_mysql.moc"
diff --git a/src/sql/drivers/mysql/qsql_mysql_p.h b/src/sql/drivers/mysql/qsql_mysql_p.h
index 724cc1fd28..d8e08b1f17 100644
--- a/src/sql/drivers/mysql/qsql_mysql_p.h
+++ b/src/sql/drivers/mysql/qsql_mysql_p.h
@@ -46,7 +46,6 @@
//
#include <QtSql/qsqldriver.h>
-#include <QtSql/qsqlresult.h>
#if defined (Q_OS_WIN32)
#include <QtCore/qt_windows.h>
@@ -63,46 +62,10 @@
QT_BEGIN_NAMESPACE
class QMYSQLDriverPrivate;
-class QMYSQLResultPrivate;
-class QMYSQLDriver;
-class QSqlRecordInfo;
-
-class QMYSQLResult : public QSqlResult
-{
- friend class QMYSQLDriver;
- friend class QMYSQLResultPrivate;
-public:
- explicit QMYSQLResult(const QMYSQLDriver* db);
- ~QMYSQLResult();
-
- QVariant handle() const Q_DECL_OVERRIDE;
-protected:
- void cleanup();
- bool fetch(int i) Q_DECL_OVERRIDE;
- bool fetchNext() Q_DECL_OVERRIDE;
- bool fetchLast() Q_DECL_OVERRIDE;
- bool fetchFirst() Q_DECL_OVERRIDE;
- QVariant data(int field) Q_DECL_OVERRIDE;
- bool isNull(int field) Q_DECL_OVERRIDE;
- bool reset (const QString& query) Q_DECL_OVERRIDE;
- int size() Q_DECL_OVERRIDE;
- int numRowsAffected() Q_DECL_OVERRIDE;
- QVariant lastInsertId() const Q_DECL_OVERRIDE;
- QSqlRecord record() const Q_DECL_OVERRIDE;
- void virtual_hook(int id, void *data) Q_DECL_OVERRIDE;
- bool nextResult() Q_DECL_OVERRIDE;
-
-#if MYSQL_VERSION_ID >= 40108
- bool prepare(const QString& stmt) Q_DECL_OVERRIDE;
- bool exec() Q_DECL_OVERRIDE;
-#endif
-private:
- QMYSQLResultPrivate* d;
-};
class Q_EXPORT_SQLDRIVER_MYSQL QMYSQLDriver : public QSqlDriver
{
- friend class QMYSQLResult;
+ friend class QMYSQLResultPrivate;
Q_DECLARE_PRIVATE(QMYSQLDriver)
Q_OBJECT
public:
diff --git a/src/sql/drivers/oci/qsql_oci.cpp b/src/sql/drivers/oci/qsql_oci.cpp
index f0c0b224bd..eb35c91e88 100644
--- a/src/sql/drivers/oci/qsql_oci.cpp
+++ b/src/sql/drivers/oci/qsql_oci.cpp
@@ -155,42 +155,62 @@ QT_BEGIN_INCLUDE_NAMESPACE
Q_DECLARE_METATYPE(QOCIRowIdPointer)
QT_END_INCLUDE_NAMESPACE
+class QOCIDriverPrivate : public QSqlDriverPrivate
+{
+ Q_DECLARE_PUBLIC(QOCIDriver)
+
+public:
+ QOCIDriverPrivate();
+
+ OCIEnv *env;
+ OCISvcCtx *svc;
+ OCIServer *srvhp;
+ OCISession *authp;
+ OCIError *err;
+ bool transaction;
+ int serverVersion;
+ int prefetchRows;
+ int prefetchMem;
+ QString user;
+
+ void allocErrorHandle();
+};
+
class QOCICols;
-struct QOCIResultPrivate;
+class QOCIResultPrivate;
-class Q_EXPORT_SQLDRIVER_OCI QOCIResult : public QSqlCachedResult
+class QOCIResult: public QSqlCachedResult
{
+ Q_DECLARE_PRIVATE(QOCIResult)
friend class QOCIDriver;
- friend struct QOCIResultPrivate;
friend class QOCICols;
public:
- QOCIResult(const QOCIDriver * db, const QOCIDriverPrivate* p);
+ QOCIResult(const QOCIDriver *db);
~QOCIResult();
- bool prepare(const QString& query);
- bool exec();
- QVariant handle() const;
+ bool prepare(const QString &query) Q_DECL_OVERRIDE;
+ bool exec() Q_DECL_OVERRIDE;
+ QVariant handle() const Q_DECL_OVERRIDE;
protected:
- bool gotoNext(ValueCache &values, int index);
- bool reset (const QString& query);
- int size();
- int numRowsAffected();
- QSqlRecord record() const;
- QVariant lastInsertId() const;
- bool execBatch(bool arrayBind = false);
- void virtual_hook(int id, void *data);
-
-private:
- QOCIResultPrivate *d;
+ bool gotoNext(ValueCache &values, int index) Q_DECL_OVERRIDE;
+ bool reset(const QString &query) Q_DECL_OVERRIDE;
+ int size() Q_DECL_OVERRIDE;
+ int numRowsAffected() Q_DECL_OVERRIDE;
+ QSqlRecord record() const Q_DECL_OVERRIDE;
+ QVariant lastInsertId() const Q_DECL_OVERRIDE;
+ bool execBatch(bool arrayBind = false) Q_DECL_OVERRIDE;
+ void virtual_hook(int id, void *data) Q_DECL_OVERRIDE;
};
-struct QOCIResultPrivate
+class QOCIResultPrivate: public QSqlCachedResultPrivate
{
- QOCIResultPrivate(QOCIResult *result, const QOCIDriverPrivate *driver);
+public:
+ Q_DECLARE_PUBLIC(QOCIResult)
+ Q_DECLARE_SQLDRIVER_PRIVATE(QOCIDriver)
+ QOCIResultPrivate(QOCIResult *q, const QOCIDriver *drv);
~QOCIResultPrivate();
QOCICols *cols;
- QOCIResult *q;
OCIEnv *env;
OCIError *err;
OCISvcCtx *&svc;
@@ -207,9 +227,9 @@ struct QOCIResultPrivate
void outValues(QVector<QVariant> &values, IndicatorArray &indicators,
QList<QByteArray> &tmpStorage);
inline bool isOutValue(int i) const
- { return q->bindValueType(i) & QSql::Out; }
+ { Q_Q(const QOCIResult); return q->bindValueType(i) & QSql::Out; }
inline bool isBinaryValue(int i) const
- { return q->bindValueType(i) & QSql::Binary; }
+ { Q_Q(const QOCIResult); return q->bindValueType(i) & QSql::Binary; }
void setCharset(dvoid* handle, ub4 type) const
{
@@ -485,25 +505,6 @@ void QOCIResultPrivate::outValues(QVector<QVariant> &values, IndicatorArray &ind
}
-class QOCIDriverPrivate : public QSqlDriverPrivate
-{
-public:
- QOCIDriverPrivate();
-
- OCIEnv *env;
- OCISvcCtx *svc;
- OCIServer *srvhp;
- OCISession *authp;
- OCIError *err;
- bool transaction;
- int serverVersion;
- ub4 prefetchRows;
- ub2 prefetchMem;
- QString user;
-
- void allocErrorHandle();
-};
-
QOCIDriverPrivate::QOCIDriverPrivate()
: QSqlDriverPrivate(), env(0), svc(0), srvhp(0), authp(0), err(0), transaction(false),
serverVersion(-1), prefetchRows(-1), prefetchMem(QOCI_PREFETCH_MEM)
@@ -1221,7 +1222,7 @@ OraFieldInfo QOCICols::qMakeOraField(const QOCIResultPrivate* p, OCIParam* param
if (r != 0)
qOraWarning("qMakeOraField:", p->err);
- type = qDecodeOCIType(colType, p->q->numericalPrecisionPolicy());
+ type = qDecodeOCIType(colType, p->q_func()->numericalPrecisionPolicy());
if (type == QVariant::Int) {
if (colLength == 22 && colPrecision == 0 && colScale == 0)
@@ -1232,16 +1233,16 @@ OraFieldInfo QOCICols::qMakeOraField(const QOCIResultPrivate* p, OCIParam* param
// bind as double if the precision policy asks for it
if (((colType == SQLT_FLT) || (colType == SQLT_NUM))
- && (p->q->numericalPrecisionPolicy() == QSql::LowPrecisionDouble)) {
+ && (p->q_func()->numericalPrecisionPolicy() == QSql::LowPrecisionDouble)) {
type = QVariant::Double;
}
// bind as int32 or int64 if the precision policy asks for it
if ((colType == SQLT_NUM) || (colType == SQLT_VNU) || (colType == SQLT_UIN)
|| (colType == SQLT_INT)) {
- if (p->q->numericalPrecisionPolicy() == QSql::LowPrecisionInt64)
+ if (p->q_func()->numericalPrecisionPolicy() == QSql::LowPrecisionInt64)
type = QVariant::LongLong;
- else if (p->q->numericalPrecisionPolicy() == QSql::LowPrecisionInt32)
+ else if (p->q_func()->numericalPrecisionPolicy() == QSql::LowPrecisionInt32)
type = QVariant::Int;
}
@@ -1336,7 +1337,7 @@ bool QOCICols::execBatch(QOCIResultPrivate *d, QVector<QVariant> &boundValues, b
if (r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO) {
qOraWarning("QOCIPrivate::execBatch: unable to bind column:", d->err);
- d->q->setLastError(qMakeError(QCoreApplication::translate("QOCIResult",
+ d->q_func()->setLastError(qMakeError(QCoreApplication::translate("QOCIResult",
"Unable to bind column for batch execute"),
QSqlError::StatementError, d->err));
return false;
@@ -1530,7 +1531,7 @@ bool QOCICols::execBatch(QOCIResultPrivate *d, QVector<QVariant> &boundValues, b
if (r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO) {
qOraWarning("QOCIPrivate::execBatch: unable to bind column:", d->err);
- d->q->setLastError(qMakeError(QCoreApplication::translate("QOCIResult",
+ d->q_func()->setLastError(qMakeError(QCoreApplication::translate("QOCIResult",
"Unable to bind column for batch execute"),
QSqlError::StatementError, d->err));
return false;
@@ -1545,7 +1546,7 @@ bool QOCICols::execBatch(QOCIResultPrivate *d, QVector<QVariant> &boundValues, b
if (r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO) {
qOraWarning("QOCIPrivate::execBatch: unable to bind column:", d->err);
- d->q->setLastError(qMakeError(QCoreApplication::translate("QOCIResult",
+ d->q_func()->setLastError(qMakeError(QCoreApplication::translate("QOCIResult",
"Unable to bind column for batch execute"),
QSqlError::StatementError, d->err));
return false;
@@ -1560,7 +1561,7 @@ bool QOCICols::execBatch(QOCIResultPrivate *d, QVector<QVariant> &boundValues, b
if (r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO) {
qOraWarning("QOCIPrivate::execBatch: unable to execute batch statement:", d->err);
- d->q->setLastError(qMakeError(QCoreApplication::translate("QOCIResult",
+ d->q_func()->setLastError(qMakeError(QCoreApplication::translate("QOCIResult",
"Unable to execute batch statement"),
QSqlError::StatementError, d->err));
return false;
@@ -1635,9 +1636,9 @@ bool QOCICols::execBatch(QOCIResultPrivate *d, QVector<QVariant> &boundValues, b
}
}
- d->q->setSelect(false);
- d->q->setAt(QSql::BeforeFirstRow);
- d->q->setActive(true);
+ d->q_func()->setSelect(false);
+ d->q_func()->setAt(QSql::BeforeFirstRow);
+ d->q_func()->setActive(true);
return true;
}
@@ -1752,12 +1753,12 @@ void QOCICols::getValues(QVector<QVariant> &v, int index)
case QVariant::Double:
case QVariant::Int:
case QVariant::LongLong:
- if (d->q->numericalPrecisionPolicy() != QSql::HighPrecision) {
- if ((d->q->numericalPrecisionPolicy() == QSql::LowPrecisionDouble)
+ if (d->q_func()->numericalPrecisionPolicy() != QSql::HighPrecision) {
+ if ((d->q_func()->numericalPrecisionPolicy() == QSql::LowPrecisionDouble)
&& (fld.typ == QVariant::Double)) {
v[index + i] = *reinterpret_cast<double *>(fld.data);
break;
- } else if ((d->q->numericalPrecisionPolicy() == QSql::LowPrecisionInt64)
+ } else if ((d->q_func()->numericalPrecisionPolicy() == QSql::LowPrecisionInt64)
&& (fld.typ == QVariant::LongLong)) {
qint64 qll = 0;
int r = OCINumberToInt(d->err, reinterpret_cast<OCINumber *>(fld.data), sizeof(qint64),
@@ -1767,7 +1768,7 @@ void QOCICols::getValues(QVector<QVariant> &v, int index)
else
v[index + i] = QVariant();
break;
- } else if ((d->q->numericalPrecisionPolicy() == QSql::LowPrecisionInt32)
+ } else if ((d->q_func()->numericalPrecisionPolicy() == QSql::LowPrecisionInt32)
&& (fld.typ == QVariant::Int)) {
v[index + i] = *reinterpret_cast<int *>(fld.data);
break;
@@ -1790,10 +1791,17 @@ void QOCICols::getValues(QVector<QVariant> &v, int index)
}
}
-QOCIResultPrivate::QOCIResultPrivate(QOCIResult *result, const QOCIDriverPrivate *driver)
- : cols(0), q(result), env(driver->env), err(0), svc(const_cast<OCISvcCtx*&>(driver->svc)),
- sql(0), transaction(driver->transaction), serverVersion(driver->serverVersion),
- prefetchRows(driver->prefetchRows), prefetchMem(driver->prefetchMem)
+QOCIResultPrivate::QOCIResultPrivate(QOCIResult *q, const QOCIDriver *drv)
+ : QSqlCachedResultPrivate(q, drv),
+ cols(0),
+ env(drv_d_func()->env),
+ err(0),
+ svc(const_cast<OCISvcCtx*&>(drv_d_func()->svc)),
+ sql(0),
+ transaction(drv_d_func()->transaction),
+ serverVersion(drv_d_func()->serverVersion),
+ prefetchRows(drv_d_func()->prefetchRows),
+ prefetchMem(drv_d_func()->prefetchMem)
{
int r = OCIHandleAlloc(env,
reinterpret_cast<void **>(&err),
@@ -1816,24 +1824,24 @@ QOCIResultPrivate::~QOCIResultPrivate()
////////////////////////////////////////////////////////////////////////////
-QOCIResult::QOCIResult(const QOCIDriver * db, const QOCIDriverPrivate* p)
- : QSqlCachedResult(db)
+QOCIResult::QOCIResult(const QOCIDriver *db)
+ : QSqlCachedResult(*new QOCIResultPrivate(this, db))
{
- d = new QOCIResultPrivate(this, p);
}
QOCIResult::~QOCIResult()
{
+ Q_D(QOCIResult);
if (d->sql) {
int r = OCIHandleFree(d->sql, OCI_HTYPE_STMT);
if (r != 0)
qWarning("~QOCIResult: unable to free statement handle");
}
- delete d;
}
QVariant QOCIResult::handle() const
{
+ Q_D(const QOCIResult);
return QVariant::fromValue(d->sql);
}
@@ -1846,6 +1854,7 @@ bool QOCIResult::reset (const QString& query)
bool QOCIResult::gotoNext(QSqlCachedResult::ValueCache &values, int index)
{
+ Q_D(QOCIResult);
if (at() == QSql::AfterLastRow)
return false;
@@ -1905,6 +1914,7 @@ int QOCIResult::size()
int QOCIResult::numRowsAffected()
{
+ Q_D(QOCIResult);
int rowCount;
OCIAttrGet(d->sql,
OCI_HTYPE_STMT,
@@ -1917,6 +1927,7 @@ int QOCIResult::numRowsAffected()
bool QOCIResult::prepare(const QString& query)
{
+ Q_D(QOCIResult);
int r = 0;
QSqlResult::prepare(query);
@@ -1962,6 +1973,7 @@ bool QOCIResult::prepare(const QString& query)
bool QOCIResult::exec()
{
+ Q_D(QOCIResult);
int r = 0;
ub2 stmtType=0;
ub4 iters;
@@ -2043,6 +2055,7 @@ bool QOCIResult::exec()
QSqlRecord QOCIResult::record() const
{
+ Q_D(const QOCIResult);
QSqlRecord inf;
if (!isActive() || !isSelect() || !d->cols)
return inf;
@@ -2051,6 +2064,7 @@ QSqlRecord QOCIResult::record() const
QVariant QOCIResult::lastInsertId() const
{
+ Q_D(const QOCIResult);
if (isActive()) {
QOCIRowIdPointer ptr(new QOCIRowId(d->env));
@@ -2064,6 +2078,7 @@ QVariant QOCIResult::lastInsertId() const
bool QOCIResult::execBatch(bool arrayBind)
{
+ Q_D(QOCIResult);
QOCICols::execBatch(d, boundValues(), arrayBind);
resetBindCount();
return lastError().type() == QSqlError::NoError;
@@ -2301,8 +2316,7 @@ void QOCIDriver::close()
QSqlResult *QOCIDriver::createResult() const
{
- Q_D(const QOCIDriver);
- return new QOCIResult(this, d);
+ return new QOCIResult(this);
}
bool QOCIDriver::beginTransaction()
diff --git a/src/sql/drivers/oci/qsql_oci_p.h b/src/sql/drivers/oci/qsql_oci_p.h
index 48da952d56..c42e689437 100644
--- a/src/sql/drivers/oci/qsql_oci_p.h
+++ b/src/sql/drivers/oci/qsql_oci_p.h
@@ -45,7 +45,6 @@
// We mean it.
//
-#include <QtSql/qsqlresult.h>
#include <QtSql/qsqldriver.h>
#ifdef QT_PLUGIN
@@ -59,41 +58,41 @@ typedef struct OCISvcCtx OCISvcCtx;
QT_BEGIN_NAMESPACE
-class QOCIDriver;
-class QOCICols;
+class QSqlResult;
class QOCIDriverPrivate;
class Q_EXPORT_SQLDRIVER_OCI QOCIDriver : public QSqlDriver
{
Q_DECLARE_PRIVATE(QOCIDriver)
Q_OBJECT
- friend struct QOCIResultPrivate;
- friend class QOCIPrivate;
+ friend class QOCICols;
+ friend class QOCIResultPrivate;
+
public:
explicit QOCIDriver(QObject* parent = 0);
QOCIDriver(OCIEnv* env, OCISvcCtx* ctx, QObject* parent = 0);
~QOCIDriver();
bool hasFeature(DriverFeature f) const;
- bool open(const QString & db,
- const QString & user,
- const QString & password,
- const QString & host,
+ bool open(const QString &db,
+ const QString &user,
+ const QString &password,
+ const QString &host,
int port,
- const QString& connOpts);
- void close();
- QSqlResult *createResult() const;
- QStringList tables(QSql::TableType) const;
- QSqlRecord record(const QString& tablename) const;
- QSqlIndex primaryIndex(const QString& tablename) const;
+ const QString &connOpts) Q_DECL_OVERRIDE;
+ void close() Q_DECL_OVERRIDE;
+ QSqlResult *createResult() const Q_DECL_OVERRIDE;
+ QStringList tables(QSql::TableType) const Q_DECL_OVERRIDE;
+ QSqlRecord record(const QString &tablename) const Q_DECL_OVERRIDE;
+ QSqlIndex primaryIndex(const QString& tablename) const Q_DECL_OVERRIDE;
QString formatValue(const QSqlField &field,
- bool trimStrings) const;
- QVariant handle() const;
- QString escapeIdentifier(const QString &identifier, IdentifierType) const;
+ bool trimStrings) const Q_DECL_OVERRIDE;
+ QVariant handle() const Q_DECL_OVERRIDE;
+ QString escapeIdentifier(const QString &identifier, IdentifierType) const Q_DECL_OVERRIDE;
protected:
- bool beginTransaction();
- bool commitTransaction();
- bool rollbackTransaction();
+ bool beginTransaction() Q_DECL_OVERRIDE;
+ bool commitTransaction() Q_DECL_OVERRIDE;
+ bool rollbackTransaction() Q_DECL_OVERRIDE;
};
QT_END_NAMESPACE
diff --git a/src/sql/drivers/odbc/qsql_odbc.cpp b/src/sql/drivers/odbc/qsql_odbc.cpp
index 8db06e6831..db1e36daa2 100644
--- a/src/sql/drivers/odbc/qsql_odbc.cpp
+++ b/src/sql/drivers/odbc/qsql_odbc.cpp
@@ -50,6 +50,7 @@
#include <QDebug>
#include <QSqlQuery>
#include <QtSql/private/qsqldriver_p.h>
+#include <QtSql/private/qsqlresult_p.h>
QT_BEGIN_NAMESPACE
@@ -106,6 +107,8 @@ inline static QVarLengthArray<SQLTCHAR> toSQLTCHAR(const QString &input)
class QODBCDriverPrivate : public QSqlDriverPrivate
{
+ Q_DECLARE_PUBLIC(QODBCDriver)
+
public:
enum DefaultCase{Lower, Mixed, Upper, Sensitive};
QODBCDriverPrivate()
@@ -143,23 +146,62 @@ private:
QChar quote;
};
-class QODBCPrivate
+class QODBCResultPrivate;
+
+class QODBCResult: public QSqlResult
+{
+ Q_DECLARE_PRIVATE(QODBCResult)
+
+public:
+ QODBCResult(const QODBCDriver *db);
+ virtual ~QODBCResult();
+
+ bool prepare(const QString &query) Q_DECL_OVERRIDE;
+ bool exec() Q_DECL_OVERRIDE;
+
+ QVariant lastInsertId() const Q_DECL_OVERRIDE;
+ QVariant handle() const Q_DECL_OVERRIDE;
+
+protected:
+ bool fetchNext() Q_DECL_OVERRIDE;
+ bool fetchFirst() Q_DECL_OVERRIDE;
+ bool fetchLast() Q_DECL_OVERRIDE;
+ bool fetchPrevious() Q_DECL_OVERRIDE;
+ bool fetch(int i) Q_DECL_OVERRIDE;
+ bool reset(const QString &query) Q_DECL_OVERRIDE;
+ QVariant data(int field) Q_DECL_OVERRIDE;
+ bool isNull(int field) Q_DECL_OVERRIDE;
+ int size() Q_DECL_OVERRIDE;
+ int numRowsAffected() Q_DECL_OVERRIDE;
+ QSqlRecord record() const Q_DECL_OVERRIDE;
+ void virtual_hook(int id, void *data) Q_DECL_OVERRIDE;
+ void detachFromResultSet() Q_DECL_OVERRIDE;
+ bool nextResult() Q_DECL_OVERRIDE;
+};
+
+class QODBCResultPrivate: public QSqlResultPrivate
{
+ Q_DECLARE_PUBLIC(QODBCResult)
+
public:
- QODBCPrivate(QODBCDriverPrivate *dpp)
- : hStmt(0), useSchema(false), hasSQLFetchScroll(true), driverPrivate(dpp), userForwardOnly(false)
+ Q_DECLARE_SQLDRIVER_PRIVATE(QODBCDriver)
+ QODBCResultPrivate(QODBCResult *q, const QODBCDriver *db)
+ : QSqlResultPrivate(q, db),
+ hStmt(0),
+ useSchema(false),
+ hasSQLFetchScroll(true)
{
- unicode = dpp->unicode;
- useSchema = dpp->useSchema;
- disconnectCount = dpp->disconnectCount;
- hasSQLFetchScroll = dpp->hasSQLFetchScroll;
+ unicode = drv_d_func()->unicode;
+ useSchema = drv_d_func()->useSchema;
+ disconnectCount = drv_d_func()->disconnectCount;
+ hasSQLFetchScroll = drv_d_func()->hasSQLFetchScroll;
}
inline void clearValues()
{ fieldCache.fill(QVariant()); fieldCacheIdx = 0; }
- SQLHANDLE dpEnv() const { return driverPrivate ? driverPrivate->hEnv : 0;}
- SQLHANDLE dpDbc() const { return driverPrivate ? driverPrivate->hDbc : 0;}
+ SQLHANDLE dpEnv() const { return drv_d_func() ? drv_d_func()->hEnv : 0;}
+ SQLHANDLE dpDbc() const { return drv_d_func() ? drv_d_func()->hDbc : 0;}
SQLHANDLE hStmt;
bool unicode;
@@ -170,23 +212,19 @@ public:
int fieldCacheIdx;
int disconnectCount;
bool hasSQLFetchScroll;
- QODBCDriverPrivate *driverPrivate;
- bool userForwardOnly;
- bool isStmtHandleValid(const QSqlDriver *driver);
- void updateStmtHandleState(const QSqlDriver *driver);
+ bool isStmtHandleValid();
+ void updateStmtHandleState();
};
-bool QODBCPrivate::isStmtHandleValid(const QSqlDriver *driver)
+bool QODBCResultPrivate::isStmtHandleValid()
{
- const QODBCDriver *odbcdriver = static_cast<const QODBCDriver*> (driver);
- return disconnectCount == odbcdriver->d_func()->disconnectCount;
+ return disconnectCount == drv_d_func()->disconnectCount;
}
-void QODBCPrivate::updateStmtHandleState(const QSqlDriver *driver)
+void QODBCResultPrivate::updateStmtHandleState()
{
- const QODBCDriver *odbcdriver = static_cast<const QODBCDriver*> (driver);
- disconnectCount = odbcdriver->d_func()->disconnectCount;
+ disconnectCount = drv_d_func()->disconnectCount;
}
static QString qWarnODBCHandle(int handleType, SQLHANDLE handle, int *nativeCode = 0)
@@ -261,7 +299,7 @@ static QString qODBCWarn(const SQLHANDLE hStmt, const SQLHANDLE envHandle = 0,
return result;
}
-static QString qODBCWarn(const QODBCPrivate* odbc, int *nativeCode = 0)
+static QString qODBCWarn(const QODBCResultPrivate* odbc, int *nativeCode = 0)
{
return qODBCWarn(odbc->hStmt, odbc->dpEnv(), odbc->dpDbc(), nativeCode);
}
@@ -271,7 +309,7 @@ static QString qODBCWarn(const QODBCDriverPrivate* odbc, int *nativeCode = 0)
return qODBCWarn(0, odbc->hEnv, odbc->hDbc, nativeCode);
}
-static void qSqlWarning(const QString& message, const QODBCPrivate* odbc)
+static void qSqlWarning(const QString& message, const QODBCResultPrivate* odbc)
{
qWarning() << message << "\tError:" << qODBCWarn(odbc);
}
@@ -286,7 +324,7 @@ static void qSqlWarning(const QString &message, const SQLHANDLE hStmt)
qWarning() << message << "\tError:" << qODBCWarn(hStmt);
}
-static QSqlError qMakeError(const QString& err, QSqlError::ErrorType type, const QODBCPrivate* p)
+static QSqlError qMakeError(const QString& err, QSqlError::ErrorType type, const QODBCResultPrivate* p)
{
int nativeCode = -1;
QString message = qODBCWarn(p, &nativeCode);
@@ -626,7 +664,7 @@ static QSqlField qMakeFieldInfo(const SQLHANDLE hStmt, const QODBCDriverPrivate*
return f;
}
-static QSqlField qMakeFieldInfo(const QODBCPrivate* p, int i )
+static QSqlField qMakeFieldInfo(const QODBCResultPrivate* p, int i )
{
QString errorMessage;
const QSqlField result = qMakeFieldInfo(p->hStmt, i, &errorMessage);
@@ -911,26 +949,25 @@ QString QODBCDriverPrivate::adjustCase(const QString &identifier) const
////////////////////////////////////////////////////////////////////////////
-QODBCResult::QODBCResult(const QODBCDriver * db, QODBCDriverPrivate* p)
-: QSqlResult(db)
+QODBCResult::QODBCResult(const QODBCDriver *db)
+ : QSqlResult(*new QODBCResultPrivate(this, db))
{
- d = new QODBCPrivate(p);
}
QODBCResult::~QODBCResult()
{
- if (d->hStmt && d->isStmtHandleValid(driver()) && driver()->isOpen()) {
+ Q_D(QODBCResult);
+ if (d->hStmt && d->isStmtHandleValid() && driver()->isOpen()) {
SQLRETURN r = SQLFreeHandle(SQL_HANDLE_STMT, d->hStmt);
if (r != SQL_SUCCESS)
qSqlWarning(QLatin1String("QODBCDriver: Unable to free statement handle ")
+ QString::number(r), d);
}
-
- delete d;
}
bool QODBCResult::reset (const QString& query)
{
+ Q_D(QODBCResult);
setActive(false);
setAt(QSql::BeforeFirstRow);
d->rInf.clear();
@@ -940,7 +977,7 @@ bool QODBCResult::reset (const QString& query)
// Always reallocate the statement handle - the statement attributes
// are not reset if SQLFreeStmt() is called which causes some problems.
SQLRETURN r;
- if (d->hStmt && d->isStmtHandleValid(driver())) {
+ if (d->hStmt && d->isStmtHandleValid()) {
r = SQLFreeHandle(SQL_HANDLE_STMT, d->hStmt);
if (r != SQL_SUCCESS) {
qSqlWarning(QLatin1String("QODBCResult::reset: Unable to free statement handle"), d);
@@ -955,9 +992,9 @@ bool QODBCResult::reset (const QString& query)
return false;
}
- d->updateStmtHandleState(driver());
+ d->updateStmtHandleState();
- if (d->userForwardOnly) {
+ if (isForwardOnly()) {
r = SQLSetStmtAttr(d->hStmt,
SQL_ATTR_CURSOR_TYPE,
(SQLPOINTER)SQL_CURSOR_FORWARD_ONLY,
@@ -987,7 +1024,7 @@ bool QODBCResult::reset (const QString& query)
SQLULEN isScrollable = 0;
r = SQLGetStmtAttr(d->hStmt, SQL_ATTR_CURSOR_SCROLLABLE, &isScrollable, SQL_IS_INTEGER, 0);
if(r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO)
- QSqlResult::setForwardOnly(isScrollable==SQL_NONSCROLLABLE);
+ setForwardOnly(isScrollable == SQL_NONSCROLLABLE);
SQLSMALLINT count = 0;
SQLNumResultCols(d->hStmt, &count);
@@ -1007,6 +1044,7 @@ bool QODBCResult::reset (const QString& query)
bool QODBCResult::fetch(int i)
{
+ Q_D(QODBCResult);
if (!driver()->isOpen())
return false;
@@ -1043,6 +1081,7 @@ bool QODBCResult::fetch(int i)
bool QODBCResult::fetchNext()
{
+ Q_D(QODBCResult);
SQLRETURN r;
d->clearValues();
@@ -1065,6 +1104,7 @@ bool QODBCResult::fetchNext()
bool QODBCResult::fetchFirst()
{
+ Q_D(QODBCResult);
if (isForwardOnly() && at() != QSql::BeforeFirstRow)
return false;
SQLRETURN r;
@@ -1087,6 +1127,7 @@ bool QODBCResult::fetchFirst()
bool QODBCResult::fetchPrevious()
{
+ Q_D(QODBCResult);
if (isForwardOnly())
return false;
SQLRETURN r;
@@ -1106,6 +1147,7 @@ bool QODBCResult::fetchPrevious()
bool QODBCResult::fetchLast()
{
+ Q_D(QODBCResult);
SQLRETURN r;
d->clearValues();
@@ -1145,6 +1187,7 @@ bool QODBCResult::fetchLast()
QVariant QODBCResult::data(int field)
{
+ Q_D(QODBCResult);
if (field >= d->rInf.count() || field < 0) {
qWarning() << "QODBCResult::data: column" << field << "out of range";
return QVariant();
@@ -1245,6 +1288,7 @@ QVariant QODBCResult::data(int field)
bool QODBCResult::isNull(int field)
{
+ Q_D(const QODBCResult);
if (field < 0 || field > d->fieldCache.size())
return true;
if (field <= d->fieldCacheIdx) {
@@ -1263,6 +1307,7 @@ int QODBCResult::size()
int QODBCResult::numRowsAffected()
{
+ Q_D(QODBCResult);
SQLLEN affectedRowCount = 0;
SQLRETURN r = SQLRowCount(d->hStmt, &affectedRowCount);
if (r == SQL_SUCCESS)
@@ -1274,12 +1319,13 @@ int QODBCResult::numRowsAffected()
bool QODBCResult::prepare(const QString& query)
{
+ Q_D(QODBCResult);
setActive(false);
setAt(QSql::BeforeFirstRow);
SQLRETURN r;
d->rInf.clear();
- if (d->hStmt && d->isStmtHandleValid(driver())) {
+ if (d->hStmt && d->isStmtHandleValid()) {
r = SQLFreeHandle(SQL_HANDLE_STMT, d->hStmt);
if (r != SQL_SUCCESS) {
qSqlWarning(QLatin1String("QODBCResult::prepare: Unable to close statement"), d);
@@ -1294,9 +1340,9 @@ bool QODBCResult::prepare(const QString& query)
return false;
}
- d->updateStmtHandleState(driver());
+ d->updateStmtHandleState();
- if (d->userForwardOnly) {
+ if (isForwardOnly()) {
r = SQLSetStmtAttr(d->hStmt,
SQL_ATTR_CURSOR_TYPE,
(SQLPOINTER)SQL_CURSOR_FORWARD_ONLY,
@@ -1328,6 +1374,7 @@ bool QODBCResult::prepare(const QString& query)
bool QODBCResult::exec()
{
+ Q_D(QODBCResult);
setActive(false);
setAt(QSql::BeforeFirstRow);
d->rInf.clear();
@@ -1408,7 +1455,7 @@ bool QODBCResult::exec()
dt->minute = qdt.time().minute();
dt->second = qdt.time().second();
- int precision = d->driverPrivate->datetime_precision - 20; // (20 includes a separating period)
+ int precision = d->drv_d_func()->datetime_precision - 20; // (20 includes a separating period)
if (precision <= 0) {
dt->fraction = 0;
} else {
@@ -1424,7 +1471,7 @@ bool QODBCResult::exec()
qParamType[bindValueType(i) & QSql::InOut],
SQL_C_TIMESTAMP,
SQL_TIMESTAMP,
- d->driverPrivate->datetime_precision,
+ d->drv_d_func()->datetime_precision,
precision,
(void *) dt,
0,
@@ -1608,7 +1655,7 @@ bool QODBCResult::exec()
SQLULEN isScrollable = 0;
r = SQLGetStmtAttr(d->hStmt, SQL_ATTR_CURSOR_SCROLLABLE, &isScrollable, SQL_IS_INTEGER, 0);
if(r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO)
- QSqlResult::setForwardOnly(isScrollable==SQL_NONSCROLLABLE);
+ setForwardOnly(isScrollable == SQL_NONSCROLLABLE);
SQLSMALLINT count = 0;
SQLNumResultCols(d->hStmt, &count);
@@ -1677,6 +1724,7 @@ bool QODBCResult::exec()
QSqlRecord QODBCResult::record() const
{
+ Q_D(const QODBCResult);
if (!isActive() || !isSelect())
return QSqlRecord();
return d->rInf;
@@ -1684,9 +1732,10 @@ QSqlRecord QODBCResult::record() const
QVariant QODBCResult::lastInsertId() const
{
+ Q_D(const QODBCResult);
QString sql;
- switch (d->driverPrivate->dbmsType) {
+ switch (driver()->dbmsType()) {
case QSqlDriver::MSSqlServer:
case QSqlDriver::Sybase:
sql = QLatin1String("SELECT @@IDENTITY;");
@@ -1716,11 +1765,13 @@ QVariant QODBCResult::lastInsertId() const
QVariant QODBCResult::handle() const
{
+ Q_D(const QODBCResult);
return QVariant(qRegisterMetaType<SQLHANDLE>("SQLHANDLE"), &d->hStmt);
}
bool QODBCResult::nextResult()
{
+ Q_D(QODBCResult);
setActive(false);
setAt(QSql::BeforeFirstRow);
d->rInf.clear();
@@ -1765,16 +1816,11 @@ void QODBCResult::virtual_hook(int id, void *data)
void QODBCResult::detachFromResultSet()
{
+ Q_D(QODBCResult);
if (d->hStmt)
SQLCloseCursor(d->hStmt);
}
-void QODBCResult::setForwardOnly(bool forward)
-{
- d->userForwardOnly = forward;
- QSqlResult::setForwardOnly(forward);
-}
-
////////////////////////////////////////
@@ -2185,8 +2231,7 @@ void QODBCDriverPrivate::checkDateTimePrecision()
QSqlResult *QODBCDriver::createResult() const
{
- Q_D(const QODBCDriver);
- return new QODBCResult(this, const_cast<QODBCDriverPrivate*>(d));
+ return new QODBCResult(this);
}
bool QODBCDriver::beginTransaction()
diff --git a/src/sql/drivers/odbc/qsql_odbc_p.h b/src/sql/drivers/odbc/qsql_odbc_p.h
index 96e7abd7dd..25cc6aaa2c 100644
--- a/src/sql/drivers/odbc/qsql_odbc_p.h
+++ b/src/sql/drivers/odbc/qsql_odbc_p.h
@@ -46,7 +46,6 @@
//
#include <QtSql/qsqldriver.h>
-#include <QtSql/qsqlresult.h>
#if defined (Q_OS_WIN32)
#include <QtCore/qt_windows.h>
@@ -75,81 +74,46 @@
QT_BEGIN_NAMESPACE
-class QODBCPrivate;
class QODBCDriverPrivate;
-class QODBCDriver;
-class QSqlRecordInfo;
-
-class QODBCResult : public QSqlResult
-{
-public:
- QODBCResult(const QODBCDriver * db, QODBCDriverPrivate* p);
- virtual ~QODBCResult();
-
- bool prepare(const QString& query);
- bool exec();
-
- QVariant lastInsertId() const;
- QVariant handle() const;
- virtual void setForwardOnly(bool forward);
-
-protected:
- bool fetchNext();
- bool fetchFirst();
- bool fetchLast();
- bool fetchPrevious();
- bool fetch(int i);
- bool reset (const QString& query);
- QVariant data(int field);
- bool isNull(int field);
- int size();
- int numRowsAffected();
- QSqlRecord record() const;
- void virtual_hook(int id, void *data);
- void detachFromResultSet();
- bool nextResult();
-
-private:
- QODBCPrivate *d;
-};
class Q_EXPORT_SQLDRIVER_ODBC QODBCDriver : public QSqlDriver
{
Q_DECLARE_PRIVATE(QODBCDriver)
Q_OBJECT
+ friend class QODBCResultPrivate;
+
public:
explicit QODBCDriver(QObject *parent=0);
QODBCDriver(SQLHANDLE env, SQLHANDLE con, QObject * parent=0);
virtual ~QODBCDriver();
- bool hasFeature(DriverFeature f) const;
- void close();
- QSqlResult *createResult() const;
- QStringList tables(QSql::TableType) const;
- QSqlRecord record(const QString& tablename) const;
- QSqlIndex primaryIndex(const QString& tablename) const;
- QVariant handle() const;
+ bool hasFeature(DriverFeature f) const Q_DECL_OVERRIDE;
+ void close() Q_DECL_OVERRIDE;
+ QSqlResult *createResult() const Q_DECL_OVERRIDE;
+ QStringList tables(QSql::TableType) const Q_DECL_OVERRIDE;
+ QSqlRecord record(const QString &tablename) const Q_DECL_OVERRIDE;
+ QSqlIndex primaryIndex(const QString &tablename) const Q_DECL_OVERRIDE;
+ QVariant handle() const Q_DECL_OVERRIDE;
QString formatValue(const QSqlField &field,
- bool trimStrings) const;
- bool open(const QString& db,
- const QString& user,
- const QString& password,
- const QString& host,
+ bool trimStrings) const Q_DECL_OVERRIDE;
+ bool open(const QString &db,
+ const QString &user,
+ const QString &password,
+ const QString &host,
int port,
- const QString& connOpts);
+ const QString &connOpts) Q_DECL_OVERRIDE;
- QString escapeIdentifier(const QString &identifier, IdentifierType type) const;
+ QString escapeIdentifier(const QString &identifier, IdentifierType type) const Q_DECL_OVERRIDE;
- bool isIdentifierEscaped(const QString &identifier, IdentifierType type) const;
+ bool isIdentifierEscaped(const QString &identifier, IdentifierType type) const Q_DECL_OVERRIDE;
protected:
- bool beginTransaction();
- bool commitTransaction();
- bool rollbackTransaction();
+ bool beginTransaction() Q_DECL_OVERRIDE;
+ bool commitTransaction() Q_DECL_OVERRIDE;
+ bool rollbackTransaction() Q_DECL_OVERRIDE;
private:
bool endTrans();
void cleanup();
- friend class QODBCPrivate;
};
QT_END_NAMESPACE
diff --git a/src/sql/drivers/psql/qsql_psql.cpp b/src/sql/drivers/psql/qsql_psql.cpp
index 5dcabb0646..f9c3f8ba75 100644
--- a/src/sql/drivers/psql/qsql_psql.cpp
+++ b/src/sql/drivers/psql/qsql_psql.cpp
@@ -119,6 +119,35 @@ inline void qPQfreemem(void *buffer)
PQfreemem(buffer);
}
+class QPSQLResultPrivate;
+
+class QPSQLResult: public QSqlResult
+{
+ Q_DECLARE_PRIVATE(QPSQLResult)
+
+public:
+ QPSQLResult(const QPSQLDriver *db);
+ ~QPSQLResult();
+
+ QVariant handle() const Q_DECL_OVERRIDE;
+ void virtual_hook(int id, void *data) Q_DECL_OVERRIDE;
+
+protected:
+ void cleanup();
+ bool fetch(int i) Q_DECL_OVERRIDE;
+ bool fetchFirst() Q_DECL_OVERRIDE;
+ bool fetchLast() Q_DECL_OVERRIDE;
+ QVariant data(int i) Q_DECL_OVERRIDE;
+ bool isNull(int field) Q_DECL_OVERRIDE;
+ bool reset (const QString &query) Q_DECL_OVERRIDE;
+ int size() Q_DECL_OVERRIDE;
+ int numRowsAffected() Q_DECL_OVERRIDE;
+ QSqlRecord record() const Q_DECL_OVERRIDE;
+ QVariant lastInsertId() const Q_DECL_OVERRIDE;
+ bool prepare(const QString &query) Q_DECL_OVERRIDE;
+ bool exec() Q_DECL_OVERRIDE;
+};
+
class QPSQLDriverPrivate : public QSqlDriverPrivate
{
Q_DECLARE_PUBLIC(QPSQLDriver)
@@ -193,8 +222,9 @@ class QPSQLResultPrivate : public QSqlResultPrivate
{
Q_DECLARE_PUBLIC(QPSQLResult)
public:
- QPSQLResultPrivate()
- : QSqlResultPrivate(),
+ Q_DECLARE_SQLDRIVER_PRIVATE(QPSQLDriver);
+ QPSQLResultPrivate(QPSQLResult *q, const QPSQLDriver *drv)
+ : QSqlResultPrivate(q, drv),
result(0),
currentSize(-1),
preparedQueriesEnabled(false)
@@ -202,11 +232,6 @@ public:
QString fieldSerial(int i) const Q_DECL_OVERRIDE { return QLatin1Char('$') + QString::number(i + 1); }
void deallocatePreparedStmt();
- const QPSQLDriverPrivate * privDriver() const
- {
- Q_Q(const QPSQLResult);
- return reinterpret_cast<const QPSQLDriver *>(q->driver())->d_func();
- }
PGresult *result;
int currentSize;
@@ -248,7 +273,7 @@ bool QPSQLResultPrivate::processResults()
return true;
}
q->setLastError(qMakeError(QCoreApplication::translate("QPSQLResult",
- "Unable to create query"), QSqlError::StatementError, privDriver(), result));
+ "Unable to create query"), QSqlError::StatementError, drv_d_func(), result));
return false;
}
@@ -301,16 +326,16 @@ static QVariant::Type qDecodePSQLType(int t)
void QPSQLResultPrivate::deallocatePreparedStmt()
{
const QString stmt = QLatin1String("DEALLOCATE ") + preparedStmtId;
- PGresult *result = privDriver()->exec(stmt);
+ PGresult *result = drv_d_func()->exec(stmt);
if (PQresultStatus(result) != PGRES_COMMAND_OK)
- qWarning("Unable to free statement: %s", PQerrorMessage(privDriver()->connection));
+ qWarning("Unable to free statement: %s", PQerrorMessage(drv_d_func()->connection));
PQclear(result);
preparedStmtId.clear();
}
QPSQLResult::QPSQLResult(const QPSQLDriver* db)
- : QSqlResult(*new QPSQLResultPrivate, db)
+ : QSqlResult(*new QPSQLResultPrivate(this, db))
{
Q_D(QPSQLResult);
d->preparedQueriesEnabled = db->hasFeature(QSqlDriver::PreparedQueries);
@@ -384,7 +409,7 @@ QVariant QPSQLResult::data(int i)
case QVariant::Bool:
return QVariant((bool)(val[0] == 't'));
case QVariant::String:
- return d->privDriver()->isUtf8 ? QString::fromUtf8(val) : QString::fromLatin1(val);
+ return d->drv_d_func()->isUtf8 ? QString::fromUtf8(val) : QString::fromLatin1(val);
case QVariant::LongLong:
if (val[0] == '-')
return QString::fromLatin1(val).toLongLong();
@@ -475,7 +500,7 @@ bool QPSQLResult::reset (const QString& query)
return false;
if (!driver()->isOpen() || driver()->isOpenError())
return false;
- d->result = d->privDriver()->exec(query);
+ d->result = d->drv_d_func()->exec(query);
return d->processResults();
}
@@ -494,7 +519,7 @@ int QPSQLResult::numRowsAffected()
QVariant QPSQLResult::lastInsertId() const
{
Q_D(const QPSQLResult);
- if (d->privDriver()->pro >= QPSQLDriver::Version81) {
+ if (d->drv_d_func()->pro >= QPSQLDriver::Version81) {
QSqlQuery qry(driver()->createResult());
// Most recent sequence value obtained from nextval
if (qry.exec(QLatin1String("SELECT lastval();")) && qry.next())
@@ -517,7 +542,7 @@ QSqlRecord QPSQLResult::record() const
int count = PQnfields(d->result);
for (int i = 0; i < count; ++i) {
QSqlField f;
- if (d->privDriver()->isUtf8)
+ if (d->drv_d_func()->isUtf8)
f.setName(QString::fromUtf8(PQfname(d->result, i)));
else
f.setName(QString::fromLocal8Bit(PQfname(d->result, i)));
@@ -611,11 +636,11 @@ bool QPSQLResult::prepare(const QString &query)
const QString stmtId = qMakePreparedStmtId();
const QString stmt = QString::fromLatin1("PREPARE %1 AS ").arg(stmtId).append(d->positionalToNamedBinding(query));
- PGresult *result = d->privDriver()->exec(stmt);
+ PGresult *result = d->drv_d_func()->exec(stmt);
if (PQresultStatus(result) != PGRES_COMMAND_OK) {
setLastError(qMakeError(QCoreApplication::translate("QPSQLResult",
- "Unable to prepare statement"), QSqlError::StatementError, d->privDriver(), result));
+ "Unable to prepare statement"), QSqlError::StatementError, d->drv_d_func(), result));
PQclear(result);
d->preparedStmtId.clear();
return false;
@@ -641,7 +666,7 @@ bool QPSQLResult::exec()
else
stmt = QString::fromLatin1("EXECUTE %1 (%2)").arg(d->preparedStmtId).arg(params);
- d->result = d->privDriver()->exec(stmt);
+ d->result = d->drv_d_func()->exec(stmt);
return d->processResults();
}
diff --git a/src/sql/drivers/psql/qsql_psql_p.h b/src/sql/drivers/psql/qsql_psql_p.h
index 61e201ae5e..d989f70ae3 100644
--- a/src/sql/drivers/psql/qsql_psql_p.h
+++ b/src/sql/drivers/psql/qsql_psql_p.h
@@ -45,7 +45,6 @@
// We mean it.
//
-#include <QtSql/qsqlresult.h>
#include <QtSql/qsqldriver.h>
#ifdef QT_PLUGIN
@@ -59,44 +58,12 @@ typedef struct pg_result PGresult;
QT_BEGIN_NAMESPACE
-class QPSQLResultPrivate;
-class QPSQLDriver;
-class QSqlRecordInfo;
-
-class QPSQLResult : public QSqlResult
-{
- Q_DECLARE_PRIVATE(QPSQLResult)
-
-public:
- QPSQLResult(const QPSQLDriver* db);
- ~QPSQLResult();
-
- QVariant handle() const Q_DECL_OVERRIDE;
- void virtual_hook(int id, void *data) Q_DECL_OVERRIDE;
-
-protected:
- void cleanup();
- bool fetch(int i) Q_DECL_OVERRIDE;
- bool fetchFirst() Q_DECL_OVERRIDE;
- bool fetchLast() Q_DECL_OVERRIDE;
- QVariant data(int i) Q_DECL_OVERRIDE;
- bool isNull(int field) Q_DECL_OVERRIDE;
- bool reset (const QString& query) Q_DECL_OVERRIDE;
- int size() Q_DECL_OVERRIDE;
- int numRowsAffected() Q_DECL_OVERRIDE;
- QSqlRecord record() const Q_DECL_OVERRIDE;
- QVariant lastInsertId() const Q_DECL_OVERRIDE;
- bool prepare(const QString& query) Q_DECL_OVERRIDE;
- bool exec() Q_DECL_OVERRIDE;
-};
-
class QPSQLDriverPrivate;
class Q_EXPORT_SQLDRIVER_PSQL QPSQLDriver : public QSqlDriver
{
friend class QPSQLResultPrivate;
Q_DECLARE_PRIVATE(QPSQLDriver)
-
Q_OBJECT
public:
enum Protocol {
diff --git a/src/sql/drivers/sqlite/qsql_sqlite.cpp b/src/sql/drivers/sqlite/qsql_sqlite.cpp
index 4286f5b338..66e5724e6f 100644
--- a/src/sql/drivers/sqlite/qsql_sqlite.cpp
+++ b/src/sql/drivers/sqlite/qsql_sqlite.cpp
@@ -105,8 +105,9 @@ class QSQLiteResultPrivate;
class QSQLiteResult : public QSqlCachedResult
{
+ Q_DECLARE_PRIVATE(QSQLiteResult)
friend class QSQLiteDriver;
- friend class QSQLiteResultPrivate;
+
public:
explicit QSQLiteResult(const QSQLiteDriver* db);
~QSQLiteResult();
@@ -123,13 +124,12 @@ protected:
QSqlRecord record() const Q_DECL_OVERRIDE;
void detachFromResultSet() Q_DECL_OVERRIDE;
void virtual_hook(int id, void *data) Q_DECL_OVERRIDE;
-
-private:
- QSQLiteResultPrivate* d;
};
class QSQLiteDriverPrivate : public QSqlDriverPrivate
{
+ Q_DECLARE_PUBLIC(QSQLiteDriver)
+
public:
inline QSQLiteDriverPrivate() : QSqlDriverPrivate(), access(0) { dbmsType = QSqlDriver::SQLite; }
sqlite3 *access;
@@ -137,19 +137,19 @@ public:
};
-class QSQLiteResultPrivate
+class QSQLiteResultPrivate: public QSqlCachedResultPrivate
{
+ Q_DECLARE_PUBLIC(QSQLiteResult)
+
public:
- QSQLiteResultPrivate(QSQLiteResult *res);
+ Q_DECLARE_SQLDRIVER_PRIVATE(QSQLiteDriver)
+ QSQLiteResultPrivate(QSQLiteResult *q, const QSQLiteDriver *drv);
void cleanup();
bool fetchNext(QSqlCachedResult::ValueCache &values, int idx, bool initialFetch);
// initializes the recordInfo and the cache
void initColumns(bool emptyResultset);
void finalize();
- QSQLiteResult* q;
- sqlite3 *access;
-
sqlite3_stmt *stmt;
bool skippedStatus; // the status of the fetchNext() that's skipped
@@ -158,13 +158,17 @@ public:
QVector<QVariant> firstRow;
};
-QSQLiteResultPrivate::QSQLiteResultPrivate(QSQLiteResult* res) : q(res), access(0),
- stmt(0), skippedStatus(false), skipRow(false)
+QSQLiteResultPrivate::QSQLiteResultPrivate(QSQLiteResult *q, const QSQLiteDriver *drv)
+ : QSqlCachedResultPrivate(q, drv),
+ stmt(0),
+ skippedStatus(false),
+ skipRow(false)
{
}
void QSQLiteResultPrivate::cleanup()
{
+ Q_Q(QSQLiteResult);
finalize();
rInf.clear();
skippedStatus = false;
@@ -185,6 +189,7 @@ void QSQLiteResultPrivate::finalize()
void QSQLiteResultPrivate::initColumns(bool emptyResultset)
{
+ Q_Q(QSQLiteResult);
int nCols = sqlite3_column_count(stmt);
if (nCols <= 0)
return;
@@ -236,6 +241,7 @@ void QSQLiteResultPrivate::initColumns(bool emptyResultset)
bool QSQLiteResultPrivate::fetchNext(QSqlCachedResult::ValueCache &values, int idx, bool initialFetch)
{
+ Q_Q(QSQLiteResult);
int res;
int i;
@@ -318,7 +324,7 @@ bool QSQLiteResultPrivate::fetchNext(QSqlCachedResult::ValueCache &values, int i
// SQLITE_ERROR is a generic error code and we must call sqlite3_reset()
// to get the specific error message.
res = sqlite3_reset(stmt);
- q->setLastError(qMakeError(access, QCoreApplication::translate("QSQLiteResult",
+ q->setLastError(qMakeError(drv_d_func()->access, QCoreApplication::translate("QSQLiteResult",
"Unable to fetch row"), QSqlError::ConnectionError, res));
q->setAt(QSql::AfterLastRow);
return false;
@@ -326,7 +332,7 @@ bool QSQLiteResultPrivate::fetchNext(QSqlCachedResult::ValueCache &values, int i
case SQLITE_BUSY:
default:
// something wrong, don't get col info, but still return false
- q->setLastError(qMakeError(access, QCoreApplication::translate("QSQLiteResult",
+ q->setLastError(qMakeError(drv_d_func()->access, QCoreApplication::translate("QSQLiteResult",
"Unable to fetch row"), QSqlError::ConnectionError, res));
sqlite3_reset(stmt);
q->setAt(QSql::AfterLastRow);
@@ -336,20 +342,18 @@ bool QSQLiteResultPrivate::fetchNext(QSqlCachedResult::ValueCache &values, int i
}
QSQLiteResult::QSQLiteResult(const QSQLiteDriver* db)
- : QSqlCachedResult(db)
+ : QSqlCachedResult(*new QSQLiteResultPrivate(this, db))
{
- d = new QSQLiteResultPrivate(this);
- d->access = db->d_func()->access;
- const_cast<QSQLiteDriverPrivate*>(db->d_func())->results.append(this);
+ Q_D(QSQLiteResult);
+ const_cast<QSQLiteDriverPrivate*>(d->drv_d_func())->results.append(this);
}
QSQLiteResult::~QSQLiteResult()
{
- const QSqlDriver *sqlDriver = driver();
- if (sqlDriver)
- const_cast<QSQLiteDriverPrivate*>(qobject_cast<const QSQLiteDriver *>(sqlDriver)->d_func())->results.removeOne(this);
+ Q_D(QSQLiteResult);
+ if (d->drv_d_func())
+ const_cast<QSQLiteDriverPrivate*>(d->drv_d_func())->results.removeOne(this);
d->cleanup();
- delete d;
}
void QSQLiteResult::virtual_hook(int id, void *data)
@@ -366,6 +370,7 @@ bool QSQLiteResult::reset(const QString &query)
bool QSQLiteResult::prepare(const QString &query)
{
+ Q_D(QSQLiteResult);
if (!driver() || !driver()->isOpen() || driver()->isOpenError())
return false;
@@ -376,7 +381,7 @@ bool QSQLiteResult::prepare(const QString &query)
const void *pzTail = NULL;
#if (SQLITE_VERSION_NUMBER >= 3003011)
- int res = sqlite3_prepare16_v2(d->access, query.constData(), (query.size() + 1) * sizeof(QChar),
+ int res = sqlite3_prepare16_v2(d->drv_d_func()->access, query.constData(), (query.size() + 1) * sizeof(QChar),
&d->stmt, &pzTail);
#else
int res = sqlite3_prepare16(d->access, query.constData(), (query.size() + 1) * sizeof(QChar),
@@ -384,12 +389,12 @@ bool QSQLiteResult::prepare(const QString &query)
#endif
if (res != SQLITE_OK) {
- setLastError(qMakeError(d->access, QCoreApplication::translate("QSQLiteResult",
+ setLastError(qMakeError(d->drv_d_func()->access, QCoreApplication::translate("QSQLiteResult",
"Unable to execute statement"), QSqlError::StatementError, res));
d->finalize();
return false;
} else if (pzTail && !QString(reinterpret_cast<const QChar *>(pzTail)).trimmed().isEmpty()) {
- setLastError(qMakeError(d->access, QCoreApplication::translate("QSQLiteResult",
+ setLastError(qMakeError(d->drv_d_func()->access, QCoreApplication::translate("QSQLiteResult",
"Unable to execute multiple statements at a time"), QSqlError::StatementError, SQLITE_MISUSE));
d->finalize();
return false;
@@ -399,6 +404,7 @@ bool QSQLiteResult::prepare(const QString &query)
bool QSQLiteResult::exec()
{
+ Q_D(QSQLiteResult);
const QVector<QVariant> values = boundValues();
d->skippedStatus = false;
@@ -409,7 +415,7 @@ bool QSQLiteResult::exec()
int res = sqlite3_reset(d->stmt);
if (res != SQLITE_OK) {
- setLastError(qMakeError(d->access, QCoreApplication::translate("QSQLiteResult",
+ setLastError(qMakeError(d->drv_d_func()->access, QCoreApplication::translate("QSQLiteResult",
"Unable to reset statement"), QSqlError::StatementError, res));
d->finalize();
return false;
@@ -469,7 +475,7 @@ bool QSQLiteResult::exec()
}
}
if (res != SQLITE_OK) {
- setLastError(qMakeError(d->access, QCoreApplication::translate("QSQLiteResult",
+ setLastError(qMakeError(d->drv_d_func()->access, QCoreApplication::translate("QSQLiteResult",
"Unable to bind parameters"), QSqlError::StatementError, res));
d->finalize();
return false;
@@ -493,6 +499,7 @@ bool QSQLiteResult::exec()
bool QSQLiteResult::gotoNext(QSqlCachedResult::ValueCache& row, int idx)
{
+ Q_D(QSQLiteResult);
return d->fetchNext(row, idx, false);
}
@@ -503,13 +510,15 @@ int QSQLiteResult::size()
int QSQLiteResult::numRowsAffected()
{
- return sqlite3_changes(d->access);
+ Q_D(const QSQLiteResult);
+ return sqlite3_changes(d->drv_d_func()->access);
}
QVariant QSQLiteResult::lastInsertId() const
{
+ Q_D(const QSQLiteResult);
if (isActive()) {
- qint64 id = sqlite3_last_insert_rowid(d->access);
+ qint64 id = sqlite3_last_insert_rowid(d->drv_d_func()->access);
if (id)
return id;
}
@@ -518,6 +527,7 @@ QVariant QSQLiteResult::lastInsertId() const
QSqlRecord QSQLiteResult::record() const
{
+ Q_D(const QSQLiteResult);
if (!isActive() || !isSelect())
return QSqlRecord();
return d->rInf;
@@ -525,12 +535,14 @@ QSqlRecord QSQLiteResult::record() const
void QSQLiteResult::detachFromResultSet()
{
+ Q_D(QSQLiteResult);
if (d->stmt)
sqlite3_reset(d->stmt);
}
QVariant QSQLiteResult::handle() const
{
+ Q_D(const QSQLiteResult);
return QVariant::fromValue(d->stmt);
}
@@ -640,7 +652,7 @@ void QSQLiteDriver::close()
Q_D(QSQLiteDriver);
if (isOpen()) {
foreach (QSQLiteResult *result, d->results) {
- result->d->finalize();
+ result->d_func()->finalize();
}
if (sqlite3_close(d->access) != SQLITE_OK)
diff --git a/src/sql/drivers/sqlite/qsql_sqlite_p.h b/src/sql/drivers/sqlite/qsql_sqlite_p.h
index 23b598de98..d0dc91daab 100644
--- a/src/sql/drivers/sqlite/qsql_sqlite_p.h
+++ b/src/sql/drivers/sqlite/qsql_sqlite_p.h
@@ -46,7 +46,6 @@
//
#include <QtSql/qsqldriver.h>
-#include <QtSql/qsqlresult.h>
struct sqlite3;
@@ -58,14 +57,14 @@ struct sqlite3;
QT_BEGIN_NAMESPACE
+class QSqlResult;
class QSQLiteDriverPrivate;
-class QSQLiteDriver;
class Q_EXPORT_SQLDRIVER_SQLITE QSQLiteDriver : public QSqlDriver
{
Q_DECLARE_PRIVATE(QSQLiteDriver)
Q_OBJECT
- friend class QSQLiteResult;
+ friend class QSQLiteResultPrivate;
public:
explicit QSQLiteDriver(QObject *parent = 0);
explicit QSQLiteDriver(sqlite3 *connection, QObject *parent = 0);
diff --git a/src/sql/drivers/sqlite2/qsql_sqlite2.cpp b/src/sql/drivers/sqlite2/qsql_sqlite2.cpp
index 3b540fd193..cd449e28e8 100644
--- a/src/sql/drivers/sqlite2/qsql_sqlite2.cpp
+++ b/src/sql/drivers/sqlite2/qsql_sqlite2.cpp
@@ -77,6 +77,8 @@ static QVariant::Type nameToType(const QString& typeName)
class QSQLite2DriverPrivate : public QSqlDriverPrivate
{
+ Q_DECLARE_PUBLIC(QSQLite2Driver)
+
public:
QSQLite2DriverPrivate();
sqlite *access;
@@ -93,30 +95,31 @@ class QSQLite2ResultPrivate;
class QSQLite2Result : public QSqlCachedResult
{
+ Q_DECLARE_PRIVATE(QSQLite2Result)
friend class QSQLite2Driver;
- friend class QSQLite2ResultPrivate;
+
public:
explicit QSQLite2Result(const QSQLite2Driver* db);
~QSQLite2Result();
- QVariant handle() const;
+ QVariant handle() const Q_DECL_OVERRIDE;
protected:
- bool gotoNext(QSqlCachedResult::ValueCache& row, int idx);
- bool reset (const QString& query);
- int size();
- int numRowsAffected();
- QSqlRecord record() const;
- void detachFromResultSet();
- void virtual_hook(int id, void *data);
-
-private:
- QSQLite2ResultPrivate* d;
+ bool gotoNext(QSqlCachedResult::ValueCache &row, int idx) Q_DECL_OVERRIDE;
+ bool reset(const QString &query) Q_DECL_OVERRIDE;
+ int size() Q_DECL_OVERRIDE;
+ int numRowsAffected() Q_DECL_OVERRIDE;
+ QSqlRecord record() const Q_DECL_OVERRIDE;
+ void detachFromResultSet() Q_DECL_OVERRIDE;
+ void virtual_hook(int id, void *data) Q_DECL_OVERRIDE;
};
-class QSQLite2ResultPrivate
+class QSQLite2ResultPrivate: public QSqlCachedResultPrivate
{
+ Q_DECLARE_PUBLIC(QSQLite2Result)
+
public:
- QSQLite2ResultPrivate(QSQLite2Result *res);
+ Q_DECLARE_SQLDRIVER_PRIVATE(QSQLite2Driver);
+ QSQLite2ResultPrivate(QSQLite2Result *q, const QSQLite2Driver *drv);
void cleanup();
bool fetchNext(QSqlCachedResult::ValueCache &values, int idx, bool initialFetch);
bool isSelect();
@@ -124,9 +127,6 @@ public:
void init(const char **cnames, int numCols);
void finalize();
- QSQLite2Result* q;
- sqlite *access;
-
// and we have too keep our own struct for the data (sqlite works via
// callback.
const char *currentTail;
@@ -134,20 +134,24 @@ public:
bool skippedStatus; // the status of the fetchNext() that's skipped
bool skipRow; // skip the next fetchNext()?
- bool utf8;
QSqlRecord rInf;
QVector<QVariant> firstRow;
};
static const uint initial_cache_size = 128;
-QSQLite2ResultPrivate::QSQLite2ResultPrivate(QSQLite2Result* res) : q(res), access(0), currentTail(0),
- currentMachine(0), skippedStatus(false), skipRow(false), utf8(false)
+QSQLite2ResultPrivate::QSQLite2ResultPrivate(QSQLite2Result *q, const QSQLite2Driver *drv)
+ : QSqlCachedResultPrivate(q, drv),
+ currentTail(0),
+ currentMachine(0),
+ skippedStatus(false),
+ skipRow(false)
{
}
void QSQLite2ResultPrivate::cleanup()
{
+ Q_Q(QSQLite2Result);
finalize();
rInf.clear();
currentTail = 0;
@@ -161,6 +165,7 @@ void QSQLite2ResultPrivate::cleanup()
void QSQLite2ResultPrivate::finalize()
{
+ Q_Q(QSQLite2Result);
if (!currentMachine)
return;
@@ -178,6 +183,7 @@ void QSQLite2ResultPrivate::finalize()
// called on first fetch
void QSQLite2ResultPrivate::init(const char **cnames, int numCols)
{
+ Q_Q(QSQLite2Result);
if (!cnames)
return;
@@ -204,6 +210,7 @@ void QSQLite2ResultPrivate::init(const char **cnames, int numCols)
bool QSQLite2ResultPrivate::fetchNext(QSqlCachedResult::ValueCache &values, int idx, bool initialFetch)
{
+ Q_Q(QSQLite2Result);
// may be caching.
const char **fvals;
const char **cnames;
@@ -250,7 +257,7 @@ bool QSQLite2ResultPrivate::fetchNext(QSqlCachedResult::ValueCache &values, int
if (idx < 0 && !initialFetch)
return true;
for (i = 0; i < colNum; ++i)
- values[i + idx] = utf8 ? QString::fromUtf8(fvals[i]) : QString::fromLatin1(fvals[i]);
+ values[i + idx] = drv_d_func()->utf8 ? QString::fromUtf8(fvals[i]) : QString::fromLatin1(fvals[i]);
return true;
case SQLITE_DONE:
if (rInf.isEmpty())
@@ -270,17 +277,14 @@ bool QSQLite2ResultPrivate::fetchNext(QSqlCachedResult::ValueCache &values, int
}
QSQLite2Result::QSQLite2Result(const QSQLite2Driver* db)
-: QSqlCachedResult(db)
+ : QSqlCachedResult(*new QSQLite2ResultPrivate(this, db))
{
- d = new QSQLite2ResultPrivate(this);
- d->access = db->d_func()->access;
- d->utf8 = db->d_func()->utf8;
}
QSQLite2Result::~QSQLite2Result()
{
+ Q_D(QSQLite2Result);
d->cleanup();
- delete d;
}
void QSQLite2Result::virtual_hook(int id, void *data)
@@ -293,6 +297,7 @@ void QSQLite2Result::virtual_hook(int id, void *data)
*/
bool QSQLite2Result::reset (const QString& query)
{
+ Q_D(QSQLite2Result);
// this is where we build a query.
if (!driver())
return false;
@@ -304,8 +309,8 @@ bool QSQLite2Result::reset (const QString& query)
// Um, ok. callback based so.... pass private static function for this.
setSelect(false);
char *err = 0;
- int res = sqlite_compile(d->access,
- d->utf8 ? query.toUtf8().constData()
+ int res = sqlite_compile(d->drv_d_func()->access,
+ d->drv_d_func()->utf8 ? query.toUtf8().constData()
: query.toLatin1().constData(),
&(d->currentTail),
&(d->currentMachine),
@@ -336,6 +341,7 @@ bool QSQLite2Result::reset (const QString& query)
bool QSQLite2Result::gotoNext(QSqlCachedResult::ValueCache& row, int idx)
{
+ Q_D(QSQLite2Result);
return d->fetchNext(row, idx, false);
}
@@ -346,11 +352,13 @@ int QSQLite2Result::size()
int QSQLite2Result::numRowsAffected()
{
- return sqlite_changes(d->access);
+ Q_D(QSQLite2Result);
+ return sqlite_changes(d->drv_d_func()->access);
}
QSqlRecord QSQLite2Result::record() const
{
+ Q_D(const QSQLite2Result);
if (!isActive() || !isSelect())
return QSqlRecord();
return d->rInf;
@@ -358,11 +366,13 @@ QSqlRecord QSQLite2Result::record() const
void QSQLite2Result::detachFromResultSet()
{
+ Q_D(QSQLite2Result);
d->finalize();
}
QVariant QSQLite2Result::handle() const
{
+ Q_D(const QSQLite2Result);
return QVariant::fromValue(d->currentMachine);
}
diff --git a/src/sql/drivers/sqlite2/qsql_sqlite2_p.h b/src/sql/drivers/sqlite2/qsql_sqlite2_p.h
index 95766dacd0..408cc832a3 100644
--- a/src/sql/drivers/sqlite2/qsql_sqlite2_p.h
+++ b/src/sql/drivers/sqlite2/qsql_sqlite2_p.h
@@ -46,9 +46,6 @@
//
#include <QtSql/qsqldriver.h>
-#include <QtSql/qsqlresult.h>
-#include <QtSql/qsqlrecord.h>
-#include <QtSql/qsqlindex.h>
#if defined (Q_OS_WIN32)
# include <QtCore/qt_windows.h>
@@ -56,43 +53,49 @@
struct sqlite;
+#ifdef QT_PLUGIN
+#define Q_EXPORT_SQLDRIVER_SQLITE2
+#else
+#define Q_EXPORT_SQLDRIVER_SQLITE2 Q_SQL_EXPORT
+#endif
+
QT_BEGIN_NAMESPACE
+class QSqlResult;
class QSQLite2DriverPrivate;
-class QSQLite2Driver;
-class QSQLite2Driver : public QSqlDriver
+class Q_EXPORT_SQLDRIVER_SQLITE2 QSQLite2Driver : public QSqlDriver
{
- friend class QSQLite2Result;
+ friend class QSQLite2ResultPrivate;
Q_DECLARE_PRIVATE(QSQLite2Driver)
Q_OBJECT
public:
explicit QSQLite2Driver(QObject *parent = 0);
explicit QSQLite2Driver(sqlite *connection, QObject *parent = 0);
~QSQLite2Driver();
- bool hasFeature(DriverFeature f) const;
- bool open(const QString & db,
- const QString & user,
- const QString & password,
- const QString & host,
+ bool hasFeature(DriverFeature f) const Q_DECL_OVERRIDE;
+ bool open(const QString &db,
+ const QString &user,
+ const QString &password,
+ const QString &host,
int port,
- const QString & connOpts);
- bool open(const QString & db,
- const QString & user,
- const QString & password,
- const QString & host,
- int port) { return open (db, user, password, host, port, QString()); }
- void close();
- QSqlResult *createResult() const;
- bool beginTransaction();
- bool commitTransaction();
- bool rollbackTransaction();
- QStringList tables(QSql::TableType) const;
+ const QString &connOpts) Q_DECL_OVERRIDE;
+ bool open(const QString &db,
+ const QString &user,
+ const QString &password,
+ const QString &host,
+ int port) { return open(db, user, password, host, port, QString()); }
+ void close() Q_DECL_OVERRIDE;
+ QSqlResult *createResult() const Q_DECL_OVERRIDE;
+ bool beginTransaction() Q_DECL_OVERRIDE;
+ bool commitTransaction() Q_DECL_OVERRIDE;
+ bool rollbackTransaction() Q_DECL_OVERRIDE;
+ QStringList tables(QSql::TableType) const Q_DECL_OVERRIDE;
- QSqlRecord record(const QString& tablename) const;
- QSqlIndex primaryIndex(const QString &table) const;
- QVariant handle() const;
- QString escapeIdentifier(const QString &identifier, IdentifierType) const;
+ QSqlRecord record(const QString &tablename) const Q_DECL_OVERRIDE;
+ QSqlIndex primaryIndex(const QString &table) const Q_DECL_OVERRIDE;
+ QVariant handle() const Q_DECL_OVERRIDE;
+ QString escapeIdentifier(const QString &identifier, IdentifierType) const Q_DECL_OVERRIDE;
};
QT_END_NAMESPACE
diff --git a/src/sql/drivers/tds/qsql_tds.cpp b/src/sql/drivers/tds/qsql_tds.cpp
index f048440113..75d6cc2cd6 100644
--- a/src/sql/drivers/tds/qsql_tds.cpp
+++ b/src/sql/drivers/tds/qsql_tds.cpp
@@ -131,6 +131,8 @@ QSqlError qMakeError(const QString& err, QSqlError::ErrorType type, int errNo =
class QTDSDriverPrivate : public QSqlDriverPrivate
{
+ Q_DECLARE_PUBLIC(QTDSDriver)
+
public:
QTDSDriverPrivate() : QSqlDriverPrivate(), login(0), initialized(false) { dbmsType = QSqlDriver::Sybase; }
LOGINREC* login; // login information
@@ -150,6 +152,8 @@ class QTDSResultPrivate;
class QTDSResult : public QSqlCachedResult
{
+ Q_DECLARE_PRIVATE(QTDSResult)
+
public:
explicit QTDSResult(const QTDSDriver* db);
~QTDSResult();
@@ -157,20 +161,23 @@ public:
protected:
void cleanup();
- bool reset (const QString& query);
- int size();
- int numRowsAffected();
- bool gotoNext(QSqlCachedResult::ValueCache &values, int index);
- QSqlRecord record() const;
-
-private:
- QTDSResultPrivate* d;
+ bool reset(const QString &query) Q_DECL_OVERRIDE;
+ int size() Q_DECL_OVERRIDE;
+ int numRowsAffected() Q_DECL_OVERRIDE;
+ bool gotoNext(QSqlCachedResult::ValueCache &values, int index) Q_DECL_OVERRIDE;
+ QSqlRecord record() const Q_DECL_OVERRIDE;
};
-class QTDSResultPrivate
+class QTDSResultPrivate: public QSqlCachedResultPrivate
{
+ Q_DECLARE_PUBLIC(QTDSResult)
+
public:
- QTDSResultPrivate():login(0), dbproc(0) {}
+ Q_DECLARE_SQLDRIVER_PRIVATE(QTDSDriver)
+ QTDSResultPrivate(QTDSResult *q, const QTDSDriver *drv)
+ : QSqlCachedResultPrivate(q, drv),
+ login(0),
+ dbproc(0) {}
LOGINREC* login; // login information
DBPROCESS* dbproc; // connection from app to server
QSqlError lastError;
@@ -316,15 +323,15 @@ QVariant::Type qFieldType(QTDSResultPrivate* d, int i)
QTDSResult::QTDSResult(const QTDSDriver* db)
- : QSqlCachedResult(db)
+ : QSqlCachedResult(*new QTDSResultPrivate(this, db))
{
- d = new QTDSResultPrivate();
- d->login = db->d_func()->login;
+ Q_D(QTDSResult);
+ d->login = d->drv_d_func()->login;
- d->dbproc = dbopen(d->login, const_cast<char*>(db->d_func()->hostName.toLatin1().constData()));
+ d->dbproc = dbopen(d->login, const_cast<char*>(d->drv_d_func()->hostName.toLatin1().constData()));
if (!d->dbproc)
return;
- if (dbuse(d->dbproc, const_cast<char*>(db->d_func()->db.toLatin1().constData())) == FAIL)
+ if (dbuse(d->dbproc, const_cast<char*>(d->drv_d_func()->db.toLatin1().constData())) == FAIL)
return;
// insert d in error handler dict
@@ -335,15 +342,16 @@ QTDSResult::QTDSResult(const QTDSDriver* db)
QTDSResult::~QTDSResult()
{
+ Q_D(QTDSResult);
cleanup();
if (d->dbproc)
dbclose(d->dbproc);
errs()->remove(d->dbproc);
- delete d;
}
void QTDSResult::cleanup()
{
+ Q_D(QTDSResult);
d->clearErrorMsgs();
d->rec.clear();
for (int i = 0; i < d->buffer.size(); ++i)
@@ -358,6 +366,7 @@ void QTDSResult::cleanup()
QVariant QTDSResult::handle() const
{
+ Q_D(const QTDSResult);
return QVariant(qRegisterMetaType<DBPROCESS *>("DBPROCESS*"), &d->dbproc);
}
@@ -368,6 +377,7 @@ static inline bool qIsNull(const QTDSColumnData &p)
bool QTDSResult::gotoNext(QSqlCachedResult::ValueCache &values, int index)
{
+ Q_D(QTDSResult);
STATUS stat = dbnextrow(d->dbproc);
if (stat == NO_MORE_ROWS) {
setAt(QSql::AfterLastRow);
@@ -427,6 +437,7 @@ bool QTDSResult::gotoNext(QSqlCachedResult::ValueCache &values, int index)
bool QTDSResult::reset (const QString& query)
{
+ Q_D(QTDSResult);
cleanup();
if (!driver() || !driver()-> isOpen() || driver()->isOpenError())
return false;
@@ -515,6 +526,7 @@ int QTDSResult::size()
int QTDSResult::numRowsAffected()
{
+ Q_D(const QTDSResult);
#ifdef DBNTWIN32
if (dbiscount(d->dbproc)) {
return DBCOUNT(d->dbproc);
@@ -527,6 +539,7 @@ int QTDSResult::numRowsAffected()
QSqlRecord QTDSResult::record() const
{
+ Q_D(const QTDSResult);
return d->rec;
}
diff --git a/src/sql/drivers/tds/qsql_tds_p.h b/src/sql/drivers/tds/qsql_tds_p.h
index fae5dc2877..25a5aa1fe7 100644
--- a/src/sql/drivers/tds/qsql_tds_p.h
+++ b/src/sql/drivers/tds/qsql_tds_p.h
@@ -45,7 +45,6 @@
// We mean it.
//
-#include <QtSql/qsqlresult.h>
#include <QtSql/qsqldriver.h>
#ifdef Q_OS_WIN32
@@ -71,41 +70,41 @@
QT_BEGIN_NAMESPACE
+class QSqlResult;
class QTDSDriverPrivate;
-class QTDSDriver;
class Q_EXPORT_SQLDRIVER_TDS QTDSDriver : public QSqlDriver
{
Q_DECLARE_PRIVATE(QTDSDriver)
Q_OBJECT
- friend class QTDSResult;
+ friend class QTDSResultPrivate;
public:
explicit QTDSDriver(QObject* parent = 0);
QTDSDriver(LOGINREC* rec, const QString& host, const QString &db, QObject* parent = 0);
~QTDSDriver();
- bool hasFeature(DriverFeature f) const;
- bool open(const QString & db,
- const QString & user,
- const QString & password,
- const QString & host,
+ bool hasFeature(DriverFeature f) const Q_DECL_OVERRIDE;
+ bool open(const QString &db,
+ const QString &user,
+ const QString &password,
+ const QString &host,
int port,
- const QString& connOpts);
- void close();
- QStringList tables(QSql::TableType) const;
- QSqlResult *createResult() const;
- QSqlRecord record(const QString& tablename) const;
- QSqlIndex primaryIndex(const QString& tablename) const;
+ const QString &connOpts) Q_DECL_OVERRIDE;
+ void close() Q_DECL_OVERRIDE;
+ QStringList tables(QSql::TableType) const Q_DECL_OVERRIDE;
+ QSqlResult *createResult() const Q_DECL_OVERRIDE;
+ QSqlRecord record(const QString &tablename) const Q_DECL_OVERRIDE;
+ QSqlIndex primaryIndex(const QString &tablename) const Q_DECL_OVERRIDE;
QString formatValue(const QSqlField &field,
- bool trimStrings) const;
- QVariant handle() const;
+ bool trimStrings) const Q_DECL_OVERRIDE;
+ QVariant handle() const Q_DECL_OVERRIDE;
- QString escapeIdentifier(const QString &identifier, IdentifierType type) const;
+ QString escapeIdentifier(const QString &identifier, IdentifierType type) const Q_DECL_OVERRIDE;
protected:
- bool beginTransaction();
- bool commitTransaction();
- bool rollbackTransaction();
+ bool beginTransaction() Q_DECL_OVERRIDE;
+ bool commitTransaction() Q_DECL_OVERRIDE;
+ bool rollbackTransaction() Q_DECL_OVERRIDE;
private:
void init();
};
diff --git a/src/sql/kernel/qsqlcachedresult.cpp b/src/sql/kernel/qsqlcachedresult.cpp
index b9611ae8c7..ce93688cb2 100644
--- a/src/sql/kernel/qsqlcachedresult.cpp
+++ b/src/sql/kernel/qsqlcachedresult.cpp
@@ -36,6 +36,7 @@
#include <qvariant.h>
#include <qdatetime.h>
#include <qvector.h>
+#include <QtSql/private/qsqldriver_p.h>
QT_BEGIN_NAMESPACE
@@ -53,33 +54,17 @@ QT_BEGIN_NAMESPACE
static const uint initial_cache_size = 128;
-class QSqlCachedResultPrivate
-{
-public:
- QSqlCachedResultPrivate();
- bool canSeek(int i) const;
- inline int cacheCount() const;
- void init(int count, bool fo);
- void cleanup();
- int nextIndex();
- void revertLast();
-
- QSqlCachedResult::ValueCache cache;
- int rowCacheEnd;
- int colCount;
- bool forwardOnly;
- bool atEnd;
-};
-
-QSqlCachedResultPrivate::QSqlCachedResultPrivate():
- rowCacheEnd(0), colCount(0), forwardOnly(false), atEnd(false)
+QSqlCachedResultPrivate::QSqlCachedResultPrivate(QSqlCachedResult *q, const QSqlDriver *drv)
+ : QSqlResultPrivate(q, drv),
+ rowCacheEnd(0),
+ colCount(0),
+ atEnd(false)
{
}
void QSqlCachedResultPrivate::cleanup()
{
cache.clear();
- forwardOnly = false;
atEnd = false;
colCount = 0;
rowCacheEnd = 0;
@@ -134,23 +119,20 @@ inline int QSqlCachedResultPrivate::cacheCount() const
//////////////
-QSqlCachedResult::QSqlCachedResult(const QSqlDriver * db): QSqlResult (db)
-{
- d = new QSqlCachedResultPrivate();
-}
-
-QSqlCachedResult::~QSqlCachedResult()
+QSqlCachedResult::QSqlCachedResult(QSqlCachedResultPrivate &d)
+ : QSqlResult(d)
{
- delete d;
}
void QSqlCachedResult::init(int colCount)
{
+ Q_D(QSqlCachedResult);
d->init(colCount, isForwardOnly());
}
bool QSqlCachedResult::fetch(int i)
{
+ Q_D(QSqlCachedResult);
if ((!isActive()) || (i < 0))
return false;
if (at() == i)
@@ -189,6 +171,7 @@ bool QSqlCachedResult::fetch(int i)
bool QSqlCachedResult::fetchNext()
{
+ Q_D(QSqlCachedResult);
if (d->canSeek(at() + 1)) {
setAt(at() + 1);
return true;
@@ -203,6 +186,7 @@ bool QSqlCachedResult::fetchPrevious()
bool QSqlCachedResult::fetchFirst()
{
+ Q_D(QSqlCachedResult);
if (d->forwardOnly && at() != QSql::BeforeFirstRow) {
return false;
}
@@ -215,6 +199,7 @@ bool QSqlCachedResult::fetchFirst()
bool QSqlCachedResult::fetchLast()
{
+ Q_D(QSqlCachedResult);
if (d->atEnd) {
if (d->forwardOnly)
return false;
@@ -235,6 +220,7 @@ bool QSqlCachedResult::fetchLast()
QVariant QSqlCachedResult::data(int i)
{
+ Q_D(const QSqlCachedResult);
int idx = d->forwardOnly ? i : at() * d->colCount + i;
if (i >= d->colCount || i < 0 || at() < 0 || idx >= d->rowCacheEnd)
return QVariant();
@@ -244,6 +230,7 @@ QVariant QSqlCachedResult::data(int i)
bool QSqlCachedResult::isNull(int i)
{
+ Q_D(const QSqlCachedResult);
int idx = d->forwardOnly ? i : at() * d->colCount + i;
if (i >= d->colCount || i < 0 || at() < 0 || idx >= d->rowCacheEnd)
return true;
@@ -253,6 +240,7 @@ bool QSqlCachedResult::isNull(int i)
void QSqlCachedResult::cleanup()
{
+ Q_D(QSqlCachedResult);
setAt(QSql::BeforeFirstRow);
setActive(false);
d->cleanup();
@@ -260,6 +248,7 @@ void QSqlCachedResult::cleanup()
void QSqlCachedResult::clearValues()
{
+ Q_D(QSqlCachedResult);
setAt(QSql::BeforeFirstRow);
d->rowCacheEnd = 0;
d->atEnd = false;
@@ -267,6 +256,7 @@ void QSqlCachedResult::clearValues()
bool QSqlCachedResult::cacheNext()
{
+ Q_D(QSqlCachedResult);
if (d->atEnd)
return false;
@@ -286,11 +276,13 @@ bool QSqlCachedResult::cacheNext()
int QSqlCachedResult::colCount() const
{
+ Q_D(const QSqlCachedResult);
return d->colCount;
}
QSqlCachedResult::ValueCache &QSqlCachedResult::cache()
{
+ Q_D(QSqlCachedResult);
return d->cache;
}
diff --git a/src/sql/kernel/qsqlcachedresult_p.h b/src/sql/kernel/qsqlcachedresult_p.h
index 798de01f63..a24964bfb2 100644
--- a/src/sql/kernel/qsqlcachedresult_p.h
+++ b/src/sql/kernel/qsqlcachedresult_p.h
@@ -46,6 +46,7 @@
//
#include "QtSql/qsqlresult.h"
+#include "QtSql/private/qsqlresult_p.h"
QT_BEGIN_NAMESPACE
@@ -56,13 +57,13 @@ class QSqlCachedResultPrivate;
class Q_SQL_EXPORT QSqlCachedResult: public QSqlResult
{
-public:
- virtual ~QSqlCachedResult();
+ Q_DECLARE_PRIVATE(QSqlCachedResult)
+public:
typedef QVector<QVariant> ValueCache;
protected:
- QSqlCachedResult(const QSqlDriver * db);
+ QSqlCachedResult(QSqlCachedResultPrivate &d);
void init(int colCount);
void cleanup();
@@ -70,23 +71,41 @@ protected:
virtual bool gotoNext(ValueCache &values, int index) = 0;
- QVariant data(int i);
- bool isNull(int i);
- bool fetch(int i);
- bool fetchNext();
- bool fetchPrevious();
- bool fetchFirst();
- bool fetchLast();
+ QVariant data(int i) Q_DECL_OVERRIDE;
+ bool isNull(int i) Q_DECL_OVERRIDE;
+ bool fetch(int i) Q_DECL_OVERRIDE;
+ bool fetchNext() Q_DECL_OVERRIDE;
+ bool fetchPrevious() Q_DECL_OVERRIDE;
+ bool fetchFirst() Q_DECL_OVERRIDE;
+ bool fetchLast() Q_DECL_OVERRIDE;
int colCount() const;
ValueCache &cache();
- void virtual_hook(int id, void *data);
- void detachFromResultSet();
- void setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy policy);
+ void virtual_hook(int id, void *data) Q_DECL_OVERRIDE;
+ void detachFromResultSet() Q_DECL_OVERRIDE;
+ void setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy policy) Q_DECL_OVERRIDE;
private:
bool cacheNext();
- QSqlCachedResultPrivate *d;
+};
+
+class Q_SQL_EXPORT QSqlCachedResultPrivate: public QSqlResultPrivate
+{
+ Q_DECLARE_PUBLIC(QSqlCachedResult)
+
+public:
+ QSqlCachedResultPrivate(QSqlCachedResult *q, const QSqlDriver *drv);
+ bool canSeek(int i) const;
+ inline int cacheCount() const;
+ void init(int count, bool fo);
+ void cleanup();
+ int nextIndex();
+ void revertLast();
+
+ QSqlCachedResult::ValueCache cache;
+ int rowCacheEnd;
+ int colCount;
+ bool atEnd;
};
QT_END_NAMESPACE
diff --git a/src/sql/kernel/qsqldriver.cpp b/src/sql/kernel/qsqldriver.cpp
index ccfc6e04f0..337b093c83 100644
--- a/src/sql/kernel/qsqldriver.cpp
+++ b/src/sql/kernel/qsqldriver.cpp
@@ -157,7 +157,8 @@ QSqlDriver::~QSqlDriver()
bool QSqlDriver::isOpen() const
{
- return d_func()->isOpen;
+ Q_D(const QSqlDriver);
+ return d->isOpen;
}
/*!
@@ -167,7 +168,8 @@ bool QSqlDriver::isOpen() const
bool QSqlDriver::isOpenError() const
{
- return d_func()->isOpenError;
+ Q_D(const QSqlDriver);
+ return d->isOpenError;
}
/*!
@@ -274,7 +276,8 @@ bool QSqlDriver::isOpenError() const
void QSqlDriver::setOpen(bool open)
{
- d_func()->isOpen = open;
+ Q_D(QSqlDriver);
+ d->isOpen = open;
}
/*!
@@ -288,9 +291,10 @@ void QSqlDriver::setOpen(bool open)
void QSqlDriver::setOpenError(bool error)
{
- d_func()->isOpenError = error;
+ Q_D(QSqlDriver);
+ d->isOpenError = error;
if (error)
- d_func()->isOpen = false;
+ d->isOpen = false;
}
/*!
@@ -341,7 +345,8 @@ bool QSqlDriver::rollbackTransaction()
void QSqlDriver::setLastError(const QSqlError &error)
{
- d_func()->error = error;
+ Q_D(QSqlDriver);
+ d->error = error;
}
/*!
@@ -351,7 +356,8 @@ void QSqlDriver::setLastError(const QSqlError &error)
QSqlError QSqlDriver::lastError() const
{
- return d_func()->error;
+ Q_D(const QSqlDriver);
+ return d->error;
}
/*!
@@ -766,7 +772,8 @@ QStringList QSqlDriver::subscribedToNotifications() const
*/
void QSqlDriver::setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy)
{
- d_func()->precisionPolicy = precisionPolicy;
+ Q_D(QSqlDriver);
+ d->precisionPolicy = precisionPolicy;
}
/*!
@@ -779,7 +786,8 @@ void QSqlDriver::setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy prec
*/
QSql::NumericalPrecisionPolicy QSqlDriver::numericalPrecisionPolicy() const
{
- return d_func()->precisionPolicy;
+ Q_D(const QSqlDriver);
+ return d->precisionPolicy;
}
/*!
@@ -789,7 +797,8 @@ QSql::NumericalPrecisionPolicy QSqlDriver::numericalPrecisionPolicy() const
*/
QSqlDriver::DbmsType QSqlDriver::dbmsType() const
{
- return d_func()->dbmsType;
+ Q_D(const QSqlDriver);
+ return d->dbmsType;
}
/*!
diff --git a/src/sql/kernel/qsqlnulldriver_p.h b/src/sql/kernel/qsqlnulldriver_p.h
index fef2942325..3d2cd98931 100644
--- a/src/sql/kernel/qsqlnulldriver_p.h
+++ b/src/sql/kernel/qsqlnulldriver_p.h
@@ -59,27 +59,27 @@ public:
{ QSqlResult::setLastError(
QSqlError(QLatin1String("Driver not loaded"), QLatin1String("Driver not loaded"), QSqlError::ConnectionError)); }
protected:
- inline QVariant data(int) { return QVariant(); }
- inline bool reset (const QString&) { return false; }
- inline bool fetch(int) { return false; }
- inline bool fetchFirst() { return false; }
- inline bool fetchLast() { return false; }
- inline bool isNull(int) { return false; }
- inline int size() { return -1; }
- inline int numRowsAffected() { return 0; }
+ inline QVariant data(int) Q_DECL_OVERRIDE { return QVariant(); }
+ inline bool reset (const QString&) Q_DECL_OVERRIDE { return false; }
+ inline bool fetch(int) Q_DECL_OVERRIDE { return false; }
+ inline bool fetchFirst() Q_DECL_OVERRIDE { return false; }
+ inline bool fetchLast() Q_DECL_OVERRIDE { return false; }
+ inline bool isNull(int) Q_DECL_OVERRIDE { return false; }
+ inline int size() Q_DECL_OVERRIDE { return -1; }
+ inline int numRowsAffected() Q_DECL_OVERRIDE { return 0; }
- inline void setAt(int) {}
- inline void setActive(bool) {}
- inline void setLastError(const QSqlError&) {}
- inline void setQuery(const QString&) {}
- inline void setSelect(bool) {}
- inline void setForwardOnly(bool) {}
+ inline void setAt(int) Q_DECL_OVERRIDE {}
+ inline void setActive(bool) Q_DECL_OVERRIDE {}
+ inline void setLastError(const QSqlError&) Q_DECL_OVERRIDE {}
+ inline void setQuery(const QString&) Q_DECL_OVERRIDE {}
+ inline void setSelect(bool) Q_DECL_OVERRIDE {}
+ inline void setForwardOnly(bool) Q_DECL_OVERRIDE {}
- inline bool exec() { return false; }
- inline bool prepare(const QString&) { return false; }
- inline bool savePrepare(const QString&) { return false; }
- inline void bindValue(int, const QVariant&, QSql::ParamType) {}
- inline void bindValue(const QString&, const QVariant&, QSql::ParamType) {}
+ inline bool exec() Q_DECL_OVERRIDE { return false; }
+ inline bool prepare(const QString&) Q_DECL_OVERRIDE { return false; }
+ inline bool savePrepare(const QString&) Q_DECL_OVERRIDE { return false; }
+ inline void bindValue(int, const QVariant&, QSql::ParamType) Q_DECL_OVERRIDE {}
+ inline void bindValue(const QString&, const QVariant&, QSql::ParamType) Q_DECL_OVERRIDE {}
};
class QSqlNullDriver : public QSqlDriver
@@ -88,17 +88,16 @@ public:
inline QSqlNullDriver(): QSqlDriver()
{ QSqlDriver::setLastError(
QSqlError(QLatin1String("Driver not loaded"), QLatin1String("Driver not loaded"), QSqlError::ConnectionError)); }
- inline bool hasFeature(DriverFeature) const { return false; }
- inline bool open(const QString &, const QString & , const QString & ,
- const QString &, int, const QString&)
+ inline bool hasFeature(DriverFeature) const Q_DECL_OVERRIDE { return false; }
+ inline bool open(const QString &, const QString &, const QString &, const QString &, int, const QString&) Q_DECL_OVERRIDE
{ return false; }
- inline void close() {}
- inline QSqlResult *createResult() const { return new QSqlNullResult(this); }
+ inline void close() Q_DECL_OVERRIDE {}
+ inline QSqlResult *createResult() const Q_DECL_OVERRIDE { return new QSqlNullResult(this); }
protected:
- inline void setOpen(bool) {}
- inline void setOpenError(bool) {}
- inline void setLastError(const QSqlError&) {}
+ inline void setOpen(bool) Q_DECL_OVERRIDE {}
+ inline void setOpenError(bool) Q_DECL_OVERRIDE {}
+ inline void setLastError(const QSqlError&) Q_DECL_OVERRIDE {}
};
QT_END_NAMESPACE
diff --git a/src/sql/kernel/qsqlresult.cpp b/src/sql/kernel/qsqlresult.cpp
index c35fca7217..a701f9f669 100644
--- a/src/sql/kernel/qsqlresult.cpp
+++ b/src/sql/kernel/qsqlresult.cpp
@@ -87,7 +87,7 @@ QString QSqlResultPrivate::positionalToNamedBinding(const QString &query) const
result.reserve(n * 5 / 4);
QChar closingQuote;
int count = 0;
- bool ignoreBraces = (sqldriver->d_func()->dbmsType == QSqlDriver::PostgreSQL);
+ bool ignoreBraces = (sqldriver->dbmsType() == QSqlDriver::PostgreSQL);
for (int i = 0; i < n; ++i) {
QChar ch = query.at(i);
@@ -128,7 +128,7 @@ QString QSqlResultPrivate::namedToPositionalBinding(const QString &query)
QChar closingQuote;
int count = 0;
int i = 0;
- bool ignoreBraces = (sqldriver->d_func()->dbmsType == QSqlDriver::PostgreSQL);
+ bool ignoreBraces = (sqldriver->dbmsType() == QSqlDriver::PostgreSQL);
while (i < n) {
QChar ch = query.at(i);
@@ -218,22 +218,18 @@ QString QSqlResultPrivate::namedToPositionalBinding(const QString &query)
QSqlResult::QSqlResult(const QSqlDriver *db)
{
- d_ptr = new QSqlResultPrivate;
+ d_ptr = new QSqlResultPrivate(this, db);
Q_D(QSqlResult);
- d->q_ptr = this;
- d->sqldriver = const_cast<QSqlDriver *>(db);
if (d->sqldriver)
setNumericalPrecisionPolicy(d->sqldriver->numericalPrecisionPolicy());
}
/*! \internal
*/
-QSqlResult::QSqlResult(QSqlResultPrivate &dd, const QSqlDriver *db)
+QSqlResult::QSqlResult(QSqlResultPrivate &dd)
+ : d_ptr(&dd)
{
- d_ptr = &dd;
Q_D(QSqlResult);
- d->q_ptr = this;
- d->sqldriver = const_cast<QSqlDriver *>(db);
if (d->sqldriver)
setNumericalPrecisionPolicy(d->sqldriver->numericalPrecisionPolicy());
}
diff --git a/src/sql/kernel/qsqlresult.h b/src/sql/kernel/qsqlresult.h
index c86a8f858f..4a4b358a49 100644
--- a/src/sql/kernel/qsqlresult.h
+++ b/src/sql/kernel/qsqlresult.h
@@ -66,7 +66,7 @@ protected:
};
explicit QSqlResult(const QSqlDriver * db);
- QSqlResult(QSqlResultPrivate &dd, const QSqlDriver *db);
+ QSqlResult(QSqlResultPrivate &dd);
int at() const;
QString lastQuery() const;
QSqlError lastError() const;
diff --git a/src/sql/kernel/qsqlresult_p.h b/src/sql/kernel/qsqlresult_p.h
index 34b260d89b..b158618b78 100644
--- a/src/sql/kernel/qsqlresult_p.h
+++ b/src/sql/kernel/qsqlresult_p.h
@@ -46,12 +46,17 @@
//
#include <QtCore/qpointer.h>
-#include <QtSql/qsqldriver.h>
#include "qsqlerror.h"
#include "qsqlresult.h"
+#include "qsqldriver.h"
QT_BEGIN_NAMESPACE
+// convenience method Q*ResultPrivate::drv_d_func() returns pointer to private driver. Compare to Q_DECLARE_PRIVATE in qglobal.h.
+#define Q_DECLARE_SQLDRIVER_PRIVATE(Class) \
+ inline const Class##Private* drv_d_func() const { return !sqldriver ? nullptr : reinterpret_cast<const Class *>(static_cast<const QSqlDriver*>(sqldriver))->d_func(); } \
+ inline Class##Private* drv_d_func() { return !sqldriver ? nullptr : reinterpret_cast<Class *>(static_cast<QSqlDriver*>(sqldriver))->d_func(); }
+
struct QHolder {
QHolder(const QString &hldr = QString(), int index = -1): holderName(hldr), holderPos(index) { }
bool operator==(const QHolder &h) const { return h.holderPos == holderPos && h.holderName == holderName; }
@@ -62,10 +67,12 @@ struct QHolder {
class Q_SQL_EXPORT QSqlResultPrivate
{
+ Q_DECLARE_PUBLIC(QSqlResult)
public:
- QSqlResultPrivate()
- : q_ptr(0),
+ QSqlResultPrivate(QSqlResult *q, const QSqlDriver *drv)
+ : q_ptr(q),
+ sqldriver(const_cast<QSqlDriver*>(drv)),
idx(QSql::BeforeFirstRow),
active(false),
isSel(false),
diff --git a/src/testlib/qbenchmarkvalgrind.cpp b/src/testlib/qbenchmarkvalgrind.cpp
index ada3cfc768..7cb5eef30c 100644
--- a/src/testlib/qbenchmarkvalgrind.cpp
+++ b/src/testlib/qbenchmarkvalgrind.cpp
@@ -96,7 +96,7 @@ qint64 QBenchmarkValgrindUtils::extractResult(const QString &fileName)
break;
}
}
- if (!valSeen)
+ if (Q_UNLIKELY(!valSeen))
qFatal("Failed to extract result");
return val;
}
diff --git a/src/testlib/qplaintestlogger.cpp b/src/testlib/qplaintestlogger.cpp
index d820e87ccb..80b93886bb 100644
--- a/src/testlib/qplaintestlogger.cpp
+++ b/src/testlib/qplaintestlogger.cpp
@@ -348,16 +348,17 @@ void QPlainTestLogger::startLogging()
void QPlainTestLogger::stopLogging()
{
char buf[1024];
+ const int timeMs = qRound(QTestLog::msecsTotalTime());
if (QTestLog::verboseLevel() < 0) {
- qsnprintf(buf, sizeof(buf), "Totals: %d passed, %d failed, %d skipped, %d blacklisted\n",
+ qsnprintf(buf, sizeof(buf), "Totals: %d passed, %d failed, %d skipped, %d blacklisted, %dms\n",
QTestLog::passCount(), QTestLog::failCount(),
- QTestLog::skipCount(), QTestLog::blacklistCount());
+ QTestLog::skipCount(), QTestLog::blacklistCount(), timeMs);
} else {
qsnprintf(buf, sizeof(buf),
- "Totals: %d passed, %d failed, %d skipped, %d blacklisted\n"
+ "Totals: %d passed, %d failed, %d skipped, %d blacklisted, %dms\n"
"********* Finished testing of %s *********\n",
QTestLog::passCount(), QTestLog::failCount(),
- QTestLog::skipCount(), QTestLog::blacklistCount(),
+ QTestLog::skipCount(), QTestLog::blacklistCount(), timeMs,
QTestResult::currentTestObjectName());
}
outputMessage(buf);
diff --git a/src/testlib/qtestblacklist.cpp b/src/testlib/qtestblacklist.cpp
index c2643a2304..fe69e097e7 100644
--- a/src/testlib/qtestblacklist.cpp
+++ b/src/testlib/qtestblacklist.cpp
@@ -121,6 +121,13 @@ static QSet<QByteArray> keywords()
#endif
#endif
+#ifdef Q_PROCESSOR_X86
+ << "x86"
+#endif
+#ifdef Q_PROCESSOR_ARM
+ << "arm"
+#endif
+
#ifdef Q_AUTOTEST_EXPORT
<< "developer-build"
#endif
diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp
index 0847d639fd..f8e26314ec 100644
--- a/src/testlib/qtestcase.cpp
+++ b/src/testlib/qtestcase.cpp
@@ -97,6 +97,8 @@
#include <IOKit/pwr_mgt/IOPMLib.h>
#endif
+#include <vector>
+
QT_BEGIN_NAMESPACE
using QtMiscUtils::toHexUpper;
@@ -136,1261 +138,6 @@ static void stackTrace()
#endif
}
-/*!
- \namespace QTest
- \inmodule QtTest
-
- \brief The QTest namespace contains all the functions and
- declarations that are related to Qt Test.
-
- See the \l{Qt Test Overview} for information about how to write unit tests.
-*/
-
-/*!
- \namespace QTest::Internal
- \internal
-*/
-
-/*! \macro QVERIFY(condition)
-
- \relates QTest
-
- The QVERIFY() macro checks whether the \a condition is true or not. If it is
- true, execution continues. If not, a failure is recorded in the test log
- and the test won't be executed further.
-
- \b {Note:} This macro can only be used in a test function that is invoked
- by the test framework.
-
- Example:
- \snippet code/src_qtestlib_qtestcase.cpp 0
-
- \sa QCOMPARE(), QTRY_VERIFY()
-*/
-
-/*! \macro QVERIFY2(condition, message)
-
- \relates QTest
-
- The QVERIFY2() macro behaves exactly like QVERIFY(), except that it outputs
- a verbose \a message when \a condition is false. The \a message is a plain
- C string.
-
- Example:
- \snippet code/src_qtestlib_qtestcase.cpp 1
-
- \sa QVERIFY(), QCOMPARE()
-*/
-
-/*! \macro QCOMPARE(actual, expected)
-
- \relates QTest
-
- The QCOMPARE macro compares an \a actual value to an \a expected value using
- the equals operator. If \a actual and \a expected are identical, execution
- continues. If not, a failure is recorded in the test log and the test
- won't be executed further.
-
- In the case of comparing floats and doubles, qFuzzyCompare() is used for
- comparing. This means that comparing to 0 will likely fail. One solution
- to this is to compare to 1, and add 1 to the produced output.
-
- QCOMPARE tries to output the contents of the values if the comparison fails,
- so it is visible from the test log why the comparison failed.
-
- QCOMPARE is very strict on the data types. Both \a actual and \a expected
- have to be of the same type, otherwise the test won't compile. This prohibits
- unspecified behavior from being introduced; that is behavior that usually
- occurs when the compiler implicitly casts the argument.
-
- For your own classes, you can use \l QTest::toString() to format values for
- outputting into the test log.
-
- \note This macro can only be used in a test function that is invoked
- by the test framework.
-
- Example:
- \snippet code/src_qtestlib_qtestcase.cpp 2
-
- \sa QVERIFY(), QTRY_COMPARE(), QTest::toString()
-*/
-
-/*! \macro QVERIFY_EXCEPTION_THROWN(expression, exceptiontype)
- \since 5.3
-
- \relates QTest
-
- The QVERIFY_EXCEPTION_THROWN macro executes an \a expression and tries
- to catch an exception thrown from the \a expression. If the \a expression
- throws an exception and its type is the same as \a exceptiontype
- or \a exceptiontype is substitutable with the type of thrown exception
- (i.e. usually the type of thrown exception is publically derived
- from \a exceptiontype) then execution will be continued. If not-substitutable
- type of exception is thrown or the \a expression doesn't throw an exception
- at all, then a failure will be recorded in the test log and
- the test won't be executed further.
-
- \note This macro can only be used in a test function that is invoked
- by the test framework.
-*/
-
-/*! \macro QTRY_VERIFY_WITH_TIMEOUT(condition, timeout)
- \since 5.0
-
- \relates QTest
-
- The QTRY_VERIFY_WITH_TIMEOUT() macro is similar to QVERIFY(), but checks the \a condition
- repeatedly, until either the condition becomes true or the \a timeout is
- reached. Between each evaluation, events will be processed. If the timeout
- is reached, a failure is recorded in the test log and the test won't be
- executed further.
-
- \note This macro can only be used in a test function that is invoked
- by the test framework.
-
- \sa QTRY_VERIFY(), QTRY_VERIFY2_WITH_TIMEOUT(), QVERIFY(), QCOMPARE(), QTRY_COMPARE()
-*/
-
-
-/*! \macro QTRY_VERIFY(condition)
- \since 5.0
-
- \relates QTest
-
- Checks the \a condition by invoking QTRY_VERIFY_WITH_TIMEOUT() with a timeout of five seconds.
-
- \note This macro can only be used in a test function that is invoked
- by the test framework.
-
- \sa QTRY_VERIFY_WITH_TIMEOUT(), QTRY_VERIFY2(), QVERIFY(), QCOMPARE(), QTRY_COMPARE()
-*/
-
-/*! \macro QTRY_VERIFY2_WITH_TIMEOUT(condition, message, timeout)
- \since 5.6
-
- \relates QTest
-
- The QTRY_VERIFY2_WITH_TIMEOUT macro is similar to QTRY_VERIFY_WITH_TIMEOUT()
- except that it outputs a verbose \a message when \a condition is still false
- after the specified \a timeout. The \a message is a plain C string.
-
- Example:
- \code
- QTRY_VERIFY2_WITH_TIMEOUT(list.size() > 2, QByteArray::number(list.size()).constData(), 10000);
- \endcode
-
- \note This macro can only be used in a test function that is invoked
- by the test framework.
-
- \sa QTRY_VERIFY(), QTRY_VERIFY_WITH_TIMEOUT(), QVERIFY(), QCOMPARE(), QTRY_COMPARE()
-*/
-
-/*! \macro QTRY_VERIFY2(condition, message)
- \since 5.6
-
- \relates QTest
-
- Checks the \a condition by invoking QTRY_VERIFY2_WITH_TIMEOUT() with a timeout
- of five seconds. If \a condition is then still false, \a message is output.
- The \a message is a plain C string.
-
- Example:
- \code
- QTRY_VERIFY2_WITH_TIMEOUT(list.size() > 2, QByteArray::number(list.size()).constData());
- \endcode
-
- \note This macro can only be used in a test function that is invoked
- by the test framework.
-
- \sa QTRY_VERIFY2_WITH_TIMEOUT(), QTRY_VERIFY2(), QVERIFY(), QCOMPARE(), QTRY_COMPARE()
-*/
-
-/*! \macro QTRY_COMPARE_WITH_TIMEOUT(actual, expected, timeout)
- \since 5.0
-
- \relates QTest
-
- The QTRY_COMPARE_WITH_TIMEOUT() macro is similar to QCOMPARE(), but performs the comparison
- of the \a actual and \a expected values repeatedly, until either the two values
- are equal or the \a timeout is reached. Between each comparison, events
- will be processed. If the timeout is reached, a failure is recorded in the
- test log and the test won't be executed further.
-
- \note This macro can only be used in a test function that is invoked
- by the test framework.
-
- \sa QTRY_COMPARE(), QCOMPARE(), QVERIFY(), QTRY_VERIFY()
-*/
-
-/*! \macro QTRY_COMPARE(actual, expected)
- \since 5.0
-
- \relates QTest
-
- Performs a comparison of the \a actual and \a expected values by
- invoking QTRY_COMPARE_WITH_TIMEOUT() with a timeout of five seconds.
-
- \note This macro can only be used in a test function that is invoked
- by the test framework.
-
- \sa QTRY_COMPARE_WITH_TIMEOUT(), QCOMPARE(), QVERIFY(), QTRY_VERIFY()
-*/
-
-/*! \macro QFETCH(type, name)
-
- \relates QTest
-
- The fetch macro creates a local variable named \a name with the type \a type
- on the stack. \a name has to match the element name from the test's data.
- If no such element exists, the test will assert.
-
- Assuming a test has the following data:
-
- \snippet code/src_qtestlib_qtestcase.cpp 3
-
- The test data has two elements, a QString called \c aString and an integer
- called \c expected. To fetch these values in the actual test:
-
- \snippet code/src_qtestlib_qtestcase.cpp 4
-
- \c aString and \c expected are variables on the stack that are initialized with
- the current test data.
-
- \b {Note:} This macro can only be used in a test function that is invoked
- by the test framework. The test function must have a _data function.
-*/
-
-/*! \macro QWARN(message)
-
- \relates QTest
- \threadsafe
-
- Appends \a message as a warning to the test log. This macro can be used anywhere
- in your tests.
-*/
-
-/*! \macro QFAIL(message)
-
- \relates QTest
-
- This macro can be used to force a test failure. The test stops
- executing and the failure \a message is appended to the test log.
-
- \b {Note:} This macro can only be used in a test function that is invoked
- by the test framework.
-
- Example:
-
- \snippet code/src_qtestlib_qtestcase.cpp 5
-*/
-
-/*! \macro QTEST(actual, testElement)
-
- \relates QTest
-
- QTEST() is a convenience macro for \l QCOMPARE() that compares
- the value \a actual with the element \a testElement from the test's data.
- If there is no such element, the test asserts.
-
- Apart from that, QTEST() behaves exactly as \l QCOMPARE().
-
- Instead of writing:
-
- \snippet code/src_qtestlib_qtestcase.cpp 6
-
- you can write:
-
- \snippet code/src_qtestlib_qtestcase.cpp 7
-
- \sa QCOMPARE()
-*/
-
-/*! \macro QSKIP(description)
-
- \relates QTest
-
- If called from a test function, the QSKIP() macro stops execution of the test
- without adding a failure to the test log. You can use it to skip tests that
- wouldn't make sense in the current configuration. The text \a description is
- appended to the test log and should contain an explanation of why the test
- couldn't be executed.
-
- If the test is data-driven, each call to QSKIP() will skip only the current
- row of test data, so an unconditional call to QSKIP will produce one skip
- message in the test log for each row of test data.
-
- If called from an _data function, the QSKIP() macro will stop execution of
- the _data function and will prevent execution of the associated test
- function.
-
- If called from initTestCase() or initTestCase_data(), the QSKIP() macro will
- skip all test and _data functions.
-
- \b {Note:} This macro can only be used in a test function or _data
- function that is invoked by the test framework.
-
- Example:
- \snippet code/src_qtestlib_qtestcase.cpp 8
-*/
-
-/*! \macro QEXPECT_FAIL(dataIndex, comment, mode)
-
- \relates QTest
-
- The QEXPECT_FAIL() macro marks the next \l QCOMPARE() or \l QVERIFY() as an
- expected failure. Instead of adding a failure to the test log, an expected
- failure will be reported.
-
- If a \l QVERIFY() or \l QCOMPARE() is marked as an expected failure,
- but passes instead, an unexpected pass (XPASS) is written to the test log.
-
- The parameter \a dataIndex describes for which entry in the test data the
- failure is expected. Pass an empty string (\c{""}) if the failure
- is expected for all entries or if no test data exists.
-
- \a comment will be appended to the test log for the expected failure.
-
- \a mode is a \l QTest::TestFailMode and sets whether the test should
- continue to execute or not.
-
- \b {Note:} This macro can only be used in a test function that is invoked
- by the test framework.
-
- Example 1:
- \snippet code/src_qtestlib_qtestcase.cpp 9
-
- In the example above, an expected fail will be written into the test output
- if the variable \c i is not 42. If the variable \c i is 42, an unexpected pass
- is written instead. The QEXPECT_FAIL() has no influence on the second QCOMPARE()
- statement in the example.
-
- Example 2:
- \snippet code/src_qtestlib_qtestcase.cpp 10
-
- The above testfunction will not continue executing for the test data
- entry \c{data27}.
-
- \sa QTest::TestFailMode, QVERIFY(), QCOMPARE()
-*/
-
-/*! \macro QFINDTESTDATA(filename)
- \since 5.0
-
- \relates QTest
-
- Returns a QString for the testdata file referred to by \a filename, or an
- empty QString if the testdata file could not be found.
-
- This macro allows the test to load data from an external file without
- hardcoding an absolute filename into the test, or using relative paths
- which may be error prone.
-
- The returned path will be the first path from the following list which
- resolves to an existing file or directory:
-
- \list
- \li \a filename relative to QCoreApplication::applicationDirPath()
- (only if a QCoreApplication or QApplication object has been created).
- \li \a filename relative to the test's standard install directory
- (QLibraryInfo::TestsPath with the lowercased testcase name appended).
- \li \a filename relative to the directory containing the source file from which
- QFINDTESTDATA is invoked.
- \endlist
-
- If the named file/directory does not exist at any of these locations,
- a warning is printed to the test log.
-
- For example, in this code:
- \snippet code/src_qtestlib_qtestcase.cpp 26
-
- The testdata file will be resolved as the first existing file from:
-
- \list
- \li \c{/home/user/build/myxmlparser/tests/tst_myxmlparser/testxml/simple1.xml}
- \li \c{/usr/local/Qt-5.0.0/tests/tst_myxmlparser/testxml/simple1.xml}
- \li \c{/home/user/sources/myxmlparser/tests/tst_myxmlparser/testxml/simple1.xml}
- \endlist
-
- This allows the test to find its testdata regardless of whether the
- test has been installed, and regardless of whether the test's build tree
- is equal to the test's source tree.
-
- \b {Note:} reliable detection of testdata from the source directory requires
- either that qmake is used, or the \c{QT_TESTCASE_BUILDDIR} macro is defined to
- point to the working directory from which the compiler is invoked, or only
- absolute paths to the source files are passed to the compiler. Otherwise, the
- absolute path of the source directory cannot be determined.
-
- \b {Note:} For tests that use the \l QTEST_APPLESS_MAIN() macro to generate a
- \c{main()} function, \c{QFINDTESTDATA} will not attempt to find test data
- relative to QCoreApplication::applicationDirPath(). In practice, this means that
- tests using \c{QTEST_APPLESS_MAIN()} will fail to find their test data
- if run from a shadow build tree.
-*/
-
-/*! \macro QTEST_MAIN(TestClass)
-
- \relates QTest
-
- Implements a main() function that instantiates an application object and
- the \a TestClass, and executes all tests in the order they were defined.
- Use this macro to build stand-alone executables.
-
- If \c QT_WIDGETS_LIB is defined, the application object will be a QApplication,
- if \c QT_GUI_LIB is defined, the application object will be a QGuiApplication,
- otherwise it will be a QCoreApplication. If qmake is used and the configuration
- includes \c{QT += widgets}, then \c QT_WIDGETS_LIB will be defined automatically.
- Similarly, if qmake is used and the configuration includes \c{QT += gui}, then
- \c QT_GUI_LIB will be defined automatically.
-
- \b {Note:} On platforms that have keypad navigation enabled by default,
- this macro will forcefully disable it if \c QT_WIDGETS_LIB is defined. This is done
- to simplify the usage of key events when writing autotests. If you wish to write a
- test case that uses keypad navigation, you should enable it either in the
- \c {initTestCase()} or \c {init()} functions of your test case by calling
- \l {QApplication::setNavigationMode()}.
-
- Example:
- \snippet code/src_qtestlib_qtestcase.cpp 11
-
- \sa QTEST_APPLESS_MAIN(), QTEST_GUILESS_MAIN(), QTest::qExec(),
- QApplication::setNavigationMode()
-*/
-
-/*! \macro QTEST_APPLESS_MAIN(TestClass)
-
- \relates QTest
-
- Implements a main() function that executes all tests in \a TestClass.
-
- Behaves like \l QTEST_MAIN(), but doesn't instantiate a QApplication
- object. Use this macro for really simple stand-alone non-GUI tests.
-
- \sa QTEST_MAIN()
-*/
-
-/*! \macro QTEST_GUILESS_MAIN(TestClass)
- \since 5.0
-
- \relates QTest
-
- Implements a main() function that instantiates a QCoreApplication object
- and the \a TestClass, and executes all tests in the order they were
- defined. Use this macro to build stand-alone executables.
-
- Behaves like \l QTEST_MAIN(), but instantiates a QCoreApplication instead
- of the QApplication object. Use this macro if your test case doesn't need
- functionality offered by QApplication, but the event loop is still necessary.
-
- \sa QTEST_MAIN()
-*/
-
-/*!
- \macro QBENCHMARK
-
- \relates QTest
-
- This macro is used to measure the performance of code within a test.
- The code to be benchmarked is contained within a code block following
- this macro.
-
- For example:
-
- \snippet code/src_qtestlib_qtestcase.cpp 27
-
- \sa {Qt Test Overview#Creating a Benchmark}{Creating a Benchmark},
- {Chapter 5: Writing a Benchmark}{Writing a Benchmark}
-*/
-
-/*!
- \macro QBENCHMARK_ONCE
- \since 4.6
-
- \relates QTest
-
- \brief The QBENCHMARK_ONCE macro is for measuring performance of a
- code block by running it once.
-
- This macro is used to measure the performance of code within a test.
- The code to be benchmarked is contained within a code block following
- this macro.
-
- Unlike QBENCHMARK, the contents of the contained code block is only run
- once. The elapsed time will be reported as "0" if it's to short to
- be measured by the selected backend. (Use)
-
- \sa {Qt Test Overview#Creating a Benchmark}{Creating a Benchmark},
- {Chapter 5: Writing a Benchmark}{Writing a Benchmark}
-*/
-
-/*! \enum QTest::TestFailMode
-
- This enum describes the modes for handling an expected failure of the
- \l QVERIFY() or \l QCOMPARE() macros.
-
- \value Abort Aborts the execution of the test. Use this mode when it
- doesn't make sense to execute the test any further after the
- expected failure.
-
- \value Continue Continues execution of the test after the expected failure.
-
- \sa QEXPECT_FAIL()
-*/
-
-/*! \enum QTest::KeyAction
-
- This enum describes possible actions for key handling.
-
- \value Press The key is pressed.
- \value Release The key is released.
- \value Click The key is clicked (pressed and released).
-*/
-
-/*! \enum QTest::MouseAction
-
- This enum describes possible actions for mouse handling.
-
- \value MousePress A mouse button is pressed.
- \value MouseRelease A mouse button is released.
- \value MouseClick A mouse button is clicked (pressed and released).
- \value MouseDClick A mouse button is double clicked (pressed and released twice).
- \value MouseMove The mouse pointer has moved.
-*/
-
-/*! \fn void QTest::keyClick(QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
-
- Simulates clicking of \a key with an optional \a modifier on a \a widget.
- If \a delay is larger than 0, the test will wait for \a delay milliseconds
- before clicking the key.
-
- Examples:
- \snippet code/src_qtestlib_qtestcase.cpp 14
-
- The first example above simulates clicking the \c escape key on \c
- myWidget without any keyboard modifiers and without delay. The
- second example simulates clicking \c shift-escape on \c myWidget
- following a 200 ms delay of the test.
-
- \sa QTest::keyClicks()
-*/
-
-/*! \fn void QTest::keyClick(QWidget *widget, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
- \overload
-
- Simulates clicking of \a key with an optional \a modifier on a \a widget.
- If \a delay is larger than 0, the test will wait for \a delay milliseconds
- before clicking the key.
-
- Example:
- \snippet code/src_qtestlib_qtestcase.cpp 13
-
- The example above simulates clicking \c a on \c myWidget without
- any keyboard modifiers and without delay of the test.
-
- \sa QTest::keyClicks()
-*/
-
-/*! \fn void QTest::keyClick(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
- \overload
- \since 5.0
-
- Simulates clicking of \a key with an optional \a modifier on a \a window.
- If \a delay is larger than 0, the test will wait for \a delay milliseconds
- before clicking the key.
-
- Examples:
- \snippet code/src_qtestlib_qtestcase.cpp 29
-
- The first example above simulates clicking the \c escape key on \c
- myWindow without any keyboard modifiers and without delay. The
- second example simulates clicking \c shift-escape on \c myWindow
- following a 200 ms delay of the test.
-
- \sa QTest::keyClicks()
-*/
-
-/*! \fn void QTest::keyClick(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
- \overload
- \since 5.0
-
- Simulates clicking of \a key with an optional \a modifier on a \a window.
- If \a delay is larger than 0, the test will wait for \a delay milliseconds
- before clicking the key.
-
- Example:
- \snippet code/src_qtestlib_qtestcase.cpp 28
-
- The example above simulates clicking \c a on \c myWindow without
- any keyboard modifiers and without delay of the test.
-
- \sa QTest::keyClicks()
-*/
-
-/*! \fn void QTest::keyEvent(KeyAction action, QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
-
- Sends a Qt key event to \a widget with the given \a key and an associated \a action.
- Optionally, a keyboard \a modifier can be specified, as well as a \a delay
- (in milliseconds) of the test before sending the event.
-*/
-
-/*! \fn void QTest::keyEvent(KeyAction action, QWidget *widget, char ascii, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
- \overload
-
- Sends a Qt key event to \a widget with the given key \a ascii and an associated \a action.
- Optionally, a keyboard \a modifier can be specified, as well as a \a delay
- (in milliseconds) of the test before sending the event.
-*/
-
-/*! \fn void QTest::keyEvent(KeyAction action, QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
- \overload
- \since 5.0
-
- Sends a Qt key event to \a window with the given \a key and an associated \a action.
- Optionally, a keyboard \a modifier can be specified, as well as a \a delay
- (in milliseconds) of the test before sending the event.
-*/
-
-/*! \fn void QTest::keyEvent(KeyAction action, QWindow *window, char ascii, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
- \overload
- \since 5.0
-
- Sends a Qt key event to \a window with the given key \a ascii and an associated \a action.
- Optionally, a keyboard \a modifier can be specified, as well as a \a delay
- (in milliseconds) of the test before sending the event.
-*/
-
-/*! \fn void QTest::keyPress(QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
-
- Simulates pressing a \a key with an optional \a modifier on a \a widget. If \a delay
- is larger than 0, the test will wait for \a delay milliseconds before pressing the key.
-
- \b {Note:} At some point you should release the key using \l keyRelease().
-
- \sa QTest::keyRelease(), QTest::keyClick()
-*/
-
-/*! \fn void QTest::keyPress(QWidget *widget, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
- \overload
-
- Simulates pressing a \a key with an optional \a modifier on a \a widget.
- If \a delay is larger than 0, the test will wait for \a delay milliseconds
- before pressing the key.
-
- \b {Note:} At some point you should release the key using \l keyRelease().
-
- \sa QTest::keyRelease(), QTest::keyClick()
-*/
-
-/*! \fn void QTest::keyPress(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
- \overload
- \since 5.0
-
- Simulates pressing a \a key with an optional \a modifier on a \a window. If \a delay
- is larger than 0, the test will wait for \a delay milliseconds before pressing the key.
-
- \b {Note:} At some point you should release the key using \l keyRelease().
-
- \sa QTest::keyRelease(), QTest::keyClick()
-*/
-
-/*! \fn void QTest::keyPress(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
- \overload
- \since 5.0
-
- Simulates pressing a \a key with an optional \a modifier on a \a window.
- If \a delay is larger than 0, the test will wait for \a delay milliseconds
- before pressing the key.
-
- \b {Note:} At some point you should release the key using \l keyRelease().
-
- \sa QTest::keyRelease(), QTest::keyClick()
-*/
-
-/*! \fn void QTest::keyRelease(QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
-
- Simulates releasing a \a key with an optional \a modifier on a \a widget.
- If \a delay is larger than 0, the test will wait for \a delay milliseconds
- before releasing the key.
-
- \sa QTest::keyPress(), QTest::keyClick()
-*/
-
-/*! \fn void QTest::keyRelease(QWidget *widget, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
- \overload
-
- Simulates releasing a \a key with an optional \a modifier on a \a widget.
- If \a delay is larger than 0, the test will wait for \a delay milliseconds
- before releasing the key.
-
- \sa QTest::keyClick()
-*/
-
-/*! \fn void QTest::keyRelease(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
- \overload
- \since 5.0
-
- Simulates releasing a \a key with an optional \a modifier on a \a window.
- If \a delay is larger than 0, the test will wait for \a delay milliseconds
- before releasing the key.
-
- \sa QTest::keyPress(), QTest::keyClick()
-*/
-
-/*! \fn void QTest::keyRelease(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
- \overload
- \since 5.0
-
- Simulates releasing a \a key with an optional \a modifier on a \a window.
- If \a delay is larger than 0, the test will wait for \a delay milliseconds
- before releasing the key.
-
- \sa QTest::keyClick()
-*/
-
-/*! \fn void QTest::keyClicks(QWidget *widget, const QString &sequence, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
-
- Simulates clicking a \a sequence of keys on a \a
- widget. Optionally, a keyboard \a modifier can be specified as
- well as a \a delay (in milliseconds) of the test before each key
- click.
-
- Example:
- \snippet code/src_qtestlib_qtestcase.cpp 15
-
- The example above simulates clicking the sequence of keys
- representing "hello world" on \c myWidget without any keyboard
- modifiers and without delay of the test.
-
- \sa QTest::keyClick()
-*/
-
-/*! \fn void QTest::waitForEvents()
- \internal
-*/
-
-/*! \fn void QTest::mouseEvent(MouseAction action, QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers stateKey, QPoint pos, int delay=-1)
- \internal
-*/
-
-/*! \fn void QTest::mouseEvent(MouseAction action, QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey, QPoint pos, int delay=-1)
- \internal
-*/
-
-/*! \fn void QTest::mousePress(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = 0, QPoint pos = QPoint(), int delay=-1)
-
- Simulates pressing a mouse \a button with an optional \a modifier
- on a \a widget. The position is defined by \a pos; the default
- position is the center of the widget. If \a delay is specified,
- the test will wait for the specified amount of milliseconds before
- the press.
-
- \sa QTest::mouseRelease(), QTest::mouseClick()
-*/
-
-/*! \fn void QTest::mousePress(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = 0, QPoint pos = QPoint(), int delay=-1)
- \overload
- \since 5.0
-
- Simulates pressing a mouse \a button with an optional \a stateKey modifier
- on a \a window. The position is defined by \a pos; the default
- position is the center of the window. If \a delay is specified,
- the test will wait for the specified amount of milliseconds before
- the press.
-
- \sa QTest::mouseRelease(), QTest::mouseClick()
-*/
-
-/*! \fn void QTest::mouseRelease(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = 0, QPoint pos = QPoint(), int delay=-1)
-
- Simulates releasing a mouse \a button with an optional \a modifier
- on a \a widget. The position of the release is defined by \a pos;
- the default position is the center of the widget. If \a delay is
- specified, the test will wait for the specified amount of
- milliseconds before releasing the button.
-
- \sa QTest::mousePress(), QTest::mouseClick()
-*/
-
-/*! \fn void QTest::mouseRelease(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = 0, QPoint pos = QPoint(), int delay=-1)
- \overload
- \since 5.0
-
- Simulates releasing a mouse \a button with an optional \a stateKey modifier
- on a \a window. The position of the release is defined by \a pos;
- the default position is the center of the window. If \a delay is
- specified, the test will wait for the specified amount of
- milliseconds before releasing the button.
-
- \sa QTest::mousePress(), QTest::mouseClick()
-*/
-
-/*! \fn void QTest::mouseClick(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = 0, QPoint pos = QPoint(), int delay=-1)
-
- Simulates clicking a mouse \a button with an optional \a modifier
- on a \a widget. The position of the click is defined by \a pos;
- the default position is the center of the widget. If \a delay is
- specified, the test will wait for the specified amount of
- milliseconds before pressing and before releasing the button.
-
- \sa QTest::mousePress(), QTest::mouseRelease()
-*/
-
-/*! \fn void QTest::mouseClick(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = 0, QPoint pos = QPoint(), int delay=-1)
- \overload
- \since 5.0
-
- Simulates clicking a mouse \a button with an optional \a stateKey modifier
- on a \a window. The position of the click is defined by \a pos;
- the default position is the center of the window. If \a delay is
- specified, the test will wait for the specified amount of
- milliseconds before pressing and before releasing the button.
-
- \sa QTest::mousePress(), QTest::mouseRelease()
-*/
-
-/*! \fn void QTest::mouseDClick(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = 0, QPoint pos = QPoint(), int delay=-1)
-
- Simulates double clicking a mouse \a button with an optional \a
- modifier on a \a widget. The position of the click is defined by
- \a pos; the default position is the center of the widget. If \a
- delay is specified, the test will wait for the specified amount of
- milliseconds before each press and release.
-
- \sa QTest::mouseClick()
-*/
-
-/*! \fn void QTest::mouseDClick(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = 0, QPoint pos = QPoint(), int delay=-1)
- \overload
- \since 5.0
-
- Simulates double clicking a mouse \a button with an optional \a stateKey
- modifier on a \a window. The position of the click is defined by
- \a pos; the default position is the center of the window. If \a
- delay is specified, the test will wait for the specified amount of
- milliseconds before each press and release.
-
- \sa QTest::mouseClick()
-*/
-
-/*! \fn void QTest::mouseMove(QWidget *widget, QPoint pos = QPoint(), int delay=-1)
-
- Moves the mouse pointer to a \a widget. If \a pos is not
- specified, the mouse pointer moves to the center of the widget. If
- a \a delay (in milliseconds) is given, the test will wait before
- moving the mouse pointer.
-*/
-
-/*! \fn void QTest::mouseMove(QWindow *window, QPoint pos = QPoint(), int delay=-1)
- \overload
- \since 5.0
-
- Moves the mouse pointer to a \a window. If \a pos is not
- specified, the mouse pointer moves to the center of the window. If
- a \a delay (in milliseconds) is given, the test will wait before
- moving the mouse pointer.
-*/
-
-/*!
- \fn char *QTest::toString(const T &value)
-
- Returns a textual representation of \a value. This function is used by
- \l QCOMPARE() to output verbose information in case of a test failure.
-
- You can add specializations or overloads of this function to your test to enable
- verbose output.
-
- \b {Note:} Starting with Qt 5.5, you should prefer to provide a toString() function
- in the type's namespace instead of specializing this template.
- If your code needs to continue to work with the QTestLib from Qt 5.4 or
- earlier, you need to continue to use specialization.
-
- \b {Note:} The caller of toString() must delete the returned data
- using \c{delete[]}. Your implementation should return a string
- created with \c{new[]} or qstrdup(). The easiest way to do so is to
- create a QByteArray or QString and calling QTest::toString() on it
- (see second example below).
-
- Example for specializing (Qt ≤ 5.4):
-
- \snippet code/src_qtestlib_qtestcase.cpp 16
-
- The example above defines a toString() specialization for a class
- called \c MyPoint. Whenever a comparison of two instances of \c
- MyPoint fails, \l QCOMPARE() will call this function to output the
- contents of \c MyPoint to the test log.
-
- Same example, but with overloading (Qt ≥ 5.5):
-
- \snippet code/src_qtestlib_qtestcase.cpp toString-overload
-
- \sa QCOMPARE()
-*/
-
-/*!
- \fn char *QTest::toString(const QLatin1String &string)
- \overload
-
- Returns a textual representation of the given \a string.
-*/
-
-/*!
- \fn char *QTest::toString(const QString &string)
- \overload
-
- Returns a textual representation of the given \a string.
-*/
-
-/*!
- \fn char *QTest::toString(const QByteArray &ba)
- \overload
-
- Returns a textual representation of the byte array \a ba.
-
- \sa QTest::toHexRepresentation()
-*/
-
-/*!
- \fn char *QTest::toString(const QTime &time)
- \overload
-
- Returns a textual representation of the given \a time.
-*/
-
-/*!
- \fn char *QTest::toString(const QDate &date)
- \overload
-
- Returns a textual representation of the given \a date.
-*/
-
-/*!
- \fn char *QTest::toString(const QDateTime &dateTime)
- \overload
-
- Returns a textual representation of the date and time specified by
- \a dateTime.
-*/
-
-/*!
- \fn char *QTest::toString(const QChar &character)
- \overload
-
- Returns a textual representation of the given \a character.
-*/
-
-/*!
- \fn char *QTest::toString(const QPoint &point)
- \overload
-
- Returns a textual representation of the given \a point.
-*/
-
-/*!
- \fn char *QTest::toString(const QSize &size)
- \overload
-
- Returns a textual representation of the given \a size.
-*/
-
-/*!
- \fn char *QTest::toString(const QRect &rectangle)
- \overload
-
- Returns a textual representation of the given \a rectangle.
-*/
-
-/*!
- \fn char *QTest::toString(const QUrl &url)
- \since 4.4
- \overload
-
- Returns a textual representation of the given \a url.
-*/
-
-/*!
- \fn char *QTest::toString(const QPointF &point)
- \overload
-
- Returns a textual representation of the given \a point.
-*/
-
-/*!
- \fn char *QTest::toString(const QSizeF &size)
- \overload
-
- Returns a textual representation of the given \a size.
-*/
-
-/*!
- \fn char *QTest::toString(const QRectF &rectangle)
- \overload
-
- Returns a textual representation of the given \a rectangle.
-*/
-
-/*!
- \fn char *QTest::toString(const QVariant &variant)
- \overload
-
- Returns a textual representation of the given \a variant.
-*/
-
-/*!
- \fn char *QTest::toString(QSizePolicy::ControlType ct)
- \overload
- \since 5.5
-
- Returns a textual representation of control type \a ct.
-*/
-
-/*!
- \fn char *QTest::toString(QSizePolicy::ControlTypes cts)
- \overload
- \since 5.5
-
- Returns a textual representation of control types \a cts.
-*/
-
-/*!
- \fn char *QTest::toString(QSizePolicy::Policy p)
- \overload
- \since 5.5
-
- Returns a textual representation of policy \a p.
-*/
-
-/*!
- \fn char *QTest::toString(QSizePolicy sp)
- \overload
- \since 5.5
-
- Returns a textual representation of size policy \a sp.
-*/
-
-/*! \fn void QTest::qWait(int ms)
-
- Waits for \a ms milliseconds. While waiting, events will be processed and
- your test will stay responsive to user interface events or network communication.
-
- Example:
- \snippet code/src_qtestlib_qtestcase.cpp 17
-
- The code above will wait until the network server is responding for a
- maximum of about 12.5 seconds.
-
- \sa QTest::qSleep(), QSignalSpy::wait()
-*/
-
-/*! \fn bool QTest::qWaitForWindowExposed(QWindow *window, int timeout)
- \since 5.0
-
- Waits for \a timeout milliseconds or until the \a window is exposed.
- Returns \c true if \c window is exposed within \a timeout milliseconds, otherwise returns \c false.
-
- This is mainly useful for asynchronous systems like X11, where a window will be mapped to screen some
- time after being asked to show itself on the screen.
-
- \sa QTest::qWaitForWindowActive(), QWindow::isExposed()
-*/
-
-/*! \fn bool QTest::qWaitForWindowActive(QWindow *window, int timeout)
- \since 5.0
-
- Waits for \a timeout milliseconds or until the \a window is active.
-
- Returns \c true if \c window is active within \a timeout milliseconds, otherwise returns \c false.
-
- \sa QTest::qWaitForWindowExposed(), QWindow::isActive()
-*/
-
-/*! \fn bool QTest::qWaitForWindowExposed(QWidget *widget, int timeout)
- \since 5.0
-
- Waits for \a timeout milliseconds or until the \a widget's window is exposed.
- Returns \c true if \c widget's window is exposed within \a timeout milliseconds, otherwise returns \c false.
-
- This is mainly useful for asynchronous systems like X11, where a window will be mapped to screen some
- time after being asked to show itself on the screen.
-
- \sa QTest::qWaitForWindowActive()
-*/
-
-/*! \fn bool QTest::qWaitForWindowActive(QWidget *widget, int timeout)
- \since 5.0
-
- Waits for \a timeout milliseconds or until the \a widget's window is active.
-
- Returns \c true if \c widget's window is active within \a timeout milliseconds, otherwise returns \c false.
-
- \sa QTest::qWaitForWindowExposed(), QWidget::isActiveWindow()
-*/
-
-/*! \fn bool QTest::qWaitForWindowShown(QWidget *widget, int timeout)
- \since 5.0
- \deprecated
-
- Waits for \a timeout milliseconds or until the \a widget's window is exposed.
- Returns \c true if \c widget's window is exposed within \a timeout milliseconds, otherwise returns \c false.
-
- This function does the same as qWaitForWindowExposed().
-
- Example:
- \snippet code/src_qtestlib_qtestcase.cpp 24
-
- \sa QTest::qWaitForWindowActive(), QTest::qWaitForWindowExposed()
-*/
-
-/*!
- \class QTest::QTouchEventSequence
- \inmodule QtTest
- \since 4.6
-
- \brief The QTouchEventSequence class is used to simulate a sequence of touch events.
-
- To simulate a sequence of touch events on a specific device for a window or widget, call
- QTest::touchEvent to create a QTouchEventSequence instance. Add touch events to
- the sequence by calling press(), move(), release() and stationary(), and let the
- instance run out of scope to commit the sequence to the event system.
-
- Example:
- \snippet code/src_qtestlib_qtestcase.cpp 25
-*/
-
-/*!
- \fn QTest::QTouchEventSequence::~QTouchEventSequence()
-
- Commits this sequence of touch events, unless autoCommit was disabled, and frees allocated resources.
-*/
-
-/*!
- \fn void QTest::QTouchEventSequence::commit(bool processEvents)
-
- Commits this sequence of touch events to the event system. Normally there is no need to call this
- function because it is called from the destructor. However, if autoCommit is disabled, the events
- only get committed upon explicitly calling this function.
-
- In special cases tests may want to disable the processing of the events. This can be achieved by
- setting \a processEvents to false. This results in merely queuing the events, the event loop will
- not be forced to process them.
-*/
-
-/*!
- \fn QTouchEventSequence &QTest::QTouchEventSequence::press(int touchId, const QPoint &pt, QWindow *window)
- \since 5.0
-
- Adds a press event for touchpoint \a touchId at position \a pt to this sequence and returns
- a reference to this QTouchEventSequence.
-
- The position \a pt is interpreted as relative to \a window. If \a window is the null pointer, then
- \a pt is interpreted as relative to the window provided when instantiating this QTouchEventSequence.
-
- Simulates that the user pressed the touch screen or pad with the finger identified by \a touchId.
-*/
-
-/*!
- \fn QTouchEventSequence &QTest::QTouchEventSequence::press(int touchId, const QPoint &pt, QWidget *widget)
-
- Adds a press event for touchpoint \a touchId at position \a pt to this sequence and returns
- a reference to this QTouchEventSequence.
-
- The position \a pt is interpreted as relative to \a widget. If \a widget is the null pointer, then
- \a pt is interpreted as relative to the widget provided when instantiating this QTouchEventSequence.
-
- Simulates that the user pressed the touch screen or pad with the finger identified by \a touchId.
-*/
-
-/*!
- \fn QTouchEventSequence &QTest::QTouchEventSequence::move(int touchId, const QPoint &pt, QWindow *window)
- \since 5.0
-
- Adds a move event for touchpoint \a touchId at position \a pt to this sequence and returns
- a reference to this QTouchEventSequence.
-
- The position \a pt is interpreted as relative to \a window. If \a window is the null pointer, then
- \a pt is interpreted as relative to the window provided when instantiating this QTouchEventSequence.
-
- Simulates that the user moved the finger identified by \a touchId.
-*/
-
-/*!
- \fn QTouchEventSequence &QTest::QTouchEventSequence::move(int touchId, const QPoint &pt, QWidget *widget)
-
- Adds a move event for touchpoint \a touchId at position \a pt to this sequence and returns
- a reference to this QTouchEventSequence.
-
- The position \a pt is interpreted as relative to \a widget. If \a widget is the null pointer, then
- \a pt is interpreted as relative to the widget provided when instantiating this QTouchEventSequence.
-
- Simulates that the user moved the finger identified by \a touchId.
-*/
-
-/*!
- \fn QTouchEventSequence &QTest::QTouchEventSequence::release(int touchId, const QPoint &pt, QWindow *window)
- \since 5.0
-
- Adds a release event for touchpoint \a touchId at position \a pt to this sequence and returns
- a reference to this QTouchEventSequence.
-
- The position \a pt is interpreted as relative to \a window. If \a window is the null pointer, then
- \a pt is interpreted as relative to the window provided when instantiating this QTouchEventSequence.
-
- Simulates that the user lifted the finger identified by \a touchId.
-*/
-
-/*!
- \fn QTouchEventSequence &QTest::QTouchEventSequence::release(int touchId, const QPoint &pt, QWidget *widget)
-
- Adds a release event for touchpoint \a touchId at position \a pt to this sequence and returns
- a reference to this QTouchEventSequence.
-
- The position \a pt is interpreted as relative to \a widget. If \a widget is the null pointer, then
- \a pt is interpreted as relative to the widget provided when instantiating this QTouchEventSequence.
-
- Simulates that the user lifted the finger identified by \a touchId.
-*/
-
-/*!
- \fn QTouchEventSequence &QTest::QTouchEventSequence::stationary(int touchId)
-
- Adds a stationary event for touchpoint \a touchId to this sequence and returns
- a reference to this QTouchEventSequence.
-
- Simulates that the user did not move the finger identified by \a touchId.
-*/
-
-/*!
- \fn QTouchEventSequence QTest::touchEvent(QWindow *window, QTouchDevice *device, bool autoCommit)
- \since 5.0
-
- Creates and returns a QTouchEventSequence for the \a device to
- simulate events for \a window.
-
- When adding touch events to the sequence, \a window will also be used to translate
- the position provided to screen coordinates, unless another window is provided in the
- respective calls to press(), move() etc.
-
- The touch events are committed to the event system when the destructor of the
- QTouchEventSequence is called (ie when the object returned runs out of scope), unless
- \a autoCommit is set to false. When \a autoCommit is false, commit() has to be called
- manually.
-*/
-
-/*!
- \fn QTouchEventSequence QTest::touchEvent(QWidget *widget, QTouchDevice *device, bool autoCommit)
-
- Creates and returns a QTouchEventSequence for the \a device to
- simulate events for \a widget.
-
- When adding touch events to the sequence, \a widget will also be used to translate
- the position provided to screen coordinates, unless another widget is provided in the
- respective calls to press(), move() etc.
-
- The touch events are committed to the event system when the destructor of the
- QTouchEventSequence is called (ie when the object returned runs out of scope), unless
- \a autoCommit is set to false. When \a autoCommit is false, commit() has to be called
- manually.
-*/
-
static bool installCoverageTool(const char * appname, const char * testname)
{
#ifdef __COVERAGESCANNER__
@@ -1412,43 +159,74 @@ static bool installCoverageTool(const char * appname, const char * testname)
#endif
}
+static bool isValidSlot(const QMetaMethod &sl)
+{
+ if (sl.access() != QMetaMethod::Private || sl.parameterCount() != 0
+ || sl.returnType() != QMetaType::Void || sl.methodType() != QMetaMethod::Slot)
+ return false;
+ const QByteArray name = sl.name();
+ return !(name.isEmpty() || name.endsWith("_data")
+ || name == "initTestCase" || name == "cleanupTestCase"
+ || name == "init" || name == "cleanup");
+}
+
namespace QTest
{
+ class WatchDog;
+
static QObject *currentTestObject = 0;
static QString mainSourcePath;
- class TestFunction {
+ class TestMethods {
+ Q_DISABLE_COPY(TestMethods)
public:
- TestFunction() : function_(-1), data_(0) {}
- void set(int function, char *data) { function_ = function; data_ = data; }
- char *data() const { return data_; }
- int function() const { return function_; }
- ~TestFunction() { delete[] data_; }
+ typedef std::vector<QMetaMethod> MetaMethods;
+
+ explicit TestMethods(const QObject *o, const MetaMethods &m = MetaMethods());
+
+ void invokeTests(QObject *testObject) const;
+
+ static QMetaMethod findMethod(const QObject *obj, const char *signature);
+
private:
- int function_;
- char *data_;
+ bool invokeTest(int index, const char *data, WatchDog *watchDog) const;
+ void invokeTestOnData(int index) const;
+
+ QMetaMethod m_initTestCaseMethod; // might not exist, check isValid().
+ QMetaMethod m_initTestCaseDataMethod;
+ QMetaMethod m_cleanupTestCaseMethod;
+ QMetaMethod m_initMethod;
+ QMetaMethod m_cleanupMethod;
+
+ MetaMethods m_methods;
};
- /**
- * Contains the list of test functions that was supplied
- * on the command line, if any. Hence, if not empty,
- * those functions should be run instead of
- * all appearing in the test case.
- */
- static TestFunction * testFuncs = 0;
- static int testFuncCount = 0;
-
- /** Don't leak testFuncs on exit even on error */
- static struct TestFuncCleanup
+
+ TestMethods::TestMethods(const QObject *o, const MetaMethods &m)
+ : m_initTestCaseMethod(TestMethods::findMethod(o, "initTestCase()"))
+ , m_initTestCaseDataMethod(TestMethods::findMethod(o, "initTestCase_data()"))
+ , m_cleanupTestCaseMethod(TestMethods::findMethod(o, "cleanupTestCase()"))
+ , m_initMethod(TestMethods::findMethod(o, "init()"))
+ , m_cleanupMethod(TestMethods::findMethod(o, "cleanup()"))
+ , m_methods(m)
{
- void cleanup()
- {
- delete[] testFuncs;
- testFuncCount = 0;
- testFuncs = 0;
+ if (m.empty()) {
+ const QMetaObject *metaObject = o->metaObject();
+ const int count = metaObject->methodCount();
+ m_methods.reserve(count);
+ for (int i = 0; i < count; ++i) {
+ const QMetaMethod me = metaObject->method(i);
+ if (isValidSlot(me))
+ m_methods.push_back(me);
+ }
}
+ }
- ~TestFuncCleanup() { cleanup(); }
- } testFuncCleaner;
+ QMetaMethod TestMethods::findMethod(const QObject *obj, const char *signature)
+ {
+ const QMetaObject *metaObject = obj->metaObject();
+ const int funcIndex = metaObject->indexOfMethod(signature);
+ return funcIndex >= 0 ? metaObject->method(funcIndex) : QMetaMethod();
+ }
static int keyDelay = -1;
static int mouseDelay = -1;
@@ -1504,22 +282,6 @@ int Q_TESTLIB_EXPORT defaultKeyDelay()
return keyDelay;
}
-static bool isValidSlot(const QMetaMethod &sl)
-{
- if (sl.access() != QMetaMethod::Private || sl.parameterCount() != 0
- || sl.returnType() != QMetaType::Void || sl.methodType() != QMetaMethod::Slot)
- return false;
- QByteArray name = sl.name();
- if (name.isEmpty())
- return false;
- if (name.endsWith("_data"))
- return false;
- if (name == "initTestCase" || name == "cleanupTestCase"
- || name == "cleanup" || name == "init")
- return false;
- return true;
-}
-
Q_TESTLIB_EXPORT bool printAvailableFunctions = false;
Q_TESTLIB_EXPORT QStringList testFunctions;
Q_TESTLIB_EXPORT QStringList testTags;
@@ -1617,6 +379,9 @@ Q_TESTLIB_EXPORT void qtest_qParseArgs(int argc, char *argv[], bool qml)
QTestLog::LogMode logFormat = QTestLog::Plain;
const char *logFilename = 0;
+ QTest::testFunctions.clear();
+ QTest::testTags.clear();
+
#if defined(Q_OS_MAC) && defined(HAVE_XCTEST)
if (QXcodeTestLogger::canLogTestProgress())
logFormat = QTestLog::XCTest;
@@ -1897,7 +662,7 @@ Q_TESTLIB_EXPORT void qtest_qParseArgs(int argc, char *argv[], bool qml)
fprintf(stderr, "\n"
" -help : This help\n");
exit(1);
- } else if (qml) {
+ } else {
// We can't check the availability of test functions until
// we load the QML files. So just store the data for now.
int colon = -1;
@@ -1923,36 +688,6 @@ Q_TESTLIB_EXPORT void qtest_qParseArgs(int argc, char *argv[], bool qml)
QTest::testTags +=
QString::fromLatin1(argv[i] + colon + 1);
}
- } else {
- if (!QTest::testFuncs) {
- QTest::testFuncs = new QTest::TestFunction[512];
- }
-
- int colon = -1;
- char buf[512], *data=0;
- int off;
- for (off = 0; *(argv[i]+off); ++off) {
- if (*(argv[i]+off) == ':') {
- colon = off;
- break;
- }
- }
- if (colon != -1) {
- data = qstrdup(argv[i]+colon+1);
- }
- qsnprintf(buf, qMin(512, off + 1), "%s", argv[i]); // copy text before the ':' into buf
- qsnprintf(buf + off, qMin(512 - off, 3), "()"); // append "()"
- int idx = QTest::currentTestObject->metaObject()->indexOfMethod(buf);
- if (idx < 0 || !isValidSlot(QTest::currentTestObject->metaObject()->method(idx))) {
- fprintf(stderr, "Unknown test function: '%s'. Possible matches:\n", buf);
- buf[off] = 0;
- qPrintTestSlots(stderr, buf);
- fprintf(stderr, "\n%s -functions\nlists all available test functions.\n", argv[0]);
- exit(1);
- }
- testFuncs[testFuncCount].set(idx, data);
- testFuncCount++;
- QTEST_ASSERT(QTest::testFuncCount < 512);
}
}
@@ -2005,7 +740,7 @@ qreal addResult(qreal current, const QBenchmarkResult& r)
}
-static void qInvokeTestMethodDataEntry(char *slot)
+void TestMethods::invokeTestOnData(int index) const
{
/* Benchmarking: for each median iteration*/
@@ -2020,7 +755,8 @@ static void qInvokeTestMethodDataEntry(char *slot)
/* Benchmarking: for each accumulation iteration*/
bool invokeOk;
do {
- invokeMethod(QTest::currentTestObject, "init()");
+ if (m_initMethod.isValid())
+ m_initMethod.invoke(QTest::currentTestObject, Qt::DirectConnection);
if (QTestResult::skipCurrentTest() || QTestResult::currentTestFailed())
break;
@@ -2032,8 +768,7 @@ static void qInvokeTestMethodDataEntry(char *slot)
QTestResult::currentDataTag()
? QTestResult::currentDataTag() : "");
- invokeOk = QMetaObject::invokeMethod(QTest::currentTestObject, slot,
- Qt::DirectConnection);
+ invokeOk = m_methods[index].invoke(QTest::currentTestObject, Qt::DirectConnection);
if (!invokeOk)
QTestResult::addFailure("Unable to execute slot", __FILE__, __LINE__);
@@ -2041,7 +776,8 @@ static void qInvokeTestMethodDataEntry(char *slot)
QTestResult::finishedCurrentTestData();
- invokeMethod(QTest::currentTestObject, "cleanup()");
+ if (m_cleanupMethod.isValid())
+ m_cleanupMethod.invoke(QTest::currentTestObject, Qt::DirectConnection);
// If the test isn't a benchmark, finalize the result after cleanup() has finished.
if (!isBenchmark)
@@ -2132,7 +868,7 @@ public:
int t = timeout.load();
if (!t)
break;
- if (!waitCondition.wait(&mutex, t)) {
+ if (Q_UNLIKELY(!waitCondition.wait(&mutex, t))) {
stackTrace();
qFatal("Test function timed out");
}
@@ -2155,21 +891,18 @@ private:
If the function was successfully called, true is returned, otherwise
false.
*/
-static bool qInvokeTestMethod(const char *slotName, const char *data, WatchDog *watchDog)
+bool TestMethods::invokeTest(int index, const char *data, WatchDog *watchDog) const
{
- QTEST_ASSERT(slotName);
-
QBenchmarkTestMethodData benchmarkData;
QBenchmarkTestMethodData::current = &benchmarkData;
- QBenchmarkGlobalData::current->context.slotName = QLatin1String(slotName);
+ const QByteArray &name = m_methods[index].name();
+ QBenchmarkGlobalData::current->context.slotName = QLatin1String(name) + QStringLiteral("()");
char member[512];
QTestTable table;
- char *slot = qstrdup(slotName);
- slot[strlen(slot) - 2] = '\0';
- QTestResult::setCurrentTestFunction(slot);
+ QTestResult::setCurrentTestFunction(name.constData());
const QTestTable *gTable = QTestTable::globalTestTable();
const int globalDataCount = gTable->dataCount();
@@ -2181,7 +914,7 @@ static bool qInvokeTestMethod(const char *slotName, const char *data, WatchDog *
QTestResult::setCurrentGlobalTestData(gTable->testData(curGlobalDataIndex));
if (curGlobalDataIndex == 0) {
- qsnprintf(member, 512, "%s_data()", slot);
+ qsnprintf(member, 512, "%s_data()", name.constData());
invokeMethod(QTest::currentTestObject, member);
}
@@ -2196,7 +929,7 @@ static bool qInvokeTestMethod(const char *slotName, const char *data, WatchDog *
if (!*data)
data = 0;
else {
- fprintf(stderr, "Unknown testdata for function %s: '%s'\n", slotName, data);
+ fprintf(stderr, "Unknown testdata for function %s(): '%s'\n", name.constData(), data);
fprintf(stderr, "Function has no testdata.\n");
return false;
}
@@ -2209,14 +942,14 @@ static bool qInvokeTestMethod(const char *slotName, const char *data, WatchDog *
if (!data || !qstrcmp(data, table.testData(curDataIndex)->dataTag())) {
foundFunction = true;
- QTestPrivate::checkBlackLists(slot, dataCount ? table.testData(curDataIndex)->dataTag() : 0);
+ QTestPrivate::checkBlackLists(name.constData(), dataCount ? table.testData(curDataIndex)->dataTag() : 0);
QTestDataSetter s(curDataIndex >= dataCount ? static_cast<QTestData *>(0)
: table.testData(curDataIndex));
if (watchDog)
watchDog->beginTest();
- qInvokeTestMethodDataEntry(slot);
+ invokeTestOnData(index);
if (watchDog)
watchDog->testFinished();
@@ -2228,7 +961,7 @@ static bool qInvokeTestMethod(const char *slotName, const char *data, WatchDog *
}
if (data && !foundFunction) {
- fprintf(stderr, "Unknown testdata for function %s: '%s'\n", slotName, data);
+ fprintf(stderr, "Unknown testdata for function %s: '%s()'\n", name.constData(), data);
fprintf(stderr, "Available testdata:\n");
for (int i = 0; i < table.dataCount(); ++i)
fprintf(stderr, "%s\n", table.testData(i)->dataTag());
@@ -2243,7 +976,6 @@ static bool qInvokeTestMethod(const char *slotName, const char *data, WatchDog *
QTestResult::setSkipCurrentTest(false);
QTestResult::setBlacklistCurrentTest(false);
QTestResult::setCurrentTestData(0);
- delete[] slot;
return true;
}
@@ -2256,12 +988,12 @@ void *fetchData(QTestData *data, const char *tagName, int typeId)
int idx = data->parent()->indexOf(tagName);
- if (idx == -1 || idx >= data->dataCount()) {
+ if (Q_UNLIKELY(idx == -1 || idx >= data->dataCount())) {
qFatal("QFETCH: Requested testdata '%s' not available, check your _data function.",
tagName);
}
- if (typeId != data->parent()->elementTypeId(idx)) {
+ if (Q_UNLIKELY(typeId != data->parent()->elementTypeId(idx))) {
qFatal("Requested type '%s' does not match available type '%s'.",
QMetaType::typeName(typeId),
QMetaType::typeName(data->parent()->elementTypeId(idx)));
@@ -2521,21 +1253,23 @@ static bool debuggerPresent()
#endif
}
-static void qInvokeTestMethods(QObject *testObject)
+void TestMethods::invokeTests(QObject *testObject) const
{
const QMetaObject *metaObject = testObject->metaObject();
QTEST_ASSERT(metaObject);
QTestLog::startLogging();
QTestResult::setCurrentTestFunction("initTestCase");
QTestTable::globalTestTable();
- invokeMethod(testObject, "initTestCase_data()");
+ if (m_initTestCaseDataMethod.isValid())
+ m_initTestCaseDataMethod.invoke(testObject, Qt::DirectConnection);
QScopedPointer<WatchDog> watchDog;
if (!debuggerPresent())
watchDog.reset(new WatchDog);
if (!QTestResult::skipCurrentTest() && !QTest::currentTestFailed()) {
- invokeMethod(testObject, "initTestCase()");
+ if (m_initTestCaseMethod.isValid())
+ m_initTestCaseMethod.invoke(testObject, Qt::DirectConnection);
// finishedCurrentTestDataCleanup() resets QTestResult::currentTestFailed(), so use a local copy.
const bool previousFailed = QTestResult::currentTestFailed();
@@ -2544,35 +1278,22 @@ static void qInvokeTestMethods(QObject *testObject)
QTestResult::finishedCurrentTestFunction();
if (!QTestResult::skipCurrentTest() && !previousFailed) {
-
- if (QTest::testFuncs) {
- for (int i = 0; i != QTest::testFuncCount; i++) {
- if (!qInvokeTestMethod(metaObject->method(QTest::testFuncs[i].function()).methodSignature().constData(),
- QTest::testFuncs[i].data(), watchDog.data())) {
- break;
- }
- }
- testFuncCleaner.cleanup();
- } else {
- int methodCount = metaObject->methodCount();
- QMetaMethod *testMethods = new QMetaMethod[methodCount];
- for (int i = 0; i != methodCount; i++)
- testMethods[i] = metaObject->method(i);
- for (int i = 0; i != methodCount; i++) {
- if (!isValidSlot(testMethods[i]))
- continue;
- if (!qInvokeTestMethod(testMethods[i].methodSignature().constData(), 0, watchDog.data()))
- break;
- }
- delete[] testMethods;
- testMethods = 0;
+ for (int i = 0, count = int(m_methods.size()); i < count; ++i) {
+ const char *data = Q_NULLPTR;
+ if (i < QTest::testTags.size() && !QTest::testTags.at(i).isEmpty())
+ data = qstrdup(QTest::testTags.at(i).toLatin1().constData());
+ const bool ok = invokeTest(i, data, watchDog.data());
+ delete [] data;
+ if (!ok)
+ break;
}
}
QTestResult::setSkipCurrentTest(false);
QTestResult::setBlacklistCurrentTest(false);
QTestResult::setCurrentTestFunction("cleanupTestCase");
- invokeMethod(testObject, "cleanupTestCase()");
+ if (m_cleanupTestCaseMethod.isValid())
+ m_cleanupTestCaseMethod.invoke(testObject, Qt::DirectConnection);
QTestResult::finishedCurrentTestData();
QTestResult::finishedCurrentTestDataCleanup();
}
@@ -2940,7 +1661,7 @@ int QTest::qExec(QObject *testObject, int argc, char **argv)
#ifdef QTESTLIB_USE_VALGRIND
if (QBenchmarkGlobalData::current->mode() == QBenchmarkGlobalData::CallgrindParentProcess) {
- if (!qApp)
+ if (Q_UNLIKELY(!qApp))
qFatal("QtTest: -callgrind option is not available with QTEST_APPLESS_MAIN");
const QStringList origAppArgs(QCoreApplication::arguments());
@@ -2957,7 +1678,23 @@ int QTest::qExec(QObject *testObject, int argc, char **argv)
if (!noCrashHandler)
handler.reset(new FatalSignalHandler);
#endif
- qInvokeTestMethods(testObject);
+ TestMethods::MetaMethods commandLineMethods;
+ if (!QTest::testFunctions.isEmpty()) {
+ foreach (const QString &tf, QTest::testFunctions) {
+ const QByteArray tfB = tf.toLatin1();
+ const QByteArray signature = tfB + QByteArrayLiteral("()");
+ QMetaMethod m = TestMethods::findMethod(testObject, signature.constData());
+ if (!m.isValid() || !isValidSlot(m)) {
+ fprintf(stderr, "Unknown test function: '%s'. Possible matches:\n", tfB.constData());
+ qPrintTestSlots(stderr, tfB.constData());
+ fprintf(stderr, "\n%s -functions\nlists all available test functions.\n", argv[0]);
+ exit(1);
+ }
+ commandLineMethods.push_back(m);
+ }
+ }
+ TestMethods test(testObject, commandLineMethods);
+ test.invokeTests(testObject);
}
#ifndef QT_NO_EXCEPTIONS
@@ -3578,6 +2315,11 @@ bool QTest::compare_string_helper(const char *t1, const char *t2, const char *ac
toString(t1), toString(t2), actual, expected, file, line);
}
+/*!
+ \namespace QTest::Internal
+ \internal
+*/
+
/*! \fn bool QTest::compare_ptr_helper(const void *t1, const void *t2, const char *actual, const char *expected, const char *file, int line);
\internal
*/
diff --git a/src/testlib/qtestcase.qdoc b/src/testlib/qtestcase.qdoc
new file mode 100644
index 0000000000..7e14a236bc
--- /dev/null
+++ b/src/testlib/qtestcase.qdoc
@@ -0,0 +1,1278 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Free Documentation License Usage
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file. Please review the following information to ensure
+** the GNU Free Documentation License version 1.3 requirements
+** will be met: http://www.gnu.org/copyleft/fdl.html.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \namespace QTest
+ \inmodule QtTest
+
+ \brief The QTest namespace contains all the functions and
+ declarations that are related to Qt Test.
+
+ See the \l{Qt Test Overview} for information about how to write unit tests.
+*/
+
+/*! \macro QVERIFY(condition)
+
+ \relates QTest
+
+ The QVERIFY() macro checks whether the \a condition is true or not. If it is
+ true, execution continues. If not, a failure is recorded in the test log
+ and the test won't be executed further.
+
+ \b {Note:} This macro can only be used in a test function that is invoked
+ by the test framework.
+
+ Example:
+ \snippet code/src_qtestlib_qtestcase.cpp 0
+
+ \sa QCOMPARE(), QTRY_VERIFY()
+*/
+
+/*! \macro QVERIFY2(condition, message)
+
+ \relates QTest
+
+ The QVERIFY2() macro behaves exactly like QVERIFY(), except that it outputs
+ a verbose \a message when \a condition is false. The \a message is a plain
+ C string.
+
+ Example:
+ \snippet code/src_qtestlib_qtestcase.cpp 1
+
+ \sa QVERIFY(), QCOMPARE()
+*/
+
+/*! \macro QCOMPARE(actual, expected)
+
+ \relates QTest
+
+ The QCOMPARE macro compares an \a actual value to an \a expected value using
+ the equals operator. If \a actual and \a expected are identical, execution
+ continues. If not, a failure is recorded in the test log and the test
+ won't be executed further.
+
+ In the case of comparing floats and doubles, qFuzzyCompare() is used for
+ comparing. This means that comparing to 0 will likely fail. One solution
+ to this is to compare to 1, and add 1 to the produced output.
+
+ QCOMPARE tries to output the contents of the values if the comparison fails,
+ so it is visible from the test log why the comparison failed.
+
+ QCOMPARE is very strict on the data types. Both \a actual and \a expected
+ have to be of the same type, otherwise the test won't compile. This prohibits
+ unspecified behavior from being introduced; that is behavior that usually
+ occurs when the compiler implicitly casts the argument.
+
+ For your own classes, you can use \l QTest::toString() to format values for
+ outputting into the test log.
+
+ \note This macro can only be used in a test function that is invoked
+ by the test framework.
+
+ Example:
+ \snippet code/src_qtestlib_qtestcase.cpp 2
+
+ \sa QVERIFY(), QTRY_COMPARE(), QTest::toString()
+*/
+
+/*! \macro QVERIFY_EXCEPTION_THROWN(expression, exceptiontype)
+ \since 5.3
+
+ \relates QTest
+
+ The QVERIFY_EXCEPTION_THROWN macro executes an \a expression and tries
+ to catch an exception thrown from the \a expression. If the \a expression
+ throws an exception and its type is the same as \a exceptiontype
+ or \a exceptiontype is substitutable with the type of thrown exception
+ (i.e. usually the type of thrown exception is publically derived
+ from \a exceptiontype) then execution will be continued. If not-substitutable
+ type of exception is thrown or the \a expression doesn't throw an exception
+ at all, then a failure will be recorded in the test log and
+ the test won't be executed further.
+
+ \note This macro can only be used in a test function that is invoked
+ by the test framework.
+*/
+
+/*! \macro QTRY_VERIFY_WITH_TIMEOUT(condition, timeout)
+ \since 5.0
+
+ \relates QTest
+
+ The QTRY_VERIFY_WITH_TIMEOUT() macro is similar to QVERIFY(), but checks the \a condition
+ repeatedly, until either the condition becomes true or the \a timeout is
+ reached. Between each evaluation, events will be processed. If the timeout
+ is reached, a failure is recorded in the test log and the test won't be
+ executed further.
+
+ \note This macro can only be used in a test function that is invoked
+ by the test framework.
+
+ \sa QTRY_VERIFY(), QTRY_VERIFY2_WITH_TIMEOUT(), QVERIFY(), QCOMPARE(), QTRY_COMPARE()
+*/
+
+
+/*! \macro QTRY_VERIFY(condition)
+ \since 5.0
+
+ \relates QTest
+
+ Checks the \a condition by invoking QTRY_VERIFY_WITH_TIMEOUT() with a timeout of five seconds.
+
+ \note This macro can only be used in a test function that is invoked
+ by the test framework.
+
+ \sa QTRY_VERIFY_WITH_TIMEOUT(), QTRY_VERIFY2(), QVERIFY(), QCOMPARE(), QTRY_COMPARE()
+*/
+
+/*! \macro QTRY_VERIFY2_WITH_TIMEOUT(condition, message, timeout)
+ \since 5.6
+
+ \relates QTest
+
+ The QTRY_VERIFY2_WITH_TIMEOUT macro is similar to QTRY_VERIFY_WITH_TIMEOUT()
+ except that it outputs a verbose \a message when \a condition is still false
+ after the specified \a timeout. The \a message is a plain C string.
+
+ Example:
+ \code
+ QTRY_VERIFY2_WITH_TIMEOUT(list.size() > 2, QByteArray::number(list.size()).constData(), 10000);
+ \endcode
+
+ \note This macro can only be used in a test function that is invoked
+ by the test framework.
+
+ \sa QTRY_VERIFY(), QTRY_VERIFY_WITH_TIMEOUT(), QVERIFY(), QCOMPARE(), QTRY_COMPARE()
+*/
+
+/*! \macro QTRY_VERIFY2(condition, message)
+ \since 5.6
+
+ \relates QTest
+
+ Checks the \a condition by invoking QTRY_VERIFY2_WITH_TIMEOUT() with a timeout
+ of five seconds. If \a condition is then still false, \a message is output.
+ The \a message is a plain C string.
+
+ Example:
+ \code
+ QTRY_VERIFY2_WITH_TIMEOUT(list.size() > 2, QByteArray::number(list.size()).constData());
+ \endcode
+
+ \note This macro can only be used in a test function that is invoked
+ by the test framework.
+
+ \sa QTRY_VERIFY2_WITH_TIMEOUT(), QTRY_VERIFY2(), QVERIFY(), QCOMPARE(), QTRY_COMPARE()
+*/
+
+/*! \macro QTRY_COMPARE_WITH_TIMEOUT(actual, expected, timeout)
+ \since 5.0
+
+ \relates QTest
+
+ The QTRY_COMPARE_WITH_TIMEOUT() macro is similar to QCOMPARE(), but performs the comparison
+ of the \a actual and \a expected values repeatedly, until either the two values
+ are equal or the \a timeout is reached. Between each comparison, events
+ will be processed. If the timeout is reached, a failure is recorded in the
+ test log and the test won't be executed further.
+
+ \note This macro can only be used in a test function that is invoked
+ by the test framework.
+
+ \sa QTRY_COMPARE(), QCOMPARE(), QVERIFY(), QTRY_VERIFY()
+*/
+
+/*! \macro QTRY_COMPARE(actual, expected)
+ \since 5.0
+
+ \relates QTest
+
+ Performs a comparison of the \a actual and \a expected values by
+ invoking QTRY_COMPARE_WITH_TIMEOUT() with a timeout of five seconds.
+
+ \note This macro can only be used in a test function that is invoked
+ by the test framework.
+
+ \sa QTRY_COMPARE_WITH_TIMEOUT(), QCOMPARE(), QVERIFY(), QTRY_VERIFY()
+*/
+
+/*! \macro QFETCH(type, name)
+
+ \relates QTest
+
+ The fetch macro creates a local variable named \a name with the type \a type
+ on the stack. \a name has to match the element name from the test's data.
+ If no such element exists, the test will assert.
+
+ Assuming a test has the following data:
+
+ \snippet code/src_qtestlib_qtestcase.cpp 3
+
+ The test data has two elements, a QString called \c aString and an integer
+ called \c expected. To fetch these values in the actual test:
+
+ \snippet code/src_qtestlib_qtestcase.cpp 4
+
+ \c aString and \c expected are variables on the stack that are initialized with
+ the current test data.
+
+ \b {Note:} This macro can only be used in a test function that is invoked
+ by the test framework. The test function must have a _data function.
+*/
+
+/*! \macro QWARN(message)
+
+ \relates QTest
+ \threadsafe
+
+ Appends \a message as a warning to the test log. This macro can be used anywhere
+ in your tests.
+*/
+
+/*! \macro QFAIL(message)
+
+ \relates QTest
+
+ This macro can be used to force a test failure. The test stops
+ executing and the failure \a message is appended to the test log.
+
+ \b {Note:} This macro can only be used in a test function that is invoked
+ by the test framework.
+
+ Example:
+
+ \snippet code/src_qtestlib_qtestcase.cpp 5
+*/
+
+/*! \macro QTEST(actual, testElement)
+
+ \relates QTest
+
+ QTEST() is a convenience macro for \l QCOMPARE() that compares
+ the value \a actual with the element \a testElement from the test's data.
+ If there is no such element, the test asserts.
+
+ Apart from that, QTEST() behaves exactly as \l QCOMPARE().
+
+ Instead of writing:
+
+ \snippet code/src_qtestlib_qtestcase.cpp 6
+
+ you can write:
+
+ \snippet code/src_qtestlib_qtestcase.cpp 7
+
+ \sa QCOMPARE()
+*/
+
+/*! \macro QSKIP(description)
+
+ \relates QTest
+
+ If called from a test function, the QSKIP() macro stops execution of the test
+ without adding a failure to the test log. You can use it to skip tests that
+ wouldn't make sense in the current configuration. The text \a description is
+ appended to the test log and should contain an explanation of why the test
+ couldn't be executed.
+
+ If the test is data-driven, each call to QSKIP() will skip only the current
+ row of test data, so an unconditional call to QSKIP will produce one skip
+ message in the test log for each row of test data.
+
+ If called from an _data function, the QSKIP() macro will stop execution of
+ the _data function and will prevent execution of the associated test
+ function.
+
+ If called from initTestCase() or initTestCase_data(), the QSKIP() macro will
+ skip all test and _data functions.
+
+ \b {Note:} This macro can only be used in a test function or _data
+ function that is invoked by the test framework.
+
+ Example:
+ \snippet code/src_qtestlib_qtestcase.cpp 8
+*/
+
+/*! \macro QEXPECT_FAIL(dataIndex, comment, mode)
+
+ \relates QTest
+
+ The QEXPECT_FAIL() macro marks the next \l QCOMPARE() or \l QVERIFY() as an
+ expected failure. Instead of adding a failure to the test log, an expected
+ failure will be reported.
+
+ If a \l QVERIFY() or \l QCOMPARE() is marked as an expected failure,
+ but passes instead, an unexpected pass (XPASS) is written to the test log.
+
+ The parameter \a dataIndex describes for which entry in the test data the
+ failure is expected. Pass an empty string (\c{""}) if the failure
+ is expected for all entries or if no test data exists.
+
+ \a comment will be appended to the test log for the expected failure.
+
+ \a mode is a \l QTest::TestFailMode and sets whether the test should
+ continue to execute or not.
+
+ \b {Note:} This macro can only be used in a test function that is invoked
+ by the test framework.
+
+ Example 1:
+ \snippet code/src_qtestlib_qtestcase.cpp 9
+
+ In the example above, an expected fail will be written into the test output
+ if the variable \c i is not 42. If the variable \c i is 42, an unexpected pass
+ is written instead. The QEXPECT_FAIL() has no influence on the second QCOMPARE()
+ statement in the example.
+
+ Example 2:
+ \snippet code/src_qtestlib_qtestcase.cpp 10
+
+ The above testfunction will not continue executing for the test data
+ entry \c{data27}.
+
+ \sa QTest::TestFailMode, QVERIFY(), QCOMPARE()
+*/
+
+/*! \macro QFINDTESTDATA(filename)
+ \since 5.0
+
+ \relates QTest
+
+ Returns a QString for the testdata file referred to by \a filename, or an
+ empty QString if the testdata file could not be found.
+
+ This macro allows the test to load data from an external file without
+ hardcoding an absolute filename into the test, or using relative paths
+ which may be error prone.
+
+ The returned path will be the first path from the following list which
+ resolves to an existing file or directory:
+
+ \list
+ \li \a filename relative to QCoreApplication::applicationDirPath()
+ (only if a QCoreApplication or QApplication object has been created).
+ \li \a filename relative to the test's standard install directory
+ (QLibraryInfo::TestsPath with the lowercased testcase name appended).
+ \li \a filename relative to the directory containing the source file from which
+ QFINDTESTDATA is invoked.
+ \endlist
+
+ If the named file/directory does not exist at any of these locations,
+ a warning is printed to the test log.
+
+ For example, in this code:
+ \snippet code/src_qtestlib_qtestcase.cpp 26
+
+ The testdata file will be resolved as the first existing file from:
+
+ \list
+ \li \c{/home/user/build/myxmlparser/tests/tst_myxmlparser/testxml/simple1.xml}
+ \li \c{/usr/local/Qt-5.0.0/tests/tst_myxmlparser/testxml/simple1.xml}
+ \li \c{/home/user/sources/myxmlparser/tests/tst_myxmlparser/testxml/simple1.xml}
+ \endlist
+
+ This allows the test to find its testdata regardless of whether the
+ test has been installed, and regardless of whether the test's build tree
+ is equal to the test's source tree.
+
+ \b {Note:} reliable detection of testdata from the source directory requires
+ either that qmake is used, or the \c{QT_TESTCASE_BUILDDIR} macro is defined to
+ point to the working directory from which the compiler is invoked, or only
+ absolute paths to the source files are passed to the compiler. Otherwise, the
+ absolute path of the source directory cannot be determined.
+
+ \b {Note:} For tests that use the \l QTEST_APPLESS_MAIN() macro to generate a
+ \c{main()} function, \c{QFINDTESTDATA} will not attempt to find test data
+ relative to QCoreApplication::applicationDirPath(). In practice, this means that
+ tests using \c{QTEST_APPLESS_MAIN()} will fail to find their test data
+ if run from a shadow build tree.
+*/
+
+/*! \macro QTEST_MAIN(TestClass)
+
+ \relates QTest
+
+ Implements a main() function that instantiates an application object and
+ the \a TestClass, and executes all tests in the order they were defined.
+ Use this macro to build stand-alone executables.
+
+ If \c QT_WIDGETS_LIB is defined, the application object will be a QApplication,
+ if \c QT_GUI_LIB is defined, the application object will be a QGuiApplication,
+ otherwise it will be a QCoreApplication. If qmake is used and the configuration
+ includes \c{QT += widgets}, then \c QT_WIDGETS_LIB will be defined automatically.
+ Similarly, if qmake is used and the configuration includes \c{QT += gui}, then
+ \c QT_GUI_LIB will be defined automatically.
+
+ \b {Note:} On platforms that have keypad navigation enabled by default,
+ this macro will forcefully disable it if \c QT_WIDGETS_LIB is defined. This is done
+ to simplify the usage of key events when writing autotests. If you wish to write a
+ test case that uses keypad navigation, you should enable it either in the
+ \c {initTestCase()} or \c {init()} functions of your test case by calling
+ \l {QApplication::setNavigationMode()}.
+
+ Example:
+ \snippet code/src_qtestlib_qtestcase.cpp 11
+
+ \sa QTEST_APPLESS_MAIN(), QTEST_GUILESS_MAIN(), QTest::qExec(),
+ QApplication::setNavigationMode()
+*/
+
+/*! \macro QTEST_APPLESS_MAIN(TestClass)
+
+ \relates QTest
+
+ Implements a main() function that executes all tests in \a TestClass.
+
+ Behaves like \l QTEST_MAIN(), but doesn't instantiate a QApplication
+ object. Use this macro for really simple stand-alone non-GUI tests.
+
+ \sa QTEST_MAIN()
+*/
+
+/*! \macro QTEST_GUILESS_MAIN(TestClass)
+ \since 5.0
+
+ \relates QTest
+
+ Implements a main() function that instantiates a QCoreApplication object
+ and the \a TestClass, and executes all tests in the order they were
+ defined. Use this macro to build stand-alone executables.
+
+ Behaves like \l QTEST_MAIN(), but instantiates a QCoreApplication instead
+ of the QApplication object. Use this macro if your test case doesn't need
+ functionality offered by QApplication, but the event loop is still necessary.
+
+ \sa QTEST_MAIN()
+*/
+
+/*!
+ \macro QBENCHMARK
+
+ \relates QTest
+
+ This macro is used to measure the performance of code within a test.
+ The code to be benchmarked is contained within a code block following
+ this macro.
+
+ For example:
+
+ \snippet code/src_qtestlib_qtestcase.cpp 27
+
+ \sa {Qt Test Overview#Creating a Benchmark}{Creating a Benchmark},
+ {Chapter 5: Writing a Benchmark}{Writing a Benchmark}
+*/
+
+/*!
+ \macro QBENCHMARK_ONCE
+ \since 4.6
+
+ \relates QTest
+
+ \brief The QBENCHMARK_ONCE macro is for measuring performance of a
+ code block by running it once.
+
+ This macro is used to measure the performance of code within a test.
+ The code to be benchmarked is contained within a code block following
+ this macro.
+
+ Unlike QBENCHMARK, the contents of the contained code block is only run
+ once. The elapsed time will be reported as "0" if it's to short to
+ be measured by the selected backend. (Use)
+
+ \sa {Qt Test Overview#Creating a Benchmark}{Creating a Benchmark},
+ {Chapter 5: Writing a Benchmark}{Writing a Benchmark}
+*/
+
+/*! \enum QTest::TestFailMode
+
+ This enum describes the modes for handling an expected failure of the
+ \l QVERIFY() or \l QCOMPARE() macros.
+
+ \value Abort Aborts the execution of the test. Use this mode when it
+ doesn't make sense to execute the test any further after the
+ expected failure.
+
+ \value Continue Continues execution of the test after the expected failure.
+
+ \sa QEXPECT_FAIL()
+*/
+
+/*! \enum QTest::KeyAction
+
+ This enum describes possible actions for key handling.
+
+ \value Press The key is pressed.
+ \value Release The key is released.
+ \value Click The key is clicked (pressed and released).
+*/
+
+/*! \enum QTest::MouseAction
+
+ This enum describes possible actions for mouse handling.
+
+ \value MousePress A mouse button is pressed.
+ \value MouseRelease A mouse button is released.
+ \value MouseClick A mouse button is clicked (pressed and released).
+ \value MouseDClick A mouse button is double clicked (pressed and released twice).
+ \value MouseMove The mouse pointer has moved.
+*/
+
+/*! \fn void QTest::keyClick(QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+
+ Simulates clicking of \a key with an optional \a modifier on a \a widget.
+ If \a delay is larger than 0, the test will wait for \a delay milliseconds
+ before clicking the key.
+
+ Examples:
+ \snippet code/src_qtestlib_qtestcase.cpp 14
+
+ The first example above simulates clicking the \c escape key on \c
+ myWidget without any keyboard modifiers and without delay. The
+ second example simulates clicking \c shift-escape on \c myWidget
+ following a 200 ms delay of the test.
+
+ \sa QTest::keyClicks()
+*/
+
+/*! \fn void QTest::keyClick(QWidget *widget, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+ \overload
+
+ Simulates clicking of \a key with an optional \a modifier on a \a widget.
+ If \a delay is larger than 0, the test will wait for \a delay milliseconds
+ before clicking the key.
+
+ Example:
+ \snippet code/src_qtestlib_qtestcase.cpp 13
+
+ The example above simulates clicking \c a on \c myWidget without
+ any keyboard modifiers and without delay of the test.
+
+ \sa QTest::keyClicks()
+*/
+
+/*! \fn void QTest::keyClick(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+ \overload
+ \since 5.0
+
+ Simulates clicking of \a key with an optional \a modifier on a \a window.
+ If \a delay is larger than 0, the test will wait for \a delay milliseconds
+ before clicking the key.
+
+ Examples:
+ \snippet code/src_qtestlib_qtestcase.cpp 29
+
+ The first example above simulates clicking the \c escape key on \c
+ myWindow without any keyboard modifiers and without delay. The
+ second example simulates clicking \c shift-escape on \c myWindow
+ following a 200 ms delay of the test.
+
+ \sa QTest::keyClicks()
+*/
+
+/*! \fn void QTest::keyClick(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+ \overload
+ \since 5.0
+
+ Simulates clicking of \a key with an optional \a modifier on a \a window.
+ If \a delay is larger than 0, the test will wait for \a delay milliseconds
+ before clicking the key.
+
+ Example:
+ \snippet code/src_qtestlib_qtestcase.cpp 28
+
+ The example above simulates clicking \c a on \c myWindow without
+ any keyboard modifiers and without delay of the test.
+
+ \sa QTest::keyClicks()
+*/
+
+/*! \fn void QTest::keyEvent(KeyAction action, QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+
+ Sends a Qt key event to \a widget with the given \a key and an associated \a action.
+ Optionally, a keyboard \a modifier can be specified, as well as a \a delay
+ (in milliseconds) of the test before sending the event.
+*/
+
+/*! \fn void QTest::keyEvent(KeyAction action, QWidget *widget, char ascii, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+ \overload
+
+ Sends a Qt key event to \a widget with the given key \a ascii and an associated \a action.
+ Optionally, a keyboard \a modifier can be specified, as well as a \a delay
+ (in milliseconds) of the test before sending the event.
+*/
+
+/*! \fn void QTest::keyEvent(KeyAction action, QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+ \overload
+ \since 5.0
+
+ Sends a Qt key event to \a window with the given \a key and an associated \a action.
+ Optionally, a keyboard \a modifier can be specified, as well as a \a delay
+ (in milliseconds) of the test before sending the event.
+*/
+
+/*! \fn void QTest::keyEvent(KeyAction action, QWindow *window, char ascii, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+ \overload
+ \since 5.0
+
+ Sends a Qt key event to \a window with the given key \a ascii and an associated \a action.
+ Optionally, a keyboard \a modifier can be specified, as well as a \a delay
+ (in milliseconds) of the test before sending the event.
+*/
+
+/*! \fn void QTest::keyPress(QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+
+ Simulates pressing a \a key with an optional \a modifier on a \a widget. If \a delay
+ is larger than 0, the test will wait for \a delay milliseconds before pressing the key.
+
+ \b {Note:} At some point you should release the key using \l keyRelease().
+
+ \sa QTest::keyRelease(), QTest::keyClick()
+*/
+
+/*! \fn void QTest::keyPress(QWidget *widget, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+ \overload
+
+ Simulates pressing a \a key with an optional \a modifier on a \a widget.
+ If \a delay is larger than 0, the test will wait for \a delay milliseconds
+ before pressing the key.
+
+ \b {Note:} At some point you should release the key using \l keyRelease().
+
+ \sa QTest::keyRelease(), QTest::keyClick()
+*/
+
+/*! \fn void QTest::keyPress(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+ \overload
+ \since 5.0
+
+ Simulates pressing a \a key with an optional \a modifier on a \a window. If \a delay
+ is larger than 0, the test will wait for \a delay milliseconds before pressing the key.
+
+ \b {Note:} At some point you should release the key using \l keyRelease().
+
+ \sa QTest::keyRelease(), QTest::keyClick()
+*/
+
+/*! \fn void QTest::keyPress(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+ \overload
+ \since 5.0
+
+ Simulates pressing a \a key with an optional \a modifier on a \a window.
+ If \a delay is larger than 0, the test will wait for \a delay milliseconds
+ before pressing the key.
+
+ \b {Note:} At some point you should release the key using \l keyRelease().
+
+ \sa QTest::keyRelease(), QTest::keyClick()
+*/
+
+/*! \fn void QTest::keyRelease(QWidget *widget, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+
+ Simulates releasing a \a key with an optional \a modifier on a \a widget.
+ If \a delay is larger than 0, the test will wait for \a delay milliseconds
+ before releasing the key.
+
+ \sa QTest::keyPress(), QTest::keyClick()
+*/
+
+/*! \fn void QTest::keyRelease(QWidget *widget, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+ \overload
+
+ Simulates releasing a \a key with an optional \a modifier on a \a widget.
+ If \a delay is larger than 0, the test will wait for \a delay milliseconds
+ before releasing the key.
+
+ \sa QTest::keyClick()
+*/
+
+/*! \fn void QTest::keyRelease(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+ \overload
+ \since 5.0
+
+ Simulates releasing a \a key with an optional \a modifier on a \a window.
+ If \a delay is larger than 0, the test will wait for \a delay milliseconds
+ before releasing the key.
+
+ \sa QTest::keyPress(), QTest::keyClick()
+*/
+
+/*! \fn void QTest::keyRelease(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+ \overload
+ \since 5.0
+
+ Simulates releasing a \a key with an optional \a modifier on a \a window.
+ If \a delay is larger than 0, the test will wait for \a delay milliseconds
+ before releasing the key.
+
+ \sa QTest::keyClick()
+*/
+
+/*! \fn void QTest::keyClicks(QWidget *widget, const QString &sequence, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
+
+ Simulates clicking a \a sequence of keys on a \a
+ widget. Optionally, a keyboard \a modifier can be specified as
+ well as a \a delay (in milliseconds) of the test before each key
+ click.
+
+ Example:
+ \snippet code/src_qtestlib_qtestcase.cpp 15
+
+ The example above simulates clicking the sequence of keys
+ representing "hello world" on \c myWidget without any keyboard
+ modifiers and without delay of the test.
+
+ \sa QTest::keyClick()
+*/
+
+/*! \fn void QTest::mousePress(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = 0, QPoint pos = QPoint(), int delay=-1)
+
+ Simulates pressing a mouse \a button with an optional \a modifier
+ on a \a widget. The position is defined by \a pos; the default
+ position is the center of the widget. If \a delay is specified,
+ the test will wait for the specified amount of milliseconds before
+ the press.
+
+ \sa QTest::mouseRelease(), QTest::mouseClick()
+*/
+
+/*! \fn void QTest::mousePress(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = 0, QPoint pos = QPoint(), int delay=-1)
+ \overload
+ \since 5.0
+
+ Simulates pressing a mouse \a button with an optional \a stateKey modifier
+ on a \a window. The position is defined by \a pos; the default
+ position is the center of the window. If \a delay is specified,
+ the test will wait for the specified amount of milliseconds before
+ the press.
+
+ \sa QTest::mouseRelease(), QTest::mouseClick()
+*/
+
+/*! \fn void QTest::mouseRelease(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = 0, QPoint pos = QPoint(), int delay=-1)
+
+ Simulates releasing a mouse \a button with an optional \a modifier
+ on a \a widget. The position of the release is defined by \a pos;
+ the default position is the center of the widget. If \a delay is
+ specified, the test will wait for the specified amount of
+ milliseconds before releasing the button.
+
+ \sa QTest::mousePress(), QTest::mouseClick()
+*/
+
+/*! \fn void QTest::mouseRelease(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = 0, QPoint pos = QPoint(), int delay=-1)
+ \overload
+ \since 5.0
+
+ Simulates releasing a mouse \a button with an optional \a stateKey modifier
+ on a \a window. The position of the release is defined by \a pos;
+ the default position is the center of the window. If \a delay is
+ specified, the test will wait for the specified amount of
+ milliseconds before releasing the button.
+
+ \sa QTest::mousePress(), QTest::mouseClick()
+*/
+
+/*! \fn void QTest::mouseClick(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = 0, QPoint pos = QPoint(), int delay=-1)
+
+ Simulates clicking a mouse \a button with an optional \a modifier
+ on a \a widget. The position of the click is defined by \a pos;
+ the default position is the center of the widget. If \a delay is
+ specified, the test will wait for the specified amount of
+ milliseconds before pressing and before releasing the button.
+
+ \sa QTest::mousePress(), QTest::mouseRelease()
+*/
+
+/*! \fn void QTest::mouseClick(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = 0, QPoint pos = QPoint(), int delay=-1)
+ \overload
+ \since 5.0
+
+ Simulates clicking a mouse \a button with an optional \a stateKey modifier
+ on a \a window. The position of the click is defined by \a pos;
+ the default position is the center of the window. If \a delay is
+ specified, the test will wait for the specified amount of
+ milliseconds before pressing and before releasing the button.
+
+ \sa QTest::mousePress(), QTest::mouseRelease()
+*/
+
+/*! \fn void QTest::mouseDClick(QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers modifier = 0, QPoint pos = QPoint(), int delay=-1)
+
+ Simulates double clicking a mouse \a button with an optional \a
+ modifier on a \a widget. The position of the click is defined by
+ \a pos; the default position is the center of the widget. If \a
+ delay is specified, the test will wait for the specified amount of
+ milliseconds before each press and release.
+
+ \sa QTest::mouseClick()
+*/
+
+/*! \fn void QTest::mouseDClick(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = 0, QPoint pos = QPoint(), int delay=-1)
+ \overload
+ \since 5.0
+
+ Simulates double clicking a mouse \a button with an optional \a stateKey
+ modifier on a \a window. The position of the click is defined by
+ \a pos; the default position is the center of the window. If \a
+ delay is specified, the test will wait for the specified amount of
+ milliseconds before each press and release.
+
+ \sa QTest::mouseClick()
+*/
+
+/*! \fn void QTest::mouseMove(QWidget *widget, QPoint pos = QPoint(), int delay=-1)
+
+ Moves the mouse pointer to a \a widget. If \a pos is not
+ specified, the mouse pointer moves to the center of the widget. If
+ a \a delay (in milliseconds) is given, the test will wait before
+ moving the mouse pointer.
+*/
+
+/*! \fn void QTest::mouseMove(QWindow *window, QPoint pos = QPoint(), int delay=-1)
+ \overload
+ \since 5.0
+
+ Moves the mouse pointer to a \a window. If \a pos is not
+ specified, the mouse pointer moves to the center of the window. If
+ a \a delay (in milliseconds) is given, the test will wait before
+ moving the mouse pointer.
+*/
+
+/*!
+ \fn char *QTest::toString(const T &value)
+
+ Returns a textual representation of \a value. This function is used by
+ \l QCOMPARE() to output verbose information in case of a test failure.
+
+ You can add specializations or overloads of this function to your test to enable
+ verbose output.
+
+ \b {Note:} Starting with Qt 5.5, you should prefer to provide a toString() function
+ in the type's namespace instead of specializing this template.
+ If your code needs to continue to work with the QTestLib from Qt 5.4 or
+ earlier, you need to continue to use specialization.
+
+ \b {Note:} The caller of toString() must delete the returned data
+ using \c{delete[]}. Your implementation should return a string
+ created with \c{new[]} or qstrdup(). The easiest way to do so is to
+ create a QByteArray or QString and calling QTest::toString() on it
+ (see second example below).
+
+ Example for specializing (Qt ≤ 5.4):
+
+ \snippet code/src_qtestlib_qtestcase.cpp 16
+
+ The example above defines a toString() specialization for a class
+ called \c MyPoint. Whenever a comparison of two instances of \c
+ MyPoint fails, \l QCOMPARE() will call this function to output the
+ contents of \c MyPoint to the test log.
+
+ Same example, but with overloading (Qt ≥ 5.5):
+
+ \snippet code/src_qtestlib_qtestcase.cpp toString-overload
+
+ \sa QCOMPARE()
+*/
+
+/*!
+ \fn char *QTest::toString(const QLatin1String &string)
+ \overload
+
+ Returns a textual representation of the given \a string.
+*/
+
+/*!
+ \fn char *QTest::toString(const QString &string)
+ \overload
+
+ Returns a textual representation of the given \a string.
+*/
+
+/*!
+ \fn char *QTest::toString(const QByteArray &ba)
+ \overload
+
+ Returns a textual representation of the byte array \a ba.
+
+ \sa QTest::toHexRepresentation()
+*/
+
+/*!
+ \fn char *QTest::toString(const QTime &time)
+ \overload
+
+ Returns a textual representation of the given \a time.
+*/
+
+/*!
+ \fn char *QTest::toString(const QDate &date)
+ \overload
+
+ Returns a textual representation of the given \a date.
+*/
+
+/*!
+ \fn char *QTest::toString(const QDateTime &dateTime)
+ \overload
+
+ Returns a textual representation of the date and time specified by
+ \a dateTime.
+*/
+
+/*!
+ \fn char *QTest::toString(const QChar &character)
+ \overload
+
+ Returns a textual representation of the given \a character.
+*/
+
+/*!
+ \fn char *QTest::toString(const QPoint &point)
+ \overload
+
+ Returns a textual representation of the given \a point.
+*/
+
+/*!
+ \fn char *QTest::toString(const QSize &size)
+ \overload
+
+ Returns a textual representation of the given \a size.
+*/
+
+/*!
+ \fn char *QTest::toString(const QRect &rectangle)
+ \overload
+
+ Returns a textual representation of the given \a rectangle.
+*/
+
+/*!
+ \fn char *QTest::toString(const QUrl &url)
+ \since 4.4
+ \overload
+
+ Returns a textual representation of the given \a url.
+*/
+
+/*!
+ \fn char *QTest::toString(const QPointF &point)
+ \overload
+
+ Returns a textual representation of the given \a point.
+*/
+
+/*!
+ \fn char *QTest::toString(const QSizeF &size)
+ \overload
+
+ Returns a textual representation of the given \a size.
+*/
+
+/*!
+ \fn char *QTest::toString(const QRectF &rectangle)
+ \overload
+
+ Returns a textual representation of the given \a rectangle.
+*/
+
+/*!
+ \fn char *QTest::toString(const QVariant &variant)
+ \overload
+
+ Returns a textual representation of the given \a variant.
+*/
+
+/*!
+ \fn char *QTest::toString(QSizePolicy::ControlType ct)
+ \overload
+ \since 5.5
+
+ Returns a textual representation of control type \a ct.
+*/
+
+/*!
+ \fn char *QTest::toString(QSizePolicy::ControlTypes cts)
+ \overload
+ \since 5.5
+
+ Returns a textual representation of control types \a cts.
+*/
+
+/*!
+ \fn char *QTest::toString(QSizePolicy::Policy p)
+ \overload
+ \since 5.5
+
+ Returns a textual representation of policy \a p.
+*/
+
+/*!
+ \fn char *QTest::toString(QSizePolicy sp)
+ \overload
+ \since 5.5
+
+ Returns a textual representation of size policy \a sp.
+*/
+
+/*! \fn void QTest::qWait(int ms)
+
+ Waits for \a ms milliseconds. While waiting, events will be processed and
+ your test will stay responsive to user interface events or network communication.
+
+ Example:
+ \snippet code/src_qtestlib_qtestcase.cpp 17
+
+ The code above will wait until the network server is responding for a
+ maximum of about 12.5 seconds.
+
+ \sa QTest::qSleep(), QSignalSpy::wait()
+*/
+
+/*! \fn bool QTest::qWaitForWindowExposed(QWindow *window, int timeout)
+ \since 5.0
+
+ Waits for \a timeout milliseconds or until the \a window is exposed.
+ Returns \c true if \c window is exposed within \a timeout milliseconds, otherwise returns \c false.
+
+ This is mainly useful for asynchronous systems like X11, where a window will be mapped to screen some
+ time after being asked to show itself on the screen.
+
+ \sa QTest::qWaitForWindowActive(), QWindow::isExposed()
+*/
+
+/*! \fn bool QTest::qWaitForWindowActive(QWindow *window, int timeout)
+ \since 5.0
+
+ Waits for \a timeout milliseconds or until the \a window is active.
+
+ Returns \c true if \c window is active within \a timeout milliseconds, otherwise returns \c false.
+
+ \sa QTest::qWaitForWindowExposed(), QWindow::isActive()
+*/
+
+/*! \fn bool QTest::qWaitForWindowExposed(QWidget *widget, int timeout)
+ \since 5.0
+
+ Waits for \a timeout milliseconds or until the \a widget's window is exposed.
+ Returns \c true if \c widget's window is exposed within \a timeout milliseconds, otherwise returns \c false.
+
+ This is mainly useful for asynchronous systems like X11, where a window will be mapped to screen some
+ time after being asked to show itself on the screen.
+
+ \sa QTest::qWaitForWindowActive()
+*/
+
+/*! \fn bool QTest::qWaitForWindowActive(QWidget *widget, int timeout)
+ \since 5.0
+
+ Waits for \a timeout milliseconds or until the \a widget's window is active.
+
+ Returns \c true if \c widget's window is active within \a timeout milliseconds, otherwise returns \c false.
+
+ \sa QTest::qWaitForWindowExposed(), QWidget::isActiveWindow()
+*/
+
+/*! \fn bool QTest::qWaitForWindowShown(QWidget *widget, int timeout)
+ \since 5.0
+ \deprecated
+
+ Waits for \a timeout milliseconds or until the \a widget's window is exposed.
+ Returns \c true if \c widget's window is exposed within \a timeout milliseconds, otherwise returns \c false.
+
+ This function does the same as qWaitForWindowExposed().
+
+ Example:
+ \snippet code/src_qtestlib_qtestcase.cpp 24
+
+ \sa QTest::qWaitForWindowActive(), QTest::qWaitForWindowExposed()
+*/
+
+/*!
+ \class QTest::QTouchEventSequence
+ \inmodule QtTest
+ \since 4.6
+
+ \brief The QTouchEventSequence class is used to simulate a sequence of touch events.
+
+ To simulate a sequence of touch events on a specific device for a window or widget, call
+ QTest::touchEvent to create a QTouchEventSequence instance. Add touch events to
+ the sequence by calling press(), move(), release() and stationary(), and let the
+ instance run out of scope to commit the sequence to the event system.
+
+ Example:
+ \snippet code/src_qtestlib_qtestcase.cpp 25
+*/
+
+/*!
+ \fn QTest::QTouchEventSequence::~QTouchEventSequence()
+
+ Commits this sequence of touch events, unless autoCommit was disabled, and frees allocated resources.
+*/
+
+/*!
+ \fn void QTest::QTouchEventSequence::commit(bool processEvents)
+
+ Commits this sequence of touch events to the event system. Normally there is no need to call this
+ function because it is called from the destructor. However, if autoCommit is disabled, the events
+ only get committed upon explicitly calling this function.
+
+ In special cases tests may want to disable the processing of the events. This can be achieved by
+ setting \a processEvents to false. This results in merely queuing the events, the event loop will
+ not be forced to process them.
+*/
+
+/*!
+ \fn QTouchEventSequence &QTest::QTouchEventSequence::press(int touchId, const QPoint &pt, QWindow *window)
+ \since 5.0
+
+ Adds a press event for touchpoint \a touchId at position \a pt to this sequence and returns
+ a reference to this QTouchEventSequence.
+
+ The position \a pt is interpreted as relative to \a window. If \a window is the null pointer, then
+ \a pt is interpreted as relative to the window provided when instantiating this QTouchEventSequence.
+
+ Simulates that the user pressed the touch screen or pad with the finger identified by \a touchId.
+*/
+
+/*!
+ \fn QTouchEventSequence &QTest::QTouchEventSequence::press(int touchId, const QPoint &pt, QWidget *widget)
+
+ Adds a press event for touchpoint \a touchId at position \a pt to this sequence and returns
+ a reference to this QTouchEventSequence.
+
+ The position \a pt is interpreted as relative to \a widget. If \a widget is the null pointer, then
+ \a pt is interpreted as relative to the widget provided when instantiating this QTouchEventSequence.
+
+ Simulates that the user pressed the touch screen or pad with the finger identified by \a touchId.
+*/
+
+/*!
+ \fn QTouchEventSequence &QTest::QTouchEventSequence::move(int touchId, const QPoint &pt, QWindow *window)
+ \since 5.0
+
+ Adds a move event for touchpoint \a touchId at position \a pt to this sequence and returns
+ a reference to this QTouchEventSequence.
+
+ The position \a pt is interpreted as relative to \a window. If \a window is the null pointer, then
+ \a pt is interpreted as relative to the window provided when instantiating this QTouchEventSequence.
+
+ Simulates that the user moved the finger identified by \a touchId.
+*/
+
+/*!
+ \fn QTouchEventSequence &QTest::QTouchEventSequence::move(int touchId, const QPoint &pt, QWidget *widget)
+
+ Adds a move event for touchpoint \a touchId at position \a pt to this sequence and returns
+ a reference to this QTouchEventSequence.
+
+ The position \a pt is interpreted as relative to \a widget. If \a widget is the null pointer, then
+ \a pt is interpreted as relative to the widget provided when instantiating this QTouchEventSequence.
+
+ Simulates that the user moved the finger identified by \a touchId.
+*/
+
+/*!
+ \fn QTouchEventSequence &QTest::QTouchEventSequence::release(int touchId, const QPoint &pt, QWindow *window)
+ \since 5.0
+
+ Adds a release event for touchpoint \a touchId at position \a pt to this sequence and returns
+ a reference to this QTouchEventSequence.
+
+ The position \a pt is interpreted as relative to \a window. If \a window is the null pointer, then
+ \a pt is interpreted as relative to the window provided when instantiating this QTouchEventSequence.
+
+ Simulates that the user lifted the finger identified by \a touchId.
+*/
+
+/*!
+ \fn QTouchEventSequence &QTest::QTouchEventSequence::release(int touchId, const QPoint &pt, QWidget *widget)
+
+ Adds a release event for touchpoint \a touchId at position \a pt to this sequence and returns
+ a reference to this QTouchEventSequence.
+
+ The position \a pt is interpreted as relative to \a widget. If \a widget is the null pointer, then
+ \a pt is interpreted as relative to the widget provided when instantiating this QTouchEventSequence.
+
+ Simulates that the user lifted the finger identified by \a touchId.
+*/
+
+/*!
+ \fn QTouchEventSequence &QTest::QTouchEventSequence::stationary(int touchId)
+
+ Adds a stationary event for touchpoint \a touchId to this sequence and returns
+ a reference to this QTouchEventSequence.
+
+ Simulates that the user did not move the finger identified by \a touchId.
+*/
+
+/*!
+ \fn QTouchEventSequence QTest::touchEvent(QWindow *window, QTouchDevice *device, bool autoCommit)
+ \since 5.0
+
+ Creates and returns a QTouchEventSequence for the \a device to
+ simulate events for \a window.
+
+ When adding touch events to the sequence, \a window will also be used to translate
+ the position provided to screen coordinates, unless another window is provided in the
+ respective calls to press(), move() etc.
+
+ The touch events are committed to the event system when the destructor of the
+ QTouchEventSequence is called (ie when the object returned runs out of scope), unless
+ \a autoCommit is set to false. When \a autoCommit is false, commit() has to be called
+ manually.
+*/
+
+/*!
+ \fn QTouchEventSequence QTest::touchEvent(QWidget *widget, QTouchDevice *device, bool autoCommit)
+
+ Creates and returns a QTouchEventSequence for the \a device to
+ simulate events for \a widget.
+
+ When adding touch events to the sequence, \a widget will also be used to translate
+ the position provided to screen coordinates, unless another widget is provided in the
+ respective calls to press(), move() etc.
+
+ The touch events are committed to the event system when the destructor of the
+ QTouchEventSequence is called (ie when the object returned runs out of scope), unless
+ \a autoCommit is set to false. When \a autoCommit is false, commit() has to be called
+ manually.
+*/
+
+// Internals of qtestmouse.h:
+
+/*! \fn void QTest::waitForEvents()
+ \internal
+*/
+
+/*! \fn void QTest::mouseEvent(MouseAction action, QWidget *widget, Qt::MouseButton button, Qt::KeyboardModifiers stateKey, QPoint pos, int delay=-1)
+ \internal
+*/
+
+/*! \fn void QTest::mouseEvent(MouseAction action, QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey, QPoint pos, int delay=-1)
+ \internal
+*/
diff --git a/src/testlib/qxctestlogger.mm b/src/testlib/qxctestlogger.mm
index 34116a2670..1e9119c9c0 100644
--- a/src/testlib/qxctestlogger.mm
+++ b/src/testlib/qxctestlogger.mm
@@ -124,7 +124,7 @@ private:
if (![XCTestProbe isTesting])
return;
- if (!([NSDate timeIntervalSinceReferenceDate] > 0))
+ if (Q_UNLIKELY(!([NSDate timeIntervalSinceReferenceDate] > 0)))
qFatal("error: Device date '%s' is bad, likely set to update automatically. Please correct.",
[[NSDate date] description].UTF8String);
diff --git a/src/tools/moc/preprocessor.cpp b/src/tools/moc/preprocessor.cpp
index a2a1a958cf..a47896d722 100644
--- a/src/tools/moc/preprocessor.cpp
+++ b/src/tools/moc/preprocessor.cpp
@@ -154,6 +154,11 @@ bool Preprocessor::skipBranch()
Symbols Preprocessor::tokenize(const QByteArray& input, int lineNum, Preprocessor::TokenizeMode mode)
{
Symbols symbols;
+ // Preallocate some space to speed up the code below.
+ // The magic divisor value was found by calculating the average ratio between
+ // input size and the final size of symbols.
+ // This yielded a value of 16.x when compiling Qt Base.
+ symbols.reserve(input.size() / 16);
const char *begin = input.constData();
const char *data = begin;
while (*data) {
@@ -1217,6 +1222,10 @@ Symbols Preprocessor::preprocessed(const QByteArray &filename, QFile *file)
// phase 3: preprocess conditions and substitute macros
Symbols result;
+ // Preallocate some space to speed up the code below.
+ // The magic value was found by logging the final size
+ // and calculating an average when running moc over FOSS projects.
+ result.reserve(file->size() / 300000);
preprocess(filename, result);
mergeStringLiterals(&result);
diff --git a/src/tools/rcc/main.cpp b/src/tools/rcc/main.cpp
index d8d5728414..1405f19a3a 100644
--- a/src/tools/rcc/main.cpp
+++ b/src/tools/rcc/main.cpp
@@ -304,7 +304,7 @@ int main(int argc, char *argv[])
{
// rcc uses a QHash to store files in the resource system.
// we must force a certain hash order when testing or tst_rcc will fail, see QTBUG-25078
- if (!qEnvironmentVariableIsEmpty("QT_RCC_TEST") && !qt_qhash_seed.testAndSetRelaxed(-1, 0))
+ if (Q_UNLIKELY(!qEnvironmentVariableIsEmpty("QT_RCC_TEST") && !qt_qhash_seed.testAndSetRelaxed(-1, 0)))
qFatal("Cannot force QHash seed for testing as requested");
return QT_PREPEND_NAMESPACE(runRcc)(argc, argv);
diff --git a/src/widgets/accessible/itemviews.cpp b/src/widgets/accessible/itemviews.cpp
index 1b724c9a17..a7c1c75066 100644
--- a/src/widgets/accessible/itemviews.cpp
+++ b/src/widgets/accessible/itemviews.cpp
@@ -132,7 +132,7 @@ QAccessibleInterface *QAccessibleTable::cellAt(int row, int column) const
return 0;
Q_ASSERT(role() != QAccessible::Tree);
QModelIndex index = view()->model()->index(row, column, view()->rootIndex());
- if (!index.isValid()) {
+ if (Q_UNLIKELY(!index.isValid())) {
qWarning() << "QAccessibleTable::cellAt: invalid index: " << index << " for " << view();
return 0;
}
@@ -505,7 +505,7 @@ QAccessibleInterface *QAccessibleTable::child(int logicalIndex) const
if (!iface) {
QModelIndex index = view()->model()->index(row, column, view()->rootIndex());
- if (!index.isValid()) {
+ if (Q_UNLIKELY(!index.isValid())) {
qWarning() << "QAccessibleTable::child: Invalid index at: " << row << column;
return 0;
}
@@ -666,7 +666,7 @@ QModelIndex QAccessibleTree::indexFromLogical(int row, int column) const
return QModelIndex();
const QTreeView *treeView = qobject_cast<const QTreeView*>(view());
- if ((row < 0) || (column < 0) || (treeView->d_func()->viewItems.count() <= row)) {
+ if (Q_UNLIKELY(row < 0 || column < 0 || treeView->d_func()->viewItems.count() <= row)) {
qWarning() << "QAccessibleTree::indexFromLogical: invalid index: " << row << column << " for " << treeView;
return QModelIndex();
}
@@ -776,7 +776,7 @@ int QAccessibleTree::indexOfChild(const QAccessibleInterface *iface) const
QAccessibleInterface *QAccessibleTree::cellAt(int row, int column) const
{
QModelIndex index = indexFromLogical(row, column);
- if (!index.isValid()) {
+ if (Q_UNLIKELY(!index.isValid())) {
qWarning() << "Requested invalid tree cell: " << row << column;
return 0;
}
@@ -835,7 +835,7 @@ bool QAccessibleTree::selectRow(int row)
QAccessibleTableCell::QAccessibleTableCell(QAbstractItemView *view_, const QModelIndex &index_, QAccessible::Role role_)
: /* QAccessibleSimpleEditableTextInterface(this), */ view(view_), m_index(index_), m_role(role_)
{
- if (!index_.isValid())
+ if (Q_UNLIKELY(!index_.isValid()))
qWarning() << "QAccessibleTableCell::QAccessibleTableCell with invalid index: " << index_;
}
diff --git a/src/widgets/accessible/qaccessiblewidget.cpp b/src/widgets/accessible/qaccessiblewidget.cpp
index 3a9422cc26..e540980a14 100644
--- a/src/widgets/accessible/qaccessiblewidget.cpp
+++ b/src/widgets/accessible/qaccessiblewidget.cpp
@@ -53,10 +53,9 @@ QT_BEGIN_NAMESPACE
static QList<QWidget*> childWidgets(const QWidget *widget)
{
- QList<QObject*> list = widget->children();
QList<QWidget*> widgets;
- for (int i = 0; i < list.size(); ++i) {
- QWidget *w = qobject_cast<QWidget *>(list.at(i));
+ for (QObject *o : widget->children()) {
+ QWidget *w = qobject_cast<QWidget *>(o);
if (w && !w->isWindow()
&& !qobject_cast<QFocusFrame*>(w)
#if !defined(QT_NO_MENU)
@@ -77,9 +76,8 @@ static QString buddyString(const QWidget *widget)
if (!parent)
return QString();
#ifndef QT_NO_SHORTCUT
- QObjectList ol = parent->children();
- for (int i = 0; i < ol.size(); ++i) {
- QLabel *label = qobject_cast<QLabel*>(ol.at(i));
+ for (QObject *o : parent->children()) {
+ QLabel *label = qobject_cast<QLabel*>(o);
if (label && label->buddy() == widget)
return label->text();
}
@@ -274,7 +272,7 @@ public:
void QAccessibleWidget::addControllingSignal(const QString &signal)
{
QByteArray s = QMetaObject::normalizedSignature(signal.toLatin1());
- if (object()->metaObject()->indexOfSignal(s) < 0)
+ if (Q_UNLIKELY(object()->metaObject()->indexOfSignal(s) < 0))
qWarning("Signal %s unknown in %s", s.constData(), object()->metaObject()->className());
d->primarySignals << QLatin1String(s);
}
@@ -302,8 +300,8 @@ QAccessibleWidget::relations(QAccessible::Relation match /*= QAccessible::AllRel
// ideally we would go through all objects and check, but that
// will be too expensive
const QList<QWidget*> kids = childWidgets(parent);
- for (int i = 0; i < kids.count(); ++i) {
- if (QLabel *labelSibling = qobject_cast<QLabel*>(kids.at(i))) {
+ for (QWidget *kid : kids) {
+ if (QLabel *labelSibling = qobject_cast<QLabel*>(kid)) {
if (labelSibling->buddy() == widget()) {
QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(labelSibling);
rels.append(qMakePair(iface, rel));
diff --git a/src/widgets/accessible/qaccessiblewidgets.cpp b/src/widgets/accessible/qaccessiblewidgets.cpp
index adf908b821..9bbc01b5cc 100644
--- a/src/widgets/accessible/qaccessiblewidgets.cpp
+++ b/src/widgets/accessible/qaccessiblewidgets.cpp
@@ -71,10 +71,9 @@ QList<QWidget*> childWidgets(const QWidget *widget)
{
if (widget == 0)
return QList<QWidget*>();
- QList<QObject*> list = widget->children();
QList<QWidget*> widgets;
- for (int i = 0; i < list.size(); ++i) {
- QWidget *w = qobject_cast<QWidget *>(list.at(i));
+ for (QObject *o : widget->children()) {
+ QWidget *w = qobject_cast<QWidget *>(o);
if (!w)
continue;
QString objectName = w->objectName();
@@ -282,7 +281,7 @@ void QAccessibleTextEdit::scrollToSubstring(int startIndex, int endIndex)
r.y() + edit->verticalScrollBar()->value());
// E V I L, but ensureVisible is not public
- if (!QMetaObject::invokeMethod(edit, "_q_ensureVisible", Q_ARG(QRectF, r)))
+ if (Q_UNLIKELY(!QMetaObject::invokeMethod(edit, "_q_ensureVisible", Q_ARG(QRectF, r))))
qWarning("AccessibleTextEdit::scrollToSubstring failed!");
}
@@ -1056,10 +1055,9 @@ QAccessibleInterface *QAccessibleMainWindow::childAt(int x, int y) const
if (!QRect(gp.x(), gp.y(), w->width(), w->height()).contains(x, y))
return 0;
- QWidgetList kids = childWidgets(mainWindow());
+ const QWidgetList kids = childWidgets(mainWindow());
QPoint rp = mainWindow()->mapFromGlobal(QPoint(x, y));
- for (int i = 0; i < kids.size(); ++i) {
- QWidget *child = kids.at(i);
+ for (QWidget *child : kids) {
if (!child->isWindow() && !child->isHidden() && child->geometry().contains(rp)) {
return QAccessible::queryAccessibleInterface(child);
}
diff --git a/src/widgets/accessible/simplewidgets.cpp b/src/widgets/accessible/simplewidgets.cpp
index 065c618cf7..e77839cc12 100644
--- a/src/widgets/accessible/simplewidgets.cpp
+++ b/src/widgets/accessible/simplewidgets.cpp
@@ -570,8 +570,8 @@ QAccessibleGroupBox::relations(QAccessible::Relation match /* = QAccessible::All
if ((match & QAccessible::Labelled) && (!groupBox()->title().isEmpty())) {
const QList<QWidget*> kids = childWidgets(widget());
- for (int i = 0; i < kids.count(); ++i) {
- QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(kids.at(i));
+ for (QWidget *kid : kids) {
+ QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(kid);
if (iface)
rels.append(qMakePair(iface, QAccessible::Relation(QAccessible::Labelled)));
}
diff --git a/src/widgets/dialogs/qdialog.cpp b/src/widgets/dialogs/qdialog.cpp
index 5124960ab4..4ba26a90f7 100644
--- a/src/widgets/dialogs/qdialog.cpp
+++ b/src/widgets/dialogs/qdialog.cpp
@@ -516,7 +516,7 @@ int QDialog::exec()
{
Q_D(QDialog);
- if (d->eventLoop) {
+ if (Q_UNLIKELY(d->eventLoop)) {
qWarning("QDialog::exec: Recursive call detected");
return -1;
}
diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp
index bdfa27282f..62022e6ef2 100644
--- a/src/widgets/dialogs/qfiledialog.cpp
+++ b/src/widgets/dialogs/qfiledialog.cpp
@@ -976,7 +976,7 @@ void QFileDialog::setDirectoryUrl(const QUrl &directory)
d->setDirectory_sys(directory);
else if (directory.isLocalFile())
setDirectory(directory.toLocalFile());
- else if (d->usingWidgets())
+ else if (Q_UNLIKELY(d->usingWidgets()))
qWarning("Non-native QFileDialog supports only local files");
}
@@ -1104,7 +1104,7 @@ Q_AUTOTEST_EXPORT QString qt_tildeExpansion(const QString &path, bool *expanded
} else {
QString userName = tokens.first();
userName.remove(0, 1);
-#if defined(Q_OS_VXWORKS)
+#if defined(Q_OS_VXWORKS) || defined(Q_OS_INTEGRITY)
const QString homePath = QDir::homePath();
#elif defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_OPENBSD)
passwd pw;
@@ -1187,13 +1187,13 @@ QList<QUrl> QFileDialogPrivate::userSelectedFiles() const
const QModelIndexList selectedRows = qFileDialogUi->listView->selectionModel()->selectedRows();
files.reserve(selectedRows.size());
- foreach (const QModelIndex &index, selectedRows)
+ for (const QModelIndex &index : selectedRows)
files.append(QUrl::fromLocalFile(index.data(QFileSystemModel::FilePathRole).toString()));
if (files.isEmpty() && !lineEdit()->text().isEmpty()) {
const QStringList typedFilesList = typedFiles();
files.reserve(typedFilesList.size());
- foreach (const QString &path, typedFilesList)
+ for (const QString &path : typedFilesList)
files.append(QUrl::fromLocalFile(path));
}
@@ -1257,7 +1257,7 @@ QStringList QFileDialog::selectedFiles() const
QStringList files;
const QList<QUrl> userSelectedFiles = d->userSelectedFiles();
files.reserve(userSelectedFiles.size());
- foreach (const QUrl &file, userSelectedFiles)
+ for (const QUrl &file : userSelectedFiles)
files.append(file.toLocalFile());
if (files.isEmpty() && d->usingWidgets()) {
const FileMode fm = fileMode();
@@ -1284,7 +1284,7 @@ QList<QUrl> QFileDialog::selectedUrls() const
QList<QUrl> urls;
const QStringList selectedFileList = selectedFiles();
urls.reserve(selectedFileList.size());
- foreach (const QString &file, selectedFileList)
+ for (const QString &file : selectedFileList)
urls.append(QUrl::fromLocalFile(file));
return urls;
}
@@ -1554,7 +1554,7 @@ void QFileDialog::setMimeTypeFilters(const QStringList &filters)
{
Q_D(QFileDialog);
QStringList nameFilters;
- foreach (const QString &mimeType, filters) {
+ for (const QString &mimeType : filters) {
const QString text = nameFilterForMime(mimeType);
if (!text.isEmpty())
nameFilters.append(text);
@@ -2218,7 +2218,7 @@ QStringList QFileDialog::getOpenFileNames(QWidget *parent,
const QList<QUrl> selectedUrls = getOpenFileUrls(parent, caption, QUrl::fromLocalFile(dir), filter, selectedFilter, options, schemes);
QStringList fileNames;
fileNames.reserve(selectedUrls.size());
- foreach (const QUrl &url, selectedUrls)
+ for (const QUrl &url : selectedUrls)
fileNames << url.toLocalFile();
return fileNames;
}
@@ -2587,7 +2587,7 @@ void QFileDialog::accept()
return;
}
- QStringList files = selectedFiles();
+ const QStringList files = selectedFiles();
if (files.isEmpty())
return;
QString lineEditText = d->lineEdit()->text();
@@ -2657,10 +2657,10 @@ void QFileDialog::accept()
case ExistingFile:
case ExistingFiles:
- for (int i = 0; i < files.count(); ++i) {
- QFileInfo info(files.at(i));
+ for (const auto &file : files) {
+ QFileInfo info(file);
if (!info.exists())
- info = QFileInfo(d->getEnvironmentVariable(files.at(i)));
+ info = QFileInfo(d->getEnvironmentVariable(file));
if (!info.exists()) {
#ifndef QT_NO_MESSAGEBOX
QString message = tr("%1\nFile not found.\nPlease verify the "
@@ -2696,7 +2696,7 @@ void QFileDialogPrivate::saveSettings()
QStringList historyUrls;
const QStringList history = q->history();
historyUrls.reserve(history.size());
- foreach (const QString &path, history)
+ for (const QString &path : history)
historyUrls << QUrl::fromLocalFile(path).toString();
settings.setValue(QLatin1String("history"), historyUrls);
settings.setValue(QLatin1String("lastVisited"), lastVisitedDir()->toString());
@@ -2730,7 +2730,8 @@ bool QFileDialogPrivate::restoreFromSettings()
return true;
QStringList history;
- foreach (const QString &urlStr, settings.value(QLatin1String("history")).toStringList()) {
+ const auto urlStrings = settings.value(QLatin1String("history")).toStringList();
+ for (const QString &urlStr : urlStrings) {
QUrl url(urlStr);
if (url.isLocalFile())
history << url.toLocalFile();
@@ -2760,8 +2761,10 @@ bool QFileDialogPrivate::restoreWidgetState(QStringList &history, int splitterPo
}
qFileDialogUi->sidebar->setUrls(sidebarUrls);
- while (history.count() > 5)
- history.pop_front();
+
+ static const int MaxHistorySize = 5;
+ if (history.size() > MaxHistorySize)
+ history.erase(history.begin(), history.end() - MaxHistorySize);
q->setHistory(history);
QHeaderView *headerView = qFileDialogUi->treeView->header();
@@ -2998,7 +3001,8 @@ void QFileDialogPrivate::createWidgets()
q->setHistory(options->history());
if (options->initiallySelectedFiles().count() == 1)
q->selectFile(options->initiallySelectedFiles().first().fileName());
- foreach (const QUrl &url, options->initiallySelectedFiles())
+ const auto initiallySelectedFiles = options->initiallySelectedFiles();
+ for (const QUrl &url : initiallySelectedFiles)
q->selectUrl(url);
lineEdit()->selectAll();
_q_updateOkButton();
@@ -3442,15 +3446,13 @@ void QFileDialogPrivate::_q_autoCompleteFileName(const QString &text)
return;
}
- QStringList multipleFiles = typedFiles();
+ const QStringList multipleFiles = typedFiles();
if (multipleFiles.count() > 0) {
QModelIndexList oldFiles = qFileDialogUi->listView->selectionModel()->selectedRows();
QModelIndexList newFiles;
- for (int i = 0; i < multipleFiles.count(); ++i) {
- QModelIndex idx = model->index(multipleFiles.at(i));
- if (oldFiles.contains(idx))
- oldFiles.removeAll(idx);
- else
+ for (const auto &file : multipleFiles) {
+ QModelIndex idx = model->index(file);
+ if (oldFiles.removeAll(idx) == 0)
newFiles.append(idx);
}
for (int i = 0; i < newFiles.count(); ++i)
@@ -3477,7 +3479,7 @@ void QFileDialogPrivate::_q_updateOkButton()
bool enableButton = true;
bool isOpenDirectory = false;
- QStringList files = q->selectedFiles();
+ const QStringList files = q->selectedFiles();
QString lineEditText = lineEdit()->text();
if (lineEditText.startsWith(QLatin1String("//")) || lineEditText.startsWith(QLatin1Char('\\'))) {
@@ -3536,10 +3538,10 @@ void QFileDialogPrivate::_q_updateOkButton()
}
case QFileDialog::ExistingFile:
case QFileDialog::ExistingFiles:
- for (int i = 0; i < files.count(); ++i) {
- QModelIndex idx = model->index(files.at(i));
+ for (const auto &file : files) {
+ QModelIndex idx = model->index(file);
if (!idx.isValid())
- idx = model->index(getEnvironmentVariable(files.at(i)));
+ idx = model->index(getEnvironmentVariable(file));
if (!idx.isValid()) {
enableButton = false;
break;
@@ -3680,14 +3682,14 @@ void QFileDialogPrivate::_q_useNameFilter(int index)
void QFileDialogPrivate::_q_selectionChanged()
{
const QFileDialog::FileMode fileMode = q_func()->fileMode();
- QModelIndexList indexes = qFileDialogUi->listView->selectionModel()->selectedRows();
+ const QModelIndexList indexes = qFileDialogUi->listView->selectionModel()->selectedRows();
bool stripDirs = (fileMode != QFileDialog::DirectoryOnly && fileMode != QFileDialog::Directory);
QStringList allFiles;
- for (int i = 0; i < indexes.count(); ++i) {
- if (stripDirs && model->isDir(mapToSource(indexes.at(i))))
+ for (const auto &index : indexes) {
+ if (stripDirs && model->isDir(mapToSource(index)))
continue;
- allFiles.append(indexes.at(i).data().toString());
+ allFiles.append(index.data().toString());
}
if (allFiles.count() > 1)
for (int i = 0; i < allFiles.count(); ++i) {
@@ -3755,7 +3757,7 @@ void QFileDialogPrivate::_q_emitUrlsSelected(const QList<QUrl> &files)
Q_Q(QFileDialog);
emit q->urlsSelected(files);
QStringList localFiles;
- foreach (const QUrl &file, files)
+ for (const QUrl &file : files)
if (file.isLocalFile())
localFiles.append(file.toLocalFile());
if (!localFiles.isEmpty())
diff --git a/src/widgets/dialogs/qfileinfogatherer.cpp b/src/widgets/dialogs/qfileinfogatherer.cpp
index 92d6b8f3be..d99e3df802 100644
--- a/src/widgets/dialogs/qfileinfogatherer.cpp
+++ b/src/widgets/dialogs/qfileinfogatherer.cpp
@@ -282,8 +282,8 @@ void QFileInfoGatherer::getFileInfos(const QString &path, const QStringList &fil
infoList = QDir::drives();
} else {
infoList.reserve(files.count());
- for (int i = 0; i < files.count(); ++i)
- infoList << QFileInfo(files.at(i));
+ for (const auto &file : files)
+ infoList << QFileInfo(file);
}
for (int i = infoList.count() - 1; i >= 0; --i) {
QString driveName = translateDriveName(infoList.at(i));
diff --git a/src/widgets/dialogs/qfilesystemmodel.cpp b/src/widgets/dialogs/qfilesystemmodel.cpp
index d23737f130..90d7db7bd1 100644
--- a/src/widgets/dialogs/qfilesystemmodel.cpp
+++ b/src/widgets/dialogs/qfilesystemmodel.cpp
@@ -258,6 +258,21 @@ QModelIndex QFileSystemModel::index(int row, int column, const QModelIndex &pare
}
/*!
+ \reimp
+*/
+QModelIndex QFileSystemModel::sibling(int row, int column, const QModelIndex &idx) const
+{
+ if (row == idx.row() && column < QFileSystemModelPrivate::NumColumns) {
+ // cheap sibling operation: just adjust the column:
+ return createIndex(row, column, idx.internalPointer());
+ } else {
+ // for anything else: call the default implementation
+ // (this could probably be optimized, too):
+ return QAbstractItemModel::sibling(row, column, idx);
+ }
+}
+
+/*!
\overload
Returns the model item index for the given \a path and \a column.
@@ -1548,10 +1563,9 @@ void QFileSystemModel::setNameFilters(const QStringList &filters)
d->bypassFilters.clear();
// We guarantee that rootPath will stick around
QPersistentModelIndex root(index(rootPath()));
- QModelIndexList persistantList = persistentIndexList();
- for (int i = 0; i < persistantList.count(); ++i) {
- QFileSystemModelPrivate::QFileSystemNode *node;
- node = d->node(persistantList.at(i));
+ const QModelIndexList persistentList = persistentIndexList();
+ for (const auto &persistentIndex : persistentList) {
+ QFileSystemModelPrivate::QFileSystemNode *node = d->node(persistentIndex);
while (node) {
if (d->bypassFilters.contains(node))
break;
@@ -1565,9 +1579,8 @@ void QFileSystemModel::setNameFilters(const QStringList &filters)
d->nameFilters.clear();
const Qt::CaseSensitivity caseSensitive =
(filter() & QDir::CaseSensitive) ? Qt::CaseSensitive : Qt::CaseInsensitive;
- for (int i = 0; i < filters.size(); ++i) {
- d->nameFilters << QRegExp(filters.at(i), caseSensitive, QRegExp::Wildcard);
- }
+ for (const auto &filter : filters)
+ d->nameFilters << QRegExp(filter, caseSensitive, QRegExp::Wildcard);
d->forceSort = true;
d->delayedSort();
#endif
@@ -1723,9 +1736,9 @@ void QFileSystemModelPrivate::addVisibleFiles(QFileSystemNode *parentNode, const
if (parentNode->dirtyChildrenIndex == -1)
parentNode->dirtyChildrenIndex = parentNode->visibleChildren.count();
- for (int i = 0; i < newFiles.count(); ++i) {
- parentNode->visibleChildren.append(newFiles.at(i));
- parentNode->children.value(newFiles.at(i))->isVisible = true;
+ for (const auto &newFile : newFiles) {
+ parentNode->visibleChildren.append(newFile);
+ parentNode->children.value(newFile)->isVisible = true;
}
if (!indexHidden)
q->endInsertRows();
@@ -1768,10 +1781,10 @@ void QFileSystemModelPrivate::_q_fileSystemChanged(const QString &path, const QV
QStringList newFiles;
QFileSystemModelPrivate::QFileSystemNode *parentNode = node(path, false);
QModelIndex parentIndex = index(parentNode);
- for (int i = 0; i < updates.count(); ++i) {
- QString fileName = updates.at(i).first;
+ for (const auto &update : updates) {
+ QString fileName = update.first;
Q_ASSERT(!fileName.isEmpty());
- QExtendedInformation info = fileInfoGatherer.getInfo(updates.at(i).second);
+ QExtendedInformation info = fileInfoGatherer.getInfo(update.second);
bool previouslyHere = parentNode->children.contains(fileName);
if (!previouslyHere) {
addNode(parentNode, fileName, info.fileInfo());
@@ -1956,8 +1969,8 @@ bool QFileSystemModelPrivate::passNameFilters(const QFileSystemNode *node) const
// Check the name regularexpression filters
if (!(node->isDir() && (filters & QDir::AllDirs))) {
- for (int i = 0; i < nameFilters.size(); ++i) {
- QRegExp copy = nameFilters.at(i);
+ for (const auto &nameFilter : nameFilters) {
+ QRegExp copy = nameFilter;
if (copy.exactMatch(node->fileName))
return true;
}
diff --git a/src/widgets/dialogs/qfilesystemmodel.h b/src/widgets/dialogs/qfilesystemmodel.h
index 515417f225..51c01220a2 100644
--- a/src/widgets/dialogs/qfilesystemmodel.h
+++ b/src/widgets/dialogs/qfilesystemmodel.h
@@ -75,6 +75,7 @@ public:
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
QModelIndex index(const QString &path, int column = 0) const;
QModelIndex parent(const QModelIndex &child) const Q_DECL_OVERRIDE;
+ QModelIndex sibling(int row, int column, const QModelIndex &idx) const Q_DECL_OVERRIDE;
bool hasChildren(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
bool canFetchMore(const QModelIndex &parent) const Q_DECL_OVERRIDE;
void fetchMore(const QModelIndex &parent) Q_DECL_OVERRIDE;
diff --git a/src/widgets/dialogs/qfontdialog.cpp b/src/widgets/dialogs/qfontdialog.cpp
index 688e8f5c13..659a311d34 100644
--- a/src/widgets/dialogs/qfontdialog.cpp
+++ b/src/widgets/dialogs/qfontdialog.cpp
@@ -481,7 +481,8 @@ void QFontDialogPrivate::updateFamilies()
QFontDatabase fdb;
QStringList familyNames;
- foreach (const QString &family, fdb.families(writingSystem)) {
+ const auto families = fdb.families(writingSystem);
+ for (const QString &family : families) {
if (fdb.isPrivateFamily(family))
continue;
diff --git a/src/widgets/dialogs/qmessagebox.cpp b/src/widgets/dialogs/qmessagebox.cpp
index 8a48100ea7..704883b5c6 100644
--- a/src/widgets/dialogs/qmessagebox.cpp
+++ b/src/widgets/dialogs/qmessagebox.cpp
@@ -89,16 +89,14 @@ public:
{
public:
TextEdit(QWidget *parent=0) : QTextEdit(parent) { }
+#ifndef QT_NO_CONTEXTMENU
void contextMenuEvent(QContextMenuEvent * e) Q_DECL_OVERRIDE
{
-#ifndef QT_NO_CONTEXTMENU
QMenu *menu = createStandardContextMenu();
menu->setAttribute(Qt::WA_DeleteOnClose);
menu->popup(e->globalPos());
-#else
- Q_UNUSED(e);
-#endif
}
+#endif // QT_NO_CONTEXTMENU
};
QMessageBoxDetailsText(QWidget *parent=0)
@@ -1049,26 +1047,26 @@ void QMessageBoxPrivate::detectEscapeButton()
}
// if the message box has one RejectRole button, make it the escape button
- for (int i = 0; i < buttons.count(); i++) {
- if (buttonBox->buttonRole(buttons.at(i)) == QDialogButtonBox::RejectRole) {
+ for (auto *button : buttons) {
+ if (buttonBox->buttonRole(button) == QDialogButtonBox::RejectRole) {
if (detectedEscapeButton) { // already detected!
detectedEscapeButton = 0;
break;
}
- detectedEscapeButton = buttons.at(i);
+ detectedEscapeButton = button;
}
}
if (detectedEscapeButton)
return;
// if the message box has one NoRole button, make it the escape button
- for (int i = 0; i < buttons.count(); i++) {
- if (buttonBox->buttonRole(buttons.at(i)) == QDialogButtonBox::NoRole) {
+ for (auto *button : buttons) {
+ if (buttonBox->buttonRole(button) == QDialogButtonBox::NoRole) {
if (detectedEscapeButton) { // already detected!
detectedEscapeButton = 0;
break;
}
- detectedEscapeButton = buttons.at(i);
+ detectedEscapeButton = button;
}
}
}
@@ -1480,24 +1478,21 @@ void QMessageBox::keyPressEvent(QKeyEvent *e)
#if defined(Q_OS_WIN)
if (e == QKeySequence::Copy) {
- QString separator = QString::fromLatin1("---------------------------\n");
- QString textToCopy = separator;
- separator.prepend(QLatin1Char('\n'));
- textToCopy += windowTitle() + separator; // title
- textToCopy += d->label->text() + separator; // text
+ const QLatin1String separator("---------------------------\n");
+ QString textToCopy;
+ textToCopy += separator + windowTitle() + QLatin1Char('\n') + separator // title
+ + d->label->text() + QLatin1Char('\n') + separator; // text
if (d->informativeLabel)
- textToCopy += d->informativeLabel->text() + separator;
+ textToCopy += d->informativeLabel->text() + QLatin1Char('\n') + separator;
- QString buttonTexts;
- QList<QAbstractButton *> buttons = d->buttonBox->buttons();
- for (int i = 0; i < buttons.count(); i++) {
- buttonTexts += buttons[i]->text() + QLatin1String(" ");
- }
- textToCopy += buttonTexts + separator;
+ const QList<QAbstractButton *> buttons = d->buttonBox->buttons();
+ for (const auto *button : buttons)
+ textToCopy += button->text() + QLatin1String(" ");
+ textToCopy += QLatin1Char('\n') + separator;
#ifndef QT_NO_TEXTEDIT
if (d->detailsText)
- textToCopy += d->detailsText->text() + separator;
+ textToCopy += d->detailsText->text() + QLatin1Char('\n') + separator;
#endif
QApplication::clipboard()->setText(textToCopy);
return;
@@ -1511,8 +1506,7 @@ void QMessageBox::keyPressEvent(QKeyEvent *e)
int key = e->key() & ~Qt::MODIFIER_MASK;
if (key) {
const QList<QAbstractButton *> buttons = d->buttonBox->buttons();
- for (int i = 0; i < buttons.count(); ++i) {
- QAbstractButton *pb = buttons.at(i);
+ for (auto *pb : buttons) {
QKeySequence shortcut = pb->shortcut();
if (!shortcut.isEmpty() && key == int(shortcut[0] & ~Qt::MODIFIER_MASK)) {
pb->animateClick();
diff --git a/src/widgets/dialogs/qprogressdialog.cpp b/src/widgets/dialogs/qprogressdialog.cpp
index bbb251c8b2..619d0051ea 100644
--- a/src/widgets/dialogs/qprogressdialog.cpp
+++ b/src/widgets/dialogs/qprogressdialog.cpp
@@ -353,7 +353,7 @@ void QProgressDialog::setLabel(QLabel *label)
{
Q_D(QProgressDialog);
if (label == d->label) {
- if (label)
+ if (Q_UNLIKELY(label))
qWarning("QProgressDialog::setLabel: Attempt to set the same label again");
return;
}
@@ -402,7 +402,7 @@ void QProgressDialog::setCancelButton(QPushButton *cancelButton)
{
Q_D(QProgressDialog);
if (d->cancel == cancelButton) {
- if (cancelButton)
+ if (Q_UNLIKELY(cancelButton))
qWarning("QProgressDialog::setCancelButton: Attempt to set the same button again");
return;
}
@@ -465,16 +465,16 @@ void QProgressDialogPrivate::setCancelButtonText(const QString &cancelButtonText
void QProgressDialog::setBar(QProgressBar *bar)
{
Q_D(QProgressDialog);
- if (!bar) {
+ if (Q_UNLIKELY(!bar)) {
qWarning("QProgressDialog::setBar: Cannot set a null progress bar");
return;
}
#ifndef QT_NO_DEBUG
- if (value() > 0)
+ if (Q_UNLIKELY(value() > 0))
qWarning("QProgressDialog::setBar: Cannot set a new progress bar "
"while the old one is active");
#endif
- if (bar == d->bar) {
+ if (Q_UNLIKELY(bar == d->bar)) {
qWarning("QProgressDialog::setBar: Attempt to set the same progress bar again");
return;
}
diff --git a/src/widgets/dialogs/qsidebar.cpp b/src/widgets/dialogs/qsidebar.cpp
index f883705cc3..58a92800f4 100644
--- a/src/widgets/dialogs/qsidebar.cpp
+++ b/src/widgets/dialogs/qsidebar.cpp
@@ -103,9 +103,9 @@ Qt::ItemFlags QUrlModel::flags(const QModelIndex &index) const
QMimeData *QUrlModel::mimeData(const QModelIndexList &indexes) const
{
QList<QUrl> list;
- for (int i = 0; i < indexes.count(); ++i) {
- if (indexes.at(i).column() == 0)
- list.append(indexes.at(i).data(UrlRole).toUrl());
+ for (const auto &index : indexes) {
+ if (index.column() == 0)
+ list.append(index.data(UrlRole).toUrl());
}
QMimeData *data = new QMimeData();
data->setUrls(list);
@@ -125,8 +125,8 @@ bool QUrlModel::canDrop(QDragEnterEvent *event)
return false;
const QList<QUrl> list = event->mimeData()->urls();
- for (int i = 0; i < list.count(); ++i) {
- QModelIndex idx = fileSystemModel->index(list.at(0).toLocalFile());
+ for (const auto &url : list) {
+ const QModelIndex idx = fileSystemModel->index(url.toLocalFile());
if (!fileSystemModel->isDir(idx))
return false;
}
diff --git a/src/widgets/dialogs/qwizard.cpp b/src/widgets/dialogs/qwizard.cpp
index b9906f13da..6add83e135 100644
--- a/src/widgets/dialogs/qwizard.cpp
+++ b/src/widgets/dialogs/qwizard.cpp
@@ -799,8 +799,8 @@ void QWizardPrivate::addField(const QWizardField &field)
QWizardField myField = field;
myField.resolve(defaultPropertyTable);
- if (fieldIndexMap.contains(myField.name)) {
- qWarning("QWizardPage::addField: Duplicate field '%s'", qPrintable(myField.name));
+ if (Q_UNLIKELY(fieldIndexMap.contains(myField.name))) {
+ qWarning("QWizardPage::addField: Duplicate field '%ls'", qUtf16Printable(myField.name));
return;
}
@@ -2256,17 +2256,17 @@ void QWizard::setPage(int theid, QWizardPage *page)
{
Q_D(QWizard);
- if (!page) {
+ if (Q_UNLIKELY(!page)) {
qWarning("QWizard::setPage: Cannot insert null page");
return;
}
- if (theid == -1) {
+ if (Q_UNLIKELY(theid == -1)) {
qWarning("QWizard::setPage: Cannot insert page with ID -1");
return;
}
- if (d->pageMap.contains(theid)) {
+ if (Q_UNLIKELY(d->pageMap.contains(theid))) {
qWarning("QWizard::setPage: Page with duplicate ID %d ignored", theid);
return;
}
@@ -2450,7 +2450,7 @@ void QWizard::setStartId(int theid)
return;
}
- if (!d->pageMap.contains(newStart)) {
+ if (Q_UNLIKELY(!d->pageMap.contains(newStart))) {
qWarning("QWizard::setStartId: Invalid page ID %d", newStart);
return;
}
@@ -2508,15 +2508,15 @@ void QWizard::setField(const QString &name, const QVariant &value)
Q_D(QWizard);
int index = d->fieldIndexMap.value(name, -1);
- if (index != -1) {
- const QWizardField &field = d->fields.at(index);
- if (!field.object->setProperty(field.property, value))
- qWarning("QWizard::setField: Couldn't write to property '%s'",
- field.property.constData());
+ if (Q_UNLIKELY(index == -1)) {
+ qWarning("QWizard::setField: No such field '%ls'", qUtf16Printable(name));
return;
}
- qWarning("QWizard::setField: No such field '%s'", qPrintable(name));
+ const QWizardField &field = d->fields.at(index);
+ if (Q_UNLIKELY(!field.object->setProperty(field.property, value)))
+ qWarning("QWizard::setField: Couldn't write to property '%s'",
+ field.property.constData());
}
/*!
@@ -2531,13 +2531,13 @@ QVariant QWizard::field(const QString &name) const
Q_D(const QWizard);
int index = d->fieldIndexMap.value(name, -1);
- if (index != -1) {
- const QWizardField &field = d->fields.at(index);
- return field.object->property(field.property);
+ if (Q_UNLIKELY(index == -1)) {
+ qWarning("QWizard::field: No such field '%ls'", qUtf16Printable(name));
+ return QVariant();
}
- qWarning("QWizard::field: No such field '%s'", qPrintable(name));
- return QVariant();
+ const QWizardField &field = d->fields.at(index);
+ return field.object->property(field.property);
}
/*!
@@ -2763,7 +2763,7 @@ void QWizard::setButtonLayout(const QList<WizardButton> &layout)
// O(n^2), but n is very small
for (int j = 0; j < i; ++j) {
WizardButton button2 = layout.at(j);
- if (button2 == button1) {
+ if (Q_UNLIKELY(button2 == button1)) {
qWarning("QWizard::setButtonLayout: Duplicate button in layout");
return;
}
@@ -3140,11 +3140,11 @@ void QWizard::next()
if (validateCurrentPage()) {
int next = nextId();
if (next != -1) {
- if (d->history.contains(next)) {
+ if (Q_UNLIKELY(d->history.contains(next))) {
qWarning("QWizard::next: Page %d already met", next);
return;
}
- if (!d->pageMap.contains(next)) {
+ if (Q_UNLIKELY(!d->pageMap.contains(next))) {
qWarning("QWizard::next: No such page %d", next);
return;
}
@@ -3622,9 +3622,8 @@ void QWizardPage::cleanupPage()
{
Q_D(QWizardPage);
if (d->wizard) {
- QVector<QWizardField> &fields = d->wizard->d_func()->fields;
- for (int i = 0; i < fields.count(); ++i) {
- const QWizardField &field = fields.at(i);
+ const QVector<QWizardField> &fields = d->wizard->d_func()->fields;
+ for (const auto &field : fields) {
if (field.page == this)
field.object->setProperty(field.property, field.initialValue);
}
diff --git a/src/widgets/doc/images/gtk-calendarwidget.png b/src/widgets/doc/images/gtk-calendarwidget.png
deleted file mode 100644
index 568cd1a5da..0000000000
--- a/src/widgets/doc/images/gtk-calendarwidget.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-checkbox.png b/src/widgets/doc/images/gtk-checkbox.png
deleted file mode 100644
index 1fd5fc77bf..0000000000
--- a/src/widgets/doc/images/gtk-checkbox.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-combobox.png b/src/widgets/doc/images/gtk-combobox.png
deleted file mode 100644
index 3b4544df13..0000000000
--- a/src/widgets/doc/images/gtk-combobox.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-dateedit.png b/src/widgets/doc/images/gtk-dateedit.png
deleted file mode 100644
index 25229f0b3b..0000000000
--- a/src/widgets/doc/images/gtk-dateedit.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-datetimeedit.png b/src/widgets/doc/images/gtk-datetimeedit.png
deleted file mode 100644
index 0c934a4d0d..0000000000
--- a/src/widgets/doc/images/gtk-datetimeedit.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-dial.png b/src/widgets/doc/images/gtk-dial.png
deleted file mode 100644
index 18e14b3650..0000000000
--- a/src/widgets/doc/images/gtk-dial.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-doublespinbox.png b/src/widgets/doc/images/gtk-doublespinbox.png
deleted file mode 100644
index 3a69043c0b..0000000000
--- a/src/widgets/doc/images/gtk-doublespinbox.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-fontcombobox.png b/src/widgets/doc/images/gtk-fontcombobox.png
deleted file mode 100644
index 4cb1bc1343..0000000000
--- a/src/widgets/doc/images/gtk-fontcombobox.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-frame.png b/src/widgets/doc/images/gtk-frame.png
deleted file mode 100644
index c1bf52f6a6..0000000000
--- a/src/widgets/doc/images/gtk-frame.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-groupbox.png b/src/widgets/doc/images/gtk-groupbox.png
deleted file mode 100644
index 6d217c89f9..0000000000
--- a/src/widgets/doc/images/gtk-groupbox.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-horizontalscrollbar.png b/src/widgets/doc/images/gtk-horizontalscrollbar.png
deleted file mode 100644
index 2887730c13..0000000000
--- a/src/widgets/doc/images/gtk-horizontalscrollbar.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-label.png b/src/widgets/doc/images/gtk-label.png
deleted file mode 100644
index 006d0133d8..0000000000
--- a/src/widgets/doc/images/gtk-label.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-lcdnumber.png b/src/widgets/doc/images/gtk-lcdnumber.png
deleted file mode 100644
index 142d298ffc..0000000000
--- a/src/widgets/doc/images/gtk-lcdnumber.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-lineedit.png b/src/widgets/doc/images/gtk-lineedit.png
deleted file mode 100644
index 8fb513c39f..0000000000
--- a/src/widgets/doc/images/gtk-lineedit.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-listview.png b/src/widgets/doc/images/gtk-listview.png
deleted file mode 100644
index d32f8e8aee..0000000000
--- a/src/widgets/doc/images/gtk-listview.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-progressbar.png b/src/widgets/doc/images/gtk-progressbar.png
deleted file mode 100644
index 6162484bf3..0000000000
--- a/src/widgets/doc/images/gtk-progressbar.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-pushbutton.png b/src/widgets/doc/images/gtk-pushbutton.png
deleted file mode 100644
index f4f4d7c1e4..0000000000
--- a/src/widgets/doc/images/gtk-pushbutton.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-radiobutton.png b/src/widgets/doc/images/gtk-radiobutton.png
deleted file mode 100644
index b3620fa054..0000000000
--- a/src/widgets/doc/images/gtk-radiobutton.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-slider.png b/src/widgets/doc/images/gtk-slider.png
deleted file mode 100644
index 3d8e0ee89e..0000000000
--- a/src/widgets/doc/images/gtk-slider.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-spinbox.png b/src/widgets/doc/images/gtk-spinbox.png
deleted file mode 100644
index a39eb3aa93..0000000000
--- a/src/widgets/doc/images/gtk-spinbox.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-tableview.png b/src/widgets/doc/images/gtk-tableview.png
deleted file mode 100644
index a025193188..0000000000
--- a/src/widgets/doc/images/gtk-tableview.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-tabwidget.png b/src/widgets/doc/images/gtk-tabwidget.png
deleted file mode 100644
index 089c76dad2..0000000000
--- a/src/widgets/doc/images/gtk-tabwidget.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-textedit.png b/src/widgets/doc/images/gtk-textedit.png
deleted file mode 100644
index e4b91c01c9..0000000000
--- a/src/widgets/doc/images/gtk-textedit.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-timeedit.png b/src/widgets/doc/images/gtk-timeedit.png
deleted file mode 100644
index acf6730a86..0000000000
--- a/src/widgets/doc/images/gtk-timeedit.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-toolbox.png b/src/widgets/doc/images/gtk-toolbox.png
deleted file mode 100644
index 25e6137699..0000000000
--- a/src/widgets/doc/images/gtk-toolbox.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-toolbutton.png b/src/widgets/doc/images/gtk-toolbutton.png
deleted file mode 100644
index f0eb86efc5..0000000000
--- a/src/widgets/doc/images/gtk-toolbutton.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-treeview.png b/src/widgets/doc/images/gtk-treeview.png
deleted file mode 100644
index 7b4e3044be..0000000000
--- a/src/widgets/doc/images/gtk-treeview.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/snippets/code/doc_src_stylesheet.cpp b/src/widgets/doc/snippets/code/doc_src_stylesheet.cpp
index a937498fe5..01f4c528a2 100644
--- a/src/widgets/doc/snippets/code/doc_src_stylesheet.cpp
+++ b/src/widgets/doc/snippets/code/doc_src_stylesheet.cpp
@@ -138,3 +138,7 @@ emailEdit->setProperty("mandatoryField", true);
QSpinBox *ageSpinBox = new QSpinBox(this);
ageSpinBox->setProperty("mandatoryField", true);
//! [95]
+
+//! [96]
+qApp->setAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles, true);
+//! [97]
diff --git a/src/widgets/doc/snippets/macmainwindow.mm b/src/widgets/doc/snippets/macmainwindow.mm
index d0d74631ab..17aff45fa0 100644
--- a/src/widgets/doc/snippets/macmainwindow.mm
+++ b/src/widgets/doc/snippets/macmainwindow.mm
@@ -31,7 +31,7 @@
**
****************************************************************************/
#include "macmainwindow.h"
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#include <QtGui>
diff --git a/src/widgets/doc/snippets/qmacnativewidget/main.mm b/src/widgets/doc/snippets/qmacnativewidget/main.mm
index e541aac1f8..38701917c0 100644
--- a/src/widgets/doc/snippets/qmacnativewidget/main.mm
+++ b/src/widgets/doc/snippets/qmacnativewidget/main.mm
@@ -40,7 +40,7 @@
#include <QtGui/QtGui>
#include <QtGui/qmacnativewidget_mac.h>
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
int main(int argc, char **argv)
{
diff --git a/src/widgets/doc/snippets/styles/qcustompixmapstyle.cpp b/src/widgets/doc/snippets/styles/qcustompixmapstyle.cpp
new file mode 100644
index 0000000000..361b19f0e2
--- /dev/null
+++ b/src/widgets/doc/snippets/styles/qcustompixmapstyle.cpp
@@ -0,0 +1,85 @@
+/***************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qcustompixmapstyle.h"
+
+#include <QtGui>
+
+//! [0]
+QCustomPixmapStyle::QCustomPixmapStyle() :
+ QPixmapStyle()
+{
+//! [1]
+ addDescriptor(PB_Enabled,
+ QLatin1String("://button/core_button_inactive.png"),
+ QMargins(13, 13, 13, 13),
+ QTileRules(Qt::RepeatTile, Qt::StretchTile));
+//! [1]
+ addDescriptor(PB_Checked,
+ QLatin1String("://button/core_button_enabled_selected.png"),
+ QMargins(13, 13, 13, 13),
+ QTileRules(Qt::RepeatTile, Qt::StretchTile));
+ addDescriptor(PB_Pressed,
+ QLatin1String("://button/core_button_pressed.png"),
+ QMargins(13, 13, 13, 13),
+ QTileRules(Qt::RepeatTile, Qt::StretchTile));
+ addDescriptor(PB_Disabled,
+ QLatin1String("://button/core_button_disabled.png"),
+ QMargins(13, 13, 13, 13),
+ QTileRules(Qt::RepeatTile, Qt::StretchTile));
+ addDescriptor(PB_PressedDisabled,
+ QLatin1String("://button/core_button_disabled_selected.png"),
+ QMargins(13, 13, 13, 13),
+ QTileRules(Qt::RepeatTile, Qt::StretchTile));
+
+//! [2]
+ addDescriptor(LE_Enabled,
+ QLatin1String("://lineedit/core_textinput_bg.png"),
+ QMargins(8, 8, 8, 8));
+ addDescriptor(LE_Disabled,
+ QLatin1String("://lineedit/core_textinput_bg_disabled.png"),
+ QMargins(8, 8, 8, 8));
+ addDescriptor(LE_Focused,
+ QLatin1String("://lineedit/core_textinput_bg_highlight.png"),
+ QMargins(8, 8, 8, 8));
+
+ copyDescriptor(LE_Enabled, TE_Enabled);
+ copyDescriptor(LE_Disabled, TE_Disabled);
+ copyDescriptor(LE_Focused, TE_Focused);
+//! [2]
+}
+//! [0]
+
+QCustomPixmapStyle::~QCustomPixmapStyle()
+{
+}
diff --git a/src/widgets/doc/src/widgets-and-layouts/gallery-gtk.qdoc b/src/widgets/doc/src/widgets-and-layouts/gallery-gtk.qdoc
deleted file mode 100644
index 5c3ae8cb97..0000000000
--- a/src/widgets/doc/src/widgets-and-layouts/gallery-gtk.qdoc
+++ /dev/null
@@ -1,142 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page gallery-gtk.html
-
- \title GTK Style Widget Gallery
- \ingroup gallery
-
- This page shows some of the widgets available in Qt
- when configured to use the "gtk" style. This style is
- only available on desktop environments with GTK runtime
- support. This style provides native look'n'feel by
- integrating to the GTK platform theme. Thus, the final
- appearance varies depending on the active GTK theme.
-
-\section2 Buttons
-
-\table 100%
-\row
-\li \image gtk-pushbutton.png
- \caption The QPushButton widget provides a command button.
-\li \image gtk-toolbutton.png
- \caption The QToolButton class provides a quick-access button to commands
- or options, usually used inside a QToolBar.
-\endtable
-
-\table 100%
-\row
-\li \image gtk-checkbox.png
- \caption The QCheckBox widget provides a checkbox with a text label.
-\li \image gtk-radiobutton.png
- \caption The QRadioButton widget provides a radio button with a text or pixmap label.
-\endtable
-
-\section2 Containers
-
-\table 100%
-\row
-\li \image gtk-groupbox.png
- The QGroupBox widget provides a group box frame with a title.
-\li \image gtk-tabwidget.png
- The QTabWidget class provides a stack of tabbed widgets.
-\li \image gtk-frame.png
- The QFrame widget provides a simple decorated container for other widgets.
-\li \image gtk-toolbox.png
- The QToolBox class provides a column of tabbed widget items.
-\endtable
-
-\section2 Item Views
-
-\table 100%
-\row
-\li \image gtk-listview.png
- The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.
-\li \image gtk-treeview.png
- The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.
-\li \image gtk-tableview.png
- The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\li
-\li
-\endtable
-
-\section2 Display Widgets
-
-\table 100%
-\row
-\li \image gtk-progressbar.png
- The QProgressBar widget provides a horizontal progress bar.
-\li \image gtk-label.png
- The QLabel widget provides a text or image display.
-\li \image gtk-lcdnumber.png
- The QLCDNumber widget displays a number with LCD-like digits.
-\endtable
-
-\section2 Input Widgets
-
-\table 100%
-\row
-\li \image gtk-lineedit.png
- The QLineEdit widget is a one-line text editor.
-\li \image gtk-dateedit.png
- The QDateEdit class provides a widget for editing dates.
-\li \image gtk-timeedit.png
- The QTimeEdit class provides a widget for editing times.
-\li \image gtk-datetimeedit.png
- The QDateTimeEdit class provides a widget for editing dates and times.
-\endtable
-
-\table 100%
-\row
-\li \image gtk-slider.png
- The QSlider widget provides a vertical or horizontal slider.
-\li \image gtk-combobox.png
- The QComboBox widget is a combined button and pop-up list.
-\li \image gtk-spinbox.png
- The QSpinBox class provides a spin box widget.
-\endtable
-
-\table 100%
-\row
-\li \image gtk-fontcombobox.png
- The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.
-\li \image gtk-doublespinbox.png
- The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.
-\li \image gtk-horizontalscrollbar.png
- The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.
-\endtable
-
-\table 100%
-\row
-\li \image gtk-dial.png
- The QDial class provides a rounded range control (like a speedometer or potentiometer).
-\li \image gtk-textedit.png
- The QTextEdit class provides a widget that is used to edit and display both plain and rich text.
-\li \image gtk-calendarwidget.png
- The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.
-\endtable
-*/
diff --git a/src/widgets/doc/src/widgets-and-layouts/gallery.qdoc b/src/widgets/doc/src/widgets-and-layouts/gallery.qdoc
index cc6446b8a5..c32eceb558 100644
--- a/src/widgets/doc/src/widgets-and-layouts/gallery.qdoc
+++ b/src/widgets/doc/src/widgets-and-layouts/gallery.qdoc
@@ -54,10 +54,6 @@
\caption \l{Macintosh Style Widget Gallery}
The Macintosh style is provided by QMacStyle.
- \li \image gtk-tabwidget.png GTK Style Widget Gallery
- \caption \l{GTK Style Widget Gallery}
-
- The GTK style is provided by QGtkStyle.
\li \image fusion-tabwidget.png Fusion Style Widget Gallery
\caption \l{Fusion Style Widget Gallery}
diff --git a/src/widgets/doc/src/widgets-and-layouts/styles.qdoc b/src/widgets/doc/src/widgets-and-layouts/styles.qdoc
index 7d1bffd0b4..a42ee0db61 100644
--- a/src/widgets/doc/src/widgets-and-layouts/styles.qdoc
+++ b/src/widgets/doc/src/widgets-and-layouts/styles.qdoc
@@ -38,7 +38,7 @@
native widgets.
Qt comes with a selection of built-in styles. Some styles are only
- available on specific platforms (such as the Mac, GTK+ and Windows
+ available on specific platforms (such as the Mac and Windows
Vista styles). Custom styles are made available as plugins or by
creating an instance of a specific style class with
QStyleFactory::create() and setting it with QApplication::setStyle().
diff --git a/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc b/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc
index 2fb6819c47..047b63c23b 100644
--- a/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc
+++ b/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc
@@ -492,9 +492,9 @@
\section1 Inheritance
In classic CSS, when font and color of an item is not explicitly set,
- it gets automatically inherited from the parent. When using Qt Style Sheets,
- a widget does \b{not} automatically inherit its font and color setting
- from its parent widget.
+ it gets automatically inherited from the parent. By default, when using
+ Qt Style Sheets, a widget does \b{not} automatically inherit its font
+ and color setting from its parent widget.
For example, consider a QPushButton inside a QGroupBox:
@@ -507,9 +507,23 @@
\snippet code/doc_src_stylesheet.cpp 25
- In contrast, setting a font and propagate using QWidget::setFont() and
+ In contrast, setting a font and palette using QWidget::setFont() and
QWidget::setPalette() propagates to child widgets.
+ If you would prefer that the font and palette propagate to child widgets,
+ you can set the Qt::AA_UseStyleSheetPropagationInWidgetStyles flag, like
+ this:
+
+ Usage:
+ \snippet code/doc_src_stylesheet.cpp 96
+
+ When the widget-style font and palette propagation is enabled, font and
+ palette changes made through Qt Style Sheets will behave as though the
+ user had manually called the corresponding QWidget::setPalette() and
+ QWidget::setFont() methods on all of the QWidgets targeted by the style
+ sheet. If this would have caused propagation in C++, it will cause
+ propagation in style sheets and visa versa.
+
\section1 Widgets Inside C++ Namespaces
The Type Selector can be used to style widgets of a particular type. For
diff --git a/src/widgets/doc/src/windows-and-dialogs/mainwindow.qdoc b/src/widgets/doc/src/windows-and-dialogs/mainwindow.qdoc
index 6e58fe4499..172ea4742a 100644
--- a/src/widgets/doc/src/windows-and-dialogs/mainwindow.qdoc
+++ b/src/widgets/doc/src/windows-and-dialogs/mainwindow.qdoc
@@ -139,19 +139,6 @@
depends on the result of QWidget::frameGeometry() and the
capability of the window manager to do proper window placement,
neither of which can be guaranteed.
-
- \section2 BlackBerry Peculiarities
-
- On the BlackBerry platform it is possible to set an alternate
- cover window that is shown when the application is minimized.
- The cover window must be a separate window with the
- \l{Qt::CoverWindow} flag set.
-
- The window should have a fixed size depending on the screen
- resolution (e.g. for a 768x1280 screen, 334 pixels wide by 396
- pixels high). The window can be rendered to as usual, however
- updates should occur very infrequently (a few updates per minute
- at most) in order save battery.
*/
/*!
diff --git a/src/widgets/effects/qgraphicseffect.cpp b/src/widgets/effects/qgraphicseffect.cpp
index 5a97be3d96..1f1e50d7fb 100644
--- a/src/widgets/effects/qgraphicseffect.cpp
+++ b/src/widgets/effects/qgraphicseffect.cpp
@@ -316,8 +316,8 @@ QPixmap QGraphicsEffectSource::pixmap(Qt::CoordinateSystem system, QPoint *offse
return pixmapItem->pixmap();
}
- if (system == Qt::DeviceCoordinates && item
- && !static_cast<const QGraphicsItemEffectSourcePrivate *>(d_func())->info) {
+ if (Q_UNLIKELY(system == Qt::DeviceCoordinates && item &&
+ !static_cast<const QGraphicsItemEffectSourcePrivate *>(d_func())->info)) {
qWarning("QGraphicsEffectSource::pixmap: Not yet implemented, lacking device context");
return QPixmap();
}
diff --git a/src/widgets/graphicsview/qgraph_p.h b/src/widgets/graphicsview/qgraph_p.h
index c63c2c6f8e..2c9c58eb4c 100644
--- a/src/widgets/graphicsview/qgraph_p.h
+++ b/src/widgets/graphicsview/qgraph_p.h
@@ -222,9 +222,8 @@ public:
QSet<Vertex *> setOfVertices = vertices();
for (typename QSet<Vertex*>::const_iterator it = setOfVertices.begin(); it != setOfVertices.end(); ++it) {
Vertex *v = *it;
- QList<Vertex*> adjacents = adjacentVertices(v);
- for (int i = 0; i < adjacents.count(); ++i) {
- Vertex *v1 = adjacents.at(i);
+ const QList<Vertex*> adjacents = adjacentVertices(v);
+ for (auto *v1 : adjacents) {
EdgeData *data = edgeData(v, v1);
bool forward = data->from == v;
if (forward) {
diff --git a/src/widgets/graphicsview/qgraphicsanchorlayout_p.cpp b/src/widgets/graphicsview/qgraphicsanchorlayout_p.cpp
index dac8e61645..e16b427448 100644
--- a/src/widgets/graphicsview/qgraphicsanchorlayout_p.cpp
+++ b/src/widgets/graphicsview/qgraphicsanchorlayout_p.cpp
@@ -31,6 +31,8 @@
**
****************************************************************************/
+#include "qgraphicsanchorlayout_p.h"
+
#include <QtWidgets/qwidget.h>
#include <QtWidgets/qapplication.h>
#include <QtCore/qlinkedlist.h>
@@ -40,7 +42,7 @@
#include <QtCore/qfile.h>
#endif
-#include "qgraphicsanchorlayout_p.h"
+#include <numeric>
#ifndef QT_NO_GRAPHICSVIEW
QT_BEGIN_NAMESPACE
@@ -602,10 +604,10 @@ QSimplexConstraint *GraphPath::constraint(const GraphPath &path) const
QString GraphPath::toString() const
{
QString string(QLatin1String("Path: "));
- foreach(AnchorData *edge, positives)
+ for (AnchorData *edge : positives)
string += QString::fromLatin1(" (+++) %1").arg(edge->toString());
- foreach(AnchorData *edge, negatives)
+ for (AnchorData *edge : negatives)
string += QString::fromLatin1(" (---) %1").arg(edge->toString());
return string;
@@ -1932,8 +1934,7 @@ void QGraphicsAnchorLayoutPrivate::removeVertex(QGraphicsLayoutItem *item, Qt::A
if (AnchorVertex *v = internalVertex(item, edge)) {
Graph<AnchorVertex, AnchorData> &g = graph[edgeOrientation(edge)];
const QList<AnchorVertex *> allVertices = graph[edgeOrientation(edge)].adjacentVertices(v);
- AnchorVertex *v2;
- foreach (v2, allVertices) {
+ for (auto *v2 : allVertices) {
g.removeEdge(v, v2);
removeInternalVertex(item, edge);
removeInternalVertex(v2->m_item, v2->m_edge);
@@ -2057,9 +2058,8 @@ QList<AnchorData *> getVariables(const QList<QSimplexConstraint *> &constraints)
QSet<AnchorData *> variableSet;
for (int i = 0; i < constraints.count(); ++i) {
const QSimplexConstraint *c = constraints.at(i);
- foreach (QSimplexVariable *var, c->variables.keys()) {
- variableSet += static_cast<AnchorData *>(var);
- }
+ for (auto it = c->variables.cbegin(), end = c->variables.cend(); it != end; ++it)
+ variableSet.insert(static_cast<AnchorData *>(it.key()));
}
return variableSet.toList();
}
@@ -2180,10 +2180,7 @@ static void shiftConstraints(const QList<QSimplexConstraint *> &constraints, qre
{
for (int i = 0; i < constraints.count(); ++i) {
QSimplexConstraint *c = constraints.at(i);
- qreal multiplier = 0;
- foreach (qreal v, c->variables) {
- multiplier += v;
- }
+ const qreal multiplier = std::accumulate(c->variables.cbegin(), c->variables.cend(), qreal(0));
c->constant += multiplier * amount;
}
}
@@ -2223,12 +2220,10 @@ bool QGraphicsAnchorLayoutPrivate::calculateTrunk(Orientation orientation, const
// Calculate and set the preferred size for the layout,
// from the edge sizes that were calculated above.
qreal pref(0.0);
- foreach (const AnchorData *ad, path.positives) {
+ for (const AnchorData *ad : path.positives)
pref += ad->sizeAtPreferred;
- }
- foreach (const AnchorData *ad, path.negatives) {
+ for (const AnchorData *ad : path.negatives)
pref -= ad->sizeAtPreferred;
- }
sizeHints[orientation][Qt::MinimumSize] = min;
sizeHints[orientation][Qt::PreferredSize] = pref;
@@ -2368,8 +2363,8 @@ void QGraphicsAnchorLayoutPrivate::findPaths(Orientation orientation)
*/
void QGraphicsAnchorLayoutPrivate::constraintsFromPaths(Orientation orientation)
{
- foreach (AnchorVertex *vertex, graphPaths[orientation].uniqueKeys())
- {
+ const auto vertices = graphPaths[orientation].uniqueKeys();
+ for (AnchorVertex *vertex : vertices) {
int valueCount = graphPaths[orientation].count(vertex);
if (valueCount == 1)
continue;
@@ -2550,7 +2545,8 @@ QGraphicsAnchorLayoutPrivate::getGraphParts(Orientation orientation)
// remaining constraints.
if (match) {
trunkConstraints += c;
- trunkVariables += QSet<QSimplexVariable *>::fromList(c->variables.keys());
+ for (auto jt = c->variables.cbegin(), end = c->variables.cend(); jt != end; ++jt)
+ trunkVariables.insert(jt.key());
it = remainingConstraints.erase(it);
dirty = true;
} else {
@@ -2796,7 +2792,7 @@ void QGraphicsAnchorLayoutPrivate::interpolateEdge(AnchorVertex *base, AnchorDat
}
bool QGraphicsAnchorLayoutPrivate::solveMinMax(const QList<QSimplexConstraint *> &constraints,
- GraphPath path, qreal *min, qreal *max)
+ const GraphPath &path, qreal *min, qreal *max)
{
QSimplex simplex;
bool feasible = simplex.setConstraints(constraints);
@@ -2983,7 +2979,7 @@ void QGraphicsAnchorLayoutPrivate::dumpGraph(const QString &name)
{
QFile file(QString::fromLatin1("anchorlayout.%1.dot").arg(name));
if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate))
- qWarning("Could not write to %s", file.fileName().toLocal8Bit().constData());
+ qWarning("Could not write to %ls", qUtf16Printable(file.fileName()));
QString str = QString::fromLatin1("digraph anchorlayout {\nnode [shape=\"rect\"]\n%1}");
QString dotContents = graph[0].serializeToDot();
diff --git a/src/widgets/graphicsview/qgraphicsanchorlayout_p.h b/src/widgets/graphicsview/qgraphicsanchorlayout_p.h
index a5c7f1e2ce..15fd0d0b79 100644
--- a/src/widgets/graphicsview/qgraphicsanchorlayout_p.h
+++ b/src/widgets/graphicsview/qgraphicsanchorlayout_p.h
@@ -522,7 +522,7 @@ public:
// Linear Programming solver methods
bool solveMinMax(const QList<QSimplexConstraint *> &constraints,
- GraphPath path, qreal *min, qreal *max);
+ const GraphPath &path, qreal *min, qreal *max);
bool solvePreferred(const QList<QSimplexConstraint *> &constraints,
const QList<AnchorData *> &variables);
bool hasConflicts() const;
diff --git a/src/widgets/graphicsview/qgraphicsitem.cpp b/src/widgets/graphicsview/qgraphicsitem.cpp
index 5f5c402a4a..54a98b4d2d 100644
--- a/src/widgets/graphicsview/qgraphicsitem.cpp
+++ b/src/widgets/graphicsview/qgraphicsitem.cpp
@@ -1373,12 +1373,9 @@ void QGraphicsItemCache::purge()
{
QPixmapCache::remove(key);
key = QPixmapCache::Key();
- QMutableHashIterator<QPaintDevice *, DeviceData> it(deviceData);
- while (it.hasNext()) {
- DeviceData &data = it.next().value();
+ const auto &constDeviceData = deviceData; // avoid detach
+ for (const auto &data : constDeviceData)
QPixmapCache::remove(data.key);
- data.cacheIndent = QPoint();
- }
deviceData.clear();
allExposed = true;
exposed.clear();
diff --git a/src/widgets/graphicsview/qgraphicsitem_p.h b/src/widgets/graphicsview/qgraphicsitem_p.h
index fe4bac12bc..e8c5d45716 100644
--- a/src/widgets/graphicsview/qgraphicsitem_p.h
+++ b/src/widgets/graphicsview/qgraphicsitem_p.h
@@ -354,7 +354,7 @@ public:
struct ExtraStruct {
ExtraStruct() {} // for QVector, don't use
- ExtraStruct(Extra type, QVariant value)
+ ExtraStruct(Extra type, const QVariant &value)
: type(type), value(value)
{ }
diff --git a/src/widgets/graphicsview/qgraphicsscene.cpp b/src/widgets/graphicsview/qgraphicsscene.cpp
index ad58aeb488..77bc8d4fcd 100644
--- a/src/widgets/graphicsview/qgraphicsscene.cpp
+++ b/src/widgets/graphicsview/qgraphicsscene.cpp
@@ -232,6 +232,7 @@
#include <QtGui/qpainter.h>
#include <QtGui/qpixmapcache.h>
#include <QtGui/qpolygon.h>
+#include <QtGui/qtouchdevice.h>
#include <QtWidgets/qstyleoption.h>
#include <QtWidgets/qtooltip.h>
#include <QtGui/qtransform.h>
@@ -3869,15 +3870,15 @@ bool QGraphicsScenePrivate::dispatchHoverEvent(QGraphicsSceneHoverEvent *hoverEv
QList<QGraphicsItem *> parents;
QGraphicsItem *parent = item;
while (parent && parent != commonAncestorItem) {
- parents.prepend(parent);
+ parents.append(parent);
if (parent->isPanel()) {
// Stop at the panel - we don't deliver beyond this point.
break;
}
parent = parent->parentItem();
}
- for (int i = 0; i < parents.size(); ++i) {
- parent = parents.at(i);
+ for (auto it = parents.crbegin(), end = parents.crend(); it != end; ++it) {
+ QGraphicsItem *parent = *it;
hoverItems << parent;
if (itemAcceptsHoverEvents_helper(parent))
sendHoverEvent(QEvent::GraphicsSceneHoverEnter, parent, hoverEvent);
diff --git a/src/widgets/graphicsview/qgraphicswidget.cpp b/src/widgets/graphicsview/qgraphicswidget.cpp
index 8ffb60411c..ef086aeab0 100644
--- a/src/widgets/graphicsview/qgraphicswidget.cpp
+++ b/src/widgets/graphicsview/qgraphicswidget.cpp
@@ -2056,7 +2056,11 @@ void QGraphicsWidget::insertAction(QAction *before, QAction *action)
\sa removeAction(), QMenu, insertAction(), QWidget::insertActions()
*/
+#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
+void QGraphicsWidget::insertActions(QAction *before, const QList<QAction *> &actions)
+#else
void QGraphicsWidget::insertActions(QAction *before, QList<QAction *> actions)
+#endif
{
for (int i = 0; i < actions.count(); ++i)
insertAction(before, actions.at(i));
diff --git a/src/widgets/graphicsview/qgraphicswidget.h b/src/widgets/graphicsview/qgraphicswidget.h
index 0878e020bc..f922e80782 100644
--- a/src/widgets/graphicsview/qgraphicswidget.h
+++ b/src/widgets/graphicsview/qgraphicswidget.h
@@ -139,11 +139,12 @@ public:
void addAction(QAction *action);
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
void addActions(const QList<QAction*> &actions);
+ void insertActions(QAction *before, const QList<QAction*> &actions);
#else
void addActions(QList<QAction*> actions);
+ void insertActions(QAction *before, QList<QAction*> actions);
#endif
void insertAction(QAction *before, QAction *action);
- void insertActions(QAction *before, QList<QAction*> actions);
void removeAction(QAction *action);
QList<QAction*> actions() const;
#endif
diff --git a/src/widgets/graphicsview/qsimplex_p.cpp b/src/widgets/graphicsview/qsimplex_p.cpp
index b827ab1400..d4e2e2f922 100644
--- a/src/widgets/graphicsview/qsimplex_p.cpp
+++ b/src/widgets/graphicsview/qsimplex_p.cpp
@@ -153,9 +153,11 @@ bool QSimplex::setConstraints(const QList<QSimplexConstraint *> &newConstraints)
// "variables" is a list that provides a stable, indexed list of all variables
// used in this problem.
QSet<QSimplexVariable *> variablesSet;
- for (int i = 0; i < constraints.size(); ++i)
- variablesSet += \
- QSet<QSimplexVariable *>::fromList(constraints[i]->variables.keys());
+ for (int i = 0; i < constraints.size(); ++i) {
+ const auto &v = constraints.at(i)->variables;
+ for (auto it = v.cbegin(), end = v.cend(); it != end; ++it)
+ variablesSet.insert(it.key());
+ }
variables = variablesSet.toList();
// Set Variables reverse mapping
diff --git a/src/widgets/itemviews/qabstractitemview.cpp b/src/widgets/itemviews/qabstractitemview.cpp
index ad7be840d0..cbf734203a 100644
--- a/src/widgets/itemviews/qabstractitemview.cpp
+++ b/src/widgets/itemviews/qabstractitemview.cpp
@@ -54,6 +54,7 @@
#include <private/qabstractitemview_p.h>
#include <private/qabstractitemmodel_p.h>
#include <private/qguiapplication_p.h>
+#include <private/qscrollbar_p.h>
#ifndef QT_NO_ACCESSIBILITY
#include <qaccessible.h>
#endif
@@ -427,6 +428,11 @@ void QAbstractItemViewPrivate::_q_scrollerStateChanged()
\since 4.2
\enum QAbstractItemView::ScrollMode
+ Describes how the scrollbar should behave. When setting the scroll mode
+ to ScrollPerPixel the single step size will adjust automatically unless
+ it was set explicitly using \l{QAbstractSlider::}{setSingleStep()}.
+ The automatic adjustment can be restored by setting the single step size to -1.
+
\value ScrollPerItem The view will scroll the contents one item at a time.
\value ScrollPerPixel The view will scroll the contents one pixel at a time.
*/
@@ -758,7 +764,7 @@ void QAbstractItemView::setSelectionModel(QItemSelectionModel *selectionModel)
Q_ASSERT(selectionModel);
Q_D(QAbstractItemView);
- if (selectionModel->model() != d->model) {
+ if (Q_UNLIKELY(selectionModel->model() != d->model)) {
qWarning("QAbstractItemView::setSelectionModel() failed: "
"Trying to set a selection model, which works on "
"a different model than the view.");
@@ -1113,7 +1119,7 @@ void QAbstractItemView::reset()
void QAbstractItemView::setRootIndex(const QModelIndex &index)
{
Q_D(QAbstractItemView);
- if (index.isValid() && index.model() != d->model) {
+ if (Q_UNLIKELY(index.isValid() && index.model() != d->model)) {
qWarning("QAbstractItemView::setRootIndex failed : index must be from the currently set model");
return;
}
@@ -1166,9 +1172,9 @@ void QAbstractItemView::selectAll()
void QAbstractItemView::edit(const QModelIndex &index)
{
Q_D(QAbstractItemView);
- if (!d->isIndexValid(index))
+ if (Q_UNLIKELY(!d->isIndexValid(index)))
qWarning("edit: index was invalid");
- if (!edit(index, AllEditTriggers, 0))
+ if (Q_UNLIKELY(!edit(index, AllEditTriggers, 0)))
qWarning("edit: editing failed");
}
@@ -1235,6 +1241,10 @@ void QAbstractItemView::setVerticalScrollMode(ScrollMode mode)
return;
QModelIndex topLeft = indexAt(QPoint(0, 0));
d->verticalScrollMode = mode;
+ if (mode == ScrollPerItem)
+ verticalScrollBar()->d_func()->itemviewChangeSingleStep(1); // setSingleStep(-1) => step with 1
+ else
+ verticalScrollBar()->setSingleStep(-1); // Ensure that the view can update single step
updateGeometries(); // update the scroll bars
scrollTo(topLeft, QAbstractItemView::PositionAtTop);
}
@@ -1257,7 +1267,13 @@ QAbstractItemView::ScrollMode QAbstractItemView::verticalScrollMode() const
void QAbstractItemView::setHorizontalScrollMode(ScrollMode mode)
{
Q_D(QAbstractItemView);
+ if (mode == d->horizontalScrollMode)
+ return;
d->horizontalScrollMode = mode;
+ if (mode == ScrollPerItem)
+ horizontalScrollBar()->d_func()->itemviewChangeSingleStep(1); // setSingleStep(-1) => step with 1
+ else
+ horizontalScrollBar()->setSingleStep(-1); // Ensure that the view can update single step
updateGeometries(); // update the scroll bars
}
@@ -4335,11 +4351,11 @@ QItemViewPaintPairs QAbstractItemViewPrivate::draggablePaintPairs(const QModelIn
QRect &rect = *r;
const QRect viewportRect = viewport->rect();
QItemViewPaintPairs ret;
- for (int i = 0; i < indexes.count(); ++i) {
- const QModelIndex &index = indexes.at(i);
+ for (const auto &index : indexes) {
const QRect current = q->visualRect(index);
if (current.intersects(viewportRect)) {
- ret += qMakePair(current, index);
+ QItemViewPaintPair p = { current, index };
+ ret += p;
rect |= current;
}
}
@@ -4359,8 +4375,8 @@ QPixmap QAbstractItemViewPrivate::renderToPixmap(const QModelIndexList &indexes,
QStyleOptionViewItem option = viewOptionsV1();
option.state |= QStyle::State_Selected;
for (int j = 0; j < paintPairs.count(); ++j) {
- option.rect = paintPairs.at(j).first.translated(-r->topLeft());
- const QModelIndex &current = paintPairs.at(j).second;
+ option.rect = paintPairs.at(j).rect.translated(-r->topLeft());
+ const QModelIndex &current = paintPairs.at(j).index;
adjustViewOptionsForIndex(&option, current);
delegateForIndex(current)->paint(&painter, option, current);
}
diff --git a/src/widgets/itemviews/qabstractitemview.h b/src/widgets/itemviews/qabstractitemview.h
index ff1848b149..e32c5dad2f 100644
--- a/src/widgets/itemviews/qabstractitemview.h
+++ b/src/widgets/itemviews/qabstractitemview.h
@@ -362,6 +362,7 @@ private:
friend class QTreeViewPrivate; // needed to compile with MSVC
friend class QListModeViewBase;
friend class QListViewPrivate;
+ friend class QAbstractSlider;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QAbstractItemView::EditTriggers)
diff --git a/src/widgets/itemviews/qabstractitemview_p.h b/src/widgets/itemviews/qabstractitemview_p.h
index bb88b25652..2b28d8db84 100644
--- a/src/widgets/itemviews/qabstractitemview_p.h
+++ b/src/widgets/itemviews/qabstractitemview_p.h
@@ -73,7 +73,13 @@ struct QEditorInfo {
typedef QHash<QWidget *, QPersistentModelIndex> QEditorIndexHash;
typedef QHash<QPersistentModelIndex, QEditorInfo> QIndexEditorHash;
-typedef QPair<QRect, QModelIndex> QItemViewPaintPair;
+struct QItemViewPaintPair {
+ QRect rect;
+ QModelIndex index;
+};
+template <>
+class QTypeInfo<QItemViewPaintPair> : public QTypeInfoMerger<QItemViewPaintPair, QRect, QModelIndex> {};
+
typedef QVector<QItemViewPaintPair> QItemViewPaintPairs;
class QEmptyModel : public QAbstractItemModel
@@ -165,21 +171,21 @@ public:
virtual QAbstractItemView::DropIndicatorPosition position(const QPoint &pos, const QRect &rect, const QModelIndex &idx) const;
inline bool canDrop(QDropEvent *event) {
- QModelIndex index;
- int col = -1;
- int row = -1;
const QMimeData *mime = event->mimeData();
// Drag enter event shall always be accepted, if mime type and action match.
// Whether the data can actually be dropped will be checked in drag move.
- if (event->type() == QEvent::DragEnter) {
+ if (event->type() == QEvent::DragEnter && (event->dropAction() & model->supportedDropActions())) {
const QStringList modelTypes = model->mimeTypes();
- for (int i = 0; i < modelTypes.count(); ++i)
- if (mime->hasFormat(modelTypes.at(i))
- && (event->dropAction() & model->supportedDropActions()))
+ for (const auto &modelType : modelTypes) {
+ if (mime->hasFormat(modelType))
return true;
+ }
}
+ QModelIndex index;
+ int col = -1;
+ int row = -1;
if (dropOn(event, &row, &col, &index)) {
return model->canDropMimeData(mime,
dragDropMode == QAbstractItemView::InternalMove ? Qt::MoveAction : event->dropAction(),
diff --git a/src/widgets/itemviews/qdirmodel.cpp b/src/widgets/itemviews/qdirmodel.cpp
index 0c157c940f..f18233b64c 100644
--- a/src/widgets/itemviews/qdirmodel.cpp
+++ b/src/widgets/itemviews/qdirmodel.cpp
@@ -168,9 +168,9 @@ void QDirModelPrivate::invalidate()
while (!nodes.empty()) {
const QDirNode *current = nodes.pop();
current->stat = false;
- const QVector<QDirNode> children = current->children;
- for (int i = 0; i < children.count(); ++i)
- nodes.push(&children.at(i));
+ const QVector<QDirNode> &children = current->children;
+ for (const auto &child : children)
+ nodes.push(&child);
}
}
@@ -1022,7 +1022,7 @@ bool QDirModel::rmdir(const QModelIndex &index)
return false;
QDirModelPrivate::QDirNode *n = d_func()->node(index);
- if (!n->info.isDir()) {
+ if (Q_UNLIKELY(!n->info.isDir())) {
qWarning("rmdir: the node is not a directory");
return false;
}
@@ -1172,7 +1172,7 @@ QDirModelPrivate::QDirNode *QDirModelPrivate::node(int row, QDirNode *parent) co
if (isDir && !p->populated)
populate(p); // will also resolve symlinks
- if (row >= p->children.count()) {
+ if (Q_UNLIKELY(row >= p->children.count())) {
qWarning("node: the row does not exist");
return 0;
}
diff --git a/src/widgets/itemviews/qfileiconprovider.cpp b/src/widgets/itemviews/qfileiconprovider.cpp
index f43bcd5d5a..18b9755477 100644
--- a/src/widgets/itemviews/qfileiconprovider.cpp
+++ b/src/widgets/itemviews/qfileiconprovider.cpp
@@ -52,10 +52,6 @@
# endif
#endif
-#if defined(Q_OS_UNIX) && !defined(QT_NO_STYLE_GTK)
-# include <private/qgtkstyle_p_p.h>
-#endif
-
QT_BEGIN_NAMESPACE
static bool isCacheable(const QFileInfo &fi);
@@ -358,15 +354,6 @@ QIcon QFileIconProvider::icon(const QFileInfo &info) const
{
Q_D(const QFileIconProvider);
-#if defined(Q_OS_UNIX) && !defined(QT_NO_STYLE_GTK)
- const QByteArray desktopEnvironment = QGuiApplicationPrivate::platformIntegration()->services()->desktopEnvironment();
- if (desktopEnvironment != QByteArrayLiteral("KDE")) {
- QIcon gtkIcon = QGtkStylePrivate::getFilesystemIcon(info);
- if (!gtkIcon.isNull())
- return gtkIcon;
- }
-#endif
-
QIcon retIcon = d->getIcon(info);
if (!retIcon.isNull())
return retIcon;
diff --git a/src/widgets/itemviews/qheaderview.cpp b/src/widgets/itemviews/qheaderview.cpp
index 4cb28d0804..496d36015e 100644
--- a/src/widgets/itemviews/qheaderview.cpp
+++ b/src/widgets/itemviews/qheaderview.cpp
@@ -2958,8 +2958,7 @@ QRegion QHeaderView::visualRegionForSelection(const QItemSelection &selection) c
int right = 0;
int rangeLeft, rangeRight;
- for (int i = 0; i < selection.count(); ++i) {
- QItemSelectionRange r = selection.at(i);
+ for (const auto &r : selection) {
if (r.parent().isValid() || !r.isValid())
continue; // we only know about toplevel items and we don't want invalid ranges
// FIXME an item inside the range may be the leftmost or rightmost
@@ -2992,8 +2991,7 @@ QRegion QHeaderView::visualRegionForSelection(const QItemSelection &selection) c
int bottom = 0;
int rangeTop, rangeBottom;
- for (int i = 0; i < selection.count(); ++i) {
- QItemSelectionRange r = selection.at(i);
+ for (const auto &r : selection) {
if (r.parent().isValid() || !r.isValid())
continue; // we only know about toplevel items
// FIXME an item inside the range may be the leftmost or rightmost
diff --git a/src/widgets/itemviews/qheaderview_p.h b/src/widgets/itemviews/qheaderview_p.h
index 7f92d2a81b..60542e297a 100644
--- a/src/widgets/itemviews/qheaderview_p.h
+++ b/src/widgets/itemviews/qheaderview_p.h
@@ -327,8 +327,8 @@ public:
inline int headerLength() const { // for debugging
int len = 0;
- for (int i = 0; i < sectionItems.count(); ++i)
- len += sectionItems.at(i).size;
+ for (const auto &section : sectionItems)
+ len += section.size;
return len;
}
diff --git a/src/widgets/itemviews/qitemeditorfactory.cpp b/src/widgets/itemviews/qitemeditorfactory.cpp
index e966c83fe7..701e7ab79b 100644
--- a/src/widgets/itemviews/qitemeditorfactory.cpp
+++ b/src/widgets/itemviews/qitemeditorfactory.cpp
@@ -47,6 +47,7 @@
#include <qapplication.h>
#include <qdebug.h>
+#include <algorithm>
QT_BEGIN_NAMESPACE
@@ -202,7 +203,7 @@ void QItemEditorFactory::registerEditor(int userType, QItemEditorCreatorBase *cr
QItemEditorCreatorBase *oldCreator = it.value();
Q_ASSERT(oldCreator);
creatorMap.erase(it);
- if (!creatorMap.values().contains(oldCreator))
+ if (std::find(creatorMap.cbegin(), creatorMap.cend(), oldCreator) == creatorMap.cend())
delete oldCreator; // if it is no more in use we can delete it
}
diff --git a/src/widgets/itemviews/qlistview.cpp b/src/widgets/itemviews/qlistview.cpp
index 9c79509874..7cd8e890db 100644
--- a/src/widgets/itemviews/qlistview.cpp
+++ b/src/widgets/itemviews/qlistview.cpp
@@ -46,6 +46,7 @@
#include <qscrollbar.h>
#include <qrubberband.h>
#include <private/qlistview_p.h>
+#include <private/qscrollbar_p.h>
#include <qdebug.h>
#ifndef QT_NO_ACCESSIBILITY
#include <qaccessible.h>
@@ -392,7 +393,7 @@ int QListView::spacing() const
void QListView::setBatchSize(int batchSize)
{
Q_D(QListView);
- if (batchSize <= 0) {
+ if (Q_UNLIKELY(batchSize <= 0)) {
qWarning("Invalid batchSize (%d)", batchSize);
return;
}
@@ -650,11 +651,11 @@ QItemViewPaintPairs QListViewPrivate::draggablePaintPairs(const QModelIndexList
const QRect viewportRect = viewport->rect();
QItemViewPaintPairs ret;
const QSet<QModelIndex> visibleIndexes = intersectingSet(viewportRect.translated(q->horizontalOffset(), q->verticalOffset())).toList().toSet();
- for (int i = 0; i < indexes.count(); ++i) {
- const QModelIndex &index = indexes.at(i);
+ for (const auto &index : indexes) {
if (visibleIndexes.contains(index)) {
const QRect current = q->visualRect(index);
- ret += qMakePair(current, index);
+ QItemViewPaintPair p = { current, index };
+ ret += p;
rect |= current;
}
}
@@ -1396,16 +1397,16 @@ QRegion QListView::visualRegionForSelection(const QItemSelection &selection) con
int c = d->column;
QRegion selectionRegion;
const QRect &viewportRect = d->viewport->rect();
- for (int i = 0; i < selection.count(); ++i) {
- if (!selection.at(i).isValid())
+ for (const auto &elem : selection) {
+ if (!elem.isValid())
continue;
- QModelIndex parent = selection.at(i).topLeft().parent();
+ QModelIndex parent = elem.topLeft().parent();
//we only display the children of the root in a listview
//we're not interested in the other model indexes
if (parent != d->root)
continue;
- int t = selection.at(i).topLeft().row();
- int b = selection.at(i).bottomRight().row();
+ int t = elem.topLeft().row();
+ int b = elem.bottomRight().row();
if (d->viewMode == IconMode || d->isWrapping()) { // in non-static mode, we have to go through all selected items
for (int r = t; r <= b; ++r) {
const QRect &rect = visualRect(d->model->index(r, c, parent));
@@ -1867,7 +1868,7 @@ void QCommonListViewBase::paintDragDrop(QPainter *painter)
void QCommonListViewBase::updateHorizontalScrollBar(const QSize &step)
{
- horizontalScrollBar()->setSingleStep(step.width() + spacing());
+ horizontalScrollBar()->d_func()->itemviewChangeSingleStep(step.width() + spacing());
horizontalScrollBar()->setPageStep(viewport()->width());
// If both scroll bars are set to auto, we might end up in a situation with enough space
@@ -1897,7 +1898,7 @@ void QCommonListViewBase::updateHorizontalScrollBar(const QSize &step)
void QCommonListViewBase::updateVerticalScrollBar(const QSize &step)
{
- verticalScrollBar()->setSingleStep(step.height() + spacing());
+ verticalScrollBar()->d_func()->itemviewChangeSingleStep(step.height() + spacing());
verticalScrollBar()->setPageStep(viewport()->height());
// If both scroll bars are set to auto, we might end up in a situation with enough space
@@ -2769,9 +2770,8 @@ bool QIconModeViewBase::filterDropEvent(QDropEvent *e)
}
QPoint start = dd->pressedPosition;
QPoint delta = (dd->movement == QListView::Snap ? snapToGrid(end) - snapToGrid(start) : end - start);
- QList<QModelIndex> indexes = dd->selectionModel->selectedIndexes();
- for (int i = 0; i < indexes.count(); ++i) {
- QModelIndex index = indexes.at(i);
+ const QList<QModelIndex> indexes = dd->selectionModel->selectedIndexes();
+ for (const auto &index : indexes) {
QRect rect = dd->rectForIndex(index);
viewport()->update(dd->mapToViewport(rect, false));
QPoint dest = rect.topLeft() + delta;
diff --git a/src/widgets/itemviews/qlistwidget.cpp b/src/widgets/itemviews/qlistwidget.cpp
index d4d22c8bef..275fc2a1f1 100644
--- a/src/widgets/itemviews/qlistwidget.cpp
+++ b/src/widgets/itemviews/qlistwidget.cpp
@@ -1908,7 +1908,7 @@ QList<QListWidgetItem*> QListWidget::items(const QMimeData *data) const
}
/*!
- Returns the QModelIndex assocated with the given \a item.
+ Returns the QModelIndex associated with the given \a item.
*/
QModelIndex QListWidget::indexFromItem(QListWidgetItem *item) const
@@ -1918,7 +1918,7 @@ QModelIndex QListWidget::indexFromItem(QListWidgetItem *item) const
}
/*!
- Returns a pointer to the QListWidgetItem assocated with the given \a index.
+ Returns a pointer to the QListWidgetItem associated with the given \a index.
*/
QListWidgetItem *QListWidget::itemFromIndex(const QModelIndex &index) const
diff --git a/src/widgets/itemviews/qtableview.cpp b/src/widgets/itemviews/qtableview.cpp
index ee0d41ce15..88090f1e45 100644
--- a/src/widgets/itemviews/qtableview.cpp
+++ b/src/widgets/itemviews/qtableview.cpp
@@ -46,6 +46,7 @@
#include <qabstractbutton.h>
#include <private/qtableview_p.h>
#include <private/qheaderview_p.h>
+#include <private/qscrollbar_p.h>
#ifndef QT_NO_ACCESSIBILITY
#include <qaccessible.h>
#endif
@@ -661,7 +662,7 @@ void QTableViewPrivate::trimHiddenSelections(QItemSelectionRange *range) const
*/
void QTableViewPrivate::setSpan(int row, int column, int rowSpan, int columnSpan)
{
- if (row < 0 || column < 0 || rowSpan <= 0 || columnSpan <= 0) {
+ if (Q_UNLIKELY(row < 0 || column < 0 || rowSpan <= 0 || columnSpan <= 0)) {
qWarning("QTableView::setSpan: invalid span given: (%d, %d, %d, %d)",
row, column, rowSpan, columnSpan);
return;
@@ -680,7 +681,7 @@ void QTableViewPrivate::setSpan(int row, int column, int rowSpan, int columnSpan
sp->m_right = column + columnSpan - 1;
spans.updateSpan(sp, old_height);
return;
- } else if (rowSpan == 1 && columnSpan == 1) {
+ } else if (Q_UNLIKELY(rowSpan == 1 && columnSpan == 1)) {
qWarning("QTableView::setSpan: single cell span won't be added");
return;
}
@@ -1369,9 +1370,6 @@ void QTableView::paintEvent(QPaintEvent *event)
uint x = horizontalHeader->length() - horizontalHeader->offset() - (rightToLeft ? 0 : 1);
uint y = verticalHeader->length() - verticalHeader->offset() - 1;
- const QRegion region = event->region().translated(offset);
- const QVector<QRect> rects = region.rects();
-
//firstVisualRow is the visual index of the first visible row. lastVisualRow is the visual index of the last visible Row.
//same goes for ...VisualColumn
int firstVisualRow = qMax(verticalHeader->visualIndexAt(0),0);
@@ -1390,13 +1388,15 @@ void QTableView::paintEvent(QPaintEvent *event)
QBitArray drawn((lastVisualRow - firstVisualRow + 1) * (lastVisualColumn - firstVisualColumn + 1));
+ const QRegion region = event->region().translated(offset);
+
if (d->hasSpans()) {
d->drawAndClipSpans(region, &painter, option, &drawn,
firstVisualRow, lastVisualRow, firstVisualColumn, lastVisualColumn);
}
- for (int i = 0; i < rects.size(); ++i) {
- QRect dirtyArea = rects.at(i);
+ const QVector<QRect> rects = region.rects();
+ for (auto dirtyArea : rects) {
dirtyArea.setBottom(qMin(dirtyArea.bottom(), int(y)));
if (rightToLeft) {
dirtyArea.setLeft(qMax(dirtyArea.left(), d->viewport->width() - int(x)));
@@ -1951,8 +1951,7 @@ QRegion QTableView::visualRegionForSelection(const QItemSelection &selection) co
bool horizontalMoved = horizontalHeader()->sectionsMoved();
if ((verticalMoved && horizontalMoved) || (d->hasSpans() && (verticalMoved || horizontalMoved))) {
- for (int i = 0; i < selection.count(); ++i) {
- QItemSelectionRange range = selection.at(i);
+ for (const auto &range : selection) {
if (range.parent() != d->root || !range.isValid())
continue;
for (int r = range.top(); r <= range.bottom(); ++r)
@@ -1963,8 +1962,7 @@ QRegion QTableView::visualRegionForSelection(const QItemSelection &selection) co
}
}
} else if (horizontalMoved) {
- for (int i = 0; i < selection.count(); ++i) {
- QItemSelectionRange range = selection.at(i);
+ for (const auto &range : selection) {
if (range.parent() != d->root || !range.isValid())
continue;
int top = rowViewportPosition(range.top());
@@ -1979,8 +1977,7 @@ QRegion QTableView::visualRegionForSelection(const QItemSelection &selection) co
}
}
} else if (verticalMoved) {
- for (int i = 0; i < selection.count(); ++i) {
- QItemSelectionRange range = selection.at(i);
+ for (const auto &range : selection) {
if (range.parent() != d->root || !range.isValid())
continue;
int left = columnViewportPosition(range.left());
@@ -1996,8 +1993,7 @@ QRegion QTableView::visualRegionForSelection(const QItemSelection &selection) co
}
} else { // nothing moved
const int gridAdjust = showGrid() ? 1 : 0;
- for (int i = 0; i < selection.count(); ++i) {
- QItemSelectionRange range = selection.at(i);
+ for (auto range : selection) {
if (range.parent() != d->root || !range.isValid())
continue;
d->trimHiddenSelections(&range);
@@ -2166,7 +2162,7 @@ void QTableView::updateGeometries()
} else { // ScrollPerPixel
horizontalScrollBar()->setPageStep(vsize.width());
horizontalScrollBar()->setRange(0, horizontalLength - vsize.width());
- horizontalScrollBar()->setSingleStep(qMax(vsize.width() / (columnsInViewport + 1), 2));
+ horizontalScrollBar()->d_func()->itemviewChangeSingleStep(qMax(vsize.width() / (columnsInViewport + 1), 2));
}
// vertical scroll bar
@@ -2194,7 +2190,7 @@ void QTableView::updateGeometries()
} else { // ScrollPerPixel
verticalScrollBar()->setPageStep(vsize.height());
verticalScrollBar()->setRange(0, verticalLength - vsize.height());
- verticalScrollBar()->setSingleStep(qMax(vsize.height() / (rowsInViewport + 1), 2));
+ verticalScrollBar()->d_func()->itemviewChangeSingleStep(qMax(vsize.height() / (rowsInViewport + 1), 2));
}
d->geometryRecursionBlock = false;
diff --git a/src/widgets/itemviews/qtablewidget.cpp b/src/widgets/itemviews/qtablewidget.cpp
index cd38f4b282..6238835f04 100644
--- a/src/widgets/itemviews/qtablewidget.cpp
+++ b/src/widgets/itemviews/qtablewidget.cpp
@@ -1388,9 +1388,10 @@ void QTableWidgetItem::setData(int role, const QVariant &value)
QVariant QTableWidgetItem::data(int role) const
{
role = (role == Qt::EditRole ? Qt::DisplayRole : role);
- for (int i = 0; i < values.count(); ++i)
- if (values.at(i).role == role)
- return values.at(i).value;
+ for (const auto &value : values) {
+ if (value.role == role)
+ return value.value;
+ }
return QVariant();
}
@@ -1958,7 +1959,7 @@ void QTableWidget::setItem(int row, int column, QTableWidgetItem *item)
{
Q_D(QTableWidget);
if (item) {
- if (item->view != 0) {
+ if (Q_UNLIKELY(item->view)) {
qWarning("QTableWidget: cannot insert an item that is already owned by another QTableWidget");
} else {
item->view = this;
@@ -2359,10 +2360,9 @@ QList<QTableWidgetSelectionRange> QTableWidget::selectedRanges() const
QList<QTableWidgetItem*> QTableWidget::selectedItems() const
{
Q_D(const QTableWidget);
- QModelIndexList indexes = selectionModel()->selectedIndexes();
+ const QModelIndexList indexes = selectionModel()->selectedIndexes();
QList<QTableWidgetItem*> items;
- for (int i = 0; i < indexes.count(); ++i) {
- QModelIndex index = indexes.at(i);
+ for (const auto &index : indexes) {
if (isIndexHidden(index))
continue;
QTableWidgetItem *item = d->tableModel()->item(index);
@@ -2639,7 +2639,7 @@ QList<QTableWidgetItem*> QTableWidget::items(const QMimeData *data) const
}
/*!
- Returns the QModelIndex assocated with the given \a item.
+ Returns the QModelIndex associated with the given \a item.
*/
QModelIndex QTableWidget::indexFromItem(QTableWidgetItem *item) const
@@ -2649,7 +2649,7 @@ QModelIndex QTableWidget::indexFromItem(QTableWidgetItem *item) const
}
/*!
- Returns a pointer to the QTableWidgetItem assocated with the given \a index.
+ Returns a pointer to the QTableWidgetItem associated with the given \a index.
*/
QTableWidgetItem *QTableWidget::itemFromIndex(const QModelIndex &index) const
@@ -2682,22 +2682,21 @@ void QTableWidget::dropEvent(QDropEvent *event) {
int col = -1;
int row = -1;
if (d->dropOn(event, &row, &col, &topIndex)) {
- QModelIndexList indexes = selectedIndexes();
+ const QModelIndexList indexes = selectedIndexes();
int top = INT_MAX;
int left = INT_MAX;
- for (int i = 0; i < indexes.count(); ++i) {
- top = qMin(indexes.at(i).row(), top);
- left = qMin(indexes.at(i).column(), left);
+ for (const auto &index : indexes) {
+ top = qMin(index.row(), top);
+ left = qMin(index.column(), left);
}
QList<QTableWidgetItem *> taken;
const int indexesCount = indexes.count();
taken.reserve(indexesCount);
- for (int i = 0; i < indexesCount; ++i)
- taken.append(takeItem(indexes.at(i).row(), indexes.at(i).column()));
+ for (const auto &index : indexes)
+ taken.append(takeItem(index.row(), index.column()));
- for (int i = 0; i < indexes.count(); ++i) {
- QModelIndex index = indexes.at(i);
+ for (const auto &index : indexes) {
int r = index.row() - top + topIndex.row();
int c = index.column() - left + topIndex.column();
setItem(r, c, taken.takeFirst());
diff --git a/src/widgets/itemviews/qtreeview.cpp b/src/widgets/itemviews/qtreeview.cpp
index 57092a7cdc..b11c54ffb8 100644
--- a/src/widgets/itemviews/qtreeview.cpp
+++ b/src/widgets/itemviews/qtreeview.cpp
@@ -45,6 +45,7 @@
#include <qpen.h>
#include <qdebug.h>
#include <QMetaMethod>
+#include <private/qscrollbar_p.h>
#ifndef QT_NO_ACCESSIBILITY
#include <qaccessible.h>
#endif
@@ -2392,8 +2393,7 @@ QRegion QTreeView::visualRegionForSelection(const QItemSelection &selection) con
QRegion selectionRegion;
const QRect &viewportRect = d->viewport->rect();
- for (int i = 0; i < selection.count(); ++i) {
- QItemSelectionRange range = selection.at(i);
+ for (const auto &range : selection) {
if (!range.isValid())
continue;
QModelIndex parent = range.parent();
@@ -3698,7 +3698,7 @@ void QTreeViewPrivate::updateScrollBars()
}
vbar->setRange(0, contentsHeight - viewportSize.height());
vbar->setPageStep(viewportSize.height());
- vbar->setSingleStep(qMax(viewportSize.height() / (itemsInViewport + 1), 2));
+ vbar->d_func()->itemviewChangeSingleStep(qMax(viewportSize.height() / (itemsInViewport + 1), 2));
}
const int columnCount = header->count();
@@ -3724,7 +3724,7 @@ void QTreeViewPrivate::updateScrollBars()
viewportSize = maxSize;
hbar->setPageStep(viewportSize.width());
hbar->setRange(0, qMax(horizontalLength - viewportSize.width(), 0));
- hbar->setSingleStep(qMax(viewportSize.width() / (columnsInViewport + 1), 2));
+ hbar->d_func()->itemviewChangeSingleStep(qMax(viewportSize.width() / (columnsInViewport + 1), 2));
}
}
diff --git a/src/widgets/itemviews/qtreewidget.cpp b/src/widgets/itemviews/qtreewidget.cpp
index 676893ebf0..9dbf7df5fb 100644
--- a/src/widgets/itemviews/qtreewidget.cpp
+++ b/src/widgets/itemviews/qtreewidget.cpp
@@ -725,9 +725,9 @@ QMimeData *QTreeModel::internalMimeData() const
QMimeData *QTreeModel::mimeData(const QModelIndexList &indexes) const
{
QList<QTreeWidgetItem*> items;
- for (int i = 0; i < indexes.count(); ++i) {
- if (indexes.at(i).column() == 0) // only one item per row
- items << item(indexes.at(i));
+ for (const auto &index : indexes) {
+ if (index.column() == 0) // only one item per row
+ items << item(index);
}
// cachedIndexes is a little hack to avoid copying from QModelIndexList to
@@ -1735,7 +1735,7 @@ void QTreeWidgetItem::setData(int column, int role, const QVariant &value)
default:
if (column < values.count()) {
bool found = false;
- QVector<QWidgetItemData> column_values = values.at(column);
+ const QVector<QWidgetItemData> column_values = values.at(column);
for (int i = 0; i < column_values.count(); ++i) {
if (column_values.at(i).role == role) {
if (column_values.at(i).value == value)
@@ -1785,9 +1785,10 @@ QVariant QTreeWidgetItem::data(int column, int role) const
default:
if (column >= 0 && column < values.size()) {
const QVector<QWidgetItemData> &column_values = values.at(column);
- for (int i = 0; i < column_values.count(); ++i)
- if (column_values.at(i).role == role)
- return column_values.at(i).value;
+ for (const auto &column_value : column_values) {
+ if (column_value.role == role)
+ return column_value.value;
+ }
}
}
return QVariant();
@@ -2136,8 +2137,8 @@ QVariant QTreeWidgetItem::childrenCheckState(int column) const
return QVariant();
bool checkedChildren = false;
bool uncheckedChildren = false;
- for (int i = 0; i < children.count(); ++i) {
- QVariant value = children.at(i)->data(column, Qt::CheckStateRole);
+ for (const auto *child : children) {
+ QVariant value = child->data(column, Qt::CheckStateRole);
if (!value.isValid())
return QVariant();
@@ -3018,13 +3019,13 @@ void QTreeWidget::setItemSelected(const QTreeWidgetItem *item, bool select)
QList<QTreeWidgetItem*> QTreeWidget::selectedItems() const
{
Q_D(const QTreeWidget);
- QModelIndexList indexes = selectionModel()->selectedIndexes();
+ const QModelIndexList indexes = selectionModel()->selectedIndexes();
QList<QTreeWidgetItem*> items;
items.reserve(indexes.count());
QSet<QTreeWidgetItem *> seen;
seen.reserve(indexes.count());
- for (int i = 0; i < indexes.count(); ++i) {
- QTreeWidgetItem *item = d->item(indexes.at(i));
+ for (const auto &index : indexes) {
+ QTreeWidgetItem *item = d->item(index);
if (isItemHidden(item) || seen.contains(item))
continue;
seen.insert(item);
@@ -3278,16 +3279,15 @@ QMimeData *QTreeWidget::mimeData(const QList<QTreeWidgetItem*> items) const
Q_D(const QTreeWidget);
if (d->treeModel()->cachedIndexes.isEmpty()) {
QList<QModelIndex> indexes;
- for (int i = 0; i < items.count(); ++i) {
- QTreeWidgetItem *item = items.at(i);
- if (!item) {
+ for (const auto *item : items) {
+ if (Q_UNLIKELY(!item)) {
qWarning("QTreeWidget::mimeData: Null-item passed");
return 0;
}
for (int c = 0; c < item->values.count(); ++c) {
const QModelIndex index = indexFromItem(item, c);
- if (!index.isValid()) {
+ if (Q_UNLIKELY(!index.isValid())) {
qWarning() << "QTreeWidget::mimeData: No index associated with item :" << item;
return 0;
}
@@ -3340,18 +3340,29 @@ QList<QTreeWidgetItem*> QTreeWidget::items(const QMimeData *data) const
}
/*!
- Returns the QModelIndex assocated with the given \a item in the given \a column.
+ Returns the QModelIndex associated with the given \a item in the given \a column.
+
+ \note In Qt versions prior to 5.7, this function took a non-\c{const} \a item.
\sa itemFromIndex(), topLevelItem()
*/
-QModelIndex QTreeWidget::indexFromItem(QTreeWidgetItem *item, int column) const
+QModelIndex QTreeWidget::indexFromItem(const QTreeWidgetItem *item, int column) const
{
Q_D(const QTreeWidget);
return d->index(item, column);
}
/*!
- Returns a pointer to the QTreeWidgetItem assocated with the given \a index.
+ \overload
+ \internal
+*/
+QModelIndex QTreeWidget::indexFromItem(QTreeWidgetItem *item, int column) const
+{
+ return indexFromItem(const_cast<const QTreeWidgetItem *>(item), column);
+}
+
+/*!
+ Returns a pointer to the QTreeWidgetItem associated with the given \a index.
\sa indexFromItem()
*/
@@ -3371,12 +3382,12 @@ void QTreeWidget::dropEvent(QDropEvent *event) {
int col = -1;
int row = -1;
if (d->dropOn(event, &row, &col, &topIndex)) {
- QList<QModelIndex> idxs = selectedIndexes();
+ const QList<QModelIndex> idxs = selectedIndexes();
QList<QPersistentModelIndex> indexes;
const int indexesCount = idxs.count();
indexes.reserve(indexesCount);
- for (int i = 0; i < indexesCount; i++)
- indexes.append(idxs.at(i));
+ for (const auto &idx : idxs)
+ indexes.append(idx);
if (indexes.contains(topIndex))
return;
@@ -3386,12 +3397,12 @@ void QTreeWidget::dropEvent(QDropEvent *event) {
// Remove the items
QList<QTreeWidgetItem *> taken;
- for (int i = 0; i < indexes.count(); ++i) {
- QTreeWidgetItem *parent = itemFromIndex(indexes.at(i));
+ for (const auto &index : indexes) {
+ QTreeWidgetItem *parent = itemFromIndex(index);
if (!parent || !parent->parent()) {
- taken.append(takeTopLevelItem(indexes.at(i).row()));
+ taken.append(takeTopLevelItem(index.row()));
} else {
- taken.append(parent->parent()->takeChild(indexes.at(i).row()));
+ taken.append(parent->parent()->takeChild(index.row()));
}
}
diff --git a/src/widgets/itemviews/qtreewidget.h b/src/widgets/itemviews/qtreewidget.h
index 995528fe37..e39593c6c1 100644
--- a/src/widgets/itemviews/qtreewidget.h
+++ b/src/widgets/itemviews/qtreewidget.h
@@ -350,7 +350,8 @@ protected:
virtual Qt::DropActions supportedDropActions() const;
QList<QTreeWidgetItem*> items(const QMimeData *data) const;
- QModelIndex indexFromItem(QTreeWidgetItem *item, int column = 0) const;
+ QModelIndex indexFromItem(const QTreeWidgetItem *item, int column = 0) const;
+ QModelIndex indexFromItem(QTreeWidgetItem *item, int column = 0) const; // ### Qt 6: remove
QTreeWidgetItem *itemFromIndex(const QModelIndex &index) const;
void dropEvent(QDropEvent *event) Q_DECL_OVERRIDE;
diff --git a/src/widgets/itemviews/qwidgetitemdata_p.h b/src/widgets/itemviews/qwidgetitemdata_p.h
index d8c1fc2ff7..82427b338a 100644
--- a/src/widgets/itemviews/qwidgetitemdata_p.h
+++ b/src/widgets/itemviews/qwidgetitemdata_p.h
@@ -53,7 +53,7 @@ class QWidgetItemData
{
public:
inline QWidgetItemData() : role(-1) {}
- inline QWidgetItemData(int r, QVariant v) : role(r), value(v) {}
+ inline QWidgetItemData(int r, const QVariant &v) : role(r), value(v) {}
int role;
QVariant value;
inline bool operator==(const QWidgetItemData &other) const { return role == other.role && value == other.value; }
diff --git a/src/widgets/kernel/mac.pri b/src/widgets/kernel/mac.pri
index 4c507ae80e..8c694c5e05 100644
--- a/src/widgets/kernel/mac.pri
+++ b/src/widgets/kernel/mac.pri
@@ -1,4 +1,4 @@
-!x11:mac:!ios {
- LIBS_PRIVATE += -framework Carbon -framework Cocoa -lz
+!x11:osx {
+ LIBS_PRIVATE += -framework AppKit -lz
*-mwerks:INCLUDEPATH += compat
}
diff --git a/src/widgets/kernel/qaction.cpp b/src/widgets/kernel/qaction.cpp
index 2c4e4d3125..66e8e5379f 100644
--- a/src/widgets/kernel/qaction.cpp
+++ b/src/widgets/kernel/qaction.cpp
@@ -45,7 +45,7 @@
#include <private/qmenu_p.h>
#define QAPP_CHECK(functionName) \
- if (!qApp) { \
+ if (Q_UNLIKELY(!qApp)) { \
qWarning("QAction: Initialize QApplication before calling '" functionName "'."); \
return; \
}
diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp
index 4f13c06c15..095ab3005d 100644
--- a/src/widgets/kernel/qapplication.cpp
+++ b/src/widgets/kernel/qapplication.cpp
@@ -65,6 +65,7 @@
#include <QtGui/qstylehints.h>
#include <QtGui/qinputmethod.h>
#include <QtGui/private/qwindow_p.h>
+#include <QtGui/qtouchdevice.h>
#include <qpa/qplatformtheme.h>
#ifndef QT_NO_WHATSTHIS
#include <QtWidgets/QWhatsThis>
@@ -1124,9 +1125,9 @@ QStyle *QApplication::style()
QStyle *&app_style = QApplicationPrivate::app_style;
app_style = QStyleFactory::create(style);
if (!app_style) {
- QStringList styles = QStyleFactory::keys();
- for (int i = 0; i < styles.size(); ++i) {
- if ((app_style = QStyleFactory::create(styles.at(i))))
+ const QStringList styles = QStyleFactory::keys();
+ for (const auto &style : styles) {
+ if ((app_style = QStyleFactory::create(style)))
break;
}
}
@@ -1367,7 +1368,7 @@ int QApplication::colorSpec()
void QApplication::setColorSpec(int spec)
{
- if (qApp)
+ if (Q_UNLIKELY(qApp))
qWarning("QApplication::setColorSpec: This function must be "
"called before the QApplication object is created");
QApplicationPrivate::app_cspec = spec;
@@ -1741,8 +1742,7 @@ void QApplicationPrivate::notifyWindowIconChanged()
QWindowList windowList = QGuiApplication::topLevelWindows();
// send to all top-level QWidgets
- for (int i = 0; i < list.size(); ++i) {
- QWidget *w = list.at(i);
+ for (auto *w : list) {
windowList.removeOne(w->windowHandle());
QCoreApplication::sendEvent(w, &ev);
}
@@ -1904,9 +1904,9 @@ bool QApplicationPrivate::tryCloseAllWidgetWindows(QWindowList *processedWindows
processedWindows->append(window);
}
- QWidgetList list = QApplication::topLevelWidgets();
- for (int i = 0; i < list.size(); ++i) {
- QWidget *w = list.at(i);
+retry:
+ const QWidgetList list = QApplication::topLevelWidgets();
+ for (auto *w : list) {
if (w->isVisible() && w->windowType() != Qt::Desktop &&
!w->testAttribute(Qt::WA_DontShowOnScreen) && !w->data->is_closing) {
QWindow *window = w->windowHandle();
@@ -1914,8 +1914,7 @@ bool QApplicationPrivate::tryCloseAllWidgetWindows(QWindowList *processedWindows
return false;
if (window)
processedWindows->append(window);
- list = QApplication::topLevelWidgets();
- i = -1;
+ goto retry;
}
}
return true;
@@ -1994,9 +1993,8 @@ bool QApplication::event(QEvent *e)
ce->accept();
closeAllWindows();
- QWidgetList list = topLevelWidgets();
- for (int i = 0; i < list.size(); ++i) {
- QWidget *w = list.at(i);
+ const QWidgetList list = topLevelWidgets();
+ for (auto *w : list) {
if (w->isVisible() && !(w->windowType() == Qt::Desktop) && !(w->windowType() == Qt::Popup) &&
(!(w->windowType() == Qt::Dialog) || !w->parentWidget())) {
ce->ignore();
@@ -2010,9 +2008,8 @@ bool QApplication::event(QEvent *e)
} else if (e->type() == QEvent::LocaleChange) {
// on Windows the event propagation is taken care by the
// WM_SETTINGCHANGE event handler.
- QWidgetList list = topLevelWidgets();
- for (int i = 0; i < list.size(); ++i) {
- QWidget *w = list.at(i);
+ const QWidgetList list = topLevelWidgets();
+ for (auto *w : list) {
if (!(w->windowType() == Qt::Desktop)) {
if (!w->testAttribute(Qt::WA_SetLocale))
w->d_func()->setLocale_helper(QLocale(), true);
@@ -2056,9 +2053,8 @@ bool QApplication::event(QEvent *e)
}
if(e->type() == QEvent::LanguageChange) {
- QWidgetList list = topLevelWidgets();
- for (int i = 0; i < list.size(); ++i) {
- QWidget *w = list.at(i);
+ const QWidgetList list = topLevelWidgets();
+ for (auto *w : list) {
if (!(w->windowType() == Qt::Desktop))
postEvent(w, new QEvent(QEvent::LanguageChange));
}
@@ -2084,8 +2080,7 @@ void QApplicationPrivate::notifyLayoutDirectionChange()
QWindowList windowList = QGuiApplication::topLevelWindows();
// send to all top-level QWidgets
- for (int i = 0; i < list.size(); ++i) {
- QWidget *w = list.at(i);
+ for (auto *w : list) {
windowList.removeAll(w->windowHandle());
QEvent ev(QEvent::ApplicationLayoutDirectionChange);
QCoreApplication::sendEvent(w, &ev);
@@ -2136,9 +2131,8 @@ void QApplication::setActiveWindow(QWidget* act)
if (QApplicationPrivate::active_window) {
if (style()->styleHint(QStyle::SH_Widget_ShareActivation, 0, QApplicationPrivate::active_window)) {
- QWidgetList list = topLevelWidgets();
- for (int i = 0; i < list.size(); ++i) {
- QWidget *w = list.at(i);
+ const QWidgetList list = topLevelWidgets();
+ for (auto *w : list) {
if (w->isVisible() && w->isActiveWindow())
toBeDeactivated.append(w);
}
@@ -2159,9 +2153,8 @@ void QApplication::setActiveWindow(QWidget* act)
if (QApplicationPrivate::active_window) {
if (style()->styleHint(QStyle::SH_Widget_ShareActivation, 0, QApplicationPrivate::active_window)) {
- QWidgetList list = topLevelWidgets();
- for (int i = 0; i < list.size(); ++i) {
- QWidget *w = list.at(i);
+ const QWidgetList list = topLevelWidgets();
+ for (auto *w : list) {
if (w->isVisible() && w->isActiveWindow())
toBeActivated.append(w);
}
@@ -2319,7 +2312,6 @@ void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave, con
return;
#endif
- QWidget* w ;
if ((!enter && !leave) || (enter == leave))
return;
#ifdef ALIEN_DEBUG
@@ -2330,25 +2322,25 @@ void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave, con
bool sameWindow = leave && enter && leave->window() == enter->window();
if (leave && !sameWindow) {
- w = leave;
+ auto *w = leave;
do {
leaveList.append(w);
} while (!w->isWindow() && (w = w->parentWidget()));
}
if (enter && !sameWindow) {
- w = enter;
+ auto *w = enter;
do {
- enterList.prepend(w);
+ enterList.append(w);
} while (!w->isWindow() && (w = w->parentWidget()));
}
if (sameWindow) {
int enterDepth = 0;
int leaveDepth = 0;
- w = enter;
- while (!w->isWindow() && (w = w->parentWidget()))
+ auto *e = enter;
+ while (!e->isWindow() && (e = e->parentWidget()))
enterDepth++;
- w = leave;
- while (!w->isWindow() && (w = w->parentWidget()))
+ auto *l = leave;
+ while (!l->isWindow() && (l = l->parentWidget()))
leaveDepth++;
QWidget* wenter = enter;
QWidget* wleave = leave;
@@ -2365,21 +2357,16 @@ void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave, con
wleave = wleave->parentWidget();
}
- w = leave;
- while (w != wleave) {
+ for (auto *w = leave; w != wleave; w = w->parentWidget())
leaveList.append(w);
- w = w->parentWidget();
- }
- w = enter;
- while (w != wenter) {
- enterList.prepend(w);
- w = w->parentWidget();
- }
+
+ for (auto *w = enter; w != wenter; w = w->parentWidget())
+ enterList.append(w);
}
QEvent leaveEvent(QEvent::Leave);
for (int i = 0; i < leaveList.size(); ++i) {
- w = leaveList.at(i);
+ auto *w = leaveList.at(i);
if (!QApplication::activeModalWidget() || QApplicationPrivate::tryModalHelper(w, 0)) {
QApplication::sendEvent(w, &leaveEvent);
if (w->testAttribute(Qt::WA_Hover) &&
@@ -2396,9 +2383,9 @@ void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave, con
const QPoint globalPos = qIsInf(globalPosF.x())
? QPoint(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX)
: globalPosF.toPoint();
- const QPoint windowPos = enterList.front()->window()->mapFromGlobal(globalPos);
- for (int i = 0; i < enterList.size(); ++i) {
- w = enterList.at(i);
+ const QPoint windowPos = enterList.back()->window()->mapFromGlobal(globalPos);
+ for (auto it = enterList.crbegin(), end = enterList.crend(); it != end; ++it) {
+ auto *w = *it;
if (!QApplication::activeModalWidget() || QApplicationPrivate::tryModalHelper(w, 0)) {
const QPointF localPos = w->mapFromGlobal(globalPos);
QEnterEvent enterEvent(localPos, windowPos, globalPosF);
@@ -2421,7 +2408,7 @@ void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave, con
// This is not required on Windows as the cursor is reset on every single mouse move.
QWidget *parentOfLeavingCursor = 0;
for (int i = 0; i < leaveList.size(); ++i) {
- w = leaveList.at(i);
+ auto *w = leaveList.at(i);
if (!isAlien(w))
break;
if (w->testAttribute(Qt::WA_SetCursor)) {
@@ -2486,7 +2473,7 @@ bool QApplicationPrivate::isBlockedByModal(QWidget *widget)
bool QApplicationPrivate::isWindowBlocked(QWindow *window, QWindow **blockingWindow) const
{
QWindow *unused = 0;
- if (!window) {
+ if (Q_UNLIKELY(!window)) {
qWarning().nospace() << "window == 0 passed.";
return false;
}
@@ -3008,7 +2995,7 @@ bool QApplication::notify(QObject *receiver, QEvent *e)
if (QApplicationPrivate::is_app_closing)
return true;
- if (receiver == 0) { // serious error
+ if (Q_UNLIKELY(!receiver)) { // serious error
qWarning("QApplication::notify: Unexpected null receiver");
return true;
}
@@ -3257,7 +3244,7 @@ bool QApplication::notify(QObject *receiver, QEvent *e)
QObject *obj = d->extraData->eventFilters.at(i);
if (!obj)
continue;
- if (obj->d_func()->threadData != w->d_func()->threadData) {
+ if (Q_UNLIKELY(obj->d_func()->threadData != w->d_func()->threadData)) {
qWarning("QApplication: Object event filter cannot be in a different thread.");
continue;
}
@@ -4129,7 +4116,7 @@ bool QApplication::isEffectEnabled(Qt::UIEffect effect)
*/
void QApplication::beep()
{
- QMetaObject::invokeMethod(QGuiApplication::platformNativeInterface(), "beep");
+ QGuiApplicationPrivate::platformIntegration()->beep();
}
/*!
diff --git a/src/widgets/kernel/qdesktopwidget.cpp b/src/widgets/kernel/qdesktopwidget.cpp
index b88b3cc61d..d82d0691be 100644
--- a/src/widgets/kernel/qdesktopwidget.cpp
+++ b/src/widgets/kernel/qdesktopwidget.cpp
@@ -48,7 +48,7 @@ int QDesktopScreenWidget::screenNumber() const
const QRect QDesktopWidget::screenGeometry(const QWidget *widget) const
{
- if (!widget) {
+ if (Q_UNLIKELY(!widget)) {
qWarning("QDesktopWidget::screenGeometry(): Attempt "
"to get the screen geometry of a null widget");
return QRect();
@@ -61,7 +61,7 @@ const QRect QDesktopWidget::screenGeometry(const QWidget *widget) const
const QRect QDesktopWidget::availableGeometry(const QWidget *widget) const
{
- if (!widget) {
+ if (Q_UNLIKELY(!widget)) {
qWarning("QDesktopWidget::availableGeometry(): Attempt "
"to get the available geometry of a null widget");
return QRect();
diff --git a/src/widgets/kernel/qformlayout.cpp b/src/widgets/kernel/qformlayout.cpp
index a7f9021c42..464d09cde1 100644
--- a/src/widgets/kernel/qformlayout.cpp
+++ b/src/widgets/kernel/qformlayout.cpp
@@ -945,7 +945,7 @@ void QFormLayoutPrivate::setItem(int row, QFormLayout::ItemRole role, QLayoutIte
{
const bool fullRow = role == QFormLayout::SpanningRole;
const int column = role == QFormLayout::SpanningRole ? 1 : static_cast<int>(role);
- if (uint(row) >= uint(m_matrix.rowCount()) || uint(column) > 1U) {
+ if (Q_UNLIKELY(uint(row) >= uint(m_matrix.rowCount()) || uint(column) > 1U)) {
qWarning("QFormLayoutPrivate::setItem: Invalid cell (%d, %d)", row, column);
return;
}
@@ -953,7 +953,7 @@ void QFormLayoutPrivate::setItem(int row, QFormLayout::ItemRole role, QLayoutIte
if (!item)
return;
- if (m_matrix(row, column)) {
+ if (Q_UNLIKELY(m_matrix(row, column))) {
qWarning("QFormLayoutPrivate::setItem: Cell (%d, %d) already occupied", row, column);
return;
}
@@ -1000,7 +1000,7 @@ QLayoutItem* QFormLayoutPrivate::replaceAt(int index, QLayoutItem *newitem)
if (!newitem)
return 0;
const int storageIndex = storageIndexFromLayoutItem(m_matrix, m_things.value(index));
- if (storageIndex == -1) {
+ if (Q_UNLIKELY(storageIndex == -1)) {
// ### Qt6 - fix warning too when this class becomes public
qWarning("QFormLayoutPrivate::replaceAt: Invalid index %d", index);
return 0;
@@ -1414,7 +1414,7 @@ QLayoutItem *QFormLayout::takeAt(int index)
Q_D(QFormLayout);
const int storageIndex = storageIndexFromLayoutItem(d->m_matrix, d->m_things.value(index));
- if (storageIndex == -1) {
+ if (Q_UNLIKELY(storageIndex == -1)) {
qWarning("QFormLayout::takeAt: Invalid index %d", index);
return 0;
}
diff --git a/src/widgets/kernel/qgesturemanager.cpp b/src/widgets/kernel/qgesturemanager.cpp
index fb2914d53a..2bf5eece64 100644
--- a/src/widgets/kernel/qgesturemanager.cpp
+++ b/src/widgets/kernel/qgesturemanager.cpp
@@ -106,7 +106,7 @@ QGestureManager::QGestureManager(QObject *parent)
QGestureManager::~QGestureManager()
{
- qDeleteAll(m_recognizers.values());
+ qDeleteAll(m_recognizers);
foreach (QGestureRecognizer *recognizer, m_obsoleteGestures.keys()) {
qDeleteAll(m_obsoleteGestures.value(recognizer));
delete recognizer;
@@ -117,7 +117,7 @@ QGestureManager::~QGestureManager()
Qt::GestureType QGestureManager::registerGestureRecognizer(QGestureRecognizer *recognizer)
{
QGesture *dummy = recognizer->create(0);
- if (!dummy) {
+ if (Q_UNLIKELY(!dummy)) {
qWarning("QGestureManager::registerGestureRecognizer: "
"the recognizer fails to create a gesture object, skipping registration.");
return Qt::GestureType(0);
@@ -640,17 +640,17 @@ void QGestureManager::deliverEvents(const QSet<QGesture *> &gestures,
Q_ASSERT(gestureType != Qt::CustomGesture);
Q_UNUSED(gestureType);
- if (target) {
+ if (Q_UNLIKELY(!target)) {
+ qCDebug(lcGestureManager) << "QGestureManager::deliverEvent: could not find the target for gesture"
+ << gesture->gestureType();
+ qWarning("QGestureManager::deliverEvent: could not find the target for gesture");
+ undeliveredGestures->insert(gesture);
+ } else {
if (gesture->state() == Qt::GestureStarted) {
startedGestures.insert(gesture);
} else {
normalStartedGestures[target].append(gesture);
}
- } else {
- qCDebug(lcGestureManager) << "QGestureManager::deliverEvent: could not find the target for gesture"
- << gesture->gestureType();
- qWarning("QGestureManager::deliverEvent: could not find the target for gesture");
- undeliveredGestures->insert(gesture);
}
}
diff --git a/src/widgets/kernel/qgridlayout.cpp b/src/widgets/kernel/qgridlayout.cpp
index 85898ae86c..f3272731d9 100644
--- a/src/widgets/kernel/qgridlayout.cpp
+++ b/src/widgets/kernel/qgridlayout.cpp
@@ -557,9 +557,9 @@ void QGridLayoutPrivate::add(QGridBox *box, int row, int col)
void QGridLayoutPrivate::add(QGridBox *box, int row1, int row2, int col1, int col2)
{
- if (row2 >= 0 && row2 < row1)
+ if (Q_UNLIKELY(row2 >= 0 && row2 < row1))
qWarning("QGridLayout: Multi-cell fromRow greater than toRow");
- if (col2 >= 0 && col2 < col1)
+ if (Q_UNLIKELY(col2 >= 0 && col2 < col1))
qWarning("QGridLayout: Multi-cell fromCol greater than toCol");
if (row1 == row2 && col1 == col2) {
add(box, row1, col1);
@@ -1435,7 +1435,7 @@ void QGridLayout::addWidget(QWidget *widget, int row, int column, Qt::Alignment
Q_D(QGridLayout);
if (!d->checkWidget(widget))
return;
- if (row < 0 || column < 0) {
+ if (Q_UNLIKELY(row < 0 || column < 0)) {
qWarning("QGridLayout: Cannot add %s/%s to %s/%s at row %d column %d",
widget->metaObject()->className(), widget->objectName().toLocal8Bit().data(),
metaObject()->className(), objectName().toLocal8Bit().data(), row, column);
diff --git a/src/widgets/kernel/qlayout.cpp b/src/widgets/kernel/qlayout.cpp
index e74f17b6f7..eec60b14d0 100644
--- a/src/widgets/kernel/qlayout.cpp
+++ b/src/widgets/kernel/qlayout.cpp
@@ -129,11 +129,11 @@ QLayout::QLayout(QLayoutPrivate &dd, QLayout *lay, QWidget *w)
if (lay) {
lay->addItem(this);
} else if (w) {
- if (w->layout()) {
- qWarning("QLayout: Attempting to add QLayout \"%s\" to %s \"%s\", which"
+ if (Q_UNLIKELY(w->layout())) {
+ qWarning("QLayout: Attempting to add QLayout \"%ls\" to %s \"%ls\", which"
" already has a layout",
- qPrintable(QObject::objectName()), w->metaObject()->className(),
- w->objectName().toLocal8Bit().data());
+ qUtf16Printable(QObject::objectName()), w->metaObject()->className(),
+ qUtf16Printable(w->objectName()));
setParent(0);
} else {
d->topLevel = true;
@@ -469,7 +469,7 @@ QWidget *QLayout::parentWidget() const
if (!d->topLevel) {
if (parent()) {
QLayout *parentLayout = qobject_cast<QLayout*>(parent());
- if (!parentLayout) {
+ if (Q_UNLIKELY(!parentLayout)) {
qWarning("QLayout::parentWidget: A layout can only have another layout as a parent.");
return 0;
}
@@ -776,9 +776,9 @@ QLayout::~QLayout()
*/
void QLayout::addChildLayout(QLayout *l)
{
- if (l->parent()) {
- qWarning("QLayout::addChildLayout: layout \"%s\" already has a parent",
- l->objectName().toLocal8Bit().data());
+ if (Q_UNLIKELY(l->parent())) {
+ qWarning("QLayout::addChildLayout: layout \"%ls\" already has a parent",
+ qUtf16Printable(l->objectName()));
return;
}
l->setParent(this);
@@ -826,9 +826,9 @@ void QLayoutPrivate::reparentChildWidgets(QWidget *mw)
if (QWidget *w = item->widget()) {
QWidget *pw = w->parentWidget();
#ifdef QT_DEBUG
- if (pw && pw != mw && layoutDebug()) {
- qWarning("QLayout::addChildLayout: widget %s \"%s\" in wrong parent; moved to correct parent",
- w->metaObject()->className(), w->objectName().toLocal8Bit().data());
+ if (Q_UNLIKELY(pw && pw != mw && layoutDebug())) {
+ qWarning("QLayout::addChildLayout: widget %s \"%ls\" in wrong parent; moved to correct parent",
+ w->metaObject()->className(), qUtf16Printable(w->objectName()));
}
#endif
bool needShow = mwVisible && !(w->isHidden() && w->testAttribute(Qt::WA_WState_ExplicitShowHide));
@@ -849,15 +849,15 @@ void QLayoutPrivate::reparentChildWidgets(QWidget *mw)
bool QLayoutPrivate::checkWidget(QWidget *widget) const
{
Q_Q(const QLayout);
- if (!widget) {
- qWarning("QLayout: Cannot add a null widget to %s/%s", q->metaObject()->className(),
- qPrintable(q->objectName()));
+ if (Q_UNLIKELY(!widget)) {
+ qWarning("QLayout: Cannot add a null widget to %s/%ls", q->metaObject()->className(),
+ qUtf16Printable(q->objectName()));
return false;
}
- if (widget == q->parentWidget()) {
- qWarning("QLayout: Cannot add parent widget %s/%s to its child layout %s/%s",
- widget->metaObject()->className(), qPrintable(widget->objectName()),
- q->metaObject()->className(), qPrintable(q->objectName()));
+ if (Q_UNLIKELY(widget == q->parentWidget())) {
+ qWarning("QLayout: Cannot add parent widget %s/%ls to its child layout %s/%ls",
+ widget->metaObject()->className(), qUtf16Printable(widget->objectName()),
+ q->metaObject()->className(), qUtf16Printable(q->objectName()));
return false;
}
return true;
@@ -870,14 +870,14 @@ bool QLayoutPrivate::checkWidget(QWidget *widget) const
bool QLayoutPrivate::checkLayout(QLayout *otherLayout) const
{
Q_Q(const QLayout);
- if (!otherLayout) {
- qWarning("QLayout: Cannot add a null layout to %s/%s", q->metaObject()->className(),
- qPrintable(q->objectName()));
+ if (Q_UNLIKELY(!otherLayout)) {
+ qWarning("QLayout: Cannot add a null layout to %s/%ls",
+ q->metaObject()->className(), qUtf16Printable(q->objectName()));
return false;
}
- if (otherLayout == q) {
- qWarning("QLayout: Cannot add layout %s/%s to itself", q->metaObject()->className(),
- qPrintable(q->objectName()));
+ if (Q_UNLIKELY(otherLayout == q)) {
+ qWarning("QLayout: Cannot add layout %s/%ls to itself",
+ q->metaObject()->className(), qUtf16Printable(q->objectName()));
return false;
}
return true;
@@ -902,17 +902,17 @@ void QLayout::addChildWidget(QWidget *w)
QLayout *l = pw->layout();
if (l && removeWidgetRecursively(l, w)) {
#ifdef QT_DEBUG
- if (layoutDebug())
- qWarning("QLayout::addChildWidget: %s \"%s\" is already in a layout; moved to new layout",
- w->metaObject()->className(), w->objectName().toLocal8Bit().data());
+ if (Q_UNLIKELY(layoutDebug()))
+ qWarning("QLayout::addChildWidget: %s \"%ls\" is already in a layout; moved to new layout",
+ w->metaObject()->className(), qUtf16Printable(w->objectName()));
#endif
}
}
if (pw && mw && pw != mw) {
#ifdef QT_DEBUG
- if (layoutDebug())
- qWarning("QLayout::addChildWidget: %s \"%s\" in wrong parent; moved to correct parent",
- w->metaObject()->className(), w->objectName().toLocal8Bit().data());
+ if (Q_UNLIKELY(layoutDebug()))
+ qWarning("QLayout::addChildWidget: %s \"%ls\" in wrong parent; moved to correct parent",
+ w->metaObject()->className(), qUtf16Printable(w->objectName()));
#endif
pw = 0;
}
@@ -1064,9 +1064,9 @@ bool QLayout::activate()
if (d->activated)
return false;
QWidget *mw = static_cast<QWidget*>(parent());
- if (mw == 0) {
- qWarning("QLayout::activate: %s \"%s\" does not have a main widget",
- QObject::metaObject()->className(), QObject::objectName().toLocal8Bit().data());
+ if (Q_UNLIKELY(!mw)) {
+ qWarning("QLayout::activate: %s \"%ls\" does not have a main widget",
+ metaObject()->className(), qUtf16Printable(objectName()));
return false;
}
activateRecursiveHelper(this);
diff --git a/src/widgets/kernel/qopenglwidget.cpp b/src/widgets/kernel/qopenglwidget.cpp
index a80db3f60b..7051f970ff 100644
--- a/src/widgets/kernel/qopenglwidget.cpp
+++ b/src/widgets/kernel/qopenglwidget.cpp
@@ -740,7 +740,7 @@ void QOpenGLWidgetPrivate::initialize()
// texture usable by the underlying window's backingstore.
QWidget *tlw = q->window();
QOpenGLContext *shareContext = get(tlw)->shareContext();
- if (!shareContext) {
+ if (Q_UNLIKELY(!shareContext)) {
qWarning("QOpenGLWidget: Cannot be used without a context shared with the toplevel.");
return;
}
@@ -756,7 +756,7 @@ void QOpenGLWidgetPrivate::initialize()
ctx->setShareContext(shareContext);
ctx->setFormat(requestedFormat);
ctx->setScreen(shareContext->screen());
- if (!ctx->create()) {
+ if (Q_UNLIKELY(!ctx->create())) {
qWarning("QOpenGLWidget: Failed to create context");
return;
}
@@ -782,7 +782,7 @@ void QOpenGLWidgetPrivate::initialize()
surface->setScreen(ctx->screen());
surface->create();
- if (!ctx->makeCurrent(surface)) {
+ if (Q_UNLIKELY(!ctx->makeCurrent(surface))) {
qWarning("QOpenGLWidget: Failed to make context current");
return;
}
@@ -915,10 +915,10 @@ QOpenGLWidget::QOpenGLWidget(QWidget *parent, Qt::WindowFlags f)
: QWidget(*(new QOpenGLWidgetPrivate), parent, f)
{
Q_D(QOpenGLWidget);
- if (QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::RasterGLSurface))
- d->setRenderToTexture();
- else
+ if (Q_UNLIKELY(!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::RasterGLSurface)))
qWarning("QOpenGLWidget is not supported on this platform.");
+ else
+ d->setRenderToTexture();
}
/*!
@@ -984,7 +984,7 @@ void QOpenGLWidget::setFormat(const QSurfaceFormat &format)
{
Q_UNUSED(format);
Q_D(QOpenGLWidget);
- if (d->initialized) {
+ if (Q_UNLIKELY(d->initialized)) {
qWarning("QOpenGLWidget: Already initialized, setting the format has no effect");
return;
}
diff --git a/src/widgets/kernel/qshortcut.cpp b/src/widgets/kernel/qshortcut.cpp
index c08c4eeb32..55b57c5c57 100644
--- a/src/widgets/kernel/qshortcut.cpp
+++ b/src/widgets/kernel/qshortcut.cpp
@@ -49,7 +49,7 @@
QT_BEGIN_NAMESPACE
#define QAPP_CHECK(functionName) \
- if (!qApp) { \
+ if (Q_UNLIKELY(!qApp)) { \
qWarning("QShortcut: Initialize QApplication before calling '" functionName "'."); \
return; \
}
@@ -410,7 +410,7 @@ public:
void QShortcutPrivate::redoGrab(QShortcutMap &map)
{
Q_Q(QShortcut);
- if (!parent) {
+ if (Q_UNLIKELY(!parent)) {
qWarning("QShortcut: No widget parent defined");
return;
}
diff --git a/src/widgets/kernel/qstackedlayout.cpp b/src/widgets/kernel/qstackedlayout.cpp
index 957b6f09b5..b76e92bc35 100644
--- a/src/widgets/kernel/qstackedlayout.cpp
+++ b/src/widgets/kernel/qstackedlayout.cpp
@@ -57,7 +57,7 @@ QLayoutItem* QStackedLayoutPrivate::replaceAt(int idx, QLayoutItem *newitem)
if (idx < 0 || idx >= list.size() || !newitem)
return 0;
QWidget *wdg = newitem->widget();
- if (!wdg) {
+ if (Q_UNLIKELY(!wdg)) {
qWarning("QStackedLayout::replaceAt: Only widgets can be added");
return 0;
}
@@ -367,7 +367,7 @@ int QStackedLayout::currentIndex() const
void QStackedLayout::setCurrentWidget(QWidget *widget)
{
int index = indexOf(widget);
- if (index == -1) {
+ if (Q_UNLIKELY(index == -1)) {
qWarning("QStackedLayout::setCurrentWidget: Widget %p not contained in stack", widget);
return;
}
@@ -420,12 +420,12 @@ int QStackedLayout::count() const
void QStackedLayout::addItem(QLayoutItem *item)
{
QWidget *widget = item->widget();
- if (widget) {
- addWidget(widget);
- delete item;
- } else {
+ if (Q_UNLIKELY(!widget)) {
qWarning("QStackedLayout::addItem: Only widgets can be added");
+ return;
}
+ addWidget(widget);
+ delete item;
}
/*!
diff --git a/src/widgets/kernel/qtooltip.cpp b/src/widgets/kernel/qtooltip.cpp
index 51bf6e4684..39a58d60dc 100644
--- a/src/widgets/kernel/qtooltip.cpp
+++ b/src/widgets/kernel/qtooltip.cpp
@@ -264,12 +264,12 @@ void QTipLabel::hideTipImmediately()
void QTipLabel::setTipRect(QWidget *w, const QRect &r)
{
- if (!r.isNull() && !w)
+ if (Q_UNLIKELY(!r.isNull() && !w)) {
qWarning("QToolTip::setTipRect: Cannot pass null widget if rect is set");
- else{
- widget = w;
- rect = r;
+ return;
}
+ widget = w;
+ rect = r;
}
void QTipLabel::timerEvent(QTimerEvent *e)
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp
index 229cfc0f85..2f436b11af 100644
--- a/src/widgets/kernel/qwidget.cpp
+++ b/src/widgets/kernel/qwidget.cpp
@@ -290,7 +290,7 @@ QWidgetPrivate::QWidgetPrivate(int version)
, qd_hd(0)
#endif
{
- if (!qApp) {
+ if (Q_UNLIKELY(!qApp)) {
qFatal("QWidget: Must construct a QApplication before a QWidget");
return;
}
@@ -300,7 +300,7 @@ QWidgetPrivate::QWidgetPrivate(int version)
// This allows incompatible versions to be loaded, possibly for testing.
Q_UNUSED(version);
#else
- if (version != QObjectPrivateVersion)
+ if (Q_UNLIKELY(version != QObjectPrivateVersion))
qFatal("Cannot mix incompatible Qt library (version 0x%x) with this library (version 0x%x)",
version, QObjectPrivateVersion);
#endif
@@ -1117,7 +1117,7 @@ void QWidgetPrivate::adjustFlags(Qt::WindowFlags &flags, QWidget *w)
void QWidgetPrivate::init(QWidget *parentWidget, Qt::WindowFlags f)
{
Q_Q(QWidget);
- if (!qobject_cast<QApplication *>(QCoreApplication::instance()))
+ if (Q_UNLIKELY(!qobject_cast<QApplication *>(QCoreApplication::instance())))
qFatal("QWidget: Cannot create a QWidget without QApplication");
Q_ASSERT(allWidgets);
@@ -1532,7 +1532,7 @@ QWidget::~QWidget()
d->data.in_destructor = true;
#if defined (QT_CHECK_STATE)
- if (paintingActive())
+ if (Q_UNLIKELY(paintingActive()))
qWarning("QWidget: %s (%s) deleted while being painted", className(), name());
#endif
@@ -1987,11 +1987,14 @@ void QWidgetPrivate::propagatePaletteChange()
}
int mask = data.pal.resolve() | inheritedPaletteResolveMask;
+ const bool useStyleSheetPropagationInWidgetStyles =
+ QCoreApplication::testAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles);
+
QEvent pc(QEvent::PaletteChange);
QApplication::sendEvent(q, &pc);
for (int i = 0; i < children.size(); ++i) {
QWidget *w = qobject_cast<QWidget*>(children.at(i));
- if (w && !w->testAttribute(Qt::WA_StyleSheet)
+ if (w && (!w->testAttribute(Qt::WA_StyleSheet) || useStyleSheetPropagationInWidgetStyles)
&& (!w->isWindow() || w->testAttribute(Qt::WA_WindowPropagation))) {
QWidgetPrivate *wd = w->d_func();
wd->inheritedPaletteResolveMask = mask;
@@ -3291,7 +3294,7 @@ void QWidget::addActions(QList<QAction*> actions)
*/
void QWidget::insertAction(QAction *before, QAction *action)
{
- if(!action) {
+ if (Q_UNLIKELY(!action)) {
qWarning("QWidget::insertAction: Attempt to insert null action");
return;
}
@@ -3323,7 +3326,11 @@ void QWidget::insertAction(QAction *before, QAction *action)
\sa removeAction(), QMenu, insertAction(), contextMenuPolicy
*/
+#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
+void QWidget::insertActions(QAction *before, const QList<QAction*> &actions)
+#else
void QWidget::insertActions(QAction *before, QList<QAction*> actions)
+#endif
{
for(int i = 0; i < actions.count(); ++i)
insertAction(before, actions.at(i));
@@ -3937,7 +3944,7 @@ bool QWidgetPrivate::setMinimumSize_helper(int &minw, int &minh)
mw = 0;
if (mh == QWIDGETSIZE_MAX)
mh = 0;
- if (minw > QWIDGETSIZE_MAX || minh > QWIDGETSIZE_MAX) {
+ if (Q_UNLIKELY(minw > QWIDGETSIZE_MAX || minh > QWIDGETSIZE_MAX)) {
qWarning("QWidget::setMinimumSize: (%s/%s) "
"The largest allowed size is (%d,%d)",
q->objectName().toLocal8Bit().data(), q->metaObject()->className(), QWIDGETSIZE_MAX,
@@ -3945,7 +3952,7 @@ bool QWidgetPrivate::setMinimumSize_helper(int &minw, int &minh)
minw = mw = qMin<int>(minw, QWIDGETSIZE_MAX);
minh = mh = qMin<int>(minh, QWIDGETSIZE_MAX);
}
- if (minw < 0 || minh < 0) {
+ if (Q_UNLIKELY(minw < 0 || minh < 0)) {
qWarning("QWidget::setMinimumSize: (%s/%s) Negative sizes (%d,%d) "
"are not possible",
q->objectName().toLocal8Bit().data(), q->metaObject()->className(), minw, minh);
@@ -4019,7 +4026,7 @@ void QWidget::setMinimumSize(int minw, int minh)
bool QWidgetPrivate::setMaximumSize_helper(int &maxw, int &maxh)
{
Q_Q(QWidget);
- if (maxw > QWIDGETSIZE_MAX || maxh > QWIDGETSIZE_MAX) {
+ if (Q_UNLIKELY(maxw > QWIDGETSIZE_MAX || maxh > QWIDGETSIZE_MAX)) {
qWarning("QWidget::setMaximumSize: (%s/%s) "
"The largest allowed size is (%d,%d)",
q->objectName().toLocal8Bit().data(), q->metaObject()->className(), QWIDGETSIZE_MAX,
@@ -4027,7 +4034,7 @@ bool QWidgetPrivate::setMaximumSize_helper(int &maxw, int &maxh)
maxw = qMin<int>(maxw, QWIDGETSIZE_MAX);
maxh = qMin<int>(maxh, QWIDGETSIZE_MAX);
}
- if (maxw < 0 || maxh < 0) {
+ if (Q_UNLIKELY(maxw < 0 || maxh < 0)) {
qWarning("QWidget::setMaximumSize: (%s/%s) Negative sizes (%d,%d) "
"are not possible",
q->objectName().toLocal8Bit().data(), q->metaObject()->className(), maxw, maxh);
@@ -4576,15 +4583,19 @@ void QWidget::setPalette(const QPalette &palette)
QPalette QWidgetPrivate::naturalWidgetPalette(uint inheritedMask) const
{
Q_Q(const QWidget);
+
+ const bool useStyleSheetPropagationInWidgetStyles =
+ QCoreApplication::testAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles);
+
QPalette naturalPalette = QApplication::palette(q);
- if (!q->testAttribute(Qt::WA_StyleSheet)
+ if ((!q->testAttribute(Qt::WA_StyleSheet) || useStyleSheetPropagationInWidgetStyles)
&& (!q->isWindow() || q->testAttribute(Qt::WA_WindowPropagation)
#ifndef QT_NO_GRAPHICSVIEW
|| (extra && extra->proxyWidget)
#endif //QT_NO_GRAPHICSVIEW
)) {
if (QWidget *p = q->parentWidget()) {
- if (!p->testAttribute(Qt::WA_StyleSheet)) {
+ if (!p->testAttribute(Qt::WA_StyleSheet) || useStyleSheetPropagationInWidgetStyles) {
if (!naturalPalette.isCopyOf(QApplication::palette())) {
QPalette inheritedPalette = p->palette();
inheritedPalette.resolve(inheritedMask);
@@ -4720,15 +4731,19 @@ void QWidget::setFont(const QFont &font)
QFont QWidgetPrivate::naturalWidgetFont(uint inheritedMask) const
{
Q_Q(const QWidget);
+
+ const bool useStyleSheetPropagationInWidgetStyles =
+ QCoreApplication::testAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles);
+
QFont naturalFont = QApplication::font(q);
- if (!q->testAttribute(Qt::WA_StyleSheet)
+ if ((!q->testAttribute(Qt::WA_StyleSheet) || useStyleSheetPropagationInWidgetStyles)
&& (!q->isWindow() || q->testAttribute(Qt::WA_WindowPropagation)
#ifndef QT_NO_GRAPHICSVIEW
|| (extra && extra->proxyWidget)
#endif //QT_NO_GRAPHICSVIEW
)) {
if (QWidget *p = q->parentWidget()) {
- if (!p->testAttribute(Qt::WA_StyleSheet)) {
+ if (!p->testAttribute(Qt::WA_StyleSheet) || useStyleSheetPropagationInWidgetStyles) {
if (!naturalFont.isCopyOf(QApplication::font())) {
if (inheritedMask != 0) {
QFont inheritedFont = p->font();
@@ -4784,6 +4799,8 @@ void QWidgetPrivate::updateFont(const QFont &font)
#ifndef QT_NO_STYLE_STYLESHEET
const QStyleSheetStyle* cssStyle;
cssStyle = extra ? qobject_cast<const QStyleSheetStyle*>(extra->style) : 0;
+ const bool useStyleSheetPropagationInWidgetStyles =
+ QCoreApplication::testAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles);
#endif
data.fnt = QFont(font, q);
@@ -4808,7 +4825,7 @@ void QWidgetPrivate::updateFont(const QFont &font)
if (w) {
if (0) {
#ifndef QT_NO_STYLE_STYLESHEET
- } else if (w->testAttribute(Qt::WA_StyleSheet)) {
+ } else if (!useStyleSheetPropagationInWidgetStyles && w->testAttribute(Qt::WA_StyleSheet)) {
// Style sheets follow a different font propagation scheme.
if (cssStyle)
cssStyle->updateStyleSheetFont(w);
@@ -4823,7 +4840,7 @@ void QWidgetPrivate::updateFont(const QFont &font)
}
#ifndef QT_NO_STYLE_STYLESHEET
- if (cssStyle) {
+ if (!useStyleSheetPropagationInWidgetStyles && cssStyle) {
cssStyle->updateStyleSheetFont(q);
}
#endif
@@ -5005,7 +5022,7 @@ void QWidgetPrivate::unsetCursor_sys()
qt_qpa_set_cursor(q, false);
}
-static inline void applyCursor(QWidget *w, QCursor c)
+static inline void applyCursor(QWidget *w, const QCursor &c)
{
if (QWindow *window = w->windowHandle())
window->setCursor(c);
@@ -5118,12 +5135,12 @@ void QWidget::render(QPaintDevice *target, const QPoint &targetOffset,
void QWidget::render(QPainter *painter, const QPoint &targetOffset,
const QRegion &sourceRegion, RenderFlags renderFlags)
{
- if (!painter) {
+ if (Q_UNLIKELY(!painter)) {
qWarning("QWidget::render: Null pointer to painter");
return;
}
- if (!painter->isActive()) {
+ if (Q_UNLIKELY(!painter->isActive())) {
qWarning("QWidget::render: Cannot render with an inactive painter");
return;
}
@@ -5177,9 +5194,9 @@ void QWidget::render(QPainter *painter, const QPoint &targetOffset,
d->render(target, targetOffset, toBePainted, renderFlags);
// Restore system clip, viewport and transform.
- enginePriv->systemClip = oldSystemClip;
enginePriv->setSystemViewport(oldSystemViewport);
enginePriv->setSystemTransform(oldTransform);
+ enginePriv->systemClip = oldSystemClip;
// Restore shared painter.
d->setSharedPainter(oldPainter);
@@ -5512,7 +5529,7 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP
if (!toBePainted.isEmpty()) {
if (!onScreen || alsoOnScreen) {
//update the "in paint event" flag
- if (q->testAttribute(Qt::WA_WState_InPaintEvent))
+ if (Q_UNLIKELY(q->testAttribute(Qt::WA_WState_InPaintEvent)))
qWarning("QWidget::repaint: Recursive repaint detected");
q->setAttribute(Qt::WA_WState_InPaintEvent);
@@ -5623,7 +5640,7 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP
setSystemClip(pdev, QRegion());
}
q->setAttribute(Qt::WA_WState_InPaintEvent, false);
- if (q->paintingActive())
+ if (Q_UNLIKELY(q->paintingActive()))
qWarning("QWidget::repaint: It is dangerous to leave painters active on a widget outside of the PaintEvent");
if (paintEngine && paintEngine->autoDestruct()) {
@@ -5672,7 +5689,7 @@ void QWidgetPrivate::sendPaintEvent(const QRegion &toBePainted)
void QWidgetPrivate::render(QPaintDevice *target, const QPoint &targetOffset,
const QRegion &sourceRegion, QWidget::RenderFlags renderFlags)
{
- if (!target) {
+ if (Q_UNLIKELY(!target)) {
qWarning("QWidget::render: null pointer to paint device");
return;
}
@@ -5806,7 +5823,7 @@ QRectF QWidgetEffectSourcePrivate::boundingRect(Qt::CoordinateSystem system) con
if (system != Qt::DeviceCoordinates)
return m_widget->rect();
- if (!context) {
+ if (Q_UNLIKELY(!context)) {
// Device coordinates without context not yet supported.
qWarning("QGraphicsEffectSource::boundingRect: Not yet implemented, lacking device context");
return QRectF();
@@ -5838,7 +5855,7 @@ QPixmap QWidgetEffectSourcePrivate::pixmap(Qt::CoordinateSystem system, QPoint *
QGraphicsEffect::PixmapPadMode mode) const
{
const bool deviceCoordinates = (system == Qt::DeviceCoordinates);
- if (!context && deviceCoordinates) {
+ if (Q_UNLIKELY(!context && deviceCoordinates)) {
// Device coordinates without context not yet supported.
qWarning("QGraphicsEffectSource::pixmap: Not yet implemented, lacking device context");
return QPixmap();
@@ -6371,7 +6388,7 @@ void QWidget::setFocusProxy(QWidget * w)
return;
for (QWidget* fp = w; fp; fp = fp->focusProxy()) {
- if (fp == this) {
+ if (Q_UNLIKELY(fp == this)) {
qWarning("QWidget: %s (%s) already in focus proxy chain", metaObject()->className(), objectName().toLocal8Bit().constData());
return;
}
@@ -6885,7 +6902,7 @@ void QWidget::setTabOrder(QWidget* first, QWidget *second)
if (!first || !second || first->focusPolicy() == Qt::NoFocus || second->focusPolicy() == Qt::NoFocus)
return;
- if (first->window() != second->window()) {
+ if (Q_UNLIKELY(first->window() != second->window())) {
qWarning("QWidget::setTabOrder: 'first' and 'second' must be in the same window");
return;
}
@@ -10042,12 +10059,12 @@ QLayout *QWidget::layout() const
void QWidget::setLayout(QLayout *l)
{
- if (!l) {
+ if (Q_UNLIKELY(!l)) {
qWarning("QWidget::setLayout: Cannot set layout to 0");
return;
}
if (layout()) {
- if (layout() != l)
+ if (Q_UNLIKELY(layout() != l))
qWarning("QWidget::setLayout: Attempting to set QLayout \"%s\" on %s \"%s\", which already has a"
" layout", l->objectName().toLocal8Bit().data(), metaObject()->className(),
objectName().toLocal8Bit().data());
@@ -10489,7 +10506,11 @@ void QWidget::setParent(QWidget *parent, Qt::WindowFlags f)
d->reparentFocusWidgets(oldtlw);
setAttribute(Qt::WA_Resized, resized);
- if (!testAttribute(Qt::WA_StyleSheet)
+
+ const bool useStyleSheetPropagationInWidgetStyles =
+ QCoreApplication::testAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles);
+
+ if (!useStyleSheetPropagationInWidgetStyles && !testAttribute(Qt::WA_StyleSheet)
&& (!parent || !parent->testAttribute(Qt::WA_StyleSheet))) {
d->resolveFont();
d->resolvePalette();
@@ -11388,7 +11409,7 @@ void QWidgetPrivate::setWindowModified_helper()
return;
bool on = q->testAttribute(Qt::WA_WindowModified);
if (!platformWindow->setWindowModified(on)) {
- if (!q->windowTitle().contains(QLatin1String("[*]")) && on)
+ if (Q_UNLIKELY(on && !q->windowTitle().contains(QLatin1String("[*]"))))
qWarning("QWidget::setWindowModified: The window title does not contain a '[*]' placeholder");
setWindowTitle_helper(q->windowTitle());
setWindowIconText_helper(q->windowIconText());
@@ -12138,7 +12159,7 @@ QOpenGLContext *QWidgetPrivate::shareContext() const
#ifdef QT_NO_OPENGL
return 0;
#else
- if (!extra || !extra->topextra || !extra->topextra->window) {
+ if (Q_UNLIKELY(!extra || !extra->topextra || !extra->topextra->window)) {
qWarning("Asking for share context for widget that does not have a window handle");
return 0;
}
diff --git a/src/widgets/kernel/qwidget.h b/src/widgets/kernel/qwidget.h
index a56f6e1133..638c962e68 100644
--- a/src/widgets/kernel/qwidget.h
+++ b/src/widgets/kernel/qwidget.h
@@ -541,11 +541,12 @@ public:
void addAction(QAction *action);
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
void addActions(const QList<QAction*> &actions);
+ void insertActions(const QAction *before, const QList<QAction*> &actions);
#else
void addActions(QList<QAction*> actions);
+ void insertActions(QAction *before, QList<QAction*> actions);
#endif
void insertAction(QAction *before, QAction *action);
- void insertActions(QAction *before, QList<QAction*> actions);
void removeAction(QAction *action);
QList<QAction*> actions() const;
#endif
diff --git a/src/widgets/kernel/qwidgetbackingstore.cpp b/src/widgets/kernel/qwidgetbackingstore.cpp
index 3f7f9291b6..63419ea093 100644
--- a/src/widgets/kernel/qwidgetbackingstore.cpp
+++ b/src/widgets/kernel/qwidgetbackingstore.cpp
@@ -1606,7 +1606,7 @@ void QWidgetPrivate::repaint_sys(const QRegion &rgn)
QWidgetBackingStore::unflushPaint(q, toBePainted);
#endif
- if (q->paintingActive())
+ if (Q_UNLIKELY(q->paintingActive()))
qWarning("QWidget::repaint: It is dangerous to leave painters active on a widget outside of the PaintEvent");
}
diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp
index 3637b76aa9..e65c2c8bef 100644
--- a/src/widgets/kernel/qwidgetwindow.cpp
+++ b/src/widgets/kernel/qwidgetwindow.cpp
@@ -283,7 +283,7 @@ bool QWidgetWindow::event(QEvent *event)
case QEvent::ContextMenu:
handleContextMenuEvent(static_cast<QContextMenuEvent *>(event));
return true;
-#endif
+#endif // QT_NO_CONTEXTMENU
// Handing show events to widgets (see below) here would cause them to be triggered twice
case QEvent::Show:
@@ -510,8 +510,12 @@ void QWidgetWindow::handleMouseEvent(QMouseEvent *event)
popupEvent = popupChild;
QContextMenuEvent e(QContextMenuEvent::Mouse, mapped, event->globalPos(), event->modifiers());
QApplication::sendSpontaneousEvent(popupEvent, &e);
-#endif
}
+#else
+ Q_UNUSED(contextMenuTrigger)
+ Q_UNUSED(oldOpenPopupCount)
+ }
+#endif
if (releaseAfter) {
qt_button_down = 0;
@@ -794,7 +798,7 @@ void QWidgetWindow::handleDragLeaveEvent(QDragLeaveEvent *event)
void QWidgetWindow::handleDropEvent(QDropEvent *event)
{
- if (m_dragTarget.isNull()) {
+ if (Q_UNLIKELY(m_dragTarget.isNull())) {
qWarning() << m_widget << ": No drag target set.";
event->ignore();
return;
diff --git a/src/widgets/kernel/qwindowcontainer.cpp b/src/widgets/kernel/qwindowcontainer.cpp
index 3885431b05..98a3330822 100644
--- a/src/widgets/kernel/qwindowcontainer.cpp
+++ b/src/widgets/kernel/qwindowcontainer.cpp
@@ -193,7 +193,7 @@ QWindowContainer::QWindowContainer(QWindow *embeddedWindow, QWidget *parent, Qt:
: QWidget(*new QWindowContainerPrivate, parent, flags)
{
Q_D(QWindowContainer);
- if (!embeddedWindow) {
+ if (Q_UNLIKELY(!embeddedWindow)) {
qWarning("QWindowContainer: embedded window cannot be null");
return;
}
diff --git a/src/widgets/styles/qandroidstyle.cpp b/src/widgets/styles/qandroidstyle.cpp
index 4489f36ab7..9a0e4ba32a 100644
--- a/src/widgets/styles/qandroidstyle.cpp
+++ b/src/widgets/styles/qandroidstyle.cpp
@@ -84,7 +84,7 @@ QAndroidStyle::QAndroidStyle()
++objectIterator) {
QString key = objectIterator.key();
QJsonValue value = objectIterator.value();
- if (!value.isObject()) {
+ if (Q_UNLIKELY(!value.isObject())) {
qWarning("Style.json structure is unrecognized.");
continue;
}
diff --git a/src/widgets/styles/qcommonstyle.cpp b/src/widgets/styles/qcommonstyle.cpp
index 355a3d2c3f..a14ca84388 100644
--- a/src/widgets/styles/qcommonstyle.cpp
+++ b/src/widgets/styles/qcommonstyle.cpp
@@ -552,18 +552,31 @@ void QCommonStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, Q
case PE_IndicatorTabTear:
if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) {
bool rtl = tab->direction == Qt::RightToLeft;
- QRect rect = tab->rect;
+ const bool horizontal = tab->rect.height() > tab->rect.width();
+ const int margin = 4;
QPainterPath path;
- rect.setTop(rect.top() + ((tab->state & State_Selected) ? 1 : 3));
- rect.setBottom(rect.bottom() - ((tab->state & State_Selected) ? 0 : 2));
+ if (horizontal) {
+ QRect rect = tab->rect.adjusted(rtl ? margin : 0, 0, rtl ? 1 : -margin, 0);
+ rect.setTop(rect.top() + ((tab->state & State_Selected) ? 1 : 3));
+ rect.setBottom(rect.bottom() - ((tab->state & State_Selected) ? 0 : 2));
- path.moveTo(QPoint(rtl ? rect.right() : rect.left(), rect.top()));
- int count = 4;
- for(int jags = 1; jags <= count; ++jags, rtl = !rtl)
- path.lineTo(QPoint(rtl ? rect.left() : rect.right(), rect.top() + jags * rect.height()/count));
+ path.moveTo(QPoint(rtl ? rect.right() : rect.left(), rect.top()));
+ int count = 4;
+ for (int jags = 1; jags <= count; ++jags, rtl = !rtl)
+ path.lineTo(QPoint(rtl ? rect.left() : rect.right(), rect.top() + jags * rect.height()/count));
+ } else {
+ QRect rect = tab->rect.adjusted(0, 0, 0, -margin);
+ rect.setLeft(rect.left() + ((tab->state & State_Selected) ? 1 : 3));
+ rect.setRight(rect.right() - ((tab->state & State_Selected) ? 0 : 2));
+
+ path.moveTo(QPoint(rect.left(), rect.top()));
+ int count = 4;
+ for (int jags = 1; jags <= count; ++jags, rtl = !rtl)
+ path.lineTo(QPoint(rect.left() + jags * rect.width()/count, rtl ? rect.top() : rect.bottom()));
+ }
- p->setPen(QPen(tab->palette.light(), qreal(.8)));
+ p->setPen(QPen(tab->palette.dark(), qreal(.8)));
p->setBrush(tab->palette.background());
p->setRenderHint(QPainter::Antialiasing);
p->drawPath(path);
@@ -2780,13 +2793,13 @@ QRect QCommonStyle::subElementRect(SubElement sr, const QStyleOption *opt,
case QTabBar::TriangularNorth:
case QTabBar::RoundedSouth:
case QTabBar::TriangularSouth:
- r.setRect(tab->rect.left(), tab->rect.top(), 4, opt->rect.height());
+ r.setRect(tab->rect.left(), tab->rect.top(), 8, opt->rect.height());
break;
case QTabBar::RoundedWest:
case QTabBar::TriangularWest:
case QTabBar::RoundedEast:
case QTabBar::TriangularEast:
- r.setRect(tab->rect.left(), tab->rect.top(), opt->rect.width(), 4);
+ r.setRect(tab->rect.left(), tab->rect.top(), opt->rect.width(), 8);
break;
default:
break;
@@ -2794,6 +2807,23 @@ QRect QCommonStyle::subElementRect(SubElement sr, const QStyleOption *opt,
r = visualRect(opt->direction, opt->rect, r);
}
break;
+ case SE_TabBarScrollLeftButton: {
+ const bool vertical = opt->rect.width() < opt->rect.height();
+ const Qt::LayoutDirection ld = widget->layoutDirection();
+ const int buttonWidth = qMax(pixelMetric(QStyle::PM_TabBarScrollButtonWidth, 0, widget), QApplication::globalStrut().width());
+ const int buttonOverlap = pixelMetric(QStyle::PM_TabBar_ScrollButtonOverlap, 0, widget);
+
+ r = vertical ? QRect(0, opt->rect.height() - (buttonWidth * 2) + buttonOverlap, opt->rect.width(), buttonWidth)
+ : QStyle::visualRect(ld, opt->rect, QRect(opt->rect.width() - (buttonWidth * 2) + buttonOverlap, 0, buttonWidth, opt->rect.height()));
+ break; }
+ case SE_TabBarScrollRightButton: {
+ const bool vertical = opt->rect.width() < opt->rect.height();
+ const Qt::LayoutDirection ld = widget->layoutDirection();
+ const int buttonWidth = qMax(pixelMetric(QStyle::PM_TabBarScrollButtonWidth, 0, widget), QApplication::globalStrut().width());
+
+ r = vertical ? QRect(0, opt->rect.height() - buttonWidth, opt->rect.width(), buttonWidth)
+ : QStyle::visualRect(ld, opt->rect, QRect(opt->rect.width() - buttonWidth, 0, buttonWidth, opt->rect.height()));
+ break; }
#endif
case SE_TreeViewDisclosureItem:
r = opt->rect;
diff --git a/src/widgets/styles/qdrawutil.cpp b/src/widgets/styles/qdrawutil.cpp
index 2a4d392413..d50f04bbb8 100644
--- a/src/widgets/styles/qdrawutil.cpp
+++ b/src/widgets/styles/qdrawutil.cpp
@@ -87,7 +87,7 @@ void qDrawShadeLine(QPainter *p, int x1, int y1, int x2, int y2,
const QPalette &pal, bool sunken,
int lineWidth, int midLineWidth)
{
- if (!(p && lineWidth >= 0 && midLineWidth >= 0)) {
+ if (Q_UNLIKELY(!p || lineWidth < 0 || midLineWidth < 0)) {
qWarning("qDrawShadeLine: Invalid parameters");
return;
}
@@ -203,7 +203,7 @@ void qDrawShadeRect(QPainter *p, int x, int y, int w, int h,
{
if (w == 0 || h == 0)
return;
- if (! (w > 0 && h > 0 && lineWidth >= 0 && midLineWidth >= 0)) {
+ if (Q_UNLIKELY(w < 0 || h < 0 || lineWidth < 0 || midLineWidth < 0)) {
qWarning("qDrawShadeRect: Invalid parameters");
return;
}
@@ -303,7 +303,7 @@ void qDrawShadePanel(QPainter *p, int x, int y, int w, int h,
{
if (w == 0 || h == 0)
return;
- if (!(w > 0 && h > 0 && lineWidth >= 0)) {
+ if (Q_UNLIKELY(w < 0 || h < 0 || lineWidth < 0)) {
qWarning("qDrawShadePanel: Invalid parameters");
}
QColor shade = pal.dark().color();
@@ -509,7 +509,7 @@ void qDrawPlainRect(QPainter *p, int x, int y, int w, int h, const QColor &c,
{
if (w == 0 || h == 0)
return;
- if (!(w > 0 && h > 0 && lineWidth >= 0)) {
+ if (Q_UNLIKELY(w < 0 || h < 0 || lineWidth < 0)) {
qWarning("qDrawPlainRect: Invalid parameters");
}
QPen oldPen = p->pen();
diff --git a/src/widgets/styles/qgtk2painter.cpp b/src/widgets/styles/qgtk2painter.cpp
deleted file mode 100644
index ea8afbc93c..0000000000
--- a/src/widgets/styles/qgtk2painter.cpp
+++ /dev/null
@@ -1,699 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qgtk2painter_p.h"
-
-#include <QtCore/qglobal.h>
-#if !defined(QT_NO_STYLE_GTK)
-
-// This class is primarily a wrapper around the gtk painter functions
-// and takes care of converting all such calls into cached Qt pixmaps.
-
-#include <private/qgtkstyle_p_p.h>
-#include <private/qhexstring_p.h>
-#include <QtWidgets/QWidget>
-#include <QtGui/QPixmapCache>
-#include <QtCore/QLibrary>
-
-QT_BEGIN_NAMESPACE
-
-typedef GdkPixbuf* (*Ptr_gdk_pixbuf_get_from_drawable) (GdkPixbuf *, GdkDrawable *, GdkColormap *, int, int, int, int, int, int);
-typedef GdkPixmap* (*Ptr_gdk_pixmap_new) (GdkDrawable *, gint, gint, gint);
-typedef void (*Ptr_gdk_draw_rectangle) (GdkDrawable *, GdkGC *, gboolean, gint, gint, gint, gint);
-typedef void (*Ptr_gdk_drawable_unref)(GdkDrawable *);
-
-typedef void (*Ptr_gtk_paint_check) (GtkStyle *, GdkWindow *, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, gint , gint , gint , gint);
-typedef void (*Ptr_gtk_paint_box) (GtkStyle *, GdkWindow *, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, gint , gint , gint , gint);
-typedef void (*Ptr_gtk_paint_box_gap) (GtkStyle *, GdkWindow *, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, gint, gint, gint , gint, GtkPositionType, gint, gint);
-typedef void (*Ptr_gtk_paint_resize_grip) (GtkStyle *, GdkWindow *, GtkStateType, const GdkRectangle *, GtkWidget *, const gchar *, GdkWindowEdge, gint , gint , gint , gint);
-typedef void (*Ptr_gtk_paint_focus) (GtkStyle *, GdkWindow *, GtkStateType, const GdkRectangle *, GtkWidget *, const gchar *, gint , gint , gint , gint);
-typedef void (*Ptr_gtk_paint_shadow) (GtkStyle *, GdkWindow *, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, gint , gint , gint , gint);
-typedef void (*Ptr_gtk_paint_slider) (GtkStyle *, GdkWindow *, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, gint , gint , gint , gint, GtkOrientation);
-typedef void (*Ptr_gtk_paint_expander) (GtkStyle *, GdkWindow *, GtkStateType, const GdkRectangle *, GtkWidget *, const gchar *, gint , gint , GtkExpanderStyle );
-typedef void (*Ptr_gtk_paint_handle) (GtkStyle *, GdkWindow *, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, gint , gint , gint , gint, GtkOrientation);
-typedef void (*Ptr_gtk_paint_arrow) (GtkStyle *, GdkWindow *, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, GtkArrowType, gboolean, gint , gint , gint , gint);
-typedef void (*Ptr_gtk_paint_option) (GtkStyle *, GdkWindow *, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, gint , gint , gint , gint);
-typedef void (*Ptr_gtk_paint_flat_box) (GtkStyle *, GdkWindow *, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, gint , gint , gint , gint);
-typedef void (*Ptr_gtk_paint_extension) (GtkStyle *, GdkWindow *, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, gint, gint, gint, gint, GtkPositionType);
-typedef void (*Ptr_gtk_paint_hline) (GtkStyle *, GdkWindow *, GtkStateType, const GdkRectangle *, GtkWidget *, const gchar *, gint, gint, gint y);
-typedef void (*Ptr_gtk_paint_vline) (GtkStyle *, GdkWindow *, GtkStateType, const GdkRectangle *, GtkWidget *, const gchar *, gint, gint, gint);
-
-namespace QGtk2PainterPrivate {
- static Ptr_gdk_pixmap_new gdk_pixmap_new = 0;
- static Ptr_gdk_pixbuf_get_from_drawable gdk_pixbuf_get_from_drawable = 0;
- static Ptr_gdk_draw_rectangle gdk_draw_rectangle = 0;
- static Ptr_gdk_drawable_unref gdk_drawable_unref = 0;
-
- static Ptr_gtk_paint_check gtk_paint_check = 0;
- static Ptr_gtk_paint_box gtk_paint_box = 0;
- static Ptr_gtk_paint_box_gap gtk_paint_box_gap = 0;
- static Ptr_gtk_paint_flat_box gtk_paint_flat_box = 0;
- static Ptr_gtk_paint_option gtk_paint_option = 0;
- static Ptr_gtk_paint_extension gtk_paint_extension = 0;
- static Ptr_gtk_paint_slider gtk_paint_slider = 0;
- static Ptr_gtk_paint_shadow gtk_paint_shadow = 0;
- static Ptr_gtk_paint_resize_grip gtk_paint_resize_grip = 0;
- static Ptr_gtk_paint_focus gtk_paint_focus = 0;
- static Ptr_gtk_paint_arrow gtk_paint_arrow = 0;
- static Ptr_gtk_paint_handle gtk_paint_handle = 0;
- static Ptr_gtk_paint_expander gtk_paint_expander = 0;
- static Ptr_gtk_paint_vline gtk_paint_vline = 0;
- static Ptr_gtk_paint_hline gtk_paint_hline = 0;
-}
-
-static void initGtk()
-{
-#ifndef QT_NO_LIBRARY
- static bool initialized = false;
- if (!initialized) {
- // enforce the "0" suffix, so we'll open libgtk-x11-2.0.so.0
- QLibrary libgtk(QLS("gtk-x11-2.0"), 0, 0);
-
- QGtk2PainterPrivate::gdk_pixmap_new = (Ptr_gdk_pixmap_new)libgtk.resolve("gdk_pixmap_new");
- QGtk2PainterPrivate::gdk_pixbuf_get_from_drawable = (Ptr_gdk_pixbuf_get_from_drawable)libgtk.resolve("gdk_pixbuf_get_from_drawable");
- QGtk2PainterPrivate::gdk_draw_rectangle = (Ptr_gdk_draw_rectangle)libgtk.resolve("gdk_draw_rectangle");
- QGtk2PainterPrivate::gdk_drawable_unref = (Ptr_gdk_drawable_unref)libgtk.resolve("gdk_drawable_unref");
-
- QGtk2PainterPrivate::gtk_paint_check = (Ptr_gtk_paint_check)libgtk.resolve("gtk_paint_check");
- QGtk2PainterPrivate::gtk_paint_box = (Ptr_gtk_paint_box)libgtk.resolve("gtk_paint_box");
- QGtk2PainterPrivate::gtk_paint_flat_box = (Ptr_gtk_paint_flat_box)libgtk.resolve("gtk_paint_flat_box");
- QGtk2PainterPrivate::gtk_paint_check = (Ptr_gtk_paint_check)libgtk.resolve("gtk_paint_check");
- QGtk2PainterPrivate::gtk_paint_box = (Ptr_gtk_paint_box)libgtk.resolve("gtk_paint_box");
- QGtk2PainterPrivate::gtk_paint_resize_grip = (Ptr_gtk_paint_resize_grip)libgtk.resolve("gtk_paint_resize_grip");
- QGtk2PainterPrivate::gtk_paint_focus = (Ptr_gtk_paint_focus)libgtk.resolve("gtk_paint_focus");
- QGtk2PainterPrivate::gtk_paint_shadow = (Ptr_gtk_paint_shadow)libgtk.resolve("gtk_paint_shadow");
- QGtk2PainterPrivate::gtk_paint_slider = (Ptr_gtk_paint_slider)libgtk.resolve("gtk_paint_slider");
- QGtk2PainterPrivate::gtk_paint_expander = (Ptr_gtk_paint_expander)libgtk.resolve("gtk_paint_expander");
- QGtk2PainterPrivate::gtk_paint_handle = (Ptr_gtk_paint_handle)libgtk.resolve("gtk_paint_handle");
- QGtk2PainterPrivate::gtk_paint_option = (Ptr_gtk_paint_option)libgtk.resolve("gtk_paint_option");
- QGtk2PainterPrivate::gtk_paint_arrow = (Ptr_gtk_paint_arrow)libgtk.resolve("gtk_paint_arrow");
- QGtk2PainterPrivate::gtk_paint_box_gap = (Ptr_gtk_paint_box_gap)libgtk.resolve("gtk_paint_box_gap");
- QGtk2PainterPrivate::gtk_paint_extension = (Ptr_gtk_paint_extension)libgtk.resolve("gtk_paint_extension");
- QGtk2PainterPrivate::gtk_paint_hline = (Ptr_gtk_paint_hline)libgtk.resolve("gtk_paint_hline");
- QGtk2PainterPrivate::gtk_paint_vline = (Ptr_gtk_paint_vline)libgtk.resolve("gtk_paint_vline");
-
- initialized = true;
- }
-#endif // !QT_NO_LIBRARY
-}
-
-// To recover alpha we apply the gtk painting function two times to
-// white, and black window backgrounds. This can be used to
-// recover the premultiplied alpha channel
-QPixmap QGtk2Painter::renderTheme(uchar *bdata, uchar *wdata, const QRect &rect) const
-{
- const int bytecount = rect.width() * rect.height() * 4;
- for (int index = 0; index < bytecount ; index += 4) {
- uchar val = bdata[index + GTK_BLUE];
- if (m_alpha) {
- int alphaval = qMax(bdata[index + GTK_BLUE] - wdata[index + GTK_BLUE],
- bdata[index + GTK_GREEN] - wdata[index + GTK_GREEN]);
- alphaval = qMax(alphaval, bdata[index + GTK_RED] - wdata[index + GTK_RED]) + 255;
- bdata[index + QT_ALPHA] = alphaval;
- }
- bdata[index + QT_RED] = bdata[index + GTK_RED];
- bdata[index + QT_GREEN] = bdata[index + GTK_GREEN];
- bdata[index + QT_BLUE] = val;
- }
- QImage converted((const uchar*)bdata, rect.width(), rect.height(), m_alpha ?
- QImage::Format_ARGB32_Premultiplied : QImage::Format_RGB32);
-
- if (m_hflipped || m_vflipped) {
- return QPixmap::fromImage(converted.mirrored(m_hflipped, m_vflipped));
- } else {
- // on raster graphicssystem we need to do a copy here, because
- // we intend to deallocate the qimage bits shortly after...
- return QPixmap::fromImage(converted.copy());
- }
-}
-
-// This macro is responsible for painting any GtkStyle painting function onto a QPixmap
-#define DRAW_TO_CACHE(draw_func) \
- if (rect.width() > QWIDGETSIZE_MAX || rect.height() > QWIDGETSIZE_MAX) \
- return; \
- QRect pixmapRect(0, 0, rect.width(), rect.height()); \
- { \
- GdkPixmap *pixmap = QGtk2PainterPrivate::gdk_pixmap_new((GdkDrawable*)(m_window->window), \
- rect.width(), rect.height(), -1); \
- if (!pixmap) \
- return; \
- style = QGtkStylePrivate::gtk_style_attach (style, m_window->window); \
- QGtk2PainterPrivate::gdk_draw_rectangle(pixmap, m_alpha ? style->black_gc : *style->bg_gc, \
- true, 0, 0, rect.width(), rect.height()); \
- draw_func; \
- GdkPixbuf *imgb = QGtkStylePrivate::gdk_pixbuf_new(GDK_COLORSPACE_RGB, true, 8, \
- rect.width(), rect.height()); \
- if (!imgb) \
- return; \
- imgb = QGtk2PainterPrivate::gdk_pixbuf_get_from_drawable(imgb, pixmap, NULL, 0, 0, 0, 0, \
- rect.width(), rect.height()); \
- uchar* bdata = (uchar*)QGtkStylePrivate::gdk_pixbuf_get_pixels(imgb); \
- if (m_alpha) { \
- QGtk2PainterPrivate::gdk_draw_rectangle(pixmap, style->white_gc, true, 0, 0, \
- rect.width(), rect.height()); \
- draw_func; \
- GdkPixbuf *imgw = QGtkStylePrivate::gdk_pixbuf_new(GDK_COLORSPACE_RGB, true, 8, \
- rect.width(), rect.height()); \
- if (!imgw) \
- return; \
- imgw = QGtk2PainterPrivate::gdk_pixbuf_get_from_drawable(imgw, pixmap, NULL, 0, 0, 0, 0,\
- rect.width(), rect.height()); \
- uchar* wdata = (uchar*)QGtkStylePrivate::gdk_pixbuf_get_pixels(imgw); \
- cache = renderTheme(bdata, wdata, rect); \
- QGtkStylePrivate::gdk_pixbuf_unref(imgw); \
- } else { \
- cache = renderTheme(bdata, 0, rect); \
- } \
- QGtk2PainterPrivate::gdk_drawable_unref(pixmap); \
- QGtkStylePrivate::gdk_pixbuf_unref(imgb); \
- }
-
-QGtk2Painter::QGtk2Painter() : QGtkPainter(), m_window(QGtkStylePrivate::gtkWidget("GtkWindow"))
-{
- initGtk();
-}
-
-// Note currently painted without alpha for performance reasons
-void QGtk2Painter::paintBoxGap(GtkWidget *gtkWidget, const gchar* part,
- const QRect &paintRect, GtkStateType state,
- GtkShadowType shadow, GtkPositionType gap_side,
- gint x, gint width,
- GtkStyle *style)
-{
- if (!paintRect.isValid())
- return;
-
- QPixmap cache;
- QRect rect = paintRect;
-
- // To avoid exhausting cache on large tabframes we cheat a bit by
- // tiling the center part.
-
- const int maxHeight = 256;
- const int border = 16;
- if (rect.height() > maxHeight && (gap_side == GTK_POS_TOP || gap_side == GTK_POS_BOTTOM))
- rect.setHeight(2 * border + 1);
-
- QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size(), gtkWidget)
- % HexString<uchar>(gap_side)
- % HexString<gint>(width)
- % HexString<gint>(x);
-
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_box_gap (style,
- pixmap,
- state,
- shadow,
- NULL,
- gtkWidget,
- (const gchar*)part,
- 0, 0,
- rect.width(),
- rect.height(),
- gap_side,
- x,
- width));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
- if (rect.size() != paintRect.size()) {
- // We assume we can stretch the middle tab part
- // Note: the side effect of this is that pinstripe patterns will get fuzzy
- const QSize size = cache.size();
- // top part
- m_painter->drawPixmap(QRect(paintRect.left(), paintRect.top(),
- paintRect.width(), border), cache,
- QRect(0, 0, size.width(), border));
-
- // tiled center part
- QPixmap tilePart(cache.width(), 1);
- QPainter scanLinePainter(&tilePart);
- scanLinePainter.drawPixmap(QRect(0, 0, tilePart.width(), tilePart.height()), cache, QRect(0, border, size.width(), 1));
- scanLinePainter.end();
- m_painter->drawTiledPixmap(QRect(paintRect.left(), paintRect.top() + border,
- paintRect.width(), paintRect.height() - 2*border), tilePart);
-
- // bottom part
- m_painter->drawPixmap(QRect(paintRect.left(), paintRect.top() + paintRect.height() - border,
- paintRect.width(), border), cache,
- QRect(0, size.height() - border, size.width(), border));
- } else
- m_painter->drawPixmap(paintRect.topLeft(), cache);
-}
-
-void QGtk2Painter::paintBox(GtkWidget *gtkWidget, const gchar* part,
- const QRect &paintRect, GtkStateType state,
- GtkShadowType shadow, GtkStyle *style,
- const QString &pmKey)
-{
- if (!paintRect.isValid())
- return;
-
- QPixmap cache;
- QRect rect = paintRect;
-
- // To avoid exhausting cache on large tabframes we cheat a bit by
- // tiling the center part.
-
- const int maxHeight = 256;
- const int maxArea = 256*512;
- const int border = 32;
- if (rect.height() > maxHeight && (rect.width()*rect.height() > maxArea))
- rect.setHeight(2 * border + 1);
-
- QString pixmapName = uniqueName(QLS(part), state, shadow,
- rect.size(), gtkWidget) % pmKey;
-
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_box (style,
- pixmap,
- state,
- shadow,
- NULL,
- gtkWidget,
- part,
- 0, 0,
- rect.width(),
- rect.height()));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
- if (rect.size() != paintRect.size()) {
- // We assume we can stretch the middle tab part
- // Note: the side effect of this is that pinstripe patterns will get fuzzy
- const QSize size = cache.size();
- // top part
- m_painter->drawPixmap(QRect(paintRect.left(), paintRect.top(),
- paintRect.width(), border), cache,
- QRect(0, 0, size.width(), border));
-
- // tiled center part
- QPixmap tilePart(cache.width(), 1);
- QPainter scanLinePainter(&tilePart);
- scanLinePainter.drawPixmap(QRect(0, 0, tilePart.width(), tilePart.height()), cache, QRect(0, border, size.width(), 1));
- scanLinePainter.end();
- m_painter->drawTiledPixmap(QRect(paintRect.left(), paintRect.top() + border,
- paintRect.width(), paintRect.height() - 2*border), tilePart);
-
- // bottom part
- m_painter->drawPixmap(QRect(paintRect.left(), paintRect.top() + paintRect.height() - border,
- paintRect.width(), border), cache,
- QRect(0, size.height() - border, size.width(), border));
- } else
- m_painter->drawPixmap(paintRect.topLeft(), cache);
-}
-
-void QGtk2Painter::paintHline(GtkWidget *gtkWidget, const gchar* part,
- const QRect &rect, GtkStateType state,
- GtkStyle *style, int x1, int x2, int y,
- const QString &pmKey)
-{
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(QLS(part), state, GTK_SHADOW_NONE, rect.size(), gtkWidget)
- % HexString<int>(x1)
- % HexString<int>(x2)
- % HexString<int>(y)
- % pmKey;
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_hline (style,
- pixmap,
- state,
- NULL,
- gtkWidget,
- part,
- x1, x2, y));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
-
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-void QGtk2Painter::paintVline(GtkWidget *gtkWidget, const gchar* part,
- const QRect &rect, GtkStateType state,
- GtkStyle *style, int y1, int y2, int x,
- const QString &pmKey)
-{
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(QLS(part), state, GTK_SHADOW_NONE, rect.size(), gtkWidget)
- % HexString<int>(y1)
- % HexString<int>(y2)
- % HexString<int>(x)
- % pmKey;
-
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_vline (style,
- pixmap,
- state,
- NULL,
- gtkWidget,
- part,
- y1, y2,
- x));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-
-void QGtk2Painter::paintExpander(GtkWidget *gtkWidget,
- const gchar* part, const QRect &rect,
- GtkStateType state, GtkExpanderStyle expander_state,
- GtkStyle *style, const QString &pmKey)
-{
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(QLS(part), state, GTK_SHADOW_NONE, rect.size(), gtkWidget)
- % HexString<uchar>(expander_state)
- % pmKey;
-
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_expander (style, pixmap,
- state, NULL,
- gtkWidget, part,
- rect.width()/2,
- rect.height()/2,
- expander_state));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
-
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-void QGtk2Painter::paintFocus(GtkWidget *gtkWidget, const gchar* part,
- const QRect &rect, GtkStateType state,
- GtkStyle *style, const QString &pmKey)
-{
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(QLS(part), state, GTK_SHADOW_NONE, rect.size(), gtkWidget) % pmKey;
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_focus (style, pixmap, state, NULL,
- gtkWidget,
- part,
- 0, 0,
- rect.width(),
- rect.height()));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
-
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-
-void QGtk2Painter::paintResizeGrip(GtkWidget *gtkWidget, const gchar* part,
- const QRect &rect, GtkStateType state,
- GtkShadowType shadow, GdkWindowEdge edge,
- GtkStyle *style, const QString &pmKey)
-{
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size(), gtkWidget) % pmKey;
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_resize_grip (style, pixmap, state,
- NULL, gtkWidget,
- part, edge, 0, 0,
- rect.width(),
- rect.height()));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
-
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-
-void QGtk2Painter::paintArrow(GtkWidget *gtkWidget, const gchar* part,
- const QRect &arrowrect, GtkArrowType arrow_type,
- GtkStateType state, GtkShadowType shadow,
- gboolean fill, GtkStyle *style, const QString &pmKey)
-{
- QRect rect = m_cliprect.isValid() ? m_cliprect : arrowrect;
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size())
- % HexString<uchar>(arrow_type)
- % pmKey;
-
- GdkRectangle gtkCliprect = {0, 0, rect.width(), rect.height()};
- int xOffset = m_cliprect.isValid() ? arrowrect.x() - m_cliprect.x() : 0;
- int yOffset = m_cliprect.isValid() ? arrowrect.y() - m_cliprect.y() : 0;
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_arrow (style, pixmap, state, shadow,
- &gtkCliprect,
- gtkWidget,
- part,
- arrow_type, fill,
- xOffset, yOffset,
- arrowrect.width(),
- arrowrect.height()))
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
-
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-
-void QGtk2Painter::paintHandle(GtkWidget *gtkWidget, const gchar* part, const QRect &rect,
- GtkStateType state, GtkShadowType shadow,
- GtkOrientation orientation, GtkStyle *style)
-{
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size())
- % HexString<uchar>(orientation);
-
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_handle (style,
- pixmap,
- state,
- shadow,
- NULL,
- gtkWidget,
- part, 0, 0,
- rect.width(),
- rect.height(),
- orientation));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-
-void QGtk2Painter::paintSlider(GtkWidget *gtkWidget, const gchar* part, const QRect &rect,
- GtkStateType state, GtkShadowType shadow,
- GtkStyle *style, GtkOrientation orientation,
- const QString &pmKey)
-{
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size(), gtkWidget) % pmKey;
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_slider (style,
- pixmap,
- state,
- shadow,
- NULL,
- gtkWidget,
- part,
- 0, 0,
- rect.width(),
- rect.height(),
- orientation));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-
-void QGtk2Painter::paintShadow(GtkWidget *gtkWidget, const gchar* part,
- const QRect &rect, GtkStateType state,
- GtkShadowType shadow, GtkStyle *style,
- const QString &pmKey)
-
-{
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size()) % pmKey;
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_shadow(style, pixmap, state, shadow, NULL,
- gtkWidget, part, 0, 0, rect.width(), rect.height()));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-void QGtk2Painter::paintFlatBox(GtkWidget *gtkWidget, const gchar* part,
- const QRect &rect, GtkStateType state,
- GtkShadowType shadow, GtkStyle *style,
- const QString &pmKey)
-{
- if (!rect.isValid())
- return;
- QPixmap cache;
- QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size()) % pmKey;
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_flat_box (style,
- pixmap,
- state,
- shadow,
- NULL,
- gtkWidget,
- part, 0, 0,
- rect.width(),
- rect.height()));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-void QGtk2Painter::paintExtention(GtkWidget *gtkWidget,
- const gchar *part, const QRect &rect,
- GtkStateType state, GtkShadowType shadow,
- GtkPositionType gap_pos, GtkStyle *style)
-{
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size(), gtkWidget)
- % HexString<uchar>(gap_pos);
-
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_extension (style, pixmap, state, shadow,
- NULL, gtkWidget,
- (const gchar*)part, 0, 0,
- rect.width(),
- rect.height(),
- gap_pos));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
-
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-void QGtk2Painter::paintOption(GtkWidget *gtkWidget, const QRect &radiorect,
- GtkStateType state, GtkShadowType shadow,
- GtkStyle *style, const QString &detail)
-
-{
- QRect rect = m_cliprect.isValid() ? m_cliprect : radiorect;
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(detail, state, shadow, rect.size());
- GdkRectangle gtkCliprect = {0, 0, rect.width(), rect.height()};
- int xOffset = m_cliprect.isValid() ? radiorect.x() - m_cliprect.x() : 0;
- int yOffset = m_cliprect.isValid() ? radiorect.y() - m_cliprect.y() : 0;
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_option(style, pixmap,
- state, shadow,
- &gtkCliprect,
- gtkWidget,
- detail.toLatin1(),
- xOffset, yOffset,
- radiorect.width(),
- radiorect.height()));
-
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
-
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-void QGtk2Painter::paintCheckbox(GtkWidget *gtkWidget, const QRect &checkrect,
- GtkStateType state, GtkShadowType shadow,
- GtkStyle *style, const QString &detail)
-
-{
- QRect rect = m_cliprect.isValid() ? m_cliprect : checkrect;
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(detail, state, shadow, rect.size());
- GdkRectangle gtkCliprect = {0, 0, rect.width(), rect.height()};
- int xOffset = m_cliprect.isValid() ? checkrect.x() - m_cliprect.x() : 0;
- int yOffset = m_cliprect.isValid() ? checkrect.y() - m_cliprect.y() : 0;
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_check (style,
- pixmap,
- state,
- shadow,
- &gtkCliprect,
- gtkWidget,
- detail.toLatin1(),
- xOffset, yOffset,
- checkrect.width(),
- checkrect.height()));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
-
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-QT_END_NAMESPACE
-
-#endif //!defined(QT_NO_STYLE_GTK)
diff --git a/src/widgets/styles/qgtk2painter_p.h b/src/widgets/styles/qgtk2painter_p.h
deleted file mode 100644
index 1e489b5bf9..0000000000
--- a/src/widgets/styles/qgtk2painter_p.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGTK2PAINTER_P_H
-#define QGTK2PAINTER_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/qglobal.h>
-#if !defined(QT_NO_STYLE_GTK)
-
-#include <private/qgtkpainter_p.h>
-
-QT_BEGIN_NAMESPACE
-
-class QGtk2Painter : public QGtkPainter
-{
-public:
- QGtk2Painter();
-
- void paintBoxGap(GtkWidget *gtkWidget, const gchar* part, const QRect &rect,
- GtkStateType state, GtkShadowType shadow, GtkPositionType gap_side, gint x,
- gint width, GtkStyle *style) Q_DECL_OVERRIDE;
- void paintBox(GtkWidget *gtkWidget, const gchar* part,
- const QRect &rect, GtkStateType state, GtkShadowType shadow, GtkStyle *style,
- const QString &pmKey = QString()) Q_DECL_OVERRIDE;
- void paintHline(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkStyle *style,
- int x1, int x2, int y, const QString &pmKey = QString()) Q_DECL_OVERRIDE;
- void paintVline(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkStyle *style,
- int y1, int y2, int x, const QString &pmKey = QString()) Q_DECL_OVERRIDE;
- void paintExpander(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state,
- GtkExpanderStyle expander_state, GtkStyle *style, const QString &pmKey = QString()) Q_DECL_OVERRIDE;
- void paintFocus(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkStyle *style,
- const QString &pmKey = QString()) Q_DECL_OVERRIDE;
- void paintResizeGrip(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkShadowType shadow,
- GdkWindowEdge edge, GtkStyle *style, const QString &pmKey = QString()) Q_DECL_OVERRIDE;
- void paintArrow(GtkWidget *gtkWidget, const gchar* part, const QRect &arrowrect, GtkArrowType arrow_type, GtkStateType state, GtkShadowType shadow,
- gboolean fill, GtkStyle *style, const QString &pmKey = QString()) Q_DECL_OVERRIDE;
- void paintHandle(GtkWidget *gtkWidget, const gchar* part, const QRect &rect,
- GtkStateType state, GtkShadowType shadow, GtkOrientation orientation, GtkStyle *style) Q_DECL_OVERRIDE;
- void paintSlider(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkShadowType shadow,
- GtkStyle *style, GtkOrientation orientation, const QString &pmKey = QString()) Q_DECL_OVERRIDE;
- void paintShadow(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkShadowType shadow,
- GtkStyle *style, const QString &pmKey = QString()) Q_DECL_OVERRIDE;
- void paintFlatBox(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkShadowType shadow, GtkStyle *style, const QString & = QString()) Q_DECL_OVERRIDE;
- void paintExtention(GtkWidget *gtkWidget, const gchar *part, const QRect &rect, GtkStateType state, GtkShadowType shadow,
- GtkPositionType gap_pos, GtkStyle *style) Q_DECL_OVERRIDE;
- void paintOption(GtkWidget *gtkWidget, const QRect &rect, GtkStateType state, GtkShadowType shadow, GtkStyle *style, const QString &detail) Q_DECL_OVERRIDE;
- void paintCheckbox(GtkWidget *gtkWidget, const QRect &rect, GtkStateType state, GtkShadowType shadow, GtkStyle *style, const QString &detail) Q_DECL_OVERRIDE;
-
-private:
- QPixmap renderTheme(uchar *bdata, uchar *wdata, const QRect &rect) const;
-
- GtkWidget *m_window;
-};
-
-QT_END_NAMESPACE
-
-#endif //!defined(QT_NO_STYLE_QGTK)
-
-#endif // QGTK2PAINTER_P_H
diff --git a/src/widgets/styles/qgtkpainter_p.h b/src/widgets/styles/qgtkpainter_p.h
deleted file mode 100644
index bfe97ccaef..0000000000
--- a/src/widgets/styles/qgtkpainter_p.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGTKPAINTER_H
-#define QGTKPAINTER_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/qglobal.h>
-#if !defined(QT_NO_STYLE_GTK)
-
-#include <private/qgtkglobal_p.h>
-#include <QtCore/qsize.h>
-#include <QtCore/qrect.h>
-#include <QtCore/qpoint.h>
-#include <QtGui/qpixmap.h>
-#include <QtGui/qpainter.h>
-
-QT_BEGIN_NAMESPACE
-
-class QGtkPainter
-{
-public:
- QGtkPainter();
- virtual ~QGtkPainter();
-
- void reset(QPainter *painter = 0);
-
- void setAlphaSupport(bool value) { m_alpha = value; }
- void setClipRect(const QRect &rect) { m_cliprect = rect; }
- void setFlipHorizontal(bool value) { m_hflipped = value; }
- void setFlipVertical(bool value) { m_vflipped = value; }
- void setUsePixmapCache(bool value) { m_usePixmapCache = value; }
-
- virtual void paintBoxGap(GtkWidget *gtkWidget, const gchar* part, const QRect &rect,
- GtkStateType state, GtkShadowType shadow, GtkPositionType gap_side, gint x,
- gint width, GtkStyle *style) = 0;
- virtual void paintBox(GtkWidget *gtkWidget, const gchar* part,
- const QRect &rect, GtkStateType state, GtkShadowType shadow, GtkStyle *style,
- const QString &pmKey = QString()) = 0;
- virtual void paintHline(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkStyle *style,
- int x1, int x2, int y, const QString &pmKey = QString()) = 0;
- virtual void paintVline(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkStyle *style,
- int y1, int y2, int x, const QString &pmKey = QString()) = 0;
- virtual void paintExpander(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state,
- GtkExpanderStyle expander_state, GtkStyle *style, const QString &pmKey = QString()) = 0;
- virtual void paintFocus(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkStyle *style,
- const QString &pmKey = QString()) = 0;
- virtual void paintResizeGrip(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkShadowType shadow,
- GdkWindowEdge edge, GtkStyle *style, const QString &pmKey = QString()) = 0;
- virtual void paintArrow(GtkWidget *gtkWidget, const gchar* part, const QRect &arrowrect, GtkArrowType arrow_type, GtkStateType state, GtkShadowType shadow,
- gboolean fill, GtkStyle *style, const QString &pmKey = QString()) = 0;
- virtual void paintHandle(GtkWidget *gtkWidget, const gchar* part, const QRect &rect,
- GtkStateType state, GtkShadowType shadow, GtkOrientation orientation, GtkStyle *style) = 0;
- virtual void paintSlider(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkShadowType shadow,
- GtkStyle *style, GtkOrientation orientation, const QString &pmKey = QString()) = 0;
- virtual void paintShadow(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkShadowType shadow,
- GtkStyle *style, const QString &pmKey = QString()) = 0;
- virtual void paintFlatBox(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkShadowType shadow, GtkStyle *style, const QString & = QString()) = 0;
- virtual void paintExtention(GtkWidget *gtkWidget, const gchar *part, const QRect &rect, GtkStateType state, GtkShadowType shadow,
- GtkPositionType gap_pos, GtkStyle *style) = 0;
- virtual void paintOption(GtkWidget *gtkWidget, const QRect &rect, GtkStateType state, GtkShadowType shadow, GtkStyle *style, const QString &detail) = 0;
- virtual void paintCheckbox(GtkWidget *gtkWidget, const QRect &rect, GtkStateType state, GtkShadowType shadow, GtkStyle *style, const QString &detail) = 0;
-
-protected:
- static QString uniqueName(const QString &key, GtkStateType state, GtkShadowType shadow, const QSize &size, GtkWidget *widget = 0);
-
- QPainter *m_painter;
- bool m_alpha;
- bool m_hflipped;
- bool m_vflipped;
- bool m_usePixmapCache;
- QRect m_cliprect;
-};
-
-QT_END_NAMESPACE
-
-#endif //!defined(QT_NO_STYLE_QGTK)
-
-#endif // QGTKPAINTER_H
diff --git a/src/widgets/styles/qgtkstyle.cpp b/src/widgets/styles/qgtkstyle.cpp
deleted file mode 100644
index 7ed0dce91d..0000000000
--- a/src/widgets/styles/qgtkstyle.cpp
+++ /dev/null
@@ -1,4257 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#include "qgtkstyle_p.h"
-
-#if !defined(QT_NO_STYLE_GTK)
-
-#include <private/qapplication_p.h>
-#include <QtCore/QLibrary>
-#include <QtCore/QSettings>
-#include <QtWidgets/QDialogButtonBox>
-#include <QtWidgets/QStatusBar>
-#include <QtWidgets/QLineEdit>
-#include <QtWidgets/QWidget>
-#include <QtWidgets/QListView>
-#include <QtWidgets/QApplication>
-#include <QtWidgets/QStyleOption>
-#include <QtWidgets/QPushButton>
-#include <QtGui/QPainter>
-#include <QtWidgets/QMainWindow>
-#include <QtWidgets/QToolBar>
-#include <QtWidgets/QHeaderView>
-#include <QtWidgets/QMenuBar>
-#include <QtWidgets/QComboBox>
-#include <QtWidgets/QSpinBox>
-#include <QtWidgets/QScrollBar>
-#include <QtWidgets/QAbstractButton>
-#include <QtWidgets/QToolButton>
-#include <QtWidgets/QGroupBox>
-#include <QtWidgets/QRadioButton>
-#include <QtWidgets/QCheckBox>
-#include <QtWidgets/QTreeView>
-#include <QtWidgets/QStyledItemDelegate>
-#include <QtWidgets/QWizard>
-
-#include <qpixmapcache.h>
-#include <private/qstyleanimation_p.h>
-#undef signals // Collides with GTK stymbols
-#include <private/qgtkpainter_p.h>
-#include <private/qstylehelper_p.h>
-#include <private/qgtkstyle_p_p.h>
-
-QT_BEGIN_NAMESPACE
-
-static GtkStateType qt_gtk_state(const QStyleOption *option)
-{
- GtkStateType state = GTK_STATE_NORMAL;
- if (!(option->state & QStyle::State_Enabled))
- state = GTK_STATE_INSENSITIVE;
- else if (option->state & QStyle::State_MouseOver)
- state = GTK_STATE_PRELIGHT;
-
- return state;
-}
-
-static QPixmap qt_gtk_get_icon(const char* iconName, GtkIconSize size = GTK_ICON_SIZE_BUTTON)
-{
- GtkStyle *style = QGtkStylePrivate::gtkStyle();
- GtkIconSet* iconSet = QGtkStylePrivate::gtk_icon_factory_lookup_default (iconName);
- GdkPixbuf* icon = QGtkStylePrivate::gtk_icon_set_render_icon(iconSet,
- style,
- GTK_TEXT_DIR_LTR,
- GTK_STATE_NORMAL,
- size,
- NULL,
- "button");
- uchar* data = (uchar*)QGtkStylePrivate::gdk_pixbuf_get_pixels(icon);
- int width = QGtkStylePrivate::gdk_pixbuf_get_width(icon);
- int height = QGtkStylePrivate::gdk_pixbuf_get_height(icon);
- QImage converted(width, height, QImage::Format_ARGB32);
- uchar* tdata = (uchar*)converted.bits();
-
- for ( int index = 0 ; index < height * width*4 ; index +=4 ) {
- //int index = y * rowstride + x;
- tdata[index + QT_RED] = data[index + GTK_RED];
- tdata[index + QT_GREEN] = data[index + GTK_GREEN];
- tdata[index + QT_BLUE] = data[index + GTK_BLUE];
- tdata[index + QT_ALPHA] = data[index + GTK_ALPHA];
- }
-
- QGtkStylePrivate::gdk_pixbuf_unref(icon);
-
- // should we free iconset?
- return QPixmap::fromImage(converted);
-}
-
-static void qt_gtk_draw_mdibutton(QPainter *painter, const QStyleOptionTitleBar *option, const QRect &tmp, bool hover, bool sunken)
-{
- QColor dark;
- dark.setHsv(option->palette.button().color().hue(),
- qMin(255, (int)(option->palette.button().color().saturation()*1.9)),
- qMin(255, (int)(option->palette.button().color().value()*0.7)));
-
- QColor highlight = option->palette.highlight().color();
-
- bool active = (option->titleBarState & QStyle::State_Active);
- QColor titleBarHighlight(255, 255, 255, 60);
-
- if (sunken)
- painter->fillRect(tmp.adjusted(1, 1, -1, -1), option->palette.highlight().color().darker(120));
- else if (hover)
- painter->fillRect(tmp.adjusted(1, 1, -1, -1), QColor(255, 255, 255, 20));
-
- QColor mdiButtonGradientStartColor;
- QColor mdiButtonGradientStopColor;
-
- mdiButtonGradientStartColor = QColor(0, 0, 0, 40);
- mdiButtonGradientStopColor = QColor(255, 255, 255, 60);
-
- if (sunken)
- titleBarHighlight = highlight.darker(130);
-
- QLinearGradient gradient(tmp.center().x(), tmp.top(), tmp.center().x(), tmp.bottom());
- gradient.setColorAt(0, mdiButtonGradientStartColor);
- gradient.setColorAt(1, mdiButtonGradientStopColor);
- QColor mdiButtonBorderColor(active ? option->palette.highlight().color().darker(180): dark.darker(110));
-
- painter->setPen(QPen(mdiButtonBorderColor, 1));
- const QLine lines[4] = {
- QLine(tmp.left() + 2, tmp.top(), tmp.right() - 2, tmp.top()),
- QLine(tmp.left() + 2, tmp.bottom(), tmp.right() - 2, tmp.bottom()),
- QLine(tmp.left(), tmp.top() + 2, tmp.left(), tmp.bottom() - 2),
- QLine(tmp.right(), tmp.top() + 2, tmp.right(), tmp.bottom() - 2)
- };
- painter->drawLines(lines, 4);
- const QPoint points[4] = {
- QPoint(tmp.left() + 1, tmp.top() + 1),
- QPoint(tmp.right() - 1, tmp.top() + 1),
- QPoint(tmp.left() + 1, tmp.bottom() - 1),
- QPoint(tmp.right() - 1, tmp.bottom() - 1)
- };
- painter->drawPoints(points, 4);
-
- painter->setPen(titleBarHighlight);
- painter->drawLine(tmp.left() + 2, tmp.top() + 1, tmp.right() - 2, tmp.top() + 1);
- painter->drawLine(tmp.left() + 1, tmp.top() + 2, tmp.left() + 1, tmp.bottom() - 2);
-
- painter->setPen(QPen(gradient, 1));
- painter->drawLine(tmp.right() + 1, tmp.top() + 2, tmp.right() + 1, tmp.bottom() - 2);
- painter->drawPoint(tmp.right() , tmp.top() + 1);
-
- painter->drawLine(tmp.left() + 2, tmp.bottom() + 1, tmp.right() - 2, tmp.bottom() + 1);
- painter->drawPoint(tmp.left() + 1, tmp.bottom());
- painter->drawPoint(tmp.right() - 1, tmp.bottom());
- painter->drawPoint(tmp.right() , tmp.bottom() - 1);
-}
-
-static const char * const dock_widget_close_xpm[] =
- {
- "11 13 5 1",
- " c None",
- ". c #D5CFCB",
- "+ c #6C6A67",
- "@ c #6C6A67",
- "$ c #B5B0AC",
- " ",
- " @@@@@@@@@ ",
- "@+ +@",
- "@ +@ @+ @",
- "@ @@@ @@@ @",
- "@ @@@@@ @",
- "@ @@@ @",
- "@ @@@@@ @",
- "@ @@@ @@@ @",
- "@ +@ @+ @",
- "@+ +@",
- " @@@@@@@@@ ",
- " "
- };
-
-static const char * const dock_widget_restore_xpm[] =
- {
- "11 13 5 1",
- " c None",
- ". c #D5CFCB",
- "+ c #6C6A67",
- "@ c #6C6A67",
- "# c #6C6A67",
- " ",
- " @@@@@@@@@ ",
- "@+ +@",
- "@ #@@@# @",
- "@ @ @ @",
- "@ #@@@# @ @",
- "@ @ @ @ @",
- "@ @ @@@ @",
- "@ @ @ @",
- "@ #@@@@ @",
- "@+ +@",
- " @@@@@@@@@ ",
- " "
- };
-
-static const char * const qt_titlebar_context_help[] = {
- "10 10 3 1",
- " c None",
- "# c #000000",
- "+ c #444444",
- " +####+ ",
- " ### ### ",
- " ## ## ",
- " +##+ ",
- " +## ",
- " ## ",
- " ## ",
- " ",
- " ## ",
- " ## "};
-
-static const char * const qt_scrollbar_button_arrow_up[] = {
- "7 4 2 1",
- " c None",
- "* c #BFBFBF",
- " * ",
- " *** ",
- " ***** ",
- "*******"};
-
-static const char * const qt_scrollbar_button_arrow_down[] = {
- "7 4 2 1",
- " c None",
- "* c #BFBFBF",
- "*******",
- " ***** ",
- " *** ",
- " * "};
-
-static const int groupBoxBottomMargin = 2; // space below the groupbox
-static const int groupBoxTitleMargin = 6; // space between contents and title
-static const int groupBoxTopMargin = 2;
-
-/*!
- Returns the configuration string for \a value.
- Returns \a fallback if \a value is not found.
- */
-QString QGtkStyle::getGConfString(const QString &value, const QString &fallback)
-{
- return QGtkStylePrivate::getGConfString(value, fallback);
-}
-
-/*!
- Returns the configuration boolean for \a key.
- Returns \a fallback if \a key is not found.
- */
-bool QGtkStyle::getGConfBool(const QString &key, bool fallback)
-{
- return QGtkStylePrivate::getGConfBool(key, fallback);
-}
-
-static QColor mergedColors(const QColor &colorA, const QColor &colorB, int factor = 50)
-{
- const int maxFactor = 100;
- QColor tmp = colorA;
- tmp.setRed((tmp.red() * factor) / maxFactor + (colorB.red() * (maxFactor - factor)) / maxFactor);
- tmp.setGreen((tmp.green() * factor) / maxFactor + (colorB.green() * (maxFactor - factor)) / maxFactor);
- tmp.setBlue((tmp.blue() * factor) / maxFactor + (colorB.blue() * (maxFactor - factor)) / maxFactor);
- return tmp;
-}
-
-static GdkColor fromQColor(const QColor &color)
-{
- GdkColor retval;
- retval.pixel = 0;
- retval.red = color.red() * 255;
- retval.green = color.green() * 255;
- retval.blue = color.blue() * 255;
- return retval;
-}
-
-/*!
- \class QGtkStyle
- \brief The QGtkStyle class provides a widget style rendered by GTK+
- \since 4.5
-
- \internal
- \inmodule QtWidgets
-
- The QGtkStyle style provides a look and feel that integrates well
- into GTK-based desktop environments such as the XFCe and GNOME.
-
- It does this by making use of the GTK+ theme engine, ensuring
- that Qt applications look and feel native on these platforms.
-
- Note: The style requires GTK+ version 2.18 or later.
- The Qt3-based "Qt" GTK+ theme engine will not work with QGtkStyle.
-
- \sa QWindowsXPStyle, QMacStyle, QWindowsStyle, QFusionStyle
-*/
-
-/*!
- Constructs a QGtkStyle object.
-*/
-QGtkStyle::QGtkStyle()
- : QCommonStyle(*new QGtkStylePrivate)
-{
- Q_D(QGtkStyle);
- d->init();
-}
-
-/*!
- \internal
-
- Constructs a QGtkStyle object.
-*/
-QGtkStyle::QGtkStyle(QGtkStylePrivate &dd)
- : QCommonStyle(dd)
-{
- Q_D(QGtkStyle);
- d->init();
-}
-
-
-/*!
- Destroys the QGtkStyle object.
-*/
-QGtkStyle::~QGtkStyle()
-{
-}
-
-/*!
- \reimp
-*/
-QPalette QGtkStyle::standardPalette() const
-{
- Q_D(const QGtkStyle);
-
- QPalette palette = QCommonStyle::standardPalette();
- if (d->isThemeAvailable()) {
- GtkStyle *style = d->gtkStyle();
- GtkWidget *gtkButton = d->gtkWidget("GtkButton");
- GtkWidget *gtkEntry = d->getTextColorWidget();
- GdkColor gdkBg, gdkBase, gdkText, gdkForeground, gdkSbg, gdkSfg, gdkaSbg, gdkaSfg;
- QColor bg, base, text, fg, highlight, highlightText, inactiveHighlight, inactiveHighlightedTExt;
- gdkBg = style->bg[GTK_STATE_NORMAL];
- gdkForeground = d->gtk_widget_get_style(gtkButton)->fg[GTK_STATE_NORMAL];
-
- // Our base and selected color is primarily used for text
- // so we assume a gtkEntry will have the most correct value
- GtkStyle *gtkEntryStyle = d->gtk_widget_get_style(gtkEntry);
- gdkBase = gtkEntryStyle->base[GTK_STATE_NORMAL];
- gdkText = gtkEntryStyle->text[GTK_STATE_NORMAL];
- gdkSbg = gtkEntryStyle->base[GTK_STATE_SELECTED];
- gdkSfg = gtkEntryStyle->text[GTK_STATE_SELECTED];
-
- // The ACTIVE base color is really used for inactive windows
- gdkaSbg = gtkEntryStyle->base[GTK_STATE_ACTIVE];
- gdkaSfg = gtkEntryStyle->text[GTK_STATE_ACTIVE];
-
- bg = QColor(gdkBg.red>>8, gdkBg.green>>8, gdkBg.blue>>8);
- text = QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
- fg = QColor(gdkForeground.red>>8, gdkForeground.green>>8, gdkForeground.blue>>8);
- base = QColor(gdkBase.red>>8, gdkBase.green>>8, gdkBase.blue>>8);
- highlight = QColor(gdkSbg.red>>8, gdkSbg.green>>8, gdkSbg.blue>>8);
- highlightText = QColor(gdkSfg.red>>8, gdkSfg.green>>8, gdkSfg.blue>>8);
- inactiveHighlight = QColor(gdkaSbg.red>>8, gdkaSbg.green>>8, gdkaSbg.blue>>8);
- inactiveHighlightedTExt = QColor(gdkaSfg.red>>8, gdkaSfg.green>>8, gdkaSfg.blue>>8);
-
- palette.setColor(QPalette::HighlightedText, highlightText);
-
-
- palette.setColor(QPalette::Light, bg.lighter(125));
- palette.setColor(QPalette::Shadow, bg.darker(130));
- palette.setColor(QPalette::Dark, bg.darker(120));
- palette.setColor(QPalette::Text, text);
- palette.setColor(QPalette::WindowText, fg);
- palette.setColor(QPalette::ButtonText, fg);
- palette.setColor(QPalette::Base, base);
-
- QColor alternateRowColor = palette.base().color().lighter(93); // ref gtkstyle.c draw_flat_box
- GtkWidget *gtkTreeView = d->gtkWidget("GtkTreeView");
- GdkColor *gtkAltBase = NULL;
- d->gtk_widget_style_get(gtkTreeView, "odd-row-color", &gtkAltBase, NULL);
- if (gtkAltBase) {
- alternateRowColor = QColor(gtkAltBase->red>>8, gtkAltBase->green>>8, gtkAltBase->blue>>8);
- d->gdk_color_free(gtkAltBase);
- }
- palette.setColor(QPalette::AlternateBase, alternateRowColor);
-
- palette.setColor(QPalette::Window, bg);
- palette.setColor(QPalette::Button, bg);
- palette.setColor(QPalette::Background, bg);
- QColor disabled((fg.red() + bg.red()) / 2,
- (fg.green() + bg.green())/ 2,
- (fg.blue() + bg.blue()) / 2);
- palette.setColor(QPalette::Disabled, QPalette::Text, disabled);
- palette.setColor(QPalette::Disabled, QPalette::WindowText, disabled);
- palette.setColor(QPalette::Disabled, QPalette::Foreground, disabled);
- palette.setColor(QPalette::Disabled, QPalette::ButtonText, disabled);
- palette.setColor(QPalette::Highlight, highlight);
- // calculate disabled colors by removing saturation
- highlight.setHsv(highlight.hue(), 0, highlight.value(), highlight.alpha());
- highlightText.setHsv(highlightText.hue(), 0, highlightText.value(), highlightText.alpha());
- palette.setColor(QPalette::Disabled, QPalette::Highlight, highlight);
- palette.setColor(QPalette::Disabled, QPalette::HighlightedText, highlightText);
-
- palette.setColor(QPalette::Inactive, QPalette::HighlightedText, inactiveHighlightedTExt);
- palette.setColor(QPalette::Inactive, QPalette::Highlight, inactiveHighlight);
-
- style = d->gtk_rc_get_style_by_paths(d->gtk_settings_get_default(), "gtk-tooltips", "GtkWindow",
- d->gtk_window_get_type());
- if (style) {
- gdkText = style->fg[GTK_STATE_NORMAL];
- text = QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
- palette.setColor(QPalette::ToolTipText, text);
- }
- }
- return palette;
-}
-
-/*!
- \reimp
-*/
-void QGtkStyle::polish(QPalette &palette)
-{
- Q_D(QGtkStyle);
-
- if (!d->isThemeAvailable())
- QCommonStyle::polish(palette);
- else
- palette = palette.resolve(standardPalette());
-}
-
-/*!
- \reimp
-*/
-void QGtkStyle::polish(QApplication *app)
-{
- Q_D(QGtkStyle);
-
- QCommonStyle::polish(app);
- // Custom fonts and palettes with QtConfig are intentionally
- // not supported as these should be entirely determined by
- // current Gtk settings
- if (app->desktopSettingsAware() && d->isThemeAvailable()) {
- QApplicationPrivate::setSystemPalette(standardPalette());
- QApplicationPrivate::setSystemFont(d->getThemeFont());
- d->applyCustomPaletteHash();
- if (!d->isKDE4Session())
- qApp->installEventFilter(&d->filter);
- }
-}
-
-/*!
- \reimp
-*/
-void QGtkStyle::unpolish(QApplication *app)
-{
- Q_D(QGtkStyle);
-
- QCommonStyle::unpolish(app);
- QPixmapCache::clear();
-
- if (app->desktopSettingsAware() && d->isThemeAvailable() && !d->isKDE4Session())
- qApp->removeEventFilter(&d->filter);
-}
-
-/*!
- \reimp
-*/
-
-void QGtkStyle::polish(QWidget *widget)
-{
- Q_D(QGtkStyle);
-
- QCommonStyle::polish(widget);
- if (!d->isThemeAvailable())
- return;
- if (qobject_cast<QAbstractButton*>(widget)
- || qobject_cast<QToolButton*>(widget)
- || qobject_cast<QComboBox*>(widget)
- || qobject_cast<QGroupBox*>(widget)
- || qobject_cast<QScrollBar*>(widget)
- || qobject_cast<QSlider*>(widget)
- || qobject_cast<QAbstractSpinBox*>(widget)
- || qobject_cast<QSpinBox*>(widget)
- || qobject_cast<QHeaderView*>(widget))
- widget->setAttribute(Qt::WA_Hover);
-#ifndef QT_NO_TREEVIEW
- else if (QTreeView *tree = qobject_cast<QTreeView *> (widget))
- tree->viewport()->setAttribute(Qt::WA_Hover);
-#endif
-}
-
-/*!
- \reimp
-*/
-void QGtkStyle::unpolish(QWidget *widget)
-{
- QCommonStyle::unpolish(widget);
-}
-
-/*!
- \reimp
-*/
-int QGtkStyle::pixelMetric(PixelMetric metric,
- const QStyleOption *option,
- const QWidget *widget) const
-{
- Q_D(const QGtkStyle);
-
- if (!d->isThemeAvailable())
- return QCommonStyle::pixelMetric(metric, option, widget);
-
- switch (metric) {
- case PM_DefaultFrameWidth:
- if (qobject_cast<const QFrame*>(widget)) {
- if (GtkStyle *style =
- d->gtk_rc_get_style_by_paths(d->gtk_settings_get_default(),
- "*.GtkScrolledWindow",
- "*.GtkScrolledWindow",
- d->gtk_window_get_type()))
- return qMax(style->xthickness, style->ythickness);
- }
- return 2;
-
- case PM_MenuButtonIndicator:
- return 20;
-
- case PM_TabBarBaseOverlap:
- return 1;
-
- case PM_ToolBarSeparatorExtent:
- return 11;
-
- case PM_ToolBarFrameWidth:
- return 1;
-
- case PM_ToolBarItemSpacing:
- return 0;
-
- case PM_ButtonShiftHorizontal: {
- GtkWidget *gtkButton = d->gtkWidget("GtkButton");
- guint horizontal_shift;
- d->gtk_widget_style_get(gtkButton, "child-displacement-x", &horizontal_shift, NULL);
- return horizontal_shift;
- }
-
- case PM_ButtonShiftVertical: {
- GtkWidget *gtkButton = d->gtkWidget("GtkButton");
- guint vertical_shift;
- d->gtk_widget_style_get(gtkButton, "child-displacement-y", &vertical_shift, NULL);
- return vertical_shift;
- }
-
- case PM_MenuBarPanelWidth:
- return 0;
-
- case PM_MenuPanelWidth: {
- GtkWidget *gtkMenu = d->gtkWidget("GtkMenu");
- guint horizontal_padding = 0;
- // horizontal-padding is used by Maemo to get thicker borders
- if (!d->gtk_check_version(2, 10, 0))
- d->gtk_widget_style_get(gtkMenu, "horizontal-padding", &horizontal_padding, NULL);
- int padding = qMax<int>(d->gtk_widget_get_style(gtkMenu)->xthickness, horizontal_padding);
- return padding;
- }
-
- case PM_ButtonIconSize: {
- int retVal = 24;
- GtkSettings *settings = d->gtk_settings_get_default();
- gchararray icon_sizes;
- g_object_get(settings, "gtk-icon-sizes", &icon_sizes, NULL);
- QStringList values = QString(QLS(icon_sizes)).split(QLatin1Char(':'));
- g_free(icon_sizes);
- QChar splitChar(QLatin1Char(','));
- foreach (const QString &value, values) {
- if (value.startsWith(QLS("gtk-button="))) {
- QString iconSize = value.right(value.size() - 11);
-
- if (iconSize.contains(splitChar))
- retVal = iconSize.split(splitChar)[0].toInt();
- break;
- }
- }
- return retVal;
- }
-
- case PM_MenuVMargin:
-
- case PM_MenuHMargin:
- return 0;
-
- case PM_DockWidgetTitleMargin:
- return 0;
-
- case PM_DockWidgetTitleBarButtonMargin:
- return 5;
-
- case PM_TabBarTabVSpace:
- return 12;
-
- case PM_TabBarTabHSpace:
- return 14;
-
- case PM_TabBarTabShiftVertical:
- return 2;
-
- case PM_ToolBarHandleExtent:
- return 9;
-
- case PM_SplitterWidth:
- return 6;
-
- case PM_SliderThickness:
- case PM_SliderControlThickness: {
- GtkWidget *gtkScale = d->gtkWidget("GtkHScale");
- gint val;
- d->gtk_widget_style_get(gtkScale, "slider-width", &val, NULL);
- if (metric == PM_SliderControlThickness)
- return val + 2*d->gtk_widget_get_style(gtkScale)->ythickness;
- return val;
- }
-
- case PM_ScrollBarExtent: {
- gint sliderLength;
- gint trough_border;
- GtkWidget *hScrollbar = d->gtkWidget("GtkHScrollbar");
- d->gtk_widget_style_get(hScrollbar,
- "trough-border", &trough_border,
- "slider-width", &sliderLength,
- NULL);
- return sliderLength + trough_border*2;
- }
-
- case PM_ScrollBarSliderMin:
- return 34;
-
- case PM_SliderLength:
- gint val;
- d->gtk_widget_style_get(d->gtkWidget("GtkHScale"), "slider-length", &val, NULL);
- return val;
-
- case PM_ExclusiveIndicatorWidth:
- case PM_ExclusiveIndicatorHeight:
- case PM_IndicatorWidth:
- case PM_IndicatorHeight: {
- GtkWidget *gtkCheckButton = d->gtkWidget("GtkCheckButton");
- gint size, spacing;
- d->gtk_widget_style_get(gtkCheckButton, "indicator-spacing", &spacing, "indicator-size", &size, NULL);
- return size + 2 * spacing;
- }
-
- case PM_MenuBarVMargin: {
- GtkWidget *gtkMenubar = d->gtkWidget("GtkMenuBar");
- return qMax(0, d->gtk_widget_get_style(gtkMenubar)->ythickness);
- }
- case PM_ScrollView_ScrollBarSpacing:
- {
- gint spacing = 3;
- GtkWidget *gtkScrollWindow = d->gtkWidget("GtkScrolledWindow");
- Q_ASSERT(gtkScrollWindow);
- d->gtk_widget_style_get(gtkScrollWindow, "scrollbar-spacing", &spacing, NULL);
- return spacing;
- }
- case PM_SubMenuOverlap: {
- gint offset = 0;
- GtkWidget *gtkMenu = d->gtkWidget("GtkMenu");
- d->gtk_widget_style_get(gtkMenu, "horizontal-offset", &offset, NULL);
- return offset;
- }
- case PM_ToolTipLabelFrameWidth:
- return 2;
- case PM_ButtonDefaultIndicator:
- return 0;
- case PM_ListViewIconSize:
- return 24;
- case PM_DialogButtonsSeparator:
- return 6;
- case PM_TitleBarHeight:
- return 24;
- case PM_SpinBoxFrameWidth:
- return 3;
- case PM_MenuBarItemSpacing:
- return 6;
- case PM_MenuBarHMargin:
- return 0;
- case PM_ToolBarItemMargin:
- return 1;
- case PM_SmallIconSize:
- return 16;
- case PM_MaximumDragDistance:
- return -1;
- case PM_TabCloseIndicatorWidth:
- case PM_TabCloseIndicatorHeight:
- return 20;
- default:
- return QCommonStyle::pixelMetric(metric, option, widget);
- }
-}
-
-/*!
- \reimp
-*/
-int QGtkStyle::styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget,
-
- QStyleHintReturn *returnData = 0) const
-{
- Q_D(const QGtkStyle);
-
- if (!d->isThemeAvailable())
- return QCommonStyle::styleHint(hint, option, widget, returnData);
-
- switch (hint) {
- case SH_ItemView_ChangeHighlightOnFocus:
- return true;
- case SH_ScrollBar_MiddleClickAbsolutePosition:
- return true;
- case SH_Menu_AllowActiveAndDisabled:
- return false;
- case SH_MainWindow_SpaceBelowMenuBar:
- return false;
- case SH_MenuBar_MouseTracking:
- return true;
- case SH_Menu_MouseTracking:
- return true;
- case SH_TitleBar_AutoRaise:
- return true;
- case SH_TitleBar_NoBorder:
- return true;
- case SH_ItemView_ShowDecorationSelected:
- return true;
- case SH_Table_GridLineColor:
- if (option)
- return option->palette.background().color().darker(120).rgb();
- break;
- case SH_WindowFrame_Mask:
- if (QStyleHintReturnMask *mask = qstyleoption_cast<QStyleHintReturnMask *>(returnData)) {
- //left rounded corner
- mask->region = option->rect;
- mask->region -= QRect(option->rect.left(), option->rect.top(), 5, 1);
- mask->region -= QRect(option->rect.left(), option->rect.top() + 1, 3, 1);
- mask->region -= QRect(option->rect.left(), option->rect.top() + 2, 2, 1);
- mask->region -= QRect(option->rect.left(), option->rect.top() + 3, 1, 2);
-
- //right rounded corner
- mask->region -= QRect(option->rect.right() - 4, option->rect.top(), 5, 1);
- mask->region -= QRect(option->rect.right() - 2, option->rect.top() + 1, 3, 1);
- mask->region -= QRect(option->rect.right() - 1, option->rect.top() + 2, 2, 1);
- mask->region -= QRect(option->rect.right() , option->rect.top() + 3, 1, 2);
- }
- return QCommonStyle::styleHint(hint, option, widget, returnData);
- case SH_MessageBox_TextInteractionFlags:
- return Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse;
- case SH_MessageBox_CenterButtons:
- return false;
-#ifndef QT_NO_WIZARD
- case SH_WizardStyle:
- return QWizard::ClassicStyle;
-#endif
- case SH_ItemView_ArrowKeysNavigateIntoChildren:
- return false;
- case SH_DialogButtonLayout: {
- int ret = QDialogButtonBox::GnomeLayout;
- gboolean alternateOrder = 0;
- GtkSettings *settings = d->gtk_settings_get_default();
- g_object_get(settings, "gtk-alternative-button-order", &alternateOrder, NULL);
-
- if (alternateOrder)
- ret = QDialogButtonBox::WinLayout;
-
- return ret;
- }
- break;
-
- case SH_ToolButtonStyle:
- {
- if (d->isKDE4Session())
- return QCommonStyle::styleHint(hint, option, widget, returnData);
- GtkWidget *gtkToolbar = d->gtkWidget("GtkToolbar");
- GtkToolbarStyle toolbar_style = GTK_TOOLBAR_ICONS;
- g_object_get(gtkToolbar, "toolbar-style", &toolbar_style, NULL);
- switch (toolbar_style) {
- case GTK_TOOLBAR_TEXT:
- return Qt::ToolButtonTextOnly;
- case GTK_TOOLBAR_BOTH:
- return Qt::ToolButtonTextUnderIcon;
- case GTK_TOOLBAR_BOTH_HORIZ:
- return Qt::ToolButtonTextBesideIcon;
- case GTK_TOOLBAR_ICONS:
- default:
- return Qt::ToolButtonIconOnly;
- }
- }
- break;
- case SH_SpinControls_DisableOnBounds:
- return int(true);
-
- case SH_DitherDisabledText:
- return int(false);
-
- case SH_ComboBox_Popup: {
- GtkWidget *gtkComboBox = d->gtkWidget("GtkComboBox");
- gboolean appears_as_list;
- d->gtk_widget_style_get((GtkWidget*)gtkComboBox, "appears-as-list", &appears_as_list, NULL);
- return appears_as_list ? 0 : 1;
- }
-
- case SH_MenuBar_AltKeyNavigation:
- return int(false);
-
- case SH_EtchDisabledText:
- return int(false);
-
- case SH_Menu_SubMenuPopupDelay: {
- gint delay = 225;
- GtkSettings *settings = d->gtk_settings_get_default();
- g_object_get(settings, "gtk-menu-popup-delay", &delay, NULL);
- return delay;
- }
-
- case SH_ScrollView_FrameOnlyAroundContents: {
- gboolean scrollbars_within_bevel = false;
- if (widget && widget->isWindow())
- scrollbars_within_bevel = true;
- else if (!d->gtk_check_version(2, 12, 0)) {
- GtkWidget *gtkScrollWindow = d->gtkWidget("GtkScrolledWindow");
- d->gtk_widget_style_get(gtkScrollWindow, "scrollbars-within-bevel", &scrollbars_within_bevel, NULL);
- }
- return !scrollbars_within_bevel;
- }
-
- case SH_DialogButtonBox_ButtonsHaveIcons: {
- static bool buttonsHaveIcons = d->getGConfBool(QLS("/desktop/gnome/interface/buttons_have_icons"));
- return buttonsHaveIcons;
- }
-
- case SH_UnderlineShortcut: {
- gboolean underlineShortcut = true;
- if (!d->gtk_check_version(2, 12, 0)) {
- GtkSettings *settings = d->gtk_settings_get_default();
- g_object_get(settings, "gtk-enable-mnemonics", &underlineShortcut, NULL);
- }
- return underlineShortcut;
- }
-
- default:
- break;
- }
- return QCommonStyle::styleHint(hint, option, widget, returnData);
-}
-
-/*!
- \reimp
-*/
-void QGtkStyle::drawPrimitive(PrimitiveElement element,
- const QStyleOption *option,
- QPainter *painter,
- const QWidget *widget) const
-{
- Q_D(const QGtkStyle);
-
- if (!d->isThemeAvailable()) {
- QCommonStyle::drawPrimitive(element, option, painter, widget);
- return;
- }
-
- GtkStyle* style = d->gtkStyle();
- QGtkPainter* gtkPainter = d->gtkPainter(painter);
-
- switch (element) {
- case PE_Frame: {
- if (widget && widget->inherits("QComboBoxPrivateContainer")){
- QStyleOption copy = *option;
- copy.state |= State_Raised;
- proxy()->drawPrimitive(PE_PanelMenu, &copy, painter, widget);
- break;
- }
- // Drawing the entire itemview frame is very expensive, especially on the native X11 engine
- // Instead we cheat a bit and draw a border image without the center part, hence only scaling
- // thin rectangular images
- const int pmSize = 64;
- const int border = proxy()->pixelMetric(PM_DefaultFrameWidth, option, widget);
- const QString pmKey = QLatin1String("windowframe") % HexString<uint>(option->state);
-
- QPixmap pixmap;
- QRect pmRect(QPoint(0,0), QSize(pmSize, pmSize));
-
- // Only draw through style once
- if (!QPixmapCache::find(pmKey, pixmap)) {
- pixmap = QPixmap(pmSize, pmSize);
- pixmap.fill(Qt::transparent);
- QPainter pmPainter(&pixmap);
- gtkPainter->reset(&pmPainter);
- gtkPainter->setUsePixmapCache(false); // Don't cache twice
-
- GtkShadowType shadow_type = GTK_SHADOW_NONE;
- if (option->state & State_Sunken)
- shadow_type = GTK_SHADOW_IN;
- else if (option->state & State_Raised)
- shadow_type = GTK_SHADOW_OUT;
-
- GtkStyle *style = d->gtk_rc_get_style_by_paths(d->gtk_settings_get_default(),
- "*.GtkScrolledWindow", "*.GtkScrolledWindow", d->gtk_window_get_type());
- if (style)
- gtkPainter->paintShadow(d->gtkWidget("GtkFrame"), "viewport", pmRect,
- option->state & State_Enabled ? GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE,
- shadow_type, style);
- QPixmapCache::insert(pmKey, pixmap);
- gtkPainter->reset(painter);
- }
-
- QRect rect = option->rect;
- const int rw = rect.width() - border;
- const int rh = rect.height() - border;
- const int pw = pmRect.width() - border;
- const int ph = pmRect.height() - border;
-
- // Sidelines
- painter->drawPixmap(rect.adjusted(border, 0, -border, -rh), pixmap, pmRect.adjusted(border, 0, -border,-ph));
- painter->drawPixmap(rect.adjusted(border, rh, -border, 0), pixmap, pmRect.adjusted(border, ph,-border,0));
- painter->drawPixmap(rect.adjusted(0, border, -rw, -border), pixmap, pmRect.adjusted(0, border, -pw, -border));
- painter->drawPixmap(rect.adjusted(rw, border, 0, -border), pixmap, pmRect.adjusted(pw, border, 0, -border));
-
- // Corners
- painter->drawPixmap(rect.adjusted(0, 0, -rw, -rh), pixmap, pmRect.adjusted(0, 0, -pw,-ph));
- painter->drawPixmap(rect.adjusted(rw, 0, 0, -rh), pixmap, pmRect.adjusted(pw, 0, 0,-ph));
- painter->drawPixmap(rect.adjusted(0, rh, -rw, 0), pixmap, pmRect.adjusted(0, ph, -pw,0));
- painter->drawPixmap(rect.adjusted(rw, rh, 0, 0), pixmap, pmRect.adjusted(pw, ph, 0,0));
- }
- break;
- case PE_FrameWindow:
- painter->save();
- {
- QRect rect= option->rect;
- painter->setPen(QPen(option->palette.dark().color().darker(150), 0));
- painter->drawRect(option->rect.adjusted(0, 0, -1, -1));
- painter->setPen(QPen(option->palette.light(), 0));
- painter->drawLine(QPoint(rect.left() + 1, rect.top() + 1),
- QPoint(rect.left() + 1, rect.bottom() - 1));
- painter->setPen(QPen(option->palette.background().color().darker(120), 0));
- painter->drawLine(QPoint(rect.left() + 1, rect.bottom() - 1),
- QPoint(rect.right() - 2, rect.bottom() - 1));
- painter->drawLine(QPoint(rect.right() - 1, rect.top() + 1),
- QPoint(rect.right() - 1, rect.bottom() - 1));
- }
- painter->restore();
- break;
-
- case PE_PanelTipLabel: {
- GtkWidget *gtkWindow = d->gtkWidget("GtkWindow"); // The Murrine Engine currently assumes a widget is passed
- style = d->gtk_rc_get_style_by_paths(d->gtk_settings_get_default(), "gtk-tooltips", "GtkWindow",
- d->gtk_window_get_type());
- gtkPainter->paintFlatBox(gtkWindow, "tooltip", option->rect, GTK_STATE_NORMAL, GTK_SHADOW_NONE, style);
- }
- break;
-
- case PE_PanelStatusBar: {
- if (widget && widget->testAttribute(Qt::WA_SetPalette) &&
- option->palette.resolve() & (1 << QPalette::Window)) {
- // Respect custom palette
- painter->fillRect(option->rect, option->palette.window());
- break;
- }
- GtkShadowType shadow_type;
- GtkWidget *gtkStatusbarFrame = d->gtkWidget("GtkStatusbar.GtkFrame");
- d->gtk_widget_style_get(d->gtk_widget_get_parent(gtkStatusbarFrame), "shadow-type", &shadow_type, NULL);
- gtkPainter->paintShadow(gtkStatusbarFrame, "frame", option->rect, GTK_STATE_NORMAL,
- shadow_type, d->gtk_widget_get_style(gtkStatusbarFrame));
- }
- break;
-
- case PE_IndicatorHeaderArrow:
- if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(option)) {
- GtkWidget *gtkTreeHeader = d->gtkWidget("GtkTreeView.GtkButton");
- GtkStateType state = qt_gtk_state(option);
- style = d->gtk_widget_get_style(gtkTreeHeader);
- GtkArrowType type = GTK_ARROW_UP;
- // This sorting indicator inversion is intentional, and follows the GNOME HIG.
- // See http://library.gnome.org/devel/hig-book/stable/controls-lists.html.en#controls-lists-sortable
- if (header->sortIndicator & QStyleOptionHeader::SortUp)
- type = GTK_ARROW_UP;
- else if (header->sortIndicator & QStyleOptionHeader::SortDown)
- type = GTK_ARROW_DOWN;
-
- gtkPainter->paintArrow(gtkTreeHeader, "button", option->rect.adjusted(1, 1, -1, -1), type, state,
- GTK_SHADOW_NONE, false, style);
- }
- break;
-
- case PE_FrameDefaultButton: // fall through
- case PE_FrameFocusRect: {
- QRect frameRect = option->rect.adjusted(1, 1, -2, -2); // ### this mess should move to subcontrolrect
- if (qobject_cast<const QAbstractItemView*>(widget)) {
- // Don't draw anything
- } else if (qobject_cast<const QTabBar*>(widget)) {
- GtkWidget *gtkNotebook = d->gtkWidget("GtkNotebook");
- style = d->gtk_widget_get_style(gtkNotebook);
- gtkPainter->paintFocus(gtkNotebook, "tab", frameRect.adjusted(-1, 1, 1, 1), GTK_STATE_ACTIVE, style);
- } else {
- GtkWidget *gtkRadioButton = d->gtkWidget("GtkRadioButton");
- gtkPainter->paintFocus(gtkRadioButton, "radiobutton", frameRect, GTK_STATE_ACTIVE, style);
- }
- }
- break;
-
- case PE_IndicatorBranch:
- if (option->state & State_Children) {
- QRect rect = option->rect;
- rect = QRect(0, 0, 12, 12);
- rect.moveCenter(option->rect.center());
- rect.translate(2, 0);
- GtkExpanderStyle openState = GTK_EXPANDER_EXPANDED;
- GtkExpanderStyle closedState = GTK_EXPANDER_COLLAPSED;
- GtkWidget *gtkTreeView = d->gtkWidget("GtkTreeView");
-
- GtkStateType state = GTK_STATE_NORMAL;
- if (!(option->state & State_Enabled))
- state = GTK_STATE_INSENSITIVE;
- else if (option->state & State_MouseOver)
- state = GTK_STATE_PRELIGHT;
-
- gtkPainter->paintExpander(gtkTreeView, "treeview", rect, state,
- option->state & State_Open ? openState : closedState , d->gtk_widget_get_style(gtkTreeView));
- }
- break;
-
- case PE_PanelItemViewRow:
- // This primitive is only used to draw selection behind selected expander arrows.
- // We try not to decorate the tree branch background unless you inherit from StyledItemDelegate
- // The reason for this is that a lot of code that relies on custom item delegates will look odd having
- // a gradient on the branch but a flat shaded color on the item itself.
- QCommonStyle::drawPrimitive(element, option, painter, widget);
- if (!(option->state & State_Selected)) {
- break;
- } else {
- if (const QAbstractItemView *view = qobject_cast<const QAbstractItemView*>(widget)) {
- if (!qobject_cast<QStyledItemDelegate*>(view->itemDelegate()))
- break;
- }
- } // fall through
-
- case PE_PanelItemViewItem:
- if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(option)) {
- uint resolve_mask = vopt->palette.resolve();
- if (vopt->backgroundBrush.style() != Qt::NoBrush
- || (resolve_mask & (1 << QPalette::Base)))
- {
- QPointF oldBO = painter->brushOrigin();
- painter->setBrushOrigin(vopt->rect.topLeft());
- painter->fillRect(vopt->rect, vopt->backgroundBrush);
- painter->setBrushOrigin(oldBO);
- if (!(option->state & State_Selected))
- break;
- }
- if (GtkWidget *gtkTreeView = d->gtkWidget("GtkTreeView")) {
- const char *detail = "cell_even_ruled";
- if (vopt && vopt->features & QStyleOptionViewItem::Alternate)
- detail = "cell_odd_ruled";
- bool isActive = option->state & State_Active;
- QString key;
- if (isActive ) {
- // Required for active/non-active window appearance
- key = QLS("a");
- QGtkStylePrivate::gtkWidgetSetFocus(gtkTreeView, true);
- }
- bool isEnabled = (widget ? widget->isEnabled() : (vopt->state & QStyle::State_Enabled));
- gtkPainter->paintFlatBox(gtkTreeView, detail, option->rect,
- option->state & State_Selected ? GTK_STATE_SELECTED :
- isEnabled ? GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE,
- GTK_SHADOW_OUT, d->gtk_widget_get_style(gtkTreeView), key);
- if (isActive )
- QGtkStylePrivate::gtkWidgetSetFocus(gtkTreeView, false);
- }
- }
- break;
- case PE_IndicatorToolBarSeparator:
- {
- const int margin = 6;
- GtkWidget *gtkSeparator = d->gtkWidget("GtkToolbar.GtkSeparatorToolItem");
- if (option->state & State_Horizontal) {
- const int offset = option->rect.width()/2;
- QRect rect = option->rect.adjusted(offset, margin, 0, -margin);
- painter->setPen(QPen(option->palette.background().color().darker(110)));
- gtkPainter->paintVline(gtkSeparator, "vseparator",
- rect, GTK_STATE_NORMAL, d->gtk_widget_get_style(gtkSeparator),
- 0, rect.height(), 0);
- } else { //Draw vertical separator
- const int offset = option->rect.height()/2;
- QRect rect = option->rect.adjusted(margin, offset, -margin, 0);
- painter->setPen(QPen(option->palette.background().color().darker(110)));
- gtkPainter->paintHline(gtkSeparator, "hseparator",
- rect, GTK_STATE_NORMAL, d->gtk_widget_get_style(gtkSeparator),
- 0, rect.width(), 0);
- }
- }
- break;
-
- case PE_IndicatorToolBarHandle: {
- GtkWidget *gtkToolbar = d->gtkWidget("GtkToolbar");
- GtkShadowType shadow_type;
- d->gtk_widget_style_get(gtkToolbar, "shadow-type", &shadow_type, NULL);
- //Note when the toolbar is horizontal, the handle is vertical
- painter->setClipRect(option->rect);
- gtkPainter->paintHandle(gtkToolbar, "toolbar", option->rect.adjusted(-1, -1 ,0 ,1),
- GTK_STATE_NORMAL, shadow_type, !(option->state & State_Horizontal) ?
- GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL, d->gtk_widget_get_style(gtkToolbar));
- }
- break;
-
- case PE_IndicatorArrowUp:
- case PE_IndicatorArrowDown:
- case PE_IndicatorArrowLeft:
- case PE_IndicatorArrowRight: {
-
-
- GtkArrowType type = GTK_ARROW_UP;
-
- switch (element) {
-
- case PE_IndicatorArrowDown:
- type = GTK_ARROW_DOWN;
- break;
-
- case PE_IndicatorArrowLeft:
- type = GTK_ARROW_LEFT;
- break;
-
- case PE_IndicatorArrowRight:
- type = GTK_ARROW_RIGHT;
- break;
-
- default:
- break;
- }
- int size = qMin(option->rect.height(), option->rect.width());
- int border = (size > 9) ? (size/4) : 0; //Allow small arrows to have exact dimensions
- int bsx = 0, bsy = 0;
- if (option->state & State_Sunken) {
- bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal);
- bsy = proxy()->pixelMetric(PM_ButtonShiftVertical);
- }
- QRect arrowRect = option->rect.adjusted(border + bsx, border + bsy, -border + bsx, -border + bsy);
- GtkShadowType shadow = option->state & State_Sunken ? GTK_SHADOW_IN : GTK_SHADOW_OUT;
- GtkStateType state = qt_gtk_state(option);
-
- QColor arrowColor = option->palette.buttonText().color();
- GtkWidget *gtkArrow = d->gtkWidget("GtkArrow");
- GdkColor color = fromQColor(arrowColor);
- d->gtk_widget_modify_fg (gtkArrow, state, &color);
- gtkPainter->paintArrow(gtkArrow, "button", arrowRect,
- type, state, shadow, false, d->gtk_widget_get_style(gtkArrow),
- QString::number(arrowColor.rgba(), 16));
- // Passing NULL will revert the color change
- d->gtk_widget_modify_fg (gtkArrow, state, NULL);
- }
- break;
-
- case PE_FrameGroupBox:
- // Do nothing here, the GNOME groupboxes are flat
- break;
-
- case PE_PanelMenu: {
- GtkWidget *gtkMenu = d->gtkWidget("GtkMenu");
- gtkPainter->setAlphaSupport(false); // Note, alpha disabled for performance reasons
- gtkPainter->paintBox(gtkMenu, "menu", option->rect, GTK_STATE_NORMAL, GTK_SHADOW_OUT, d->gtk_widget_get_style(gtkMenu), QString());
- }
- break;
-
- case PE_FrameMenu:
- //This is actually done by PE_Widget due to a clipping issue
- //Otherwise Menu items will not be able to span the entire menu width
-
- // This is only used by floating tool bars
- if (qobject_cast<const QToolBar *>(widget)) {
- GtkWidget *gtkMenubar = d->gtkWidget("GtkMenuBar");
- gtkPainter->paintBox(gtkMenubar, "toolbar", option->rect,
- GTK_STATE_NORMAL, GTK_SHADOW_OUT, style);
- gtkPainter->paintBox(gtkMenubar, "menu", option->rect,
- GTK_STATE_NORMAL, GTK_SHADOW_OUT, style);
- }
- break;
-
- case PE_FrameLineEdit: {
- GtkWidget *gtkEntry = d->gtkWidget("GtkEntry");
-
-
- gboolean interior_focus;
- gint focus_line_width;
- QRect rect = option->rect;
- d->gtk_widget_style_get(gtkEntry,
- "interior-focus", &interior_focus,
- "focus-line-width", &focus_line_width, NULL);
-
- // See https://bugzilla.mozilla.org/show_bug.cgi?id=405421 for info about this hack
- g_object_set_data(G_OBJECT(gtkEntry), "transparent-bg-hint", GINT_TO_POINTER(true));
-
- if (!interior_focus && option->state & State_HasFocus)
- rect.adjust(focus_line_width, focus_line_width, -focus_line_width, -focus_line_width);
-
- if (option->state & State_HasFocus)
- QGtkStylePrivate::gtkWidgetSetFocus(gtkEntry, true);
- gtkPainter->paintShadow(gtkEntry, "entry", rect, option->state & State_Enabled ?
- GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE,
- GTK_SHADOW_IN, d->gtk_widget_get_style(gtkEntry),
- option->state & State_HasFocus ? QLS("focus") : QString());
- if (!interior_focus && option->state & State_HasFocus)
- gtkPainter->paintShadow(gtkEntry, "entry", option->rect, option->state & State_Enabled ?
- GTK_STATE_ACTIVE : GTK_STATE_INSENSITIVE,
- GTK_SHADOW_IN, d->gtk_widget_get_style(gtkEntry), QLS("GtkEntryShadowIn"));
-
- if (option->state & State_HasFocus)
- QGtkStylePrivate::gtkWidgetSetFocus(gtkEntry, false);
- }
- break;
-
- case PE_PanelLineEdit:
- if (const QStyleOptionFrame *panel = qstyleoption_cast<const QStyleOptionFrame *>(option)) {
- GtkWidget *gtkEntry = d->gtkWidget("GtkEntry");
- if (panel->lineWidth > 0)
- proxy()->drawPrimitive(PE_FrameLineEdit, option, painter, widget);
- uint resolve_mask = option->palette.resolve();
- GtkStyle *gtkEntryStyle = d->gtk_widget_get_style(gtkEntry);
- QRect textRect = option->rect.adjusted(gtkEntryStyle->xthickness, gtkEntryStyle->ythickness,
- -gtkEntryStyle->xthickness, -gtkEntryStyle->ythickness);
-
- if (widget && widget->testAttribute(Qt::WA_SetPalette) &&
- resolve_mask & (1 << QPalette::Base)) // Palette overridden by user
- painter->fillRect(textRect, option->palette.base());
- else
- gtkPainter->paintFlatBox(gtkEntry, "entry_bg", textRect,
- option->state & State_Enabled ? GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE, GTK_SHADOW_NONE, gtkEntryStyle);
- }
- break;
-
- case PE_FrameTabWidget:
- if (const QStyleOptionTabWidgetFrame *frame = qstyleoption_cast<const QStyleOptionTabWidgetFrame*>(option)) {
- GtkWidget *gtkNotebook = d->gtkWidget("GtkNotebook");
- style = d->gtk_widget_get_style(gtkNotebook);
- gtkPainter->setAlphaSupport(false);
- GtkShadowType shadow = GTK_SHADOW_OUT;
- GtkStateType state = GTK_STATE_NORMAL; // Only state supported by gtknotebook
- bool reverse = (option->direction == Qt::RightToLeft);
- QGtkStylePrivate::gtk_widget_set_direction(gtkNotebook, reverse ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR);
- if (const QStyleOptionTabWidgetFrameV2 *tabframe = qstyleoption_cast<const QStyleOptionTabWidgetFrameV2*>(option)) {
- GtkPositionType frameType = GTK_POS_TOP;
- QTabBar::Shape shape = frame->shape;
- int gapStart = 0;
- int gapSize = 0;
- if (shape == QTabBar::RoundedNorth || shape == QTabBar::RoundedSouth) {
- frameType = (shape == QTabBar::RoundedNorth) ? GTK_POS_TOP : GTK_POS_BOTTOM;
- gapStart = tabframe->selectedTabRect.left();
- gapSize = tabframe->selectedTabRect.width();
- } else {
- frameType = (shape == QTabBar::RoundedWest) ? GTK_POS_LEFT : GTK_POS_RIGHT;
- gapStart = tabframe->selectedTabRect.y();
- gapSize = tabframe->selectedTabRect.height();
- }
- gtkPainter->paintBoxGap(gtkNotebook, "notebook", option->rect, state, shadow, frameType,
- gapStart, gapSize, style);
- break; // done
- }
-
- // Note this is only the fallback option
- gtkPainter->paintBox(gtkNotebook, "notebook", option->rect, state, shadow, style);
- }
- break;
-
- case PE_PanelButtonCommand:
- case PE_PanelButtonTool: {
- bool isDefault = false;
- bool isTool = (element == PE_PanelButtonTool);
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton*>(option))
- isDefault = btn->features & QStyleOptionButton::DefaultButton;
-
- // don't draw a frame for tool buttons that have the autoRaise flag and are not enabled or on
- if (isTool && !(option->state & State_Enabled || option->state & State_On) && (option->state & State_AutoRaise))
- break;
- // don't draw a frame for dock widget buttons, unless we are hovering
- if (widget && widget->inherits("QDockWidgetTitleButton") && !(option->state & State_MouseOver))
- break;
-
- GtkStateType state = qt_gtk_state(option);
- if (option->state & State_On || option->state & State_Sunken)
- state = GTK_STATE_ACTIVE;
- GtkWidget *gtkButton = isTool ? d->gtkWidget("GtkToolButton.GtkButton") : d->gtkWidget("GtkButton");
- gint focusWidth, focusPad;
- gboolean interiorFocus = false;
- d->gtk_widget_style_get (gtkButton,
- "focus-line-width", &focusWidth,
- "focus-padding", &focusPad,
- "interior-focus", &interiorFocus, NULL);
-
- style = d->gtk_widget_get_style(gtkButton);
-
- QRect buttonRect = option->rect;
-
- QString key;
- if (isDefault) {
- key += QLS("def");
- QGtkStylePrivate::gtk_widget_set_can_default(gtkButton, true);
- QGtkStylePrivate::gtk_window_set_default((GtkWindow*)QGtkStylePrivate::gtk_widget_get_toplevel(gtkButton), gtkButton);
- gtkPainter->paintBox(gtkButton, "buttondefault", buttonRect, state, GTK_SHADOW_IN,
- style, isDefault ? QLS("d") : QString());
- }
-
- bool hasFocus = option->state & State_HasFocus;
-
- if (hasFocus) {
- key += QLS("def");
- QGtkStylePrivate::gtkWidgetSetFocus(gtkButton, true);
- }
-
- if (!interiorFocus)
- buttonRect = buttonRect.adjusted(focusWidth, focusWidth, -focusWidth, -focusWidth);
-
- GtkShadowType shadow = (option->state & State_Sunken || option->state & State_On ) ?
- GTK_SHADOW_IN : GTK_SHADOW_OUT;
-
- gtkPainter->paintBox(gtkButton, "button", buttonRect, state, shadow,
- style, key);
- if (isDefault)
- QGtkStylePrivate::gtk_window_set_default((GtkWindow*)QGtkStylePrivate::gtk_widget_get_toplevel(gtkButton), 0);
- if (hasFocus)
- QGtkStylePrivate::gtkWidgetSetFocus(gtkButton, false);
- }
- break;
-
- case PE_IndicatorRadioButton: {
- GtkShadowType shadow = GTK_SHADOW_OUT;
- GtkStateType state = qt_gtk_state(option);
-
- if (option->state & State_Sunken)
- state = GTK_STATE_ACTIVE;
-
- if (option->state & State_NoChange)
- shadow = GTK_SHADOW_ETCHED_IN;
- else if (option->state & State_On)
- shadow = GTK_SHADOW_IN;
- else
- shadow = GTK_SHADOW_OUT;
-
- GtkWidget *gtkRadioButton = d->gtkWidget("GtkRadioButton");
- gint spacing;
- d->gtk_widget_style_get(gtkRadioButton, "indicator-spacing", &spacing, NULL);
- QRect buttonRect = option->rect.adjusted(spacing, spacing, -spacing, -spacing);
- gtkPainter->setClipRect(option->rect);
- // ### Note: Ubuntulooks breaks when the proper widget is passed
- // Murrine engine requires a widget not to get RGBA check - warnings
- GtkWidget *gtkCheckButton = d->gtkWidget("GtkCheckButton");
- QString key(QLS("radiobutton"));
- if (option->state & State_HasFocus) { // Themes such as Nodoka check this flag
- key += QLatin1Char('f');
- QGtkStylePrivate::gtkWidgetSetFocus(gtkCheckButton, true);
- }
- gtkPainter->paintOption(gtkCheckButton , buttonRect, state, shadow, d->gtk_widget_get_style(gtkRadioButton), key);
- if (option->state & State_HasFocus)
- QGtkStylePrivate::gtkWidgetSetFocus(gtkCheckButton, false);
- }
- break;
-
- case PE_IndicatorCheckBox: {
- GtkShadowType shadow = GTK_SHADOW_OUT;
- GtkStateType state = qt_gtk_state(option);
-
- if (option->state & State_Sunken)
- state = GTK_STATE_ACTIVE;
-
- if (option->state & State_NoChange)
- shadow = GTK_SHADOW_ETCHED_IN;
- else if (option->state & State_On)
- shadow = GTK_SHADOW_IN;
- else
- shadow = GTK_SHADOW_OUT;
-
- int spacing;
-
- GtkWidget *gtkCheckButton = d->gtkWidget("GtkCheckButton");
- QString key(QLS("checkbutton"));
- if (option->state & State_HasFocus) { // Themes such as Nodoka checks this flag
- key += QLatin1Char('f');
- QGtkStylePrivate::gtkWidgetSetFocus(gtkCheckButton, true);
- }
-
- // Some styles such as aero-clone assume they can paint in the spacing area
- gtkPainter->setClipRect(option->rect);
-
- d->gtk_widget_style_get(gtkCheckButton, "indicator-spacing", &spacing, NULL);
-
- QRect checkRect = option->rect.adjusted(spacing, spacing, -spacing, -spacing);
-
- gtkPainter->paintCheckbox(gtkCheckButton, checkRect, state, shadow, d->gtk_widget_get_style(gtkCheckButton),
- key);
- if (option->state & State_HasFocus)
- QGtkStylePrivate::gtkWidgetSetFocus(gtkCheckButton, false);
-
- }
- break;
-
-#ifndef QT_NO_TABBAR
-
- case PE_FrameTabBarBase:
- if (const QStyleOptionTabBarBase *tbb
- = qstyleoption_cast<const QStyleOptionTabBarBase *>(option)) {
- QRect tabRect = tbb->rect;
- painter->save();
- painter->setPen(QPen(option->palette.dark().color().dark(110), 0));
- switch (tbb->shape) {
-
- case QTabBar::RoundedNorth:
- painter->drawLine(tabRect.topLeft(), tabRect.topRight());
- break;
-
- case QTabBar::RoundedWest:
- painter->drawLine(tabRect.left(), tabRect.top(), tabRect.left(), tabRect.bottom());
- break;
-
- case QTabBar::RoundedSouth:
- painter->drawLine(tbb->rect.left(), tbb->rect.bottom(),
- tabRect.right(), tabRect.bottom());
- break;
-
- case QTabBar::RoundedEast:
- painter->drawLine(tabRect.topRight(), tabRect.bottomRight());
- break;
-
- case QTabBar::TriangularNorth:
- case QTabBar::TriangularEast:
- case QTabBar::TriangularWest:
- case QTabBar::TriangularSouth:
- painter->restore();
- QCommonStyle::drawPrimitive(element, option, painter, widget);
- return;
- }
-
- painter->restore();
- }
- return;
-
-#endif // QT_NO_TABBAR
-
- case PE_Widget:
- break;
-
- default:
- QCommonStyle::drawPrimitive(element, option, painter, widget);
- }
-}
-
-/*!
- \reimp
-*/
-void QGtkStyle::drawComplexControl(ComplexControl control, const QStyleOptionComplex *option,
-
- QPainter *painter, const QWidget *widget) const
-{
- Q_D(const QGtkStyle);
-
- if (!d->isThemeAvailable()) {
- QCommonStyle::drawComplexControl(control, option, painter, widget);
- return;
- }
-
- GtkStyle* style = d->gtkStyle();
- QGtkPainter* gtkPainter = d->gtkPainter(painter);
- QColor button = option->palette.button().color();
- QColor dark;
- QColor grooveColor;
- QColor darkOutline;
- dark.setHsv(button.hue(),
- qMin(255, (int)(button.saturation()*1.9)),
- qMin(255, (int)(button.value()*0.7)));
- grooveColor.setHsv(button.hue(),
- qMin(255, (int)(button.saturation()*2.6)),
- qMin(255, (int)(button.value()*0.9)));
- darkOutline.setHsv(button.hue(),
- qMin(255, (int)(button.saturation()*3.0)),
- qMin(255, (int)(button.value()*0.6)));
-
- QColor alphaCornerColor;
-
- if (widget)
- alphaCornerColor = mergedColors(option->palette.color(widget->backgroundRole()), darkOutline);
- else
- alphaCornerColor = mergedColors(option->palette.background().color(), darkOutline);
-
- switch (control) {
-
- case CC_TitleBar:
- painter->save();
- if (const QStyleOptionTitleBar *titleBar = qstyleoption_cast<const QStyleOptionTitleBar *>(option)) {
- // Since this is drawn by metacity and not Gtk we
- // have to do custom drawing
-
- GdkColor gdkBg = style->bg[GTK_STATE_SELECTED];
- QColor bgColor(gdkBg.red>>8, gdkBg.green>>8, gdkBg.blue>>8);
-
- const int buttonMargin = 5;
- bool active = (titleBar->titleBarState & State_Active);
- QRect fullRect = titleBar->rect;
- QPalette palette = option->palette;
- QColor highlight = bgColor;
-
- QColor titleBarFrameBorder(active ? highlight.darker(180): dark.darker(110));
- QColor titleBarHighlight(active ? highlight.lighter(120): palette.background().color().lighter(120));
- QColor textColor(active ? 0xffffff : 0xff000000);
- QColor textAlphaColor(active ? 0xffffff : 0xff000000 );
-
- {
- // Fill title bar gradient
- QColor titlebarColor = QColor(active ? highlight: palette.background().color());
- QLinearGradient gradient(option->rect.center().x(), option->rect.top(),
- option->rect.center().x(), option->rect.bottom());
-
- gradient.setColorAt(0, titlebarColor.lighter(114));
- gradient.setColorAt(0.5, titlebarColor.lighter(102));
- gradient.setColorAt(0.51, titlebarColor.darker(104));
- gradient.setColorAt(1, titlebarColor);
- painter->fillRect(option->rect.adjusted(1, 1, -1, 0), gradient);
-
- // Frame and rounded corners
- painter->setPen(titleBarFrameBorder);
-
- // top outline
- painter->drawLine(fullRect.left() + 5, fullRect.top(), fullRect.right() - 5, fullRect.top());
- painter->drawLine(fullRect.left(), fullRect.top() + 4, fullRect.left(), fullRect.bottom());
- const QPoint points[5] = {
- QPoint(fullRect.left() + 4, fullRect.top() + 1),
- QPoint(fullRect.left() + 3, fullRect.top() + 1),
- QPoint(fullRect.left() + 2, fullRect.top() + 2),
- QPoint(fullRect.left() + 1, fullRect.top() + 3),
- QPoint(fullRect.left() + 1, fullRect.top() + 4)
- };
- painter->drawPoints(points, 5);
-
- painter->drawLine(fullRect.right(), fullRect.top() + 4, fullRect.right(), fullRect.bottom());
- const QPoint points2[5] = {
- QPoint(fullRect.right() - 3, fullRect.top() + 1),
- QPoint(fullRect.right() - 4, fullRect.top() + 1),
- QPoint(fullRect.right() - 2, fullRect.top() + 2),
- QPoint(fullRect.right() - 1, fullRect.top() + 3),
- QPoint(fullRect.right() - 1, fullRect.top() + 4)
- };
- painter->drawPoints(points2, 5);
-
- // draw bottomline
- painter->drawLine(fullRect.right(), fullRect.bottom(), fullRect.left(), fullRect.bottom());
-
- // top highlight
- painter->setPen(titleBarHighlight);
- painter->drawLine(fullRect.left() + 6, fullRect.top() + 1, fullRect.right() - 6, fullRect.top() + 1);
- }
- // draw title
- QRect textRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarLabel, widget);
- QFont font = painter->font();
- font.setBold(true);
- painter->setFont(font);
- painter->setPen(active? (titleBar->palette.text().color().lighter(120)) :
- titleBar->palette.text().color() );
- // Note workspace also does elliding but it does not use the correct font
- QString title = QFontMetrics(font).elidedText(titleBar->text, Qt::ElideRight, textRect.width() - 14);
- painter->drawText(textRect.adjusted(1, 1, 1, 1), title, QTextOption(Qt::AlignHCenter | Qt::AlignVCenter));
- painter->setPen(Qt::white);
- if (active)
- painter->drawText(textRect, title, QTextOption(Qt::AlignHCenter | Qt::AlignVCenter));
- // min button
- if ((titleBar->subControls & SC_TitleBarMinButton) && (titleBar->titleBarFlags & Qt::WindowMinimizeButtonHint) &&
- !(titleBar->titleBarState& Qt::WindowMinimized)) {
- QRect minButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarMinButton, widget);
- if (minButtonRect.isValid()) {
- bool hover = (titleBar->activeSubControls & SC_TitleBarMinButton) && (titleBar->state & State_MouseOver);
- bool sunken = (titleBar->activeSubControls & SC_TitleBarMinButton) && (titleBar->state & State_Sunken);
- qt_gtk_draw_mdibutton(painter, titleBar, minButtonRect, hover, sunken);
- QRect minButtonIconRect = minButtonRect.adjusted(buttonMargin ,buttonMargin , -buttonMargin, -buttonMargin);
- painter->setPen(textColor);
- painter->drawLine(minButtonIconRect.center().x() - 2, minButtonIconRect.center().y() + 3,
- minButtonIconRect.center().x() + 3, minButtonIconRect.center().y() + 3);
- painter->drawLine(minButtonIconRect.center().x() - 2, minButtonIconRect.center().y() + 4,
- minButtonIconRect.center().x() + 3, minButtonIconRect.center().y() + 4);
- painter->setPen(textAlphaColor);
- painter->drawLine(minButtonIconRect.center().x() - 3, minButtonIconRect.center().y() + 3,
- minButtonIconRect.center().x() - 3, minButtonIconRect.center().y() + 4);
- painter->drawLine(minButtonIconRect.center().x() + 4, minButtonIconRect.center().y() + 3,
- minButtonIconRect.center().x() + 4, minButtonIconRect.center().y() + 4);
- }
- }
- // max button
- if ((titleBar->subControls & SC_TitleBarMaxButton) && (titleBar->titleBarFlags & Qt::WindowMaximizeButtonHint) &&
- !(titleBar->titleBarState & Qt::WindowMaximized)) {
- QRect maxButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarMaxButton, widget);
- if (maxButtonRect.isValid()) {
- bool hover = (titleBar->activeSubControls & SC_TitleBarMaxButton) && (titleBar->state & State_MouseOver);
- bool sunken = (titleBar->activeSubControls & SC_TitleBarMaxButton) && (titleBar->state & State_Sunken);
- qt_gtk_draw_mdibutton(painter, titleBar, maxButtonRect, hover, sunken);
-
- QRect maxButtonIconRect = maxButtonRect.adjusted(buttonMargin, buttonMargin, -buttonMargin, -buttonMargin);
-
- painter->setPen(textColor);
- painter->drawRect(maxButtonIconRect.adjusted(0, 0, -1, -1));
- painter->drawLine(maxButtonIconRect.left() + 1, maxButtonIconRect.top() + 1,
- maxButtonIconRect.right() - 1, maxButtonIconRect.top() + 1);
- painter->setPen(textAlphaColor);
- const QPoint points[4] = {
- maxButtonIconRect.topLeft(),
- maxButtonIconRect.topRight(),
- maxButtonIconRect.bottomLeft(),
- maxButtonIconRect.bottomRight()
- };
- painter->drawPoints(points, 4);
- }
- }
-
- // close button
- if ((titleBar->subControls & SC_TitleBarCloseButton) && (titleBar->titleBarFlags & Qt::WindowSystemMenuHint)) {
- QRect closeButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarCloseButton, widget);
- if (closeButtonRect.isValid()) {
- bool hover = (titleBar->activeSubControls & SC_TitleBarCloseButton) && (titleBar->state & State_MouseOver);
- bool sunken = (titleBar->activeSubControls & SC_TitleBarCloseButton) && (titleBar->state & State_Sunken);
- qt_gtk_draw_mdibutton(painter, titleBar, closeButtonRect, hover, sunken);
- QRect closeIconRect = closeButtonRect.adjusted(buttonMargin, buttonMargin, -buttonMargin, -buttonMargin);
- painter->setPen(textAlphaColor);
- const QLine lines[4] = {
- QLine(closeIconRect.left() + 1, closeIconRect.top(),
- closeIconRect.right(), closeIconRect.bottom() - 1),
- QLine(closeIconRect.left(), closeIconRect.top() + 1,
- closeIconRect.right() - 1, closeIconRect.bottom()),
- QLine(closeIconRect.right() - 1, closeIconRect.top(),
- closeIconRect.left(), closeIconRect.bottom() - 1),
- QLine(closeIconRect.right(), closeIconRect.top() + 1,
- closeIconRect.left() + 1, closeIconRect.bottom())
- };
- painter->drawLines(lines, 4);
- const QPoint points[4] = {
- closeIconRect.topLeft(),
- closeIconRect.topRight(),
- closeIconRect.bottomLeft(),
- closeIconRect.bottomRight()
- };
- painter->drawPoints(points, 4);
-
- painter->setPen(textColor);
- painter->drawLine(closeIconRect.left() + 1, closeIconRect.top() + 1,
- closeIconRect.right() - 1, closeIconRect.bottom() - 1);
- painter->drawLine(closeIconRect.left() + 1, closeIconRect.bottom() - 1,
- closeIconRect.right() - 1, closeIconRect.top() + 1);
- }
- }
-
- // normalize button
- if ((titleBar->subControls & SC_TitleBarNormalButton) &&
- (((titleBar->titleBarFlags & Qt::WindowMinimizeButtonHint) &&
- (titleBar->titleBarState & Qt::WindowMinimized)) ||
- ((titleBar->titleBarFlags & Qt::WindowMaximizeButtonHint) &&
- (titleBar->titleBarState & Qt::WindowMaximized)))) {
- QRect normalButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarNormalButton, widget);
- if (normalButtonRect.isValid()) {
-
- bool hover = (titleBar->activeSubControls & SC_TitleBarNormalButton) && (titleBar->state & State_MouseOver);
- bool sunken = (titleBar->activeSubControls & SC_TitleBarNormalButton) && (titleBar->state & State_Sunken);
- QRect normalButtonIconRect = normalButtonRect.adjusted(buttonMargin, buttonMargin, -buttonMargin, -buttonMargin);
- qt_gtk_draw_mdibutton(painter, titleBar, normalButtonRect, hover, sunken);
-
- QRect frontWindowRect = normalButtonIconRect.adjusted(0, 3, -3, 0);
- painter->setPen(textColor);
- painter->drawRect(frontWindowRect.adjusted(0, 0, -1, -1));
- painter->drawLine(frontWindowRect.left() + 1, frontWindowRect.top() + 1,
- frontWindowRect.right() - 1, frontWindowRect.top() + 1);
- painter->setPen(textAlphaColor);
- const QPoint points[4] = {
- frontWindowRect.topLeft(),
- frontWindowRect.topRight(),
- frontWindowRect.bottomLeft(),
- frontWindowRect.bottomRight()
- };
- painter->drawPoints(points, 4);
-
- QRect backWindowRect = normalButtonIconRect.adjusted(3, 0, 0, -3);
- QRegion clipRegion = backWindowRect;
- clipRegion -= frontWindowRect;
- painter->save();
- painter->setClipRegion(clipRegion);
- painter->setPen(textColor);
- painter->drawRect(backWindowRect.adjusted(0, 0, -1, -1));
- painter->drawLine(backWindowRect.left() + 1, backWindowRect.top() + 1,
- backWindowRect.right() - 1, backWindowRect.top() + 1);
- painter->setPen(textAlphaColor);
- const QPoint points2[4] = {
- backWindowRect.topLeft(),
- backWindowRect.topRight(),
- backWindowRect.bottomLeft(),
- backWindowRect.bottomRight()
- };
- painter->drawPoints(points2, 4);
- painter->restore();
- }
- }
-
- // context help button
- if (titleBar->subControls & SC_TitleBarContextHelpButton
- && (titleBar->titleBarFlags & Qt::WindowContextHelpButtonHint)) {
- QRect contextHelpButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarContextHelpButton, widget);
- if (contextHelpButtonRect.isValid()) {
- bool hover = (titleBar->activeSubControls & SC_TitleBarContextHelpButton) && (titleBar->state & State_MouseOver);
- bool sunken = (titleBar->activeSubControls & SC_TitleBarContextHelpButton) && (titleBar->state & State_Sunken);
- qt_gtk_draw_mdibutton(painter, titleBar, contextHelpButtonRect, hover, sunken);
-
- QColor blend;
- QImage image(qt_titlebar_context_help);
- QColor alpha = textColor;
- alpha.setAlpha(128);
- image.setColor(1, textColor.rgba());
- image.setColor(2, alpha.rgba());
- painter->setRenderHint(QPainter::SmoothPixmapTransform);
- painter->drawImage(contextHelpButtonRect.adjusted(4, 4, -4, -4), image);
- }
- }
-
- // shade button
- if (titleBar->subControls & SC_TitleBarShadeButton && (titleBar->titleBarFlags & Qt::WindowShadeButtonHint)) {
- QRect shadeButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarShadeButton, widget);
- if (shadeButtonRect.isValid()) {
- bool hover = (titleBar->activeSubControls & SC_TitleBarShadeButton) && (titleBar->state & State_MouseOver);
- bool sunken = (titleBar->activeSubControls & SC_TitleBarShadeButton) && (titleBar->state & State_Sunken);
- qt_gtk_draw_mdibutton(painter, titleBar, shadeButtonRect, hover, sunken);
- QImage image(qt_scrollbar_button_arrow_up);
- image.setColor(1, textColor.rgba());
- painter->drawImage(shadeButtonRect.adjusted(5, 7, -5, -7), image);
- }
- }
-
- // unshade button
- if (titleBar->subControls & SC_TitleBarUnshadeButton && (titleBar->titleBarFlags & Qt::WindowShadeButtonHint)) {
- QRect unshadeButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarUnshadeButton, widget);
- if (unshadeButtonRect.isValid()) {
- bool hover = (titleBar->activeSubControls & SC_TitleBarUnshadeButton) && (titleBar->state & State_MouseOver);
- bool sunken = (titleBar->activeSubControls & SC_TitleBarUnshadeButton) && (titleBar->state & State_Sunken);
- qt_gtk_draw_mdibutton(painter, titleBar, unshadeButtonRect, hover, sunken);
- QImage image(qt_scrollbar_button_arrow_down);
- image.setColor(1, textColor.rgba());
- painter->drawImage(unshadeButtonRect.adjusted(5, 7, -5, -7), image);
- }
- }
-
- if ((titleBar->subControls & SC_TitleBarSysMenu) && (titleBar->titleBarFlags & Qt::WindowSystemMenuHint)) {
- QRect iconRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarSysMenu, widget);
- if (iconRect.isValid()) {
- if (!titleBar->icon.isNull()) {
- titleBar->icon.paint(painter, iconRect);
- } else {
- QStyleOption tool(0);
- tool.palette = titleBar->palette;
- QPixmap pm = proxy()->standardIcon(SP_TitleBarMenuButton, &tool, widget).pixmap(16, 16);
- tool.rect = iconRect;
- painter->save();
- proxy()->drawItemPixmap(painter, iconRect, Qt::AlignCenter, pm);
- painter->restore();
- }
- }
- }
- }
- painter->restore();
- break;
-
-#ifndef QT_NO_GROUPBOX
-
- case CC_GroupBox:
- painter->save();
-
- if (const QStyleOptionGroupBox *groupBox = qstyleoption_cast<const QStyleOptionGroupBox *>(option)) {
- QRect textRect = proxy()->subControlRect(CC_GroupBox, groupBox, SC_GroupBoxLabel, widget);
- QRect checkBoxRect = proxy()->subControlRect(CC_GroupBox, groupBox, SC_GroupBoxCheckBox, widget);
- // Draw title
-
- if ((groupBox->subControls & QStyle::SC_GroupBoxLabel) && !groupBox->text.isEmpty()) {
- // Draw prelight background
- GtkWidget *gtkCheckButton = d->gtkWidget("GtkCheckButton");
-
- if (option->state & State_MouseOver) {
- QRect bgRect = textRect | checkBoxRect;
- gtkPainter->paintFlatBox(gtkCheckButton, "checkbutton", bgRect.adjusted(0, 0, 0, -2),
- GTK_STATE_PRELIGHT, GTK_SHADOW_ETCHED_OUT, d->gtk_widget_get_style(gtkCheckButton));
- }
-
- if (!groupBox->text.isEmpty()) {
- int alignment = int(groupBox->textAlignment);
- if (!proxy()->styleHint(QStyle::SH_UnderlineShortcut, option, widget))
- alignment |= Qt::TextHideMnemonic;
- QColor textColor = groupBox->textColor; // Note: custom textColor is currently ignored
- int labelState = GTK_STATE_INSENSITIVE;
-
- if (option->state & State_Enabled)
- labelState = (option->state & State_MouseOver) ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL;
-
- GdkColor gdkText = d->gtk_widget_get_style(gtkCheckButton)->fg[labelState];
- textColor = QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
- painter->setPen(textColor);
- QFont font = painter->font();
- font.setBold(true);
- painter->setFont(font);
- painter->drawText(textRect, Qt::TextShowMnemonic | Qt::AlignLeft| alignment, groupBox->text);
-
- if (option->state & State_HasFocus)
- gtkPainter->paintFocus(gtkCheckButton, "checkbutton", textRect.adjusted(-4, -1, 0, -3), GTK_STATE_ACTIVE, style);
- }
- }
-
- if (groupBox->subControls & SC_GroupBoxCheckBox) {
- QStyleOptionButton box;
- box.QStyleOption::operator=(*groupBox);
- box.rect = checkBoxRect;
- proxy()->drawPrimitive(PE_IndicatorCheckBox, &box, painter, widget);
- }
- }
-
- painter->restore();
- break;
-#endif // QT_NO_GROUPBOX
-
-#ifndef QT_NO_COMBOBOX
-
- case CC_ComboBox:
- // See: http://live.gnome.org/GnomeArt/Tutorials/GtkThemes/GtkComboBox
- // and http://live.gnome.org/GnomeArt/Tutorials/GtkThemes/GtkComboBoxEntry
- if (const QStyleOptionComboBox *comboBox = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
- bool sunken = comboBox->state & State_On; // play dead, if combobox has no items
- BEGIN_STYLE_PIXMAPCACHE(QString::fromLatin1("cb-%0-%1").arg(sunken).arg(comboBox->editable));
- gtkPainter->reset(p);
- gtkPainter->setUsePixmapCache(false); // cached externally
-
- bool isEnabled = (comboBox->state & State_Enabled);
- bool focus = isEnabled && (comboBox->state & State_HasFocus);
- GtkStateType state = qt_gtk_state(option);
- int appears_as_list = !proxy()->styleHint(QStyle::SH_ComboBox_Popup, comboBox, widget);
- QStyleOptionComboBox comboBoxCopy = *comboBox;
- comboBoxCopy.rect = option->rect;
-
- bool reverse = (option->direction == Qt::RightToLeft);
- QRect rect = option->rect;
- QRect arrowButtonRect = proxy()->subControlRect(CC_ComboBox, &comboBoxCopy,
- SC_ComboBoxArrow, widget);
-
- GtkShadowType shadow = (option->state & State_Sunken || option->state & State_On ) ?
- GTK_SHADOW_IN : GTK_SHADOW_OUT;
- const QHashableLatin1Literal comboBoxPath = comboBox->editable ? QHashableLatin1Literal("GtkComboBoxEntry") : QHashableLatin1Literal("GtkComboBox");
-
- // We use the gtk widget to position arrows and separators for us
- GtkWidget *gtkCombo = d->gtkWidget(comboBoxPath);
- GtkAllocation geometry = {0, 0, option->rect.width(), option->rect.height()};
- d->gtk_widget_set_direction(gtkCombo, reverse ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR);
- d->gtk_widget_size_allocate(gtkCombo, &geometry);
-
- QHashableLatin1Literal buttonPath = comboBox->editable ? QHashableLatin1Literal("GtkComboBoxEntry.GtkToggleButton")
- : QHashableLatin1Literal("GtkComboBox.GtkToggleButton");
- GtkWidget *gtkToggleButton = d->gtkWidget(buttonPath);
- d->gtk_widget_set_direction(gtkToggleButton, reverse ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR);
- if (gtkToggleButton && (appears_as_list || comboBox->editable)) {
- if (focus)
- QGtkStylePrivate::gtkWidgetSetFocus(gtkToggleButton, true);
- // Draw the combo box as a line edit with a button next to it
- if (comboBox->editable || appears_as_list) {
- GtkStateType frameState = (state == GTK_STATE_PRELIGHT) ? GTK_STATE_NORMAL : state;
- QHashableLatin1Literal entryPath = comboBox->editable ? QHashableLatin1Literal("GtkComboBoxEntry.GtkEntry") : QHashableLatin1Literal("GtkComboBox.GtkFrame");
- GtkWidget *gtkEntry = d->gtkWidget(entryPath);
- d->gtk_widget_set_direction(gtkEntry, reverse ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR);
- QRect frameRect = option->rect;
-
- if (reverse)
- frameRect.setLeft(arrowButtonRect.right());
- else
- frameRect.setRight(arrowButtonRect.left());
-
- // Fill the line edit background
- // We could have used flat_box with "entry_bg" but that is probably not worth the overhead
- uint resolve_mask = option->palette.resolve();
- GtkStyle *gtkEntryStyle = d->gtk_widget_get_style(gtkEntry);
- QRect contentRect = frameRect.adjusted(gtkEntryStyle->xthickness, gtkEntryStyle->ythickness,
- -gtkEntryStyle->xthickness, -gtkEntryStyle->ythickness);
- // Required for inner blue highlight with clearlooks
- if (focus)
- QGtkStylePrivate::gtkWidgetSetFocus(gtkEntry, true);
-
- if (widget && widget->testAttribute(Qt::WA_SetPalette) &&
- resolve_mask & (1 << QPalette::Base)) // Palette overridden by user
- p->fillRect(contentRect, option->palette.base().color());
- else {
- gtkPainter->paintFlatBox(gtkEntry, "entry_bg", contentRect,
- option->state & State_Enabled ? GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE,
- GTK_SHADOW_NONE, gtkEntryStyle, entryPath.toString() + QString::number(focus));
- }
-
- gtkPainter->paintShadow(gtkEntry, comboBox->editable ? "entry" : "frame", frameRect, frameState,
- GTK_SHADOW_IN, gtkEntryStyle, entryPath.toString() +
- QString::number(focus) + QString::number(comboBox->editable) +
- QString::number(option->direction));
- if (focus)
- QGtkStylePrivate::gtkWidgetSetFocus(gtkEntry, false);
- }
-
- GtkStateType buttonState = GTK_STATE_NORMAL;
-
- if (!(option->state & State_Enabled))
- buttonState = GTK_STATE_INSENSITIVE;
- else if (option->state & State_Sunken || option->state & State_On)
- buttonState = GTK_STATE_ACTIVE;
- else if (option->state & State_MouseOver && comboBox->activeSubControls & SC_ComboBoxArrow)
- buttonState = GTK_STATE_PRELIGHT;
-
- Q_ASSERT(gtkToggleButton);
- gtkPainter->paintBox(gtkToggleButton, "button", arrowButtonRect, buttonState,
- shadow, d->gtk_widget_get_style(gtkToggleButton), buttonPath.toString() +
- QString::number(focus) + QString::number(option->direction));
- if (focus)
- QGtkStylePrivate::gtkWidgetSetFocus(gtkToggleButton, false);
- } else {
- // Draw combo box as a button
- QRect buttonRect = option->rect;
- GtkStyle *gtkToggleButtonStyle = d->gtk_widget_get_style(gtkToggleButton);
-
- if (focus) // Clearlooks actually check the widget for the default state
- QGtkStylePrivate::gtkWidgetSetFocus(gtkToggleButton, true);
- gtkPainter->paintBox(gtkToggleButton, "button",
- buttonRect, state,
- shadow, gtkToggleButtonStyle,
- buttonPath.toString() + QString::number(focus));
- if (focus)
- QGtkStylePrivate::gtkWidgetSetFocus(gtkToggleButton, false);
-
-
- // Draw the separator between label and arrows
- QHashableLatin1Literal vSeparatorPath = comboBox->editable
- ? QHashableLatin1Literal("GtkComboBoxEntry.GtkToggleButton.GtkHBox.GtkVSeparator")
- : QHashableLatin1Literal("GtkComboBox.GtkToggleButton.GtkHBox.GtkVSeparator");
-
- if (GtkWidget *gtkVSeparator = d->gtkWidget(vSeparatorPath)) {
- GtkAllocation allocation;
- d->gtk_widget_get_allocation(gtkVSeparator, &allocation);
- QRect vLineRect(allocation.x, allocation.y, allocation.width, allocation.height);
-
- gtkPainter->paintVline(gtkVSeparator, "vseparator",
- vLineRect, state, d->gtk_widget_get_style(gtkVSeparator),
- 0, vLineRect.height(), 0, vSeparatorPath.toString());
-
-
- gint interiorFocus = true;
- d->gtk_widget_style_get(gtkToggleButton, "interior-focus", &interiorFocus, NULL);
- int xt = interiorFocus ? gtkToggleButtonStyle->xthickness : 0;
- int yt = interiorFocus ? gtkToggleButtonStyle->ythickness : 0;
- if (focus && ((option->state & State_KeyboardFocusChange) || styleHint(SH_UnderlineShortcut, option, widget)))
- gtkPainter->paintFocus(gtkToggleButton, "button",
- option->rect.adjusted(xt, yt, -xt, -yt),
- option->state & State_Sunken ? GTK_STATE_ACTIVE : GTK_STATE_NORMAL,
- gtkToggleButtonStyle);
- }
- }
-
- if (comboBox->subControls & SC_ComboBoxArrow) {
- if (!isEnabled)
- state = GTK_STATE_INSENSITIVE;
- else if (sunken)
- state = GTK_STATE_ACTIVE;
- else if (option->state & State_MouseOver)
- state = GTK_STATE_PRELIGHT;
- else
- state = GTK_STATE_NORMAL;
-
- QHashableLatin1Literal arrowPath("");
- if (comboBox->editable) {
- if (appears_as_list)
- arrowPath = QHashableLatin1Literal("GtkComboBoxEntry.GtkToggleButton.GtkArrow");
- else
- arrowPath = QHashableLatin1Literal("GtkComboBoxEntry.GtkToggleButton.GtkHBox.GtkArrow");
- } else {
- if (appears_as_list)
- arrowPath = QHashableLatin1Literal("GtkComboBox.GtkToggleButton.GtkArrow");
- else
- arrowPath = QHashableLatin1Literal("GtkComboBox.GtkToggleButton.GtkHBox.GtkArrow");
- }
-
- GtkWidget *gtkArrow = d->gtkWidget(arrowPath);
- gfloat scale = 0.7;
- gint minSize = 15;
- QRect arrowWidgetRect;
-
- if (gtkArrow && !d->gtk_check_version(2, 12, 0)) {
- d->gtk_widget_style_get(gtkArrow, "arrow-scaling", &scale, NULL);
- d->gtk_widget_style_get(gtkCombo, "arrow-size", &minSize, NULL);
- }
- if (gtkArrow) {
- GtkAllocation allocation;
- d->gtk_widget_get_allocation(gtkArrow, &allocation);
- arrowWidgetRect = QRect(allocation.x, allocation.y, allocation.width, allocation.height);
- style = d->gtk_widget_get_style(gtkArrow);
- }
-
- // Note that for some reason the arrow-size is not properly respected with Hildon
- // Hence we enforce the minimum "arrow-size" ourselves
- int arrowSize = qMax(qMin(rect.height() - d->gtk_widget_get_style(gtkCombo)->ythickness * 2, minSize),
- qMin(arrowWidgetRect.width(), arrowWidgetRect.height()));
- QRect arrowRect(0, 0, static_cast<int>(arrowSize * scale), static_cast<int>(arrowSize * scale));
-
- arrowRect.moveCenter(arrowWidgetRect.center());
-
- if (sunken) {
- int xoff, yoff;
- const QHashableLatin1Literal toggleButtonPath = comboBox->editable
- ? QHashableLatin1Literal("GtkComboBoxEntry.GtkToggleButton")
- : QHashableLatin1Literal("GtkComboBox.GtkToggleButton");
-
- GtkWidget *gtkButton = d->gtkWidget(toggleButtonPath);
- d->gtk_widget_style_get(gtkButton, "child-displacement-x", &xoff, NULL);
- d->gtk_widget_style_get(gtkButton, "child-displacement-y", &yoff, NULL);
- arrowRect = arrowRect.adjusted(xoff, yoff, xoff, yoff);
- }
-
- // Some styles such as Nimbus paint outside the arrowRect
- // hence we have provide the whole widget as the cliprect
- if (gtkArrow) {
- gtkPainter->setClipRect(option->rect);
- gtkPainter->paintArrow(gtkArrow, "arrow", arrowRect,
- GTK_ARROW_DOWN, state, GTK_SHADOW_NONE, true,
- style, arrowPath.toString() + QString::number(option->direction));
- }
- }
- END_STYLE_PIXMAPCACHE;
- }
- break;
-#endif // QT_NO_COMBOBOX
-#ifndef QT_NO_TOOLBUTTON
-
- case CC_ToolButton:
- if (const QStyleOptionToolButton *toolbutton
- = qstyleoption_cast<const QStyleOptionToolButton *>(option)) {
- QRect button, menuarea;
- button = proxy()->subControlRect(control, toolbutton, SC_ToolButton, widget);
- menuarea = proxy()->subControlRect(control, toolbutton, SC_ToolButtonMenu, widget);
- State bflags = toolbutton->state & ~(State_Sunken | State_MouseOver);
-
- if (bflags & State_AutoRaise)
- if (!(bflags & State_MouseOver))
- bflags &= ~State_Raised;
-
- State mflags = bflags;
-
- if (toolbutton->state & State_Sunken) {
- if (toolbutton->activeSubControls & SC_ToolButton)
- bflags |= State_Sunken;
- if (toolbutton->activeSubControls & SC_ToolButtonMenu)
- mflags |= State_Sunken;
- } else if (toolbutton->state & State_MouseOver) {
- if (toolbutton->activeSubControls & SC_ToolButton)
- bflags |= State_MouseOver;
- if (toolbutton->activeSubControls & SC_ToolButtonMenu)
- mflags |= State_MouseOver;
- }
-
- QStyleOption tool(0);
-
- tool.palette = toolbutton->palette;
-
- if (toolbutton->subControls & SC_ToolButton) {
- if (bflags & (State_Sunken | State_On | State_Raised | State_MouseOver)) {
- tool.rect = button;
- tool.state = bflags;
- proxy()->drawPrimitive(PE_PanelButtonTool, &tool, painter, widget);
- }
- }
-
- bool drawMenuArrow = toolbutton->features & QStyleOptionToolButton::HasMenu &&
- !(toolbutton->features & QStyleOptionToolButton::MenuButtonPopup);
- int popupArrowSize = drawMenuArrow ? 7 : 0;
-
- if (toolbutton->state & State_HasFocus) {
- QStyleOptionFocusRect fr;
- fr.QStyleOption::operator=(*toolbutton);
- fr.rect = proxy()->subControlRect(CC_ToolButton, toolbutton, SC_ToolButton, widget);
- fr.rect.adjust(1, 1, -1, -1);
- proxy()->drawPrimitive(PE_FrameFocusRect, &fr, painter, widget);
- }
-
- QStyleOptionToolButton label = *toolbutton;
- label.state = bflags;
- GtkWidget *gtkButton = d->gtkWidget("GtkToolButton.GtkButton");
- QPalette pal = toolbutton->palette;
- if (option->state & State_Enabled &&
- option->state & State_MouseOver && !(widget && widget->testAttribute(Qt::WA_SetPalette))) {
- GdkColor gdkText = d->gtk_widget_get_style(gtkButton)->fg[GTK_STATE_PRELIGHT];
- QColor textColor = QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
- pal.setBrush(QPalette::All, QPalette::ButtonText, textColor);
- label.palette = pal;
- }
- label.rect = button.adjusted(style->xthickness, style->ythickness,
- -style->xthickness - popupArrowSize, -style->ythickness);
- proxy()->drawControl(CE_ToolButtonLabel, &label, painter, widget);
-
- if (toolbutton->subControls & SC_ToolButtonMenu) {
- tool.rect = menuarea;
- tool.state = mflags;
- if ((mflags & State_Enabled && (mflags & (State_Sunken | State_Raised | State_MouseOver))) || !(mflags & State_AutoRaise))
- proxy()->drawPrimitive(PE_IndicatorButtonDropDown, &tool, painter, widget);
-
- proxy()->drawPrimitive(PE_IndicatorArrowDown, &tool, painter, widget);
-
- } else if (drawMenuArrow) {
- QRect ir = toolbutton->rect;
- QStyleOptionToolButton newBtn = *toolbutton;
- newBtn.rect = QRect(ir.right() - popupArrowSize - style->xthickness - 3, ir.height()/2 - 1, popupArrowSize, popupArrowSize);
- proxy()->drawPrimitive(PE_IndicatorArrowDown, &newBtn, painter, widget);
- }
- }
- break;
-
-#endif // QT_NO_TOOLBUTTON
-#ifndef QT_NO_SCROLLBAR
-
- case CC_ScrollBar:
- if (const QStyleOptionSlider *scrollBar = qstyleoption_cast<const QStyleOptionSlider *>(option)) {
- GtkWidget *gtkHScrollBar = d->gtkWidget("GtkHScrollbar");
- GtkWidget *gtkVScrollBar = d->gtkWidget("GtkVScrollbar");
-
- // Fill background in case the scrollbar is partially transparent
- painter->fillRect(option->rect, option->palette.background());
-
- QRect rect = scrollBar->rect;
- QRect scrollBarSubLine = proxy()->subControlRect(control, scrollBar, SC_ScrollBarSubLine, widget);
- QRect scrollBarAddLine = proxy()->subControlRect(control, scrollBar, SC_ScrollBarAddLine, widget);
- QRect scrollBarSlider = proxy()->subControlRect(control, scrollBar, SC_ScrollBarSlider, widget);
- QRect grooveRect = proxy()->subControlRect(control, scrollBar, SC_ScrollBarGroove, widget);
- bool horizontal = scrollBar->orientation == Qt::Horizontal;
- GtkWidget * scrollbarWidget = horizontal ? gtkHScrollBar : gtkVScrollBar;
- style = d->gtk_widget_get_style(scrollbarWidget);
- gboolean trough_under_steppers = true;
- gboolean trough_side_details = false;
- gboolean activate_slider = false;
- gboolean stepper_size = 14;
- gint trough_border = 1;
- if (!d->gtk_check_version(2, 10, 0)) {
- d->gtk_widget_style_get((GtkWidget*)(scrollbarWidget),
- "trough-border", &trough_border,
- "trough-side-details", &trough_side_details,
- "trough-under-steppers", &trough_under_steppers,
- "activate-slider", &activate_slider,
- "stepper-size", &stepper_size, NULL);
- }
- if (trough_under_steppers) {
- scrollBarAddLine.adjust(trough_border, trough_border, -trough_border, -trough_border);
- scrollBarSubLine.adjust(trough_border, trough_border, -trough_border, -trough_border);
- scrollBarSlider.adjust(horizontal ? -trough_border : 0, horizontal ? 0 : -trough_border,
- horizontal ? trough_border : 0, horizontal ? 0 : trough_border);
- }
-
- // Some styles check the position of scrollbars in order to determine
- // if lines should be painted when the scrollbar is in max or min positions.
- int maximum = 2;
- int fakePos = 0;
- bool reverse = (option->direction == Qt::RightToLeft);
- if (scrollBar->minimum == scrollBar->maximum)
- maximum = 0;
- if (scrollBar->sliderPosition == scrollBar->maximum)
- fakePos = maximum;
- else if (scrollBar->sliderPosition > scrollBar->minimum)
- fakePos = maximum - 1;
-
-
- GtkRange *range = (GtkRange*)(horizontal ? gtkHScrollBar : gtkVScrollBar);
- GtkAdjustment *adjustment = 0;
-
- if (d->gtk_adjustment_configure)
- adjustment = d->gtk_range_get_adjustment(range);
- if (adjustment) {
- d->gtk_adjustment_configure(adjustment, fakePos, 0, maximum, 0, 0, 0);
- } else {
- adjustment = (GtkAdjustment*)d->gtk_adjustment_new(fakePos, 0, maximum, 0, 0, 0);
- d->gtk_range_set_adjustment(range, adjustment);
- }
-
- if (scrollBar->subControls & SC_ScrollBarGroove) {
- GtkStateType state = GTK_STATE_ACTIVE;
-
- if (!(option->state & State_Enabled))
- state = GTK_STATE_INSENSITIVE;
-
- if (trough_under_steppers)
- grooveRect = option->rect;
-
- gtkPainter->paintBox(scrollbarWidget, "trough", grooveRect, state, GTK_SHADOW_IN, style);
- }
-
- //paint slider
- if (scrollBar->subControls & SC_ScrollBarSlider) {
- GtkStateType state = GTK_STATE_NORMAL;
-
- if (!(option->state & State_Enabled))
- state = GTK_STATE_INSENSITIVE;
- else if (activate_slider &&
- option->state & State_Sunken && (scrollBar->activeSubControls & SC_ScrollBarSlider))
- state = GTK_STATE_ACTIVE;
- else if (option->state & State_MouseOver && (scrollBar->activeSubControls & SC_ScrollBarSlider))
- state = GTK_STATE_PRELIGHT;
-
- GtkShadowType shadow = GTK_SHADOW_OUT;
-
- if (trough_under_steppers) {
- if (!horizontal)
- scrollBarSlider.adjust(trough_border, 0, -trough_border, 0);
- else
- scrollBarSlider.adjust(0, trough_border, 0, -trough_border);
- }
-
- gtkPainter->paintSlider(scrollbarWidget, "slider", scrollBarSlider, state, shadow, style,
- horizontal ? GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL, QString(QLS("%0%1")).arg(fakePos).arg(maximum));
- }
-
- if (scrollBar->subControls & SC_ScrollBarAddLine) {
- GtkAllocation vAllocation;
- vAllocation.y = scrollBarAddLine.top();
- vAllocation.height = scrollBarAddLine.height() - rect.height() + 6;
- d->gtk_widget_set_allocation(gtkVScrollBar, &vAllocation);
-
- GtkAllocation hAllocation;
- hAllocation.x = scrollBarAddLine.right();
- hAllocation.width = scrollBarAddLine.width() - rect.width();
- d->gtk_widget_set_allocation(gtkHScrollBar, &hAllocation);
-
- GtkShadowType shadow = GTK_SHADOW_OUT;
- GtkStateType state = GTK_STATE_NORMAL;
-
- if (!(option->state & State_Enabled) || (fakePos == maximum))
- state = GTK_STATE_INSENSITIVE;
- else if (option->state & State_Sunken && (scrollBar->activeSubControls & SC_ScrollBarAddLine)) {
- state = GTK_STATE_ACTIVE;
- shadow = GTK_SHADOW_IN;
-
- } else if (option->state & State_MouseOver && (scrollBar->activeSubControls & SC_ScrollBarAddLine))
- state = GTK_STATE_PRELIGHT;
-
- gtkPainter->paintBox(scrollbarWidget,
- horizontal ? "hscrollbar" : "vscrollbar", scrollBarAddLine,
- state, shadow, style, QLS("add"));
-
- gtkPainter->paintArrow(scrollbarWidget, horizontal ? "hscrollbar" : "vscrollbar", scrollBarAddLine.adjusted(4, 4, -4, -4),
- horizontal ? (reverse ? GTK_ARROW_LEFT : GTK_ARROW_RIGHT) :
- GTK_ARROW_DOWN, state, GTK_SHADOW_NONE, false, style);
- }
-
- if (scrollBar->subControls & SC_ScrollBarSubLine) {
- GtkAllocation vAllocation;
- vAllocation.y = 0;
- vAllocation.height = scrollBarSubLine.height();
- d->gtk_widget_set_allocation(gtkVScrollBar, &vAllocation);
-
- GtkAllocation hAllocation;
- hAllocation.x = 0;
- hAllocation.width = scrollBarSubLine.width();
- d->gtk_widget_set_allocation(gtkHScrollBar, &hAllocation);
-
- GtkShadowType shadow = GTK_SHADOW_OUT;
- GtkStateType state = GTK_STATE_NORMAL;
-
- if (!(option->state & State_Enabled) || (fakePos == 0))
- state = GTK_STATE_INSENSITIVE;
- else if (option->state & State_Sunken && (scrollBar->activeSubControls & SC_ScrollBarSubLine)) {
- shadow = GTK_SHADOW_IN;
- state = GTK_STATE_ACTIVE;
-
- } else if (option->state & State_MouseOver && (scrollBar->activeSubControls & SC_ScrollBarSubLine))
- state = GTK_STATE_PRELIGHT;
-
- gtkPainter->paintBox(scrollbarWidget, horizontal ? "hscrollbar" : "vscrollbar", scrollBarSubLine,
- state, shadow, style, QLS("sub"));
-
- gtkPainter->paintArrow(scrollbarWidget, horizontal ? "hscrollbar" : "vscrollbar", scrollBarSubLine.adjusted(4, 4, -4, -4),
- horizontal ? (reverse ? GTK_ARROW_RIGHT : GTK_ARROW_LEFT) :
- GTK_ARROW_UP, state, GTK_SHADOW_NONE, false, style);
- }
- }
- break;
-
-#endif //QT_NO_SCROLLBAR
-#ifndef QT_NO_SPINBOX
-
- case CC_SpinBox:
- if (const QStyleOptionSpinBox *spinBox = qstyleoption_cast<const QStyleOptionSpinBox *>(option)) {
-
- GtkWidget *gtkSpinButton = spinBox->buttonSymbols == QAbstractSpinBox::NoButtons
- ? d->gtkWidget("GtkEntry")
- : d->gtkWidget("GtkSpinButton");
- bool isEnabled = (spinBox->state & State_Enabled);
- bool hover = isEnabled && (spinBox->state & State_MouseOver);
- bool sunken = (spinBox->state & State_Sunken);
- bool upIsActive = (spinBox->activeSubControls == SC_SpinBoxUp);
- bool downIsActive = (spinBox->activeSubControls == SC_SpinBoxDown);
- bool reverse = (spinBox->direction == Qt::RightToLeft);
-
- QRect editArea = option->rect;
- QRect editRect = proxy()->subControlRect(CC_SpinBox, option, SC_SpinBoxEditField, widget);
- QRect upRect, downRect, buttonRect;
- if (spinBox->buttonSymbols != QAbstractSpinBox::NoButtons) {
- upRect = proxy()->subControlRect(CC_SpinBox, option, SC_SpinBoxUp, widget);
- downRect = proxy()->subControlRect(CC_SpinBox, option, SC_SpinBoxDown, widget);
-
- //### Move this to subControlRect
- upRect.setTop(option->rect.top());
-
- if (reverse)
- upRect.setLeft(option->rect.left());
- else
- upRect.setRight(option->rect.right());
-
- downRect.setBottom(option->rect.bottom());
-
- if (reverse)
- downRect.setLeft(option->rect.left());
- else
- downRect.setRight(option->rect.right());
-
- buttonRect = upRect | downRect;
-
- if (reverse)
- editArea.setLeft(upRect.right());
- else
- editArea.setRight(upRect.left());
- }
- if (spinBox->frame) {
- GtkStateType state = qt_gtk_state(option);
-
- if (!(option->state & State_Enabled))
- state = GTK_STATE_INSENSITIVE;
- else if (option->state & State_HasFocus)
- state = GTK_STATE_NORMAL;
- else if (state == GTK_STATE_PRELIGHT)
- state = GTK_STATE_NORMAL;
-
- style = d->gtk_widget_get_style(gtkSpinButton);
-
-
- QString key;
-
- if (option->state & State_HasFocus) {
- key += QLatin1Char('f');
- QGtkStylePrivate::gtkWidgetSetFocus(gtkSpinButton, true);
- }
-
- uint resolve_mask = option->palette.resolve();
-
- if (resolve_mask & (1 << QPalette::Base)) // Palette overridden by user
- painter->fillRect(editRect, option->palette.base().color());
- else
- gtkPainter->paintFlatBox(gtkSpinButton, "entry_bg", editArea.adjusted(style->xthickness, style->ythickness,
- -style->xthickness, -style->ythickness),
- option->state & State_Enabled ?
- GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE, GTK_SHADOW_NONE, style, key);
-
- gtkPainter->paintShadow(gtkSpinButton, "entry", editArea, state, GTK_SHADOW_IN, d->gtk_widget_get_style(gtkSpinButton), key);
- if (spinBox->buttonSymbols != QAbstractSpinBox::NoButtons) {
- gtkPainter->paintBox(gtkSpinButton, "spinbutton", buttonRect, state, GTK_SHADOW_IN, style, key);
-
- upRect.setSize(downRect.size());
- if (!(option->state & State_Enabled))
- gtkPainter->paintBox(gtkSpinButton, "spinbutton_up", upRect, GTK_STATE_INSENSITIVE, GTK_SHADOW_IN, style, key);
- else if (upIsActive && sunken)
- gtkPainter->paintBox(gtkSpinButton, "spinbutton_up", upRect, GTK_STATE_ACTIVE, GTK_SHADOW_IN, style, key);
- else if (upIsActive && hover)
- gtkPainter->paintBox(gtkSpinButton, "spinbutton_up", upRect, GTK_STATE_PRELIGHT, GTK_SHADOW_OUT, style, key);
- else
- gtkPainter->paintBox(gtkSpinButton, "spinbutton_up", upRect, GTK_STATE_NORMAL, GTK_SHADOW_OUT, style, key);
-
- if (!(option->state & State_Enabled))
- gtkPainter->paintBox(gtkSpinButton, "spinbutton_down", downRect, GTK_STATE_INSENSITIVE, GTK_SHADOW_IN, style, key);
- else if (downIsActive && sunken)
- gtkPainter->paintBox(gtkSpinButton, "spinbutton_down", downRect, GTK_STATE_ACTIVE, GTK_SHADOW_IN, style, key);
- else if (downIsActive && hover)
- gtkPainter->paintBox(gtkSpinButton, "spinbutton_down", downRect, GTK_STATE_PRELIGHT, GTK_SHADOW_OUT, style, key);
- else
- gtkPainter->paintBox(gtkSpinButton, "spinbutton_down", downRect, GTK_STATE_NORMAL, GTK_SHADOW_OUT, style, key);
-
- if (option->state & State_HasFocus)
- QGtkStylePrivate::gtkWidgetSetFocus(gtkSpinButton, false);
- }
- }
-
- if (spinBox->buttonSymbols == QAbstractSpinBox::PlusMinus) {
- int centerX = upRect.center().x();
- int centerY = upRect.center().y();
- // plus/minus
-
- if (spinBox->activeSubControls == SC_SpinBoxUp && sunken) {
- painter->drawLine(1 + centerX - 2, 1 + centerY, 1 + centerX + 2, 1 + centerY);
- painter->drawLine(1 + centerX, 1 + centerY - 2, 1 + centerX, 1 + centerY + 2);
-
- } else {
- painter->drawLine(centerX - 2, centerY, centerX + 2, centerY);
- painter->drawLine(centerX, centerY - 2, centerX, centerY + 2);
- }
- centerX = downRect.center().x();
- centerY = downRect.center().y();
-
- if (spinBox->activeSubControls == SC_SpinBoxDown && sunken) {
- painter->drawLine(1 + centerX - 2, 1 + centerY, 1 + centerX + 2, 1 + centerY);
- } else {
- painter->drawLine(centerX - 2, centerY, centerX + 2, centerY);
- }
-
- } else if (spinBox->buttonSymbols == QAbstractSpinBox::UpDownArrows) {
- int size = d->getSpinboxArrowSize();
- int w = size / 2 - 1;
- w -= w % 2 - 1; // force odd
- int h = (w + 1)/2;
- QRect arrowRect(0, 0, w, h);
- arrowRect.moveCenter(upRect.center());
- // arrows
- GtkStateType state = GTK_STATE_NORMAL;
-
- if (!(option->state & State_Enabled) || !(spinBox->stepEnabled & QAbstractSpinBox::StepUpEnabled))
- state = GTK_STATE_INSENSITIVE;
-
- gtkPainter->paintArrow(gtkSpinButton, "spinbutton", arrowRect, GTK_ARROW_UP, state,
- GTK_SHADOW_NONE, false, style);
-
- arrowRect.moveCenter(downRect.center());
-
- if (!(option->state & State_Enabled) || !(spinBox->stepEnabled & QAbstractSpinBox::StepDownEnabled))
- state = GTK_STATE_INSENSITIVE;
-
- gtkPainter->paintArrow(gtkSpinButton, "spinbutton", arrowRect, GTK_ARROW_DOWN, state,
- GTK_SHADOW_NONE, false, style);
- }
- }
- break;
-
-#endif // QT_NO_SPINBOX
-
-#ifndef QT_NO_SLIDER
-
- case CC_Slider:
- if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option)) {
- GtkWidget *hScaleWidget = d->gtkWidget("GtkHScale");
- GtkWidget *vScaleWidget = d->gtkWidget("GtkVScale");
-
- QRect groove = proxy()->subControlRect(CC_Slider, option, SC_SliderGroove, widget);
- QRect handle = proxy()->subControlRect(CC_Slider, option, SC_SliderHandle, widget);
-
- bool horizontal = slider->orientation == Qt::Horizontal;
- bool ticksAbove = slider->tickPosition & QSlider::TicksAbove;
- bool ticksBelow = slider->tickPosition & QSlider::TicksBelow;
-
- QBrush oldBrush = painter->brush();
- QPen oldPen = painter->pen();
-
- QColor shadowAlpha(Qt::black);
- shadowAlpha.setAlpha(10);
- QColor highlightAlpha(Qt::white);
- highlightAlpha.setAlpha(80);
-
- QGtkStylePrivate::gtk_widget_set_direction(hScaleWidget, slider->upsideDown ?
- GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR);
- GtkWidget *scaleWidget = horizontal ? hScaleWidget : vScaleWidget;
- style = d->gtk_widget_get_style(scaleWidget);
-
- if ((option->subControls & SC_SliderGroove) && groove.isValid()) {
-
- GtkRange *range = (GtkRange*)scaleWidget;
- GtkAdjustment *adjustment = 0;
- if (d->gtk_adjustment_configure)
- adjustment = d->gtk_range_get_adjustment(range);
- if (adjustment) {
- d->gtk_adjustment_configure(adjustment,
- slider->sliderPosition,
- slider->minimum,
- slider->maximum,
- slider->singleStep,
- slider->singleStep,
- slider->pageStep);
- } else {
- adjustment = (GtkAdjustment*)d->gtk_adjustment_new(slider->sliderPosition,
- slider->minimum,
- slider->maximum,
- slider->singleStep,
- slider->singleStep,
- slider->pageStep);
- d->gtk_range_set_adjustment(range, adjustment);
- }
-
- int outerSize;
- d->gtk_range_set_inverted(range, !horizontal);
- d->gtk_widget_style_get(scaleWidget, "trough-border", &outerSize, NULL);
- outerSize++;
-
- GtkStateType state = qt_gtk_state(option);
- int focusFrameMargin = 2;
- QRect grooveRect = option->rect.adjusted(focusFrameMargin, outerSize + focusFrameMargin,
- -focusFrameMargin, -outerSize - focusFrameMargin);
-
- gboolean trough_side_details = false; // Indicates if the upper or lower scale background differs
- if (!d->gtk_check_version(2, 10, 0))
- d->gtk_widget_style_get((GtkWidget*)(scaleWidget), "trough-side-details", &trough_side_details, NULL);
-
- if (!trough_side_details) {
- gtkPainter->paintBox(scaleWidget, "trough", grooveRect, state,
- GTK_SHADOW_IN, style, QString(QLS("p%0")).arg(slider->sliderPosition));
- } else {
- QRect upperGroove = grooveRect;
- QRect lowerGroove = grooveRect;
-
- if (horizontal) {
- if (slider->upsideDown) {
- lowerGroove.setLeft(handle.center().x());
- upperGroove.setRight(handle.center().x());
- } else {
- upperGroove.setLeft(handle.center().x());
- lowerGroove.setRight(handle.center().x());
- }
- } else {
- if (!slider->upsideDown) {
- lowerGroove.setBottom(handle.center().y());
- upperGroove.setTop(handle.center().y());
- } else {
- upperGroove.setBottom(handle.center().y());
- lowerGroove.setTop(handle.center().y());
- }
- }
-
- gtkPainter->paintBox(scaleWidget, "trough-upper", upperGroove, state,
- GTK_SHADOW_IN, style, QString(QLS("p%0")).arg(slider->sliderPosition));
- gtkPainter->paintBox(scaleWidget, "trough-lower", lowerGroove, state,
- GTK_SHADOW_IN, style, QString(QLS("p%0")).arg(slider->sliderPosition));
- }
- }
-
- if (option->subControls & SC_SliderTickmarks) {
- painter->setPen(darkOutline);
- int tickSize = proxy()->pixelMetric(PM_SliderTickmarkOffset, option, widget);
- int available = proxy()->pixelMetric(PM_SliderSpaceAvailable, slider, widget);
- int interval = slider->tickInterval;
-
- if (interval <= 0) {
- interval = slider->singleStep;
-
- if (QStyle::sliderPositionFromValue(slider->minimum, slider->maximum, interval,
- available)
- - QStyle::sliderPositionFromValue(slider->minimum, slider->maximum,
- 0, available) < 3)
- interval = slider->pageStep;
- }
-
- if (interval <= 0)
- interval = 1;
-
- int v = slider->minimum;
- int len = proxy()->pixelMetric(PM_SliderLength, slider, widget);
- while (v <= slider->maximum + 1) {
- if (v == slider->maximum + 1 && interval == 1)
- break;
- const int v_ = qMin(v, slider->maximum);
- int pos = sliderPositionFromValue(slider->minimum, slider->maximum,
- v_, (horizontal
- ? slider->rect.width()
- : slider->rect.height()) - len,
- slider->upsideDown) + len / 2;
- int extra = 2 - ((v_ == slider->minimum || v_ == slider->maximum) ? 1 : 0);
- if (horizontal) {
- if (ticksAbove)
- painter->drawLine(pos, slider->rect.top() + extra,
- pos, slider->rect.top() + tickSize);
- if (ticksBelow)
- painter->drawLine(pos, slider->rect.bottom() - extra,
- pos, slider->rect.bottom() - tickSize);
-
- } else {
- if (ticksAbove)
- painter->drawLine(slider->rect.left() + extra, pos,
- slider->rect.left() + tickSize, pos);
- if (ticksBelow)
- painter->drawLine(slider->rect.right() - extra, pos,
- slider->rect.right() - tickSize, pos);
- }
-
- // In the case where maximum is max int
- int nextInterval = v + interval;
- if (nextInterval < v)
- break;
- v = nextInterval;
- }
- }
-
- // Draw slider handle
- if (option->subControls & SC_SliderHandle) {
- GtkShadowType shadow = GTK_SHADOW_OUT;
- GtkStateType state = GTK_STATE_NORMAL;
-
- if (!(option->state & State_Enabled))
- state = GTK_STATE_INSENSITIVE;
- else if (option->state & State_MouseOver && option->activeSubControls & SC_SliderHandle)
- state = GTK_STATE_PRELIGHT;
-
- bool horizontal = option->state & State_Horizontal;
-
- if (slider->state & State_HasFocus) {
- QStyleOptionFocusRect fropt;
- fropt.QStyleOption::operator=(*slider);
- fropt.rect = slider->rect.adjusted(-1, -1 ,1, 1);
-
- if (horizontal) {
- fropt.rect.setTop(handle.top() - 3);
- fropt.rect.setBottom(handle.bottom() + 4);
-
- } else {
- fropt.rect.setLeft(handle.left() - 3);
- fropt.rect.setRight(handle.right() + 3);
- }
- proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, painter, widget);
- }
- gtkPainter->paintSlider(scaleWidget, horizontal ? "hscale" : "vscale", handle, state, shadow, style,
- horizontal ? GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL);
- }
- painter->setBrush(oldBrush);
- painter->setPen(oldPen);
- }
- break;
- case CC_Dial:
- if (const QStyleOptionSlider *dial = qstyleoption_cast<const QStyleOptionSlider *>(option))
- QStyleHelper::drawDial(dial, painter);
- break;
-
-#endif // QT_NO_SLIDER
-
- default:
- QCommonStyle::drawComplexControl(control, option, painter, widget);
-
- break;
- }
-}
-
-
-/*!
- \reimp
-*/
-void QGtkStyle::drawControl(ControlElement element,
- const QStyleOption *option,
- QPainter *painter,
- const QWidget *widget) const
-{
- Q_D(const QGtkStyle);
-
- if (!d->isThemeAvailable()) {
- QCommonStyle::drawControl(element, option, painter, widget);
- return;
- }
-
- GtkStyle* style = d->gtkStyle();
- QGtkPainter* gtkPainter = d->gtkPainter(painter);
-
- switch (element) {
- case CE_ProgressBarLabel:
- if (const QStyleOptionProgressBar *bar = qstyleoption_cast<const QStyleOptionProgressBar *>(option)) {
- GtkWidget *gtkProgressBar = d->gtkWidget("GtkProgressBar");
- if (!gtkProgressBar)
- return;
-
- QRect leftRect;
- QRect rect = bar->rect;
- GtkStyle *gtkProgressBarStyle = d->gtk_widget_get_style(gtkProgressBar);
- GdkColor gdkText = gtkProgressBarStyle->fg[GTK_STATE_NORMAL];
- QColor textColor = QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
- gdkText = gtkProgressBarStyle->fg[GTK_STATE_PRELIGHT];
- QColor alternateTextColor= QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
-
- painter->save();
- bool vertical = false, inverted = false;
- if (const QStyleOptionProgressBarV2 *bar2 = qstyleoption_cast<const QStyleOptionProgressBarV2 *>(option)) {
- vertical = (bar2->orientation == Qt::Vertical);
- inverted = bar2->invertedAppearance;
- }
- if (vertical)
- rect = QRect(rect.left(), rect.top(), rect.height(), rect.width()); // flip width and height
- const int progressIndicatorPos = (bar->progress - qreal(bar->minimum)) * rect.width() /
- qMax(qreal(1.0), qreal(bar->maximum) - bar->minimum);
- if (progressIndicatorPos >= 0 && progressIndicatorPos <= rect.width())
- leftRect = QRect(rect.left(), rect.top(), progressIndicatorPos, rect.height());
- if (vertical)
- leftRect.translate(rect.width() - progressIndicatorPos, 0);
-
- bool flip = (!vertical && (((bar->direction == Qt::RightToLeft) && !inverted) ||
- ((bar->direction == Qt::LeftToRight) && inverted)));
-
- QRegion rightRect = rect;
- rightRect = rightRect.subtracted(leftRect);
- painter->setClipRegion(rightRect);
- painter->setPen(flip ? alternateTextColor : textColor);
- painter->drawText(rect, bar->text, QTextOption(Qt::AlignAbsolute | Qt::AlignHCenter | Qt::AlignVCenter));
- if (!leftRect.isNull()) {
- painter->setPen(flip ? textColor : alternateTextColor);
- painter->setClipRect(leftRect);
- painter->drawText(rect, bar->text, QTextOption(Qt::AlignAbsolute | Qt::AlignHCenter | Qt::AlignVCenter));
- }
- painter->restore();
- }
- break;
- case CE_PushButtonLabel:
- if (const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton *>(option)) {
- QRect ir = button->rect;
- uint tf = Qt::AlignVCenter | Qt::TextShowMnemonic;
- QPoint buttonShift;
-
- if (option->state & State_Sunken)
- buttonShift = QPoint(pixelMetric(PM_ButtonShiftHorizontal, option, widget),
- proxy()->pixelMetric(PM_ButtonShiftVertical, option, widget));
-
- if (proxy()->styleHint(SH_UnderlineShortcut, button, widget))
- tf |= Qt::TextShowMnemonic;
- else
- tf |= Qt::TextHideMnemonic;
-
- if (!button->icon.isNull()) {
- //Center both icon and text
- QPoint point;
-
- QIcon::Mode mode = button->state & State_Enabled ? QIcon::Normal : QIcon::Disabled;
- if (mode == QIcon::Normal && button->state & State_HasFocus)
- mode = QIcon::Active;
-
- QIcon::State state = QIcon::Off;
-
- if (button->state & State_On)
- state = QIcon::On;
-
- QPixmap pixmap = button->icon.pixmap(button->iconSize, mode, state);
- int w = pixmap.width();
- int h = pixmap.height();
-
- if (!button->text.isEmpty())
- w += button->fontMetrics.boundingRect(option->rect, tf, button->text).width() + 4;
-
- point = QPoint(ir.x() + ir.width() / 2 - w / 2,
- ir.y() + ir.height() / 2 - h / 2);
-
- if (button->direction == Qt::RightToLeft)
- point.rx() += pixmap.width();
-
- painter->drawPixmap(visualPos(button->direction, button->rect, point + buttonShift), pixmap);
-
- if (button->direction == Qt::RightToLeft)
- ir.translate(-point.x() - 2, 0);
- else
- ir.translate(point.x() + pixmap.width() + 2, 0);
-
- // left-align text if there is
- if (!button->text.isEmpty())
- tf |= Qt::AlignLeft;
-
- } else {
- tf |= Qt::AlignHCenter;
- }
-
- ir.translate(buttonShift);
-
- if (button->features & QStyleOptionButton::HasMenu)
- ir = ir.adjusted(0, 0, -pixelMetric(PM_MenuButtonIndicator, button, widget), 0);
-
- GtkWidget *gtkButton = d->gtkWidget("GtkButton");
- QPalette pal = button->palette;
- int labelState = GTK_STATE_INSENSITIVE;
- if (option->state & State_Enabled)
- labelState = (option->state & State_MouseOver && !(option->state & State_Sunken)) ?
- GTK_STATE_PRELIGHT : GTK_STATE_NORMAL;
-
- GdkColor gdkText = d->gtk_widget_get_style(gtkButton)->fg[labelState];
- QColor textColor = QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
- pal.setBrush(QPalette::ButtonText, textColor);
- proxy()->drawItemText(painter, ir, tf, pal, (button->state & State_Enabled),
- button->text, QPalette::ButtonText);
- }
- break;
-
- case CE_RadioButton: // Fall through
- case CE_CheckBox:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(option)) {
- bool isRadio = (element == CE_RadioButton);
-
- // Draw prelight background
- GtkWidget *gtkRadioButton = d->gtkWidget("GtkRadioButton");
-
- if (option->state & State_MouseOver) {
- gtkPainter->paintFlatBox(gtkRadioButton, "checkbutton", option->rect,
- GTK_STATE_PRELIGHT, GTK_SHADOW_ETCHED_OUT, d->gtk_widget_get_style(gtkRadioButton));
- }
-
- QStyleOptionButton subopt = *btn;
- subopt.rect = subElementRect(isRadio ? SE_RadioButtonIndicator
- : SE_CheckBoxIndicator, btn, widget);
- proxy()->drawPrimitive(isRadio ? PE_IndicatorRadioButton : PE_IndicatorCheckBox,
- &subopt, painter, widget);
- subopt.rect = subElementRect(isRadio ? SE_RadioButtonContents
- : SE_CheckBoxContents, btn, widget);
- // Get label text color
- QPalette pal = subopt.palette;
- int labelState = GTK_STATE_INSENSITIVE;
- if (option->state & State_Enabled)
- labelState = (option->state & State_MouseOver) ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL;
-
- GdkColor gdkText = d->gtk_widget_get_style(gtkRadioButton)->fg[labelState];
- QColor textColor = QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
- pal.setBrush(QPalette::WindowText, textColor);
- subopt.palette = pal;
- proxy()->drawControl(isRadio ? CE_RadioButtonLabel : CE_CheckBoxLabel, &subopt, painter, widget);
-
- if (btn->state & State_HasFocus) {
- QStyleOptionFocusRect fropt;
- fropt.QStyleOption::operator=(*btn);
- fropt.rect = subElementRect(isRadio ? SE_RadioButtonFocusRect
- : SE_CheckBoxFocusRect, btn, widget);
- proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, painter, widget);
- }
- }
- break;
-
-#ifndef QT_NO_COMBOBOX
-
- case CE_ComboBoxLabel:
- if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
- QRect editRect = proxy()->subControlRect(CC_ComboBox, cb, SC_ComboBoxEditField, widget);
- bool appearsAsList = !proxy()->styleHint(QStyle::SH_ComboBox_Popup, cb, widget);
- painter->save();
- painter->setClipRect(editRect);
-
- if (!cb->currentIcon.isNull()) {
- QIcon::Mode mode = cb->state & State_Enabled ? QIcon::Normal
- : QIcon::Disabled;
- QPixmap pixmap = cb->currentIcon.pixmap(cb->iconSize, mode);
- QRect iconRect(editRect);
- iconRect.setWidth(cb->iconSize.width() + 4);
-
- iconRect = alignedRect(cb->direction,
- Qt::AlignLeft | Qt::AlignVCenter,
- iconRect.size(), editRect);
-
- if (cb->editable)
- painter->fillRect(iconRect, option->palette.brush(QPalette::Base));
-
- proxy()->drawItemPixmap(painter, iconRect, Qt::AlignCenter, pixmap);
-
- if (cb->direction == Qt::RightToLeft)
- editRect.translate(-4 - cb->iconSize.width(), 0);
- else
- editRect.translate(cb->iconSize.width() + 4, 0);
- }
-
- if (!cb->currentText.isEmpty() && !cb->editable) {
- GtkWidget *gtkCombo = d->gtkWidget("GtkComboBox");
- QPalette pal = cb->palette;
- int labelState = GTK_STATE_INSENSITIVE;
-
- if (option->state & State_Enabled)
- labelState = (option->state & State_MouseOver && !appearsAsList) ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL;
-
- GdkColor gdkText = d->gtk_widget_get_style(gtkCombo)->fg[labelState];
-
- QColor textColor = QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
-
- pal.setBrush(QPalette::ButtonText, textColor);
-
- proxy()->drawItemText(painter, editRect.adjusted(1, 0, -1, 0),
- visualAlignment(cb->direction, Qt::AlignLeft | Qt::AlignVCenter),
- pal, cb->state & State_Enabled, cb->currentText, QPalette::ButtonText);
- }
-
- painter->restore();
- }
- break;
-
-#endif // QT_NO_COMBOBOX
-
- case CE_DockWidgetTitle:
- painter->save();
- if (const QStyleOptionDockWidget *dwOpt = qstyleoption_cast<const QStyleOptionDockWidget *>(option)) {
- const QStyleOptionDockWidgetV2 *v2
- = qstyleoption_cast<const QStyleOptionDockWidgetV2*>(dwOpt);
- bool verticalTitleBar = v2 == 0 ? false : v2->verticalTitleBar;
-
- QRect rect = dwOpt->rect;
- QRect titleRect = subElementRect(SE_DockWidgetTitleBarText, option, widget).adjusted(-2, 0, -2, 0);
- QRect r = rect.adjusted(0, 0, -1, -1);
- if (verticalTitleBar)
- r.adjust(0, 0, 0, -1);
-
- if (verticalTitleBar) {
- QRect r = rect;
- r.setSize(r.size().transposed());
-
- titleRect = QRect(r.left() + rect.bottom()
- - titleRect.bottom(),
- r.top() + titleRect.left() - rect.left(),
- titleRect.height(), titleRect.width());
-
- painter->translate(r.left(), r.top() + r.width());
- painter->rotate(-90);
- painter->translate(-r.left(), -r.top());
-
- rect = r;
- }
-
- if (!dwOpt->title.isEmpty()) {
- QString titleText
- = painter->fontMetrics().elidedText(dwOpt->title,
- Qt::ElideRight, titleRect.width());
- proxy()->drawItemText(painter,
- titleRect,
- Qt::AlignLeft | Qt::AlignVCenter | Qt::TextShowMnemonic, dwOpt->palette,
- dwOpt->state & State_Enabled, titleText,
- QPalette::WindowText);
- }
- }
- painter->restore();
- break;
-
-
-
- case CE_HeaderSection:
- painter->save();
-
- // Draws the header in tables.
- if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(option)) {
- Q_UNUSED(header);
- GtkWidget *gtkTreeView = d->gtkWidget("GtkTreeView");
- // Get the middle column
- GtkTreeViewColumn *column = d->gtk_tree_view_get_column((GtkTreeView*)gtkTreeView, 1);
- Q_ASSERT(column);
-
- GtkWidget *gtkTreeHeader = column->button;
- GtkStateType state = qt_gtk_state(option);
- GtkShadowType shadow = GTK_SHADOW_OUT;
-
- if (option->state & State_Sunken)
- shadow = GTK_SHADOW_IN;
-
- gtkPainter->paintBox(gtkTreeHeader, "button", option->rect.adjusted(-1, 0, 0, 0), state, shadow, d->gtk_widget_get_style(gtkTreeHeader));
- }
-
- painter->restore();
- break;
-
-#ifndef QT_NO_SIZEGRIP
-
- case CE_SizeGrip: {
- GtkWidget *gtkStatusbar = d->gtkWidget("GtkStatusbar.GtkFrame");
- GtkStyle *gtkStatusbarStyle = d->gtk_widget_get_style(gtkStatusbar);
- QRect gripRect = option->rect.adjusted(0, 0, -gtkStatusbarStyle->xthickness, -gtkStatusbarStyle->ythickness);
- gtkPainter->paintResizeGrip(gtkStatusbar, "statusbar", gripRect, GTK_STATE_NORMAL,
- GTK_SHADOW_OUT, option->direction == Qt::RightToLeft ?
- GDK_WINDOW_EDGE_SOUTH_WEST : GDK_WINDOW_EDGE_SOUTH_EAST,
- gtkStatusbarStyle);
- }
- break;
-
-#endif // QT_NO_SIZEGRIP
-
- case CE_MenuBarEmptyArea: {
- GtkWidget *gtkMenubar = d->gtkWidget("GtkMenuBar");
- GdkColor gdkBg = d->gtk_widget_get_style(gtkMenubar)->bg[GTK_STATE_NORMAL]; // Theme can depend on transparency
- painter->fillRect(option->rect, QColor(gdkBg.red>>8, gdkBg.green>>8, gdkBg.blue>>8));
- if (widget) { // See CE_MenuBarItem
- QRect menuBarRect = widget->rect();
- QPixmap pixmap(menuBarRect.size());
- pixmap.fill(Qt::transparent);
- QPainter pmPainter(&pixmap);
- gtkPainter->reset(&pmPainter);
- GtkShadowType shadow_type;
- d->gtk_widget_style_get(gtkMenubar, "shadow-type", &shadow_type, NULL);
- gtkPainter->paintBox(gtkMenubar, "menubar", menuBarRect,
- GTK_STATE_NORMAL, shadow_type, d->gtk_widget_get_style(gtkMenubar));
- pmPainter.end();
- painter->drawPixmap(option->rect, pixmap, option->rect);
- gtkPainter->reset(painter);
- }
- }
- break;
-
- case CE_MenuBarItem:
- painter->save();
-
- if (const QStyleOptionMenuItem *mbi = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) {
- GtkWidget *gtkMenubarItem = d->gtkWidget("GtkMenuBar.GtkMenuItem");
- GtkWidget *gtkMenubar = d->gtkWidget("GtkMenuBar");
-
- style = d->gtk_widget_get_style(gtkMenubarItem);
-
- if (widget) {
- // Since Qt does not currently allow filling the entire background
- // we use a hack for this by making a complete menubar each time and
- // paint with the correct offset inside it. Pixmap caching should resolve
- // most of the performance penalty.
- QRect menuBarRect = widget->rect();
- QPixmap pixmap(menuBarRect.size());
- pixmap.fill(Qt::transparent);
- QPainter pmPainter(&pixmap);
- gtkPainter->reset(&pmPainter);
- GtkShadowType shadow_type;
- d->gtk_widget_style_get(gtkMenubar, "shadow-type", &shadow_type, NULL);
- GdkColor gdkBg = d->gtk_widget_get_style(gtkMenubar)->bg[GTK_STATE_NORMAL]; // Theme can depend on transparency
- painter->fillRect(option->rect, QColor(gdkBg.red>>8, gdkBg.green>>8, gdkBg.blue>>8));
- gtkPainter->paintBox(gtkMenubar, "menubar", menuBarRect,
- GTK_STATE_NORMAL, shadow_type, d->gtk_widget_get_style(gtkMenubar));
- pmPainter.end();
- painter->drawPixmap(option->rect, pixmap, option->rect);
- gtkPainter->reset(painter);
- }
-
- QStyleOptionMenuItem item = *mbi;
- bool act = mbi->state & State_Selected && mbi->state & State_Sunken;
- bool dis = !(mbi->state & State_Enabled);
- item.rect = mbi->rect;
- GdkColor gdkText = style->fg[dis ? GTK_STATE_INSENSITIVE : GTK_STATE_NORMAL];
- GdkColor gdkHText = style->fg[GTK_STATE_PRELIGHT];
- QColor normalTextColor = QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
- QColor highlightedTextColor = QColor(gdkHText.red>>8, gdkHText.green>>8, gdkHText.blue>>8);
- item.palette.setBrush(QPalette::HighlightedText, highlightedTextColor);
- item.palette.setBrush(QPalette::Text, normalTextColor);
- item.palette.setBrush(QPalette::ButtonText, normalTextColor);
- QCommonStyle::drawControl(element, &item, painter, widget);
-
- if (act) {
- GtkShadowType shadowType = GTK_SHADOW_NONE;
- d->gtk_widget_style_get (gtkMenubarItem, "selected-shadow-type", &shadowType, NULL);
- gtkPainter->paintBox(gtkMenubarItem, "menuitem", option->rect.adjusted(0, 0, 0, 3),
- GTK_STATE_PRELIGHT, shadowType, style);
- //draw text
- QPalette::ColorRole textRole = dis ? QPalette::Text : QPalette::HighlightedText;
- uint alignment = Qt::AlignCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine;
-
- if (!proxy()->styleHint(SH_UnderlineShortcut, mbi, widget))
- alignment |= Qt::TextHideMnemonic;
-
- proxy()->drawItemText(painter, item.rect, alignment, item.palette, mbi->state & State_Enabled, mbi->text, textRole);
- }
- }
- painter->restore();
- break;
-
- case CE_Splitter: {
- GtkWidget *gtkWindow = d->gtkWidget("GtkWindow"); // The Murrine Engine currently assumes a widget is passed
- gtkPainter->paintHandle(gtkWindow, "splitter", option->rect, qt_gtk_state(option), GTK_SHADOW_NONE,
- !(option->state & State_Horizontal) ? GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL,
- style);
- }
- break;
-
-#ifndef QT_NO_TOOLBAR
-
- case CE_ToolBar:
- if (const QStyleOptionToolBar *toolbar = qstyleoption_cast<const QStyleOptionToolBar *>(option)) {
- // Reserve the beveled appearance only for mainwindow toolbars
- if (!(widget && qobject_cast<const QMainWindow*> (widget->parentWidget())))
- break;
-
- QRect rect = option->rect;
- // There is a 1 pixel gap between toolbar lines in some styles (i.e Human)
- if (toolbar->positionWithinLine != QStyleOptionToolBar::End)
- rect.adjust(0, 0, 1, 0);
-
- GtkWidget *gtkToolbar = d->gtkWidget("GtkToolbar");
- GtkShadowType shadow_type = GTK_SHADOW_NONE;
- d->gtk_widget_style_get(gtkToolbar, "shadow-type", &shadow_type, NULL);
- gtkPainter->paintBox(gtkToolbar, "toolbar", rect,
- GTK_STATE_NORMAL, shadow_type, d->gtk_widget_get_style(gtkToolbar));
- }
- break;
-
-#endif // QT_NO_TOOLBAR
-
- case CE_MenuItem:
- painter->save();
-
- // Draws one item in a popup menu.
- if (const QStyleOptionMenuItem *menuItem = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) {
- const int windowsItemHMargin = 3; // menu item hor text margin
- const int windowsItemVMargin = 26; // menu item ver text margin
- GtkWidget *gtkMenuItem = menuItem->checked ? d->gtkWidget("GtkMenu.GtkCheckMenuItem") :
- d->gtkWidget("GtkMenu.GtkMenuItem");
-
- style = d->gtk_widget_get_style(gtkMenuItem);
- QColor shadow = option->palette.dark().color();
-
- if (menuItem->menuItemType == QStyleOptionMenuItem::Separator) {
- GtkWidget *gtkMenuSeparator = d->gtkWidget("GtkMenu.GtkSeparatorMenuItem");
- painter->setPen(shadow.lighter(106));
- gboolean wide_separators = 0;
- gint separator_height = 0;
- guint horizontal_padding = 3;
- QRect separatorRect = option->rect;
- if (!d->gtk_check_version(2, 10, 0)) {
- d->gtk_widget_style_get(gtkMenuSeparator,
- "wide-separators", &wide_separators,
- "separator-height", &separator_height,
- "horizontal-padding", &horizontal_padding,
- NULL);
- }
- GtkStyle *gtkMenuSeparatorStyle = d->gtk_widget_get_style(gtkMenuSeparator);
- separatorRect.setHeight(option->rect.height() - 2 * gtkMenuSeparatorStyle->ythickness);
- separatorRect.setWidth(option->rect.width() - 2 * (horizontal_padding + gtkMenuSeparatorStyle->xthickness));
- separatorRect.moveCenter(option->rect.center());
- if (wide_separators)
- gtkPainter->paintBox(gtkMenuSeparator, "hseparator",
- separatorRect, GTK_STATE_NORMAL, GTK_SHADOW_NONE, gtkMenuSeparatorStyle);
- else
- gtkPainter->paintHline(gtkMenuSeparator, "hseparator",
- separatorRect, GTK_STATE_NORMAL, gtkMenuSeparatorStyle,
- 0, option->rect.right() - 1, 1);
- painter->restore();
- break;
- }
-
- bool selected = menuItem->state & State_Selected && menuItem->state & State_Enabled;
-
- if (selected) {
- QRect rect = option->rect;
-#ifndef QT_NO_COMBOBOX
- if (qobject_cast<const QComboBox*>(widget))
- rect = option->rect;
-#endif
- gtkPainter->paintBox(gtkMenuItem, "menuitem", rect, GTK_STATE_PRELIGHT, GTK_SHADOW_OUT, style);
- }
-
- bool checkable = menuItem->checkType != QStyleOptionMenuItem::NotCheckable;
- bool checked = menuItem->checked;
- bool enabled = menuItem->state & State_Enabled;
- bool ignoreCheckMark = false;
-
- gint checkSize;
- d->gtk_widget_style_get(d->gtkWidget("GtkMenu.GtkCheckMenuItem"), "indicator-size", &checkSize, NULL);
-
- int checkcol = qMax(menuItem->maxIconWidth, qMax(20, checkSize));
-
-#ifndef QT_NO_COMBOBOX
-
- if (qobject_cast<const QComboBox*>(widget) ||
- (option->styleObject && option->styleObject->property("_q_isComboBoxPopupItem").toBool()))
- ignoreCheckMark = true; // Ignore the checkmarks provided by the QComboMenuDelegate
-
-#endif
- if (!ignoreCheckMark) {
- // Check
- QRect checkRect(option->rect.left() + 7, option->rect.center().y() - checkSize/2 + 1, checkSize, checkSize);
- checkRect = visualRect(menuItem->direction, menuItem->rect, checkRect);
-
- if (checkable && menuItem->icon.isNull()) {
- // Some themes such as aero-clone draw slightly outside the paint rect
- int spacing = 1; // ### Consider using gtkCheckBox : "indicator-spacing" instead
-
- if (menuItem->checkType & QStyleOptionMenuItem::Exclusive) {
- // Radio button
- GtkShadowType shadow = GTK_SHADOW_OUT;
- GtkStateType state = qt_gtk_state(option);
-
- if (selected)
- state = GTK_STATE_PRELIGHT;
- if (checked)
- shadow = GTK_SHADOW_IN;
-
- gtkPainter->setClipRect(checkRect.adjusted(-spacing, -spacing, spacing, spacing));
- gtkPainter->paintOption(gtkMenuItem, checkRect.translated(-spacing, -spacing), state, shadow,
- style, QLS("option"));
- gtkPainter->setClipRect(QRect());
-
- } else {
- // Check box
- if (menuItem->icon.isNull()) {
- GtkShadowType shadow = GTK_SHADOW_OUT;
- GtkStateType state = qt_gtk_state(option);
-
- if (selected)
- state = GTK_STATE_PRELIGHT;
- if (checked)
- shadow = GTK_SHADOW_IN;
-
- gtkPainter->setClipRect(checkRect.adjusted(-spacing, -spacing, -spacing, -spacing));
- gtkPainter->paintCheckbox(gtkMenuItem, checkRect.translated(-spacing, -spacing), state, shadow,
- style, QLS("check"));
- gtkPainter->setClipRect(QRect());
- }
- }
- }
-
- } else {
- // Ignore checkmark
- if (menuItem->icon.isNull())
- checkcol = 0;
- else
- checkcol = menuItem->maxIconWidth;
- }
-
- bool dis = !(menuItem->state & State_Enabled);
- bool act = menuItem->state & State_Selected;
- const QStyleOption *opt = option;
- const QStyleOptionMenuItem *menuitem = menuItem;
- QPainter *p = painter;
- QRect vCheckRect = visualRect(opt->direction, menuitem->rect,
- QRect(menuitem->rect.x() + 3, menuitem->rect.y(),
- checkcol, menuitem->rect.height()));
-
- if (!menuItem->icon.isNull()) {
- QIcon::Mode mode = dis ? QIcon::Disabled : QIcon::Normal;
-
- if (act && !dis)
- mode = QIcon::Active;
-
- QPixmap pixmap;
- int smallIconSize = proxy()->pixelMetric(PM_SmallIconSize, option, widget);
- QSize iconSize(smallIconSize, smallIconSize);
-
-#ifndef QT_NO_COMBOBOX
- if (const QComboBox *combo = qobject_cast<const QComboBox*>(widget))
- iconSize = combo->iconSize();
-
-#endif // QT_NO_COMBOBOX
- if (checked)
- pixmap = menuItem->icon.pixmap(iconSize, mode, QIcon::On);
- else
- pixmap = menuItem->icon.pixmap(iconSize, mode);
-
- const int pixw = pixmap.width() / pixmap.devicePixelRatio();
- const int pixh = pixmap.height() / pixmap.devicePixelRatio();
- QRect pmr(0, 0, pixw, pixh);
- pmr.moveCenter(vCheckRect.center() - QPoint(0, 1));
- painter->setPen(menuItem->palette.text().color());
- if (!ignoreCheckMark && checkable && checked) {
- QStyleOption opt = *option;
-
- if (act) {
- QColor activeColor = mergedColors(option->palette.background().color(),
- option->palette.highlight().color());
- opt.palette.setBrush(QPalette::Button, activeColor);
- }
- opt.state |= State_Sunken;
- opt.rect = vCheckRect;
- proxy()->drawPrimitive(PE_PanelButtonCommand, &opt, painter, widget);
- }
- painter->drawPixmap(pmr.topLeft(), pixmap);
- }
-
- GdkColor gdkText = style->fg[GTK_STATE_NORMAL];
- GdkColor gdkDText = style->fg[GTK_STATE_INSENSITIVE];
- GdkColor gdkHText = style->fg[GTK_STATE_PRELIGHT];
- uint resolve_mask = option->palette.resolve();
- QColor textColor = QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
- QColor disabledTextColor = QColor(gdkDText.red>>8, gdkDText.green>>8, gdkDText.blue>>8);
- if (resolve_mask & (1 << QPalette::ButtonText)) {
- textColor = option->palette.buttonText().color();
- disabledTextColor = option->palette.brush(QPalette::Disabled, QPalette::ButtonText).color();
- }
-
- QColor highlightedTextColor = QColor(gdkHText.red>>8, gdkHText.green>>8, gdkHText.blue>>8);
- if (resolve_mask & (1 << QPalette::HighlightedText)) {
- highlightedTextColor = option->palette.highlightedText().color();
- }
-
- if (selected)
- painter->setPen(highlightedTextColor);
- else
- painter->setPen(textColor);
-
- int x, y, w, h;
- menuitem->rect.getRect(&x, &y, &w, &h);
- int tab = menuitem->tabWidth;
- int xm = QGtkStylePrivate::menuItemFrame + checkcol + windowsItemHMargin;
- int xpos = menuitem->rect.x() + xm + 1;
- QRect textRect(xpos, y + windowsItemVMargin, w - xm - QGtkStylePrivate::menuRightBorder - tab + 1, h - 2 * windowsItemVMargin);
- QRect vTextRect = visualRect(opt->direction, menuitem->rect, textRect);
- QString s = menuitem->text;
-
- if (!s.isEmpty()) { // Draw text
- p->save();
- int t = s.indexOf(QLatin1Char('\t'));
- int text_flags = Qt::AlignVCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine;
-
- if (!proxy()->styleHint(SH_UnderlineShortcut, menuitem, widget))
- text_flags |= Qt::TextHideMnemonic;
-
- // Draw shortcut right aligned
- text_flags |= Qt::AlignRight;
-
- if (t >= 0) {
- int rightMargin = 12; // Hardcode for now
- QRect vShortcutRect = visualRect(opt->direction, menuitem->rect,
- QRect(textRect.topRight(), QPoint(menuitem->rect.right() - rightMargin, textRect.bottom())));
-
- if (dis)
- p->setPen(disabledTextColor);
- p->drawText(vShortcutRect, text_flags , s.mid(t + 1));
- s = s.left(t);
- }
-
- text_flags &= ~Qt::AlignRight;
- text_flags |= Qt::AlignLeft;
- QFont font = menuitem->font;
- if (menuitem->menuItemType == QStyleOptionMenuItem::DefaultItem)
- font.setBold(true);
- p->setFont(font);
-
- if (dis)
- p->setPen(disabledTextColor);
- p->drawText(vTextRect, text_flags, s.left(t));
- p->restore();
- }
-
- // Arrow
- if (menuItem->menuItemType == QStyleOptionMenuItem::SubMenu) {// draw sub menu arrow
-
- QFontMetrics fm(menuitem->font);
- int arrow_size = fm.ascent() + fm.descent() - 2 * style->ythickness;
- gfloat arrow_scaling = 0.8;
- int extra = 0;
- if (!d->gtk_check_version(2, 16, 0)) {
- // "arrow-scaling" is actually hardcoded and fails on hardy (see gtk+-2.12/gtkmenuitem.c)
- // though the current documentation states otherwise
- d->gtk_widget_style_get(gtkMenuItem, "arrow-scaling", &arrow_scaling, NULL);
- // in versions < 2.16 ythickness was previously subtracted from the arrow_size
- extra = 2 * style->ythickness;
- }
-
- int horizontal_padding;
- d->gtk_widget_style_get(gtkMenuItem, "horizontal-padding", &horizontal_padding, NULL);
-
- const int dim = static_cast<int>(arrow_size * arrow_scaling) + extra;
- int xpos = menuItem->rect.left() + menuItem->rect.width() - horizontal_padding - dim;
- QRect vSubMenuRect = visualRect(option->direction, menuItem->rect,
- QRect(xpos, menuItem->rect.top() +
- menuItem->rect.height() / 2 - dim / 2, dim, dim));
- GtkStateType state = enabled ? (act ? GTK_STATE_PRELIGHT: GTK_STATE_NORMAL) : GTK_STATE_INSENSITIVE;
- GtkShadowType shadowType = (state == GTK_STATE_PRELIGHT) ? GTK_SHADOW_OUT : GTK_SHADOW_IN;
- gtkPainter->paintArrow(gtkMenuItem, "menuitem", vSubMenuRect, option->direction == Qt::RightToLeft ? GTK_ARROW_LEFT : GTK_ARROW_RIGHT, state,
- shadowType, false, style);
- }
- }
- painter->restore();
- break;
-
- case CE_PushButton:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(option)) {
- GtkWidget *gtkButton = d->gtkWidget("GtkButton");
- proxy()->drawControl(CE_PushButtonBevel, btn, painter, widget);
- QStyleOptionButton subopt = *btn;
- subopt.rect = subElementRect(SE_PushButtonContents, btn, widget);
- gint interiorFocus = true;
- d->gtk_widget_style_get(gtkButton, "interior-focus", &interiorFocus, NULL);
- GtkStyle *gtkButtonStyle = d->gtk_widget_get_style(gtkButton);
- int xt = interiorFocus ? gtkButtonStyle->xthickness : 0;
- int yt = interiorFocus ? gtkButtonStyle->ythickness : 0;
-
- if (btn->features & QStyleOptionButton::Flat && btn->state & State_HasFocus)
- // The normal button focus rect does not work well for flat buttons in Clearlooks
- proxy()->drawPrimitive(PE_FrameFocusRect, option, painter, widget);
- else if (btn->state & State_HasFocus)
- gtkPainter->paintFocus(gtkButton, "button",
- option->rect.adjusted(xt, yt, -xt, -yt),
- btn->state & State_Sunken ? GTK_STATE_ACTIVE : GTK_STATE_NORMAL,
- gtkButtonStyle);
-
- proxy()->drawControl(CE_PushButtonLabel, &subopt, painter, widget);
- }
- break;
-
-#ifndef QT_NO_TABBAR
-
- case CE_TabBarTabShape:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(option)) {
- GtkWidget *gtkNotebook = d->gtkWidget("GtkNotebook");
- style = d->gtk_widget_get_style(gtkNotebook);
-
- QRect rect = option->rect;
- GtkShadowType shadow = GTK_SHADOW_OUT;
- GtkStateType state = GTK_STATE_ACTIVE;
- if (tab->state & State_Selected)
- state = GTK_STATE_NORMAL;
-
- bool selected = (tab->state & State_Selected);
- bool first = false, last = false;
- if (widget) {
- // This is most accurate and avoids resizing tabs while moving
- first = tab->rect.left() == widget->rect().left();
- last = tab->rect.right() == widget->rect().right();
- } else if (option->direction == Qt::RightToLeft) {
- bool tmp = first;
- first = last;
- last = tmp;
- }
- int topIndent = 3;
- int bottomIndent = 1;
- int tabOverlap = 1;
- painter->save();
-
- switch (tab->shape) {
- case QTabBar::RoundedNorth:
- if (!selected)
- rect.adjust(first ? 0 : -tabOverlap, topIndent, last ? 0 : tabOverlap, -bottomIndent);
- gtkPainter->paintExtention(gtkNotebook, "tab", rect,
- state, shadow, GTK_POS_BOTTOM, style);
- break;
-
- case QTabBar::RoundedSouth:
- if (!selected)
- rect.adjust(first ? 0 : -tabOverlap, 0, last ? 0 : tabOverlap, -topIndent);
- gtkPainter->paintExtention(gtkNotebook, "tab", rect.adjusted(0, 1, 0, 0),
- state, shadow, GTK_POS_TOP, style);
- break;
-
- case QTabBar::RoundedWest:
- if (!selected)
- rect.adjust(topIndent, 0, -bottomIndent, 0);
- gtkPainter->paintExtention(gtkNotebook, "tab", rect, state, shadow, GTK_POS_RIGHT, style);
- break;
-
- case QTabBar::RoundedEast:
- if (!selected)
- rect.adjust(bottomIndent, 0, -topIndent, 0);
- gtkPainter->paintExtention(gtkNotebook, "tab", rect, state, shadow, GTK_POS_LEFT, style);
- break;
-
- default:
- QCommonStyle::drawControl(element, option, painter, widget);
- break;
- }
-
- painter->restore();
- }
-
- break;
-
-#endif //QT_NO_TABBAR
-
- case CE_ProgressBarGroove:
- if (const QStyleOptionProgressBar *bar = qstyleoption_cast<const QStyleOptionProgressBar *>(option)) {
- Q_UNUSED(bar);
- GtkWidget *gtkProgressBar = d->gtkWidget("GtkProgressBar");
- GtkStateType state = qt_gtk_state(option);
- gtkPainter->paintBox(gtkProgressBar, "trough", option->rect, state, GTK_SHADOW_IN, d->gtk_widget_get_style(gtkProgressBar));
- }
-
- break;
-
- case CE_ProgressBarContents:
- if (const QStyleOptionProgressBar *bar = qstyleoption_cast<const QStyleOptionProgressBar *>(option)) {
- GtkStateType state = option->state & State_Enabled ? GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE;
- GtkWidget *gtkProgressBar = d->gtkWidget("GtkProgressBar");
- style = d->gtk_widget_get_style(gtkProgressBar);
- gtkPainter->paintBox(gtkProgressBar, "trough", option->rect, state, GTK_SHADOW_IN, style);
- int xt = style->xthickness;
- int yt = style->ythickness;
- QRect rect = bar->rect.adjusted(xt, yt, -xt, -yt);
- bool vertical = false;
- bool inverted = false;
- bool indeterminate = (bar->minimum == 0 && bar->maximum == 0);
- // Get extra style options if version 2
-
- if (const QStyleOptionProgressBarV2 *bar2 = qstyleoption_cast<const QStyleOptionProgressBarV2 *>(option)) {
- vertical = (bar2->orientation == Qt::Vertical);
- inverted = bar2->invertedAppearance;
- }
-
- // If the orientation is vertical, we use a transform to rotate
- // the progress bar 90 degrees clockwise. This way we can use the
- // same rendering code for both orientations.
- if (vertical) {
- rect.translate(xt, -yt * 2);
- rect = QRect(rect.left(), rect.top(), rect.height(), rect.width()); // Flip width and height
- QTransform m = QTransform::fromTranslate(rect.height(), 0);
- m.rotate(90.0);
- painter->setTransform(m);
- }
-
- int maxWidth = rect.width();
- int minWidth = 4;
-
- qint64 progress = (qint64)qMax(bar->progress, bar->minimum); // Workaround for bug in QProgressBar
- double vc6_workaround = ((progress - qint64(bar->minimum)) / double(qint64(bar->maximum) - qint64(bar->minimum))) * maxWidth;
- int progressBarWidth = (int(vc6_workaround) > minWidth ) ? int(vc6_workaround) : minWidth;
- int width = indeterminate ? maxWidth : progressBarWidth;
- bool reverse = (!vertical && (bar->direction == Qt::RightToLeft)) || vertical;
-
- if (inverted)
- reverse = !reverse;
-
- int maximum = 2;
- int fakePos = 0;
- if (bar->minimum == bar->maximum)
- maximum = 0;
- if (bar->progress == bar->maximum)
- fakePos = maximum;
- else if (bar->progress > bar->minimum)
- fakePos = maximum - 1;
-
- QRect progressBar;
-
- if (!indeterminate) {
- if (!reverse)
- progressBar.setRect(rect.left(), rect.top(), width, rect.height());
- else
- progressBar.setRect(rect.right() - width, rect.top(), width, rect.height());
-#ifndef QT_NO_ANIMATION
- d->stopAnimation(option->styleObject);
-#endif
- } else {
- Q_D(const QGtkStyle);
- int slideWidth = ((rect.width() - 4) * 2) / 3;
- int step = 0;
-#ifndef QT_NO_ANIMATION
- if (QProgressStyleAnimation *animation = qobject_cast<QProgressStyleAnimation*>(d->animation(option->styleObject)))
- step = animation->progressStep(slideWidth);
- else
- d->startAnimation(new QProgressStyleAnimation(d->animationFps, option->styleObject));
-#endif
- progressBar.setRect(rect.left() + step, rect.top(), slideWidth / 2, rect.height());
- }
-
- QString key = QString(QLS("%0")).arg(fakePos);
- if (inverted) {
- key += QLatin1String("inv");
- gtkPainter->setFlipHorizontal(true);
- }
- gtkPainter->paintBox(gtkProgressBar, "bar", progressBar, GTK_STATE_SELECTED, GTK_SHADOW_OUT, style, key);
- }
-
- break;
-
- default:
- QCommonStyle::drawControl(element, option, painter, widget);
- }
-}
-
-/*!
- \reimp
-*/
-QRect QGtkStyle::subControlRect(ComplexControl control, const QStyleOptionComplex *option,
- SubControl subControl, const QWidget *widget) const
-{
- Q_D(const QGtkStyle);
-
- QRect rect = QCommonStyle::subControlRect(control, option, subControl, widget);
- if (!d->isThemeAvailable())
- return QCommonStyle::subControlRect(control, option, subControl, widget);
-
- switch (control) {
- case CC_ScrollBar:
- break;
- case CC_Slider:
- if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option)) {
- int tickSize = proxy()->pixelMetric(PM_SliderTickmarkOffset, option, widget);
- switch (subControl) {
- case SC_SliderHandle: {
- if (slider->orientation == Qt::Horizontal) {
- rect.setHeight(proxy()->pixelMetric(PM_SliderThickness));
- rect.setWidth(proxy()->pixelMetric(PM_SliderLength));
- int centerY = slider->rect.center().y() - rect.height() / 2;
- if (slider->tickPosition & QSlider::TicksAbove)
- centerY += tickSize;
- if (slider->tickPosition & QSlider::TicksBelow)
- centerY -= tickSize;
- rect.moveTop(centerY);
- } else {
- rect.setWidth(proxy()->pixelMetric(PM_SliderThickness));
- rect.setHeight(proxy()->pixelMetric(PM_SliderLength));
- int centerX = slider->rect.center().x() - rect.width() / 2;
- if (slider->tickPosition & QSlider::TicksAbove)
- centerX += tickSize;
- if (slider->tickPosition & QSlider::TicksBelow)
- centerX -= tickSize;
- rect.moveLeft(centerX);
- }
- }
- break;
- case SC_SliderGroove: {
- QPoint grooveCenter = slider->rect.center();
- if (slider->orientation == Qt::Horizontal) {
- rect.setHeight(7);
- if (slider->tickPosition & QSlider::TicksAbove)
- grooveCenter.ry() += tickSize;
- if (slider->tickPosition & QSlider::TicksBelow)
- grooveCenter.ry() -= tickSize;
- } else {
- rect.setWidth(7);
- if (slider->tickPosition & QSlider::TicksAbove)
- grooveCenter.rx() += tickSize;
- if (slider->tickPosition & QSlider::TicksBelow)
- grooveCenter.rx() -= tickSize;
- }
- rect.moveCenter(grooveCenter);
- break;
- }
- default:
- break;
- }
- }
- break;
-
-#ifndef QT_NO_GROUPBOX
-
- case CC_GroupBox:
- if (const QStyleOptionGroupBox * groupBox = qstyleoption_cast<const QStyleOptionGroupBox *>(option)) {
- rect = option->rect.adjusted(0, groupBoxTopMargin, 0, -groupBoxBottomMargin);
- int topMargin = 0;
- int topHeight = 0;
- topHeight = 10;
- QRect frameRect = rect;
- frameRect.setTop(topMargin);
-
- if (subControl == SC_GroupBoxFrame)
- return rect;
- else if (subControl == SC_GroupBoxContents) {
- int margin = 0;
- int leftMarginExtension = 8;
- return frameRect.adjusted(leftMarginExtension + margin, margin + topHeight + groupBoxTitleMargin, -margin, -margin);
- }
-
- QFontMetrics fontMetrics = option->fontMetrics;
- if (qobject_cast<const QGroupBox *>(widget)) {
- //Prepare metrics for a bold font
- QFont font = widget->font();
- font.setBold(true);
- fontMetrics = QFontMetrics(font);
-#ifndef QT_NO_ACCESSIBILITY
- } else if (QStyleHelper::isInstanceOf(groupBox->styleObject, QAccessible::Grouping)) {
- QVariant var = groupBox->styleObject->property("font");
- if (var.isValid() && var.canConvert<QFont>()) {
- QFont font = var.value<QFont>();
- font.setBold(true);
- fontMetrics = QFontMetrics(font);
- }
-#endif // QT_NO_ACCESSIBILITY
- }
-
- QSize textRect = fontMetrics.boundingRect(groupBox->text).size() + QSize(4, 4);
- int indicatorWidth = proxy()->pixelMetric(PM_IndicatorWidth, option, widget);
- int indicatorHeight = proxy()->pixelMetric(PM_IndicatorHeight, option, widget);
-
- if (subControl == SC_GroupBoxCheckBox) {
- rect.setWidth(indicatorWidth);
- rect.setHeight(indicatorHeight);
- rect.moveTop((textRect.height() - indicatorHeight) / 2);
-
- } else if (subControl == SC_GroupBoxLabel) {
- if (groupBox->subControls & SC_GroupBoxCheckBox)
- rect.adjust(indicatorWidth + 4, 0, 0, 0);
- rect.setSize(textRect);
- }
- rect = visualRect(option->direction, option->rect, rect);
- }
-
- return rect;
-
-#endif
-#ifndef QT_NO_SPINBOX
-
- case CC_SpinBox:
- if (const QStyleOptionSpinBox *spinbox = qstyleoption_cast<const QStyleOptionSpinBox *>(option)) {
- GtkWidget *gtkSpinButton = d->gtkWidget("GtkSpinButton");
- int center = spinbox->rect.height() / 2;
- GtkStyle *gtkSpinButtonStyle = d->gtk_widget_get_style(gtkSpinButton);
- int xt = spinbox->frame ? gtkSpinButtonStyle->xthickness : 0;
- int yt = spinbox->frame ? gtkSpinButtonStyle->ythickness : 0;
- int y = yt;
-
- QSize bs;
- bs.setHeight(qMax(8, spinbox->rect.height()/2 - y));
- bs.setWidth(d->getSpinboxArrowSize());
- int x, lx, rx;
- x = spinbox->rect.width() - y - bs.width() + 2;
- lx = xt;
- rx = x - xt;
-
- switch (subControl) {
-
- case SC_SpinBoxUp:
- if (spinbox->buttonSymbols == QAbstractSpinBox::NoButtons)
- return QRect();
- rect = QRect(x, xt, bs.width(), center - yt);
- break;
-
- case SC_SpinBoxDown:
- if (spinbox->buttonSymbols == QAbstractSpinBox::NoButtons)
- return QRect();
- rect = QRect(x, center, bs.width(), spinbox->rect.bottom() - center - yt + 1);
- break;
-
- case SC_SpinBoxEditField:
- if (spinbox->buttonSymbols == QAbstractSpinBox::NoButtons)
- rect = QRect(lx, yt, spinbox->rect.width() - 2*xt, spinbox->rect.height() - 2*yt);
- else
- rect = QRect(lx, yt, rx - qMax(xt - 1, 0), spinbox->rect.height() - 2*yt);
- break;
-
- case SC_SpinBoxFrame:
- rect = spinbox->rect;
-
- default:
- break;
- }
-
- rect = visualRect(spinbox->direction, spinbox->rect, rect);
- }
-
- break;
-
-#endif // Qt_NO_SPINBOX
-#ifndef QT_NO_COMBOBOX
-
- case CC_TitleBar:
- if (const QStyleOptionTitleBar *tb = qstyleoption_cast<const QStyleOptionTitleBar *>(option)) {
- SubControl sc = subControl;
- QRect &ret = rect;
- const int indent = 3;
- const int controlTopMargin = 3;
- const int controlBottomMargin = 3;
- const int controlWidthMargin = 2;
- const int controlHeight = tb->rect.height() - controlTopMargin - controlBottomMargin ;
- const int delta = controlHeight + controlWidthMargin;
- int offset = 0;
-
- bool isMinimized = tb->titleBarState & Qt::WindowMinimized;
- bool isMaximized = tb->titleBarState & Qt::WindowMaximized;
-
- switch (sc) {
- case SC_TitleBarLabel:
- if (tb->titleBarFlags & (Qt::WindowTitleHint | Qt::WindowSystemMenuHint)) {
- ret = tb->rect;
- if (tb->titleBarFlags & Qt::WindowSystemMenuHint)
- ret.adjust(delta, 0, -delta, 0);
- if (tb->titleBarFlags & Qt::WindowMinimizeButtonHint)
- ret.adjust(0, 0, -delta, 0);
- if (tb->titleBarFlags & Qt::WindowMaximizeButtonHint)
- ret.adjust(0, 0, -delta, 0);
- if (tb->titleBarFlags & Qt::WindowShadeButtonHint)
- ret.adjust(0, 0, -delta, 0);
- if (tb->titleBarFlags & Qt::WindowContextHelpButtonHint)
- ret.adjust(0, 0, -delta, 0);
- }
- break;
- case SC_TitleBarContextHelpButton:
- if (tb->titleBarFlags & Qt::WindowContextHelpButtonHint)
- offset += delta;
- case SC_TitleBarMinButton:
- if (!isMinimized && (tb->titleBarFlags & Qt::WindowMinimizeButtonHint))
- offset += delta;
- else if (sc == SC_TitleBarMinButton)
- break;
- case SC_TitleBarNormalButton:
- if (isMinimized && (tb->titleBarFlags & Qt::WindowMinimizeButtonHint))
- offset += delta;
- else if (isMaximized && (tb->titleBarFlags & Qt::WindowMaximizeButtonHint))
- offset += delta;
- else if (sc == SC_TitleBarNormalButton)
- break;
- case SC_TitleBarMaxButton:
- if (!isMaximized && (tb->titleBarFlags & Qt::WindowMaximizeButtonHint))
- offset += delta;
- else if (sc == SC_TitleBarMaxButton)
- break;
- case SC_TitleBarShadeButton:
- if (!isMinimized && (tb->titleBarFlags & Qt::WindowShadeButtonHint))
- offset += delta;
- else if (sc == SC_TitleBarShadeButton)
- break;
- case SC_TitleBarUnshadeButton:
- if (isMinimized && (tb->titleBarFlags & Qt::WindowShadeButtonHint))
- offset += delta;
- else if (sc == SC_TitleBarUnshadeButton)
- break;
- case SC_TitleBarCloseButton:
- if (tb->titleBarFlags & Qt::WindowSystemMenuHint)
- offset += delta;
- else if (sc == SC_TitleBarCloseButton)
- break;
- ret.setRect(tb->rect.right() - indent - offset, tb->rect.top() + controlTopMargin,
- controlHeight, controlHeight);
- break;
- case SC_TitleBarSysMenu:
- if (tb->titleBarFlags & Qt::WindowSystemMenuHint) {
- ret.setRect(tb->rect.left() + controlWidthMargin + indent, tb->rect.top() + controlTopMargin,
- controlHeight, controlHeight);
- }
- break;
- default:
- break;
- }
- ret = visualRect(tb->direction, tb->rect, ret);
- }
- break;
- case CC_ComboBox:
- if (const QStyleOptionComboBox *box = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
- // We employ the gtk widget to position arrows and separators for us
- GtkWidget *gtkCombo = box->editable ? d->gtkWidget("GtkComboBoxEntry")
- : d->gtkWidget("GtkComboBox");
- d->gtk_widget_set_direction(gtkCombo, (option->direction == Qt::RightToLeft) ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR);
- GtkAllocation geometry = {0, 0, qMax(0, option->rect.width()), qMax(0, option->rect.height())};
- d->gtk_widget_size_allocate(gtkCombo, &geometry);
- int appears_as_list = !proxy()->styleHint(QStyle::SH_ComboBox_Popup, option, widget);
- QHashableLatin1Literal arrowPath("GtkComboBoxEntry.GtkToggleButton");
- if (!box->editable) {
- if (appears_as_list)
- arrowPath = "GtkComboBox.GtkToggleButton";
- else
- arrowPath = "GtkComboBox.GtkToggleButton.GtkHBox.GtkArrow";
- }
-
- GtkWidget *arrowWidget = d->gtkWidget(arrowPath);
- if (!arrowWidget)
- return QCommonStyle::subControlRect(control, option, subControl, widget);
-
- GtkAllocation allocation;
- d->gtk_widget_get_allocation(arrowWidget, &allocation);
- QRect buttonRect(option->rect.left() + allocation.x,
- option->rect.top() + allocation.y,
- allocation.width, allocation.height);
-
- switch (subControl) {
-
- case SC_ComboBoxArrow: // Note: this indicates the arrowbutton for editable combos
- rect = buttonRect;
- break;
-
- case SC_ComboBoxEditField: {
- rect = visualRect(option->direction, option->rect, rect);
- int xMargin = box->editable ? 1 : 4, yMargin = 2;
- GtkStyle *gtkComboStyle = d->gtk_widget_get_style(gtkCombo);
- rect.setRect(option->rect.left() + gtkComboStyle->xthickness + xMargin,
- option->rect.top() + gtkComboStyle->ythickness + yMargin,
- option->rect.width() - buttonRect.width() - 2*(gtkComboStyle->xthickness + xMargin),
- option->rect.height() - 2*(gtkComboStyle->ythickness + yMargin));
- rect = visualRect(option->direction, option->rect, rect);
- break;
- }
-
- default:
- break;
- }
- }
-
- break;
-#endif // QT_NO_COMBOBOX
-
- default:
- break;
- }
-
- return rect;
-}
-
-/*!
- \reimp
-*/
-QSize QGtkStyle::sizeFromContents(ContentsType type, const QStyleOption *option,
- const QSize &size, const QWidget *widget) const
-{
- Q_D(const QGtkStyle);
-
- QSize newSize = QCommonStyle::sizeFromContents(type, option, size, widget);
- if (!d->isThemeAvailable())
- return newSize;
-
- switch (type) {
- case CT_GroupBox:
- // Since we use a bold font we have to recalculate base width
- if (const QGroupBox *gb = qobject_cast<const QGroupBox*>(widget)) {
- QFont font = gb->font();
- font.setBold(true);
- QFontMetrics metrics(font);
- int baseWidth = metrics.width(gb->title()) + metrics.width(QLatin1Char(' '));
- if (gb->isCheckable()) {
- baseWidth += proxy()->pixelMetric(QStyle::PM_IndicatorWidth, option, widget);
- baseWidth += proxy()->pixelMetric(QStyle::PM_CheckBoxLabelSpacing, option, widget);
- }
- newSize.setWidth(qMax(baseWidth, newSize.width()));
- }
- newSize += QSize(4, 1 + groupBoxBottomMargin + groupBoxTopMargin + groupBoxTitleMargin); // Add some space below the groupbox
- break;
- case CT_ToolButton:
- if (const QStyleOptionToolButton *toolbutton = qstyleoption_cast<const QStyleOptionToolButton *>(option)) {
- GtkWidget *gtkButton = d->gtkWidget("GtkToolButton.GtkButton");
- GtkStyle *gtkButtonStyle = d->gtk_widget_get_style(gtkButton);
- newSize = size + QSize(2 * gtkButtonStyle->xthickness, 2 + 2 * gtkButtonStyle->ythickness);
- if (widget && qobject_cast<QToolBar *>(widget->parentWidget())) {
- QSize minSize(0, 25);
- if (toolbutton->toolButtonStyle != Qt::ToolButtonTextOnly)
- minSize = toolbutton->iconSize + QSize(12, 12);
- newSize = newSize.expandedTo(minSize);
- }
-
- if (toolbutton->features & QStyleOptionToolButton::HasMenu)
- newSize += QSize(6, 0);
- }
- break;
- case CT_SpinBox:
- // QSpinBox does some nasty things that depends on CT_LineEdit
- newSize = newSize + QSize(0, -d->gtk_widget_get_style(d->gtkWidget("GtkSpinButton"))->ythickness * 2);
- break;
- case CT_RadioButton:
- case CT_CheckBox:
- newSize += QSize(0, 1);
- break;
- case CT_PushButton:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(option)) {
- if (!btn->icon.isNull() && btn->iconSize.height() > 16)
- newSize -= QSize(0, 2); // From cleanlooksstyle
- newSize += QSize(0, 1);
- GtkWidget *gtkButton = d->gtkWidget("GtkButton");
- gint focusPadding, focusWidth;
- d->gtk_widget_style_get(gtkButton, "focus-padding", &focusPadding, NULL);
- d->gtk_widget_style_get(gtkButton, "focus-line-width", &focusWidth, NULL);
- newSize = size;
- GtkStyle *gtkButtonStyle = d->gtk_widget_get_style(gtkButton);
- newSize += QSize(2*gtkButtonStyle->xthickness + 4, 2*gtkButtonStyle->ythickness);
- newSize += QSize(2*(focusWidth + focusPadding + 2), 2*(focusWidth + focusPadding));
-
- GtkWidget *gtkButtonBox = d->gtkWidget("GtkHButtonBox");
- gint minWidth = 85, minHeight = 0;
- d->gtk_widget_style_get(gtkButtonBox, "child-min-width", &minWidth,
- "child-min-height", &minHeight, NULL);
- if (!btn->text.isEmpty() && newSize.width() < minWidth)
- newSize.setWidth(minWidth);
- if (newSize.height() < minHeight)
- newSize.setHeight(minHeight);
- }
- break;
- case CT_Slider: {
- GtkWidget *gtkSlider = d->gtkWidget("GtkHScale");
- GtkStyle *gtkSliderStyle = d->gtk_widget_get_style(gtkSlider);
- newSize = size + QSize(2*gtkSliderStyle->xthickness, 2*gtkSliderStyle->ythickness); }
- break;
- case CT_LineEdit: {
- GtkWidget *gtkEntry = d->gtkWidget("GtkEntry");
- GtkStyle *gtkEntryStyle = d->gtk_widget_get_style(gtkEntry);
- newSize = size + QSize(2*gtkEntryStyle->xthickness, 2 + 2*gtkEntryStyle->ythickness); }
- break;
- case CT_ItemViewItem:
- newSize += QSize(0, 2);
- break;
- case CT_ComboBox:
- if (const QStyleOptionComboBox *combo = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
- GtkWidget *gtkCombo = d->gtkWidget("GtkComboBox");
- QRect arrowButtonRect = proxy()->subControlRect(CC_ComboBox, combo, SC_ComboBoxArrow, widget);
- GtkStyle *gtkComboStyle = d->gtk_widget_get_style(gtkCombo);
- newSize = size + QSize(12 + arrowButtonRect.width() + 2*gtkComboStyle->xthickness, 4 + 2*gtkComboStyle->ythickness);
-
- if (!(widget && qobject_cast<QToolBar *>(widget->parentWidget())))
- newSize += QSize(0, 2);
- }
- break;
- case CT_TabBarTab:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(option)) {
- if (!tab->icon.isNull())
- newSize += QSize(6, 0);
- }
- newSize += QSize(1, 1);
- break;
- case CT_MenuBarItem:
- newSize += QSize(QGtkStylePrivate::menuItemHMargin * 4, QGtkStylePrivate::menuItemVMargin * 2 + 2);
- break;
- case CT_SizeGrip:
- newSize += QSize(4, 4);
- break;
- case CT_MdiControls:
- if (const QStyleOptionComplex *styleOpt = qstyleoption_cast<const QStyleOptionComplex *>(option)) {
- int width = 0;
- if (styleOpt->subControls & SC_MdiMinButton)
- width += 19 + 1;
- if (styleOpt->subControls & SC_MdiNormalButton)
- width += 19 + 1;
- if (styleOpt->subControls & SC_MdiCloseButton)
- width += 19 + 1;
- newSize = QSize(width, 19);
- } else {
- newSize = QSize(60, 19);
- }
- break;
- case CT_MenuItem:
- if (const QStyleOptionMenuItem *menuItem = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) {
- int w = newSize.width();
- int maxpmw = menuItem->maxIconWidth;
- int tabSpacing = 20;
- if (menuItem->text.contains(QLatin1Char('\t')))
- w += tabSpacing;
- else if (menuItem->menuItemType == QStyleOptionMenuItem::SubMenu)
- w += 2 * QGtkStylePrivate::menuArrowHMargin;
- else if (menuItem->menuItemType == QStyleOptionMenuItem::DefaultItem) {
- // adjust the font and add the difference in size.
- // it would be better if the font could be adjusted in the initStyleOption qmenu func!!
- QFontMetrics fm(menuItem->font);
- QFont fontBold = menuItem->font;
- fontBold.setBold(true);
- QFontMetrics fmBold(fontBold);
- w += fmBold.width(menuItem->text) - fm.width(menuItem->text);
- }
-
- int checkcol = qMax<int>(maxpmw, QGtkStylePrivate::menuCheckMarkWidth); // Windows always shows a check column
- w += checkcol;
- w += int(QGtkStylePrivate::menuRightBorder) + 10;
-
- newSize.setWidth(w);
-
- int textMargin = 8;
- if (menuItem->menuItemType == QStyleOptionMenuItem::Separator) {
- GtkWidget *gtkMenuSeparator = d->gtkWidget("GtkMenu.GtkSeparatorMenuItem");
- GtkRequisition sizeReq = {0, 0};
- d->gtk_widget_size_request(gtkMenuSeparator, &sizeReq);
- newSize = QSize(newSize.width(), sizeReq.height);
- break;
- }
-
- GtkWidget *gtkMenuItem = d->gtkWidget("GtkMenu.GtkCheckMenuItem");
- GtkStyle* style = d->gtk_widget_get_style(gtkMenuItem);
-
- // Note we get the perfect height for the default font since we
- // set a fake text label on the gtkMenuItem
- // But if custom fonts are used on the widget we need a minimum size
- GtkRequisition sizeReq = {0, 0};
- d->gtk_widget_size_request(gtkMenuItem, &sizeReq);
- newSize.setHeight(qMax(newSize.height() - 4, sizeReq.height));
- newSize += QSize(textMargin + style->xthickness - 1, 0);
-
- gint checkSize;
- d->gtk_widget_style_get(gtkMenuItem, "indicator-size", &checkSize, NULL);
- newSize.setWidth(newSize.width() + qMax(0, checkSize - 20));
- }
- break;
- default:
- break;
- }
-
- return newSize;
-}
-
-
-/*! \reimp */
-QPixmap QGtkStyle::standardPixmap(StandardPixmap sp, const QStyleOption *option,
- const QWidget *widget) const
-{
- Q_D(const QGtkStyle);
-
- if (!d->isThemeAvailable())
- return QCommonStyle::standardPixmap(sp, option, widget);
-
- QPixmap pixmap;
- switch (sp) {
-
- case SP_TitleBarNormalButton: {
- QImage restoreButton(dock_widget_restore_xpm);
- QColor alphaCorner = restoreButton.color(2);
- alphaCorner.setAlpha(80);
- restoreButton.setColor(2, alphaCorner.rgba());
- alphaCorner.setAlpha(180);
- restoreButton.setColor(4, alphaCorner.rgba());
- return QPixmap::fromImage(restoreButton);
- }
- break;
-
- case SP_TitleBarCloseButton: // Fall through
- case SP_DockWidgetCloseButton: {
-
- QImage closeButton(dock_widget_close_xpm);
- QColor alphaCorner = closeButton.color(2);
- alphaCorner.setAlpha(80);
- closeButton.setColor(2, alphaCorner.rgba());
- return QPixmap::fromImage(closeButton);
- }
- break;
-
- case SP_DialogDiscardButton:
- return qt_gtk_get_icon(GTK_STOCK_DELETE);
- case SP_DialogOkButton:
- return qt_gtk_get_icon(GTK_STOCK_OK);
- case SP_DialogCancelButton:
- return qt_gtk_get_icon(GTK_STOCK_CANCEL);
- case SP_DialogYesButton:
- return qt_gtk_get_icon(GTK_STOCK_YES);
- case SP_DialogNoButton:
- return qt_gtk_get_icon(GTK_STOCK_NO);
- case SP_DialogOpenButton:
- return qt_gtk_get_icon(GTK_STOCK_OPEN);
- case SP_DialogCloseButton:
- return qt_gtk_get_icon(GTK_STOCK_CLOSE);
- case SP_DialogApplyButton:
- return qt_gtk_get_icon(GTK_STOCK_APPLY);
- case SP_DialogSaveButton:
- return qt_gtk_get_icon(GTK_STOCK_SAVE);
- case SP_MessageBoxWarning:
- return qt_gtk_get_icon(GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG);
- case SP_MessageBoxQuestion:
- return qt_gtk_get_icon(GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG);
- case SP_MessageBoxInformation:
- return qt_gtk_get_icon(GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG);
- case SP_MessageBoxCritical:
- return qt_gtk_get_icon(GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG);
- default:
- return QCommonStyle::standardPixmap(sp, option, widget);
- }
- return pixmap;
-}
-
-/*!
- \reimp
-*/
-QIcon QGtkStyle::standardIcon(StandardPixmap standardIcon,
- const QStyleOption *option,
- const QWidget *widget) const
-{
- Q_D(const QGtkStyle);
-
- if (!d->isThemeAvailable())
- return QCommonStyle::standardIcon(standardIcon, option, widget);
- switch (standardIcon) {
- case SP_DialogDiscardButton:
- return qt_gtk_get_icon(GTK_STOCK_DELETE);
- case SP_DialogOkButton:
- return qt_gtk_get_icon(GTK_STOCK_OK);
- case SP_DialogCancelButton:
- return qt_gtk_get_icon(GTK_STOCK_CANCEL);
- case SP_DialogYesButton:
- return qt_gtk_get_icon(GTK_STOCK_YES);
- case SP_DialogNoButton:
- return qt_gtk_get_icon(GTK_STOCK_NO);
- case SP_DialogOpenButton:
- return qt_gtk_get_icon(GTK_STOCK_OPEN);
- case SP_DialogCloseButton:
- return qt_gtk_get_icon(GTK_STOCK_CLOSE);
- case SP_DialogApplyButton:
- return qt_gtk_get_icon(GTK_STOCK_APPLY);
- case SP_DialogSaveButton:
- return qt_gtk_get_icon(GTK_STOCK_SAVE);
- case SP_MessageBoxWarning:
- return qt_gtk_get_icon(GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG);
- case SP_MessageBoxQuestion:
- return qt_gtk_get_icon(GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG);
- case SP_MessageBoxInformation:
- return qt_gtk_get_icon(GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG);
- case SP_MessageBoxCritical:
- return qt_gtk_get_icon(GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG);
- default:
- return QCommonStyle::standardIcon(standardIcon, option, widget);
- }
-}
-
-
-/*! \reimp */
-QRect QGtkStyle::subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget) const
-{
- Q_D(const QGtkStyle);
-
- QRect r = QCommonStyle::subElementRect(element, option, widget);
- if (!d->isThemeAvailable())
- return r;
-
- switch (element) {
- case SE_PushButtonFocusRect:
- r.adjust(0, 1, 0, -1);
- break;
- case SE_DockWidgetTitleBarText: {
- const QStyleOptionDockWidgetV2 *v2
- = qstyleoption_cast<const QStyleOptionDockWidgetV2*>(option);
- bool verticalTitleBar = v2 == 0 ? false : v2->verticalTitleBar;
- if (verticalTitleBar) {
- r.adjust(0, 0, 0, -4);
- } else {
- if (option->direction == Qt::LeftToRight)
- r.adjust(4, 0, 0, 0);
- else
- r.adjust(0, 0, -4, 0);
- }
-
- break;
- }
- case SE_ProgressBarLabel:
- case SE_ProgressBarContents:
- case SE_ProgressBarGroove:
- return option->rect;
- case SE_PushButtonContents:
- if (!d->gtk_check_version(2, 10, 0)) {
- GtkWidget *gtkButton = d->gtkWidget("GtkButton");
- GtkBorder *border = 0;
- d->gtk_widget_style_get(gtkButton, "inner-border", &border, NULL);
- if (border) {
- r = option->rect.adjusted(border->left, border->top, -border->right, -border->bottom);
- d->gtk_border_free(border);
- } else {
- r = option->rect.adjusted(1, 1, -1, -1);
- }
- r = visualRect(option->direction, option->rect, r);
- }
- break;
- default:
- break;
- }
-
- return r;
-}
-
-/*!
- \reimp
-*/
-QRect QGtkStyle::itemPixmapRect(const QRect &r, int flags, const QPixmap &pixmap) const
-{
- return QCommonStyle::itemPixmapRect(r, flags, pixmap);
-}
-
-/*!
- \reimp
-*/
-void QGtkStyle::drawItemPixmap(QPainter *painter, const QRect &rect,
- int alignment, const QPixmap &pixmap) const
-{
- QCommonStyle::drawItemPixmap(painter, rect, alignment, pixmap);
-}
-
-/*!
- \reimp
-*/
-QStyle::SubControl QGtkStyle::hitTestComplexControl(ComplexControl cc, const QStyleOptionComplex *opt,
- const QPoint &pt, const QWidget *w) const
-{
- return QCommonStyle::hitTestComplexControl(cc, opt, pt, w);
-}
-
-/*!
- \reimp
-*/
-QPixmap QGtkStyle::generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap,
- const QStyleOption *opt) const
-{
- return QCommonStyle::generatedIconPixmap(iconMode, pixmap, opt);
-}
-
-/*!
- \reimp
-*/
-void QGtkStyle::drawItemText(QPainter *painter, const QRect &rect, int alignment, const QPalette &pal,
- bool enabled, const QString& text, QPalette::ColorRole textRole) const
-{
- return QCommonStyle::drawItemText(painter, rect, alignment, pal, enabled, text, textRole);
-}
-
-QT_END_NAMESPACE
-
-#endif //!defined(QT_NO_STYLE_QGTK)
diff --git a/src/widgets/styles/qgtkstyle_p.cpp b/src/widgets/styles/qgtkstyle_p.cpp
deleted file mode 100644
index 00682c1c0f..0000000000
--- a/src/widgets/styles/qgtkstyle_p.cpp
+++ /dev/null
@@ -1,891 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qgtkstyle_p_p.h"
-
-// This file is responsible for resolving all GTK functions we use
-// dynamically. This is done to avoid link-time dependancy on GTK
-// as well as crashes occurring due to usage of the GTK_QT engines
-//
-// Additionally we create a map of common GTK widgets that we can pass
-// to the GTK theme engine as many engines resort to querying the
-// actual widget pointers for details that are not covered by the
-// state flags
-
-#include <QtCore/qglobal.h>
-#if !defined(QT_NO_STYLE_GTK)
-
-#include <QtCore/QEvent>
-#include <QtCore/QFile>
-#include <QtCore/QStringList>
-#include <QtCore/QTextStream>
-#include <QtCore/QHash>
-#include <QtCore/QUrl>
-#include <QtCore/QLibrary>
-#include <QtCore/QDebug>
-
-#include <private/qgtk2painter_p.h>
-#include <private/qapplication_p.h>
-#include <private/qiconloader_p.h>
-#include <qpa/qplatformfontdatabase.h>
-
-#include <QtWidgets/QMenu>
-#include <QtWidgets/QStyle>
-#include <QtWidgets/QApplication>
-#include <QtGui/QPixmapCache>
-#include <QtWidgets/QStatusBar>
-#include <QtWidgets/QMenuBar>
-#include <QtWidgets/QToolBar>
-#include <QtWidgets/QToolButton>
-
-#ifndef Q_OS_MAC
-// X11 Includes:
-
-// the following is necessary to work around breakage in many versions
-// of XFree86's Xlib.h still in use
-// ### which versions?
-#if defined(_XLIB_H_) // crude hack, but...
-#error "cannot include <X11/Xlib.h> before this file"
-#endif
-#define XRegisterIMInstantiateCallback qt_XRegisterIMInstantiateCallback
-#define XUnregisterIMInstantiateCallback qt_XUnregisterIMInstantiateCallback
-#define XSetIMValues qt_XSetIMValues
-#include <X11/Xlib.h>
-#undef XRegisterIMInstantiateCallback
-#undef XUnregisterIMInstantiateCallback
-#undef XSetIMValues
-#endif
-
-QT_BEGIN_NAMESPACE
-
-Q_GLOBAL_STATIC(QGtkStyleUpdateScheduler, styleScheduler)
-
-Ptr_gtk_container_forall QGtkStylePrivate::gtk_container_forall = 0;
-Ptr_gtk_init QGtkStylePrivate::gtk_init = 0;
-Ptr_gtk_style_attach QGtkStylePrivate::gtk_style_attach = 0;
-Ptr_gtk_window_new QGtkStylePrivate::gtk_window_new = 0;
-Ptr_gtk_widget_destroy QGtkStylePrivate::gtk_widget_destroy = 0;
-Ptr_gtk_widget_realize QGtkStylePrivate::gtk_widget_realize = 0;
-Ptr_gtk_widget_set_default_direction QGtkStylePrivate::gtk_widget_set_default_direction = 0;
-Ptr_gtk_widget_modify_color QGtkStylePrivate::gtk_widget_modify_fg = 0;
-Ptr_gtk_widget_modify_color QGtkStylePrivate::gtk_widget_modify_bg = 0;
-Ptr_gtk_arrow_new QGtkStylePrivate::gtk_arrow_new = 0;
-Ptr_gtk_menu_item_new_with_label QGtkStylePrivate::gtk_menu_item_new_with_label = 0;
-Ptr_gtk_check_menu_item_new_with_label QGtkStylePrivate::gtk_check_menu_item_new_with_label = 0;
-Ptr_gtk_menu_bar_new QGtkStylePrivate::gtk_menu_bar_new = 0;
-Ptr_gtk_menu_new QGtkStylePrivate::gtk_menu_new = 0;
-Ptr_gtk_button_new QGtkStylePrivate::gtk_button_new = 0;
-Ptr_gtk_tool_button_new QGtkStylePrivate::gtk_tool_button_new = 0;
-Ptr_gtk_hbutton_box_new QGtkStylePrivate::gtk_hbutton_box_new = 0;
-Ptr_gtk_check_button_new QGtkStylePrivate::gtk_check_button_new = 0;
-Ptr_gtk_radio_button_new QGtkStylePrivate::gtk_radio_button_new = 0;
-Ptr_gtk_spin_button_new QGtkStylePrivate::gtk_spin_button_new = 0;
-Ptr_gtk_frame_new QGtkStylePrivate::gtk_frame_new = 0;
-Ptr_gtk_expander_new QGtkStylePrivate::gtk_expander_new = 0;
-Ptr_gtk_statusbar_new QGtkStylePrivate::gtk_statusbar_new = 0;
-Ptr_gtk_entry_new QGtkStylePrivate::gtk_entry_new = 0;
-Ptr_gtk_hscale_new QGtkStylePrivate::gtk_hscale_new = 0;
-Ptr_gtk_vscale_new QGtkStylePrivate::gtk_vscale_new = 0;
-Ptr_gtk_hscrollbar_new QGtkStylePrivate::gtk_hscrollbar_new = 0;
-Ptr_gtk_vscrollbar_new QGtkStylePrivate::gtk_vscrollbar_new = 0;
-Ptr_gtk_scrolled_window_new QGtkStylePrivate::gtk_scrolled_window_new = 0;
-Ptr_gtk_notebook_new QGtkStylePrivate::gtk_notebook_new = 0;
-Ptr_gtk_toolbar_new QGtkStylePrivate::gtk_toolbar_new = 0;
-Ptr_gtk_toolbar_insert QGtkStylePrivate::gtk_toolbar_insert = 0;
-Ptr_gtk_separator_tool_item_new QGtkStylePrivate::gtk_separator_tool_item_new = 0;
-Ptr_gtk_tree_view_new QGtkStylePrivate::gtk_tree_view_new = 0;
-Ptr_gtk_combo_box_new QGtkStylePrivate::gtk_combo_box_new = 0;
-Ptr_gtk_combo_box_entry_new QGtkStylePrivate::gtk_combo_box_entry_new = 0;
-Ptr_gtk_progress_bar_new QGtkStylePrivate::gtk_progress_bar_new = 0;
-Ptr_gtk_container_add QGtkStylePrivate::gtk_container_add = 0;
-Ptr_gtk_menu_shell_append QGtkStylePrivate::gtk_menu_shell_append = 0;
-Ptr_gtk_range_get_adjustment QGtkStylePrivate::gtk_range_get_adjustment = 0;
-Ptr_gtk_range_set_adjustment QGtkStylePrivate::gtk_range_set_adjustment = 0;
-Ptr_gtk_range_set_inverted QGtkStylePrivate::gtk_range_set_inverted = 0;
-Ptr_gtk_icon_factory_lookup_default QGtkStylePrivate::gtk_icon_factory_lookup_default = 0;
-Ptr_gtk_icon_theme_get_default QGtkStylePrivate::gtk_icon_theme_get_default = 0;
-Ptr_gtk_widget_get_style QGtkStylePrivate::gtk_widget_get_style = 0;
-Ptr_gtk_widget_style_get QGtkStylePrivate::gtk_widget_style_get = 0;
-Ptr_gtk_icon_set_render_icon QGtkStylePrivate::gtk_icon_set_render_icon = 0;
-Ptr_gtk_fixed_new QGtkStylePrivate::gtk_fixed_new = 0;
-Ptr_gtk_tree_view_column_new QGtkStylePrivate::gtk_tree_view_column_new = 0;
-Ptr_gtk_tree_view_get_column QGtkStylePrivate::gtk_tree_view_get_column = 0;
-Ptr_gtk_tree_view_append_column QGtkStylePrivate::gtk_tree_view_append_column = 0;
-Ptr_gtk_adjustment_configure QGtkStylePrivate::gtk_adjustment_configure = 0;
-Ptr_gtk_adjustment_new QGtkStylePrivate::gtk_adjustment_new = 0;
-Ptr_gtk_menu_item_set_submenu QGtkStylePrivate::gtk_menu_item_set_submenu = 0;
-Ptr_gtk_settings_get_default QGtkStylePrivate::gtk_settings_get_default = 0;
-Ptr_gtk_separator_menu_item_new QGtkStylePrivate::gtk_separator_menu_item_new = 0;
-Ptr_gtk_widget_size_allocate QGtkStylePrivate::gtk_widget_size_allocate = 0;
-Ptr_gtk_widget_size_request QGtkStylePrivate::gtk_widget_size_request = 0;
-Ptr_gtk_widget_set_direction QGtkStylePrivate::gtk_widget_set_direction = 0;
-Ptr_gtk_widget_path QGtkStylePrivate::gtk_widget_path = 0;
-Ptr_gtk_container_get_type QGtkStylePrivate::gtk_container_get_type = 0;
-Ptr_gtk_window_get_type QGtkStylePrivate::gtk_window_get_type = 0;
-Ptr_gtk_widget_get_type QGtkStylePrivate::gtk_widget_get_type = 0;
-Ptr_gtk_widget_get_parent QGtkStylePrivate::gtk_widget_get_parent = 0;
-Ptr_gtk_widget_is_toplevel QGtkStylePrivate::gtk_widget_is_toplevel = 0;
-Ptr_gtk_widget_get_toplevel QGtkStylePrivate::gtk_widget_get_toplevel = 0;
-Ptr_gtk_rc_get_style_by_paths QGtkStylePrivate::gtk_rc_get_style_by_paths = 0;
-Ptr_gtk_check_version QGtkStylePrivate::gtk_check_version = 0;
-Ptr_gtk_border_free QGtkStylePrivate::gtk_border_free = 0;
-Ptr_gtk_widget_get_allocation QGtkStylePrivate::gtk_widget_get_allocation = 0;
-Ptr_gtk_widget_set_allocation QGtkStylePrivate::gtk_widget_set_allocation = 0;
-Ptr_gtk_widget_set_can_default QGtkStylePrivate::gtk_widget_set_can_default = 0;
-Ptr_gtk_window_set_default QGtkStylePrivate::gtk_window_set_default = 0;
-
-Ptr_gdk_event_new QGtkStylePrivate::gdk_event_new = 0;
-Ptr_gdk_event_free QGtkStylePrivate::gdk_event_free = 0;
-Ptr_gtk_widget_send_focus_change QGtkStylePrivate::gtk_widget_send_focus_change = 0;
-
-Ptr_pango_font_description_get_size QGtkStylePrivate::pango_font_description_get_size = 0;
-Ptr_pango_font_description_get_weight QGtkStylePrivate::pango_font_description_get_weight = 0;
-Ptr_pango_font_description_get_family QGtkStylePrivate::pango_font_description_get_family = 0;
-Ptr_pango_font_description_get_style QGtkStylePrivate::pango_font_description_get_style = 0;
-
-Ptr_gdk_pixbuf_get_pixels QGtkStylePrivate::gdk_pixbuf_get_pixels = 0;
-Ptr_gdk_pixbuf_get_width QGtkStylePrivate::gdk_pixbuf_get_width = 0;
-Ptr_gdk_pixbuf_get_height QGtkStylePrivate::gdk_pixbuf_get_height = 0;
-Ptr_gdk_pixbuf_new QGtkStylePrivate::gdk_pixbuf_new = 0;
-Ptr_gdk_pixbuf_unref QGtkStylePrivate::gdk_pixbuf_unref = 0;
-Ptr_gdk_color_free QGtkStylePrivate::gdk_color_free = 0;
-Ptr_gdk_x11_window_set_user_time QGtkStylePrivate::gdk_x11_window_set_user_time = 0;
-Ptr_gdk_x11_drawable_get_xid QGtkStylePrivate::gdk_x11_drawable_get_xid = 0;
-Ptr_gdk_x11_drawable_get_xdisplay QGtkStylePrivate::gdk_x11_drawable_get_xdisplay = 0;
-
-Ptr_gconf_client_get_default QGtkStylePrivate::gconf_client_get_default = 0;
-Ptr_gconf_client_get_string QGtkStylePrivate::gconf_client_get_string = 0;
-Ptr_gconf_client_get_bool QGtkStylePrivate::gconf_client_get_bool = 0;
-
-Ptr_gnome_icon_lookup_sync QGtkStylePrivate::gnome_icon_lookup_sync = 0;
-Ptr_gnome_vfs_init QGtkStylePrivate::gnome_vfs_init = 0;
-
-#ifndef Q_OS_MAC
-typedef int (*x11ErrorHandler)(Display*, XErrorEvent*);
-#endif
-
-QT_END_NAMESPACE
-
-Q_DECLARE_METATYPE(QGtkStylePrivate*);
-
-QT_BEGIN_NAMESPACE
-
-static void gtkStyleSetCallback(GtkWidget*)
-{
- qRegisterMetaType<QGtkStylePrivate *>();
-
- // We have to let this function return and complete the event
- // loop to ensure that all gtk widgets have been styled before
- // updating
- QMetaObject::invokeMethod(styleScheduler(), "updateTheme", Qt::QueuedConnection);
-}
-
-static void update_toolbar_style(GtkWidget *gtkToolBar, GParamSpec *, gpointer)
-{
- GtkToolbarStyle toolbar_style = GTK_TOOLBAR_ICONS;
- g_object_get(gtkToolBar, "toolbar-style", &toolbar_style, NULL);
- QWidgetList widgets = QApplication::allWidgets();
- for (int i = 0; i < widgets.size(); ++i) {
- QWidget *widget = widgets.at(i);
- if (qobject_cast<QToolButton*>(widget)) {
- QEvent event(QEvent::StyleChange);
- QApplication::sendEvent(widget, &event);
- }
- }
-}
-
-static QHashableLatin1Literal classPath(GtkWidget *widget)
-{
- char *class_path;
- QGtkStylePrivate::gtk_widget_path (widget, NULL, &class_path, NULL);
-
- char *copy = class_path;
- if (strncmp(copy, "GtkWindow.", 10) == 0)
- copy += 10;
- if (strncmp(copy, "GtkFixed.", 9) == 0)
- copy += 9;
-
- copy = strdup(copy);
-
- g_free(class_path);
-
- return QHashableLatin1Literal::fromData(copy);
-}
-
-
-
-bool QGtkStyleFilter::eventFilter(QObject *obj, QEvent *e)
-{
- if (e->type() == QEvent::ApplicationPaletteChange) {
- // Only do this the first time since this will also
- // generate applicationPaletteChange events
- if (!qt_app_palettes_hash() || qt_app_palettes_hash()->isEmpty()) {
- stylePrivate->applyCustomPaletteHash();
- }
- }
- return QObject::eventFilter(obj, e);
-}
-
-QList<QGtkStylePrivate *> QGtkStylePrivate::instances;
-QGtkStylePrivate::WidgetMap *QGtkStylePrivate::widgetMap = 0;
-
-QGtkStylePrivate::QGtkStylePrivate()
- : QCommonStylePrivate()
- , filter(this)
-{
- instances.append(this);
- animationFps = 60;
-}
-
-QGtkStylePrivate::~QGtkStylePrivate()
-{
- instances.removeOne(this);
-}
-
-void QGtkStylePrivate::init()
-{
- resolveGtk();
- initGtkWidgets();
-}
-
-QGtkPainter* QGtkStylePrivate::gtkPainter(QPainter *painter)
-{
- // TODO: choose between gtk2 and gtk3
- static QGtk2Painter instance;
- instance.reset(painter);
- return &instance;
-}
-
-GtkWidget* QGtkStylePrivate::gtkWidget(const QHashableLatin1Literal &path)
-{
- GtkWidget *widget = gtkWidgetMap()->value(path);
- if (!widget) {
- // Theme might have rearranged widget internals
- widget = gtkWidgetMap()->value(path);
- }
- return widget;
-}
-
-GtkStyle* QGtkStylePrivate::gtkStyle(const QHashableLatin1Literal &path)
-{
- if (GtkWidget *w = gtkWidgetMap()->value(path))
- return QGtkStylePrivate::gtk_widget_get_style(w);
- return 0;
-}
-
-void QGtkStylePrivate::gtkWidgetSetFocus(GtkWidget *widget, bool focus)
-{
- if (QGtkStylePrivate::gtk_widget_send_focus_change) {
- GdkEvent *event = QGtkStylePrivate::gdk_event_new(GDK_FOCUS_CHANGE);
- event->focus_change.type = GDK_FOCUS_CHANGE;
- event->focus_change.in = focus;
- QGtkStylePrivate::gtk_widget_send_focus_change(widget, event);
- QGtkStylePrivate::gdk_event_free(event);
- } else {
-#if defined(GTK_WIDGET_SET_FLAGS) && defined(GTK_WIDGET_UNSET_FLAGS)
- if (focus)
- GTK_WIDGET_SET_FLAGS(widget, GTK_HAS_FOCUS);
- else
- GTK_WIDGET_UNSET_FLAGS(widget, GTK_HAS_FOCUS);
-#endif
- }
-}
-
-/*! \internal
- * Get references to gtk functions after we dynamically load the library.
- */
-void QGtkStylePrivate::resolveGtk() const
-{
-#ifndef QT_NO_LIBRARY
- // enforce the "0" suffix, so we'll open libgtk-x11-2.0.so.0
- QLibrary libgtk(QLS("gtk-x11-2.0"), 0, 0);
-
- gtk_init = (Ptr_gtk_init)libgtk.resolve("gtk_init");
- gtk_window_new = (Ptr_gtk_window_new)libgtk.resolve("gtk_window_new");
- gtk_style_attach = (Ptr_gtk_style_attach)libgtk.resolve("gtk_style_attach");
- gtk_widget_destroy = (Ptr_gtk_widget_destroy)libgtk.resolve("gtk_widget_destroy");
- gtk_widget_realize = (Ptr_gtk_widget_realize)libgtk.resolve("gtk_widget_realize");
-
- gdk_pixbuf_get_pixels = (Ptr_gdk_pixbuf_get_pixels)libgtk.resolve("gdk_pixbuf_get_pixels");
- gdk_pixbuf_get_width = (Ptr_gdk_pixbuf_get_width)libgtk.resolve("gdk_pixbuf_get_width");
- gdk_pixbuf_get_height = (Ptr_gdk_pixbuf_get_height)libgtk.resolve("gdk_pixbuf_get_height");
- gdk_pixbuf_new = (Ptr_gdk_pixbuf_new)libgtk.resolve("gdk_pixbuf_new");
- gdk_pixbuf_unref = (Ptr_gdk_pixbuf_unref)libgtk.resolve("gdk_pixbuf_unref");
- gdk_color_free = (Ptr_gdk_color_free)libgtk.resolve("gdk_color_free");
- gdk_x11_window_set_user_time = (Ptr_gdk_x11_window_set_user_time)libgtk.resolve("gdk_x11_window_set_user_time");
- gdk_x11_drawable_get_xid = (Ptr_gdk_x11_drawable_get_xid)libgtk.resolve("gdk_x11_drawable_get_xid");
- gdk_x11_drawable_get_xdisplay = (Ptr_gdk_x11_drawable_get_xdisplay)libgtk.resolve("gdk_x11_drawable_get_xdisplay");
-
- gtk_widget_set_default_direction = (Ptr_gtk_widget_set_default_direction)libgtk.resolve("gtk_widget_set_default_direction");
- gtk_widget_modify_fg = (Ptr_gtk_widget_modify_color)libgtk.resolve("gtk_widget_modify_fg");
- gtk_widget_modify_bg = (Ptr_gtk_widget_modify_color)libgtk.resolve("gtk_widget_modify_bg");
- gtk_arrow_new = (Ptr_gtk_arrow_new)libgtk.resolve("gtk_arrow_new");
- gtk_menu_item_new_with_label = (Ptr_gtk_menu_item_new_with_label)libgtk.resolve("gtk_menu_item_new_with_label");
- gtk_check_menu_item_new_with_label = (Ptr_gtk_check_menu_item_new_with_label)libgtk.resolve("gtk_check_menu_item_new_with_label");
- gtk_menu_bar_new = (Ptr_gtk_menu_bar_new)libgtk.resolve("gtk_menu_bar_new");
- gtk_menu_new = (Ptr_gtk_menu_new)libgtk.resolve("gtk_menu_new");
- gtk_toolbar_new = (Ptr_gtk_toolbar_new)libgtk.resolve("gtk_toolbar_new");
- gtk_separator_tool_item_new = (Ptr_gtk_separator_tool_item_new)libgtk.resolve("gtk_separator_tool_item_new");
- gtk_toolbar_insert = (Ptr_gtk_toolbar_insert)libgtk.resolve("gtk_toolbar_insert");
- gtk_button_new = (Ptr_gtk_button_new)libgtk.resolve("gtk_button_new");
- gtk_tool_button_new = (Ptr_gtk_tool_button_new)libgtk.resolve("gtk_tool_button_new");
- gtk_hbutton_box_new = (Ptr_gtk_hbutton_box_new)libgtk.resolve("gtk_hbutton_box_new");
- gtk_check_button_new = (Ptr_gtk_check_button_new)libgtk.resolve("gtk_check_button_new");
- gtk_radio_button_new = (Ptr_gtk_radio_button_new)libgtk.resolve("gtk_radio_button_new");
- gtk_notebook_new = (Ptr_gtk_notebook_new)libgtk.resolve("gtk_notebook_new");
- gtk_progress_bar_new = (Ptr_gtk_progress_bar_new)libgtk.resolve("gtk_progress_bar_new");
- gtk_spin_button_new = (Ptr_gtk_spin_button_new)libgtk.resolve("gtk_spin_button_new");
- gtk_hscale_new = (Ptr_gtk_hscale_new)libgtk.resolve("gtk_hscale_new");
- gtk_vscale_new = (Ptr_gtk_vscale_new)libgtk.resolve("gtk_vscale_new");
- gtk_hscrollbar_new = (Ptr_gtk_hscrollbar_new)libgtk.resolve("gtk_hscrollbar_new");
- gtk_vscrollbar_new = (Ptr_gtk_vscrollbar_new)libgtk.resolve("gtk_vscrollbar_new");
- gtk_scrolled_window_new = (Ptr_gtk_scrolled_window_new)libgtk.resolve("gtk_scrolled_window_new");
- gtk_menu_shell_append = (Ptr_gtk_menu_shell_append)libgtk.resolve("gtk_menu_shell_append");
- gtk_entry_new = (Ptr_gtk_entry_new)libgtk.resolve("gtk_entry_new");
- gtk_tree_view_new = (Ptr_gtk_tree_view_new)libgtk.resolve("gtk_tree_view_new");
- gtk_combo_box_new = (Ptr_gtk_combo_box_new)libgtk.resolve("gtk_combo_box_new");
- gtk_combo_box_entry_new = (Ptr_gtk_combo_box_entry_new)libgtk.resolve("gtk_combo_box_entry_new");
- gtk_range_get_adjustment = (Ptr_gtk_range_get_adjustment)libgtk.resolve("gtk_range_get_adjustment");
- gtk_range_set_adjustment = (Ptr_gtk_range_set_adjustment)libgtk.resolve("gtk_range_set_adjustment");
- gtk_range_set_inverted = (Ptr_gtk_range_set_inverted)libgtk.resolve("gtk_range_set_inverted");
- gtk_container_add = (Ptr_gtk_container_add)libgtk.resolve("gtk_container_add");
- gtk_icon_factory_lookup_default = (Ptr_gtk_icon_factory_lookup_default)libgtk.resolve("gtk_icon_factory_lookup_default");
- gtk_icon_theme_get_default = (Ptr_gtk_icon_theme_get_default)libgtk.resolve("gtk_icon_theme_get_default");
- gtk_widget_get_style = (Ptr_gtk_widget_get_style)libgtk.resolve("gtk_widget_get_style");
- gtk_widget_style_get = (Ptr_gtk_widget_style_get)libgtk.resolve("gtk_widget_style_get");
- gtk_icon_set_render_icon = (Ptr_gtk_icon_set_render_icon)libgtk.resolve("gtk_icon_set_render_icon");
- gtk_fixed_new = (Ptr_gtk_fixed_new)libgtk.resolve("gtk_fixed_new");
- gtk_tree_view_column_new = (Ptr_gtk_tree_view_column_new)libgtk.resolve("gtk_tree_view_column_new");
- gtk_tree_view_append_column= (Ptr_gtk_tree_view_append_column )libgtk.resolve("gtk_tree_view_append_column");
- gtk_tree_view_get_column = (Ptr_gtk_tree_view_get_column )libgtk.resolve("gtk_tree_view_get_column");
- gtk_adjustment_configure = (Ptr_gtk_adjustment_configure)libgtk.resolve("gtk_adjustment_configure");
- gtk_adjustment_new = (Ptr_gtk_adjustment_new)libgtk.resolve("gtk_adjustment_new");
- gtk_menu_item_set_submenu = (Ptr_gtk_menu_item_set_submenu)libgtk.resolve("gtk_menu_item_set_submenu");
- gtk_settings_get_default = (Ptr_gtk_settings_get_default)libgtk.resolve("gtk_settings_get_default");
- gtk_separator_menu_item_new = (Ptr_gtk_separator_menu_item_new)libgtk.resolve("gtk_separator_menu_item_new");
- gtk_frame_new = (Ptr_gtk_frame_new)libgtk.resolve("gtk_frame_new");
- gtk_expander_new = (Ptr_gtk_expander_new)libgtk.resolve("gtk_expander_new");
- gtk_statusbar_new = (Ptr_gtk_statusbar_new)libgtk.resolve("gtk_statusbar_new");
- gtk_container_forall = (Ptr_gtk_container_forall)libgtk.resolve("gtk_container_forall");
- gtk_widget_size_allocate =(Ptr_gtk_widget_size_allocate)libgtk.resolve("gtk_widget_size_allocate");
- gtk_widget_size_request =(Ptr_gtk_widget_size_request)libgtk.resolve("gtk_widget_size_request");
- gtk_widget_set_direction =(Ptr_gtk_widget_set_direction)libgtk.resolve("gtk_widget_set_direction");
- gtk_widget_path =(Ptr_gtk_widget_path)libgtk.resolve("gtk_widget_path");
- gtk_container_get_type =(Ptr_gtk_container_get_type)libgtk.resolve("gtk_container_get_type");
- gtk_window_get_type =(Ptr_gtk_window_get_type)libgtk.resolve("gtk_window_get_type");
- gtk_widget_get_type =(Ptr_gtk_widget_get_type)libgtk.resolve("gtk_widget_get_type");
- gtk_widget_get_parent =(Ptr_gtk_widget_get_parent)libgtk.resolve("gtk_widget_get_parent");
- gtk_widget_is_toplevel =(Ptr_gtk_widget_is_toplevel)libgtk.resolve("gtk_widget_is_toplevel");
- gtk_widget_get_toplevel =(Ptr_gtk_widget_get_toplevel)libgtk.resolve("gtk_widget_get_toplevel");
-
- gtk_rc_get_style_by_paths =(Ptr_gtk_rc_get_style_by_paths)libgtk.resolve("gtk_rc_get_style_by_paths");
- gtk_check_version =(Ptr_gtk_check_version)libgtk.resolve("gtk_check_version");
- gtk_border_free =(Ptr_gtk_border_free)libgtk.resolve("gtk_border_free");
- gtk_widget_get_allocation = (Ptr_gtk_widget_get_allocation)libgtk.resolve("gtk_widget_get_allocation");
- gtk_widget_set_allocation = (Ptr_gtk_widget_set_allocation)libgtk.resolve("gtk_widget_set_allocation");
-
- gtk_widget_set_can_default = (Ptr_gtk_widget_set_can_default)libgtk.resolve("gtk_widget_set_can_default");
- gtk_window_set_default = (Ptr_gtk_window_set_default)libgtk.resolve("gtk_window_set_default");
-
- gdk_event_new = (Ptr_gdk_event_new)libgtk.resolve("gdk_event_new");
- gdk_event_free = (Ptr_gdk_event_free)libgtk.resolve("gdk_event_free");
- gtk_widget_send_focus_change = (Ptr_gtk_widget_send_focus_change)libgtk.resolve("gtk_widget_send_focus_change");
-
- pango_font_description_get_size = (Ptr_pango_font_description_get_size)libgtk.resolve("pango_font_description_get_size");
- pango_font_description_get_weight = (Ptr_pango_font_description_get_weight)libgtk.resolve("pango_font_description_get_weight");
- pango_font_description_get_family = (Ptr_pango_font_description_get_family)libgtk.resolve("pango_font_description_get_family");
- pango_font_description_get_style = (Ptr_pango_font_description_get_style)libgtk.resolve("pango_font_description_get_style");
-
- gnome_icon_lookup_sync = (Ptr_gnome_icon_lookup_sync)QLibrary::resolve(QLS("gnomeui-2"), 0, "gnome_icon_lookup_sync");
- gnome_vfs_init= (Ptr_gnome_vfs_init)QLibrary::resolve(QLS("gnomevfs-2"), 0, "gnome_vfs_init");
-#endif // !QT_NO_LIBRARY
-}
-
-/* \internal
- * Initializes a number of gtk menu widgets.
- * The widgets are cached.
- */
-void QGtkStylePrivate::initGtkMenu() const
-{
- // Create menubar
- GtkWidget *gtkMenuBar = QGtkStylePrivate::gtk_menu_bar_new();
- setupGtkWidget(gtkMenuBar);
-
- GtkWidget *gtkMenuBarItem = QGtkStylePrivate::gtk_menu_item_new_with_label("X");
- gtk_menu_shell_append((GtkMenuShell*)(gtkMenuBar), gtkMenuBarItem);
- gtk_widget_realize(gtkMenuBarItem);
-
- // Create menu
- GtkWidget *gtkMenu = QGtkStylePrivate::gtk_menu_new();
- gtk_menu_item_set_submenu((GtkMenuItem*)(gtkMenuBarItem), gtkMenu);
- gtk_widget_realize(gtkMenu);
-
- GtkWidget *gtkMenuItem = QGtkStylePrivate::gtk_menu_item_new_with_label("X");
- gtk_menu_shell_append((GtkMenuShell*)gtkMenu, gtkMenuItem);
- gtk_widget_realize(gtkMenuItem);
-
- GtkWidget *gtkCheckMenuItem = QGtkStylePrivate::gtk_check_menu_item_new_with_label("X");
- gtk_menu_shell_append((GtkMenuShell*)gtkMenu, gtkCheckMenuItem);
- gtk_widget_realize(gtkCheckMenuItem);
-
- GtkWidget *gtkMenuSeparator = QGtkStylePrivate::gtk_separator_menu_item_new();
- gtk_menu_shell_append((GtkMenuShell*)gtkMenu, gtkMenuSeparator);
-
- addAllSubWidgets(gtkMenuBar);
- addAllSubWidgets(gtkMenu);
-}
-
-
-void QGtkStylePrivate::initGtkTreeview() const
-{
- GtkWidget *gtkTreeView = gtk_tree_view_new();
- gtk_tree_view_append_column((GtkTreeView*)gtkTreeView, gtk_tree_view_column_new());
- gtk_tree_view_append_column((GtkTreeView*)gtkTreeView, gtk_tree_view_column_new());
- gtk_tree_view_append_column((GtkTreeView*)gtkTreeView, gtk_tree_view_column_new());
- addWidget(gtkTreeView);
-}
-
-
-/* \internal
- * Initializes a number of gtk widgets that we can later on use to determine some of our styles.
- * The widgets are cached.
- */
-void QGtkStylePrivate::initGtkWidgets() const
-{
- // From gtkmain.c
- uid_t ruid = getuid ();
- uid_t rgid = getgid ();
- uid_t euid = geteuid ();
- uid_t egid = getegid ();
- if (ruid != euid || rgid != egid) {
- qWarning("\nThis process is currently running setuid or setgid.\nGTK+ does not allow this "
- "therefore Qt cannot use the GTK+ integration.\nTry launching your app using \'gksudo\', "
- "\'kdesudo\' or a similar tool.\n\n"
- "See http://www.gtk.org/setuid.html for more information.\n");
- return;
- }
-
- if (QGtkStylePrivate::gtk_init) {
-#ifndef Q_OS_MAC
- // Gtk will set the Qt error handler so we have to reset it afterwards
- x11ErrorHandler qt_x_errhandler = XSetErrorHandler(0);
-#endif
- QGtkStylePrivate::gtk_init (NULL, NULL);
-#ifndef Q_OS_MAC
- XSetErrorHandler(qt_x_errhandler);
-#endif
-
- // make a window
- GtkWidget* gtkWindow = QGtkStylePrivate::gtk_window_new(GTK_WINDOW_POPUP);
- QGtkStylePrivate::gtk_widget_realize(gtkWindow);
- QHashableLatin1Literal widgetPath = QHashableLatin1Literal::fromData(strdup("GtkWindow"));
- removeWidgetFromMap(widgetPath);
- gtkWidgetMap()->insert(widgetPath, gtkWindow);
-
-
- // Make all other widgets. respect the text direction
- if (qApp->layoutDirection() == Qt::RightToLeft)
- QGtkStylePrivate::gtk_widget_set_default_direction(GTK_TEXT_DIR_RTL);
-
- if (!gtkWidgetMap()->contains("GtkButton")) {
- GtkWidget *gtkButton = QGtkStylePrivate::gtk_button_new();
- addWidget(gtkButton);
- g_signal_connect(gtkButton, "style-set", G_CALLBACK(gtkStyleSetCallback), 0);
- addWidget(QGtkStylePrivate::gtk_tool_button_new(NULL, "Qt"));
- addWidget(QGtkStylePrivate::gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_NONE));
- addWidget(QGtkStylePrivate::gtk_hbutton_box_new());
- addWidget(QGtkStylePrivate::gtk_check_button_new());
- addWidget(QGtkStylePrivate::gtk_radio_button_new(NULL));
- addWidget(QGtkStylePrivate::gtk_combo_box_new());
- addWidget(QGtkStylePrivate::gtk_combo_box_entry_new());
- GtkWidget *entry = QGtkStylePrivate::gtk_entry_new();
- // gtk-im-context-none is supported in gtk+ since 2.19.5
- // and also exists in gtk3
- // http://git.gnome.org/browse/gtk+/tree/gtk/gtkimmulticontext.c?id=2.19.5#n33
- // reason that we don't use gtk-im-context-simple here is,
- // gtk-im-context-none has less overhead, and 2.19.5 is
- // relatively old. and even for older gtk+, it will fallback
- // to gtk-im-context-simple if gtk-im-context-none doesn't
- // exists.
- g_object_set(entry, "im-module", "gtk-im-context-none", NULL);
- addWidget(entry);
- addWidget(QGtkStylePrivate::gtk_frame_new(NULL));
- addWidget(QGtkStylePrivate::gtk_expander_new(""));
- addWidget(QGtkStylePrivate::gtk_statusbar_new());
- addWidget(QGtkStylePrivate::gtk_hscale_new((QGtkStylePrivate::gtk_adjustment_new(1, 0, 1, 0, 0, 0))));
- addWidget(QGtkStylePrivate::gtk_hscrollbar_new(NULL));
- addWidget(QGtkStylePrivate::gtk_scrolled_window_new(NULL, NULL));
-
- initGtkMenu();
- addWidget(QGtkStylePrivate::gtk_notebook_new());
- addWidget(QGtkStylePrivate::gtk_progress_bar_new());
- addWidget(QGtkStylePrivate::gtk_spin_button_new((QGtkStylePrivate::gtk_adjustment_new(1, 0, 1, 0, 0, 0)), 0.1, 3));
- GtkWidget *toolbar = gtk_toolbar_new();
- g_signal_connect (toolbar, "notify::toolbar-style", G_CALLBACK (update_toolbar_style), toolbar);
- gtk_toolbar_insert((GtkToolbar*)toolbar, gtk_separator_tool_item_new(), -1);
- addWidget(toolbar);
- initGtkTreeview();
- addWidget(gtk_vscale_new((QGtkStylePrivate::gtk_adjustment_new(1, 0, 1, 0, 0, 0))));
- addWidget(gtk_vscrollbar_new(NULL));
- }
- else // Rebuild map
- {
- // When styles change subwidgets can get rearranged
- // as with the combo box. We need to update the widget map
- // to reflect this;
- QHash<QHashableLatin1Literal, GtkWidget*> oldMap = *gtkWidgetMap();
- gtkWidgetMap()->clear();
- QHashIterator<QHashableLatin1Literal, GtkWidget*> it(oldMap);
- while (it.hasNext()) {
- it.next();
- if (!strchr(it.key().data(), '.')) {
- addAllSubWidgets(it.value());
- }
- free(const_cast<char *>(it.key().data()));
- }
- }
- } else {
- qWarning("QGtkStyle could not resolve GTK. Make sure you have installed the proper libraries.");
- }
-}
-
-/*! \internal
- * destroys all previously buffered widgets.
- */
-void QGtkStylePrivate::cleanupGtkWidgets()
-{
- if (!widgetMap)
- return;
- if (widgetMap->contains("GtkWindow")) // Gtk will destroy all children
- gtk_widget_destroy(widgetMap->value("GtkWindow"));
- for (QHash<QHashableLatin1Literal, GtkWidget *>::const_iterator it = widgetMap->constBegin();
- it != widgetMap->constEnd(); ++it)
- free(const_cast<char *>(it.key().data()));
-}
-
-static bool resolveGConf()
-{
-#ifndef QT_NO_LIBRARY
- if (!QGtkStylePrivate::gconf_client_get_default) {
- QGtkStylePrivate::gconf_client_get_default = (Ptr_gconf_client_get_default)QLibrary::resolve(QLS("gconf-2"), 4, "gconf_client_get_default");
- QGtkStylePrivate::gconf_client_get_string = (Ptr_gconf_client_get_string)QLibrary::resolve(QLS("gconf-2"), 4, "gconf_client_get_string");
- QGtkStylePrivate::gconf_client_get_bool = (Ptr_gconf_client_get_bool)QLibrary::resolve(QLS("gconf-2"), 4, "gconf_client_get_bool");
- }
-#endif // !QT_NO_LIBRARY
- return (QGtkStylePrivate::gconf_client_get_default !=0);
-}
-
-QString QGtkStylePrivate::getGConfString(const QString &value, const QString &fallback)
-{
- QString retVal = fallback;
- if (resolveGConf()) {
-#if !defined(GLIB_VERSION_2_36)
- g_type_init();
-#endif
- GConfClient* client = gconf_client_get_default();
- GError *err = 0;
- char *str = gconf_client_get_string(client, qPrintable(value), &err);
- if (!err) {
- retVal = QString::fromUtf8(str);
- g_free(str);
- }
- g_object_unref(client);
- if (err)
- g_error_free (err);
- }
- return retVal;
-}
-
-bool QGtkStylePrivate::getGConfBool(const QString &key, bool fallback)
-{
- bool retVal = fallback;
- if (resolveGConf()) {
-#if !defined(GLIB_VERSION_2_36)
- g_type_init();
-#endif
- GConfClient* client = gconf_client_get_default();
- GError *err = 0;
- bool result = gconf_client_get_bool(client, qPrintable(key), &err);
- g_object_unref(client);
- if (!err)
- retVal = result;
- else
- g_error_free (err);
- }
- return retVal;
-}
-
-QString QGtkStylePrivate::getThemeName()
-{
- QString themeName;
- // Read the theme name from GtkSettings
- GtkSettings *settings = QGtkStylePrivate::gtk_settings_get_default();
- gchararray value;
- g_object_get(settings, "gtk-theme-name", &value, NULL);
- themeName = QString::fromUtf8(value);
- g_free(value);
- return themeName;
-}
-
-// Get size of the arrow controls in a GtkSpinButton
-int QGtkStylePrivate::getSpinboxArrowSize() const
-{
- const int MIN_ARROW_WIDTH = 6;
- GtkWidget *spinButton = gtkWidget("GtkSpinButton");
- GtkStyle *style = QGtkStylePrivate::gtk_widget_get_style(spinButton);
- gint size = pango_font_description_get_size (style->font_desc);
- gint arrow_size;
- arrow_size = qMax(PANGO_PIXELS (size), MIN_ARROW_WIDTH) + style->xthickness;
- arrow_size += arrow_size%2 + 1;
- return arrow_size;
-}
-
-
-bool QGtkStylePrivate::isKDE4Session()
-{
- static int version = -1;
- if (version == -1)
- version = qgetenv("KDE_SESSION_VERSION").toInt();
- return (version == 4);
-}
-
-void QGtkStylePrivate::applyCustomPaletteHash()
-{
- QPalette menuPal = gtkWidgetPalette("GtkMenu");
- GdkColor gdkBg = QGtkStylePrivate::gtk_widget_get_style(gtkWidget("GtkMenu"))->bg[GTK_STATE_NORMAL];
- QColor bgColor(gdkBg.red>>8, gdkBg.green>>8, gdkBg.blue>>8);
- menuPal.setBrush(QPalette::Base, bgColor);
- menuPal.setBrush(QPalette::Window, bgColor);
- qApp->setPalette(menuPal, "QMenu");
-
- QPalette toolbarPal = gtkWidgetPalette("GtkToolbar");
- qApp->setPalette(toolbarPal, "QToolBar");
-
- QPalette menuBarPal = gtkWidgetPalette("GtkMenuBar");
- qApp->setPalette(menuBarPal, "QMenuBar");
-}
-
-/*! \internal
- * Returns the gtk Widget that should be used to determine text foreground and background colors.
-*/
-GtkWidget* QGtkStylePrivate::getTextColorWidget() const
-{
- return gtkWidget("GtkEntry");
-}
-
-void QGtkStylePrivate::setupGtkWidget(GtkWidget* widget)
-{
- if (Q_GTK_IS_WIDGET(widget)) {
- GtkWidget *protoLayout = gtkWidgetMap()->value("GtkContainer");
- if (!protoLayout) {
- protoLayout = QGtkStylePrivate::gtk_fixed_new();
- QGtkStylePrivate::gtk_container_add((GtkContainer*)(gtkWidgetMap()->value("GtkWindow")), protoLayout);
- QHashableLatin1Literal widgetPath = QHashableLatin1Literal::fromData(strdup("GtkContainer"));
- gtkWidgetMap()->insert(widgetPath, protoLayout);
- }
- Q_ASSERT(protoLayout);
-
- if (!QGtkStylePrivate::gtk_widget_get_parent(widget) && !QGtkStylePrivate::gtk_widget_is_toplevel(widget))
- QGtkStylePrivate::gtk_container_add((GtkContainer*)(protoLayout), widget);
- QGtkStylePrivate::gtk_widget_realize(widget);
- }
-}
-
-void QGtkStylePrivate::removeWidgetFromMap(const QHashableLatin1Literal &path)
-{
- WidgetMap *map = gtkWidgetMap();
- WidgetMap::iterator it = map->find(path);
- if (it != map->end()) {
- char* keyData = const_cast<char *>(it.key().data());
- map->erase(it);
- free(keyData);
- }
-}
-
-void QGtkStylePrivate::addWidgetToMap(GtkWidget *widget)
-{
- if (Q_GTK_IS_WIDGET(widget)) {
- gtk_widget_realize(widget);
- QHashableLatin1Literal widgetPath = classPath(widget);
-
- removeWidgetFromMap(widgetPath);
- gtkWidgetMap()->insert(widgetPath, widget);
-#ifdef DUMP_GTK_WIDGET_TREE
- qWarning("Inserted Gtk Widget: %s", widgetPath.data());
-#endif
- }
- }
-
-void QGtkStylePrivate::addAllSubWidgets(GtkWidget *widget, gpointer v)
-{
- Q_UNUSED(v);
- addWidgetToMap(widget);
- if (G_TYPE_CHECK_INSTANCE_TYPE ((widget), gtk_container_get_type()))
- gtk_container_forall((GtkContainer*)widget, addAllSubWidgets, NULL);
-}
-
-// Updates window/windowtext palette based on the indicated gtk widget
-QPalette QGtkStylePrivate::gtkWidgetPalette(const QHashableLatin1Literal &gtkWidgetName) const
-{
- GtkWidget *gtkWidget = QGtkStylePrivate::gtkWidget(gtkWidgetName);
- Q_ASSERT(gtkWidget);
- QPalette pal = QApplication::palette();
- GdkColor gdkBg = gtk_widget_get_style(gtkWidget)->bg[GTK_STATE_NORMAL];
- GdkColor gdkText = gtk_widget_get_style(gtkWidget)->fg[GTK_STATE_NORMAL];
- GdkColor gdkDisabledText = gtk_widget_get_style(gtkWidget)->fg[GTK_STATE_INSENSITIVE];
- QColor bgColor(gdkBg.red>>8, gdkBg.green>>8, gdkBg.blue>>8);
- QColor textColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
- QColor disabledTextColor(gdkDisabledText.red>>8, gdkDisabledText.green>>8, gdkDisabledText.blue>>8);
- pal.setBrush(QPalette::Window, bgColor);
- pal.setBrush(QPalette::Button, bgColor);
- pal.setBrush(QPalette::All, QPalette::WindowText, textColor);
- pal.setBrush(QPalette::Disabled, QPalette::WindowText, disabledTextColor);
- pal.setBrush(QPalette::All, QPalette::ButtonText, textColor);
- pal.setBrush(QPalette::Disabled, QPalette::ButtonText, disabledTextColor);
- return pal;
-}
-
-
-void QGtkStyleUpdateScheduler::updateTheme()
-{
- static QString oldTheme(QLS("qt_not_set"));
- QPixmapCache::clear();
-
- QFont font = QGtkStylePrivate::getThemeFont();
- if (QApplication::font() != font)
- qApp->setFont(font);
-
- if (oldTheme != QGtkStylePrivate::getThemeName()) {
- oldTheme = QGtkStylePrivate::getThemeName();
- QPalette newPalette = qApp->style()->standardPalette();
- QApplicationPrivate::setSystemPalette(newPalette);
- QApplication::setPalette(newPalette);
- if (!QGtkStylePrivate::instances.isEmpty()) {
- QGtkStylePrivate::instances.last()->initGtkWidgets();
- QGtkStylePrivate::instances.last()->applyCustomPaletteHash();
- }
- QList<QWidget*> widgets = QApplication::allWidgets();
- // Notify all widgets that size metrics might have changed
- foreach (QWidget *widget, widgets) {
- QEvent e(QEvent::StyleChange);
- QApplication::sendEvent(widget, &e);
- }
- }
- QIconLoader::instance()->updateSystemTheme();
-}
-
-void QGtkStylePrivate::addWidget(GtkWidget *widget)
-{
- if (widget) {
- setupGtkWidget(widget);
- addAllSubWidgets(widget);
- }
-}
-
-
-// Fetch the application font from the pango font description
-// contained in the theme.
-QFont QGtkStylePrivate::getThemeFont()
-{
- QFont font;
- GtkStyle *style = gtkStyle();
- if (style && qApp->desktopSettingsAware())
- {
- PangoFontDescription *gtk_font = style->font_desc;
- font.setPointSizeF((float)(pango_font_description_get_size(gtk_font))/PANGO_SCALE);
-
- QString family = QString::fromLatin1(pango_font_description_get_family(gtk_font));
- if (!family.isEmpty())
- font.setFamily(family);
-
- const int weight = pango_font_description_get_weight(gtk_font);
- font.setWeight(QPlatformFontDatabase::weightFromInteger(weight));
-
- PangoStyle fontstyle = pango_font_description_get_style(gtk_font);
- if (fontstyle == PANGO_STYLE_ITALIC)
- font.setStyle(QFont::StyleItalic);
- else if (fontstyle == PANGO_STYLE_OBLIQUE)
- font.setStyle(QFont::StyleOblique);
- else
- font.setStyle(QFont::StyleNormal);
- }
- return font;
-}
-
-QIcon QGtkStylePrivate::getFilesystemIcon(const QFileInfo &info)
-{
- QIcon icon;
- if (isThemeAvailable() && gnome_vfs_init && gnome_icon_lookup_sync) {
- gnome_vfs_init();
- GtkIconTheme *theme = gtk_icon_theme_get_default();
- QByteArray fileurl = QUrl::fromLocalFile(info.absoluteFilePath()).toEncoded();
- char * icon_name = gnome_icon_lookup_sync(theme,
- NULL,
- fileurl.data(),
- NULL,
- GNOME_ICON_LOOKUP_FLAGS_NONE,
- NULL);
- QString iconName = QString::fromUtf8(icon_name);
- g_free(icon_name);
- if (iconName.startsWith(QLatin1Char('/')))
- return QIcon(iconName);
- return QIcon::fromTheme(iconName);
- }
- return icon;
-}
-
-bool operator==(const QHashableLatin1Literal &l1, const QHashableLatin1Literal &l2)
-{
- return l1.size() == l2.size() || qstrcmp(l1.data(), l2.data()) == 0;
-}
-
-// copied from qHash.cpp
-uint qHash(const QHashableLatin1Literal &key)
-{
- int n = key.size();
- const uchar *p = reinterpret_cast<const uchar *>(key.data());
- uint h = 0;
- uint g;
-
- while (n--) {
- h = (h << 4) + *p++;
- if ((g = (h & 0xf0000000)) != 0)
- h ^= g >> 23;
- h &= ~g;
- }
- return h;
-}
-
-QT_END_NAMESPACE
-
-#endif // !defined(QT_NO_STYLE_GTK)
diff --git a/src/widgets/styles/qgtkstyle_p.h b/src/widgets/styles/qgtkstyle_p.h
deleted file mode 100644
index 3dcd7bf6ef..0000000000
--- a/src/widgets/styles/qgtkstyle_p.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGTKSTYLE_P_H
-#define QGTKSTYLE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <private/qwindowsstyle_p.h>
-#include <QtGui/QPalette>
-#include <QtGui/QFont>
-#include <QtWidgets/QFileDialog>
-
-QT_BEGIN_NAMESPACE
-
-
-#if !defined(QT_NO_STYLE_GTK)
-
-class QPainterPath;
-class QGtkStylePrivate;
-
-class QGtkStyle : public QCommonStyle
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QGtkStyle)
-
-public:
- QGtkStyle();
- QGtkStyle(QGtkStylePrivate &dd);
-
- ~QGtkStyle();
-
- QPalette standardPalette() const Q_DECL_OVERRIDE;
-
- void drawPrimitive(PrimitiveElement element, const QStyleOption *option,
- QPainter *painter, const QWidget *widget) const Q_DECL_OVERRIDE;
- void drawControl(ControlElement control, const QStyleOption *option,
- QPainter *painter, const QWidget *widget) const Q_DECL_OVERRIDE;
- void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option,
- QPainter *painter, const QWidget *widget) const Q_DECL_OVERRIDE;
- void drawItemPixmap(QPainter *painter, const QRect &rect, int alignment,
- const QPixmap &pixmap) const Q_DECL_OVERRIDE;
- void drawItemText(QPainter *painter, const QRect &rect, int alignment, const QPalette &pal,
- bool enabled, const QString& text, QPalette::ColorRole textRole) const Q_DECL_OVERRIDE;
-
- int pixelMetric(PixelMetric metric, const QStyleOption *option = 0,
- const QWidget *widget = 0) const Q_DECL_OVERRIDE;
- int styleHint(StyleHint hint, const QStyleOption *option,
- const QWidget *widget, QStyleHintReturn *returnData) const Q_DECL_OVERRIDE;
-
- QStyle::SubControl hitTestComplexControl(ComplexControl cc, const QStyleOptionComplex *opt,
- const QPoint &pt, const QWidget *w) const Q_DECL_OVERRIDE;
-
- QRect subControlRect(ComplexControl control, const QStyleOptionComplex *option,
- SubControl subControl, const QWidget *widget) const Q_DECL_OVERRIDE;
- QRect subElementRect(SubElement sr, const QStyleOption *opt, const QWidget *w) const Q_DECL_OVERRIDE;
- QRect itemPixmapRect(const QRect &r, int flags, const QPixmap &pixmap) const Q_DECL_OVERRIDE;
-
-
- QSize sizeFromContents(ContentsType type, const QStyleOption *option,
- const QSize &size, const QWidget *widget) const Q_DECL_OVERRIDE;
- QIcon standardIcon(StandardPixmap standardIcon, const QStyleOption *option = 0,
- const QWidget *widget = 0) const Q_DECL_OVERRIDE;
- QPixmap standardPixmap(StandardPixmap sp, const QStyleOption *option,
- const QWidget *widget) const Q_DECL_OVERRIDE;
- QPixmap generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap,
- const QStyleOption *opt) const Q_DECL_OVERRIDE;
-
- void polish(QWidget *widget) Q_DECL_OVERRIDE;
- void polish(QApplication *app) Q_DECL_OVERRIDE;
- void polish(QPalette &palette) Q_DECL_OVERRIDE;
-
- void unpolish(QWidget *widget) Q_DECL_OVERRIDE;
- void unpolish(QApplication *app) Q_DECL_OVERRIDE;
-
- static bool getGConfBool(const QString &key, bool fallback = 0);
- static QString getGConfString(const QString &key, const QString &fallback = QString());
-};
-
-#endif //!defined(QT_NO_STYLE_QGTK)
-
-QT_END_NAMESPACE
-
-#endif //QGTKSTYLE_P_H
diff --git a/src/widgets/styles/qgtkstyle_p_p.h b/src/widgets/styles/qgtkstyle_p_p.h
deleted file mode 100644
index 4cb03ed833..0000000000
--- a/src/widgets/styles/qgtkstyle_p_p.h
+++ /dev/null
@@ -1,449 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGTKSTYLE_P_P_H
-#define QGTKSTYLE_P_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/qglobal.h>
-#if !defined(QT_NO_STYLE_GTK)
-
-#include <QtCore/qstring.h>
-#include <QtCore/qstringbuilder.h>
-#include <QtCore/qcoreapplication.h>
-
-#include <QtWidgets/QFileDialog>
-
-#include <private/qgtkstyle_p.h>
-#include <private/qcommonstyle_p.h>
-#include <private/qgtkglobal_p.h>
-
-#define Q_GTK_IS_WIDGET(widget) widget && G_TYPE_CHECK_INSTANCE_TYPE ((widget), QGtkStylePrivate::gtk_widget_get_type())
-
-QT_BEGIN_NAMESPACE
-
-class QHashableLatin1Literal
-{
-public:
- int size() const { return m_size; }
- const char *data() const { return m_data; }
-
-#ifdef __SUNPRO_CC
- QHashableLatin1Literal(const char* str)
- : m_size(strlen(str)), m_data(str) {}
-#else
- template <int N>
- QHashableLatin1Literal(const char (&str)[N])
- : m_size(N - 1), m_data(str) {}
-#endif
-
- QHashableLatin1Literal(const QHashableLatin1Literal &other)
- : m_size(other.m_size), m_data(other.m_data)
- {}
-
- QHashableLatin1Literal &operator=(const QHashableLatin1Literal &other)
- {
- if (this == &other)
- return *this;
- *const_cast<int *>(&m_size) = other.m_size;
- *const_cast<char **>(&m_data) = const_cast<char *>(other.m_data);
- return *this;
- }
-
- QString toString() const { return QString::fromLatin1(m_data, m_size); }
-
- static QHashableLatin1Literal fromData(const char *str)
- {
- return QHashableLatin1Literal(str, qstrlen(str));
- }
-
-private:
- QHashableLatin1Literal(const char *str, int length)
- : m_size(length), m_data(str)
- {}
-
- const int m_size;
- const char *m_data;
-};
-
-bool operator==(const QHashableLatin1Literal &l1, const QHashableLatin1Literal &l2);
-inline bool operator!=(const QHashableLatin1Literal &l1, const QHashableLatin1Literal &l2) { return !operator==(l1, l2); }
-uint qHash(const QHashableLatin1Literal &key);
-
-QT_END_NAMESPACE
-
-class GConf;
-class GConfClient;
-typedef struct _XDisplay Display;
-
-typedef GConfClient* (*Ptr_gconf_client_get_default)();
-typedef char* (*Ptr_gconf_client_get_string)(GConfClient*, const char*, GError **);
-typedef bool (*Ptr_gconf_client_get_bool)(GConfClient*, const char*, GError **);
-
-typedef void (*Ptr_gtk_init)(int *, char ***);
-typedef GtkWidget* (*Ptr_gtk_window_new) (GtkWindowType);
-typedef GtkStyle* (*Ptr_gtk_style_attach)(GtkStyle *, GdkWindow *);
-typedef void (*Ptr_gtk_widget_destroy) (GtkWidget *);
-typedef void (*Ptr_gtk_widget_realize) (GtkWidget *);
-typedef void (*Ptr_gtk_widget_set_default_direction) (GtkTextDirection);
-typedef void (*Ptr_gtk_widget_modify_color)(GtkWidget *widget, GtkStateType state, const GdkColor *color);
-typedef GtkWidget* (*Ptr_gtk_arrow_new)(GtkArrowType, GtkShadowType);
-typedef GtkWidget* (*Ptr_gtk_menu_item_new_with_label)(const gchar *);
-typedef GtkWidget* (*Ptr_gtk_separator_menu_item_new)(void);
-typedef GtkWidget* (*Ptr_gtk_check_menu_item_new_with_label)(const gchar *);
-typedef GtkWidget* (*Ptr_gtk_menu_bar_new)(void);
-typedef GtkWidget* (*Ptr_gtk_menu_new)(void);
-typedef GtkWidget* (*Ptr_gtk_combo_box_new)(void);
-typedef GtkWidget* (*Ptr_gtk_combo_box_entry_new)(void);
-typedef GtkWidget* (*Ptr_gtk_toolbar_new)(void);
-typedef GtkWidget* (*Ptr_gtk_spin_button_new)(GtkAdjustment*, double, int);
-typedef GtkWidget* (*Ptr_gtk_button_new)(void);
-typedef GtkWidget* (*Ptr_gtk_tool_button_new)(GtkWidget *, const gchar *);
-typedef GtkWidget* (*Ptr_gtk_hbutton_box_new)(void);
-typedef GtkWidget* (*Ptr_gtk_check_button_new)(void);
-typedef GtkWidget* (*Ptr_gtk_radio_button_new)(GSList *);
-typedef GtkWidget* (*Ptr_gtk_notebook_new)(void);
-typedef GtkWidget* (*Ptr_gtk_progress_bar_new)(void);
-typedef GtkWidget* (*Ptr_gtk_hscale_new)(GtkAdjustment*);
-typedef GtkWidget* (*Ptr_gtk_vscale_new)(GtkAdjustment*);
-typedef GtkWidget* (*Ptr_gtk_hscrollbar_new)(GtkAdjustment*);
-typedef GtkWidget* (*Ptr_gtk_vscrollbar_new)(GtkAdjustment*);
-typedef GtkWidget* (*Ptr_gtk_scrolled_window_new)(GtkAdjustment*, GtkAdjustment*);
-typedef gchar* (*Ptr_gtk_check_version)(guint, guint, guint);
-typedef GtkToolItem* (*Ptr_gtk_separator_tool_item_new) (void);
-typedef GtkWidget* (*Ptr_gtk_entry_new)(void);
-typedef GtkWidget* (*Ptr_gtk_tree_view_new)(void);
-typedef GtkTreeViewColumn* (*Ptr_gtk_tree_view_get_column)(GtkTreeView *, gint);
-typedef GtkWidget* (*Ptr_gtk_frame_new)(const gchar *);
-typedef GtkWidget* (*Ptr_gtk_expander_new)(const gchar*);
-typedef GtkWidget* (*Ptr_gtk_statusbar_new)(void);
-typedef GtkSettings* (*Ptr_gtk_settings_get_default)(void);
-typedef GtkAdjustment* (*Ptr_gtk_range_get_adjustment)(GtkRange *);
-typedef void (*Ptr_gtk_range_set_adjustment)(GtkRange *, GtkAdjustment *);
-typedef void (*Ptr_gtk_range_set_inverted)(GtkRange*, bool);
-typedef void (*Ptr_gtk_container_add)(GtkContainer *container, GtkWidget *widget);
-typedef GtkIconSet* (*Ptr_gtk_icon_factory_lookup_default) (const gchar*);
-typedef GtkIconTheme* (*Ptr_gtk_icon_theme_get_default) (void);
-typedef GtkStyle* (*Ptr_gtk_widget_get_style)(GtkWidget *);
-typedef void (*Ptr_gtk_widget_style_get)(GtkWidget *, const gchar *first_property_name, ...);
-typedef GtkTreeViewColumn* (*Ptr_gtk_tree_view_column_new)(void);
-typedef GtkWidget* (*Ptr_gtk_fixed_new)(void);
-typedef GdkPixbuf* (*Ptr_gtk_icon_set_render_icon)(GtkIconSet *, GtkStyle *, GtkTextDirection, GtkStateType, GtkIconSize, GtkWidget *,const char *);
-typedef void (*Ptr_gtk_tree_view_append_column) (GtkTreeView*, GtkTreeViewColumn*);
-typedef void (*Ptr_gtk_adjustment_configure) (GtkAdjustment *, double, double, double, double, double, double);
-typedef GtkAdjustment* (*Ptr_gtk_adjustment_new) (double, double, double, double, double, double);
-typedef void (*Ptr_gtk_menu_item_set_submenu) (GtkMenuItem *, GtkWidget *);
-typedef void (*Ptr_gtk_container_forall) (GtkContainer *, GtkCallback, gpointer);
-typedef void (*Ptr_gtk_widget_size_allocate) (GtkWidget *, GtkAllocation*);
-typedef void (*Ptr_gtk_widget_size_request) (GtkWidget *widget, GtkRequisition *requisition);
-typedef void (*Ptr_gtk_widget_set_direction) (GtkWidget *, GtkTextDirection);
-typedef void (*Ptr_gtk_widget_path) (GtkWidget *, guint *, gchar **, gchar**);
-
-typedef void (*Ptr_gtk_toolbar_insert) (GtkToolbar *toolbar, GtkToolItem *item, int pos);
-typedef void (*Ptr_gtk_menu_shell_append)(GtkMenuShell *, GtkWidget *);
-typedef GType (*Ptr_gtk_container_get_type) (void);
-typedef GType (*Ptr_gtk_window_get_type) (void);
-typedef GType (*Ptr_gtk_widget_get_type) (void);
-typedef GtkWidget* (*Ptr_gtk_widget_get_parent) (GtkWidget *);
-typedef gboolean (*Ptr_gtk_widget_is_toplevel) (GtkWidget *);
-typedef GtkWidget* (*Ptr_gtk_widget_get_toplevel) (GtkWidget *);
-typedef GtkStyle* (*Ptr_gtk_rc_get_style_by_paths) (GtkSettings *, const char *, const char *, GType);
-typedef gint (*Ptr_pango_font_description_get_size) (const PangoFontDescription *);
-typedef PangoWeight (*Ptr_pango_font_description_get_weight) (const PangoFontDescription *);
-typedef const char* (*Ptr_pango_font_description_get_family) (const PangoFontDescription *);
-typedef PangoStyle (*Ptr_pango_font_description_get_style) (const PangoFontDescription *desc);
-typedef void (*Ptr_gtk_border_free)(GtkBorder *);
-typedef void (*Ptr_gtk_widget_get_allocation) (GtkWidget*, GtkAllocation*);
-typedef void (*Ptr_gtk_widget_set_allocation) (GtkWidget*, const GtkAllocation*);
-
-typedef void (*Ptr_gtk_widget_set_can_default) (GtkWidget*, gboolean);
-typedef void (*Ptr_gtk_window_set_default) (GtkWindow*, GtkWidget*);
-
-typedef GdkEvent* (*Ptr_gdk_event_new) (GdkEventType);
-typedef void (*Ptr_gdk_event_free) (GdkEvent*);
-typedef void (*Ptr_gtk_widget_send_focus_change) (GtkWidget*, GdkEvent*);
-
-typedef guchar* (*Ptr_gdk_pixbuf_get_pixels) (const GdkPixbuf *pixbuf);
-typedef int (*Ptr_gdk_pixbuf_get_width) (const GdkPixbuf *pixbuf);
-typedef void (*Ptr_gdk_color_free) (const GdkColor *);
-typedef int (*Ptr_gdk_pixbuf_get_height) (const GdkPixbuf *pixbuf);
-typedef GdkPixbuf* (*Ptr_gdk_pixbuf_new) (GdkColorspace colorspace, gboolean has_alpha,
- int bits_per_sample, int width, int height);
-typedef void (*Ptr_gdk_pixbuf_unref)(GdkPixbuf *);
-typedef void (*Ptr_gdk_x11_window_set_user_time) (GdkWindow *window, guint32);
-typedef XID (*Ptr_gdk_x11_drawable_get_xid) (GdkDrawable *);
-typedef Display* (*Ptr_gdk_x11_drawable_get_xdisplay) ( GdkDrawable *);
-
-
-QT_BEGIN_NAMESPACE
-
-class QGtkPainter;
-class QGtkStylePrivate;
-
-class QGtkStyleFilter : public QObject
-{
-public:
- QGtkStyleFilter(QGtkStylePrivate* sp)
- : stylePrivate(sp)
- {}
-private:
- QGtkStylePrivate* stylePrivate;
- bool eventFilter(QObject *obj, QEvent *e) Q_DECL_OVERRIDE;
-};
-
-typedef enum {
- GNOME_ICON_LOOKUP_FLAGS_NONE = 0,
- GNOME_ICON_LOOKUP_FLAGS_EMBEDDING_TEXT = 1<<0,
- GNOME_ICON_LOOKUP_FLAGS_SHOW_SMALL_IMAGES_AS_THEMSELVES = 1<<1,
- GNOME_ICON_LOOKUP_FLAGS_ALLOW_SVG_AS_THEMSELVES = 1<<2
-} GnomeIconLookupFlags;
-
-typedef enum {
- GNOME_ICON_LOOKUP_RESULT_FLAGS_NONE = 0,
- GNOME_ICON_LOOKUP_RESULT_FLAGS_THUMBNAIL = 1<<0
-} GnomeIconLookupResultFlags;
-
-struct GnomeThumbnailFactory;
-typedef gboolean (*Ptr_gnome_vfs_init) (void);
-typedef char* (*Ptr_gnome_icon_lookup_sync) (
- GtkIconTheme *icon_theme,
- GnomeThumbnailFactory *,
- const char *file_uri,
- const char *custom_icon,
- GnomeIconLookupFlags flags,
- GnomeIconLookupResultFlags *result);
-
-class QGtkStylePrivate : public QCommonStylePrivate
-{
- Q_DECLARE_PUBLIC(QGtkStyle)
-public:
- QGtkStylePrivate();
- ~QGtkStylePrivate();
-
- QGtkStyleFilter filter;
-
- static QGtkPainter* gtkPainter(QPainter *painter = 0);
- static GtkWidget* gtkWidget(const QHashableLatin1Literal &path);
- static GtkStyle* gtkStyle(const QHashableLatin1Literal &path = QHashableLatin1Literal("GtkWindow"));
- static void gtkWidgetSetFocus(GtkWidget *widget, bool focus);
-
- virtual void resolveGtk() const;
- virtual void initGtkMenu() const;
- virtual void initGtkTreeview() const;
- virtual void initGtkWidgets() const;
-
- static void cleanupGtkWidgets();
-
- static bool isKDE4Session();
- void applyCustomPaletteHash();
- static QFont getThemeFont();
- static bool isThemeAvailable() { return gtkStyle() != 0; }
-
- static bool getGConfBool(const QString &key, bool fallback = 0);
- static QString getGConfString(const QString &key, const QString &fallback = QString());
-
- static QString getThemeName();
- virtual int getSpinboxArrowSize() const;
-
- static QIcon getFilesystemIcon(const QFileInfo &);
-
- static Ptr_gtk_container_forall gtk_container_forall;
- static Ptr_gtk_init gtk_init;
- static Ptr_gtk_style_attach gtk_style_attach;
- static Ptr_gtk_window_new gtk_window_new;
- static Ptr_gtk_widget_destroy gtk_widget_destroy;
- static Ptr_gtk_widget_realize gtk_widget_realize;
- static Ptr_gtk_widget_set_default_direction gtk_widget_set_default_direction;
- static Ptr_gtk_widget_modify_color gtk_widget_modify_fg;
- static Ptr_gtk_widget_modify_color gtk_widget_modify_bg;
- static Ptr_gtk_menu_item_new_with_label gtk_menu_item_new_with_label;
- static Ptr_gtk_arrow_new gtk_arrow_new;
- static Ptr_gtk_check_menu_item_new_with_label gtk_check_menu_item_new_with_label;
- static Ptr_gtk_menu_bar_new gtk_menu_bar_new;
- static Ptr_gtk_menu_new gtk_menu_new;
- static Ptr_gtk_expander_new gtk_expander_new;
- static Ptr_gtk_button_new gtk_button_new;
- static Ptr_gtk_tool_button_new gtk_tool_button_new;
- static Ptr_gtk_hbutton_box_new gtk_hbutton_box_new;
- static Ptr_gtk_check_button_new gtk_check_button_new;
- static Ptr_gtk_radio_button_new gtk_radio_button_new;
- static Ptr_gtk_spin_button_new gtk_spin_button_new;
- static Ptr_gtk_separator_tool_item_new gtk_separator_tool_item_new;
- static Ptr_gtk_toolbar_insert gtk_toolbar_insert;
- static Ptr_gtk_frame_new gtk_frame_new;
- static Ptr_gtk_statusbar_new gtk_statusbar_new;
- static Ptr_gtk_entry_new gtk_entry_new;
- static Ptr_gtk_hscale_new gtk_hscale_new;
- static Ptr_gtk_vscale_new gtk_vscale_new;
- static Ptr_gtk_hscrollbar_new gtk_hscrollbar_new;
- static Ptr_gtk_vscrollbar_new gtk_vscrollbar_new;
- static Ptr_gtk_scrolled_window_new gtk_scrolled_window_new;
- static Ptr_gtk_notebook_new gtk_notebook_new;
- static Ptr_gtk_toolbar_new gtk_toolbar_new;
- static Ptr_gtk_tree_view_new gtk_tree_view_new;
- static Ptr_gtk_tree_view_get_column gtk_tree_view_get_column;
- static Ptr_gtk_combo_box_new gtk_combo_box_new;
- static Ptr_gtk_combo_box_entry_new gtk_combo_box_entry_new;
- static Ptr_gtk_progress_bar_new gtk_progress_bar_new;
- static Ptr_gtk_container_add gtk_container_add;
- static Ptr_gtk_menu_shell_append gtk_menu_shell_append;
- static Ptr_gtk_range_get_adjustment gtk_range_get_adjustment;
- static Ptr_gtk_range_set_adjustment gtk_range_set_adjustment;
- static Ptr_gtk_range_set_inverted gtk_range_set_inverted;
- static Ptr_gtk_icon_factory_lookup_default gtk_icon_factory_lookup_default;
- static Ptr_gtk_icon_theme_get_default gtk_icon_theme_get_default;
- static Ptr_gtk_widget_get_style gtk_widget_get_style;
- static Ptr_gtk_widget_style_get gtk_widget_style_get;
- static Ptr_gtk_icon_set_render_icon gtk_icon_set_render_icon;
- static Ptr_gtk_fixed_new gtk_fixed_new;
- static Ptr_gtk_tree_view_column_new gtk_tree_view_column_new;
- static Ptr_gtk_tree_view_append_column gtk_tree_view_append_column;
- static Ptr_gtk_adjustment_configure gtk_adjustment_configure;
- static Ptr_gtk_adjustment_new gtk_adjustment_new;
- static Ptr_gtk_menu_item_set_submenu gtk_menu_item_set_submenu;
- static Ptr_gtk_settings_get_default gtk_settings_get_default;
- static Ptr_gtk_separator_menu_item_new gtk_separator_menu_item_new;
- static Ptr_gtk_widget_size_allocate gtk_widget_size_allocate;
- static Ptr_gtk_widget_size_request gtk_widget_size_request;
- static Ptr_gtk_widget_set_direction gtk_widget_set_direction;
- static Ptr_gtk_widget_path gtk_widget_path;
- static Ptr_gtk_container_get_type gtk_container_get_type;
- static Ptr_gtk_window_get_type gtk_window_get_type;
- static Ptr_gtk_widget_get_type gtk_widget_get_type;
- static Ptr_gtk_widget_get_parent gtk_widget_get_parent;
- static Ptr_gtk_widget_is_toplevel gtk_widget_is_toplevel;
- static Ptr_gtk_widget_get_toplevel gtk_widget_get_toplevel;
- static Ptr_gtk_rc_get_style_by_paths gtk_rc_get_style_by_paths;
- static Ptr_gtk_check_version gtk_check_version;
- static Ptr_gtk_border_free gtk_border_free;
- static Ptr_gtk_widget_get_allocation gtk_widget_get_allocation;
- static Ptr_gtk_widget_set_allocation gtk_widget_set_allocation;
- static Ptr_gtk_widget_set_can_default gtk_widget_set_can_default;
- static Ptr_gtk_window_set_default gtk_window_set_default;
-
- static Ptr_gdk_event_new gdk_event_new;
- static Ptr_gdk_event_free gdk_event_free;
- static Ptr_gtk_widget_send_focus_change gtk_widget_send_focus_change;
-
- static Ptr_pango_font_description_get_size pango_font_description_get_size;
- static Ptr_pango_font_description_get_weight pango_font_description_get_weight;
- static Ptr_pango_font_description_get_family pango_font_description_get_family;
- static Ptr_pango_font_description_get_style pango_font_description_get_style;
-
- static Ptr_gdk_pixbuf_get_pixels gdk_pixbuf_get_pixels;
- static Ptr_gdk_pixbuf_get_width gdk_pixbuf_get_width;
- static Ptr_gdk_pixbuf_get_height gdk_pixbuf_get_height;
- static Ptr_gdk_pixbuf_new gdk_pixbuf_new;
- static Ptr_gdk_pixbuf_unref gdk_pixbuf_unref;
- static Ptr_gdk_color_free gdk_color_free;
- static Ptr_gdk_x11_window_set_user_time gdk_x11_window_set_user_time;
- static Ptr_gdk_x11_drawable_get_xid gdk_x11_drawable_get_xid;
- static Ptr_gdk_x11_drawable_get_xdisplay gdk_x11_drawable_get_xdisplay;
-
- static Ptr_gconf_client_get_default gconf_client_get_default;
- static Ptr_gconf_client_get_string gconf_client_get_string;
- static Ptr_gconf_client_get_bool gconf_client_get_bool;
-
- static Ptr_gnome_icon_lookup_sync gnome_icon_lookup_sync;
- static Ptr_gnome_vfs_init gnome_vfs_init;
-
- virtual QPalette gtkWidgetPalette(const QHashableLatin1Literal &gtkWidgetName) const;
-
-protected:
- typedef QHash<QHashableLatin1Literal, GtkWidget*> WidgetMap;
-
- static inline void destroyWidgetMap()
- {
- cleanupGtkWidgets();
- delete widgetMap;
- widgetMap = 0;
- }
-
- static inline WidgetMap *gtkWidgetMap()
- {
- if (!widgetMap) {
- widgetMap = new WidgetMap();
- qAddPostRoutine(destroyWidgetMap);
- }
- return widgetMap;
- }
-
- static QStringList extract_filter(const QString &rawFilter);
-
- virtual GtkWidget* getTextColorWidget() const;
- static void setupGtkWidget(GtkWidget* widget);
- static void addWidgetToMap(GtkWidget* widget);
- static void addAllSubWidgets(GtkWidget *widget, gpointer v = 0);
- static void addWidget(GtkWidget *widget);
- static void removeWidgetFromMap(const QHashableLatin1Literal &path);
-
- virtual void init();
-
- enum {
- menuItemFrame = 2, // menu item frame width
- menuItemHMargin = 3, // menu item hor text margin
- menuArrowHMargin = 6, // menu arrow horizontal margin
- menuItemVMargin = 2, // menu item ver text margin
- menuRightBorder = 15, // right border on menus
- menuCheckMarkWidth = 12 // checkmarks width on menus
- };
-
-private:
- static QList<QGtkStylePrivate *> instances;
- static WidgetMap *widgetMap;
- friend class QGtkStyleUpdateScheduler;
-};
-
-// Helper to ensure that we have polished all our gtk widgets
-// before updating our own palettes
-class QGtkStyleUpdateScheduler : public QObject
-{
- Q_OBJECT
-public slots:
- void updateTheme();
-};
-
-QT_END_NAMESPACE
-
-#endif // !QT_NO_STYLE_GTK
-#endif // QGTKSTYLE_P_P_H
diff --git a/src/widgets/styles/qmacstyle_mac.mm b/src/widgets/styles/qmacstyle_mac.mm
index 7fc4093e81..7b270d9241 100644
--- a/src/widgets/styles/qmacstyle_mac.mm
+++ b/src/widgets/styles/qmacstyle_mac.mm
@@ -36,7 +36,7 @@
.../doc/src/qstyles.qdoc.
*/
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include "qmacstyle_mac_p.h"
#include "qmacstyle_mac_p_p.h"
@@ -118,14 +118,13 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(NotificationReceiver);
- (void)scrollBarStyleDidChange:(NSNotification *)notification
{
Q_UNUSED(notification);
+
+ // purge destroyed scroll bars:
+ QMacStylePrivate::scrollBars.removeAll(QPointer<QObject>());
+
QEvent event(QEvent::StyleChange);
- QMutableVectorIterator<QPointer<QObject> > it(QMacStylePrivate::scrollBars);
- while (it.hasNext()) {
- if (!it.next())
- it.remove();
- else
- QCoreApplication::sendEvent(it.value(), &event);
- }
+ for (const auto &o : QMacStylePrivate::scrollBars)
+ QCoreApplication::sendEvent(o, &event);
}
@end
@@ -1110,6 +1109,17 @@ static void qt_drawFocusRingOnPath(CGContextRef cg, NSBezierPath *focusRingPath)
CGContextRestoreGState(cg);
}
+QAquaWidgetSize QMacStylePrivate::effectiveAquaSizeConstrain(const QStyleOption *option,
+ const QWidget *widg,
+ QStyle::ContentsType ct,
+ QSize szHint, QSize *insz) const
+{
+ QAquaWidgetSize sz = aquaSizeConstrain(option, widg, ct, szHint, insz);
+ if (sz == QAquaSizeUnknown)
+ return QAquaSizeLarge;
+ return sz;
+}
+
QAquaWidgetSize QMacStylePrivate::aquaSizeConstrain(const QStyleOption *option, const QWidget *widg,
QStyle::ContentsType ct, QSize szHint, QSize *insz) const
{
@@ -2475,32 +2485,9 @@ int QMacStyle::pixelMetric(PixelMetric metric, const QStyleOption *opt, const QW
ret = 0;
break;
case PM_TitleBarHeight:
- if (const QStyleOptionTitleBar *tb = qstyleoption_cast<const QStyleOptionTitleBar *>(opt)) {
- HIThemeWindowDrawInfo wdi;
- wdi.version = qt_mac_hitheme_version;
- wdi.state = kThemeStateActive;
- wdi.windowType = QtWinType;
- if (tb->titleBarState)
- wdi.attributes = kThemeWindowHasFullZoom | kThemeWindowHasCloseBox
- | kThemeWindowHasCollapseBox;
- else if (tb->titleBarFlags & Qt::WindowSystemMenuHint)
- wdi.attributes = kThemeWindowHasCloseBox;
- else
- wdi.attributes = 0;
- wdi.titleHeight = tb->rect.height();
- wdi.titleWidth = tb->rect.width();
- QCFType<HIShapeRef> region;
- HIRect hirect = qt_hirectForQRect(tb->rect);
- if (hirect.size.width <= 0)
- hirect.size.width = 100;
- if (hirect.size.height <= 0)
- hirect.size.height = 30;
-
- HIThemeGetWindowShape(&hirect, &wdi, kWindowTitleBarRgn, &region);
- HIRect rect;
- ptrHIShapeGetBounds(region, &rect);
- ret = int(rect.size.height);
- }
+ // Always use NSTitledWindowMask since we never need any other type of window here
+ ret = int([NSWindow frameRectForContentRect:NSZeroRect
+ styleMask:NSTitledWindowMask].size.height);
break;
case PM_TabBarTabVSpace:
ret = 4;
@@ -2530,29 +2517,10 @@ int QMacStyle::pixelMetric(PixelMetric metric, const QStyleOption *opt, const QW
}
break;
case PM_ScrollBarExtent: {
- if ([NSScroller preferredScrollerStyle] == NSScrollerStyleOverlay) {
- switch (d->aquaSizeConstrain(opt, widget)) {
- case QAquaSizeUnknown:
- case QAquaSizeLarge:
- ret = QSysInfo::macVersion() >= QSysInfo::MV_10_8 ? 16 : 9;
- break;
- case QAquaSizeMini:
- case QAquaSizeSmall:
- ret = QSysInfo::macVersion() >= QSysInfo::MV_10_8 ? 14 : 7;
- break;
- }
- break;
- }
- switch (d->aquaSizeConstrain(opt, widget)) {
- case QAquaSizeUnknown:
- case QAquaSizeLarge:
- GetThemeMetric(kThemeMetricScrollBarWidth, &ret);
- break;
- case QAquaSizeMini:
- case QAquaSizeSmall:
- GetThemeMetric(kThemeMetricSmallScrollBarWidth, &ret);
- break;
- }
+ const QAquaWidgetSize size = d->effectiveAquaSizeConstrain(opt, widget);
+ ret = static_cast<SInt32>([NSScroller
+ scrollerWidthForControlSize:static_cast<NSControlSize>(size)
+ scrollerStyle:[NSScroller preferredScrollerStyle]]);
break; }
case PM_IndicatorHeight: {
switch (d->aquaSizeConstrain(opt, widget)) {
diff --git a/src/widgets/styles/qmacstyle_mac_p_p.h b/src/widgets/styles/qmacstyle_mac_p_p.h
index 33818568ec..8e138ea887 100644
--- a/src/widgets/styles/qmacstyle_mac_p_p.h
+++ b/src/widgets/styles/qmacstyle_mac_p_p.h
@@ -172,6 +172,9 @@ public:
QAquaWidgetSize aquaSizeConstrain(const QStyleOption *option, const QWidget *widg,
QStyle::ContentsType ct = QStyle::CT_CustomBase,
QSize szHint=QSize(-1, -1), QSize *insz = 0) const;
+ QAquaWidgetSize effectiveAquaSizeConstrain(const QStyleOption *option, const QWidget *widg,
+ QStyle::ContentsType ct = QStyle::CT_CustomBase,
+ QSize szHint=QSize(-1, -1), QSize *insz = 0) const;
void getSliderInfo(QStyle::ComplexControl cc, const QStyleOptionSlider *slider,
HIThemeTrackDrawInfo *tdi, const QWidget *needToRemoveMe) const;
inline int animateSpeed(Animates) const { return 33; }
diff --git a/src/plugins/styles/bb10style/qpixmapstyle.cpp b/src/widgets/styles/qpixmapstyle.cpp
index 3090c42959..b2f2e91d5f 100644
--- a/src/plugins/styles/bb10style/qpixmapstyle.cpp
+++ b/src/widgets/styles/qpixmapstyle.cpp
@@ -1,9 +1,11 @@
/***************************************************************************
**
** Copyright (C) 2014 BlackBerry Limited. All rights reserved.
+** Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com
+** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
-** This file is part of the plugins of the Qt Toolkit.
+** This file is part of the QtWidgets module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL21$
** Commercial License Usage
@@ -31,7 +33,8 @@
**
****************************************************************************/
-#include "qpixmapstyle.h"
+#include "qpixmapstyle_p.h"
+#include "qpixmapstyle_p_p.h"
#include <QDebug>
#include <QTextEdit>
@@ -55,15 +58,47 @@
QT_BEGIN_NAMESPACE
-QPixmapStyle::QPixmapStyle() :
- QCommonStyle()
+/*!
+ \class QPixmapStyle
+ \brief The QPixmapStyle class provides mechanism for writing pixmap based styles.
+
+ \since 5.7
+ \ingroup appearance
+ \inmodule QtWidgets
+ \internal
+
+ This is a convenience class that enables the implementation of a widget style using
+ pixmaps, on the same fashion used by the \l{BorderImage} QML type.
+
+ In order to style a QWidget, one simply needs to call QPixmapStyle::addDescriptor()
+ or QPixmapStyle::addPixmap() with the id of the component to be styled, the path of
+ the image to be used, the margins and the tiling rules:
+
+ \snippet styles/qcustompixmapstyle.cpp 0
+
+ \sa QStyle, QCommonStyle
+*/
+
+/*!
+ \internal
+
+ Constructs a QPixmapStyle object.
+*/
+QPixmapStyle::QPixmapStyle()
+ : QCommonStyle(*new QPixmapStylePrivate)
{
}
+/*!
+ Destroys the QPixmapStyle object.
+*/
QPixmapStyle::~QPixmapStyle()
{
}
+/*!
+ \reimp
+*/
void QPixmapStyle::polish(QApplication *application)
{
QCommonStyle::polish(application);
@@ -72,13 +107,21 @@ void QPixmapStyle::polish(QApplication *application)
#endif
}
+/*!
+ \reimp
+*/
void QPixmapStyle::polish(QPalette &palette)
{
palette = proxy()->standardPalette();
}
+/*!
+ \reimp
+*/
void QPixmapStyle::polish(QWidget *widget)
{
+ Q_D(QPixmapStyle);
+
// Don't fill the interior of the QTextEdit
if (qobject_cast<QTextEdit*>(widget)) {
QPalette p = widget->palette();
@@ -91,7 +134,7 @@ void QPixmapStyle::polish(QWidget *widget)
pb->setAlignment(Qt::AlignCenter);
// Change the font size if needed, as it's used to compute the minimum size
QFont font = pb->font();
- font.setPixelSize(m_descriptors.value(PB_HBackground).size.height()/2);
+ font.setPixelSize(d->descriptors.value(PB_HBackground).size.height()/2);
pb->setFont(font);
}
@@ -116,8 +159,8 @@ void QPixmapStyle::polish(QWidget *widget)
QFrame *frame = qobject_cast<QFrame*>(list->parent());
if (frame) {
- const Descriptor &desc = m_descriptors.value(DD_PopupDown);
- const Pixmap &pix = m_pixmaps.value(DD_ItemSeparator);
+ const QPixmapStyleDescriptor &desc = d->descriptors.value(DD_PopupDown);
+ const QPixmapStylePixmap &pix = d->pixmaps.value(DD_ItemSeparator);
frame->setContentsMargins(pix.margins.left(), desc.margins.top(),
pix.margins.right(), desc.margins.bottom());
frame->setAttribute(Qt::WA_TranslucentBackground);
@@ -147,6 +190,17 @@ void QPixmapStyle::polish(QWidget *widget)
QCommonStyle::polish(widget);
}
+/*!
+ \reimp
+*/
+void QPixmapStyle::unpolish(QApplication *application)
+{
+ QCommonStyle::unpolish(application);
+}
+
+/*!
+ \reimp
+*/
void QPixmapStyle::unpolish(QWidget *widget)
{
if (qobject_cast<QSlider*>(widget) ||
@@ -163,6 +217,9 @@ void QPixmapStyle::unpolish(QWidget *widget)
QCommonStyle::unpolish(widget);
}
+/*!
+ \reimp
+*/
void QPixmapStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option,
QPainter *painter, const QWidget *widget) const
{
@@ -199,9 +256,14 @@ void QPixmapStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *o
}
}
+/*!
+ \reimp
+*/
void QPixmapStyle::drawControl(ControlElement element, const QStyleOption *option,
QPainter *painter, const QWidget *widget) const
{
+ Q_D(const QPixmapStyle);
+
switch (element) {
case CE_ProgressBarGroove:
drawProgressBarBackground(option, painter, widget);
@@ -215,8 +277,8 @@ void QPixmapStyle::drawControl(ControlElement element, const QStyleOption *optio
case CE_ShapedFrame:
// NOTE: This will break if the private API of QComboBox changes drastically
if (qstrcmp(widget->metaObject()->className(),"QComboBoxPrivateContainer") == 0) {
- const Descriptor &desc = m_descriptors.value(DD_PopupDown);
- const Pixmap &pix = m_pixmaps.value(DD_ItemSeparator);
+ const QPixmapStyleDescriptor &desc = d->descriptors.value(DD_PopupDown);
+ const QPixmapStylePixmap &pix = d->pixmaps.value(DD_ItemSeparator);
QRect rect = option->rect;
rect.adjust(-pix.margins.left(), -desc.margins.top(),
pix.margins.right(), desc.margins.bottom());
@@ -232,6 +294,9 @@ void QPixmapStyle::drawControl(ControlElement element, const QStyleOption *optio
}
}
+/*!
+ \reimp
+*/
void QPixmapStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComplex *option,
QPainter *painter, const QWidget *widget) const
{
@@ -250,6 +315,9 @@ void QPixmapStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCompl
}
}
+/*!
+ \reimp
+*/
QSize QPixmapStyle::sizeFromContents(ContentsType type, const QStyleOption *option,
const QSize &contentsSize, const QWidget *widget) const
{
@@ -272,14 +340,19 @@ QSize QPixmapStyle::sizeFromContents(ContentsType type, const QStyleOption *opti
return QCommonStyle::sizeFromContents(type, option, contentsSize, widget);
}
+/*!
+ \reimp
+*/
QRect QPixmapStyle::subElementRect(SubElement element, const QStyleOption *option,
const QWidget *widget) const
{
+ Q_D(const QPixmapStyle);
+
switch (element) {
case SE_LineEditContents:
{
QRect rect = QCommonStyle::subElementRect(element, option, widget);
- const Descriptor &desc = m_descriptors.value(LE_Enabled);
+ const QPixmapStyleDescriptor &desc = d->descriptors.value(LE_Enabled);
rect.adjust(desc.margins.left(), desc.margins.top(),
-desc.margins.right(), -desc.margins.bottom());
rect = visualRect(option->direction, option->rect, rect);
@@ -291,6 +364,9 @@ QRect QPixmapStyle::subElementRect(SubElement element, const QStyleOption *optio
return QCommonStyle::subElementRect(element, option, widget);
}
+/*!
+ \reimp
+*/
QRect QPixmapStyle::subControlRect(ComplexControl cc, const QStyleOptionComplex *option,
SubControl sc, const QWidget *widget) const
{
@@ -305,45 +381,51 @@ QRect QPixmapStyle::subControlRect(ComplexControl cc, const QStyleOptionComplex
return QCommonStyle::subControlRect(cc, option, sc, widget);
}
+/*!
+ \reimp
+*/
int QPixmapStyle::pixelMetric(PixelMetric metric, const QStyleOption *option,
const QWidget *widget) const
{
+ Q_D(const QPixmapStyle);
+
switch (metric) {
case PM_ButtonShiftHorizontal:
case PM_ButtonShiftVertical:
return 0;
case PM_DefaultFrameWidth:
if (qobject_cast<const QTextEdit*>(widget)) {
- const Descriptor &desc = m_descriptors.value(LE_Enabled);
+ const QPixmapStyleDescriptor &desc = d->descriptors.value(LE_Enabled);
return qMax(qMax(desc.margins.left(), desc.margins.right()),
qMax(desc.margins.top(), desc.margins.bottom()));
}
return 0;
case PM_IndicatorWidth:
- return m_pixmaps.value(CB_Enabled).pixmap.width();
+ return d->pixmaps.value(CB_Enabled).pixmap.width();
case PM_IndicatorHeight:
- return m_pixmaps.value(CB_Enabled).pixmap.height();
+ return d->pixmaps.value(CB_Enabled).pixmap.height();
case PM_CheckBoxLabelSpacing:
{
- const Pixmap &pix = m_pixmaps.value(CB_Enabled);
+ const QPixmapStylePixmap &pix = d->pixmaps.value(CB_Enabled);
return qMax(qMax(pix.margins.left(), pix.margins.right()),
qMax(pix.margins.top(), pix.margins.bottom()));
}
case PM_ExclusiveIndicatorWidth:
- return m_pixmaps.value(RB_Enabled).pixmap.width();
+ return d->pixmaps.value(RB_Enabled).pixmap.width();
case PM_ExclusiveIndicatorHeight:
- return m_pixmaps.value(RB_Enabled).pixmap.height();
+ return d->pixmaps.value(RB_Enabled).pixmap.height();
case PM_RadioButtonLabelSpacing:
{
- const Pixmap &pix = m_pixmaps.value(RB_Enabled);
+ const QPixmapStylePixmap &pix = d->pixmaps.value(RB_Enabled);
return qMax(qMax(pix.margins.left(), pix.margins.right()),
qMax(pix.margins.top(), pix.margins.bottom()));
}
case PM_SliderThickness:
if (const QStyleOptionSlider *slider =
qstyleoption_cast<const QStyleOptionSlider*>(option)) {
- const Descriptor desc = m_descriptors.value(slider->orientation == Qt::Horizontal
- ? SG_HEnabled : SG_VEnabled);
+ const QPixmapStyleDescriptor desc =
+ d->descriptors.value(slider->orientation == Qt::Horizontal
+ ? SG_HEnabled : SG_VEnabled);
return slider->orientation == Qt::Horizontal
? desc.size.height() : desc.size.width();
}
@@ -351,8 +433,9 @@ int QPixmapStyle::pixelMetric(PixelMetric metric, const QStyleOption *option,
case PM_SliderControlThickness:
if (const QStyleOptionSlider *slider =
qstyleoption_cast<const QStyleOptionSlider*>(option)) {
- const Pixmap pix = m_pixmaps.value(slider->orientation == Qt::Horizontal
- ? SH_HEnabled : SH_VEnabled);
+ const QPixmapStylePixmap pix =
+ d->pixmaps.value(slider->orientation == Qt::Horizontal
+ ? SH_HEnabled : SH_VEnabled);
return slider->orientation == Qt::Horizontal
? pix.pixmap.height() : pix.pixmap.width();
}
@@ -360,8 +443,9 @@ int QPixmapStyle::pixelMetric(PixelMetric metric, const QStyleOption *option,
case PM_SliderLength:
if (const QStyleOptionSlider *slider =
qstyleoption_cast<const QStyleOptionSlider*>(option)) {
- const Pixmap pix = m_pixmaps.value(slider->orientation == Qt::Horizontal
- ? SH_HEnabled : SH_VEnabled);
+ const QPixmapStylePixmap pix =
+ d->pixmaps.value(slider->orientation == Qt::Horizontal
+ ? SH_HEnabled : SH_VEnabled);
return slider->orientation == Qt::Horizontal
? pix.pixmap.width() : pix.pixmap.height();
}
@@ -369,8 +453,9 @@ int QPixmapStyle::pixelMetric(PixelMetric metric, const QStyleOption *option,
case PM_ScrollBarExtent:
if (const QStyleOptionSlider *slider =
qstyleoption_cast<const QStyleOptionSlider*>(option)) {
- const Descriptor desc = m_descriptors.value(slider->orientation == Qt::Horizontal
- ? SB_Horizontal : SB_Vertical);
+ const QPixmapStyleDescriptor desc =
+ d->descriptors.value(slider->orientation == Qt::Horizontal
+ ? SB_Horizontal : SB_Vertical);
return slider->orientation == Qt::Horizontal
? desc.size.height() : desc.size.width();
}
@@ -383,6 +468,9 @@ int QPixmapStyle::pixelMetric(PixelMetric metric, const QStyleOption *option,
return QCommonStyle::pixelMetric(metric, option, widget);
}
+/*!
+ \reimp
+*/
int QPixmapStyle::styleHint(StyleHint hint, const QStyleOption *option,
const QWidget *widget, QStyleHintReturn *returnData) const
{
@@ -397,6 +485,9 @@ int QPixmapStyle::styleHint(StyleHint hint, const QStyleOption *option,
return QCommonStyle::styleHint(hint, option, widget, returnData);
}
+/*!
+ \reimp
+*/
QStyle::SubControl QPixmapStyle::hitTestComplexControl(QStyle::ComplexControl control,
const QStyleOptionComplex *option,
const QPoint &pos,
@@ -413,8 +504,13 @@ QStyle::SubControl QPixmapStyle::hitTestComplexControl(QStyle::ComplexControl co
return sc;
}
+/*!
+ \reimp
+*/
bool QPixmapStyle::eventFilter(QObject *watched, QEvent *event)
{
+ Q_D(QPixmapStyle);
+
if (QSlider *slider = qobject_cast<QSlider*>(watched)) {
switch (event->type()) {
case QEvent::MouseButtonPress:
@@ -453,7 +549,7 @@ bool QPixmapStyle::eventFilter(QObject *watched, QEvent *event)
int yPopup = widget->geometry().top();
int yCombo = widget->parentWidget()->mapToGlobal(QPoint(0, 0)).y();
QRect geom = widget->geometry();
- const Descriptor &desc = m_descriptors.value(DD_ButtonEnabled);
+ const QPixmapStyleDescriptor &desc = d->descriptors.value(DD_ButtonEnabled);
const bool up = yPopup < yCombo;
geom.moveTop(geom.top() + (up ? desc.margins.top() : -desc.margins.bottom()));
widget->setGeometry(geom);
@@ -465,12 +561,28 @@ bool QPixmapStyle::eventFilter(QObject *watched, QEvent *event)
return QCommonStyle::eventFilter(watched, event);
}
+/*!
+ \fn void QPixmapStyle::addDescriptor(QPixmapStyle::ControlDescriptor control, const QString &fileName, QMargins margins, QTileRules tileRules)
+
+ Associates the pixmap having the given \a fileName with the given \a control. The \a margins parameter describe the boundaries
+ of the pixmap's top-left, top-right, bottom-left and bottom-right corners, as well as the left, right, top and bottorm segments
+ and the middle. The \a tileRules parameter describes how QPixmapStyle is supposed to handle the scaling of the center of the pixmap.
+
+ Use QPixmapStyle::addPixmap() for controls that are not resizable.
+
+ \snippet styles/qcustompixmapstyle.cpp 1
+
+ \sa addPixmap, copyDescriptor
+
+*/
void QPixmapStyle::addDescriptor(QPixmapStyle::ControlDescriptor control, const QString &fileName,
QMargins margins, QTileRules tileRules)
{
- Descriptor desc;
+ Q_D(QPixmapStyle);
+ QPixmapStyleDescriptor desc;
QImage image(fileName);
+
if (image.isNull())
return;
@@ -479,46 +591,87 @@ void QPixmapStyle::addDescriptor(QPixmapStyle::ControlDescriptor control, const
desc.tileRules = tileRules;
desc.size = image.size();
- m_descriptors[control] = desc;
+ d->descriptors[control] = desc;
}
+/*!
+ \fn void QPixmapStyle::copyDescriptor(QPixmapStyle::ControlDescriptor source, QPixmapStyle::ControlDescriptor dest)
+
+ Copies the data associated with the \a source descriptor to the \a dest descriptor.
+
+ \snippet styles/qcustompixmapstyle.cpp 2
+*/
+
void QPixmapStyle::copyDescriptor(QPixmapStyle::ControlDescriptor source,
QPixmapStyle::ControlDescriptor dest)
{
- m_descriptors[dest] = m_descriptors.value(source);
+ Q_D(QPixmapStyle);
+ d->descriptors[dest] = d->descriptors.value(source);
}
+/*!
+ \fn void QPixmapStyle::drawCachedPixmap(QPixmapStyle::ControlDescriptor control, const QRect &rect, QPainter *painter) const
+
+ Draws the image associated with the current \a control on the given \a rect using the given \a painter.
+*/
void QPixmapStyle::drawCachedPixmap(QPixmapStyle::ControlDescriptor control, const QRect &rect,
QPainter *p) const
{
- if (!m_descriptors.contains(control))
+ Q_D(const QPixmapStyle);
+ if (!d->descriptors.contains(control))
return;
- const Descriptor &desc = m_descriptors.value(control);
- const QPixmap pix = getCachedPixmap(control, desc, rect.size());
+ const QPixmapStyleDescriptor &desc = d->descriptors.value(control);
+ const QPixmap pix = d->getCachedPixmap(control, desc, rect.size());
Q_ASSERT(!pix.isNull());
p->drawPixmap(rect, pix);
}
+/*!
+ \fn void QPixmapStyle::addPixmap(ControlPixmap control, const QString &fileName, QMargins margins)
+
+ Use this function to style statically sized controls such as check boxes.
+
+ \sa addDescriptor, copyPixmap
+*/
void QPixmapStyle::addPixmap(ControlPixmap control, const QString &fileName,
QMargins margins)
{
- Pixmap pix;
+ Q_D(QPixmapStyle);
+ QPixmapStylePixmap pix;
QPixmap image(fileName);
+
if (image.isNull())
return;
pix.pixmap = image;
pix.margins = margins;
- m_pixmaps[control] = pix;
+ d->pixmaps[control] = pix;
}
+/*
+ \fn void QPixmapStyle::copyPixmap(QPixmapStyle::ControlPixmap source, QPixmapStyle::ControlPixmap dest)
+
+ Copies the data associated with the \a source pixmap to the \a dest pixmap.
+
+ \sa addPixmap, addDescriptor, copyDescriptor
+*/
void QPixmapStyle::copyPixmap(QPixmapStyle::ControlPixmap source, QPixmapStyle::ControlPixmap dest)
{
- m_pixmaps[dest] = m_pixmaps.value(source);
+ Q_D(QPixmapStyle);
+ d->pixmaps[dest] = d->pixmaps.value(source);
}
+/*!
+ \internal
+
+ Constructs a QPixmapStyle object.
+*/
+QPixmapStyle::QPixmapStyle(QPixmapStylePrivate &dd)
+ : QCommonStyle(dd)
+{}
+
void QPixmapStyle::drawPushButton(const QStyleOption *option,
QPainter *painter, const QWidget *) const
{
@@ -559,6 +712,8 @@ void QPixmapStyle::drawTextEdit(const QStyleOption *option,
void QPixmapStyle::drawCheckBox(const QStyleOption *option,
QPainter *painter, const QWidget *) const
{
+ Q_D(const QPixmapStyle);
+
const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton*>(option);
const bool down = button->state & State_Sunken;
@@ -570,12 +725,14 @@ void QPixmapStyle::drawCheckBox(const QStyleOption *option,
control = on ? (down ? CB_PressedChecked : CB_Checked) : (down ? CB_Pressed : CB_Enabled);
else
control = on ? CB_DisabledChecked : CB_Disabled;
- painter->drawPixmap(button->rect, m_pixmaps.value(control).pixmap);
+ painter->drawPixmap(button->rect, d->pixmaps.value(control).pixmap);
}
void QPixmapStyle::drawRadioButton(const QStyleOption *option,
QPainter *painter, const QWidget *) const
{
+ Q_D(const QPixmapStyle);
+
const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton*>(option);
const bool down = button->state & State_Sunken;
@@ -587,12 +744,14 @@ void QPixmapStyle::drawRadioButton(const QStyleOption *option,
control = on ? RB_Checked : (down ? RB_Pressed : RB_Enabled);
else
control = on ? RB_DisabledChecked : RB_Disabled;
- painter->drawPixmap(button->rect, m_pixmaps.value(control).pixmap);
+ painter->drawPixmap(button->rect, d->pixmaps.value(control).pixmap);
}
void QPixmapStyle::drawPanelItemViewItem(const QStyleOption *option, QPainter *painter,
const QWidget *widget) const
{
+ Q_D(const QPixmapStyle);
+
ControlPixmap cp = ID_Separator;
ControlDescriptor cd = ID_Selected;
@@ -601,7 +760,7 @@ void QPixmapStyle::drawPanelItemViewItem(const QStyleOption *option, QPainter *p
cd = DD_ItemSelected;
}
- QPixmap pix = m_pixmaps.value(cp).pixmap;
+ QPixmap pix = d->pixmaps.value(cp).pixmap;
QRect rect = option->rect;
rect.setBottom(rect.top() + pix.height()-1);
painter->drawPixmap(rect, pix);
@@ -676,6 +835,8 @@ void QPixmapStyle::drawProgressBarFill(const QStyleOption *option,
void QPixmapStyle::drawSlider(const QStyleOptionComplex *option,
QPainter *painter, const QWidget *widget) const
{
+ Q_D(const QPixmapStyle);
+
const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider*>(option);
if (!slider)
return;
@@ -704,8 +865,8 @@ void QPixmapStyle::drawSlider(const QStyleOptionComplex *option,
control = enabled ? (pressed ? SG_VActivePressed : SG_VActiveEnabled )
: SG_VActiveDisabled;
}
- const Descriptor &desc = m_descriptors.value(control);
- const QPixmap pix = getCachedPixmap(control, desc, groove.size());
+ const QPixmapStyleDescriptor &desc = d->descriptors.value(control);
+ const QPixmap pix = d->getCachedPixmap(control, desc, groove.size());
if (!pix.isNull()) {
groove.setRight(orient == Qt::Horizontal
? handle.center().x() : handle.center().y());
@@ -720,7 +881,7 @@ void QPixmapStyle::drawSlider(const QStyleOptionComplex *option,
pix = enabled ? (pressed ? SH_HPressed : SH_HEnabled) : SH_HDisabled;
else
pix = enabled ? (pressed ? SH_VPressed : SH_VEnabled) : SH_VDisabled;
- painter->drawPixmap(handle, m_pixmaps.value(pix).pixmap);
+ painter->drawPixmap(handle, d->pixmaps.value(pix).pixmap);
}
}
}
@@ -728,6 +889,8 @@ void QPixmapStyle::drawSlider(const QStyleOptionComplex *option,
void QPixmapStyle::drawComboBox(const QStyleOptionComplex *option,
QPainter *painter, const QWidget *widget) const
{
+ Q_D(const QPixmapStyle);
+
const bool enabled = option->state & State_Enabled;
const bool pressed = widget->property("_pixmapstyle_combobox_pressed").toBool();
const bool opened = option->state & State_On;
@@ -739,7 +902,7 @@ void QPixmapStyle::drawComboBox(const QStyleOptionComplex *option,
ControlPixmap cp = enabled ? (opened ? DD_ArrowOpen
: (pressed ? DD_ArrowPressed : DD_ArrowEnabled))
: DD_ArrowDisabled;
- Pixmap pix = m_pixmaps.value(cp);
+ QPixmapStylePixmap pix = d->pixmaps.value(cp);
QRect rect = comboBoxSubControlRect(option, SC_ComboBoxArrow, widget);
painter->drawPixmap(rect, pix.pixmap);
}
@@ -764,7 +927,9 @@ QSize QPixmapStyle::pushButtonSizeFromContents(const QStyleOption *option,
const QSize &contentsSize,
const QWidget *widget) const
{
- const Descriptor &desc = m_descriptors.value(PB_Enabled);
+ Q_D(const QPixmapStyle);
+
+ const QPixmapStyleDescriptor &desc = d->descriptors.value(PB_Enabled);
const int bm = proxy()->pixelMetric(PM_ButtonMargin, option, widget);
int w = contentsSize.width();
@@ -772,25 +937,29 @@ QSize QPixmapStyle::pushButtonSizeFromContents(const QStyleOption *option,
w += desc.margins.left() + desc.margins.right() + bm;
h += desc.margins.top() + desc.margins.bottom() + bm;
- return computeSize(desc, w, h);
+ return d->computeSize(desc, w, h);
}
QSize QPixmapStyle::lineEditSizeFromContents(const QStyleOption *,
const QSize &contentsSize, const QWidget *) const
{
- const Descriptor &desc = m_descriptors.value(LE_Enabled);
+ Q_D(const QPixmapStyle);
+
+ const QPixmapStyleDescriptor &desc = d->descriptors.value(LE_Enabled);
const int border = 2 * proxy()->pixelMetric(PM_DefaultFrameWidth);
int w = contentsSize.width() + border + desc.margins.left() + desc.margins.right();
int h = contentsSize.height() + border + desc.margins.top() + desc.margins.bottom();
- return computeSize(desc, w, h);
+ return d->computeSize(desc, w, h);
}
QSize QPixmapStyle::progressBarSizeFromContents(const QStyleOption *option,
const QSize &contentsSize,
const QWidget *widget) const
{
+ Q_D(const QPixmapStyle);
+
bool vertical = false;
if (const QStyleOptionProgressBar *pb =
qstyleoption_cast<const QStyleOptionProgressBar *>(option)) {
@@ -798,10 +967,10 @@ QSize QPixmapStyle::progressBarSizeFromContents(const QStyleOption *option,
}
QSize result = QCommonStyle::sizeFromContents(CT_Slider, option, contentsSize, widget);
if (vertical) {
- const Descriptor desc = m_descriptors.value(PB_VBackground);
+ const QPixmapStyleDescriptor desc = d->descriptors.value(PB_VBackground);
return QSize(desc.size.height(), result.height());
} else {
- const Descriptor desc = m_descriptors.value(PB_HBackground);
+ const QPixmapStyleDescriptor desc = d->descriptors.value(PB_HBackground);
return QSize(result.width(), desc.size.height());
}
}
@@ -810,13 +979,15 @@ QSize QPixmapStyle::sliderSizeFromContents(const QStyleOption *option,
const QSize &contentsSize,
const QWidget *widget) const
{
+ Q_D(const QPixmapStyle);
+
const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider*>(option);
if (!slider)
return QSize();
QSize result = QCommonStyle::sizeFromContents(CT_Slider, option, contentsSize, widget);
- const Descriptor desc = m_descriptors.value(slider->orientation == Qt::Horizontal
+ const QPixmapStyleDescriptor desc = d->descriptors.value(slider->orientation == Qt::Horizontal
? SG_HEnabled : SG_VEnabled);
if (slider->orientation == Qt::Horizontal)
@@ -829,16 +1000,20 @@ QSize QPixmapStyle::comboBoxSizeFromContents(const QStyleOption *option,
const QSize &contentsSize,
const QWidget *widget) const
{
- const Descriptor &desc = m_descriptors.value(DD_ButtonEnabled);
+ Q_D(const QPixmapStyle);
+
+ const QPixmapStyleDescriptor &desc = d->descriptors.value(DD_ButtonEnabled);
QSize result = QCommonStyle::sizeFromContents(CT_ComboBox, option, contentsSize, widget);
- return computeSize(desc, result.width(), result.height());
+ return d->computeSize(desc, result.width(), result.height());
}
QSize QPixmapStyle::itemViewSizeFromContents(const QStyleOption *option,
const QSize &contentsSize,
const QWidget *widget) const
{
+ Q_D(const QPixmapStyle);
+
QSize size = QCommonStyle::sizeFromContents(CT_ItemViewItem, option, contentsSize, widget);
ControlPixmap cp = ID_Separator;
@@ -848,8 +1023,8 @@ QSize QPixmapStyle::itemViewSizeFromContents(const QStyleOption *option,
cd = DD_ItemSelected;
}
- const Descriptor &desc = m_descriptors.value(cd);
- const Pixmap &pix = m_pixmaps.value(cp);
+ const QPixmapStyleDescriptor &desc = d->descriptors.value(cd);
+ const QPixmapStylePixmap &pix = d->pixmaps.value(cp);
size.setHeight(qMax(size.height(),
desc.size.height() + pix.pixmap.height()));
return size;
@@ -858,9 +1033,11 @@ QSize QPixmapStyle::itemViewSizeFromContents(const QStyleOption *option,
QRect QPixmapStyle::comboBoxSubControlRect(const QStyleOptionComplex *option,
QStyle::SubControl sc, const QWidget *) const
{
+ Q_D(const QPixmapStyle);
+
QRect r = option->rect; // Default size
- const Pixmap &pix = m_pixmaps.value(DD_ArrowEnabled);
- const Descriptor &desc = m_descriptors.value(DD_ButtonEnabled);
+ const QPixmapStylePixmap &pix = d->pixmaps.value(DD_ArrowEnabled);
+ const QPixmapStyleDescriptor &desc = d->descriptors.value(DD_ButtonEnabled);
switch (sc) {
case SC_ComboBoxArrow:
@@ -933,7 +1110,7 @@ QRect QPixmapStyle::scrollBarSubControlRect(const QStyleOptionComplex *option,
return QRect();
}
-static QPixmap scale(int w, int h, const QPixmap &pixmap, const QPixmapStyle::Descriptor &desc)
+QPixmap QPixmapStylePrivate::scale(int w, int h, const QPixmap &pixmap, const QPixmapStyleDescriptor &desc)
{
QPixmap result(w, h);
{
@@ -947,12 +1124,15 @@ static QPixmap scale(int w, int h, const QPixmap &pixmap, const QPixmapStyle::De
return result;
}
-QPixmap QPixmapStyle::getCachedPixmap(ControlDescriptor control, const Descriptor &desc,
- const QSize &size) const
+QPixmap QPixmapStylePrivate::getCachedPixmap(QPixmapStyle::ControlDescriptor control,
+ const QPixmapStyleDescriptor &desc,
+ const QSize &size) const
{
+ Q_Q(const QPixmapStyle);
+
const QString sizeString = QString::number(size.width()) % QLatin1Char('*')
% QString::number(size.height());
- const QString key = QLatin1String(metaObject()->className()) % QString::number(control)
+ const QString key = QLatin1String(q->metaObject()->className()) % QString::number(control)
% QLatin1Char('@') % sizeString;
QPixmap result;
@@ -965,7 +1145,7 @@ QPixmap QPixmapStyle::getCachedPixmap(ControlDescriptor control, const Descripto
return result;
}
-QSize QPixmapStyle::computeSize(const QPixmapStyle::Descriptor &desc, int width, int height) const
+QSize QPixmapStylePrivate::computeSize(const QPixmapStyleDescriptor &desc, int width, int height) const
{
if (desc.tileRules.horizontal != Qt::RepeatTile)
width = qMax(width, desc.size.width());
diff --git a/src/plugins/styles/bb10style/qpixmapstyle.h b/src/widgets/styles/qpixmapstyle_p.h
index 3f35e79f23..4f5d27c285 100644
--- a/src/plugins/styles/bb10style/qpixmapstyle.h
+++ b/src/widgets/styles/qpixmapstyle_p.h
@@ -1,9 +1,11 @@
/***************************************************************************
**
** Copyright (C) 2014 BlackBerry Limited. All rights reserved.
+** Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com
+** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
-** This file is part of the plugins of the Qt Toolkit.
+** This file is part of the QtWidgets module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL21$
** Commercial License Usage
@@ -34,30 +36,31 @@
#ifndef QPIXMAPSTYLE_H
#define QPIXMAPSTYLE_H
-#include <QCommonStyle>
-#include <QString>
-#include <QPixmap>
-#include <QMargins>
-#include <QTileRules>
-#include <QHash>
-#include <QPainter>
+#include <QtWidgets/QCommonStyle>
+#include <QtWidgets/QTileRules>
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
QT_BEGIN_NAMESPACE
-class QPixmapStyle : public QCommonStyle
+class QPixmapStylePrivate;
+
+class Q_WIDGETS_EXPORT QPixmapStyle : public QCommonStyle
{
Q_OBJECT
public:
- struct Descriptor {
- QString fileName;
- QSize size;
- QMargins margins;
- QTileRules tileRules;
- };
-
enum ControlDescriptor {
- BG_Background=0,
+ BG_Background,
LE_Enabled, // QLineEdit
LE_Disabled,
LE_Focused,
@@ -96,10 +99,6 @@ public:
SB_Vertical
};
- struct Pixmap {
- QPixmap pixmap;
- QMargins margins;
- };
enum ControlPixmap {
CB_Enabled, // QCheckBox
CB_Checked,
@@ -130,35 +129,35 @@ public:
QPixmapStyle();
~QPixmapStyle();
- void polish(QApplication *application);
- void polish(QPalette &palette);
- void polish(QWidget *widget);
- void unpolish(QWidget *widget);
+ void polish(QApplication *application) Q_DECL_OVERRIDE;
+ void polish(QPalette &palette) Q_DECL_OVERRIDE;
+ void polish(QWidget *widget) Q_DECL_OVERRIDE;
+ void unpolish(QApplication *application) Q_DECL_OVERRIDE;
+ void unpolish(QWidget *widget) Q_DECL_OVERRIDE;
void drawPrimitive(PrimitiveElement element, const QStyleOption *option,
- QPainter *painter, const QWidget *widget = 0) const;
+ QPainter *painter, const QWidget *widget = Q_NULLPTR) const Q_DECL_OVERRIDE;
void drawControl(ControlElement element, const QStyleOption *option,
- QPainter *painter, const QWidget *widget = 0) const;
+ QPainter *painter, const QWidget *widget = Q_NULLPTR) const Q_DECL_OVERRIDE;
void drawComplexControl(ComplexControl cc, const QStyleOptionComplex *option,
- QPainter *painter, const QWidget *widget=0) const;
+ QPainter *painter, const QWidget *widget=0) const Q_DECL_OVERRIDE;
QSize sizeFromContents(ContentsType type, const QStyleOption *option,
- const QSize &contentsSize, const QWidget *widget = 0) const;
+ const QSize &contentsSize, const QWidget *widget = Q_NULLPTR) const Q_DECL_OVERRIDE;
QRect subElementRect(SubElement element, const QStyleOption *option,
- const QWidget *widget = 0) const;
+ const QWidget *widget = Q_NULLPTR) const Q_DECL_OVERRIDE;
QRect subControlRect(ComplexControl cc, const QStyleOptionComplex *option,
- SubControl sc, const QWidget *widget = 0) const;
+ SubControl sc, const QWidget *widget = Q_NULLPTR) const Q_DECL_OVERRIDE;
- int pixelMetric(PixelMetric metric, const QStyleOption *option = 0,
- const QWidget *widget = 0) const;
+ int pixelMetric(PixelMetric metric, const QStyleOption *option = Q_NULLPTR,
+ const QWidget *widget = Q_NULLPTR) const Q_DECL_OVERRIDE;
int styleHint(StyleHint hint, const QStyleOption *option,
- const QWidget *widget, QStyleHintReturn *returnData) const;
+ const QWidget *widget, QStyleHintReturn *returnData) const Q_DECL_OVERRIDE;
SubControl hitTestComplexControl(ComplexControl control, const QStyleOptionComplex *option,
- const QPoint &pos, const QWidget *widget) const;
+ const QPoint &pos, const QWidget *widget) const Q_DECL_OVERRIDE;
- bool eventFilter(QObject *watched, QEvent *event);
+ bool eventFilter(QObject *watched, QEvent *event) Q_DECL_OVERRIDE;
-protected:
void addDescriptor(ControlDescriptor control, const QString &fileName,
QMargins margins = QMargins(),
QTileRules tileRules = QTileRules(Qt::RepeatTile, Qt::RepeatTile));
@@ -169,6 +168,7 @@ protected:
QMargins margins = QMargins());
void copyPixmap(ControlPixmap source, ControlPixmap dest);
+protected:
void drawPushButton(const QStyleOption *option,
QPainter *painter, const QWidget *widget) const;
void drawLineEdit(const QStyleOption *option,
@@ -207,20 +207,16 @@ protected:
QSize itemViewSizeFromContents(const QStyleOption *option,
const QSize &contentsSize, const QWidget *widget) const;
- QRect comboBoxSubControlRect(const QStyleOptionComplex *option,
- SubControl sc, const QWidget *widget) const;
- QRect scrollBarSubControlRect(const QStyleOptionComplex *option,
- SubControl sc, const QWidget *widget) const;
+ QRect comboBoxSubControlRect(const QStyleOptionComplex *option, QPixmapStyle::SubControl sc,
+ const QWidget *widget) const;
+ QRect scrollBarSubControlRect(const QStyleOptionComplex *option, QPixmapStyle::SubControl sc,
+ const QWidget *widget) const;
-private:
- QPixmap getCachedPixmap(ControlDescriptor control,
- const Descriptor &desc, const QSize &size) const;
-
- QSize computeSize(const Descriptor &desc, int width, int height) const;
+protected:
+ QPixmapStyle(QPixmapStylePrivate &dd);
private:
- QHash<ControlDescriptor, Descriptor> m_descriptors;
- QHash<ControlPixmap, Pixmap> m_pixmaps;
+ Q_DECLARE_PRIVATE(QPixmapStyle)
};
QT_END_NAMESPACE
diff --git a/src/widgets/styles/qpixmapstyle_p_p.h b/src/widgets/styles/qpixmapstyle_p_p.h
new file mode 100644
index 0000000000..6fb274d3a5
--- /dev/null
+++ b/src/widgets/styles/qpixmapstyle_p_p.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the QtWidgets module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPIXMAPSTYLE_P_H
+#define QPIXMAPSTYLE_P_H
+
+#include "qpixmapstyle_p.h"
+#include "qcommonstyle_p.h"
+
+QT_BEGIN_NAMESPACE
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of qapplication_*.cpp, qwidget*.cpp and qfiledialog.cpp. This header
+// file may change from version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+struct QPixmapStyleDescriptor
+{
+ QString fileName;
+ QSize size;
+ QMargins margins;
+ QTileRules tileRules;
+};
+
+struct QPixmapStylePixmap
+{
+ QPixmap pixmap;
+ QMargins margins;
+};
+
+class QPixmapStylePrivate : public QCommonStylePrivate
+{
+ Q_DECLARE_PUBLIC(QPixmapStyle)
+
+public:
+ QHash<QPixmapStyle::ControlDescriptor, QPixmapStyleDescriptor> descriptors;
+ QHash<QPixmapStyle::ControlPixmap, QPixmapStylePixmap> pixmaps;
+
+ static QPixmap scale(int w, int h, const QPixmap &pixmap, const QPixmapStyleDescriptor &desc);
+
+ QPixmap getCachedPixmap(QPixmapStyle::ControlDescriptor control,
+ const QPixmapStyleDescriptor &desc,
+ const QSize &size) const;
+
+ QSize computeSize(const QPixmapStyleDescriptor &desc, int width, int height) const;
+};
+
+QT_END_NAMESPACE
+
+#endif // QPIXMAPSTYLE_P_H
diff --git a/src/widgets/styles/qstyle.cpp b/src/widgets/styles/qstyle.cpp
index 02c420e55c..9bca11b992 100644
--- a/src/widgets/styles/qstyle.cpp
+++ b/src/widgets/styles/qstyle.cpp
@@ -691,7 +691,9 @@ void QStyle::drawItemPixmap(QPainter *painter, const QRect &rect, int alignment,
\value PE_PanelToolBar The panel for a toolbar.
\value PE_PanelTipLabel The panel for a tip label.
\value PE_FrameTabBarBase The frame that is drawn for a tab bar, ususally drawn for a tab bar that isn't part of a tab widget.
- \value PE_IndicatorTabTear An indicator that a tab is partially scrolled out of the visible tab bar when there are many tabs.
+ \value PE_IndicatorTabTear Deprecated. Use \l{PE_IndicatorTabTearLeft} instead.
+ \value PE_IndicatorTabTearLeft An indicator that a tab is partially scrolled out on the left side of the visible tab bar when there are many tabs.
+ \value PE_IndicatorTabTearRight An indicator that a tab is partially scrolled out on the right side of the visible tab bar when there are many tabs.
\value PE_IndicatorColumnViewArrow An arrow in a QColumnView.
\value PE_Widget A plain QWidget.
@@ -1057,7 +1059,12 @@ void QStyle::drawItemPixmap(QPainter *painter, const QRect &rect, int alignment,
\value SE_ItemViewItemCheckIndicator Area for a view item's check mark.
- \value SE_TabBarTearIndicator Area for the tear indicator on a tab bar with scroll arrows.
+ \value SE_TabBarTearIndicator Deprecated. Use SE_TabBarTearIndicatorLeft instead.
+ \value SE_TabBarTearIndicatorLeft Area for the tear indicator on the left side of a tab bar with scroll arrows.
+ \value SE_TabBarTearIndicatorRight Area for the tear indicator on the right side of a tab bar with scroll arrows.
+
+ \value SE_TabBarScrollLeftButton Area for the scroll left button on a tab bar with scroll buttons.
+ \value SE_TabBarScrollRightButton Area for the scroll right button on a tab bar with scroll buttons.
\value SE_TreeViewDisclosureItem Area for the actual disclosure item in a tree branch.
diff --git a/src/widgets/styles/qstyle.h b/src/widgets/styles/qstyle.h
index 1e9d15c993..dad93ec0fc 100644
--- a/src/widgets/styles/qstyle.h
+++ b/src/widgets/styles/qstyle.h
@@ -134,7 +134,7 @@ public:
PE_FrameGroupBox,
PE_FrameLineEdit,
PE_FrameMenu,
- PE_FrameStatusBar, // obsolete
+ PE_FrameStatusBar, // ### Qt 6: remove
PE_FrameStatusBarItem = PE_FrameStatusBar,
PE_FrameTabWidget,
PE_FrameWindow,
@@ -155,7 +155,7 @@ public:
PE_IndicatorArrowUp,
PE_IndicatorBranch,
PE_IndicatorButtonDropDown,
- PE_IndicatorViewItemCheck,
+ PE_IndicatorViewItemCheck, // ### Qt 6: remove
PE_IndicatorItemViewItemCheck = PE_IndicatorViewItemCheck,
PE_IndicatorCheckBox,
PE_IndicatorDockWidgetResizeHandle,
@@ -171,6 +171,7 @@ public:
PE_IndicatorToolBarSeparator,
PE_PanelTipLabel,
PE_IndicatorTabTear,
+ PE_IndicatorTabTearLeft = PE_IndicatorTabTear,
PE_PanelScrollAreaCorner,
PE_Widget,
@@ -186,6 +187,8 @@ public:
PE_IndicatorTabClose,
PE_PanelMenu,
+ PE_IndicatorTabTearRight,
+
// do not add any values below/greater this
PE_CustomBase = 0xf000000
};
@@ -298,10 +301,11 @@ public:
SE_TabWidgetLeftCorner,
SE_TabWidgetRightCorner,
- SE_ViewItemCheckIndicator,
+ SE_ViewItemCheckIndicator, // ### Qt 6: remove
SE_ItemViewItemCheckIndicator = SE_ViewItemCheckIndicator,
SE_TabBarTearIndicator,
+ SE_TabBarTearIndicatorLeft = SE_TabBarTearIndicator,
SE_TreeViewDisclosureItem,
@@ -341,6 +345,10 @@ public:
SE_ToolBarHandle,
+ SE_TabBarScrollLeftButton,
+ SE_TabBarScrollRightButton,
+ SE_TabBarTearIndicatorRight,
+
// do not add any values below/greater than this
SE_CustomBase = 0xf0000000
};
@@ -491,9 +499,9 @@ public:
PM_DialogButtonsButtonHeight,
PM_MdiSubWindowFrameWidth,
- PM_MDIFrameWidth = PM_MdiSubWindowFrameWidth, //obsolete
+ PM_MDIFrameWidth = PM_MdiSubWindowFrameWidth, // ### Qt 6: remove
PM_MdiSubWindowMinimizedWidth,
- PM_MDIMinimizedWidth = PM_MdiSubWindowMinimizedWidth, //obsolete
+ PM_MDIMinimizedWidth = PM_MdiSubWindowMinimizedWidth, // ### Qt 6: remove
PM_HeaderMargin,
PM_HeaderMarkSize,
@@ -511,9 +519,9 @@ public:
PM_SpinBoxSliderHeight,
- PM_DefaultTopLevelMargin,
- PM_DefaultChildMargin,
- PM_DefaultLayoutSpacing,
+ PM_DefaultTopLevelMargin, // ### Qt 6: remove
+ PM_DefaultChildMargin, // ### Qt 6: remove
+ PM_DefaultLayoutSpacing, // ### Qt 6: remove
PM_ToolBarIconSize,
PM_ListViewIconSize,
@@ -631,7 +639,7 @@ public:
SH_ComboBox_Popup,
SH_TitleBar_NoBorder,
SH_Slider_StopMouseOverSlider,
- SH_ScrollBar_StopMouseOverSlider = SH_Slider_StopMouseOverSlider, // obsolete
+ SH_ScrollBar_StopMouseOverSlider = SH_Slider_StopMouseOverSlider, // ### Qt 6: remove
SH_BlinkCursorWhenTextSelected,
SH_RichText_FullWidthSelection,
SH_Menu_Scrollable,
diff --git a/src/widgets/styles/qstylefactory.cpp b/src/widgets/styles/qstylefactory.cpp
index 520e303d93..f651521cbd 100644
--- a/src/widgets/styles/qstylefactory.cpp
+++ b/src/widgets/styles/qstylefactory.cpp
@@ -44,9 +44,6 @@
#include "qandroidstyle_p.h"
#endif
#endif
-#ifndef QT_NO_STYLE_GTK
-#include "qgtkstyle_p.h"
-#endif
#ifndef QT_NO_STYLE_WINDOWSXP
#include "qwindowsxpstyle_p.h"
#endif
@@ -86,7 +83,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader,
The valid keys can be retrieved using the keys()
function. Typically they include "windows" and "fusion".
- Depending on the platform, "windowsxp", "windowsvista", "gtk"
+ Depending on the platform, "windowsxp", "windowsvista"
and "macintosh" may be available.
Note that keys are case insensitive.
@@ -143,11 +140,6 @@ QStyle *QStyleFactory::create(const QString& key)
ret = new QAndroidStyle;
else
#endif
-#ifndef QT_NO_STYLE_GTK
- if (style == QLatin1String("gtk") || style == QLatin1String("gtk+"))
- ret = new QGtkStyle;
- else
-#endif
#ifndef QT_NO_STYLE_MAC
if (style.startsWith(QLatin1String("macintosh"))) {
ret = new QMacStyle;
@@ -210,10 +202,6 @@ QStringList QStyleFactory::keys()
if (!list.contains(QLatin1String("Android")))
list << QLatin1String("Android");
#endif
-#ifndef QT_NO_STYLE_GTK
- if (!list.contains(QLatin1String("GTK+")))
- list << QLatin1String("GTK+");
-#endif
#ifndef QT_NO_STYLE_FUSION
if (!list.contains(QLatin1String("Fusion")))
list << QLatin1String("Fusion");
diff --git a/src/widgets/styles/qstyleoption.h b/src/widgets/styles/qstyleoption.h
index 9fd693d033..726bcd59d5 100644
--- a/src/widgets/styles/qstyleoption.h
+++ b/src/widgets/styles/qstyleoption.h
@@ -131,8 +131,8 @@ protected:
Q_DECLARE_OPERATORS_FOR_FLAGS(QStyleOptionFrame::FrameFeatures)
-typedef QStyleOptionFrame QStyleOptionFrameV2;
-typedef QStyleOptionFrame QStyleOptionFrameV3;
+typedef Q_DECL_DEPRECATED QStyleOptionFrame QStyleOptionFrameV2;
+typedef Q_DECL_DEPRECATED QStyleOptionFrame QStyleOptionFrameV3;
#ifndef QT_NO_TABWIDGET
class Q_WIDGETS_EXPORT QStyleOptionTabWidgetFrame : public QStyleOption
@@ -158,7 +158,7 @@ protected:
QStyleOptionTabWidgetFrame(int version);
};
-typedef QStyleOptionTabWidgetFrame QStyleOptionTabWidgetFrameV2;
+typedef Q_DECL_DEPRECATED QStyleOptionTabWidgetFrame QStyleOptionTabWidgetFrameV2;
#endif // QT_NO_TABWIDGET
@@ -181,7 +181,7 @@ protected:
QStyleOptionTabBarBase(int version);
};
-typedef QStyleOptionTabBarBase QStyleOptionTabBarBaseV2;
+typedef Q_DECL_DEPRECATED QStyleOptionTabBarBase QStyleOptionTabBarBaseV2;
#endif // QT_NO_TABBAR
class Q_WIDGETS_EXPORT QStyleOptionHeader : public QStyleOption
@@ -273,8 +273,8 @@ protected:
Q_DECLARE_OPERATORS_FOR_FLAGS(QStyleOptionTab::CornerWidgets)
-typedef QStyleOptionTab QStyleOptionTabV2;
-typedef QStyleOptionTab QStyleOptionTabV3;
+typedef Q_DECL_DEPRECATED QStyleOptionTab QStyleOptionTabV2;
+typedef Q_DECL_DEPRECATED QStyleOptionTab QStyleOptionTabV3;
#endif // QT_NO_TABBAR
@@ -328,7 +328,7 @@ protected:
QStyleOptionProgressBar(int version);
};
-typedef QStyleOptionProgressBar QStyleOptionProgressBarV2;
+typedef Q_DECL_DEPRECATED QStyleOptionProgressBar QStyleOptionProgressBarV2;
class Q_WIDGETS_EXPORT QStyleOptionMenuItem : public QStyleOption
{
@@ -377,7 +377,7 @@ protected:
QStyleOptionDockWidget(int version);
};
-typedef QStyleOptionDockWidget QStyleOptionDockWidgetV2;
+typedef Q_DECL_DEPRECATED QStyleOptionDockWidget QStyleOptionDockWidgetV2;
#ifndef QT_NO_ITEMVIEWS
@@ -430,9 +430,9 @@ protected:
Q_DECLARE_OPERATORS_FOR_FLAGS(QStyleOptionViewItem::ViewItemFeatures)
-typedef QStyleOptionViewItem QStyleOptionViewItemV2;
-typedef QStyleOptionViewItem QStyleOptionViewItemV3;
-typedef QStyleOptionViewItem QStyleOptionViewItemV4;
+typedef Q_DECL_DEPRECATED QStyleOptionViewItem QStyleOptionViewItemV2;
+typedef Q_DECL_DEPRECATED QStyleOptionViewItem QStyleOptionViewItemV3;
+typedef Q_DECL_DEPRECATED QStyleOptionViewItem QStyleOptionViewItemV4;
#endif // QT_NO_ITEMVIEWS
@@ -458,7 +458,7 @@ protected:
QStyleOptionToolBox(int version);
};
-typedef QStyleOptionToolBox QStyleOptionToolBoxV2;
+typedef Q_DECL_DEPRECATED QStyleOptionToolBox QStyleOptionToolBoxV2;
#ifndef QT_NO_RUBBERBAND
class Q_WIDGETS_EXPORT QStyleOptionRubberBand : public QStyleOption
diff --git a/src/widgets/styles/qstylesheetstyle.cpp b/src/widgets/styles/qstylesheetstyle.cpp
index d3f667748e..40cca059a8 100644
--- a/src/widgets/styles/qstylesheetstyle.cpp
+++ b/src/widgets/styles/qstylesheetstyle.cpp
@@ -1547,7 +1547,7 @@ QVector<QCss::StyleRule> QStyleSheetStyle::styleRules(const QObject *obj) const
if (ss.startsWith(QLatin1String("file:///")))
ss.remove(0, 8);
parser.init(ss, qApp->styleSheet() != ss);
- if (!parser.parse(&appSs))
+ if (Q_UNLIKELY(!parser.parse(&appSs)))
qWarning("Could not parse application stylesheet");
appSs.origin = StyleSheetOrigin_Inline;
appSs.depth = 1;
@@ -1569,7 +1569,7 @@ QVector<QCss::StyleRule> QStyleSheetStyle::styleRules(const QObject *obj) const
parser.init(styleSheet);
if (!parser.parse(&ss)) {
parser.init(QLatin1String("* {") + styleSheet + QLatin1Char('}'));
- if (!parser.parse(&ss))
+ if (Q_UNLIKELY(!parser.parse(&ss)))
qWarning("Could not parse stylesheet of object %p", o);
}
ss.origin = StyleSheetOrigin_Inline;
@@ -2515,12 +2515,12 @@ void QStyleSheetStyle::setProperties(QWidget *w)
const QMetaObject *metaObject = w->metaObject();
int index = metaObject->indexOfProperty(property.toLatin1());
- if (index == -1) {
+ if (Q_UNLIKELY(index == -1)) {
qWarning() << w << " does not have a property named " << property;
continue;
}
const QMetaProperty metaProperty = metaObject->property(index);
- if (!metaProperty.isWritable() || !metaProperty.isDesignable()) {
+ if (Q_UNLIKELY(!metaProperty.isWritable() || !metaProperty.isDesignable())) {
qWarning() << w << " cannot design property named " << property;
continue;
}
@@ -2556,7 +2556,13 @@ void QStyleSheetStyle::setPalette(QWidget *w)
{ PseudoClass_Enabled, QPalette::Inactive }
};
- QPalette p = w->palette();
+ const bool useStyleSheetPropagationInWidgetStyles =
+ QCoreApplication::testAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles);
+
+ QPalette p;
+ if (!useStyleSheetPropagationInWidgetStyles)
+ p = w->palette();
+
QWidget *ew = embeddedWidget(w);
for (int i = 0; i < 3; i++) {
@@ -2573,32 +2579,84 @@ void QStyleSheetStyle::setPalette(QWidget *w)
rule.configurePalette(&p, map[i].group, ew, ew != w);
}
- styleSheetCaches->customPaletteWidgets.insert(w, w->palette());
- w->setPalette(p);
- if (ew != w)
- ew->setPalette(p);
+ if (!useStyleSheetPropagationInWidgetStyles || p.resolve() != 0) {
+ QPalette wp = w->palette();
+ styleSheetCaches->customPaletteWidgets.insert(w, qMakePair(wp, p.resolve()));
+
+ if (useStyleSheetPropagationInWidgetStyles) {
+ p = p.resolve(wp);
+ p.resolve(p.resolve() | wp.resolve());
+ }
+
+ w->setPalette(p);
+ if (ew != w)
+ ew->setPalette(p);
+ }
}
void QStyleSheetStyle::unsetPalette(QWidget *w)
{
+ const bool useStyleSheetPropagationInWidgetStyles =
+ QCoreApplication::testAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles);
+
if (styleSheetCaches->customPaletteWidgets.contains(w)) {
- QPalette p = styleSheetCaches->customPaletteWidgets.value(w);
- w->setPalette(p);
+ QPair<QPalette, uint> p = styleSheetCaches->customPaletteWidgets.value(w);
+ styleSheetCaches->customPaletteWidgets.remove(w);
+
+ QPalette original = p.first;
+
+ if (useStyleSheetPropagationInWidgetStyles) {
+ original.resolve(original.resolve() & p.second);
+
+ QPalette wp = w->palette();
+ wp.resolve(wp.resolve() & ~p.second);
+ wp.resolve(original);
+ wp.resolve(wp.resolve() | original.resolve());
+ original = wp;
+ }
+
+ w->setPalette(original);
QWidget *ew = embeddedWidget(w);
if (ew != w)
- ew->setPalette(p);
- styleSheetCaches->customPaletteWidgets.remove(w);
+ ew->setPalette(original);
}
- QVariant oldFont = w->property("_q_styleSheetWidgetFont");
- if (oldFont.isValid()) {
- w->setFont(qvariant_cast<QFont>(oldFont));
+
+ if (useStyleSheetPropagationInWidgetStyles) {
+ unsetStyleSheetFont(w);
+ QWidget *ew = embeddedWidget(w);
+ if (ew != w)
+ unsetStyleSheetFont(ew);
+ } else {
+ QVariant oldFont = w->property("_q_styleSheetWidgetFont");
+ if (oldFont.isValid()) {
+ w->setFont(qvariant_cast<QFont>(oldFont));
+ }
}
+
if (styleSheetCaches->autoFillDisabledWidgets.contains(w)) {
embeddedWidget(w)->setAutoFillBackground(true);
styleSheetCaches->autoFillDisabledWidgets.remove(w);
}
}
+void QStyleSheetStyle::unsetStyleSheetFont(QWidget *w) const
+{
+ if (styleSheetCaches->customFontWidgets.contains(w)) {
+ QPair<QFont, uint> f = styleSheetCaches->customFontWidgets.value(w);
+ styleSheetCaches->customFontWidgets.remove(w);
+
+ QFont original = f.first;
+ original.resolve(original.resolve() & f.second);
+
+ QFont font = w->font();
+ font.resolve(font.resolve() & ~f.second);
+ font.resolve(original);
+ font.resolve(font.resolve() | original.resolve());
+
+ w->setFont(font);
+ }
+}
+
static void updateObjects(const QList<const QObject *>& objects)
{
if (!styleSheetCaches->styleRulesCache.isEmpty() || !styleSheetCaches->hasStyleRuleCache.isEmpty() || !styleSheetCaches->renderRulesCache.isEmpty()) {
@@ -2658,6 +2716,7 @@ void QStyleSheetStyleCaches::objectDestroyed(QObject *o)
hasStyleRuleCache.remove(o);
renderRulesCache.remove(o);
customPaletteWidgets.remove((const QWidget *)o);
+ customFontWidgets.remove(static_cast<QWidget *>(o));
styleSheetCache.remove(o);
autoFillDisabledWidgets.remove((const QWidget *)o);
}
@@ -5846,24 +5905,42 @@ void QStyleSheetStyle::updateStyleSheetFont(QWidget* w) const
// we should never override it.
if (w->objectName() == QLatin1String("qt_fontDialog_sampleEdit"))
return;
+
QWidget *container = containerWidget(w);
QRenderRule rule = renderRule(container, PseudoElement_None,
PseudoClass_Active | PseudoClass_Enabled | extendedPseudoClass(container));
- QFont font = rule.font.resolve(w->font());
- if ((!w->isWindow() || w->testAttribute(Qt::WA_WindowPropagation))
- && isNaturalChild(w) && qobject_cast<QWidget *>(w->parent())) {
+ const bool useStyleSheetPropagationInWidgetStyles =
+ QCoreApplication::testAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles);
- font = font.resolve(static_cast<QWidget *>(w->parent())->font());
- }
+ if (useStyleSheetPropagationInWidgetStyles) {
+ unsetStyleSheetFont(w);
- if (w->data->fnt == font)
- return;
+ if (rule.font.resolve()) {
+ QFont wf = w->font();
+ styleSheetCaches->customFontWidgets.insert(w, qMakePair(wf, rule.font.resolve()));
+
+ QFont font = rule.font.resolve(wf);
+ font.resolve(wf.resolve() | rule.font.resolve());
+ w->setFont(font);
+ }
+ } else {
+ QFont font = rule.font.resolve(w->font());
- w->data->fnt = font;
+ if ((!w->isWindow() || w->testAttribute(Qt::WA_WindowPropagation))
+ && isNaturalChild(w) && qobject_cast<QWidget *>(w->parent())) {
- QEvent e(QEvent::FontChange);
- QApplication::sendEvent(w, &e);
+ font = font.resolve(static_cast<QWidget *>(w->parent())->font());
+ }
+
+ if (w->data->fnt == font)
+ return;
+
+ w->data->fnt = font;
+
+ QEvent e(QEvent::FontChange);
+ QApplication::sendEvent(w, &e);
+ }
}
void QStyleSheetStyle::saveWidgetFont(QWidget* w, const QFont& font) const
diff --git a/src/widgets/styles/qstylesheetstyle_default.cpp b/src/widgets/styles/qstylesheetstyle_default.cpp
index c3d00f1883..a444be006d 100644
--- a/src/widgets/styles/qstylesheetstyle_default.cpp
+++ b/src/widgets/styles/qstylesheetstyle_default.cpp
@@ -149,8 +149,7 @@ StyleSheet QStyleSheetStyle::getDefaultStyleSheet() const
// pixmap based style doesn't support any features
bool styleIsPixmapBased = baseStyle()->inherits("QMacStyle")
- || baseStyle()->inherits("QWindowsXPStyle")
- || baseStyle()->inherits("QGtkStyle");
+ || baseStyle()->inherits("QWindowsXPStyle");
/*QLineEdit {
diff --git a/src/widgets/styles/qstylesheetstyle_p.h b/src/widgets/styles/qstylesheetstyle_p.h
index 9cd8cb889d..dd2a25aed3 100644
--- a/src/widgets/styles/qstylesheetstyle_p.h
+++ b/src/widgets/styles/qstylesheetstyle_p.h
@@ -42,6 +42,7 @@
#include "QtCore/qhash.h"
#include "QtGui/qevent.h"
#include "QtCore/qvector.h"
+#include "QtCore/qset.h"
#include "QtWidgets/qapplication.h"
#include "private/qcssparser_p.h"
#include "QtGui/qbrush.h"
@@ -149,6 +150,7 @@ private:
void unsetPalette(QWidget *);
void setProperties(QWidget *);
void setGeometry(QWidget *);
+ void unsetStyleSheetFont(QWidget *) const;
QVector<QCss::StyleRule> styleRules(const QObject *obj) const;
bool hasStyleRule(const QObject *obj, int part) const;
@@ -178,9 +180,12 @@ public:
QHash<const QObject *, QHash<int, bool> > hasStyleRuleCache;
typedef QHash<int, QHash<quint64, QRenderRule> > QRenderRules;
QHash<const QObject *, QRenderRules> renderRulesCache;
- QHash<const QWidget *, QPalette> customPaletteWidgets; // widgets whose palette we tampered
QHash<const void *, QCss::StyleSheet> styleSheetCache; // parsed style sheets
QSet<const QWidget *> autoFillDisabledWidgets;
+ // widgets whose palettes and fonts we have tampered. stored value pair is
+ // QPair<old widget value, resolve mask of stylesheet value>
+ QHash<const QWidget *, QPair<QPalette, uint> > customPaletteWidgets;
+ QHash<const QWidget *, QPair<QFont, uint> > customFontWidgets;
};
diff --git a/src/widgets/styles/qwindowsvistastyle.cpp b/src/widgets/styles/qwindowsvistastyle.cpp
index 083b1d1707..4c16b182a8 100644
--- a/src/widgets/styles/qwindowsvistastyle.cpp
+++ b/src/widgets/styles/qwindowsvistastyle.cpp
@@ -2471,12 +2471,12 @@ bool QWindowsVistaStylePrivate::initTreeViewTheming()
return true;
m_treeViewHelper = createTreeViewHelperWindow();
- if (!m_treeViewHelper) {
+ if (Q_UNLIKELY(!m_treeViewHelper)) {
qWarning("Unable to create the treeview helper window.");
return false;
}
const HRESULT hr = QWindowsXPStylePrivate::pSetWindowTheme(m_treeViewHelper, L"explorer", NULL);
- if (hr != S_OK) {
+ if (Q_UNLIKELY(hr != S_OK)) {
qErrnoWarning("SetWindowTheme() failed.");
return false;
}
diff --git a/src/widgets/styles/qwindowsxpstyle.cpp b/src/widgets/styles/qwindowsxpstyle.cpp
index c350e82c69..d5f511b771 100644
--- a/src/widgets/styles/qwindowsxpstyle.cpp
+++ b/src/widgets/styles/qwindowsxpstyle.cpp
@@ -337,14 +337,14 @@ void QWindowsXPStylePrivate::cleanupHandleMap()
HTHEME QWindowsXPStylePrivate::createTheme(int theme, HWND hwnd)
{
- if (theme < 0 || theme >= NThemes || !hwnd) {
+ if (Q_UNLIKELY(theme < 0 || theme >= NThemes || !hwnd)) {
qWarning("Invalid parameters #%d, %p", theme, hwnd);
return 0;
}
if (!m_themes[theme]) {
const wchar_t *name = themeNames[theme];
m_themes[theme] = pOpenThemeData(hwnd, name);
- if (!m_themes[theme])
+ if (Q_UNLIKELY(!m_themes[theme]))
qErrnoWarning("OpenThemeData() failed for theme %d (%s).",
theme, qPrintable(themeName(theme)));
}
@@ -504,13 +504,13 @@ HBITMAP QWindowsXPStylePrivate::buffer(int w, int h)
GdiFlush();
nullBitmap = (HBITMAP)SelectObject(bufferDC, bufferBitmap);
- if (!bufferBitmap) {
+ if (Q_UNLIKELY(!bufferBitmap)) {
qErrnoWarning("QWindowsXPStylePrivate::buffer(%dx%d), CreateDIBSection() failed.", w, h);
bufferW = 0;
bufferH = 0;
return 0;
}
- if (!bufferPixels) {
+ if (Q_UNLIKELY(!bufferPixels)) {
qErrnoWarning("QWindowsXPStylePrivate::buffer(%dx%d), CreateDIBSection() did not allocate pixel data.", w, h);
bufferW = 0;
bufferH = 0;
diff --git a/src/widgets/styles/styles.pri b/src/widgets/styles/styles.pri
index 3707090c4c..11f7d973cc 100644
--- a/src/widgets/styles/styles.pri
+++ b/src/widgets/styles/styles.pri
@@ -14,7 +14,9 @@ HEADERS += \
styles/qproxystyle_p.h \
styles/qcommonstyle_p.h \
styles/qstylepainter.h \
- styles/qstylesheetstyle_p.h
+ styles/qstylesheetstyle_p.h \
+ styles/qpixmapstyle_p.h \
+ styles/qpixmapstyle_p_p.h
SOURCES += \
styles/qdrawutil.cpp \
@@ -28,7 +30,8 @@ SOURCES += \
styles/qproxystyle.cpp \
styles/qstylepainter.cpp \
styles/qstylesheetstyle.cpp \
- styles/qstylesheetstyle_default.cpp
+ styles/qstylesheetstyle_default.cpp \
+ styles/qpixmapstyle.cpp
wince* {
RESOURCES += styles/qstyle_wince.qrc
@@ -42,18 +45,12 @@ contains( styles, all ) {
!macx:styles -= mac
-contains(QT_CONFIG, gtkstyle) {
- QMAKE_CXXFLAGS += $$QT_CFLAGS_QGTKSTYLE
- LIBS_PRIVATE += $$QT_LIBS_QGTKSTYLE
- styles += gtk
- CONFIG += x11
-}
-
contains( styles, mac ) {
HEADERS += \
styles/qmacstyle_mac_p.h \
styles/qmacstyle_mac_p_p.h
- OBJECTIVE_SOURCES += styles/qmacstyle_mac.mm
+ OBJECTIVE_SOURCES += styles/qmacstyle_mac.mm
+ LIBS_PRIVATE += -framework Carbon
} else {
DEFINES += QT_NO_STYLE_MAC
}
@@ -90,19 +87,6 @@ contains( styles, windows ) {
DEFINES += QT_NO_STYLE_WINDOWS
}
-contains( styles, gtk ) {
- HEADERS += styles/qgtkglobal_p.h
- HEADERS += styles/qgtkstyle_p.h
- HEADERS += styles/qgtkpainter_p.h
- HEADERS += styles/qgtk2painter_p.h
- HEADERS += styles/qgtkstyle_p_p.h
- SOURCES += styles/qgtkstyle.cpp
- SOURCES += styles/qgtkpainter.cpp
- SOURCES += styles/qgtk2painter.cpp
- SOURCES += styles/qgtkstyle_p.cpp
-} else {
- DEFINES += QT_NO_STYLE_GTK
-}
contains( styles, fusion ) {
HEADERS += styles/qfusionstyle_p.h
HEADERS += styles/qfusionstyle_p_p.h
diff --git a/src/widgets/util/qcolormap.cpp b/src/widgets/util/qcolormap.cpp
index fc4d511384..4bcf1501d2 100644
--- a/src/widgets/util/qcolormap.cpp
+++ b/src/widgets/util/qcolormap.cpp
@@ -58,7 +58,7 @@ static QColormapPrivate *screenMap = 0;
void QColormap::initialize()
{
screenMap = new QColormapPrivate;
- if (!QGuiApplication::primaryScreen()) {
+ if (Q_UNLIKELY(!QGuiApplication::primaryScreen())) {
qWarning("no screens available, assuming 24-bit color");
screenMap->depth = 24;
screenMap->mode = QColormap::Direct;
diff --git a/src/widgets/util/qcompleter.cpp b/src/widgets/util/qcompleter.cpp
index ba56f004b7..55ceeca919 100644
--- a/src/widgets/util/qcompleter.cpp
+++ b/src/widgets/util/qcompleter.cpp
@@ -1144,9 +1144,9 @@ void QCompleter::setFilterMode(Qt::MatchFlags filterMode)
if (d->filterMode == filterMode)
return;
- if (filterMode != Qt::MatchStartsWith
- && filterMode != Qt::MatchContains
- && filterMode != Qt::MatchEndsWith) {
+ if (Q_UNLIKELY(filterMode != Qt::MatchStartsWith &&
+ filterMode != Qt::MatchContains &&
+ filterMode != Qt::MatchEndsWith)) {
qWarning("Unhandled QCompleter::filterMode flag is used.");
return;
}
@@ -1641,7 +1641,7 @@ int QCompleter::maxVisibleItems() const
void QCompleter::setMaxVisibleItems(int maxItems)
{
Q_D(QCompleter);
- if (maxItems < 0) {
+ if (Q_UNLIKELY(maxItems < 0)) {
qWarning("QCompleter::setMaxVisibleItems: "
"Invalid max visible items (%d) must be >= 0", maxItems);
return;
diff --git a/src/widgets/util/qflickgesture.cpp b/src/widgets/util/qflickgesture.cpp
index c7e0861a0f..b240902ced 100644
--- a/src/widgets/util/qflickgesture.cpp
+++ b/src/widgets/util/qflickgesture.cpp
@@ -40,6 +40,7 @@
#include "qgraphicssceneevent.h"
#include "qgraphicsview.h"
#include "qscroller.h"
+#include <QtGui/qtouchdevice.h>
#include "private/qapplication_p.h"
#include "private/qevent_p.h"
#include "private/qflickgesture_p.h"
@@ -582,7 +583,7 @@ QGestureRecognizer::Result QFlickGestureRecognizer::recognize(QGesture *state,
scrollerRegion = QRect(w->mapToGlobal(QPoint(0, 0)), w->size());
#ifndef QT_NO_GRAPHICSVIEW
} else if (QGraphicsObject *go = qobject_cast<QGraphicsObject *>(as->target())) {
- if (go->scene() && !go->scene()->views().isEmpty()) {
+ if (go->scene()) {
foreach (QGraphicsView *gv, go->scene()->views())
scrollerRegion |= gv->mapFromScene(go->mapToScene(go->boundingRect()))
.translated(gv->mapToGlobal(QPoint(0, 0)));
diff --git a/src/widgets/util/qscroller.cpp b/src/widgets/util/qscroller.cpp
index 38b104f9e9..5297c949a9 100644
--- a/src/widgets/util/qscroller.cpp
+++ b/src/widgets/util/qscroller.cpp
@@ -159,8 +159,8 @@ static qreal differentialForProgress(const QEasingCurve &curve, qreal pos)
static qreal progressForValue(const QEasingCurve &curve, qreal value)
{
- if (curve.type() >= QEasingCurve::InElastic &&
- curve.type() < QEasingCurve::Custom) {
+ if (Q_UNLIKELY(curve.type() >= QEasingCurve::InElastic &&
+ curve.type() < QEasingCurve::Custom)) {
qWarning("progressForValue(): QEasingCurves of type %d do not have an inverse, since they are not injective.", curve.type());
return value;
}
@@ -1005,7 +1005,7 @@ bool QScroller::handleInput(Input input, const QPointF &position, qint64 timesta
#if !defined(Q_DEAD_CODE_FROM_QT4_MAC)
// the Mac version is implemented in qscroller_mac.mm
-QPointF QScrollerPrivate::realDpi(int screen)
+QPointF QScrollerPrivate::realDpi(int screen) const
{
# if defined(Q_DEAD_CODE_FROM_QT4_X11) && !defined(QT_NO_XRANDR)
if (X11 && X11->use_xrandr && X11->ptrXRRSizes && X11->ptrXRRRootToScreen) {
@@ -1176,9 +1176,9 @@ qreal QScrollerPrivate::scrollingSegmentsEndPos(Qt::Orientation orientation) con
/*! \internal
Checks if the scroller segment end in a valid position.
*/
-bool QScrollerPrivate::scrollingSegmentsValid(Qt::Orientation orientation)
+bool QScrollerPrivate::scrollingSegmentsValid(Qt::Orientation orientation) const
{
- QQueue<ScrollSegment> *segments;
+ const QQueue<ScrollSegment> *segments;
qreal minPos;
qreal maxPos;
@@ -1893,7 +1893,7 @@ void QScrollerPrivate::setContentPositionHelperScrolling()
on a snap point.
Returns the nearest snap position or NaN if no such point could be found.
*/
-qreal QScrollerPrivate::nextSnapPos(qreal p, int dir, Qt::Orientation orientation)
+qreal QScrollerPrivate::nextSnapPos(qreal p, int dir, Qt::Orientation orientation) const
{
qreal bestSnapPos = Q_QNAN;
qreal bestSnapPosDist = Q_INFINITY;
diff --git a/src/widgets/util/qscroller_mac.mm b/src/widgets/util/qscroller_mac.mm
index 07de07de52..1d2780ccd1 100644
--- a/src/widgets/util/qscroller_mac.mm
+++ b/src/widgets/util/qscroller_mac.mm
@@ -35,13 +35,13 @@
#ifdef Q_DEAD_CODE_FROM_QT4_MAC
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#include "qscroller_p.h"
QT_BEGIN_NAMESPACE
-QPointF QScrollerPrivate::realDpi(int screen)
+QPointF QScrollerPrivate::realDpi(int screen) const
{
QMacAutoReleasePool pool;
NSArray *nsscreens = [NSScreen screens];
diff --git a/src/widgets/util/qscroller_p.h b/src/widgets/util/qscroller_p.h
index d09f78d130..8266b6e611 100644
--- a/src/widgets/util/qscroller_p.h
+++ b/src/widgets/util/qscroller_p.h
@@ -112,7 +112,7 @@ public:
bool prepareScrolling(const QPointF &position);
void handleDrag(const QPointF &position, qint64 timestamp);
- QPointF realDpi(int screen);
+ QPointF realDpi(int screen) const;
QPointF dpi() const;
void setDpi(const QPointF &dpi);
void setDpiFromWidget(QWidget *widget);
@@ -121,7 +121,7 @@ public:
void pushSegment(ScrollType type, qreal deltaTime, qreal stopProgress, qreal startPos, qreal deltaPos, qreal stopPos, QEasingCurve::Type curve, Qt::Orientation orientation);
void recalcScrollingSegments(bool forceRecalc = false);
qreal scrollingSegmentsEndPos(Qt::Orientation orientation) const;
- bool scrollingSegmentsValid(Qt::Orientation orientation);
+ bool scrollingSegmentsValid(Qt::Orientation orientation) const;
void createScrollToSegments(qreal v, qreal deltaTime, qreal endPos, Qt::Orientation orientation, ScrollType type);
void createScrollingSegments(qreal v, qreal startPos,
qreal deltaTime, qreal deltaPos,
@@ -131,7 +131,7 @@ public:
void setContentPositionHelperDragging(const QPointF &deltaPos);
void setContentPositionHelperScrolling();
- qreal nextSnapPos(qreal p, int dir, Qt::Orientation orientation);
+ qreal nextSnapPos(qreal p, int dir, Qt::Orientation orientation) const;
static qreal nextSegmentPosition(QQueue<ScrollSegment> &segments, qint64 now, qreal oldPos);
inline int frameRateSkip() const { return properties.d.data()->frameRate; }
diff --git a/src/widgets/util/qsystemtrayicon.cpp b/src/widgets/util/qsystemtrayicon.cpp
index 31bbbb9739..47bc88cb43 100644
--- a/src/widgets/util/qsystemtrayicon.cpp
+++ b/src/widgets/util/qsystemtrayicon.cpp
@@ -264,7 +264,7 @@ void QSystemTrayIcon::setVisible(bool visible)
Q_D(QSystemTrayIcon);
if (visible == d->visible)
return;
- if (d->icon.isNull() && visible)
+ if (Q_UNLIKELY(visible && d->icon.isNull()))
qWarning("QSystemTrayIcon::setVisible: No Icon set");
d->visible = visible;
if (d->visible)
diff --git a/src/widgets/util/qsystemtrayicon_x11.cpp b/src/widgets/util/qsystemtrayicon_x11.cpp
index 02bab236c8..13d58acebd 100644
--- a/src/widgets/util/qsystemtrayicon_x11.cpp
+++ b/src/widgets/util/qsystemtrayicon_x11.cpp
@@ -170,7 +170,9 @@ void QSystemTrayIconSys::mousePressEvent(QMouseEvent *ev)
#ifndef QT_NO_CONTEXTMENU
if (ev->button() == Qt::RightButton && q->contextMenu())
q->contextMenu()->popup(globalPos);
-#endif
+#else
+ Q_UNUSED(globalPos)
+#endif // QT_NO_CONTEXTMENU
if (QBalloonTip::isBalloonVisible()) {
emit q->messageClicked();
diff --git a/src/widgets/util/qundostack.cpp b/src/widgets/util/qundostack.cpp
index 0272870537..35d8c10578 100644
--- a/src/widgets/util/qundostack.cpp
+++ b/src/widgets/util/qundostack.cpp
@@ -633,7 +633,7 @@ void QUndoStack::push(QUndoCommand *cmd)
void QUndoStack::setClean()
{
Q_D(QUndoStack);
- if (!d->macro_stack.isEmpty()) {
+ if (Q_UNLIKELY(!d->macro_stack.isEmpty())) {
qWarning("QUndoStack::setClean(): cannot set clean in the middle of a macro");
return;
}
@@ -688,7 +688,7 @@ void QUndoStack::undo()
if (d->index == 0)
return;
- if (!d->macro_stack.isEmpty()) {
+ if (Q_UNLIKELY(!d->macro_stack.isEmpty())) {
qWarning("QUndoStack::undo(): cannot undo in the middle of a macro");
return;
}
@@ -714,7 +714,7 @@ void QUndoStack::redo()
if (d->index == d->command_list.size())
return;
- if (!d->macro_stack.isEmpty()) {
+ if (Q_UNLIKELY(!d->macro_stack.isEmpty())) {
qWarning("QUndoStack::redo(): cannot redo in the middle of a macro");
return;
}
@@ -761,7 +761,7 @@ int QUndoStack::index() const
void QUndoStack::setIndex(int idx)
{
Q_D(QUndoStack);
- if (!d->macro_stack.isEmpty()) {
+ if (Q_UNLIKELY(!d->macro_stack.isEmpty())) {
qWarning("QUndoStack::setIndex(): cannot set index in the middle of a macro");
return;
}
@@ -981,7 +981,7 @@ void QUndoStack::beginMacro(const QString &text)
void QUndoStack::endMacro()
{
Q_D(QUndoStack);
- if (d->macro_stack.isEmpty()) {
+ if (Q_UNLIKELY(d->macro_stack.isEmpty())) {
qWarning("QUndoStack::endMacro(): no matching beginMacro()");
return;
}
@@ -1049,7 +1049,7 @@ void QUndoStack::setUndoLimit(int limit)
{
Q_D(QUndoStack);
- if (!d->command_list.isEmpty()) {
+ if (Q_UNLIKELY(!d->command_list.isEmpty())) {
qWarning("QUndoStack::setUndoLimit(): an undo limit can only be set when the stack is empty");
return;
}
diff --git a/src/widgets/widgets/qabstractscrollarea.cpp b/src/widgets/widgets/qabstractscrollarea.cpp
index 65d06eafc5..946d683bf0 100644
--- a/src/widgets/widgets/qabstractscrollarea.cpp
+++ b/src/widgets/widgets/qabstractscrollarea.cpp
@@ -469,7 +469,7 @@ void QAbstractScrollAreaPrivate::layoutChildren()
if ((vscrollOverlap > 0 && needv) || (hscrollOverlap > 0 && needh)) {
const QList<QHeaderView *> headers = q->findChildren<QHeaderView*>();
if (headers.count() <= 2) {
- Q_FOREACH (const QHeaderView *header, headers) {
+ for (const QHeaderView *header : headers) {
const QRect geo = header->geometry();
if (header->orientation() == Qt::Vertical && header->isVisible() && QStyle::visualRect(opt.direction, opt.rect, geo).left() <= opt.rect.width() / 2)
vHeaderRight = QStyle::visualRect(opt.direction, opt.rect, geo).right();
@@ -705,7 +705,7 @@ QScrollBar *QAbstractScrollArea::verticalScrollBar() const
void QAbstractScrollArea::setVerticalScrollBar(QScrollBar *scrollBar)
{
Q_D(QAbstractScrollArea);
- if (!scrollBar) {
+ if (Q_UNLIKELY(!scrollBar)) {
qWarning("QAbstractScrollArea::setVerticalScrollBar: Cannot set a null scroll bar");
return;
}
@@ -766,7 +766,7 @@ QScrollBar *QAbstractScrollArea::horizontalScrollBar() const
void QAbstractScrollArea::setHorizontalScrollBar(QScrollBar *scrollBar)
{
Q_D(QAbstractScrollArea);
- if (!scrollBar) {
+ if (Q_UNLIKELY(!scrollBar)) {
qWarning("QAbstractScrollArea::setHorizontalScrollBar: Cannot set a null scroll bar");
return;
}
diff --git a/src/widgets/widgets/qabstractslider.cpp b/src/widgets/widgets/qabstractslider.cpp
index 8d8c3aa4bc..c2d4d3278f 100644
--- a/src/widgets/widgets/qabstractslider.cpp
+++ b/src/widgets/widgets/qabstractslider.cpp
@@ -205,7 +205,7 @@ QT_BEGIN_NAMESPACE
QAbstractSliderPrivate::QAbstractSliderPrivate()
: minimum(0), maximum(99), pageStep(10), value(0), position(0), pressValue(-1),
- singleStep(1), offset_accumulated(0), tracking(true),
+ singleStep(1), singleStepFromItemView(-1), viewMayChangeSingleStep(true), offset_accumulated(0), tracking(true),
blocktracking(false), pressed(false),
invertedAppearance(false), invertedControls(false),
orientation(Qt::Horizontal), repeatAction(QAbstractSlider::SliderNoAction)
@@ -378,6 +378,11 @@ int QAbstractSlider::maximum() const
void QAbstractSlider::setSingleStep(int step)
{
Q_D(QAbstractSlider);
+
+ d->viewMayChangeSingleStep = (step < 0);
+ if (step < 0 && d->singleStepFromItemView > 0)
+ step = d->singleStepFromItemView;
+
if (step != d->singleStep)
d->setSteps(step, d->pageStep);
}
@@ -936,4 +941,16 @@ bool QAbstractSlider::event(QEvent *e)
return QWidget::event(e);
}
+// This function is called from itemviews when doing scroll per pixel (on updateGeometries())
+// It will not have any effect if there has been a call to setSingleStep with
+// a 'reasonable' value (since viewMayChangeSingleStep will be set to false).
+// (If setSingleStep is called with -1 it will however allow the views to change singleStep.)
+
+void QAbstractSliderPrivate::itemviewChangeSingleStep(int step)
+{
+ singleStepFromItemView = step;
+ if (viewMayChangeSingleStep && singleStep != step)
+ setSteps(step, pageStep);
+}
+
QT_END_NAMESPACE
diff --git a/src/widgets/widgets/qabstractslider_p.h b/src/widgets/widgets/qabstractslider_p.h
index 3df73cf172..32ae55795b 100644
--- a/src/widgets/widgets/qabstractslider_p.h
+++ b/src/widgets/widgets/qabstractslider_p.h
@@ -67,6 +67,8 @@ public:
* Call effectiveSingleStep() when changing the slider value.
*/
int singleStep;
+ int singleStepFromItemView; // If we have itemViews we track the views preferred singleStep value.
+ bool viewMayChangeSingleStep;
float offset_accumulated;
uint tracking : 1;
@@ -108,6 +110,7 @@ public:
#endif
;
}
+ void itemviewChangeSingleStep(int step);
virtual int bound(int val) const { return qMax(minimum, qMin(maximum, val)); }
inline int overflowSafeAdd(int add) const
diff --git a/src/widgets/widgets/qabstractspinbox.cpp b/src/widgets/widgets/qabstractspinbox.cpp
index ba4bbe40a8..40c148f4c6 100644
--- a/src/widgets/widgets/qabstractspinbox.cpp
+++ b/src/widgets/widgets/qabstractspinbox.cpp
@@ -1931,7 +1931,7 @@ void QSpinBoxValidator::fixup(QString &input) const
QVariant operator+(const QVariant &arg1, const QVariant &arg2)
{
QVariant ret;
- if (arg1.type() != arg2.type())
+ if (Q_UNLIKELY(arg1.type() != arg2.type()))
qWarning("QAbstractSpinBox: Internal error: Different types (%s vs %s) (%s:%d)",
arg1.typeName(), arg2.typeName(), __FILE__, __LINE__);
switch (arg1.type()) {
@@ -1970,7 +1970,7 @@ QVariant operator+(const QVariant &arg1, const QVariant &arg2)
QVariant operator-(const QVariant &arg1, const QVariant &arg2)
{
QVariant ret;
- if (arg1.type() != arg2.type())
+ if (Q_UNLIKELY(arg1.type() != arg2.type()))
qWarning("QAbstractSpinBox: Internal error: Different types (%s vs %s) (%s:%d)",
arg1.typeName(), arg2.typeName(), __FILE__, __LINE__);
switch (arg1.type()) {
diff --git a/src/widgets/widgets/qcalendarwidget.cpp b/src/widgets/widgets/qcalendarwidget.cpp
index 48b224fe13..eb216b1ad0 100644
--- a/src/widgets/widgets/qcalendarwidget.cpp
+++ b/src/widgets/widgets/qcalendarwidget.cpp
@@ -53,6 +53,8 @@
#include <qbasictimer.h>
#include <qstylepainter.h>
+#include <vector>
+
QT_BEGIN_NAMESPACE
enum {
@@ -423,6 +425,17 @@ QString QCalendarYearValidator::text(const QDate &date, int repeat) const
///////////////////////////////////
+struct SectionToken {
+ Q_DECL_CONSTEXPR SectionToken(QCalendarDateSectionValidator *v, int rep)
+ : validator(v), repeat(rep) {}
+
+ QCalendarDateSectionValidator *validator;
+ int repeat;
+};
+} // unnamed namespace
+Q_DECLARE_TYPEINFO(SectionToken, Q_PRIMITIVE_TYPE);
+namespace {
+
class QCalendarDateValidator
{
public:
@@ -438,13 +451,6 @@ public:
void setLocale(const QLocale &locale);
private:
-
- struct SectionToken {
- SectionToken(QCalendarDateSectionValidator *val, int rep) : validator(val), repeat(rep) {}
- QCalendarDateSectionValidator *validator;
- int repeat;
- };
-
void toNextToken();
void toPreviousToken();
void applyToDate();
@@ -453,12 +459,12 @@ private:
void clear();
QStringList m_separators;
- QList<SectionToken *> m_tokens;
+ std::vector<SectionToken> m_tokens;
QCalendarYearValidator m_yearValidator;
QCalendarMonthValidator m_monthValidator;
QCalendarDayValidator m_dayValidator;
- SectionToken *m_currentToken;
+ int m_currentToken;
QDate m_initialDate;
QDate m_currentDate;
@@ -467,7 +473,7 @@ private:
};
QCalendarDateValidator::QCalendarDateValidator()
- : m_currentToken(Q_NULLPTR),
+ : m_currentToken(-1),
m_initialDate(QDate::currentDate()),
m_currentDate(m_initialDate),
m_lastSectionMove(QCalendarDateSectionValidator::ThisSection)
@@ -510,17 +516,16 @@ void QCalendarDateValidator::setInitialDate(const QDate &date)
QString QCalendarDateValidator::currentText() const
{
QString str;
- QStringListIterator itSep(m_separators);
- QListIterator<SectionToken *> itTok(m_tokens);
- while (itSep.hasNext()) {
- str += itSep.next();
- if (itTok.hasNext()) {
- SectionToken *token = itTok.next();
- QCalendarDateSectionValidator *validator = token->validator;
- if (m_currentToken == token)
- str += validator->text();
+ const int numSeps = m_separators.size();
+ const int numTokens = int(m_tokens.size());
+ for (int i = 0; i < numSeps; ++i) {
+ str += m_separators.at(i);
+ if (i < numTokens) {
+ const SectionToken &token = m_tokens[i];
+ if (i == m_currentToken)
+ str += token.validator->text();
else
- str += validator->text(m_currentDate, token->repeat);
+ str += token.validator->text(m_currentDate, token.repeat);
}
}
return str;
@@ -528,14 +533,10 @@ QString QCalendarDateValidator::currentText() const
void QCalendarDateValidator::clear()
{
- QListIterator<SectionToken *> it(m_tokens);
- while (it.hasNext())
- delete it.next();
-
m_tokens.clear();
m_separators.clear();
- m_currentToken = 0;
+ m_currentToken = -1;
}
void QCalendarDateValidator::setFormat(const QString &format)
@@ -558,25 +559,25 @@ void QCalendarDateValidator::setFormat(const QString &format)
separator += nextChar;
quoting = false;
} else {
- SectionToken *token = 0;
+ QCalendarDateSectionValidator *validator = 0;
if (nextChar == QLatin1Char('d')) {
offset = qMin(4, countRepeat(format, pos));
- token = new SectionToken(&m_dayValidator, offset);
+ validator = &m_dayValidator;
} else if (nextChar == QLatin1Char('M')) {
offset = qMin(4, countRepeat(format, pos));
- token = new SectionToken(&m_monthValidator, offset);
+ validator = &m_monthValidator;
} else if (nextChar == QLatin1Char('y')) {
offset = qMin(4, countRepeat(format, pos));
- token = new SectionToken(&m_yearValidator, offset);
+ validator = &m_yearValidator;
} else {
separator += nextChar;
}
- if (token) {
- m_tokens.append(token);
+ if (validator) {
+ m_tokens.push_back(SectionToken(validator, offset));
m_separators.append(separator);
separator = QString();
- if (!m_currentToken)
- m_currentToken = token;
+ if (m_currentToken < 0)
+ m_currentToken = int(m_tokens.size()) - 1;
}
}
@@ -595,29 +596,23 @@ void QCalendarDateValidator::applyToDate()
void QCalendarDateValidator::toNextToken()
{
- const int idx = m_tokens.indexOf(m_currentToken);
- if (idx == -1)
+ if (m_currentToken < 0)
return;
- if (idx + 1 >= m_tokens.count())
- m_currentToken = m_tokens.first();
- else
- m_currentToken = m_tokens.at(idx + 1);
+ ++m_currentToken;
+ m_currentToken %= m_tokens.size();
}
void QCalendarDateValidator::toPreviousToken()
{
- const int idx = m_tokens.indexOf(m_currentToken);
- if (idx == -1)
+ if (m_currentToken < 0)
return;
- if (idx - 1 < 0)
- m_currentToken = m_tokens.last();
- else
- m_currentToken = m_tokens.at(idx - 1);
+ --m_currentToken;
+ m_currentToken %= m_tokens.size();
}
void QCalendarDateValidator::handleKeyEvent(QKeyEvent *keyEvent)
{
- if (!m_currentToken)
+ if (m_currentToken < 0)
return;
int key = keyEvent->key();
@@ -630,7 +625,7 @@ void QCalendarDateValidator::handleKeyEvent(QKeyEvent *keyEvent)
else if (key == Qt::Key_Left)
toPreviousToken();
- m_lastSectionMove = m_currentToken->validator->handleKey(key);
+ m_lastSectionMove = m_tokens[m_currentToken].validator->handleKey(key);
applyToDate();
if (m_lastSectionMove == QCalendarDateSectionValidator::NextSection)
@@ -821,6 +816,41 @@ void QCalendarTextNavigator::setDateEditAcceptDelay(int delay)
class QCalendarView;
+// a small helper class that replaces a QMap<Qt::DayOfWeek, T>,
+// but requires T to have a member-swap and a default constructor
+// which should be cheap (no memory allocations)
+
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_MSVC(4351) // "new behavior: elements of array ... will be default initialized"
+
+template <typename T>
+class StaticDayOfWeekAssociativeArray {
+ bool contained[7];
+ T data[7];
+
+ static Q_DECL_CONSTEXPR int day2idx(Qt::DayOfWeek day) Q_DECL_NOTHROW { return int(day) - 1; } // alt: day % 7
+public:
+ Q_DECL_CONSTEXPR StaticDayOfWeekAssociativeArray() Q_DECL_NOEXCEPT_EXPR(noexcept(T()))
+ : contained(), data() {}
+
+ Q_DECL_CONSTEXPR bool contains(Qt::DayOfWeek day) const Q_DECL_NOTHROW { return contained[day2idx(day)]; }
+ Q_DECL_CONSTEXPR const T &value(Qt::DayOfWeek day) const Q_DECL_NOTHROW { return data[day2idx(day)]; }
+
+ Q_DECL_RELAXED_CONSTEXPR T &operator[](Qt::DayOfWeek day) Q_DECL_NOTHROW
+ {
+ const int idx = day2idx(day);
+ contained[idx] = true;
+ return data[idx];
+ }
+
+ Q_DECL_RELAXED_CONSTEXPR void insert(Qt::DayOfWeek day, T v) Q_DECL_NOTHROW
+ {
+ operator[](day).swap(v);
+ }
+};
+
+QT_WARNING_POP
+
class QCalendarModel : public QAbstractTableModel
{
Q_OBJECT
@@ -899,7 +929,7 @@ public:
Qt::DayOfWeek m_firstDay;
QCalendarWidget::HorizontalHeaderFormat m_horizontalHeaderFormat;
bool m_weekNumbersShown;
- QMap<Qt::DayOfWeek, QTextCharFormat> m_dayFormats;
+ StaticDayOfWeekAssociativeArray<QTextCharFormat> m_dayFormats;
QMap<QDate, QTextCharFormat> m_dateFormats;
QTextCharFormat m_headerFormat;
QCalendarView *m_view;
@@ -2887,7 +2917,7 @@ void QCalendarWidget::setDateEditAcceptDelay(int delay)
*/
void QCalendarWidget::updateCell(const QDate &date)
{
- if (!date.isValid()) {
+ if (Q_UNLIKELY(!date.isValid())) {
qWarning("QCalendarWidget::updateCell: Invalid date");
return;
}
diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp
index ed3af90532..565fc7c428 100644
--- a/src/widgets/widgets/qcombobox.cpp
+++ b/src/widgets/widgets/qcombobox.cpp
@@ -1360,7 +1360,7 @@ int QComboBox::maxVisibleItems() const
void QComboBox::setMaxVisibleItems(int maxItems)
{
Q_D(QComboBox);
- if (maxItems < 0) {
+ if (Q_UNLIKELY(maxItems < 0)) {
qWarning("QComboBox::setMaxVisibleItems: "
"Invalid max visible items (%d) must be >= 0", maxItems);
return;
@@ -1395,13 +1395,14 @@ int QComboBox::count() const
void QComboBox::setMaxCount(int max)
{
Q_D(QComboBox);
- if (max < 0) {
+ if (Q_UNLIKELY(max < 0)) {
qWarning("QComboBox::setMaxCount: Invalid count (%d) must be >= 0", max);
return;
}
- if (max < count())
- d->model->removeRows(max, count() - max, d->root);
+ const int rowCount = count();
+ if (rowCount > max)
+ d->model->removeRows(max, rowCount - max, d->root);
d->maxCount = max;
}
@@ -1448,7 +1449,7 @@ void QComboBox::setAutoCompletion(bool enable)
Q_D(QComboBox);
#ifdef QT_KEYPAD_NAVIGATION
- if (QApplication::keypadNavigationEnabled() && !enable && isEditable())
+ if (Q_UNLIKELY(QApplication::keypadNavigationEnabled() && !enable && isEditable()))
qWarning("QComboBox::setAutoCompletion: auto completion is mandatory when combo box editable");
#endif
@@ -1758,7 +1759,7 @@ void QComboBox::setEditable(bool editable)
void QComboBox::setLineEdit(QLineEdit *edit)
{
Q_D(QComboBox);
- if (!edit) {
+ if (Q_UNLIKELY(!edit)) {
qWarning("QComboBox::setLineEdit: cannot set a 0 line edit");
return;
}
@@ -1770,7 +1771,9 @@ void QComboBox::setLineEdit(QLineEdit *edit)
delete d->lineEdit;
d->lineEdit = edit;
+#ifndef QT_NO_IM
qt_widget_private(d->lineEdit)->inheritsInputMethodHints = 1;
+#endif
if (d->lineEdit->parent() != this)
d->lineEdit->setParent(this);
connect(d->lineEdit, SIGNAL(returnPressed()), this, SLOT(_q_returnPressed()));
@@ -1915,7 +1918,7 @@ QAbstractItemDelegate *QComboBox::itemDelegate() const
*/
void QComboBox::setItemDelegate(QAbstractItemDelegate *delegate)
{
- if (!delegate) {
+ if (Q_UNLIKELY(!delegate)) {
qWarning("QComboBox::setItemDelegate: cannot set a 0 delegate");
return;
}
@@ -1947,7 +1950,7 @@ void QComboBox::setModel(QAbstractItemModel *model)
{
Q_D(QComboBox);
- if (!model) {
+ if (Q_UNLIKELY(!model)) {
qWarning("QComboBox::setModel: cannot set a 0 model");
return;
}
@@ -2393,7 +2396,7 @@ QAbstractItemView *QComboBox::view() const
void QComboBox::setView(QAbstractItemView *itemView)
{
Q_D(QComboBox);
- if (!itemView) {
+ if (Q_UNLIKELY(!itemView)) {
qWarning("QComboBox::setView: cannot set a 0 view");
return;
}
@@ -2583,7 +2586,7 @@ void QComboBox::showPopup()
#endif
while (!toCheck.isEmpty()) {
QModelIndex parent = toCheck.pop();
- for (int i = 0; i < d->model->rowCount(parent); ++i) {
+ for (int i = 0, end = d->model->rowCount(parent); i < end; ++i) {
QModelIndex idx = d->model->index(i, d->modelColumn, parent);
if (!idx.isValid())
continue;
@@ -3192,6 +3195,8 @@ void QComboBox::keyPressEvent(QKeyEvent *e)
}
}
+ const int rowCount = count();
+
if (move != NoMove) {
e->accept();
switch (move) {
@@ -3199,11 +3204,11 @@ void QComboBox::keyPressEvent(QKeyEvent *e)
newIndex = -1;
case MoveDown:
newIndex++;
- while ((newIndex < count()) && !(d->model->flags(d->model->index(newIndex,d->modelColumn,d->root)) & Qt::ItemIsEnabled))
+ while (newIndex < rowCount && !(d->model->index(newIndex, d->modelColumn, d->root).flags() & Qt::ItemIsEnabled))
newIndex++;
break;
case MoveLast:
- newIndex = count();
+ newIndex = rowCount;
case MoveUp:
newIndex--;
while ((newIndex >= 0) && !(d->model->flags(d->model->index(newIndex,d->modelColumn,d->root)) & Qt::ItemIsEnabled))
@@ -3214,7 +3219,7 @@ void QComboBox::keyPressEvent(QKeyEvent *e)
break;
}
- if (newIndex >= 0 && newIndex < count() && newIndex != currentIndex()) {
+ if (newIndex >= 0 && newIndex < rowCount && newIndex != currentIndex()) {
setCurrentIndex(newIndex);
d->emitActivated(d->currentIndex);
}
@@ -3247,6 +3252,7 @@ void QComboBox::wheelEvent(QWheelEvent *e)
#else
Q_D(QComboBox);
if (!d->viewContainer()->isVisible()) {
+ const int rowCount = count();
int newIndex = currentIndex();
if (e->delta() > 0) {
@@ -3255,11 +3261,11 @@ void QComboBox::wheelEvent(QWheelEvent *e)
newIndex--;
} else if (e->delta() < 0) {
newIndex++;
- while ((newIndex < count()) && !(d->model->flags(d->model->index(newIndex,d->modelColumn,d->root)) & Qt::ItemIsEnabled))
+ while (newIndex < rowCount && !(d->model->index(newIndex, d->modelColumn, d->root).flags() & Qt::ItemIsEnabled))
newIndex++;
}
- if (newIndex >= 0 && newIndex < count() && newIndex != currentIndex()) {
+ if (newIndex >= 0 && newIndex < rowCount && newIndex != currentIndex()) {
setCurrentIndex(newIndex);
d->emitActivated(d->currentIndex);
}
diff --git a/src/widgets/widgets/qcombobox.h b/src/widgets/widgets/qcombobox.h
index 3182a0a3aa..45b601788f 100644
--- a/src/widgets/widgets/qcombobox.h
+++ b/src/widgets/widgets/qcombobox.h
@@ -229,7 +229,9 @@ protected:
#ifndef QT_NO_WHEELEVENT
void wheelEvent(QWheelEvent *e) Q_DECL_OVERRIDE;
#endif
+#ifndef QT_NO_CONTEXTMENU
void contextMenuEvent(QContextMenuEvent *e) Q_DECL_OVERRIDE;
+#endif // QT_NO_CONTEXTMENU
void inputMethodEvent(QInputMethodEvent *) Q_DECL_OVERRIDE;
void initStyleOption(QStyleOptionComboBox *option) const;
diff --git a/src/widgets/widgets/qdatetimeedit.cpp b/src/widgets/widgets/qdatetimeedit.cpp
index 42987df3ec..bff1ff6c67 100644
--- a/src/widgets/widgets/qdatetimeedit.cpp
+++ b/src/widgets/widgets/qdatetimeedit.cpp
@@ -760,17 +760,17 @@ QCalendarWidget *QDateTimeEdit::calendarWidget() const
void QDateTimeEdit::setCalendarWidget(QCalendarWidget *calendarWidget)
{
Q_D(QDateTimeEdit);
- if (!calendarWidget) {
+ if (Q_UNLIKELY(!calendarWidget)) {
qWarning("QDateTimeEdit::setCalendarWidget: Cannot set a null calendar widget");
return;
}
- if (!d->calendarPopup) {
+ if (Q_UNLIKELY(!d->calendarPopup)) {
qWarning("QDateTimeEdit::setCalendarWidget: calendarPopup is set to false");
return;
}
- if (!(d->display & QDateTimeParser::DateSectionMask)) {
+ if (Q_UNLIKELY(!(d->display & QDateTimeParser::DateSectionMask))) {
qWarning("QDateTimeEdit::setCalendarWidget: no date sections specified");
return;
}
@@ -1864,7 +1864,7 @@ void QDateTimeEditPrivate::clearSection(int index)
const QSignalBlocker blocker(edit);
QString t = edit->text();
const int pos = sectionPos(index);
- if (pos == -1) {
+ if (Q_UNLIKELY(pos == -1)) {
qWarning("QDateTimeEdit: Internal error (%s:%d)", __FILE__, __LINE__);
return;
}
diff --git a/src/widgets/widgets/qdialogbuttonbox.cpp b/src/widgets/widgets/qdialogbuttonbox.cpp
index 5b6bfb3b3c..e262f2db22 100644
--- a/src/widgets/widgets/qdialogbuttonbox.cpp
+++ b/src/widgets/widgets/qdialogbuttonbox.cpp
@@ -405,11 +405,10 @@ QPushButton *QDialogButtonBoxPrivate::createButton(QDialogButtonBox::StandardBut
button->setStyle(style);
standardButtonHash.insert(button, sbutton);
QPlatformDialogHelper::ButtonRole role = QPlatformDialogHelper::buttonRole(static_cast<QPlatformDialogHelper::StandardButton>(sbutton));
- if (role != QPlatformDialogHelper::InvalidRole) {
- addButton(button, static_cast<QDialogButtonBox::ButtonRole>(role), doLayout);
- } else {
+ if (Q_UNLIKELY(role == QPlatformDialogHelper::InvalidRole))
qWarning("QDialogButtonBox::createButton: Invalid ButtonRole, button not added");
- }
+ else
+ addButton(button, static_cast<QDialogButtonBox::ButtonRole>(role), doLayout);
#ifdef Q_DEAD_CODE_FROM_QT4_MAC
// Since mnemonics is off by default on Mac, we add a Cmd-D
@@ -753,7 +752,7 @@ void QDialogButtonBox::removeButton(QAbstractButton *button)
void QDialogButtonBox::addButton(QAbstractButton *button, ButtonRole role)
{
Q_D(QDialogButtonBox);
- if (role <= InvalidRole || role >= NRoles) {
+ if (Q_UNLIKELY(role <= InvalidRole || role >= NRoles)) {
qWarning("QDialogButtonBox::addButton: Invalid ButtonRole, button not added");
return;
}
@@ -772,7 +771,7 @@ void QDialogButtonBox::addButton(QAbstractButton *button, ButtonRole role)
QPushButton *QDialogButtonBox::addButton(const QString &text, ButtonRole role)
{
Q_D(QDialogButtonBox);
- if (role <= InvalidRole || role >= NRoles) {
+ if (Q_UNLIKELY(role <= InvalidRole || role >= NRoles)) {
qWarning("QDialogButtonBox::addButton: Invalid ButtonRole, button not added");
return 0;
}
diff --git a/src/widgets/widgets/qdockarealayout.cpp b/src/widgets/widgets/qdockarealayout.cpp
index 8c79425e44..07efbafb31 100644
--- a/src/widgets/widgets/qdockarealayout.cpp
+++ b/src/widgets/widgets/qdockarealayout.cpp
@@ -1677,9 +1677,9 @@ void QDockAreaLayoutInfo::tab(int index, QLayoutItem *dockWidgetItem)
QDockAreaLayoutInfo *new_info
= new QDockAreaLayoutInfo(sep, dockPos, o, tabBarShape, mainWindow);
item_list[index].subinfo = new_info;
- new_info->item_list.append(item_list.at(index).widgetItem);
+ new_info->item_list.append(QDockAreaLayoutItem(item_list.at(index).widgetItem));
item_list[index].widgetItem = 0;
- new_info->item_list.append(dockWidgetItem);
+ new_info->item_list.append(QDockAreaLayoutItem(dockWidgetItem));
new_info->tabbed = true;
new_info->updateTabBar();
new_info->setCurrentTab(dockWidgetItem->widget());
@@ -1699,9 +1699,9 @@ void QDockAreaLayoutInfo::split(int index, Qt::Orientation orientation,
QDockAreaLayoutInfo *new_info
= new QDockAreaLayoutInfo(sep, dockPos, orientation, tabBarShape, mainWindow);
item_list[index].subinfo = new_info;
- new_info->item_list.append(item_list.at(index).widgetItem);
+ new_info->item_list.append(QDockAreaLayoutItem(item_list.at(index).widgetItem));
item_list[index].widgetItem = 0;
- new_info->item_list.append(dockWidgetItem);
+ new_info->item_list.append(QDockAreaLayoutItem(dockWidgetItem));
}
}
@@ -1802,9 +1802,9 @@ void QDockAreaLayoutInfo::saveState(QDataStream &stream) const
stream << (uchar) WidgetMarker;
QWidget *w = item.widgetItem->widget();
QString name = w->objectName();
- if (name.isEmpty()) {
- qWarning("QMainWindow::saveState(): 'objectName' not set for QDockWidget %p '%s;",
- w, qPrintable(w->windowTitle()));
+ if (Q_UNLIKELY(name.isEmpty())) {
+ qWarning("QMainWindow::saveState(): 'objectName' not set for QDockWidget %p '%ls;",
+ w, qUtf16Printable(w->windowTitle()));
}
stream << name;
@@ -3082,8 +3082,8 @@ void QDockAreaLayout::addDockWidget(QInternal::DockPosition pos, QDockWidget *do
int tbshape = 0;
#endif
QDockAreaLayoutInfo new_info(&sep, pos, orientation, tbshape, mainWindow);
- new_info.item_list.append(new QDockAreaLayoutInfo(info));
- new_info.item_list.append(dockWidgetItem);
+ new_info.item_list.append(QDockAreaLayoutItem(new QDockAreaLayoutInfo(info)));
+ new_info.item_list.append(QDockAreaLayoutItem(dockWidgetItem));
info = new_info;
}
@@ -3110,7 +3110,7 @@ void QDockAreaLayout::tabifyDockWidget(QDockWidget *first, QDockWidget *second)
void QDockAreaLayout::resizeDocks(const QList<QDockWidget *> &docks,
const QList<int> &sizes, Qt::Orientation o)
{
- if (docks.count() != sizes.count()) {
+ if (Q_UNLIKELY(docks.count() != sizes.count())) {
qWarning("QMainWidget::resizeDocks: size of the lists are not the same");
return;
}
@@ -3118,12 +3118,12 @@ void QDockAreaLayout::resizeDocks(const QList<QDockWidget *> &docks,
fallbackToSizeHints = false;
for (int i = 0; i < count; ++i) {
QList<int> path = indexOf(docks[i]);
- if (path.isEmpty()) {
+ if (Q_UNLIKELY(path.isEmpty())) {
qWarning("QMainWidget::resizeDocks: one QDockWidget is not part of the layout");
continue;
}
int size = sizes[i];
- if (size <= 0) {
+ if (Q_UNLIKELY(size <= 0)) {
qWarning("QMainWidget::resizeDocks: all sizes need to be larger than 0");
size = 1;
}
diff --git a/src/widgets/widgets/qdockarealayout_p.h b/src/widgets/widgets/qdockarealayout_p.h
index 5d352f0124..b0f2bdffa4 100644
--- a/src/widgets/widgets/qdockarealayout_p.h
+++ b/src/widgets/widgets/qdockarealayout_p.h
@@ -82,9 +82,9 @@ struct QDockAreaLayoutItem
{
enum ItemFlags { NoFlags = 0, GapItem = 1, KeepSize = 2 };
- QDockAreaLayoutItem(QLayoutItem *_widgetItem = 0);
- QDockAreaLayoutItem(QDockAreaLayoutInfo *_subinfo);
- QDockAreaLayoutItem(QPlaceHolderItem *_placeHolderItem);
+ explicit QDockAreaLayoutItem(QLayoutItem *_widgetItem = 0);
+ explicit QDockAreaLayoutItem(QDockAreaLayoutInfo *_subinfo);
+ explicit QDockAreaLayoutItem(QPlaceHolderItem *_placeHolderItem);
QDockAreaLayoutItem(const QDockAreaLayoutItem &other);
~QDockAreaLayoutItem();
@@ -109,7 +109,7 @@ class Q_AUTOTEST_EXPORT QPlaceHolderItem
{
public:
QPlaceHolderItem() : hidden(false), window(false) {}
- QPlaceHolderItem(QWidget *w);
+ explicit QPlaceHolderItem(QWidget *w);
QString objectName;
bool hidden, window;
diff --git a/src/widgets/widgets/qgroupbox.cpp b/src/widgets/widgets/qgroupbox.cpp
index 0ff5dc8753..559c8bbd33 100644
--- a/src/widgets/widgets/qgroupbox.cpp
+++ b/src/widgets/widgets/qgroupbox.cpp
@@ -653,9 +653,7 @@ void QGroupBox::setChecked(bool b)
void QGroupBoxPrivate::_q_setChildrenEnabled(bool b)
{
Q_Q(QGroupBox);
- QObjectList childList = q->children();
- for (int i = 0; i < childList.size(); ++i) {
- QObject *o = childList.at(i);
+ for (QObject *o : q->children()) {
if (o->isWidgetType()) {
QWidget *w = static_cast<QWidget *>(o);
if (b) {
@@ -707,6 +705,8 @@ void QGroupBox::mousePressEvent(QMouseEvent *event)
if (d->checkable && (d->pressedControl & (QStyle::SC_GroupBoxCheckBox | QStyle::SC_GroupBoxLabel))) {
d->overCheckBox = true;
update(style()->subControlRect(QStyle::CC_GroupBox, &box, QStyle::SC_GroupBoxCheckBox, this));
+ } else {
+ event->ignore();
}
}
@@ -723,6 +723,8 @@ void QGroupBox::mouseMoveEvent(QMouseEvent *event)
if (d->checkable && (d->pressedControl == QStyle::SC_GroupBoxCheckBox || d->pressedControl == QStyle::SC_GroupBoxLabel)
&& (d->overCheckBox != oldOverCheckBox))
update(style()->subControlRect(QStyle::CC_GroupBox, &box, QStyle::SC_GroupBoxCheckBox, this));
+
+ event->ignore();
}
/*! \reimp */
diff --git a/src/widgets/widgets/qlabel.cpp b/src/widgets/widgets/qlabel.cpp
index 55e277026c..eeabd5db38 100644
--- a/src/widgets/widgets/qlabel.cpp
+++ b/src/widgets/widgets/qlabel.cpp
@@ -882,13 +882,11 @@ void QLabel::mouseReleaseEvent(QMouseEvent *ev)
d->sendControlEvent(ev);
}
+#ifndef QT_NO_CONTEXTMENU
/*!\reimp
*/
void QLabel::contextMenuEvent(QContextMenuEvent *ev)
{
-#ifdef QT_NO_CONTEXTMENU
- Q_UNUSED(ev);
-#else
Q_D(QLabel);
if (!d->isTextLabel) {
ev->ignore();
@@ -902,8 +900,8 @@ void QLabel::contextMenuEvent(QContextMenuEvent *ev)
ev->accept();
menu->setAttribute(Qt::WA_DeleteOnClose);
menu->popup(ev->globalPos());
-#endif
}
+#endif // QT_NO_CONTEXTMENU
/*!
\reimp
diff --git a/src/widgets/widgets/qlabel.h b/src/widgets/widgets/qlabel.h
index 1a3a68db60..6b6e15e0a8 100644
--- a/src/widgets/widgets/qlabel.h
+++ b/src/widgets/widgets/qlabel.h
@@ -132,7 +132,9 @@ protected:
void mousePressEvent(QMouseEvent *ev) Q_DECL_OVERRIDE;
void mouseMoveEvent(QMouseEvent *ev) Q_DECL_OVERRIDE;
void mouseReleaseEvent(QMouseEvent *ev) Q_DECL_OVERRIDE;
+#ifndef QT_NO_CONTEXTMENU
void contextMenuEvent(QContextMenuEvent *ev) Q_DECL_OVERRIDE;
+#endif // QT_NO_CONTEXTMENU
void focusInEvent(QFocusEvent *ev) Q_DECL_OVERRIDE;
void focusOutEvent(QFocusEvent *ev) Q_DECL_OVERRIDE;
bool focusNextPrevChild(bool next) Q_DECL_OVERRIDE;
diff --git a/src/widgets/widgets/qlcdnumber.cpp b/src/widgets/widgets/qlcdnumber.cpp
index d17e3e2470..b9c209ed3b 100644
--- a/src/widgets/widgets/qlcdnumber.cpp
+++ b/src/widgets/widgets/qlcdnumber.cpp
@@ -402,12 +402,12 @@ QLCDNumber::~QLCDNumber()
void QLCDNumber::setDigitCount(int numDigits)
{
Q_D(QLCDNumber);
- if (numDigits > 99) {
+ if (Q_UNLIKELY(numDigits > 99)) {
qWarning("QLCDNumber::setNumDigits: (%s) Max 99 digits allowed",
objectName().toLocal8Bit().constData());
numDigits = 99;
}
- if (numDigits < 0) {
+ if (Q_UNLIKELY(numDigits < 0)) {
qWarning("QLCDNumber::setNumDigits: (%s) Min 0 digits allowed",
objectName().toLocal8Bit().constData());
numDigits = 0;
diff --git a/src/widgets/widgets/qlineedit.cpp b/src/widgets/widgets/qlineedit.cpp
index 6b32665065..b8283a0818 100644
--- a/src/widgets/widgets/qlineedit.cpp
+++ b/src/widgets/widgets/qlineedit.cpp
@@ -982,7 +982,7 @@ int QLineEdit::selectionStart() const
void QLineEdit::setSelection(int start, int length)
{
Q_D(QLineEdit);
- if (start < 0 || start > (int)d->control->end()) {
+ if (Q_UNLIKELY(start < 0 || start > (int)d->control->end())) {
qWarning("QLineEdit::setSelection: Invalid start position (%d)", start);
return;
}
diff --git a/src/widgets/widgets/qlineedit_p.h b/src/widgets/widgets/qlineedit_p.h
index 60372ab393..8d15aa70e8 100644
--- a/src/widgets/widgets/qlineedit_p.h
+++ b/src/widgets/widgets/qlineedit_p.h
@@ -108,7 +108,7 @@ public:
};
struct SideWidgetEntry {
- SideWidgetEntry(QWidget *w = 0, QAction *a = 0, int _flags = 0) : widget(w), action(a), flags(_flags) {}
+ explicit SideWidgetEntry(QWidget *w = 0, QAction *a = 0, int _flags = 0) : widget(w), action(a), flags(_flags) {}
QWidget *widget;
QAction *action;
diff --git a/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm b/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm
index a384e41d1b..7bd539033a 100644
--- a/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm
+++ b/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm
@@ -31,7 +31,7 @@
**
****************************************************************************/
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#include "qmaccocoaviewcontainer_mac.h"
#include <QtCore/QDebug>
@@ -93,7 +93,7 @@ inline QPlatformNativeInterface::NativeResourceForIntegrationFunction resolvePla
QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface();
QPlatformNativeInterface::NativeResourceForIntegrationFunction function =
nativeInterface->nativeResourceFunctionForIntegration(functionName);
- if (!function)
+ if (Q_UNLIKELY(!function))
qWarning() << "Qt could not resolve function" << functionName
<< "from QGuiApplication::platformNativeInterface()->nativeResourceFunctionForIntegration()";
return function;
diff --git a/src/widgets/widgets/qmacnativewidget_mac.mm b/src/widgets/widgets/qmacnativewidget_mac.mm
index 46a43c4110..729aa9aba0 100644
--- a/src/widgets/widgets/qmacnativewidget_mac.mm
+++ b/src/widgets/widgets/qmacnativewidget_mac.mm
@@ -31,7 +31,7 @@
**
****************************************************************************/
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#include "qmacnativewidget_mac.h"
#include <QtCore/qdebug.h>
@@ -82,7 +82,7 @@ inline QPlatformNativeInterface::NativeResourceForIntegrationFunction resolvePla
QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface();
QPlatformNativeInterface::NativeResourceForIntegrationFunction function =
nativeInterface->nativeResourceFunctionForIntegration(functionName);
- if (!function)
+ if (Q_UNLIKELY(!function))
qWarning() << "Qt could not resolve function" << functionName
<< "from QGuiApplication::platformNativeInterface()->nativeResourceFunctionForIntegration()";
return function;
diff --git a/src/widgets/widgets/qmainwindow.cpp b/src/widgets/widgets/qmainwindow.cpp
index ff4bb3cc98..2fbd83ef54 100644
--- a/src/widgets/widgets/qmainwindow.cpp
+++ b/src/widgets/widgets/qmainwindow.cpp
@@ -693,7 +693,7 @@ void QMainWindow::setCorner(Qt::Corner corner, Qt::DockWidgetArea area)
valid = (area == Qt::BottomDockWidgetArea || area == Qt::RightDockWidgetArea);
break;
}
- if (!valid)
+ if (Q_UNLIKELY(!valid))
qWarning("QMainWindow::setCorner(): 'area' is not valid for 'corner'");
else
d_func()->layout->setCorner(corner, area);
diff --git a/src/widgets/widgets/qmainwindowlayout.cpp b/src/widgets/widgets/qmainwindowlayout.cpp
index 54e956c4cf..6b171ae452 100644
--- a/src/widgets/widgets/qmainwindowlayout.cpp
+++ b/src/widgets/widgets/qmainwindowlayout.cpp
@@ -1945,7 +1945,7 @@ bool QMainWindowLayout::plug(QLayoutItem *widgetItem)
static_cast<QMainWindow*>(parentWidget()));
info->tabbed = true;
QLayout *parentLayout = currentHoveredFloat->parentWidget()->layout();
- info->item_list.append(parentLayout->takeAt(parentLayout->indexOf(currentHoveredFloat)));
+ info->item_list.append(QDockAreaLayoutItem(parentLayout->takeAt(parentLayout->indexOf(currentHoveredFloat))));
dropTo->setParent(floatingTabs);
dropTo->show();
diff --git a/src/widgets/widgets/qmainwindowlayout_p.h b/src/widgets/widgets/qmainwindowlayout_p.h
index 9a13e5f5ce..b718a0ca4f 100644
--- a/src/widgets/widgets/qmainwindowlayout_p.h
+++ b/src/widgets/widgets/qmainwindowlayout_p.h
@@ -60,18 +60,6 @@
#include "qdockarealayout_p.h"
#include "qtoolbararealayout_p.h"
-#ifdef Q_DEAD_CODE_FROM_QT4_MAC
-// Forward defs to make avoid including Carbon.h (faster compile you know ;).
-struct OpaqueHIObjectRef;
-typedef struct OpaqueHIObjectRef* HIObjectRef;
-typedef HIObjectRef HIToolbarItemRef;
-typedef const void * CFTypeRef;
-typedef const struct __CFString * CFStringRef;
-
-#include <private/qunifiedtoolbarsurface_mac_p.h>
-
-#endif // Q_DEAD_CODE_FROM_QT4_MAC
-
QT_BEGIN_NAMESPACE
class QToolBar;
@@ -275,7 +263,7 @@ public:
// save/restore
- enum { // sentinel values used to validate state data
+ enum VersionMarkers { // sentinel values used to validate state data
VersionMarker = 0xff
};
void saveState(QDataStream &stream) const;
diff --git a/src/widgets/widgets/qmdiarea.cpp b/src/widgets/widgets/qmdiarea.cpp
index e683c48ad3..50685667d3 100644
--- a/src/widgets/widgets/qmdiarea.cpp
+++ b/src/widgets/widgets/qmdiarea.cpp
@@ -161,7 +161,6 @@
#include <QResizeEvent>
#include <QScrollBar>
#include <QtAlgorithms>
-#include <QMutableVectorIterator>
#include <QPainter>
#include <QFontMetrics>
#include <QStyleOption>
@@ -179,7 +178,7 @@ using namespace QMdi;
// Asserts in debug mode, gives warning otherwise.
static bool sanityCheck(const QMdiSubWindow * const child, const char *where)
{
- if (!child) {
+ if (Q_UNLIKELY(!child)) {
const char error[] = "null pointer";
Q_ASSERT_X(false, where, error);
qWarning("%s:%s", where, error);
@@ -190,13 +189,13 @@ static bool sanityCheck(const QMdiSubWindow * const child, const char *where)
static bool sanityCheck(const QList<QWidget *> &widgets, const int index, const char *where)
{
- if (index < 0 || index >= widgets.size()) {
+ if (Q_UNLIKELY(index < 0 || index >= widgets.size())) {
const char error[] = "index out of range";
Q_ASSERT_X(false, where, error);
qWarning("%s:%s", where, error);
return false;
}
- if (!widgets.at(index)) {
+ if (Q_UNLIKELY(!widgets.at(index))) {
const char error[] = "null pointer";
Q_ASSERT_X(false, where, error);
qWarning("%s:%s", where, error);
@@ -380,7 +379,7 @@ void IconTiler::rearrange(QList<QWidget *> &widgets, const QRect &domain) const
return;
const int n = widgets.size();
- const int width = widgets.at(0)->width();
+ const int width = qMax(widgets.at(0)->width(), 1);
const int height = widgets.at(0)->height();
const int ncols = qMax(domain.width() / width, 1);
const int nrows = n / ncols + ((n % ncols) ? 1 : 0);
@@ -409,7 +408,7 @@ void IconTiler::rearrange(QList<QWidget *> &widgets, const QRect &domain) const
int MinOverlapPlacer::accumulatedOverlap(const QRect &source, const QVector<QRect> &rects)
{
int accOverlap = 0;
- foreach (const QRect &rect, rects) {
+ for (const QRect &rect : rects) {
QRect intersection = source.intersected(rect);
accOverlap += intersection.width() * intersection.height();
}
@@ -426,7 +425,7 @@ QRect MinOverlapPlacer::findMinOverlapRect(const QVector<QRect> &source, const Q
{
int minAccOverlap = -1;
QRect minAccOverlapRect;
- foreach (const QRect &srcRect, source) {
+ for (const QRect &srcRect : source) {
const int accOverlap = accumulatedOverlap(srcRect, rects);
if (accOverlap < minAccOverlap || minAccOverlap == -1) {
minAccOverlap = accOverlap;
@@ -455,7 +454,7 @@ QVector<QRect> MinOverlapPlacer::getCandidatePlacements(const QSize &size, const
if (domain.bottom() - size.height() + 1 >= 0)
ylist << domain.bottom() - size.height() + 1;
- foreach (const QRect &rect, rects) {
+ for (const QRect &rect : rects) {
xlist << rect.right() + 1;
ylist << rect.bottom() + 1;
}
@@ -480,17 +479,16 @@ QVector<QRect> MinOverlapPlacer::getCandidatePlacements(const QSize &size, const
*/
QVector<QRect> MinOverlapPlacer::findNonInsiders(const QRect &domain, QVector<QRect> &source)
{
+ const auto containedInDomain =
+ [domain](const QRect &srcRect) { return domain.contains(srcRect); };
+
+ const auto firstOut = std::stable_partition(source.begin(), source.end(), containedInDomain);
+
QVector<QRect> result;
- result.reserve(source.size());
+ result.reserve(source.end() - firstOut);
+ std::copy(firstOut, source.end(), std::back_inserter(result));
- QMutableVectorIterator<QRect> it(source);
- while (it.hasNext()) {
- const QRect srcRect = it.next();
- if (!domain.contains(srcRect)) {
- result << srcRect;
- it.remove();
- }
- }
+ source.erase(firstOut, source.end());
return result;
}
@@ -506,13 +504,13 @@ QVector<QRect> MinOverlapPlacer::findMaxOverlappers(const QRect &domain, const Q
result.reserve(source.size());
int maxOverlap = -1;
- foreach (const QRect &srcRect, source) {
+ for (const QRect &srcRect : source) {
QRect intersection = domain.intersected(srcRect);
const int overlap = intersection.width() * intersection.height();
if (overlap >= maxOverlap || maxOverlap == -1) {
if (overlap > maxOverlap) {
maxOverlap = overlap;
- result.clear();
+ result.resize(0);
}
result << srcRect;
}
@@ -551,7 +549,7 @@ QPoint MinOverlapPlacer::place(const QSize &size, const QVector<QRect> &rects,
{
if (size.isEmpty() || !domain.isValid())
return QPoint();
- foreach (const QRect &rect, rects) {
+ for (const QRect &rect : rects) {
if (!rect.isValid())
return QPoint();
}
@@ -938,7 +936,7 @@ void QMdiAreaPrivate::rearrange(Rearranger *rearranger)
if (!sanityCheck(child, "QMdiArea::rearrange") || !child->isVisible())
continue;
if (rearranger->type() == Rearranger::IconTiler) {
- if (child->isMinimized() && !child->isShaded() && !(child->windowFlags() & Qt::FramelessWindowHint))
+ if (child->isMinimized() && !child->isShaded())
widgets.append(child);
} else {
if (child->isMinimized() && !child->isShaded())
@@ -1239,7 +1237,8 @@ void QMdiAreaPrivate::internalRaise(QMdiSubWindow *mdiChild) const
QMdiSubWindow *stackUnderChild = 0;
if (!windowStaysOnTop(mdiChild)) {
- foreach (QObject *object, viewport->children()) {
+ const auto children = viewport->children(); // take a copy, as raising/stacking under changes the order
+ for (QObject *object : children) {
QMdiSubWindow *child = qobject_cast<QMdiSubWindow *>(object);
if (!child || !childWindows.contains(child))
continue;
@@ -1394,7 +1393,7 @@ QMdiAreaPrivate::subWindowList(QMdiArea::WindowOrder order, bool reversed) const
list.prepend(child);
}
} else if (order == QMdiArea::StackingOrder) {
- foreach (QObject *object, viewport->children()) {
+ for (QObject *object : viewport->children()) {
QMdiSubWindow *child = qobject_cast<QMdiSubWindow *>(object);
if (!child || !childWindows.contains(child))
continue;
@@ -1743,7 +1742,7 @@ QSize QMdiArea::sizeHint() const
QSize desktopSize = QApplication::desktop()->size();
QSize size(desktopSize.width() * 2 / scaleFactor, desktopSize.height() * 2 / scaleFactor);
- foreach (QMdiSubWindow *child, d_func()->childWindows) {
+ for (QMdiSubWindow *child : d_func()->childWindows) {
if (!sanityCheck(child, "QMdiArea::sizeHint"))
continue;
size = size.expandedTo(child->sizeHint());
@@ -1761,7 +1760,7 @@ QSize QMdiArea::minimumSizeHint() const
style()->pixelMetric(QStyle::PM_TitleBarHeight, 0, this));
size = size.expandedTo(QAbstractScrollArea::minimumSizeHint());
if (!d->scrollBarsEnabled()) {
- foreach (QMdiSubWindow *child, d->childWindows) {
+ for (QMdiSubWindow *child : d->childWindows) {
if (!sanityCheck(child, "QMdiArea::sizeHint"))
continue;
size = size.expandedTo(child->minimumSizeHint());
@@ -1831,12 +1830,12 @@ void QMdiArea::setActiveSubWindow(QMdiSubWindow *window)
return;
}
- if (d->childWindows.isEmpty()) {
+ if (Q_UNLIKELY(d->childWindows.isEmpty())) {
qWarning("QMdiArea::setActiveSubWindow: workspace is empty");
return;
}
- if (d->childWindows.indexOf(window) == -1) {
+ if (Q_UNLIKELY(d->childWindows.indexOf(window) == -1)) {
qWarning("QMdiArea::setActiveSubWindow: window is not inside workspace");
return;
}
@@ -1960,7 +1959,7 @@ void QMdiArea::activatePreviousSubWindow()
*/
QMdiSubWindow *QMdiArea::addSubWindow(QWidget *widget, Qt::WindowFlags windowFlags)
{
- if (!widget) {
+ if (Q_UNLIKELY(!widget)) {
qWarning("QMdiArea::addSubWindow: null pointer to widget");
return 0;
}
@@ -1972,7 +1971,7 @@ QMdiSubWindow *QMdiArea::addSubWindow(QWidget *widget, Qt::WindowFlags windowFla
// Widget is already a QMdiSubWindow
if (child) {
- if (d->childWindows.indexOf(child) != -1) {
+ if (Q_UNLIKELY(d->childWindows.indexOf(child) != -1)) {
qWarning("QMdiArea::addSubWindow: window is already added");
return child;
}
@@ -2003,7 +2002,7 @@ QMdiSubWindow *QMdiArea::addSubWindow(QWidget *widget, Qt::WindowFlags windowFla
*/
void QMdiArea::removeSubWindow(QWidget *widget)
{
- if (!widget) {
+ if (Q_UNLIKELY(!widget)) {
qWarning("QMdiArea::removeSubWindow: null pointer to widget");
return;
}
@@ -2014,7 +2013,7 @@ void QMdiArea::removeSubWindow(QWidget *widget)
if (QMdiSubWindow *child = qobject_cast<QMdiSubWindow *>(widget)) {
int index = d->childWindows.indexOf(child);
- if (index == -1) {
+ if (Q_UNLIKELY(index == -1)) {
qWarning("QMdiArea::removeSubWindow: window is not inside workspace");
return;
}
@@ -2038,7 +2037,7 @@ void QMdiArea::removeSubWindow(QWidget *widget)
}
}
- if (!found)
+ if (Q_UNLIKELY(!found))
qWarning("QMdiArea::removeSubWindow: widget is not child of any window inside QMdiArea");
}
diff --git a/src/widgets/widgets/qmdiarea_p.h b/src/widgets/widgets/qmdiarea_p.h
index f6bdf61492..471703ea70 100644
--- a/src/widgets/widgets/qmdiarea_p.h
+++ b/src/widgets/widgets/qmdiarea_p.h
@@ -144,7 +144,7 @@ public:
QList<QMdi::Rearranger *> pendingRearrangements;
QVector< QPointer<QMdiSubWindow> > pendingPlacements;
QVector< QPointer<QMdiSubWindow> > childWindows;
- QList<int> indicesToActivatedChildren;
+ QVector<int> indicesToActivatedChildren;
QPointer<QMdiSubWindow> active;
QPointer<QMdiSubWindow> aboutToBecomeActive;
QBrush background;
diff --git a/src/widgets/widgets/qmdisubwindow.cpp b/src/widgets/widgets/qmdisubwindow.cpp
index 14aeb73baf..83a997dae0 100644
--- a/src/widgets/widgets/qmdisubwindow.cpp
+++ b/src/widgets/widgets/qmdisubwindow.cpp
@@ -1000,7 +1000,9 @@ void QMdiSubWindowPrivate::removeBaseWidget()
q->setWindowModified(false);
}
lastChildWindowTitle.clear();
- baseWidget->setParent(0);
+ // QTBUG-47993: parent widget can be reset before this call
+ if (baseWidget->parentWidget() == q)
+ baseWidget->setParent(0);
baseWidget = 0;
isWidgetHiddenByUs = false;
}
@@ -2204,8 +2206,8 @@ void QMdiSubWindowPrivate::setSizeGrip(QSizeGrip *newSizeGrip)
void QMdiSubWindowPrivate::setSizeGripVisible(bool visible) const
{
// See if we can find any size grips
- QList<QSizeGrip *> sizeGrips = q_func()->findChildren<QSizeGrip *>();
- foreach (QSizeGrip *grip, sizeGrips)
+ const QList<QSizeGrip *> sizeGrips = q_func()->findChildren<QSizeGrip *>();
+ for (QSizeGrip *grip : sizeGrips)
grip->setVisible(visible);
}
@@ -2307,7 +2309,7 @@ void QMdiSubWindow::setWidget(QWidget *widget)
return;
}
- if (widget == d->baseWidget) {
+ if (Q_UNLIKELY(widget == d->baseWidget)) {
qWarning("QMdiSubWindow::setWidget: widget is already set");
return;
}
@@ -2505,7 +2507,7 @@ void QMdiSubWindow::setKeyboardPageStep(int step)
void QMdiSubWindow::setSystemMenu(QMenu *systemMenu)
{
Q_D(QMdiSubWindow);
- if (systemMenu && systemMenu == d->systemMenu) {
+ if (Q_UNLIKELY(systemMenu && systemMenu == d->systemMenu)) {
qWarning("QMdiSubWindow::setSystemMenu: system menu is already set");
return;
}
@@ -2653,7 +2655,7 @@ void QMdiSubWindow::showShaded()
resize(d->internalMinimumSize);
// Hide the internal widget if not already hidden by the user.
- if (d->baseWidget && !d->baseWidget->isHidden()) {
+ if (d->baseWidget && !d->baseWidget->isHidden() && !(windowFlags() & Qt::FramelessWindowHint)) {
d->baseWidget->hide();
d->isWidgetHiddenByUs = true;
}
diff --git a/src/widgets/widgets/qmenu_mac.mm b/src/widgets/widgets/qmenu_mac.mm
index 8b29011178..58dee37bd9 100644
--- a/src/widgets/widgets/qmenu_mac.mm
+++ b/src/widgets/widgets/qmenu_mac.mm
@@ -32,7 +32,7 @@
****************************************************************************/
#import <Foundation/Foundation.h>
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#include "qmenu.h"
#include "qmenubar.h"
@@ -55,7 +55,7 @@ inline QPlatformNativeInterface::NativeResourceForIntegrationFunction resolvePla
QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface();
QPlatformNativeInterface::NativeResourceForIntegrationFunction function =
nativeInterface->nativeResourceFunctionForIntegration(functionName);
- if (!function)
+ if (Q_UNLIKELY(!function))
qWarning() << "Qt could not resolve function" << functionName
<< "from QGuiApplication::platformNativeInterface()->nativeResourceFunctionForIntegration()";
return function;
diff --git a/src/widgets/widgets/qplaintextedit.cpp b/src/widgets/widgets/qplaintextedit.cpp
index 91788a3383..7736356700 100644
--- a/src/widgets/widgets/qplaintextedit.cpp
+++ b/src/widgets/widgets/qplaintextedit.cpp
@@ -1291,7 +1291,7 @@ void QPlainTextEdit::setDocument(QTextDocument *document)
document->setDocumentLayout(documentLayout);
} else {
documentLayout = qobject_cast<QPlainTextDocumentLayout*>(document->documentLayout());
- if (!documentLayout) {
+ if (Q_UNLIKELY(!documentLayout)) {
qWarning("QPlainTextEdit::setDocument: Document set does not support QPlainTextDocumentLayout");
return;
}
@@ -1851,7 +1851,7 @@ void QPlainTextEditPrivate::relayoutDocument()
}
}
-static void fillBackground(QPainter *p, const QRectF &rect, QBrush brush, QRectF gradientRect = QRectF())
+static void fillBackground(QPainter *p, const QRectF &rect, QBrush brush, const QRectF &gradientRect = QRectF())
{
p->save();
if (brush.style() >= Qt::LinearGradientPattern && brush.style() <= Qt::ConicalGradientPattern) {
diff --git a/src/widgets/widgets/qscrollbar.h b/src/widgets/widgets/qscrollbar.h
index 4af5fb4a55..d044ec0519 100644
--- a/src/widgets/widgets/qscrollbar.h
+++ b/src/widgets/widgets/qscrollbar.h
@@ -78,6 +78,13 @@ private:
Q_DISABLE_COPY(QScrollBar)
Q_DECLARE_PRIVATE(QScrollBar)
+#ifndef QT_NO_ITEMVIEWS
+ friend class QTableView;
+ friend class QTreeViewPrivate;
+ friend class QCommonListViewBase;
+ friend class QListModeViewBase;
+ friend class QAbstractItemView;
+#endif
};
#endif // QT_NO_SCROLLBAR
diff --git a/src/widgets/widgets/qspinbox.cpp b/src/widgets/widgets/qspinbox.cpp
index 457e2e1e4c..13076ad870 100644
--- a/src/widgets/widgets/qspinbox.cpp
+++ b/src/widgets/widgets/qspinbox.cpp
@@ -438,7 +438,7 @@ void QSpinBox::setDisplayIntegerBase(int base)
{
Q_D(QSpinBox);
// Falls back to base 10 on invalid bases (like QString)
- if (base < 2 || base > 36) {
+ if (Q_UNLIKELY(base < 2 || base > 36)) {
qWarning("QSpinBox::setDisplayIntegerBase: Invalid base (%d)", base);
base = 10;
}
diff --git a/src/widgets/widgets/qsplitter.cpp b/src/widgets/widgets/qsplitter.cpp
index c2081c15f8..9162ba3c12 100644
--- a/src/widgets/widgets/qsplitter.cpp
+++ b/src/widgets/widgets/qsplitter.cpp
@@ -1058,7 +1058,7 @@ void QSplitter::setCollapsible(int index, bool collapse)
{
Q_D(QSplitter);
- if (index < 0 || index >= d->list.size()) {
+ if (Q_UNLIKELY(index < 0 || index >= d->list.size())) {
qWarning("QSplitter::setCollapsible: Index %d out of range", index);
return;
}
@@ -1071,7 +1071,7 @@ void QSplitter::setCollapsible(int index, bool collapse)
bool QSplitter::isCollapsible(int index) const
{
Q_D(const QSplitter);
- if (index < 0 || index >= d->list.size()) {
+ if (Q_UNLIKELY(index < 0 || index >= d->list.size())) {
qWarning("QSplitter::isCollapsible: Index %d out of range", index);
return false;
}
@@ -1215,7 +1215,7 @@ void QSplitter::childEvent(QChildEvent *c)
{
Q_D(QSplitter);
if (!c->child()->isWidgetType()) {
- if (c->type() == QEvent::ChildAdded && qobject_cast<QLayout *>(c->child()))
+ if (Q_UNLIKELY(c->type() == QEvent::ChildAdded && qobject_cast<QLayout *>(c->child())))
qWarning("Adding a QLayout to a QSplitter is not supported.");
return;
}
diff --git a/src/widgets/widgets/qstackedwidget.cpp b/src/widgets/widgets/qstackedwidget.cpp
index 19a2edf0f2..8a2eff4e39 100644
--- a/src/widgets/widgets/qstackedwidget.cpp
+++ b/src/widgets/widgets/qstackedwidget.cpp
@@ -237,7 +237,7 @@ QWidget *QStackedWidget::currentWidget() const
void QStackedWidget::setCurrentWidget(QWidget *widget)
{
Q_D(QStackedWidget);
- if (d->layout->indexOf(widget) == -1) {
+ if (Q_UNLIKELY(d->layout->indexOf(widget) == -1)) {
qWarning("QStackedWidget::setCurrentWidget: widget %p not contained in stack", widget);
return;
}
diff --git a/src/widgets/widgets/qstatusbar.cpp b/src/widgets/widgets/qstatusbar.cpp
index 19361fc793..2e8ca8510b 100644
--- a/src/widgets/widgets/qstatusbar.cpp
+++ b/src/widgets/widgets/qstatusbar.cpp
@@ -296,7 +296,7 @@ int QStatusBar::insertWidget(int index, QWidget *widget, int stretch)
QStatusBarPrivate::SBItem* item = new QStatusBarPrivate::SBItem(widget, stretch, false);
int idx = d->indexToLastNonPermanentWidget();
- if (index < 0 || index > d->items.size() || (idx >= 0 && index > idx + 1)) {
+ if (Q_UNLIKELY(index < 0 || index > d->items.size() || (idx >= 0 && index > idx + 1))) {
qWarning("QStatusBar::insertWidget: Index out of range (%d), appending widget", index);
index = idx + 1;
}
@@ -361,7 +361,7 @@ int QStatusBar::insertPermanentWidget(int index, QWidget *widget, int stretch)
QStatusBarPrivate::SBItem* item = new QStatusBarPrivate::SBItem(widget, stretch, true);
int idx = d->indexToLastNonPermanentWidget();
- if (index < 0 || index > d->items.size() || (idx >= 0 && index <= idx)) {
+ if (Q_UNLIKELY(index < 0 || index > d->items.size() || (idx >= 0 && index <= idx))) {
qWarning("QStatusBar::insertPermanentWidget: Index out of range (%d), appending widget", index);
index = d->items.size();
}
diff --git a/src/widgets/widgets/qtabbar.cpp b/src/widgets/widgets/qtabbar.cpp
index 7ea5455bf7..d2d737059e 100644
--- a/src/widgets/widgets/qtabbar.cpp
+++ b/src/widgets/widgets/qtabbar.cpp
@@ -348,13 +348,6 @@ void QTabBar::initStyleOption(QStyleOptionTab *option, int tabIndex) const
\since 5.2
*/
-int QTabBarPrivate::extraWidth() const
-{
- Q_Q(const QTabBar);
- return 2 * qMax(q->style()->pixelMetric(QStyle::PM_TabBarScrollButtonWidth, 0, q),
- QApplication::globalStrut().width());
-}
-
void QTabBarPrivate::init()
{
Q_Q(QTabBar);
@@ -408,7 +401,6 @@ int QTabBarPrivate::indexAtPos(const QPoint &p) const
void QTabBarPrivate::layoutTabs()
{
Q_Q(QTabBar);
- scrollOffset = 0;
layoutDirty = false;
QSize size = q->size();
int last, available;
@@ -508,39 +500,48 @@ void QTabBarPrivate::layoutTabs()
}
if (useScrollButtons && tabList.count() && last > available) {
- int extra = extraWidth();
- if (!vertTabs) {
- Qt::LayoutDirection ld = q->layoutDirection();
- QRect arrows = QStyle::visualRect(ld, q->rect(),
- QRect(available - extra, 0, extra, size.height()));
- int buttonOverlap = q->style()->pixelMetric(QStyle::PM_TabBar_ScrollButtonOverlap, 0, q);
-
- if (ld == Qt::LeftToRight) {
- leftB->setGeometry(arrows.left(), arrows.top(), extra/2, arrows.height());
- rightB->setGeometry(arrows.right() - extra/2 + buttonOverlap, arrows.top(),
- extra/2, arrows.height());
- leftB->setArrowType(Qt::LeftArrow);
- rightB->setArrowType(Qt::RightArrow);
- } else {
- rightB->setGeometry(arrows.left(), arrows.top(), extra/2, arrows.height());
- leftB->setGeometry(arrows.right() - extra/2 + buttonOverlap, arrows.top(),
- extra/2, arrows.height());
- rightB->setArrowType(Qt::LeftArrow);
- leftB->setArrowType(Qt::RightArrow);
- }
- } else {
- QRect arrows = QRect(0, available - extra, size.width(), extra );
- leftB->setGeometry(arrows.left(), arrows.top(), arrows.width(), extra/2);
+ const QRect scrollRect = normalizedScrollRect(0);
+ scrollOffset = -scrollRect.left();
+
+ Q_Q(QTabBar);
+ QStyleOption opt;
+ opt.init(q);
+ QRect scrollButtonLeftRect = q->style()->subElementRect(QStyle::SE_TabBarScrollLeftButton, &opt, q);
+ QRect scrollButtonRightRect = q->style()->subElementRect(QStyle::SE_TabBarScrollRightButton, &opt, q);
+ int scrollButtonWidth = q->style()->pixelMetric(QStyle::PM_TabBarScrollButtonWidth, &opt, q);
+
+ // Normally SE_TabBarScrollLeftButton should have the same width as PM_TabBarScrollButtonWidth.
+ // But if that is not the case, we set the actual button width to PM_TabBarScrollButtonWidth, and
+ // use the extra space from SE_TabBarScrollLeftButton as margins towards the tabs.
+ if (vertTabs) {
+ scrollButtonLeftRect.setHeight(scrollButtonWidth);
+ scrollButtonRightRect.setY(scrollButtonRightRect.bottom() + 1 - scrollButtonWidth);
+ scrollButtonRightRect.setHeight(scrollButtonWidth);
leftB->setArrowType(Qt::UpArrow);
- rightB->setGeometry(arrows.left(), arrows.bottom() - extra/2 + 1,
- arrows.width(), extra/2);
rightB->setArrowType(Qt::DownArrow);
+ } else if (q->layoutDirection() == Qt::RightToLeft) {
+ scrollButtonRightRect.setWidth(scrollButtonWidth);
+ scrollButtonLeftRect.setX(scrollButtonLeftRect.right() + 1 - scrollButtonWidth);
+ scrollButtonLeftRect.setWidth(scrollButtonWidth);
+ leftB->setArrowType(Qt::RightArrow);
+ rightB->setArrowType(Qt::LeftArrow);
+ } else {
+ scrollButtonLeftRect.setWidth(scrollButtonWidth);
+ scrollButtonRightRect.setX(scrollButtonRightRect.right() + 1 - scrollButtonWidth);
+ scrollButtonRightRect.setWidth(scrollButtonWidth);
+ leftB->setArrowType(Qt::LeftArrow);
+ rightB->setArrowType(Qt::RightArrow);
}
- leftB->setEnabled(scrollOffset > 0);
- rightB->setEnabled(last - scrollOffset >= available - extra);
+
+ leftB->setGeometry(scrollButtonLeftRect);
+ leftB->setEnabled(false);
leftB->show();
+
+ rightB->setGeometry(scrollButtonRightRect);
+ rightB->setEnabled(last - scrollOffset > scrollRect.x() + scrollRect.width());
rightB->show();
} else {
+ scrollOffset = 0;
rightB->hide();
leftB->hide();
}
@@ -549,6 +550,81 @@ void QTabBarPrivate::layoutTabs()
q->tabLayoutChange();
}
+QRect QTabBarPrivate::normalizedScrollRect(int index)
+{
+ // "Normalized scroll rect" means return the free space on the tab bar
+ // that doesn't overlap with scroll buttons or tear indicators, and
+ // always return the rect as horizontal Qt::LeftToRight, even if the
+ // tab bar itself is in a different orientation.
+
+ Q_Q(QTabBar);
+ QStyleOptionTab opt;
+ q->initStyleOption(&opt, currentIndex);
+ opt.rect = q->rect();
+
+ QRect scrollButtonLeftRect = q->style()->subElementRect(QStyle::SE_TabBarScrollLeftButton, &opt, q);
+ QRect scrollButtonRightRect = q->style()->subElementRect(QStyle::SE_TabBarScrollRightButton, &opt, q);
+ QRect tearLeftRect = q->style()->subElementRect(QStyle::SE_TabBarTearIndicatorLeft, &opt, q);
+ QRect tearRightRect = q->style()->subElementRect(QStyle::SE_TabBarTearIndicatorRight, &opt, q);
+
+ if (verticalTabs(shape)) {
+ int topEdge, bottomEdge;
+ bool leftButtonIsOnTop = scrollButtonLeftRect.y() < q->height() / 2;
+ bool rightButtonIsOnTop = scrollButtonRightRect.y() < q->height() / 2;
+
+ if (leftButtonIsOnTop && rightButtonIsOnTop) {
+ topEdge = scrollButtonRightRect.bottom() + 1;
+ bottomEdge = q->height();
+ } else if (!leftButtonIsOnTop && !rightButtonIsOnTop) {
+ topEdge = 0;
+ bottomEdge = scrollButtonLeftRect.top();
+ } else {
+ topEdge = scrollButtonLeftRect.bottom() + 1;
+ bottomEdge = scrollButtonRightRect.top();
+ }
+
+ bool tearTopVisible = index != 0 && topEdge != -scrollOffset;
+ bool tearBottomVisible = index != tabList.size() - 1 && bottomEdge != tabList.last().rect.bottom() + 1 - scrollOffset;
+ if (tearTopVisible && !tearLeftRect.isNull())
+ topEdge = tearLeftRect.bottom() + 1;
+ if (tearBottomVisible && !tearRightRect.isNull())
+ bottomEdge = tearRightRect.top();
+
+ return QRect(topEdge, 0, bottomEdge - topEdge, q->height());
+ } else {
+ if (q->layoutDirection() == Qt::RightToLeft) {
+ scrollButtonLeftRect = QStyle::visualRect(Qt::RightToLeft, q->rect(), scrollButtonLeftRect);
+ scrollButtonRightRect = QStyle::visualRect(Qt::RightToLeft, q->rect(), scrollButtonRightRect);
+ tearLeftRect = QStyle::visualRect(Qt::RightToLeft, q->rect(), tearLeftRect);
+ tearRightRect = QStyle::visualRect(Qt::RightToLeft, q->rect(), tearRightRect);
+ }
+
+ int leftEdge, rightEdge;
+ bool leftButtonIsOnLeftSide = scrollButtonLeftRect.x() < q->width() / 2;
+ bool rightButtonIsOnLeftSide = scrollButtonRightRect.x() < q->width() / 2;
+
+ if (leftButtonIsOnLeftSide && rightButtonIsOnLeftSide) {
+ leftEdge = scrollButtonRightRect.right() + 1;
+ rightEdge = q->width();
+ } else if (!leftButtonIsOnLeftSide && !rightButtonIsOnLeftSide) {
+ leftEdge = 0;
+ rightEdge = scrollButtonLeftRect.left();
+ } else {
+ leftEdge = scrollButtonLeftRect.right() + 1;
+ rightEdge = scrollButtonRightRect.left();
+ }
+
+ bool tearLeftVisible = index != 0 && leftEdge != -scrollOffset;
+ bool tearRightVisible = index != tabList.size() - 1 && rightEdge != tabList.last().rect.right() + 1 - scrollOffset;
+ if (tearLeftVisible && !tearLeftRect.isNull())
+ leftEdge = tearLeftRect.right() + 1;
+ if (tearRightVisible && !tearRightRect.isNull())
+ rightEdge = tearRightRect.left();
+
+ return QRect(leftEdge, 0, rightEdge - leftEdge, q->height());
+ }
+}
+
void QTabBarPrivate::makeVisible(int index)
{
Q_Q(QTabBar);
@@ -558,17 +634,24 @@ void QTabBarPrivate::makeVisible(int index)
const QRect tabRect = tabList.at(index).rect;
const int oldScrollOffset = scrollOffset;
const bool horiz = !verticalTabs(shape);
- const int available = (horiz ? q->width() : q->height()) - extraWidth();
- const int start = horiz ? tabRect.left() : tabRect.top();
- const int end = horiz ? tabRect.right() : tabRect.bottom();
- if (start < scrollOffset) // too far left
- scrollOffset = start - (index ? 8 : 0);
- else if (end > scrollOffset + available) // too far right
- scrollOffset = end - available + 1;
-
- leftB->setEnabled(scrollOffset > 0);
- const int last = horiz ? tabList.last().rect.right() : tabList.last().rect.bottom();
- rightB->setEnabled(last - scrollOffset >= available);
+ const int tabStart = horiz ? tabRect.left() : tabRect.top();
+ const int tabEnd = horiz ? tabRect.right() : tabRect.bottom();
+ const int lastTabEnd = horiz ? tabList.last().rect.right() : tabList.last().rect.bottom();
+ const QRect scrollRect = normalizedScrollRect(index);
+ const int scrolledTabBarStart = qMax(1, scrollRect.left() + scrollOffset);
+ const int scrolledTabBarEnd = qMin(lastTabEnd - 1, scrollRect.right() + scrollOffset);
+
+ if (tabStart < scrolledTabBarStart) {
+ // Tab is outside on the left, so scroll left.
+ scrollOffset = tabStart - scrollRect.left();
+ } else if (tabEnd > scrolledTabBarEnd) {
+ // Tab is outside on the right, so scroll right.
+ scrollOffset = tabEnd - scrollRect.right();
+ }
+
+ leftB->setEnabled(scrollOffset > -scrollRect.left());
+ rightB->setEnabled(scrollOffset < lastTabEnd - scrollRect.right());
+
if (oldScrollOffset != scrollOffset) {
q->update();
layoutWidgets();
@@ -664,39 +747,24 @@ void QTabBarPrivate::_q_scrollTabs()
{
Q_Q(QTabBar);
const QObject *sender = q->sender();
+ const bool horizontal = !verticalTabs(shape);
+ const QRect scrollRect = normalizedScrollRect();
int i = -1;
- if (!verticalTabs(shape)) {
- if (sender == leftB) {
- for (i = tabList.count() - 1; i >= 0; --i) {
- if (tabList.at(i).rect.left() - scrollOffset < 0) {
- makeVisible(i);
- return;
- }
- }
- } else if (sender == rightB) {
- int availableWidth = q->width() - extraWidth();
- for (i = 0; i < tabList.count(); ++i) {
- if (tabList.at(i).rect.right() - scrollOffset > availableWidth) {
- makeVisible(i);
- return;
- }
+
+ if (sender == leftB) {
+ for (i = tabList.count() - 1; i >= 0; --i) {
+ int start = horizontal ? tabList.at(i).rect.left() : tabList.at(i).rect.top();
+ if (start < scrollRect.left() + scrollOffset) {
+ makeVisible(i);
+ return;
}
}
- } else { // vertical
- if (sender == leftB) {
- for (i = tabList.count() - 1; i >= 0; --i) {
- if (tabList.at(i).rect.top() - scrollOffset < 0) {
- makeVisible(i);
- return;
- }
- }
- } else if (sender == rightB) {
- int available = q->height() - extraWidth();
- for (i = 0; i < tabList.count(); ++i) {
- if (tabList.at(i).rect.bottom() - scrollOffset > available) {
- makeVisible(i);
- return;
- }
+ } else if (sender == rightB) {
+ for (i = 0; i < tabList.count(); ++i) {
+ int end = horizontal ? tabList.at(i).rect.right() : tabList.at(i).rect.bottom();
+ if (end > scrollRect.right() + scrollOffset) {
+ makeVisible(i);
+ return;
}
}
}
@@ -1571,13 +1639,15 @@ void QTabBar::paintEvent(QPaintEvent *)
QStylePainter p(this);
int selected = -1;
- int cut = -1;
- bool rtl = optTabBase.direction == Qt::RightToLeft;
+ int cutLeft = -1;
+ int cutRight = -1;
bool vertical = verticalTabs(d->shape);
- QStyleOptionTab cutTab;
+ QStyleOptionTab cutTabLeft;
+ QStyleOptionTab cutTabRight;
selected = d->currentIndex;
if (d->dragInProgress)
selected = d->pressedIndex;
+ const QRect scrollRect = d->normalizedScrollRect();
for (int i = 0; i < d->tabList.count(); ++i)
optTabBase.tabBarRect |= tabRect(i);
@@ -1600,13 +1670,20 @@ void QTabBar::paintEvent(QPaintEvent *)
if (!(tab.state & QStyle::State_Enabled)) {
tab.palette.setCurrentColorGroup(QPalette::Disabled);
}
+
// If this tab is partially obscured, make a note of it so that we can pass the information
// along when we draw the tear.
- if (((!vertical && (!rtl && tab.rect.left() < 0)) || (rtl && tab.rect.right() > width()))
- || (vertical && tab.rect.top() < 0)) {
- cut = i;
- cutTab = tab;
+ QRect tabRect = d->tabList[i].rect;
+ int tabStart = vertical ? tabRect.top() : tabRect.left();
+ int tabEnd = vertical ? tabRect.bottom() : tabRect.right();
+ if (tabStart < scrollRect.left() + d->scrollOffset) {
+ cutLeft = i;
+ cutTabLeft = tab;
+ } else if (tabEnd > scrollRect.right() + d->scrollOffset) {
+ cutRight = i;
+ cutTabRight = tab;
}
+
// Don't bother drawing a tab if the entire tab is outside of the visible tab bar.
if ((!vertical && (tab.rect.right() < 0 || tab.rect.left() > width()))
|| (vertical && (tab.rect.bottom() < 0 || tab.rect.top() > height())))
@@ -1638,10 +1715,16 @@ void QTabBar::paintEvent(QPaintEvent *)
}
// Only draw the tear indicator if necessary. Most of the time we don't need too.
- if (d->leftB->isVisible() && cut >= 0) {
- cutTab.rect = rect();
- cutTab.rect = style()->subElementRect(QStyle::SE_TabBarTearIndicator, &cutTab, this);
- p.drawPrimitive(QStyle::PE_IndicatorTabTear, cutTab);
+ if (d->leftB->isVisible() && cutLeft >= 0) {
+ cutTabLeft.rect = rect();
+ cutTabLeft.rect = style()->subElementRect(QStyle::SE_TabBarTearIndicatorLeft, &cutTabLeft, this);
+ p.drawPrimitive(QStyle::PE_IndicatorTabTearLeft, cutTabLeft);
+ }
+
+ if (d->rightB->isVisible() && cutRight >= 0) {
+ cutTabRight.rect = rect();
+ cutTabRight.rect = style()->subElementRect(QStyle::SE_TabBarTearIndicatorRight, &cutTabRight, this);
+ p.drawPrimitive(QStyle::PE_IndicatorTabTearRight, cutTabRight);
}
}
diff --git a/src/widgets/widgets/qtabbar_p.h b/src/widgets/widgets/qtabbar_p.h
index 38a3c138cc..99b51199ed 100644
--- a/src/widgets/widgets/qtabbar_p.h
+++ b/src/widgets/widgets/qtabbar_p.h
@@ -150,7 +150,6 @@ public:
int calculateNewPosition(int from, int to, int index) const;
void slide(int from, int to);
void init();
- int extraWidth() const;
Tab *at(int index);
const Tab *at(int index) const;
@@ -178,6 +177,7 @@ public:
bool isTabInMacUnifiedToolbarArea() const;
void setupMovableTab();
void autoHideTabs();
+ QRect normalizedScrollRect(int index = -1);
void makeVisible(int index);
QSize iconSize;
@@ -248,7 +248,7 @@ class CloseButton : public QAbstractButton
Q_OBJECT
public:
- CloseButton(QWidget *parent = 0);
+ explicit CloseButton(QWidget *parent = 0);
QSize sizeHint() const Q_DECL_OVERRIDE;
QSize minimumSizeHint() const Q_DECL_OVERRIDE
diff --git a/src/widgets/widgets/qtextbrowser.cpp b/src/widgets/widgets/qtextbrowser.cpp
index 2c073342b0..e88e280c16 100644
--- a/src/widgets/widgets/qtextbrowser.cpp
+++ b/src/widgets/widgets/qtextbrowser.cpp
@@ -93,7 +93,7 @@ public:
HistoryEntry createHistoryEntry() const;
- void restoreHistoryEntry(const HistoryEntry entry);
+ void restoreHistoryEntry(const HistoryEntry &entry);
QStack<HistoryEntry> stack;
QStack<HistoryEntry> forwardStack;
@@ -292,7 +292,7 @@ void QTextBrowserPrivate::setSource(const QUrl &url)
txt = data.toString();
#endif
}
- if (txt.isEmpty())
+ if (Q_UNLIKELY(txt.isEmpty()))
qWarning("QTextBrowser: No document for %s", url.toString().toLatin1().constData());
if (q->isVisible()) {
@@ -554,7 +554,7 @@ QTextBrowserPrivate::HistoryEntry QTextBrowserPrivate::createHistoryEntry() cons
return entry;
}
-void QTextBrowserPrivate::restoreHistoryEntry(const HistoryEntry entry)
+void QTextBrowserPrivate::restoreHistoryEntry(const HistoryEntry &entry)
{
setSource(entry.url);
hbar->setValue(entry.hpos);
diff --git a/src/widgets/widgets/qtextedit.cpp b/src/widgets/widgets/qtextedit.cpp
index 7439005b92..ba6db2971a 100644
--- a/src/widgets/widgets/qtextedit.cpp
+++ b/src/widgets/widgets/qtextedit.cpp
@@ -1060,6 +1060,8 @@ bool QTextEdit::event(QEvent *e)
|| e->type() == QEvent::ToolTip) {
d->sendControlEvent(e);
}
+#else
+ Q_UNUSED(d)
#endif // QT_NO_CONTEXTMENU
#ifdef QT_KEYPAD_NAVIGATION
if (e->type() == QEvent::EnterEditFocus || e->type() == QEvent::LeaveEditFocus) {
diff --git a/src/widgets/widgets/qtoolbararealayout.cpp b/src/widgets/widgets/qtoolbararealayout.cpp
index 16b1115dd6..b5379f594c 100644
--- a/src/widgets/widgets/qtoolbararealayout.cpp
+++ b/src/widgets/widgets/qtoolbararealayout.cpp
@@ -1128,7 +1128,7 @@ QRect QToolBarAreaLayout::itemRect(const QList<int> &path) const
QLayoutItem *QToolBarAreaLayout::plug(const QList<int> &path)
{
QToolBarAreaLayoutItem *item = this->item(path);
- if (!item) {
+ if (Q_UNLIKELY(!item)) {
qWarning() << "No item at" << path;
return 0;
}
@@ -1260,7 +1260,7 @@ void QToolBarAreaLayout::saveState(QDataStream &stream) const
const QToolBarAreaLayoutItem &item = line.toolBarItems.at(k);
QWidget *widget = const_cast<QLayoutItem*>(item.widgetItem)->widget();
QString objectName = widget->objectName();
- if (objectName.isEmpty()) {
+ if (Q_UNLIKELY(objectName.isEmpty())) {
qWarning("QMainWindow::saveState(): 'objectName' not set for QToolBar %p '%s'",
widget, widget->windowTitle().toLocal8Bit().constData());
}
diff --git a/src/widgets/widgets/qtoolbox.cpp b/src/widgets/widgets/qtoolbox.cpp
index beb70f1283..a37747e138 100644
--- a/src/widgets/widgets/qtoolbox.cpp
+++ b/src/widgets/widgets/qtoolbox.cpp
@@ -521,10 +521,10 @@ QWidget * QToolBox::currentWidget() const
void QToolBox::setCurrentWidget(QWidget *widget)
{
int i = indexOf(widget);
- if (i >= 0)
- setCurrentIndex(i);
- else
+ if (Q_UNLIKELY(i < 0))
qWarning("QToolBox::setCurrentWidget: widget not contained in tool box");
+ else
+ setCurrentIndex(i);
}
/*!
diff --git a/src/widgets/widgets/qwidgetlinecontrol.cpp b/src/widgets/widgets/qwidgetlinecontrol.cpp
index 436937be72..42cd51eca7 100644
--- a/src/widgets/widgets/qwidgetlinecontrol.cpp
+++ b/src/widgets/widgets/qwidgetlinecontrol.cpp
@@ -147,10 +147,7 @@ void QWidgetLineControl::copy(QClipboard::Mode mode) const
{
QString t = selectedText();
if (!t.isEmpty() && m_echoMode == QLineEdit::Normal) {
- disconnect(QApplication::clipboard(), SIGNAL(selectionChanged()), this, 0);
QApplication::clipboard()->setText(t, mode);
- connect(QApplication::clipboard(), SIGNAL(selectionChanged()),
- this, SLOT(_q_clipboardChanged()));
}
}
@@ -309,7 +306,7 @@ void QWidgetLineControl::setSelection(int start, int length)
{
commitPreedit();
- if(start < 0 || start > (int)m_text.length()){
+ if (Q_UNLIKELY(start < 0 || start > m_text.size())) {
qWarning("QWidgetLineControl::setSelection: Invalid start position");
return;
}
@@ -339,10 +336,6 @@ void QWidgetLineControl::setSelection(int start, int length)
emitCursorPositionChanged();
}
-void QWidgetLineControl::_q_clipboardChanged()
-{
-}
-
void QWidgetLineControl::_q_deleteSelected()
{
if (!hasSelectedText())
@@ -1523,14 +1516,7 @@ void QWidgetLineControl::timerEvent(QTimerEvent *event)
#ifndef QT_NO_SHORTCUT
void QWidgetLineControl::processShortcutOverrideEvent(QKeyEvent *ke)
{
- if (isReadOnly())
- return;
-
if (ke == QKeySequence::Copy
- || ke == QKeySequence::Paste
- || ke == QKeySequence::Cut
- || ke == QKeySequence::Redo
- || ke == QKeySequence::Undo
|| ke == QKeySequence::MoveToNextWord
|| ke == QKeySequence::MoveToPreviousWord
|| ke == QKeySequence::MoveToEndOfLine
@@ -1544,22 +1530,35 @@ void QWidgetLineControl::processShortcutOverrideEvent(QKeyEvent *ke)
|| ke == QKeySequence::SelectEndOfBlock
|| ke == QKeySequence::SelectStartOfDocument
|| ke == QKeySequence::SelectAll
- || ke == QKeySequence::SelectEndOfDocument
- || ke == QKeySequence::DeleteCompleteLine) {
+ || ke == QKeySequence::SelectEndOfDocument) {
ke->accept();
+ } else if (ke == QKeySequence::Paste
+ || ke == QKeySequence::Cut
+ || ke == QKeySequence::Redo
+ || ke == QKeySequence::Undo
+ || ke == QKeySequence::DeleteCompleteLine) {
+ if (!isReadOnly())
+ ke->accept();
} else if (ke->modifiers() == Qt::NoModifier || ke->modifiers() == Qt::ShiftModifier
|| ke->modifiers() == Qt::KeypadModifier) {
if (ke->key() < Qt::Key_Escape) {
- ke->accept();
+ if (!isReadOnly())
+ ke->accept();
} else {
switch (ke->key()) {
case Qt::Key_Delete:
+ case Qt::Key_Backspace:
+ if (!isReadOnly())
+ ke->accept();
+ break;
+
case Qt::Key_Home:
case Qt::Key_End:
- case Qt::Key_Backspace:
case Qt::Key_Left:
case Qt::Key_Right:
ke->accept();
+ break;
+
default:
break;
}
diff --git a/src/widgets/widgets/qwidgetlinecontrol_p.h b/src/widgets/widgets/qwidgetlinecontrol_p.h
index 039453f0d5..1ba7e659f6 100644
--- a/src/widgets/widgets/qwidgetlinecontrol_p.h
+++ b/src/widgets/widgets/qwidgetlinecontrol_p.h
@@ -535,7 +535,6 @@ protected:
virtual void timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE;
private Q_SLOTS:
- void _q_clipboardChanged();
void _q_deleteSelected();
private:
diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro
index 9cab3c9e42..e905a416a6 100644
--- a/tests/auto/auto.pro
+++ b/tests/auto/auto.pro
@@ -22,7 +22,7 @@ installed_cmake.depends = cmake
ios: SUBDIRS = corelib gui
wince: SUBDIRS -= printsupport
-cross_compile: SUBDIRS -= tools
+cross_compile: SUBDIRS -= tools cmake installed_cmake
!qtHaveModule(opengl): SUBDIRS -= opengl
!qtHaveModule(gui): SUBDIRS -= gui cmake
!qtHaveModule(widgets): SUBDIRS -= widgets
diff --git a/tests/auto/concurrent/qtconcurrentfilter/qtconcurrentfilter.pro b/tests/auto/concurrent/qtconcurrentfilter/qtconcurrentfilter.pro
index e82d101de0..f3684faa61 100644
--- a/tests/auto/concurrent/qtconcurrentfilter/qtconcurrentfilter.pro
+++ b/tests/auto/concurrent/qtconcurrentfilter/qtconcurrentfilter.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtconcurrentfilter
QT = core testlib concurrent
SOURCES = tst_qtconcurrentfilter.cpp
diff --git a/tests/auto/concurrent/qtconcurrentiteratekernel/qtconcurrentiteratekernel.pro b/tests/auto/concurrent/qtconcurrentiteratekernel/qtconcurrentiteratekernel.pro
index 4cfebc0e3d..f599372c6f 100644
--- a/tests/auto/concurrent/qtconcurrentiteratekernel/qtconcurrentiteratekernel.pro
+++ b/tests/auto/concurrent/qtconcurrentiteratekernel/qtconcurrentiteratekernel.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtconcurrentiteratekernel
QT = core testlib concurrent
SOURCES = tst_qtconcurrentiteratekernel.cpp
diff --git a/tests/auto/concurrent/qtconcurrentmap/qtconcurrentmap.pro b/tests/auto/concurrent/qtconcurrentmap/qtconcurrentmap.pro
index 199e5ad4d6..3af207ae5a 100644
--- a/tests/auto/concurrent/qtconcurrentmap/qtconcurrentmap.pro
+++ b/tests/auto/concurrent/qtconcurrentmap/qtconcurrentmap.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtconcurrentmap
QT = core testlib concurrent
SOURCES = tst_qtconcurrentmap.cpp
diff --git a/tests/auto/concurrent/qtconcurrentmedian/qtconcurrentmedian.pro b/tests/auto/concurrent/qtconcurrentmedian/qtconcurrentmedian.pro
index 1eb27d825a..0d07642028 100644
--- a/tests/auto/concurrent/qtconcurrentmedian/qtconcurrentmedian.pro
+++ b/tests/auto/concurrent/qtconcurrentmedian/qtconcurrentmedian.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtconcurrentmedian
QT = core testlib concurrent
SOURCES = tst_qtconcurrentmedian.cpp
diff --git a/tests/auto/concurrent/qtconcurrentrun/qtconcurrentrun.pro b/tests/auto/concurrent/qtconcurrentrun/qtconcurrentrun.pro
index 03d77b33a2..f60462f9ed 100644
--- a/tests/auto/concurrent/qtconcurrentrun/qtconcurrentrun.pro
+++ b/tests/auto/concurrent/qtconcurrentrun/qtconcurrentrun.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtconcurrentrun
QT = core testlib concurrent
SOURCES = tst_qtconcurrentrun.cpp
diff --git a/tests/auto/concurrent/qtconcurrentthreadengine/qtconcurrentthreadengine.pro b/tests/auto/concurrent/qtconcurrentthreadengine/qtconcurrentthreadengine.pro
index f6ddd33504..b98b8f56e8 100644
--- a/tests/auto/concurrent/qtconcurrentthreadengine/qtconcurrentthreadengine.pro
+++ b/tests/auto/concurrent/qtconcurrentthreadengine/qtconcurrentthreadengine.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtconcurrentthreadengine
QT = core testlib concurrent
SOURCES = tst_qtconcurrentthreadengine.cpp
diff --git a/tests/auto/corelib/animation/qabstractanimation/qabstractanimation.pro b/tests/auto/corelib/animation/qabstractanimation/qabstractanimation.pro
index 7ec9c5f574..32701c2c9c 100644
--- a/tests/auto/corelib/animation/qabstractanimation/qabstractanimation.pro
+++ b/tests/auto/corelib/animation/qabstractanimation/qabstractanimation.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qabstractanimation
QT = core testlib
SOURCES = tst_qabstractanimation.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/animation/qanimationgroup/qanimationgroup.pro b/tests/auto/corelib/animation/qanimationgroup/qanimationgroup.pro
index a5e898b395..f4b5747216 100644
--- a/tests/auto/corelib/animation/qanimationgroup/qanimationgroup.pro
+++ b/tests/auto/corelib/animation/qanimationgroup/qanimationgroup.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qanimationgroup
QT = core testlib
SOURCES = tst_qanimationgroup.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/animation/qparallelanimationgroup/qparallelanimationgroup.pro b/tests/auto/corelib/animation/qparallelanimationgroup/qparallelanimationgroup.pro
index 23343f27f5..5b4c6ab90a 100644
--- a/tests/auto/corelib/animation/qparallelanimationgroup/qparallelanimationgroup.pro
+++ b/tests/auto/corelib/animation/qparallelanimationgroup/qparallelanimationgroup.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qparallelanimationgroup
QT = core testlib
SOURCES = tst_qparallelanimationgroup.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/animation/qparallelanimationgroup/tst_qparallelanimationgroup.cpp b/tests/auto/corelib/animation/qparallelanimationgroup/tst_qparallelanimationgroup.cpp
index d963c5173e..640f58c532 100644
--- a/tests/auto/corelib/animation/qparallelanimationgroup/tst_qparallelanimationgroup.cpp
+++ b/tests/auto/corelib/animation/qparallelanimationgroup/tst_qparallelanimationgroup.cpp
@@ -491,7 +491,7 @@ void tst_QParallelAnimationGroup::deleteChildrenWithRunningGroup()
QVERIFY(group.currentLoopTime() > 0);
delete anim1;
- QVERIFY(group.animationCount() == 0);
+ QCOMPARE(group.animationCount(), 0);
QCOMPARE(group.duration(), 0);
QCOMPARE(group.state(), QAnimationGroup::Stopped);
QCOMPARE(group.currentLoopTime(), 0); //that's the invariant
diff --git a/tests/auto/corelib/animation/qpauseanimation/qpauseanimation.pro b/tests/auto/corelib/animation/qpauseanimation/qpauseanimation.pro
index 4c2dd02951..7f19bc7545 100644
--- a/tests/auto/corelib/animation/qpauseanimation/qpauseanimation.pro
+++ b/tests/auto/corelib/animation/qpauseanimation/qpauseanimation.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpauseanimation
QT = core-private testlib
SOURCES = tst_qpauseanimation.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/animation/qpauseanimation/tst_qpauseanimation.cpp b/tests/auto/corelib/animation/qpauseanimation/tst_qpauseanimation.cpp
index db58c797d3..06667df489 100644
--- a/tests/auto/corelib/animation/qpauseanimation/tst_qpauseanimation.cpp
+++ b/tests/auto/corelib/animation/qpauseanimation/tst_qpauseanimation.cpp
@@ -114,10 +114,10 @@ void tst_QPauseAnimation::changeDirectionWhileRunning()
animation.setDuration(400);
animation.start();
QTest::qWait(100);
- QVERIFY(animation.state() == QAbstractAnimation::Running);
+ QCOMPARE(animation.state(), QAbstractAnimation::Running);
animation.setDirection(QAbstractAnimation::Backward);
QTest::qWait(animation.totalDuration() + 50);
- QVERIFY(animation.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(animation.state(), QAbstractAnimation::Stopped);
}
void tst_QPauseAnimation::noTimerUpdates_data()
@@ -149,7 +149,7 @@ void tst_QPauseAnimation::noTimerUpdates()
QEXPECT_FAIL("", timerError, Abort);
#endif
- QVERIFY(animation.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(animation.state(), QAbstractAnimation::Stopped);
const int expectedLoopCount = 1 + loopCount;
#ifdef BAD_TIMER_RESOLUTION
@@ -177,13 +177,13 @@ void tst_QPauseAnimation::multiplePauseAnimations()
if (animation.state() != QAbstractAnimation::Stopped)
QEXPECT_FAIL("", timerError, Abort);
#endif
- QVERIFY(animation.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(animation.state(), QAbstractAnimation::Stopped);
#ifdef BAD_TIMER_RESOLUTION
if (animation2.state() != QAbstractAnimation::Running)
QEXPECT_FAIL("", timerError, Abort);
#endif
- QVERIFY(animation2.state() == QAbstractAnimation::Running);
+ QCOMPARE(animation2.state(), QAbstractAnimation::Running);
#ifdef BAD_TIMER_RESOLUTION
if (animation.m_updateCurrentTimeCount != 2)
@@ -203,7 +203,7 @@ void tst_QPauseAnimation::multiplePauseAnimations()
if (animation2.state() != QAbstractAnimation::Stopped)
QEXPECT_FAIL("", timerError, Abort);
#endif
- QVERIFY(animation2.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(animation2.state(), QAbstractAnimation::Stopped);
#ifdef BAD_TIMER_RESOLUTION
if (animation2.m_updateCurrentTimeCount != 3)
@@ -230,8 +230,8 @@ void tst_QPauseAnimation::pauseAndPropertyAnimations()
QTest::qWait(100);
animation.start();
- QVERIFY(animation.state() == QAbstractAnimation::Running);
- QVERIFY(pause.state() == QAbstractAnimation::Running);
+ QCOMPARE(animation.state(), QAbstractAnimation::Running);
+ QCOMPARE(pause.state(), QAbstractAnimation::Running);
QCOMPARE(pause.m_updateCurrentTimeCount, 2);
QTest::qWait(animation.totalDuration() + 100);
@@ -240,8 +240,8 @@ void tst_QPauseAnimation::pauseAndPropertyAnimations()
if (animation.state() != QAbstractAnimation::Stopped)
QEXPECT_FAIL("", timerError, Abort);
#endif
- QVERIFY(animation.state() == QAbstractAnimation::Stopped);
- QVERIFY(pause.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(animation.state(), QAbstractAnimation::Stopped);
+ QCOMPARE(pause.state(), QAbstractAnimation::Stopped);
QVERIFY(pause.m_updateCurrentTimeCount > 3);
}
@@ -250,10 +250,10 @@ void tst_QPauseAnimation::pauseResume()
TestablePauseAnimation animation;
animation.setDuration(400);
animation.start();
- QVERIFY(animation.state() == QAbstractAnimation::Running);
+ QCOMPARE(animation.state(), QAbstractAnimation::Running);
QTest::qWait(200);
animation.pause();
- QVERIFY(animation.state() == QAbstractAnimation::Paused);
+ QCOMPARE(animation.state(), QAbstractAnimation::Paused);
animation.start();
QTRY_COMPARE(animation.state(), QAbstractAnimation::Stopped);
@@ -281,39 +281,39 @@ void tst_QPauseAnimation::sequentialPauseGroup()
QCOMPARE(animation2.m_updateCurrentTimeCount, 0);
QCOMPARE(animation3.m_updateCurrentTimeCount, 0);
- QVERIFY(group.state() == QAbstractAnimation::Running);
- QVERIFY(animation1.state() == QAbstractAnimation::Running);
- QVERIFY(animation2.state() == QAbstractAnimation::Stopped);
- QVERIFY(animation3.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(group.state(), QAbstractAnimation::Running);
+ QCOMPARE(animation1.state(), QAbstractAnimation::Running);
+ QCOMPARE(animation2.state(), QAbstractAnimation::Stopped);
+ QCOMPARE(animation3.state(), QAbstractAnimation::Stopped);
group.setCurrentTime(250);
QCOMPARE(animation1.m_updateCurrentTimeCount, 2);
QCOMPARE(animation2.m_updateCurrentTimeCount, 1);
QCOMPARE(animation3.m_updateCurrentTimeCount, 0);
- QVERIFY(group.state() == QAbstractAnimation::Running);
- QVERIFY(animation1.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(group.state(), QAbstractAnimation::Running);
+ QCOMPARE(animation1.state(), QAbstractAnimation::Stopped);
QCOMPARE((QAbstractAnimation*)&animation2, group.currentAnimation());
- QVERIFY(animation2.state() == QAbstractAnimation::Running);
- QVERIFY(animation3.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(animation2.state(), QAbstractAnimation::Running);
+ QCOMPARE(animation3.state(), QAbstractAnimation::Stopped);
group.setCurrentTime(500);
QCOMPARE(animation1.m_updateCurrentTimeCount, 2);
QCOMPARE(animation2.m_updateCurrentTimeCount, 2);
QCOMPARE(animation3.m_updateCurrentTimeCount, 1);
- QVERIFY(group.state() == QAbstractAnimation::Running);
- QVERIFY(animation1.state() == QAbstractAnimation::Stopped);
- QVERIFY(animation2.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(group.state(), QAbstractAnimation::Running);
+ QCOMPARE(animation1.state(), QAbstractAnimation::Stopped);
+ QCOMPARE(animation2.state(), QAbstractAnimation::Stopped);
QCOMPARE((QAbstractAnimation*)&animation3, group.currentAnimation());
- QVERIFY(animation3.state() == QAbstractAnimation::Running);
+ QCOMPARE(animation3.state(), QAbstractAnimation::Running);
group.setCurrentTime(750);
- QVERIFY(group.state() == QAbstractAnimation::Stopped);
- QVERIFY(animation1.state() == QAbstractAnimation::Stopped);
- QVERIFY(animation2.state() == QAbstractAnimation::Stopped);
- QVERIFY(animation3.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(group.state(), QAbstractAnimation::Stopped);
+ QCOMPARE(animation1.state(), QAbstractAnimation::Stopped);
+ QCOMPARE(animation2.state(), QAbstractAnimation::Stopped);
+ QCOMPARE(animation3.state(), QAbstractAnimation::Stopped);
QCOMPARE(animation1.m_updateCurrentTimeCount, 2);
QCOMPARE(animation2.m_updateCurrentTimeCount, 2);
@@ -334,22 +334,22 @@ void tst_QPauseAnimation::sequentialGroupWithPause()
group.start();
- QVERIFY(group.state() == QAbstractAnimation::Running);
- QVERIFY(animation.state() == QAbstractAnimation::Running);
- QVERIFY(pause.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(group.state(), QAbstractAnimation::Running);
+ QCOMPARE(animation.state(), QAbstractAnimation::Running);
+ QCOMPARE(pause.state(), QAbstractAnimation::Stopped);
group.setCurrentTime(300);
- QVERIFY(group.state() == QAbstractAnimation::Running);
- QVERIFY(animation.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(group.state(), QAbstractAnimation::Running);
+ QCOMPARE(animation.state(), QAbstractAnimation::Stopped);
QCOMPARE((QAbstractAnimation*)&pause, group.currentAnimation());
- QVERIFY(pause.state() == QAbstractAnimation::Running);
+ QCOMPARE(pause.state(), QAbstractAnimation::Running);
group.setCurrentTime(600);
- QVERIFY(group.state() == QAbstractAnimation::Stopped);
- QVERIFY(animation.state() == QAbstractAnimation::Stopped);
- QVERIFY(pause.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(group.state(), QAbstractAnimation::Stopped);
+ QCOMPARE(animation.state(), QAbstractAnimation::Stopped);
+ QCOMPARE(pause.state(), QAbstractAnimation::Stopped);
QCOMPARE(pause.m_updateCurrentTimeCount, 2);
}
@@ -401,11 +401,11 @@ void tst_QPauseAnimation::multipleSequentialGroups()
group.start();
- QVERIFY(group.state() == QAbstractAnimation::Running);
- QVERIFY(subgroup1.state() == QAbstractAnimation::Running);
- QVERIFY(subgroup2.state() == QAbstractAnimation::Running);
- QVERIFY(subgroup3.state() == QAbstractAnimation::Running);
- QVERIFY(subgroup4.state() == QAbstractAnimation::Running);
+ QCOMPARE(group.state(), QAbstractAnimation::Running);
+ QCOMPARE(subgroup1.state(), QAbstractAnimation::Running);
+ QCOMPARE(subgroup2.state(), QAbstractAnimation::Running);
+ QCOMPARE(subgroup3.state(), QAbstractAnimation::Running);
+ QCOMPARE(subgroup4.state(), QAbstractAnimation::Running);
// This is a pretty long animation so it tends to get rather out of sync
// when using the consistent timer, so run for an extra half second for good
@@ -416,31 +416,31 @@ void tst_QPauseAnimation::multipleSequentialGroups()
if (group.state() != QAbstractAnimation::Stopped)
QEXPECT_FAIL("", timerError, Abort);
#endif
- QVERIFY(group.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(group.state(), QAbstractAnimation::Stopped);
#ifdef BAD_TIMER_RESOLUTION
if (subgroup1.state() != QAbstractAnimation::Stopped)
QEXPECT_FAIL("", timerError, Abort);
#endif
- QVERIFY(subgroup1.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(subgroup1.state(), QAbstractAnimation::Stopped);
#ifdef BAD_TIMER_RESOLUTION
if (subgroup2.state() != QAbstractAnimation::Stopped)
QEXPECT_FAIL("", timerError, Abort);
#endif
- QVERIFY(subgroup2.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(subgroup2.state(), QAbstractAnimation::Stopped);
#ifdef BAD_TIMER_RESOLUTION
if (subgroup3.state() != QAbstractAnimation::Stopped)
QEXPECT_FAIL("", timerError, Abort);
#endif
- QVERIFY(subgroup3.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(subgroup3.state(), QAbstractAnimation::Stopped);
#ifdef BAD_TIMER_RESOLUTION
if (subgroup4.state() != QAbstractAnimation::Stopped)
QEXPECT_FAIL("", timerError, Abort);
#endif
- QVERIFY(subgroup4.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(subgroup4.state(), QAbstractAnimation::Stopped);
#ifdef BAD_TIMER_RESOLUTION
if (pause5.m_updateCurrentTimeCount != 4)
@@ -455,7 +455,7 @@ void tst_QPauseAnimation::zeroDuration()
animation.setDuration(0);
animation.start();
QTest::qWait(animation.totalDuration() + 100);
- QVERIFY(animation.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(animation.state(), QAbstractAnimation::Stopped);
QCOMPARE(animation.m_updateCurrentTimeCount, 1);
}
diff --git a/tests/auto/corelib/animation/qpropertyanimation/qpropertyanimation.pro b/tests/auto/corelib/animation/qpropertyanimation/qpropertyanimation.pro
index 502e5aa428..bfeb183abf 100644
--- a/tests/auto/corelib/animation/qpropertyanimation/qpropertyanimation.pro
+++ b/tests/auto/corelib/animation/qpropertyanimation/qpropertyanimation.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpropertyanimation
QT = core gui widgets testlib
SOURCES = tst_qpropertyanimation.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/animation/qpropertyanimation/tst_qpropertyanimation.cpp b/tests/auto/corelib/animation/qpropertyanimation/tst_qpropertyanimation.cpp
index 530d7777d8..d4a1a6db11 100644
--- a/tests/auto/corelib/animation/qpropertyanimation/tst_qpropertyanimation.cpp
+++ b/tests/auto/corelib/animation/qpropertyanimation/tst_qpropertyanimation.cpp
@@ -34,6 +34,7 @@
#include <QtTest/QtTest>
#include <QtCore/qpropertyanimation.h>
#include <QtCore/qvariantanimation.h>
+#include <QtGui/qtouchdevice.h>
#include <QtWidgets/qwidget.h>
Q_DECLARE_METATYPE(QAbstractAnimation::State)
@@ -369,7 +370,7 @@ void tst_QPropertyAnimation::deletion2()
QTimer::singleShot(0, object, SLOT(deleteLater()));
QTest::qWait(50);
- QVERIFY(anim->targetObject() == 0);
+ QVERIFY(!anim->targetObject());
}
void tst_QPropertyAnimation::deletion3()
diff --git a/tests/auto/corelib/animation/qsequentialanimationgroup/qsequentialanimationgroup.pro b/tests/auto/corelib/animation/qsequentialanimationgroup/qsequentialanimationgroup.pro
index e53cde48f3..b0271e8ea2 100644
--- a/tests/auto/corelib/animation/qsequentialanimationgroup/qsequentialanimationgroup.pro
+++ b/tests/auto/corelib/animation/qsequentialanimationgroup/qsequentialanimationgroup.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qsequentialanimationgroup
QT = core testlib
SOURCES = tst_qsequentialanimationgroup.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/animation/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp b/tests/auto/corelib/animation/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp
index c0fcb70ff3..067dcd705a 100644
--- a/tests/auto/corelib/animation/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp
+++ b/tests/auto/corelib/animation/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp
@@ -916,7 +916,7 @@ void tst_QSequentialAnimationGroup::startDelay()
QTest::qWait(500);
QTRY_COMPARE(group.state(), QAnimationGroup::Stopped);
- QVERIFY(group.currentLoopTime() == 375);
+ QCOMPARE(group.currentLoopTime(), 375);
}
void tst_QSequentialAnimationGroup::clearGroup()
@@ -1518,7 +1518,7 @@ void tst_QSequentialAnimationGroup::addRemoveAnimation()
void tst_QSequentialAnimationGroup::currentAnimation()
{
QSequentialAnimationGroup group;
- QVERIFY(group.currentAnimation() == 0);
+ QVERIFY(!group.currentAnimation());
QPropertyAnimation anim;
anim.setDuration(0);
@@ -1529,7 +1529,7 @@ void tst_QSequentialAnimationGroup::currentAnimation()
void tst_QSequentialAnimationGroup::currentAnimationWithZeroDuration()
{
QSequentialAnimationGroup group;
- QVERIFY(group.currentAnimation() == 0);
+ QVERIFY(!group.currentAnimation());
QPropertyAnimation zero1;
zero1.setDuration(0);
diff --git a/tests/auto/corelib/animation/qvariantanimation/qvariantanimation.pro b/tests/auto/corelib/animation/qvariantanimation/qvariantanimation.pro
index 1c882833fc..b82d3bc6e0 100644
--- a/tests/auto/corelib/animation/qvariantanimation/qvariantanimation.pro
+++ b/tests/auto/corelib/animation/qvariantanimation/qvariantanimation.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qvariantanimation
QT = core testlib
SOURCES = tst_qvariantanimation.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/animation/qvariantanimation/tst_qvariantanimation.cpp b/tests/auto/corelib/animation/qvariantanimation/tst_qvariantanimation.cpp
index bd539296c2..5e223969e3 100644
--- a/tests/auto/corelib/animation/qvariantanimation/tst_qvariantanimation.cpp
+++ b/tests/auto/corelib/animation/qvariantanimation/tst_qvariantanimation.cpp
@@ -77,9 +77,9 @@ void tst_QVariantAnimation::currentValue()
void tst_QVariantAnimation::easingCurve()
{
TestableQVariantAnimation anim;
- QVERIFY(anim.easingCurve() == QEasingCurve::Linear);
+ QCOMPARE(anim.easingCurve().type(), QEasingCurve::Linear);
anim.setEasingCurve(QEasingCurve::InQuad);
- QVERIFY(anim.easingCurve() == QEasingCurve::InQuad);
+ QCOMPARE(anim.easingCurve().type(), QEasingCurve::InQuad);
}
void tst_QVariantAnimation::endValue()
diff --git a/tests/auto/corelib/codecs/qtextcodec/echo/echo.pro b/tests/auto/corelib/codecs/qtextcodec/echo/echo.pro
index 500f123f61..bf791ffc61 100644
--- a/tests/auto/corelib/codecs/qtextcodec/echo/echo.pro
+++ b/tests/auto/corelib/codecs/qtextcodec/echo/echo.pro
@@ -4,4 +4,3 @@ CONFIG -= app_bundle debug_and_release_target
CONFIG += console
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/codecs/qtextcodec/test/test.pro b/tests/auto/corelib/codecs/qtextcodec/test/test.pro
index 35b2b34690..e0a1bbd88e 100644
--- a/tests/auto/corelib/codecs/qtextcodec/test/test.pro
+++ b/tests/auto/corelib/codecs/qtextcodec/test/test.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
QT = core testlib
SOURCES = ../tst_qtextcodec.cpp
@@ -12,4 +11,3 @@ win32 {
}
}
TESTDATA += ../*.txt
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp b/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp
index 3aa06d237d..82ed655390 100644
--- a/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp
+++ b/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp
@@ -156,7 +156,7 @@ void tst_QTextCodec::codecForName()
QTextCodec *codec = QTextCodec::codecForName(hint.toLatin1());
if (actualCodecName.isEmpty()) {
- QVERIFY(codec == 0);
+ QVERIFY(!codec);
} else {
QVERIFY(codec != 0);
QCOMPARE(QString(codec->name()), actualCodecName);
@@ -265,7 +265,7 @@ void tst_QTextCodec::fromUnicode()
array is correct (no off by one, no trailing '\0').
*/
QByteArray result = codec->fromUnicode(QString("abc"));
- if (result.startsWith("a")) {
+ if (result.startsWith('a')) {
QCOMPARE(result.size(), 3);
QCOMPARE(result, QByteArray("abc"));
} else {
@@ -573,7 +573,7 @@ void tst_QTextCodec::utf8Codec_data()
str = "Prohl";
str += QChar::ReplacementCharacter;
str += QChar::ReplacementCharacter;
- str += "e";
+ str += QLatin1Char('e');
str += QChar::ReplacementCharacter;
str += " plugin";
str += QChar::ReplacementCharacter;
@@ -2075,7 +2075,7 @@ void tst_QTextCodec::codecForUtfText()
if (detected)
QCOMPARE(codec->mibEnum(), mib);
else
- QVERIFY(codec == 0);
+ QVERIFY(!codec);
}
#if defined(Q_OS_UNIX)
diff --git a/tests/auto/corelib/codecs/utf8/utf8.pro b/tests/auto/corelib/codecs/utf8/utf8.pro
index 23f8b8894e..355d890824 100644
--- a/tests/auto/corelib/codecs/utf8/utf8.pro
+++ b/tests/auto/corelib/codecs/utf8/utf8.pro
@@ -2,5 +2,3 @@ CONFIG += testcase
TARGET = tst_utf8
QT = core testlib
SOURCES += tst_utf8.cpp utf8data.cpp
-CONFIG += parallel_test
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/global/q_func_info/q_func_info.pro b/tests/auto/corelib/global/q_func_info/q_func_info.pro
index aad0edf4ed..7663a880eb 100644
--- a/tests/auto/corelib/global/q_func_info/q_func_info.pro
+++ b/tests/auto/corelib/global/q_func_info/q_func_info.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_q_func_info
QT = core testlib
SOURCES = tst_q_func_info.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/global/qflags/qflags.pro b/tests/auto/corelib/global/qflags/qflags.pro
index 7602008e22..29dfb0684c 100644
--- a/tests/auto/corelib/global/qflags/qflags.pro
+++ b/tests/auto/corelib/global/qflags/qflags.pro
@@ -1,7 +1,6 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qflags
QT = core testlib
SOURCES = tst_qflags.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
contains(QT_CONFIG, c++11): CONFIG += c++11
contains(QT_CONFIG, c++14): CONFIG += c++14
diff --git a/tests/auto/corelib/global/qgetputenv/qgetputenv.pro b/tests/auto/corelib/global/qgetputenv/qgetputenv.pro
index 34fb1a702b..c6d1100335 100644
--- a/tests/auto/corelib/global/qgetputenv/qgetputenv.pro
+++ b/tests/auto/corelib/global/qgetputenv/qgetputenv.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qgetputenv
QT = core testlib
SOURCES = tst_qgetputenv.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/global/qgetputenv/tst_qgetputenv.cpp b/tests/auto/corelib/global/qgetputenv/tst_qgetputenv.cpp
index 71a3419963..adf8172a68 100644
--- a/tests/auto/corelib/global/qgetputenv/tst_qgetputenv.cpp
+++ b/tests/auto/corelib/global/qgetputenv/tst_qgetputenv.cpp
@@ -80,7 +80,7 @@ void tst_QGetPutEnv::getSetCheck()
QCOMPARE(qEnvironmentVariableIntValue(varName, &ok), 0);
QVERIFY(!ok);
result = qgetenv(varName);
- QVERIFY(result == "supervalue");
+ QCOMPARE(result, QByteArrayLiteral("supervalue"));
qputenv(varName,QByteArray());
diff --git a/tests/auto/corelib/global/qglobal/qglobal.pro b/tests/auto/corelib/global/qglobal/qglobal.pro
index d1c02f80e9..b8ed7761f5 100644
--- a/tests/auto/corelib/global/qglobal/qglobal.pro
+++ b/tests/auto/corelib/global/qglobal/qglobal.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qglobal
QT = core testlib
SOURCES = tst_qglobal.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/global/qglobalstatic/qglobalstatic.pro b/tests/auto/corelib/global/qglobalstatic/qglobalstatic.pro
index 7b374505ce..056d940da7 100644
--- a/tests/auto/corelib/global/qglobalstatic/qglobalstatic.pro
+++ b/tests/auto/corelib/global/qglobalstatic/qglobalstatic.pro
@@ -10,4 +10,3 @@ CONFIG += exceptions
SOURCES += tst_qglobalstatic.cpp
DEFINES += SRCDIR=\\\"$$PWD/\\\"
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/global/qhooks/qhooks.pro b/tests/auto/corelib/global/qhooks/qhooks.pro
index f886e7d49a..a5c0d63cb9 100644
--- a/tests/auto/corelib/global/qhooks/qhooks.pro
+++ b/tests/auto/corelib/global/qhooks/qhooks.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qhooks
QT = core-private testlib
SOURCES = tst_qhooks.cpp
diff --git a/tests/auto/corelib/global/qhooks/tst_qhooks.cpp b/tests/auto/corelib/global/qhooks/tst_qhooks.cpp
index b5930790e4..a38a396a5d 100644
--- a/tests/auto/corelib/global/qhooks/tst_qhooks.cpp
+++ b/tests/auto/corelib/global/qhooks/tst_qhooks.cpp
@@ -46,7 +46,7 @@ private slots:
void tst_QHooks::testVersion()
{
- QVERIFY(qtHookData[QHooks::HookDataVersion] >= 1);
+ QVERIFY(qtHookData[QHooks::HookDataVersion] >= 3);
QCOMPARE(qtHookData[QHooks::HookDataSize], (quintptr)QHooks::LastHookIndex);
QCOMPARE(qtHookData[QHooks::QtVersion], (quintptr)QT_VERSION);
}
diff --git a/tests/auto/corelib/global/qlogging/app/app.pro b/tests/auto/corelib/global/qlogging/app/app.pro
index 4789efc478..8ada04acdc 100644
--- a/tests/auto/corelib/global/qlogging/app/app.pro
+++ b/tests/auto/corelib/global/qlogging/app/app.pro
@@ -9,7 +9,6 @@ CONFIG -= app_bundle
CONFIG += console
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
DEFINES += QT_MESSAGELOGCONTEXT
gcc:!mingw:!haiku: QMAKE_LFLAGS += -rdynamic
diff --git a/tests/auto/corelib/global/qlogging/test/test.pro b/tests/auto/corelib/global/qlogging/test/test.pro
index 64a63ce28a..b5b75be3a6 100644
--- a/tests/auto/corelib/global/qlogging/test/test.pro
+++ b/tests/auto/corelib/global/qlogging/test/test.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
CONFIG -= app_bundle debug_and_release_target
contains(QT_CONFIG, c++11): CONFIG += c++11
contains(QT_CONFIG, c++14): CONFIG += c++14
diff --git a/tests/auto/corelib/global/qlogging/tst_qlogging.cpp b/tests/auto/corelib/global/qlogging/tst_qlogging.cpp
index a65a72313f..e2370665d8 100644
--- a/tests/auto/corelib/global/qlogging/tst_qlogging.cpp
+++ b/tests/auto/corelib/global/qlogging/tst_qlogging.cpp
@@ -821,7 +821,7 @@ void tst_qmessagehandler::qMessagePattern()
// test QT_MESSAGE_PATTERN
//
QStringList environment = m_baseEnvironment;
- environment.prepend("QT_MESSAGE_PATTERN=\"" + pattern + "\"");
+ environment.prepend("QT_MESSAGE_PATTERN=\"" + pattern + QLatin1Char('"'));
process.setEnvironment(environment);
process.start(appExe);
diff --git a/tests/auto/corelib/global/qnumeric/qnumeric.pro b/tests/auto/corelib/global/qnumeric/qnumeric.pro
index 0772ce6aab..188bb5b463 100644
--- a/tests/auto/corelib/global/qnumeric/qnumeric.pro
+++ b/tests/auto/corelib/global/qnumeric/qnumeric.pro
@@ -1,7 +1,6 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qnumeric
QT = core-private testlib
SOURCES = tst_qnumeric.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
intel_icc: QMAKE_CXXFLAGS += -fp-model strict
intel_icl: QMAKE_CXXFLAGS += /fp:strict
diff --git a/tests/auto/corelib/global/qnumeric/tst_qnumeric.cpp b/tests/auto/corelib/global/qnumeric/tst_qnumeric.cpp
index 6be8ff81cf..1847056de5 100644
--- a/tests/auto/corelib/global/qnumeric/tst_qnumeric.cpp
+++ b/tests/auto/corelib/global/qnumeric/tst_qnumeric.cpp
@@ -55,6 +55,7 @@ private slots:
void addOverflow();
void mulOverflow_data();
void mulOverflow();
+ void signedOverflow();
};
void tst_QNumeric::fuzzyCompare_data()
@@ -105,6 +106,18 @@ void tst_QNumeric::qNan()
QVERIFY(qIsNaN(nan));
QVERIFY(qIsNaN(nan + 1));
QVERIFY(qIsNaN(-nan));
+
+ Q_STATIC_ASSERT(sizeof(double) == 8);
+#ifdef Q_LITTLE_ENDIAN
+ const uchar bytes[] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x7f };
+#else
+ const uchar bytes[] = { 0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
+#endif
+ memcpy(&nan, bytes, 8);
+ QVERIFY(!qIsFinite(nan));
+ QVERIFY(!qIsInf(nan));
+ QVERIFY(qIsNaN(nan));
+
double inf = qInf();
QVERIFY(inf > 0);
QVERIFY(-inf < 0);
@@ -366,5 +379,35 @@ void tst_QNumeric::mulOverflow()
MulOverflowDispatch<quint64>()();
}
+void tst_QNumeric::signedOverflow()
+{
+ const int minInt = std::numeric_limits<int>::min();
+ const int maxInt = std::numeric_limits<int>::max();
+ int r;
+
+ QCOMPARE(add_overflow(minInt + 1, int(-1), &r), false);
+ QCOMPARE(add_overflow(minInt, int(-1), &r), true);
+ QCOMPARE(add_overflow(minInt, minInt, &r), true);
+ QCOMPARE(add_overflow(maxInt - 1, int(1), &r), false);
+ QCOMPARE(add_overflow(maxInt, int(1), &r), true);
+ QCOMPARE(add_overflow(maxInt, maxInt, &r), true);
+
+ QCOMPARE(sub_overflow(minInt + 1, int(1), &r), false);
+ QCOMPARE(sub_overflow(minInt, int(1), &r), true);
+ QCOMPARE(sub_overflow(minInt, maxInt, &r), true);
+ QCOMPARE(sub_overflow(maxInt - 1, int(-1), &r), false);
+ QCOMPARE(sub_overflow(maxInt, int(-1), &r), true);
+ QCOMPARE(sub_overflow(maxInt, minInt, &r), true);
+
+ QCOMPARE(mul_overflow(minInt, int(1), &r), false);
+ QCOMPARE(mul_overflow(minInt, int(-1), &r), true);
+ QCOMPARE(mul_overflow(minInt, int(2), &r), true);
+ QCOMPARE(mul_overflow(minInt, minInt, &r), true);
+ QCOMPARE(mul_overflow(maxInt, int(1), &r), false);
+ QCOMPARE(mul_overflow(maxInt, int(-1), &r), false);
+ QCOMPARE(mul_overflow(maxInt, int(2), &r), true);
+ QCOMPARE(mul_overflow(maxInt, maxInt, &r), true);
+}
+
QTEST_APPLESS_MAIN(tst_QNumeric)
#include "tst_qnumeric.moc"
diff --git a/tests/auto/corelib/global/qrand/qrand.pro b/tests/auto/corelib/global/qrand/qrand.pro
index 7761b6721a..ee1430aea5 100644
--- a/tests/auto/corelib/global/qrand/qrand.pro
+++ b/tests/auto/corelib/global/qrand/qrand.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qrand
QT = core testlib
SOURCES = tst_qrand.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/global/qtendian/qtendian.pro b/tests/auto/corelib/global/qtendian/qtendian.pro
index 363b86988d..2b0af4fa4c 100644
--- a/tests/auto/corelib/global/qtendian/qtendian.pro
+++ b/tests/auto/corelib/global/qtendian/qtendian.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtendian
QT = core testlib
SOURCES = tst_qtendian.cpp
@@ -6,4 +6,3 @@ wince* { # QTBUG-37194 , internal compiler errors with MSVC2008 for Windows CE
QMAKE_CFLAGS_RELEASE -= -O2
QMAKE_CXXFLAGS_RELEASE -= -O2
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/largefile/largefile.pro b/tests/auto/corelib/io/largefile/largefile.pro
index d9938d07d5..caef116684 100644
--- a/tests/auto/corelib/io/largefile/largefile.pro
+++ b/tests/auto/corelib/io/largefile/largefile.pro
@@ -4,4 +4,3 @@ QT = core testlib
SOURCES = tst_largefile.cpp
wince: SOURCES += $$QT_SOURCE_TREE/src/corelib/kernel/qfunctions_wince.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qabstractfileengine/qabstractfileengine.pro b/tests/auto/corelib/io/qabstractfileengine/qabstractfileengine.pro
index b950f8c062..641bb7341b 100644
--- a/tests/auto/corelib/io/qabstractfileengine/qabstractfileengine.pro
+++ b/tests/auto/corelib/io/qabstractfileengine/qabstractfileengine.pro
@@ -3,4 +3,3 @@ TARGET = tst_qabstractfileengine
QT = core-private core testlib
SOURCES = tst_qabstractfileengine.cpp
RESOURCES += qabstractfileengine.qrc
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qbuffer/qbuffer.pro b/tests/auto/corelib/io/qbuffer/qbuffer.pro
index 55d91f3cde..76b1088595 100644
--- a/tests/auto/corelib/io/qbuffer/qbuffer.pro
+++ b/tests/auto/corelib/io/qbuffer/qbuffer.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qbuffer
QT = core testlib
SOURCES = tst_qbuffer.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qbuffer/tst_qbuffer.cpp b/tests/auto/corelib/io/qbuffer/tst_qbuffer.cpp
index 3b730d97f9..c4800b4e10 100644
--- a/tests/auto/corelib/io/qbuffer/tst_qbuffer.cpp
+++ b/tests/auto/corelib/io/qbuffer/tst_qbuffer.cpp
@@ -378,7 +378,7 @@ void tst_QBuffer::read_rawdata()
for (int i = 0; i < (int)sizeof(mydata); ++i) {
QVERIFY(!buffer.atEnd());
in >> ch;
- QVERIFY(ch == (quint8)mydata[i]);
+ QCOMPARE(ch, (quint8)mydata[i]);
}
QVERIFY(buffer.atEnd());
}
diff --git a/tests/auto/corelib/io/qdatastream/qdatastream.pro b/tests/auto/corelib/io/qdatastream/qdatastream.pro
index 9ab2b0948d..961e1933de 100644
--- a/tests/auto/corelib/io/qdatastream/qdatastream.pro
+++ b/tests/auto/corelib/io/qdatastream/qdatastream.pro
@@ -4,7 +4,6 @@ QT += testlib
SOURCES = tst_qdatastream.cpp
TESTDATA += datastream.q42
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
android: !android-no-sdk {
RESOURCES += \
diff --git a/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp b/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp
index d9d3f55d4a..729cf6547e 100644
--- a/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp
+++ b/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp
@@ -301,7 +301,7 @@ void tst_QDataStream::cleanupTestCase()
static int dataIndex(const QString &tag)
{
- int pos = tag.lastIndexOf("_");
+ int pos = tag.lastIndexOf(QLatin1Char('_'));
if (pos >= 0) {
int ret = 0;
QString count = tag.mid(pos + 1);
@@ -338,9 +338,9 @@ void tst_QDataStream::stream_data(int noOfElements)
for (int b=0; b<2; b++) {
QString byte_order = b == 0 ? "BigEndian" : "LittleEndian";
- QString tag = device + "_" + byte_order;
+ QString tag = device + QLatin1Char('_') + byte_order;
for (int e=0; e<noOfElements; e++) {
- QTest::newRow(qPrintable(tag + QString("_%1").arg(e))) << device << QString(byte_order);
+ QTest::newRow(qPrintable(tag + QLatin1Char('_') + QString::number(e))) << device << byte_order;
}
}
}
@@ -529,7 +529,7 @@ void tst_QDataStream::readQRegExp(QDataStream *s)
*s >> R;
QCOMPARE(R, test);
*s >> V;
- QVERIFY(V.type() == QVariant::RegExp);
+ QCOMPARE(V.type(), QVariant::RegExp);
QCOMPARE(V.toRegExp(), test);
}
@@ -797,7 +797,7 @@ void tst_QDataStream::readbool(QDataStream *s)
bool d1;
*s >> d1;
- QVERIFY(d1 == expected);
+ QCOMPARE(d1, expected);
}
// ************************************
@@ -860,7 +860,7 @@ void tst_QDataStream::readQBitArray(QDataStream *s)
QBitArray d1;
*s >> d1;
- QVERIFY(d1 == expected);
+ QCOMPARE(d1, expected);
}
// ************************************
@@ -919,7 +919,7 @@ void tst_QDataStream::readQBrush(QDataStream *s)
*s >> d2;
QBrush brush = qBrushData(dataIndex(QTest::currentDataTag()));
- QVERIFY(d2 == brush);
+ QCOMPARE(d2, brush);
}
// ************************************
@@ -961,7 +961,7 @@ void tst_QDataStream::readQColor(QDataStream *s)
QColor test(QColorData(dataIndex(QTest::currentDataTag())));
QColor d3;
*s >> d3;
- QVERIFY(d3 == test);
+ QCOMPARE(d3, test);
}
@@ -1057,7 +1057,7 @@ void tst_QDataStream::readQCursor(QDataStream *s)
*s >> d5;
QVERIFY(d5.shape() == test.shape()); //## lacks operator==
- QVERIFY(d5.hotSpot() == test.hotSpot());
+ QCOMPARE(d5.hotSpot(), test.hotSpot());
QVERIFY((d5.bitmap() != 0 && test.bitmap() != 0) || (d5.bitmap() == 0 && test.bitmap() == 0));
if (d5.bitmap() != 0) {
QPixmap actual = *(d5.bitmap());
@@ -1120,7 +1120,7 @@ void tst_QDataStream::readQDate(QDataStream *s)
QDate test(qDateData(dataIndex(QTest::currentDataTag())));
QDate d6;
*s >> d6;
- QVERIFY(d6 == test);
+ QCOMPARE(d6, test);
}
// ************************************
@@ -1214,7 +1214,7 @@ void tst_QDataStream::readQTime(QDataStream *s)
QTime test = qTimeData(dataIndex(QTest::currentDataTag()));
QTime d7;
*s >> d7;
- QVERIFY(d7 == test);
+ QCOMPARE(d7, test);
}
// ************************************
@@ -1264,7 +1264,7 @@ void tst_QDataStream::readQDateTime(QDataStream *s)
QDateTime test(qDateTimeData(dataIndex(QTest::currentDataTag())));
QDateTime d8;
*s >> d8;
- QVERIFY(d8 == test);
+ QCOMPARE(d8, test);
}
// ************************************
@@ -1415,16 +1415,16 @@ void tst_QDataStream::readQImage(QDataStream *s)
QImage d12;
*s >> d12;
- QVERIFY(d12 == ref);
+ QCOMPARE(d12, ref);
// do some extra neurotic tests
- QVERIFY(d12.size() == ref.size());
- QVERIFY(d12.isNull() == ref.isNull());
- QVERIFY(d12.width() == ref.width());
- QVERIFY(d12.height() == ref.height());
- QVERIFY(d12.depth() == ref.depth());
- QVERIFY(d12.colorCount() == ref.colorCount());
- QVERIFY(d12.hasAlphaChannel() == ref.hasAlphaChannel());
+ QCOMPARE(d12.size(), ref.size());
+ QCOMPARE(d12.isNull(), ref.isNull());
+ QCOMPARE(d12.width(), ref.width());
+ QCOMPARE(d12.height(), ref.height());
+ QCOMPARE(d12.depth(), ref.depth());
+ QCOMPARE(d12.colorCount(), ref.colorCount());
+ QCOMPARE(d12.hasAlphaChannel(), ref.hasAlphaChannel());
}
// ************************************
@@ -1518,9 +1518,9 @@ void tst_QDataStream::readQPen(QDataStream *s)
QCOMPARE(d15.style(), origPen.style());
QCOMPARE(d15.width(), origPen.width());
QCOMPARE(d15.color(), origPen.color());
- QVERIFY(d15.capStyle() == origPen.capStyle());
- QVERIFY(d15.joinStyle() == origPen.joinStyle());
- QVERIFY(d15 == origPen);
+ QCOMPARE(d15.capStyle(), origPen.capStyle());
+ QCOMPARE(d15.joinStyle(), origPen.joinStyle());
+ QCOMPARE(d15, origPen);
}
// ************************************
@@ -1568,11 +1568,11 @@ void tst_QDataStream::readQPixmap(QDataStream *s)
QPixmap d16;
*s >> d16;
QVERIFY(!d16.isNull() && !pm.isNull());
- QVERIFY(d16.width() == pm.width());
- QVERIFY(d16.height() == pm.height());
- QVERIFY(d16.size() == pm.size());
- QVERIFY(d16.rect() == pm.rect());
- QVERIFY(d16.depth() == pm.depth());
+ QCOMPARE(d16.width(), pm.width());
+ QCOMPARE(d16.height(), pm.height());
+ QCOMPARE(d16.size(), pm.size());
+ QCOMPARE(d16.rect(), pm.rect());
+ QCOMPARE(d16.depth(), pm.depth());
}
void tst_QDataStream::writeQIcon(QDataStream *s)
@@ -1639,11 +1639,11 @@ void tst_QDataStream::readQPoint(QDataStream *s)
QPoint ref(qPointData(dataIndex(QTest::currentDataTag())));
QPoint d17;
*s >> d17;
- QVERIFY(d17 == ref);
+ QCOMPARE(d17, ref);
QPointF d17f;
*s >> d17f;
- QVERIFY(d17f == QPointF(ref));
+ QCOMPARE(d17f, QPointF(ref));
}
// ************************************
@@ -1691,11 +1691,11 @@ void tst_QDataStream::readQRect(QDataStream *s)
QRect ref(qRectData(dataIndex(QTest::currentDataTag())));
QRect d18;
*s >> d18;
- QVERIFY(d18 == ref);
+ QCOMPARE(d18, ref);
QRectF d18f;
*s >> d18f;
- QVERIFY(d18f == QRectF(ref));
+ QCOMPARE(d18f, QRectF(ref));
}
// ************************************
@@ -1804,11 +1804,11 @@ void tst_QDataStream::readQPolygon(QDataStream *s)
QPolygon ref(qPolygonData(dataIndex(QTest::currentDataTag())));
QPolygon d19;
*s >> d19;
- QVERIFY(d19 == ref);
+ QCOMPARE(d19, ref);
QPolygonF d19f;
*s >> d19f;
- QVERIFY(d19f == QPolygonF(ref));
+ QCOMPARE(d19f, QPolygonF(ref));
}
// ************************************
@@ -1868,7 +1868,7 @@ void tst_QDataStream::readQRegion(QDataStream *s)
QRegion ref(qRegionData(dataIndex(QTest::currentDataTag())));
QRegion r;
*s >> r;
- QVERIFY(r == ref);
+ QCOMPARE(r, ref);
}
// ************************************
@@ -1916,11 +1916,11 @@ void tst_QDataStream::readQSize(QDataStream *s)
QSize ref(qSizeData(dataIndex(QTest::currentDataTag())));
QSize d21;
*s >> d21;
- QVERIFY(d21 == ref);
+ QCOMPARE(d21, ref);
QSizeF d21f;
*s >> d21f;
- QVERIFY(d21f == QSizeF(ref));
+ QCOMPARE(d21f, QSizeF(ref));
}
// *********************** atEnd ******************************
@@ -2072,7 +2072,7 @@ void tst_QDataStream::setVersion_data()
QDataStream latest;
for (int vers = 1; vers <= latest.version(); ++vers)
- QTest::newRow(qPrintable(QString("v_%1").arg(vers))) << vers;
+ QTest::newRow(("v_" + QByteArray::number(vers)).constData()) << vers;
}
void tst_QDataStream::setVersion()
@@ -2096,13 +2096,13 @@ void tst_QDataStream::setVersion()
QDataStream in(&ba1, QIODevice::ReadOnly);
in.setVersion(vers);
in >> keyseq1 >> keyseq2 >> deadbeef;
- QVERIFY(keyseq1 == QKeySequence(Qt::Key_A));
+ QCOMPARE(keyseq1, QKeySequence(Qt::Key_A));
if (vers >= 5) {
QVERIFY(keyseq2 == QKeySequence(Qt::Key_B, Qt::Key_C));
} else {
- QVERIFY(keyseq2 == QKeySequence(Qt::Key_B));
+ QCOMPARE(keyseq2, QKeySequence(Qt::Key_B));
}
- QVERIFY(deadbeef == 0xDEADBEEF);
+ QCOMPARE(deadbeef, 0xDEADBEEF);
}
/*
@@ -2111,7 +2111,7 @@ void tst_QDataStream::setVersion()
// revise the test if new color roles or color groups are added
QVERIFY(QPalette::NColorRoles == QPalette::ToolTipText + 1);
- QVERIFY(QPalette::NColorGroups == 3);
+ QCOMPARE(int(QPalette::NColorGroups), 3);
QByteArray ba2;
QPalette pal1, pal2;
@@ -2176,8 +2176,8 @@ void tst_QDataStream::setVersion()
}
}
}
- QVERIFY(pal1 == inPal1);
- QVERIFY(pal2 == inPal2);
+ QCOMPARE(pal1, inPal1);
+ QCOMPARE(pal2, inPal2);
}
}
}
@@ -3062,9 +3062,9 @@ void tst_QDataStream::compatibility_Qt3()
in >> in_palette;
in >> in_brush;
}
- QVERIFY(in_brush.style() == Qt::NoBrush);
- QVERIFY(in_palette.brush(QPalette::Button).style() == Qt::NoBrush);
- QVERIFY(in_palette.color(QPalette::Light) == Qt::green);
+ QCOMPARE(in_brush.style(), Qt::NoBrush);
+ QCOMPARE(in_palette.brush(QPalette::Button).style(), Qt::NoBrush);
+ QCOMPARE(in_palette.color(QPalette::Light), QColor(Qt::green));
}
}
@@ -3094,9 +3094,9 @@ void tst_QDataStream::compatibility_Qt2()
in >> in_palette;
in >> in_brush;
}
- QVERIFY(in_brush.style() == Qt::NoBrush);
- QVERIFY(in_palette.brush(QPalette::Button).style() == Qt::NoBrush);
- QVERIFY(in_palette.color(QPalette::Light) == Qt::green);
+ QCOMPARE(in_brush.style(), Qt::NoBrush);
+ QCOMPARE(in_palette.brush(QPalette::Button).style(), Qt::NoBrush);
+ QCOMPARE(in_palette.color(QPalette::Light), QColor(Qt::green));
}
void tst_QDataStream::floatingPointNaN()
diff --git a/tests/auto/corelib/io/qdataurl/qdataurl.pro b/tests/auto/corelib/io/qdataurl/qdataurl.pro
index d21fc4ed15..7085c9d881 100644
--- a/tests/auto/corelib/io/qdataurl/qdataurl.pro
+++ b/tests/auto/corelib/io/qdataurl/qdataurl.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qdataurl
QT = core core-private testlib
SOURCES = tst_qdataurl.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qdebug/qdebug.pro b/tests/auto/corelib/io/qdebug/qdebug.pro
index 5e902bb105..45c0aa4061 100644
--- a/tests/auto/corelib/io/qdebug/qdebug.pro
+++ b/tests/auto/corelib/io/qdebug/qdebug.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qdebug
QT = core testlib concurrent
SOURCES = tst_qdebug.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qdir/qdir.pro b/tests/auto/corelib/io/qdir/qdir.pro
index 0adc7e0450..26bc60a731 100644
--- a/tests/auto/corelib/io/qdir/qdir.pro
+++ b/tests/auto/corelib/io/qdir/qdir.pro
@@ -5,7 +5,6 @@ SOURCES = tst_qdir.cpp
RESOURCES += qdir.qrc
TESTDATA += testdir testData searchdir resources entrylist types tst_qdir.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
android:!android-no-sdk {
RESOURCES += android_testdata.qrc
diff --git a/tests/auto/corelib/io/qdir/tst_qdir.cpp b/tests/auto/corelib/io/qdir/tst_qdir.cpp
index ae6fe7eaef..008293a15e 100644
--- a/tests/auto/corelib/io/qdir/tst_qdir.cpp
+++ b/tests/auto/corelib/io/qdir/tst_qdir.cpp
@@ -556,7 +556,7 @@ void tst_QDir::exists_data()
char drive = 'Z';
QString driv;
do {
- driv = QString::fromLatin1("%1:/").arg(drive);
+ driv = drive + QLatin1String(":/");
if (!driveLetters.contains(driv)) break;
--drive;
} while (drive >= 'A');
@@ -621,7 +621,7 @@ void tst_QDir::compare()
dir.makeAbsolute();
QVERIFY(dir == QDir::currentPath());
- QVERIFY(QDir() == QDir(QDir::currentPath()));
+ QCOMPARE(QDir(), QDir(QDir::currentPath()));
QVERIFY(QDir("../") == QDir(QDir::currentPath() + "/.."));
}
@@ -1058,7 +1058,7 @@ void tst_QDir::current()
if (!path.isEmpty()) {
bool b = QDir::setCurrent(path);
// If path is non existent, then setCurrent should be false (currentDir is empty in testData)
- QVERIFY(b == !currentDir.isEmpty());
+ QCOMPARE(b, !currentDir.isEmpty());
}
if (!currentDir.isEmpty()) {
QDir newCurrent = QDir::current();
@@ -1080,7 +1080,7 @@ void tst_QDir::cd_data()
QTest::addColumn<bool>("successExpected");
QTest::addColumn<QString>("newDir");
- int index = m_dataPath.lastIndexOf("/");
+ int index = m_dataPath.lastIndexOf(QLatin1Char('/'));
QTest::newRow("cdUp") << m_dataPath << ".." << true << m_dataPath.left(index==0?1:index);
QTest::newRow("cdUp non existent (relative dir)") << "anonexistingDir" << ".."
<< true << m_dataPath;
@@ -1124,11 +1124,11 @@ void tst_QDir::setNameFilters_data()
QTest::newRow("spaces2") << m_dataPath + "/testdir/spaces" << QStringList("*.bar")
<< QStringList("foo.bar");
QTest::newRow("spaces3") << m_dataPath + "/testdir/spaces" << QStringList("foo.*")
- << QString("foo. bar,foo.bar").split(",");
- QTest::newRow("files1") << m_dataPath + "/testdir/dir" << QString("*r.cpp *.pro").split(" ")
- << QString("qdir.pro,qrc_qdir.cpp,tst_qdir.cpp").split(",");
+ << QString("foo. bar,foo.bar").split(QLatin1Char(','));
+ QTest::newRow("files1") << m_dataPath + "/testdir/dir" << QString("*r.cpp *.pro").split(QLatin1Char(' '))
+ << QString("qdir.pro,qrc_qdir.cpp,tst_qdir.cpp").split(QLatin1Char(','));
QTest::newRow("resources1") << QString(":/tst_qdir/resources/entryList") << QStringList("*.data")
- << QString("file1.data,file2.data,file3.data").split(',');
+ << QString("file1.data,file2.data,file3.data").split(QLatin1Char(','));
}
void tst_QDir::setNameFilters()
@@ -1695,7 +1695,7 @@ void tst_QDir::searchPaths()
QDir::setSearchPaths(searchPathPrefixList.at(i), searchPathsList.at(i).split(","));
}
for (int i = 0; i < searchPathPrefixList.count(); ++i) {
- QVERIFY(QDir::searchPaths(searchPathPrefixList.at(i)) == searchPathsList.at(i).split(","));
+ QCOMPARE(QDir::searchPaths(searchPathPrefixList.at(i)), searchPathsList.at(i).split(","));
}
QCOMPARE(QFile(filename).exists(), exists);
@@ -1718,7 +1718,7 @@ void tst_QDir::searchPaths()
}
}
for (int i = 0; i < searchPathPrefixList.count(); ++i) {
- QVERIFY(QDir::searchPaths(searchPathPrefixList.at(i)) == searchPathsList.at(i).split(","));
+ QCOMPARE(QDir::searchPaths(searchPathPrefixList.at(i)), searchPathsList.at(i).split(","));
}
QCOMPARE(QFile(filename).exists(), exists);
diff --git a/tests/auto/corelib/io/qdiriterator/qdiriterator.pro b/tests/auto/corelib/io/qdiriterator/qdiriterator.pro
index a2429bf2f0..2b50f97ac5 100644
--- a/tests/auto/corelib/io/qdiriterator/qdiriterator.pro
+++ b/tests/auto/corelib/io/qdiriterator/qdiriterator.pro
@@ -7,6 +7,5 @@ RESOURCES += qdiriterator.qrc
TESTDATA += entrylist
wince*mips*|wincewm50smart-msvc200*: DEFINES += WINCE_BROKEN_ITERATE=1
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
win32: CONFIG += insignificant_test # Crashes on Windows in release builds
diff --git a/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp b/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp
index 6b1719ad53..9e368515e4 100644
--- a/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp
+++ b/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp
@@ -538,7 +538,7 @@ void tst_QDirIterator::recurseWithFilters() const
QVERIFY(it.hasNext());
it.next();
actualEntries.insert(it.fileInfo().filePath());
- QVERIFY(actualEntries == expectedEntries);
+ QCOMPARE(actualEntries, expectedEntries);
QVERIFY(!it.hasNext());
}
diff --git a/tests/auto/corelib/io/qfile/qfile.pro b/tests/auto/corelib/io/qfile/qfile.pro
index e2c714c67f..10c8d918f7 100644
--- a/tests/auto/corelib/io/qfile/qfile.pro
+++ b/tests/auto/corelib/io/qfile/qfile.pro
@@ -5,4 +5,3 @@ wince* {
SUBDIRS = test stdinprocess
}
-CONFIG += parallel_test
diff --git a/tests/auto/corelib/io/qfile/stdinprocess/stdinprocess.pro b/tests/auto/corelib/io/qfile/stdinprocess/stdinprocess.pro
index 51badce898..8e463e4cef 100644
--- a/tests/auto/corelib/io/qfile/stdinprocess/stdinprocess.pro
+++ b/tests/auto/corelib/io/qfile/stdinprocess/stdinprocess.pro
@@ -6,4 +6,3 @@ CONFIG += console
# This app is testdata for tst_qfile
target.path = $$[QT_INSTALL_TESTS]/tst_qfile/$$TARGET
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qfile/test/test.pro b/tests/auto/corelib/io/qfile/test/test.pro
index 9aa4119795..c9ba96cc1b 100644
--- a/tests/auto/corelib/io/qfile/test/test.pro
+++ b/tests/auto/corelib/io/qfile/test/test.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
CONFIG -= app_bundle debug_and_release_target
QT = core-private core testlib
qtHaveModule(network): QT += network
@@ -17,4 +16,3 @@ TESTDATA += ../dosfile.txt ../noendofline.txt ../testfile.txt \
../resources/file1.ext1
win32:!winrt: LIBS+=-lole32 -luuid
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qfile/tst_qfile.cpp b/tests/auto/corelib/io/qfile/tst_qfile.cpp
index 1c695a1113..b4140e1115 100644
--- a/tests/auto/corelib/io/qfile/tst_qfile.cpp
+++ b/tests/auto/corelib/io/qfile/tst_qfile.cpp
@@ -849,7 +849,7 @@ void tst_QFile::readAll()
QByteArray a = file.readAll();
file.reset();
- QVERIFY(file.pos() == 0);
+ QCOMPARE(file.pos(), 0);
QVERIFY(file.bytesAvailable() > 7);
QByteArray b = file.read(1);
@@ -1195,7 +1195,7 @@ void tst_QFile::append()
f.close();
QVERIFY2(f.open(QIODevice::Append), msgOpenFailed(f).constData());
- QVERIFY(f.pos() == 1);
+ QCOMPARE(f.pos(), 1);
f.putChar('a');
f.close();
QCOMPARE(int(f.size()), 2);
@@ -2047,7 +2047,7 @@ void tst_QFile::longFileName()
QString line = ts.readLine();
QCOMPARE(line, fileName);
}
- QString newName = fileName + QLatin1String("1");
+ QString newName = fileName + QLatin1Char('1');
{
QVERIFY(QFile::copy(fileName, newName));
QFile file(newName);
@@ -2224,7 +2224,7 @@ void tst_QFile::removeOpenFile()
QVERIFY(removed);
QVERIFY(!f.isOpen());
QVERIFY(!f.exists());
- QVERIFY(f.error() == QFile::NoError);
+ QCOMPARE(f.error(), QFile::NoError);
}
{
@@ -2251,7 +2251,7 @@ void tst_QFile::removeOpenFile()
QVERIFY(removed);
QVERIFY(!f.isOpen());
QVERIFY(!f.exists());
- QVERIFY(f.error() == QFile::NoError);
+ QCOMPARE(f.error(), QFile::NoError);
}
}
@@ -2819,13 +2819,13 @@ void tst_QFile::readEof()
char buf[10];
int ret = file.read(buf, sizeof buf);
QCOMPARE(ret, 0);
- QVERIFY(file.error() == QFile::NoError);
+ QCOMPARE(file.error(), QFile::NoError);
QVERIFY(file.atEnd());
// Do it again to ensure that we get the same result
ret = file.read(buf, sizeof buf);
QCOMPARE(ret, 0);
- QVERIFY(file.error() == QFile::NoError);
+ QCOMPARE(file.error(), QFile::NoError);
QVERIFY(file.atEnd());
}
@@ -2840,13 +2840,13 @@ void tst_QFile::readEof()
QByteArray ret = file.read(10);
QVERIFY(ret.isEmpty());
- QVERIFY(file.error() == QFile::NoError);
+ QCOMPARE(file.error(), QFile::NoError);
QVERIFY(file.atEnd());
// Do it again to ensure that we get the same result
ret = file.read(10);
QVERIFY(ret.isEmpty());
- QVERIFY(file.error() == QFile::NoError);
+ QCOMPARE(file.error(), QFile::NoError);
QVERIFY(file.atEnd());
}
@@ -2862,13 +2862,13 @@ void tst_QFile::readEof()
char buf[10];
int ret = file.readLine(buf, sizeof buf);
QCOMPARE(ret, -1);
- QVERIFY(file.error() == QFile::NoError);
+ QCOMPARE(file.error(), QFile::NoError);
QVERIFY(file.atEnd());
// Do it again to ensure that we get the same result
ret = file.readLine(buf, sizeof buf);
QCOMPARE(ret, -1);
- QVERIFY(file.error() == QFile::NoError);
+ QCOMPARE(file.error(), QFile::NoError);
QVERIFY(file.atEnd());
}
@@ -2883,13 +2883,13 @@ void tst_QFile::readEof()
QByteArray ret = file.readLine();
QVERIFY(ret.isNull());
- QVERIFY(file.error() == QFile::NoError);
+ QCOMPARE(file.error(), QFile::NoError);
QVERIFY(file.atEnd());
// Do it again to ensure that we get the same result
ret = file.readLine();
QVERIFY(ret.isNull());
- QVERIFY(file.error() == QFile::NoError);
+ QCOMPARE(file.error(), QFile::NoError);
QVERIFY(file.atEnd());
}
@@ -2904,12 +2904,12 @@ void tst_QFile::readEof()
char c;
QVERIFY(!file.getChar(&c));
- QVERIFY(file.error() == QFile::NoError);
+ QCOMPARE(file.error(), QFile::NoError);
QVERIFY(file.atEnd());
// Do it again to ensure that we get the same result
QVERIFY(!file.getChar(&c));
- QVERIFY(file.error() == QFile::NoError);
+ QCOMPARE(file.error(), QFile::NoError);
QVERIFY(file.atEnd());
}
}
@@ -2997,7 +2997,7 @@ void tst_QFile::map()
memory = file.map(offset, size);
QCOMPARE(file.error(), QFile::NoError);
QVERIFY(memory);
- QVERIFY(memory[0] == 'Q');
+ QCOMPARE(memory[0], uchar('Q'));
QVERIFY(file.unmap(memory));
QCOMPARE(file.error(), QFile::NoError);
diff --git a/tests/auto/corelib/io/qfileinfo/qfileinfo.pro b/tests/auto/corelib/io/qfileinfo/qfileinfo.pro
index 571637be37..8aa81896cc 100644
--- a/tests/auto/corelib/io/qfileinfo/qfileinfo.pro
+++ b/tests/auto/corelib/io/qfileinfo/qfileinfo.pro
@@ -6,6 +6,5 @@ RESOURCES += qfileinfo.qrc \
testdata.qrc
win32:!wince:!winrt:LIBS += -ladvapi32 -lnetapi32
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
win32: CONFIG += insignificant_test # Crashes on Windows in release builds
diff --git a/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp b/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp
index 210fdb5a12..1d49c8e3b9 100644
--- a/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp
+++ b/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp
@@ -1097,7 +1097,7 @@ void tst_QFileInfo::consistent()
QFileInfo fi(file);
QCOMPARE(fi.filePath(), expected);
- QCOMPARE(fi.dir().path() + "/" + fi.fileName(), expected);
+ QCOMPARE(fi.dir().path() + QLatin1Char('/') + fi.fileName(), expected);
}
@@ -1429,7 +1429,7 @@ void tst_QFileInfo::refresh()
QCOMPARE(file.write("JOJOJO"), qint64(6));
file.flush();
- QVERIFY(info.lastModified() == lastModified);
+ QCOMPARE(info.lastModified(), lastModified);
QCOMPARE(info.size(), qint64(7));
#if defined(Q_OS_WIN) || defined(Q_OS_WINCE)
diff --git a/tests/auto/corelib/io/qfileselector/platforms/+blackberry/test b/tests/auto/corelib/io/qfileselector/platforms/+blackberry/test
deleted file mode 100644
index e69de29bb2..0000000000
--- a/tests/auto/corelib/io/qfileselector/platforms/+blackberry/test
+++ /dev/null
diff --git a/tests/auto/corelib/io/qfileselector/platforms/+blackberry/test2 b/tests/auto/corelib/io/qfileselector/platforms/+blackberry/test2
deleted file mode 100644
index e69de29bb2..0000000000
--- a/tests/auto/corelib/io/qfileselector/platforms/+blackberry/test2
+++ /dev/null
diff --git a/tests/auto/corelib/io/qfileselector/qfileselector.pro b/tests/auto/corelib/io/qfileselector/qfileselector.pro
index ded3d6502e..edcc91e8ed 100644
--- a/tests/auto/corelib/io/qfileselector/qfileselector.pro
+++ b/tests/auto/corelib/io/qfileselector/qfileselector.pro
@@ -1,4 +1,3 @@
-CONFIG += parallel_test
CONFIG += testcase
TARGET = tst_qfileselectors
QT = core-private testlib
diff --git a/tests/auto/corelib/io/qfileselector/qfileselector.qrc b/tests/auto/corelib/io/qfileselector/qfileselector.qrc
index 6e2699774d..47ace78528 100644
--- a/tests/auto/corelib/io/qfileselector/qfileselector.qrc
+++ b/tests/auto/corelib/io/qfileselector/qfileselector.qrc
@@ -14,7 +14,6 @@
<!-- platforms/test: deepest possible selection -->
<file>platforms/test</file>
<file>platforms/+unix/+android/test</file>
- <file>platforms/+unix/+blackberry/test</file>
<file>platforms/+unix/+darwin/+mac/+ios/test</file>
<file>platforms/+unix/+darwin/+mac/+osx/test</file>
<file>platforms/+unix/+darwin/+mac/test</file>
@@ -26,7 +25,6 @@
<file>platforms/+windows/+winnt/test</file>
<file>platforms/+windows/test</file>
<file>platforms/+android/test</file>
- <file>platforms/+blackberry/test</file>
<file>platforms/+ios/test</file>
<file>platforms/+osx/test</file>
<file>platforms/+darwin/test</file>
@@ -38,7 +36,6 @@
<!-- platforms/test2: shallow selection for the deepest selector -->
<file>platforms/test2</file>
<file>platforms/+android/test2</file>
- <file>platforms/+blackberry/test2</file>
<file>platforms/+ios/test2</file>
<file>platforms/+osx/test2</file>
<file>platforms/+haiku/test2</file>
diff --git a/tests/auto/corelib/io/qfileselector/tst_qfileselector.cpp b/tests/auto/corelib/io/qfileselector/tst_qfileselector.cpp
index 87381f4c4e..4da3419741 100644
--- a/tests/auto/corelib/io/qfileselector/tst_qfileselector.cpp
+++ b/tests/auto/corelib/io/qfileselector/tst_qfileselector.cpp
@@ -88,7 +88,7 @@ void tst_QFileSelector::basicTest_data()
QString expectedPlatform1File(":/platforms");
QString expectedPlatform2File(""); //Only the last selector
QString expectedPlatform3File; // Only the first selector (the family)
-#if defined(Q_OS_UNIX) && !defined(Q_OS_ANDROID) && !defined(Q_OS_BLACKBERRY) && \
+#if defined(Q_OS_UNIX) && !defined(Q_OS_ANDROID) && \
!defined(Q_OS_DARWIN) && !defined(Q_OS_LINUX) && !defined(Q_OS_HAIKU)
/* We are only aware of specific unixes, and do not have test files for any of the others.
However those unixes can get a selector added from the result of a uname call, so this will
diff --git a/tests/auto/corelib/io/qfilesystementry/qfilesystementry.pro b/tests/auto/corelib/io/qfilesystementry/qfilesystementry.pro
index 99d3af1848..474836fba2 100644
--- a/tests/auto/corelib/io/qfilesystementry/qfilesystementry.pro
+++ b/tests/auto/corelib/io/qfilesystementry/qfilesystementry.pro
@@ -1,7 +1,6 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qfilesystementry
QT = core-private testlib
SOURCES = tst_qfilesystementry.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qfilesystementry.cpp
HEADERS = $$QT_SOURCE_TREE/src/corelib/io/qfilesystementry_p.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qfilesystemwatcher/qfilesystemwatcher.pro b/tests/auto/corelib/io/qfilesystemwatcher/qfilesystemwatcher.pro
index 1faa089c6e..46dd70289b 100644
--- a/tests/auto/corelib/io/qfilesystemwatcher/qfilesystemwatcher.pro
+++ b/tests/auto/corelib/io/qfilesystemwatcher/qfilesystemwatcher.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qfilesystemwatcher
QT = core testlib
SOURCES = tst_qfilesystemwatcher.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp b/tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp
index 026743257c..e8bbaa1b25 100644
--- a/tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp
+++ b/tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp
@@ -731,9 +731,10 @@ void tst_QFileSystemWatcher::signalsEmittedAfterFileMoved()
QString movePath = testDir.filePath("movehere");
for (int i = 0; i < fileCount; ++i) {
- QFile f(testDir.filePath(QString("test%1.txt").arg(i)));
+ const QByteArray iB = QByteArray::number(i);
+ QFile f(testDir.filePath(QLatin1String("test") + QString::fromLatin1(iB) + QLatin1String(".txt")));
QVERIFY(f.open(QIODevice::WriteOnly));
- f.write(QByteArray("i am ") + QByteArray::number(i));
+ f.write(QByteArray("i am ") + iB);
f.close();
}
diff --git a/tests/auto/corelib/io/qiodevice/qiodevice.pro b/tests/auto/corelib/io/qiodevice/qiodevice.pro
index 9fd70fb177..78f5b5e75d 100644
--- a/tests/auto/corelib/io/qiodevice/qiodevice.pro
+++ b/tests/auto/corelib/io/qiodevice/qiodevice.pro
@@ -5,7 +5,6 @@ SOURCES = tst_qiodevice.cpp
TESTDATA += tst_qiodevice.cpp
MOC_DIR=tmp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
android:!android-no-sdk: {
RESOURCES += \
diff --git a/tests/auto/corelib/io/qipaddress/qipaddress.pro b/tests/auto/corelib/io/qipaddress/qipaddress.pro
index ff569aa3d5..9c769052ed 100644
--- a/tests/auto/corelib/io/qipaddress/qipaddress.pro
+++ b/tests/auto/corelib/io/qipaddress/qipaddress.pro
@@ -1,5 +1,4 @@
SOURCES += tst_qipaddress.cpp
TARGET = tst_qipaddress
QT = core core-private testlib
-CONFIG += testcase parallel_test
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
+CONFIG += testcase
diff --git a/tests/auto/corelib/io/qnodebug/qnodebug.pro b/tests/auto/corelib/io/qnodebug/qnodebug.pro
index ff8e09b84b..7e35f92474 100644
--- a/tests/auto/corelib/io/qnodebug/qnodebug.pro
+++ b/tests/auto/corelib/io/qnodebug/qnodebug.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qnodebug
QT = core testlib
SOURCES = tst_qnodebug.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qnodebug/tst_qnodebug.cpp b/tests/auto/corelib/io/qnodebug/tst_qnodebug.cpp
index 5ece9190a5..304cf7b551 100644
--- a/tests/auto/corelib/io/qnodebug/tst_qnodebug.cpp
+++ b/tests/auto/corelib/io/qnodebug/tst_qnodebug.cpp
@@ -69,8 +69,9 @@ void tst_QNoDebug::noDebugOutput() const
void tst_QNoDebug::streaming() const
{
QDateTime dt(QDate(1,2,3),QTime(4,5,6));
- const QString debugString = dt.toString(QStringLiteral("yyyy-MM-dd HH:mm:ss.zzz t"));
- QTest::ignoreMessage(QtWarningMsg, qPrintable(QString::fromLatin1("QDateTime(%1 Qt::TimeSpec(LocalTime))").arg(debugString)));
+ const QByteArray debugString = dt.toString(QStringLiteral("yyyy-MM-dd HH:mm:ss.zzz t")).toLatin1();
+ const QByteArray message = "QDateTime(" + debugString + " Qt::TimeSpec(LocalTime))";
+ QTest::ignoreMessage(QtWarningMsg, message.constData());
qWarning() << dt;
}
diff --git a/tests/auto/corelib/io/qprocess-noapplication/qprocess-noapplication.pro b/tests/auto/corelib/io/qprocess-noapplication/qprocess-noapplication.pro
index 2f409ebdbc..e46e7e1100 100644
--- a/tests/auto/corelib/io/qprocess-noapplication/qprocess-noapplication.pro
+++ b/tests/auto/corelib/io/qprocess-noapplication/qprocess-noapplication.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
CONFIG -= app_bundle debug_and_release_target
QT = core testlib
SOURCES = tst_qprocessnoapplication.cpp
diff --git a/tests/auto/corelib/io/qprocess/fileWriterProcess/fileWriterProcess.pro b/tests/auto/corelib/io/qprocess/fileWriterProcess/fileWriterProcess.pro
index 55e9b05d1a..947dc916f2 100644
--- a/tests/auto/corelib/io/qprocess/fileWriterProcess/fileWriterProcess.pro
+++ b/tests/auto/corelib/io/qprocess/fileWriterProcess/fileWriterProcess.pro
@@ -3,4 +3,3 @@ CONFIG += console
CONFIG -= app_bundle
QT = core
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/test/test.pro b/tests/auto/corelib/io/qprocess/test/test.pro
index f77dacc87b..96d105a4b4 100644
--- a/tests/auto/corelib/io/qprocess/test/test.pro
+++ b/tests/auto/corelib/io/qprocess/test/test.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
CONFIG -= app_bundle debug_and_release_target
QT = core-private testlib network
SOURCES = ../tst_qprocess.cpp
@@ -19,4 +18,3 @@ TEST_HELPER_INSTALLS += \
"../testProcessSpacesArgs/one space" \
"../testProcessSpacesArgs/two space s" \
"../test Space In Name/testSpaceInName"
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/testDetached/testDetached.pro b/tests/auto/corelib/io/qprocess/testDetached/testDetached.pro
index 961b28ec7d..8d1fcba624 100644
--- a/tests/auto/corelib/io/qprocess/testDetached/testDetached.pro
+++ b/tests/auto/corelib/io/qprocess/testDetached/testDetached.pro
@@ -4,4 +4,3 @@ CONFIG += console
CONFIG -= app_bundle
INSTALLS =
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/testExitCodes/testExitCodes.pro b/tests/auto/corelib/io/qprocess/testExitCodes/testExitCodes.pro
index 049454abe2..b08371804f 100644
--- a/tests/auto/corelib/io/qprocess/testExitCodes/testExitCodes.pro
+++ b/tests/auto/corelib/io/qprocess/testExitCodes/testExitCodes.pro
@@ -3,4 +3,3 @@ CONFIG -= qt app_bundle
CONFIG += console
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/testGuiProcess/testGuiProcess.pro b/tests/auto/corelib/io/qprocess/testGuiProcess/testGuiProcess.pro
index d3439072bb..8778da7ffe 100644
--- a/tests/auto/corelib/io/qprocess/testGuiProcess/testGuiProcess.pro
+++ b/tests/auto/corelib/io/qprocess/testGuiProcess/testGuiProcess.pro
@@ -3,4 +3,3 @@ QT += widgets
CONFIG += console
CONFIG -= app_bundle
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/testProcessCrash/testProcessCrash.pro b/tests/auto/corelib/io/qprocess/testProcessCrash/testProcessCrash.pro
index f7c57abc37..7ccc976efc 100644
--- a/tests/auto/corelib/io/qprocess/testProcessCrash/testProcessCrash.pro
+++ b/tests/auto/corelib/io/qprocess/testProcessCrash/testProcessCrash.pro
@@ -3,4 +3,3 @@ CONFIG += console
CONFIG -= qt app_bundle
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/testProcessDeadWhileReading/testProcessDeadWhileReading.pro b/tests/auto/corelib/io/qprocess/testProcessDeadWhileReading/testProcessDeadWhileReading.pro
index 56b4642bed..fbb3411d47 100644
--- a/tests/auto/corelib/io/qprocess/testProcessDeadWhileReading/testProcessDeadWhileReading.pro
+++ b/tests/auto/corelib/io/qprocess/testProcessDeadWhileReading/testProcessDeadWhileReading.pro
@@ -3,4 +3,3 @@ CONFIG -= qt app_bundle
CONFIG += console
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/testProcessEOF/testProcessEOF.pro b/tests/auto/corelib/io/qprocess/testProcessEOF/testProcessEOF.pro
index 8f77e46f74..98fe78c8b9 100644
--- a/tests/auto/corelib/io/qprocess/testProcessEOF/testProcessEOF.pro
+++ b/tests/auto/corelib/io/qprocess/testProcessEOF/testProcessEOF.pro
@@ -4,4 +4,3 @@ CONFIG += console
win32:!mingw:!equals(TEMPLATE_PREFIX, "vc"):QMAKE_CXXFLAGS += /GS-
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/testProcessEcho/testProcessEcho.pro b/tests/auto/corelib/io/qprocess/testProcessEcho/testProcessEcho.pro
index 3940ddbf98..e236e05c7d 100644
--- a/tests/auto/corelib/io/qprocess/testProcessEcho/testProcessEcho.pro
+++ b/tests/auto/corelib/io/qprocess/testProcessEcho/testProcessEcho.pro
@@ -2,4 +2,3 @@ SOURCES = main.cpp
CONFIG -= qt app_bundle
CONFIG += console
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/testProcessEcho2/testProcessEcho2.pro b/tests/auto/corelib/io/qprocess/testProcessEcho2/testProcessEcho2.pro
index 3940ddbf98..e236e05c7d 100644
--- a/tests/auto/corelib/io/qprocess/testProcessEcho2/testProcessEcho2.pro
+++ b/tests/auto/corelib/io/qprocess/testProcessEcho2/testProcessEcho2.pro
@@ -2,4 +2,3 @@ SOURCES = main.cpp
CONFIG -= qt app_bundle
CONFIG += console
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/testProcessEcho3/testProcessEcho3.pro b/tests/auto/corelib/io/qprocess/testProcessEcho3/testProcessEcho3.pro
index 3940ddbf98..e236e05c7d 100644
--- a/tests/auto/corelib/io/qprocess/testProcessEcho3/testProcessEcho3.pro
+++ b/tests/auto/corelib/io/qprocess/testProcessEcho3/testProcessEcho3.pro
@@ -2,4 +2,3 @@ SOURCES = main.cpp
CONFIG -= qt app_bundle
CONFIG += console
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/testProcessEnvironment/testProcessEnvironment.pro b/tests/auto/corelib/io/qprocess/testProcessEnvironment/testProcessEnvironment.pro
index 962c1122c1..a07ae00605 100644
--- a/tests/auto/corelib/io/qprocess/testProcessEnvironment/testProcessEnvironment.pro
+++ b/tests/auto/corelib/io/qprocess/testProcessEnvironment/testProcessEnvironment.pro
@@ -6,4 +6,3 @@ DESTDIR = ./
mac {
CONFIG -= app_bundle
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/testProcessNormal/testProcessNormal.pro b/tests/auto/corelib/io/qprocess/testProcessNormal/testProcessNormal.pro
index f7bb0985a3..c6db9d1bac 100644
--- a/tests/auto/corelib/io/qprocess/testProcessNormal/testProcessNormal.pro
+++ b/tests/auto/corelib/io/qprocess/testProcessNormal/testProcessNormal.pro
@@ -3,5 +3,4 @@ CONFIG += console
CONFIG -= qt app_bundle
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
QT = core
diff --git a/tests/auto/corelib/io/qprocess/testProcessOutput/testProcessOutput.pro b/tests/auto/corelib/io/qprocess/testProcessOutput/testProcessOutput.pro
index 2de4534896..95191098bd 100644
--- a/tests/auto/corelib/io/qprocess/testProcessOutput/testProcessOutput.pro
+++ b/tests/auto/corelib/io/qprocess/testProcessOutput/testProcessOutput.pro
@@ -2,5 +2,4 @@ SOURCES = main.cpp
CONFIG -= qt app_bundle
CONFIG += console
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
QT = core
diff --git a/tests/auto/corelib/io/qprocess/testSetWorkingDirectory/testSetWorkingDirectory.pro b/tests/auto/corelib/io/qprocess/testSetWorkingDirectory/testSetWorkingDirectory.pro
index d425d5569e..21a115b536 100644
--- a/tests/auto/corelib/io/qprocess/testSetWorkingDirectory/testSetWorkingDirectory.pro
+++ b/tests/auto/corelib/io/qprocess/testSetWorkingDirectory/testSetWorkingDirectory.pro
@@ -2,5 +2,4 @@ SOURCES = main.cpp
CONFIG += console
CONFIG -= app_bundle
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
QT = core
diff --git a/tests/auto/corelib/io/qprocess/testSoftExit/testSoftExit.pro b/tests/auto/corelib/io/qprocess/testSoftExit/testSoftExit.pro
index b59241851f..d19a631cae 100644
--- a/tests/auto/corelib/io/qprocess/testSoftExit/testSoftExit.pro
+++ b/tests/auto/corelib/io/qprocess/testSoftExit/testSoftExit.pro
@@ -9,5 +9,4 @@ unix {
CONFIG -= qt app_bundle
CONFIG += console
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
QT = core
diff --git a/tests/auto/corelib/io/qprocess/testSpaceInName/testSpaceInName.pro b/tests/auto/corelib/io/qprocess/testSpaceInName/testSpaceInName.pro
index b7213ae507..afa4f32a85 100644
--- a/tests/auto/corelib/io/qprocess/testSpaceInName/testSpaceInName.pro
+++ b/tests/auto/corelib/io/qprocess/testSpaceInName/testSpaceInName.pro
@@ -6,5 +6,4 @@ DESTDIR = "../test Space In Name"
mac {
CONFIG -= app_bundle
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
QT = core
diff --git a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp
index 712e3440d8..af0a1d5c37 100644
--- a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp
+++ b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp
@@ -138,7 +138,8 @@ private slots:
void spaceArgsTest();
#if defined(Q_OS_WIN)
void nativeArguments();
-#endif
+ void createProcessArgumentsModifier();
+#endif // Q_OS_WIN
void exitCodeTest();
void systemEnvironment();
void lockupsInStartDetached();
@@ -840,11 +841,11 @@ void tst_QProcess::openModes()
{
QProcess proc;
QVERIFY(!proc.isOpen());
- QVERIFY(proc.openMode() == QProcess::NotOpen);
+ QCOMPARE(proc.openMode(), QProcess::NotOpen);
proc.start("testProcessEcho3/testProcessEcho3");
QVERIFY(proc.waitForStarted(5000));
QVERIFY(proc.isOpen());
- QVERIFY(proc.openMode() == QProcess::ReadWrite);
+ QCOMPARE(proc.openMode(), QProcess::ReadWrite);
QVERIFY(proc.isReadable());
QVERIFY(proc.isWritable());
@@ -853,7 +854,7 @@ void tst_QProcess::openModes()
proc.closeWriteChannel();
QVERIFY(proc.isWritable());
- QVERIFY(proc.openMode() == QProcess::ReadWrite);
+ QCOMPARE(proc.openMode(), QProcess::ReadWrite);
while (proc.bytesAvailable() < 4 && proc.waitForReadyRead(5000))
{ }
@@ -862,12 +863,12 @@ void tst_QProcess::openModes()
proc.closeReadChannel(QProcess::StandardOutput);
- QVERIFY(proc.openMode() == QProcess::ReadWrite);
+ QCOMPARE(proc.openMode(), QProcess::ReadWrite);
QVERIFY(proc.isReadable());
proc.closeReadChannel(QProcess::StandardError);
- QVERIFY(proc.openMode() == QProcess::ReadWrite);
+ QCOMPARE(proc.openMode(), QProcess::ReadWrite);
QVERIFY(proc.isReadable());
proc.close();
@@ -1439,11 +1440,11 @@ void tst_QProcess::spaceArgsTest()
QCOMPARE(actual, args);
#endif
- if (program.contains(" "))
- program = "\"" + program + "\"";
+ if (program.contains(QLatin1Char(' ')))
+ program = QLatin1Char('"') + program + QLatin1Char('"');
if (!stringArgs.isEmpty())
- program += QString::fromLatin1(" ") + stringArgs;
+ program += QLatin1Char(' ') + stringArgs;
errorMessage.clear();
process.start(program);
@@ -1496,9 +1497,9 @@ void tst_QProcess::nativeArguments()
char buf[256];
fgets(buf, 256, file);
fclose(file);
- QStringList actual = QString::fromLatin1(buf).split("|");
+ QStringList actual = QString::fromLatin1(buf).split(QLatin1Char('|'));
#else
- QStringList actual = QString::fromLatin1(proc.readAll()).split("|");
+ QStringList actual = QString::fromLatin1(proc.readAll()).split(QLatin1Char('|'));
#endif
QVERIFY(!actual.isEmpty());
// not interested in the program name, it might be different.
@@ -1512,7 +1513,26 @@ void tst_QProcess::nativeArguments()
QCOMPARE(actual, expected);
}
-#endif
+void tst_QProcess::createProcessArgumentsModifier()
+{
+ int calls = 0;
+ const QString reversedCommand = "lamroNssecorPtset/lamroNssecorPtset";
+ QProcess process;
+ process.setCreateProcessArgumentsModifier([&calls] (QProcess::CreateProcessArguments *args)
+ {
+ calls++;
+ std::reverse(args->arguments, args->arguments + wcslen(args->arguments) - 1);
+ });
+ process.start(reversedCommand);
+ QVERIFY2(process.waitForStarted(), qUtf8Printable(process.errorString()));
+ QVERIFY(process.waitForFinished());
+ QCOMPARE(calls, 1);
+
+ process.setCreateProcessArgumentsModifier(QProcess::CreateProcessArgumentModifier());
+ QVERIFY(!process.waitForStarted());
+ QCOMPARE(calls, 1);
+}
+#endif // Q_OS_WIN
void tst_QProcess::exitCodeTest()
{
@@ -2300,6 +2320,13 @@ void tst_QProcess::setNonExistentWorkingDirectory()
QEXPECT_FAIL("", "QProcess cannot detect failure to start when using posix_spawn()", Continue);
#endif
QCOMPARE(int(process.error()), int(QProcess::FailedToStart));
+
+#ifdef Q_OS_UNIX
+# ifdef QPROCESS_USE_SPAWN
+ QEXPECT_FAIL("", "QProcess cannot detect failure to start when using posix_spawn()", Continue);
+# endif
+ QVERIFY2(process.errorString().startsWith("chdir:"), process.errorString().toLocal8Bit());
+#endif
}
#endif
diff --git a/tests/auto/corelib/io/qprocessenvironment/qprocessenvironment.pro b/tests/auto/corelib/io/qprocessenvironment/qprocessenvironment.pro
index 760fa11b9e..04cef29a64 100644
--- a/tests/auto/corelib/io/qprocessenvironment/qprocessenvironment.pro
+++ b/tests/auto/corelib/io/qprocessenvironment/qprocessenvironment.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qprocessenvironment
QT = core testlib
SOURCES = tst_qprocessenvironment.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocessenvironment/tst_qprocessenvironment.cpp b/tests/auto/corelib/io/qprocessenvironment/tst_qprocessenvironment.cpp
index 2099101a91..2bf2696639 100644
--- a/tests/auto/corelib/io/qprocessenvironment/tst_qprocessenvironment.cpp
+++ b/tests/auto/corelib/io/qprocessenvironment/tst_qprocessenvironment.cpp
@@ -57,25 +57,25 @@ private slots:
void tst_QProcessEnvironment::operator_eq()
{
QProcessEnvironment e1;
- QVERIFY(e1 == e1);
+ QCOMPARE(e1, e1);
e1.clear();
- QVERIFY(e1 == e1);
+ QCOMPARE(e1, e1);
e1 = QProcessEnvironment();
QProcessEnvironment e2;
- QVERIFY(e1 == e2);
+ QCOMPARE(e1, e2);
e1.clear();
- QVERIFY(e1 == e2);
+ QCOMPARE(e1, e2);
e2.clear();
- QVERIFY(e1 == e2);
+ QCOMPARE(e1, e2);
e1.insert("FOO", "bar");
QVERIFY(e1 != e2);
e2.insert("FOO", "bar");
- QVERIFY(e1 == e2);
+ QCOMPARE(e1, e2);
e2.insert("FOO", "baz");
QVERIFY(e1 != e2);
@@ -212,7 +212,7 @@ void tst_QProcessEnvironment::insertEnv()
e3.insert(e3); // mustn't deadlock
- QVERIFY(e3 == e2);
+ QCOMPARE(e3, e2);
}
void tst_QProcessEnvironment::caseSensitivity()
diff --git a/tests/auto/corelib/io/qresourceengine/qresourceengine.pro b/tests/auto/corelib/io/qresourceengine/qresourceengine.pro
index 64f5cb46e0..e8b82b4df7 100644
--- a/tests/auto/corelib/io/qresourceengine/qresourceengine.pro
+++ b/tests/auto/corelib/io/qresourceengine/qresourceengine.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qresourceengine
load(resources)
QT = core testlib
@@ -16,7 +16,6 @@ TESTDATA += \
parentdir.txt \
testqrc/*
GENERATED_TESTDATA = $${runtime_resource.target}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
android:!android-no-sdk {
RESOURCES += android_testdata.qrc
diff --git a/tests/auto/corelib/io/qsavefile/qsavefile.pro b/tests/auto/corelib/io/qsavefile/qsavefile.pro
index 36db000fa7..dd22d69ce6 100644
--- a/tests/auto/corelib/io/qsavefile/qsavefile.pro
+++ b/tests/auto/corelib/io/qsavefile/qsavefile.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qsavefile
QT = core testlib
SOURCES = tst_qsavefile.cpp
diff --git a/tests/auto/corelib/io/qsettings/tst_qsettings.cpp b/tests/auto/corelib/io/qsettings/tst_qsettings.cpp
index 19155cc3ad..602fad5a5f 100644
--- a/tests/auto/corelib/io/qsettings/tst_qsettings.cpp
+++ b/tests/auto/corelib/io/qsettings/tst_qsettings.cpp
@@ -121,6 +121,7 @@ private slots:
void testEmptyKey();
void testResourceFiles();
void testRegistryShortRootNames();
+ void testRegistry32And64Bit();
void trailingWhitespace();
#ifdef Q_OS_MAC
void fileName();
@@ -276,8 +277,8 @@ void tst_QSettings::initTestCase()
, Qt::CaseInsensitive
#endif
);
- QVERIFY(custom1 == QSettings::CustomFormat1);
- QVERIFY(custom2 == QSettings::CustomFormat2);
+ QCOMPARE(custom1, QSettings::CustomFormat1);
+ QCOMPARE(custom2, QSettings::CustomFormat2);
cleanupTestFiles();
}
@@ -357,30 +358,29 @@ void tst_QSettings::ctor()
QSettings settings8(format, QSettings::SystemScope, "software.org");
// test QSettings::format() while we're at it
- QVERIFY(settings1.format() == format);
- QVERIFY(settings2.format() == format);
- QVERIFY(settings3.format() == format);
- QVERIFY(settings4.format() == format);
+ QCOMPARE(settings1.format(), format);
+ QCOMPARE(settings2.format(), format);
+ QCOMPARE(settings3.format(), format);
+ QCOMPARE(settings4.format(), format);
// test QSettings::scope() while we're at it
- QVERIFY(settings1.scope() == QSettings::UserScope);
- QVERIFY(settings2.scope() == QSettings::UserScope);
- QVERIFY(settings3.scope() == QSettings::SystemScope);
- QVERIFY(settings4.scope() == QSettings::SystemScope);
+ QCOMPARE(settings1.scope(), QSettings::UserScope);
+ QCOMPARE(settings2.scope(), QSettings::UserScope);
+ QCOMPARE(settings3.scope(), QSettings::SystemScope);
+ QCOMPARE(settings4.scope(), QSettings::SystemScope);
// test QSettings::organizationName() while we're at it
- QVERIFY(settings1.organizationName() == "software.org");
- QVERIFY(settings2.organizationName() == "software.org");
- QVERIFY(settings3.organizationName() == "software.org");
- QVERIFY(settings4.organizationName() == "software.org");
+ QCOMPARE(settings1.organizationName(), QLatin1String("software.org"));
+ QCOMPARE(settings2.organizationName(), QLatin1String("software.org"));
+ QCOMPARE(settings3.organizationName(), QLatin1String("software.org"));
+ QCOMPARE(settings4.organizationName(), QLatin1String("software.org"));
// test QSettings::applicationName() while we're at it
QCOMPARE(settings1.applicationName(), QString("KillerAPP"));
QVERIFY(settings2.applicationName().isEmpty());
- QVERIFY(settings3.applicationName() == "KillerAPP");
+ QCOMPARE(settings3.applicationName(), QLatin1String("KillerAPP"));
QVERIFY(settings4.applicationName().isEmpty());
-#if !defined(Q_OS_BLACKBERRY)
/*
Go forwards.
*/
@@ -437,22 +437,6 @@ void tst_QSettings::ctor()
QCOMPARE(settings2.value("key 1").toString(), QString("bilboh"));
QCOMPARE(settings3.value("key 1").toString(), QString("catha"));
QCOMPARE(settings4.value("key 1").toString(), QString("quirko"));
-#else
- /*
- No fallback mechanism and a single scope on Blackberry OS
- */
- settings2.setValue("key 1", QString("whoa"));
- QCOMPARE(settings2.value("key 1").toString(), QString("whoa"));
- QCOMPARE(settings4.value("key 1").toString(), QString("whoa"));
- QVERIFY(!settings1.contains("key 1"));
- QVERIFY(!settings3.contains("key 1"));
-
- settings1.setValue("key 1", QString("blah"));
- QCOMPARE(settings1.value("key 1").toString(), QString("blah"));
- QCOMPARE(settings2.value("key 1").toString(), QString("whoa"));
- QCOMPARE(settings3.value("key 1").toString(), QString("blah"));
- QCOMPARE(settings4.value("key 1").toString(), QString("whoa"));
-#endif
/*
Test the copies again.
@@ -489,17 +473,10 @@ void tst_QSettings::ctor()
QSettings settings3(format, QSettings::SystemScope, "software.org", "KillerAPP");
QSettings settings4(format, QSettings::SystemScope, "software.org");
-#if !defined(Q_OS_BLACKBERRY)
QCOMPARE(settings1.value("key 1").toString(), QString("gurgle"));
QCOMPARE(settings2.value("key 1").toString(), QString("bilboh"));
QCOMPARE(settings3.value("key 1").toString(), QString("catha"));
QCOMPARE(settings4.value("key 1").toString(), QString("quirko"));
-#else
- QCOMPARE(settings1.value("key 1").toString(), QString("blah"));
- QCOMPARE(settings2.value("key 1").toString(), QString("whoa"));
- QCOMPARE(settings3.value("key 1").toString(), QString("blah"));
- QCOMPARE(settings4.value("key 1").toString(), QString("whoa"));
-#endif
/*
Test problem keys.
@@ -553,7 +530,7 @@ void tst_QSettings::ctor()
settings1.endGroup();
// test QSettings::scope() while we're at it
- QVERIFY(settings1.scope() == QSettings::UserScope);
+ QCOMPARE(settings1.scope(), QSettings::UserScope);
// test QSettings::organizationName() while we're at it
QVERIFY(settings1.organizationName().isEmpty());
@@ -628,20 +605,20 @@ void tst_QSettings::ctor()
QCOMPARE(settings2.status(), QSettings::NoError);
// test QSettings::format() while we're at it
- QVERIFY(settings.format() == format);
- QVERIFY(settings2.format() == format);
+ QCOMPARE(settings.format(), format);
+ QCOMPARE(settings2.format(), format);
// test QSettings::scope() while we're at it
- QVERIFY(settings.scope() == QSettings::UserScope);
- QVERIFY(settings2.scope() == QSettings::UserScope);
+ QCOMPARE(settings.scope(), QSettings::UserScope);
+ QCOMPARE(settings2.scope(), QSettings::UserScope);
// test QSettings::organizationName() while we're at it
QVERIFY(settings.organizationName().isEmpty());
- QVERIFY(settings2.organizationName() == "software.org");
+ QCOMPARE(settings2.organizationName(), QLatin1String("software.org"));
// test QSettings::applicationName() while we're at it
QVERIFY(settings.applicationName().isEmpty());
- QVERIFY(settings2.applicationName() == "KillerAPP");
+ QCOMPARE(settings2.applicationName(), QLatin1String("KillerAPP"));
}
}
@@ -1187,16 +1164,16 @@ void tst_QSettings::remove()
{
QSettings settings0(QSettings::UserScope, "software.org", "KillerAPP");
int initialNumKeys = settings0.allKeys().size();
- QCOMPARE(settings0.value("key 1", "123").toString(), QString("123"));
+ QCOMPARE(settings0.value("key 1", "123").toString(), QLatin1String("123"));
settings0.remove("key 1");
- QCOMPARE(settings0.value("key 1", "456").toString(), QString("456"));
+ QCOMPARE(settings0.value("key 1", "456").toString(), QLatin1String("456"));
settings0.setValue("key 1", "bubloo");
- QCOMPARE(settings0.value("key 1").toString(), QString("bubloo"));
+ QCOMPARE(settings0.value("key 1").toString(), QLatin1String("bubloo"));
settings0.remove("key 2");
- QCOMPARE(settings0.value("key 1").toString(), QString("bubloo"));
+ QCOMPARE(settings0.value("key 1").toString(), QLatin1String("bubloo"));
settings0.remove("key 1");
- QCOMPARE(settings0.value("key 1", "789").toString(), QString("789"));
+ QCOMPARE(settings0.value("key 1", "789").toString(), QLatin1String("789"));
/*
Make sure that removing a key removes all the subkeys.
@@ -1324,7 +1301,6 @@ void tst_QSettings::remove()
QCOMPARE(settings1.value("key 1").toString(), QString("gurgle"));
QCOMPARE(settings2.value("key 1").toString(), QString("whoa"));
-#if !defined(Q_OS_BLACKBERRY)
if (m_canWriteNativeSystemSettings) {
QCOMPARE(settings3->value("key 1").toString(), QString("blah"));
QCOMPARE(settings4->value("key 1").toString(), QString("doodah"));
@@ -1357,14 +1333,6 @@ void tst_QSettings::remove()
QVERIFY(!settings3->contains("key 1"));
QVERIFY(!settings4->contains("key 1"));
}
-#else
- settings1.remove("key 1");
- QCOMPARE(settings2.value("key 1").toString(), QString("whoa"));
-
- settings2.remove("key 1");
- QVERIFY(!settings1.contains("key 1"));
- QVERIFY(!settings2.contains("key 1"));
-#endif
/*
Get ready for the next part of the test.
@@ -1502,7 +1470,7 @@ void tst_QSettings::contains()
}
settings1.endGroup();
- QVERIFY(settings1.group() == "alpha");
+ QCOMPARE(settings1.group(), QLatin1String("alpha"));
keys = settings1.allKeys();
QCOMPARE(keys.size(), expectedResult.size() + 3);
for (i = 0; i < keys.size(); ++i) {
@@ -1667,7 +1635,6 @@ void tst_QSettings::setFallbacksEnabled()
main associated file when fallbacks are turned off.
*/
-#if !defined(Q_OS_BLACKBERRY)
QCOMPARE(settings1.value("key 1").toString(), QString("alpha"));
QCOMPARE(settings2.value("key 1").toString(), QString("beta"));
QCOMPARE(settings3.value("key 1").toString(), QString("gamma"));
@@ -1697,22 +1664,6 @@ void tst_QSettings::setFallbacksEnabled()
QCOMPARE(settings1.value("key 5").toString(), QString(""));
QVERIFY(settings1.contains("key 1"));
QVERIFY(!settings1.contains("key 5"));
-#else
- QCOMPARE(settings1.value("key 1").toString(), QString("gamma"));
- QCOMPARE(settings2.value("key 1").toString(), QString("delta"));
- QCOMPARE(settings3.value("key 1").toString(), QString("gamma"));
- QCOMPARE(settings4.value("key 1").toString(), QString("delta"));
-
- QCOMPARE(settings1.value("key 2").toString(), QString("gamma"));
- QCOMPARE(settings2.value("key 2").toString(), QString("beta"));
- QCOMPARE(settings3.value("key 2").toString(), QString("gamma"));
- QCOMPARE(settings4.value("key 2").toString(), QString("beta"));
-
- QCOMPARE(settings1.value("key 3").toString(), QString("gamma"));
- QCOMPARE(settings2.value("key 3").toString(), QString("delta"));
- QCOMPARE(settings3.value("key 3").toString(), QString("gamma"));
- QCOMPARE(settings4.value("key 3").toString(), QString("delta"));
-#endif
}
void tst_QSettings::testChildKeysAndGroups_data()
@@ -1794,26 +1745,26 @@ void tst_QSettings::testUpdateRequestEvent()
QSettings settings1("foo", QSettings::IniFormat);
QVERIFY(!QFile::exists("foo"));
- QVERIFY(QFileInfo("foo").size() == 0);
+ QCOMPARE(QFileInfo("foo").size(), qint64(0));
settings1.setValue("key1", 1);
- QVERIFY(QFileInfo("foo").size() == 0);
+ QCOMPARE(QFileInfo("foo").size(), qint64(0));
QTRY_VERIFY(QFileInfo("foo").size() > 0);
settings1.remove("key1");
QVERIFY(QFileInfo("foo").size() > 0);
- QTRY_VERIFY(QFileInfo("foo").size() == 0);
+ QTRY_COMPARE(QFileInfo("foo").size(), qint64(0));
settings1.setValue("key2", 2);
- QVERIFY(QFileInfo("foo").size() == 0);
+ QCOMPARE(QFileInfo("foo").size(), qint64(0));
QTRY_VERIFY(QFileInfo("foo").size() > 0);
settings1.clear();
QVERIFY(QFileInfo("foo").size() > 0);
- QTRY_VERIFY(QFileInfo("foo").size() == 0);
+ QTRY_COMPARE(QFileInfo("foo").size(), qint64(0));
#ifdef Q_OS_WINRT
QDir::setCurrent(oldCur);
@@ -1960,7 +1911,7 @@ void tst_QSettings::testEmptyData()
settings.setValue("vList", vList);
settings.setValue("vList2", vList2);
settings.setValue("vList3", vList3);
- QVERIFY(settings.status() == QSettings::NoError);
+ QCOMPARE(settings.status(), QSettings::NoError);
}
{
QSettings settings(filename, QSettings::IniFormat);
@@ -1973,7 +1924,7 @@ void tst_QSettings::testEmptyData()
QCOMPARE(settings.value("vList").toList(), vList);
QCOMPARE(settings.value("vList2").toList(), vList2);
QCOMPARE(settings.value("vList3").toList(), vList3);
- QVERIFY(settings.status() == QSettings::NoError);
+ QCOMPARE(settings.status(), QSettings::NoError);
}
{
@@ -1987,7 +1938,7 @@ void tst_QSettings::testEmptyData()
settings.setValue("vList", vList);
settings.setValue("vList2", vList2);
settings.setValue("vList3", vList3);
- QVERIFY(settings.status() == QSettings::NoError);
+ QCOMPARE(settings.status(), QSettings::NoError);
}
{
QSettings settings("QtProject", "tst_qsettings");
@@ -2000,7 +1951,7 @@ void tst_QSettings::testEmptyData()
QCOMPARE(settings.value("vList").toList(), vList);
QCOMPARE(settings.value("vList2").toList(), vList2);
QCOMPARE(settings.value("vList3").toList(), vList3);
- QVERIFY(settings.status() == QSettings::NoError);
+ QCOMPARE(settings.status(), QSettings::NoError);
}
QFile::remove(filename);
}
@@ -2018,17 +1969,17 @@ void tst_QSettings::testEmptyKey()
void tst_QSettings::testResourceFiles()
{
QSettings settings(":/resourcefile.ini", QSettings::IniFormat);
- QVERIFY(settings.status() == QSettings::NoError);
+ QCOMPARE(settings.status(), QSettings::NoError);
QVERIFY(!settings.isWritable());
QCOMPARE(settings.value("Field 1/Bottom").toInt(), 89);
settings.setValue("Field 1/Bottom", 90);
// the next two lines check the statu quo; another behavior would be possible
- QVERIFY(settings.status() == QSettings::NoError);
+ QCOMPARE(settings.status(), QSettings::NoError);
QCOMPARE(settings.value("Field 1/Bottom").toInt(), 90);
settings.sync();
- QVERIFY(settings.status() == QSettings::AccessError);
+ QCOMPARE(settings.status(), QSettings::AccessError);
QCOMPARE(settings.value("Field 1/Bottom").toInt(), 90);
}
@@ -2044,6 +1995,52 @@ void tst_QSettings::testRegistryShortRootNames()
#endif
}
+void tst_QSettings::testRegistry32And64Bit()
+{
+#if !defined (Q_OS_WIN) || defined(Q_OS_WINRT)
+ QSKIP("This test is specific to the Windows registry.", SkipAll);
+#else
+
+ const QString key("HKEY_LOCAL_MACHINE\\Software");
+ const QString keyWow("HKEY_LOCAL_MACHINE\\Software\\Wow6432Node");
+
+#ifndef Q_OS_WIN64
+ // This branch is taken at compile time if targeting 32-bit; it does not
+ // necessarily mean that the OS running the test is 32-bit (it could be
+ // e.g. 64-bit).
+ QCOMPARE(QSettings(key, QSettings::NativeFormat).childGroups(),
+ QSettings(key, QSettings::Registry32Format).childGroups());
+
+ // Detect whether we are running under 64-bit Windows.
+ typedef BOOL (WINAPI *IsWow64ProcessPtr)(HANDLE hProcess, PBOOL Wow64Process);
+ IsWow64ProcessPtr IsWow64Process = (IsWow64ProcessPtr)QLibrary::resolve(
+ "kernel32.dll", "IsWow64Process");
+
+ if (IsWow64Process) {
+ BOOL IsWow64 = FALSE;
+ if (IsWow64Process(GetCurrentProcess(), &IsWow64) && IsWow64) {
+ // The 64-bit registry's "Wow6432Node" key should match the 32-bit registry.
+ // If we are not on 32-bit Windows, these should never be the same,
+ // because the 64-bit registry has a "Wow6432Node" key.
+ QCOMPARE(QSettings(keyWow, QSettings::Registry64Format).childGroups(),
+ QSettings(key, QSettings::Registry32Format).childGroups());
+ }
+ }
+#else
+ // This branch is taken at compile time if targeting 64-bit; it does not
+ // necessarily mean that the OS running the test is 64-bit (it could be
+ // e.g. 128-bit).
+ QCOMPARE(QSettings(key, QSettings::NativeFormat).childGroups(),
+ QSettings(key, QSettings::Registry64Format).childGroups());
+
+ // The 64-bit registry's "Wow6432Node" key should match the 32-bit registry.
+ QCOMPARE(QSettings(keyWow, QSettings::Registry64Format).childGroups(),
+ QSettings(key, QSettings::Registry32Format).childGroups());
+#endif
+
+#endif
+}
+
void tst_QSettings::trailingWhitespace()
{
{
@@ -2469,7 +2466,6 @@ void tst_QSettings::testArrays()
}
settings2.endArray();
-#if !defined (Q_OS_BLACKBERRY)
size1 = settings1.beginReadArray("strings");
QCOMPARE(size1, 3);
@@ -2480,7 +2476,6 @@ void tst_QSettings::testArrays()
QCOMPARE(str, fiveStrings.at(i));
}
settings1.endArray();
-#endif
}
#ifdef QT_BUILD_INTERNAL
@@ -2539,7 +2534,7 @@ QString escapeWeirdChars(const QString &s)
QChar c = s.at(i);
if (c.unicode() < ' ' || c.unicode() > '~'
|| (escapeNextDigit && c.unicode() >= '0' && c.unicode() <= 'f')) {
- result += QString("\\x%1").arg(c.unicode(), 0, 16);
+ result += QLatin1String("\\x") + QString::number(c.unicode(), 16);
escapeNextDigit = true;
} else {
result += c;
@@ -3133,7 +3128,7 @@ void tst_QSettings::registerFormat()
// so we can test error handling
QSettings::Format custom3 = QSettings::registerFormat("custom3", readCustom3File, writeCustom3File);
- QVERIFY(custom3 == QSettings::CustomFormat3);
+ QCOMPARE(custom3, QSettings::CustomFormat3);
QDir dir(settingsPath());
QVERIFY(dir.mkpath("someDir"));
@@ -3203,7 +3198,6 @@ void tst_QSettings::setPath()
path checks that it has no bad side effects.
*/
for (int i = 0; i < 2; ++i) {
-#if !defined(Q_OS_BLACKBERRY)
#if !defined(Q_OS_WIN) && !defined(Q_OS_MAC)
TEST_PATH(i == 0, "conf", NativeFormat, UserScope, "alpha")
TEST_PATH(i == 0, "conf", NativeFormat, SystemScope, "beta")
@@ -3214,34 +3208,28 @@ void tst_QSettings::setPath()
TEST_PATH(i == 0, "custom1", CustomFormat1, SystemScope, "zeta")
TEST_PATH(i == 0, "custom2", CustomFormat2, UserScope, "eta")
TEST_PATH(i == 0, "custom2", CustomFormat2, SystemScope, "iota")
-#else // Q_OS_BLACKBERRY: no system scope
- TEST_PATH(i == 0, "conf", NativeFormat, UserScope, "alpha")
- TEST_PATH(i == 0, "ini", IniFormat, UserScope, "gamma")
- TEST_PATH(i == 0, "custom1", CustomFormat1, UserScope, "epsilon")
- TEST_PATH(i == 0, "custom2", CustomFormat2, UserScope, "eta")
-#endif
}
}
void tst_QSettings::setDefaultFormat()
{
- QVERIFY(QSettings::defaultFormat() == QSettings::NativeFormat);
+ QCOMPARE(QSettings::defaultFormat(), QSettings::NativeFormat);
QSettings::setDefaultFormat(QSettings::CustomFormat1);
QSettings settings1("org", "app");
QSettings settings2(QSettings::SystemScope, "org", "app");
QSettings settings3;
- QVERIFY(settings1.format() == QSettings::NativeFormat);
- QVERIFY(settings2.format() == QSettings::NativeFormat);
- QVERIFY(settings3.format() == QSettings::CustomFormat1);
+ QCOMPARE(settings1.format(), QSettings::NativeFormat);
+ QCOMPARE(settings2.format(), QSettings::NativeFormat);
+ QCOMPARE(settings3.format(), QSettings::CustomFormat1);
QSettings::setDefaultFormat(QSettings::NativeFormat);
- QVERIFY(QSettings::defaultFormat() == QSettings::NativeFormat);
+ QCOMPARE(QSettings::defaultFormat(), QSettings::NativeFormat);
- QVERIFY(settings1.format() == QSettings::NativeFormat);
- QVERIFY(settings2.format() == QSettings::NativeFormat);
- QVERIFY(settings3.format() == QSettings::CustomFormat1);
+ QCOMPARE(settings1.format(), QSettings::NativeFormat);
+ QCOMPARE(settings2.format(), QSettings::NativeFormat);
+ QCOMPARE(settings3.format(), QSettings::CustomFormat1);
}
void tst_QSettings::dontCreateNeedlessPaths()
@@ -3302,7 +3290,7 @@ void tst_QSettings::dontReorderIniKeysNeedlessly()
outFile.close();
QSettings settings(outFileName, QSettings::IniFormat);
- QVERIFY(settings.status() == QSettings::NoError);
+ QCOMPARE(settings.status(), QSettings::NoError);
QVERIFY(settings.isWritable());
settings.setValue("Field 1/Bottom", 90);
diff --git a/tests/auto/corelib/io/qstandardpaths/qstandardpaths.pro b/tests/auto/corelib/io/qstandardpaths/qstandardpaths.pro
index 9fb6f9b31f..c72d9e4fad 100644
--- a/tests/auto/corelib/io/qstandardpaths/qstandardpaths.pro
+++ b/tests/auto/corelib/io/qstandardpaths/qstandardpaths.pro
@@ -3,4 +3,3 @@ TARGET = tst_qstandardpaths
QT = core testlib
SOURCES = tst_qstandardpaths.cpp
TESTDATA += tst_qstandardpaths.cpp qstandardpaths.pro
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp b/tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp
index 24ff2f237f..8a7ca8429f 100644
--- a/tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp
+++ b/tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp
@@ -44,7 +44,7 @@
#include <sys/types.h>
#endif
-#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_BLACKBERRY) && !defined(Q_OS_ANDROID)
+#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_ANDROID)
#define Q_XDG_PLATFORM
#endif
@@ -296,9 +296,9 @@ void tst_qstandardpaths::testDataLocation()
{
// On all platforms, DataLocation should be GenericDataLocation / organization name / app name
// This allows one app to access the data of another app.
- // Blackberry OS, Android and WinRT are an exception to this case, owing to the fact that
+ // Android and WinRT are an exception to this case, owing to the fact that
// applications are sandboxed.
-#if !defined(Q_OS_BLACKBERRY) && !defined(Q_OS_ANDROID) && !defined(Q_OS_WINRT)
+#if !defined(Q_OS_ANDROID) && !defined(Q_OS_WINRT)
const QString base = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
QCOMPARE(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation), base + "/tst_qstandardpaths");
QCoreApplication::instance()->setOrganizationName("Qt");
@@ -327,7 +327,7 @@ void tst_qstandardpaths::testAppConfigLocation()
{
// On all platforms where applications are not sandboxed,
// AppConfigLocation should be GenericConfigLocation / organization name / app name
-#if !defined(Q_OS_BLACKBERRY) && !defined(Q_OS_ANDROID) && !defined(Q_OS_WINRT)
+#if !defined(Q_OS_ANDROID) && !defined(Q_OS_WINRT)
const QString base = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation);
QCOMPARE(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation), base + "/tst_qstandardpaths");
QCoreApplication::setOrganizationName("Qt");
diff --git a/tests/auto/corelib/io/qstorageinfo/tst_qstorageinfo.cpp b/tests/auto/corelib/io/qstorageinfo/tst_qstorageinfo.cpp
index efbcdc78e0..aaaa0d4949 100644
--- a/tests/auto/corelib/io/qstorageinfo/tst_qstorageinfo.cpp
+++ b/tests/auto/corelib/io/qstorageinfo/tst_qstorageinfo.cpp
@@ -61,9 +61,9 @@ void tst_QStorageInfo::defaultValues()
QVERIFY(!storage.isRoot());
QVERIFY(storage.device().isEmpty());
QVERIFY(storage.fileSystemType().isEmpty());
- QVERIFY(storage.bytesTotal() == -1);
- QVERIFY(storage.bytesFree() == -1);
- QVERIFY(storage.bytesAvailable() == -1);
+ QCOMPARE(storage.bytesTotal(), -1);
+ QCOMPARE(storage.bytesFree(), -1);
+ QCOMPARE(storage.bytesAvailable(), -1);
}
void tst_QStorageInfo::operatorEqual()
@@ -71,19 +71,19 @@ void tst_QStorageInfo::operatorEqual()
{
QStorageInfo storage1 = QStorageInfo::root();
QStorageInfo storage2(QDir::rootPath());
- QVERIFY(storage1 == storage2);
+ QCOMPARE(storage1, storage2);
}
{
QStorageInfo storage1(QCoreApplication::applicationDirPath());
QStorageInfo storage2(QCoreApplication::applicationFilePath());
- QVERIFY(storage1 == storage2);
+ QCOMPARE(storage1, storage2);
}
{
QStorageInfo storage1;
QStorageInfo storage2;
- QVERIFY(storage1 == storage2);
+ QCOMPARE(storage1, storage2);
}
}
@@ -184,15 +184,15 @@ void tst_QStorageInfo::caching()
qint64 free = storage1.bytesFree();
QStorageInfo storage2(storage1);
- QVERIFY(free == storage2.bytesFree());
+ QCOMPARE(free, storage2.bytesFree());
file.write(QByteArray(1024*1024, '\0'));
file.flush();
- QVERIFY(free == storage1.bytesFree());
- QVERIFY(free == storage2.bytesFree());
+ QCOMPARE(free, storage1.bytesFree());
+ QCOMPARE(free, storage2.bytesFree());
storage2.refresh();
- QVERIFY(storage1 == storage2);
+ QCOMPARE(storage1, storage2);
QVERIFY(free != storage2.bytesFree());
}
#endif
diff --git a/tests/auto/corelib/io/qtemporarydir/qtemporarydir.pro b/tests/auto/corelib/io/qtemporarydir/qtemporarydir.pro
index 0908878514..4a69971f78 100644
--- a/tests/auto/corelib/io/qtemporarydir/qtemporarydir.pro
+++ b/tests/auto/corelib/io/qtemporarydir/qtemporarydir.pro
@@ -3,4 +3,3 @@ TARGET = tst_qtemporarydir
SOURCES += tst_qtemporarydir.cpp
QT = core testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qtemporaryfile/qtemporaryfile.pro b/tests/auto/corelib/io/qtemporaryfile/qtemporaryfile.pro
index c16a729ad0..8f250e4568 100644
--- a/tests/auto/corelib/io/qtemporaryfile/qtemporaryfile.pro
+++ b/tests/auto/corelib/io/qtemporaryfile/qtemporaryfile.pro
@@ -1,10 +1,8 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtemporaryfile
QT = core testlib
SOURCES = tst_qtemporaryfile.cpp
TESTDATA += tst_qtemporaryfile.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
RESOURCES += qtemporaryfile.qrc
android:!android-no-sdk {
diff --git a/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp b/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp
index 94e6bbaade..1a586af569 100644
--- a/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp
+++ b/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp
@@ -697,7 +697,7 @@ void tst_QTemporaryFile::createNativeFile()
f.seek(currentPos);
}
QTemporaryFile *tempFile = QTemporaryFile::createNativeFile(f);
- QVERIFY(valid == (bool)tempFile);
+ QCOMPARE(valid, (bool)tempFile);
if (currentPos != -1)
QCOMPARE(currentPos, f.pos());
if (valid) {
diff --git a/tests/auto/corelib/io/qtextstream/readAllStdinProcess/readAllStdinProcess.pro b/tests/auto/corelib/io/qtextstream/readAllStdinProcess/readAllStdinProcess.pro
index 578fa86f5c..4a4c091dcb 100644
--- a/tests/auto/corelib/io/qtextstream/readAllStdinProcess/readAllStdinProcess.pro
+++ b/tests/auto/corelib/io/qtextstream/readAllStdinProcess/readAllStdinProcess.pro
@@ -7,4 +7,3 @@ DESTDIR = ./
# This app is testdata for tst_qtextstream
target.path = $$[QT_INSTALL_TESTS]/tst_qtextstream/$$TARGET
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qtextstream/readLineStdinProcess/readLineStdinProcess.pro b/tests/auto/corelib/io/qtextstream/readLineStdinProcess/readLineStdinProcess.pro
index 578fa86f5c..4a4c091dcb 100644
--- a/tests/auto/corelib/io/qtextstream/readLineStdinProcess/readLineStdinProcess.pro
+++ b/tests/auto/corelib/io/qtextstream/readLineStdinProcess/readLineStdinProcess.pro
@@ -7,4 +7,3 @@ DESTDIR = ./
# This app is testdata for tst_qtextstream
target.path = $$[QT_INSTALL_TESTS]/tst_qtextstream/$$TARGET
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qtextstream/stdinProcess/stdinProcess.pro b/tests/auto/corelib/io/qtextstream/stdinProcess/stdinProcess.pro
index 578fa86f5c..4a4c091dcb 100644
--- a/tests/auto/corelib/io/qtextstream/stdinProcess/stdinProcess.pro
+++ b/tests/auto/corelib/io/qtextstream/stdinProcess/stdinProcess.pro
@@ -7,4 +7,3 @@ DESTDIR = ./
# This app is testdata for tst_qtextstream
target.path = $$[QT_INSTALL_TESTS]/tst_qtextstream/$$TARGET
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qtextstream/test/test.pro b/tests/auto/corelib/io/qtextstream/test/test.pro
index 39d181344f..93fb6d232f 100644
--- a/tests/auto/corelib/io/qtextstream/test/test.pro
+++ b/tests/auto/corelib/io/qtextstream/test/test.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = ../tst_qtextstream
QT = core network testlib
SOURCES = ../tst_qtextstream.cpp
@@ -20,4 +19,3 @@ TESTDATA += \
../qtextstream.qrc \
../tst_qtextstream.cpp \
../resources
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp b/tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp
index 3ab53848d8..7ebccbc252 100644
--- a/tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp
+++ b/tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp
@@ -1617,18 +1617,18 @@ void tst_QTextStream::forcePoint()
{
QString str;
QTextStream stream(&str);
- stream << fixed << forcepoint << 1.0 << " " << 1 << " " << 0 << " " << -1.0 << " " << -1;
+ stream << fixed << forcepoint << 1.0 << ' ' << 1 << ' ' << 0 << ' ' << -1.0 << ' ' << -1;
QCOMPARE(str, QString("1.000000 1 0 -1.000000 -1"));
str.clear();
stream.seek(0);
- stream << scientific << forcepoint << 1.0 << " " << 1 << " " << 0 << " " << -1.0 << " " << -1;
+ stream << scientific << forcepoint << 1.0 << ' ' << 1 << ' ' << 0 << ' ' << -1.0 << ' ' << -1;
QCOMPARE(str, QString("1.000000e+00 1 0 -1.000000e+00 -1"));
str.clear();
stream.seek(0);
stream.setRealNumberNotation(QTextStream::SmartNotation);
- stream << forcepoint << 1.0 << " " << 1 << " " << 0 << " " << -1.0 << " " << -1;
+ stream << forcepoint << 1.0 << ' ' << 1 << ' ' << 0 << ' ' << -1.0 << ' ' << -1;
QCOMPARE(str, QString("1.00000 1 0 -1.00000 -1"));
}
@@ -1638,7 +1638,7 @@ void tst_QTextStream::forceSign()
{
QString str;
QTextStream stream(&str);
- stream << forcesign << 1.2 << " " << -1.2 << " " << 0;
+ stream << forcesign << 1.2 << ' ' << -1.2 << ' ' << 0;
QCOMPARE(str, QString("+1.2 -1.2 +0"));
}
@@ -1775,9 +1775,9 @@ void tst_QTextStream::nanInf()
QString s;
QTextStream out(&s);
- out << qInf() << " " << -qInf() << " " << qQNaN()
- << uppercasedigits << " "
- << qInf() << " " << -qInf() << " " << qQNaN()
+ out << qInf() << ' ' << -qInf() << ' ' << qQNaN()
+ << uppercasedigits << ' '
+ << qInf() << ' ' << -qInf() << ' ' << qQNaN()
<< flush;
QCOMPARE(s, QString("inf -inf nan INF -INF NAN"));
@@ -2583,7 +2583,7 @@ void tst_QTextStream::useCase1()
stream.setCodec(QTextCodec::codecForName("ISO-8859-1"));
stream.setAutoDetectUnicode(true);
- stream << 4.15 << " " << QByteArray("abc") << " " << QString("ole");
+ stream << 4.15 << ' ' << QByteArray("abc") << ' ' << QString("ole");
}
file.seek(0);
@@ -2619,7 +2619,7 @@ void tst_QTextStream::useCase2()
stream.setCodec(QTextCodec::codecForName("ISO-8859-1"));
stream.setAutoDetectUnicode(true);
- stream << 4.15 << " " << QByteArray("abc") << " " << QString("ole");
+ stream << 4.15 << ' ' << QByteArray("abc") << ' ' << QString("ole");
file.close();
QVERIFY(file.open(QFile::ReadWrite));
diff --git a/tests/auto/corelib/io/qurl/qurl.pro b/tests/auto/corelib/io/qurl/qurl.pro
index f65a9c688c..c046c75522 100644
--- a/tests/auto/corelib/io/qurl/qurl.pro
+++ b/tests/auto/corelib/io/qurl/qurl.pro
@@ -1,7 +1,6 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qurl
QT = core testlib concurrent
SOURCES = tst_qurl.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
mac: OBJECTIVE_SOURCES += tst_qurl_mac.mm
diff --git a/tests/auto/corelib/io/qurl/tst_qurl.cpp b/tests/auto/corelib/io/qurl/tst_qurl.cpp
index 7579c6713d..97dfac3062 100644
--- a/tests/auto/corelib/io/qurl/tst_qurl.cpp
+++ b/tests/auto/corelib/io/qurl/tst_qurl.cpp
@@ -226,7 +226,7 @@ void tst_QUrl::constructing()
QVERIFY(url.isEmpty());
QCOMPARE(url.port(), -1);
QCOMPARE(url.toString(), QString());
- QVERIFY(url == url);
+ QCOMPARE(url, url);
QVERIFY(!(url < url));
QUrl fromLocal = QUrl::fromLocalFile(QString());
@@ -254,7 +254,7 @@ void tst_QUrl::hashInPath()
QCOMPARE(withHashInPath.toDisplayString(QUrl::PreferLocalFile), QString("hi%23mum.txt"));
QUrl fromHashInPath = QUrl::fromEncoded(withHashInPath.toEncoded());
- QVERIFY(withHashInPath == fromHashInPath);
+ QCOMPARE(withHashInPath, fromHashInPath);
const QUrl localWithHash = QUrl::fromLocalFile("/hi#mum.txt");
QCOMPARE(localWithHash.path(), QString::fromLatin1("/hi#mum.txt"));
@@ -284,7 +284,7 @@ void tst_QUrl::assignment()
QUrl copy;
copy = url;
- QVERIFY(url == copy);
+ QCOMPARE(url, copy);
}
void tst_QUrl::comparison()
@@ -295,7 +295,7 @@ void tst_QUrl::comparison()
QUrl url2("http://qt-project.org/");
QVERIFY(url2.isValid());
- QVERIFY(url1 == url2);
+ QCOMPARE(url1, url2);
QVERIFY(!(url1 < url2));
QVERIFY(!(url2 < url1));
QVERIFY(url1.matches(url2, QUrl::None));
@@ -329,7 +329,7 @@ void tst_QUrl::comparison()
url5.setEncodedQuery("a=%2a");
QUrl url6;
url6.setEncodedQuery("a=%2A");
- QVERIFY(url5 == url6);
+ QCOMPARE(url5, url6);
QUrl url7;
url7.setEncodedQuery("a=C");
@@ -366,7 +366,7 @@ void tst_QUrl::comparison()
QUrl hostUrl1("file:/foo");
QUrl hostUrl2("file:///foo");
- QVERIFY(hostUrl1 == hostUrl2);
+ QCOMPARE(hostUrl1, hostUrl2);
QVERIFY(hostUrl1.matches(hostUrl2, QUrl::None));
QVERIFY(hostUrl1.matches(hostUrl2, QUrl::RemoveAuthority));
@@ -460,7 +460,7 @@ void tst_QUrl::copying()
QUrl copy(url);
- QVERIFY(url == copy);
+ QCOMPARE(url, copy);
}
void tst_QUrl::setUrl()
@@ -1635,9 +1635,9 @@ void tst_QUrl::percentEncoding()
QFETCH(QByteArray, encoded);
QCOMPARE(QUrl(original).toEncoded().constData(), encoded.constData());
- QVERIFY(QUrl::fromEncoded(QUrl(original).toEncoded()) == QUrl(original));
+ QCOMPARE(QUrl::fromEncoded(QUrl(original).toEncoded()), QUrl(original));
QCOMPARE(QUrl::fromEncoded(QUrl(original).toEncoded()).toString(), original);
- QVERIFY(QUrl::fromEncoded(encoded) == QUrl(original));
+ QCOMPARE(QUrl::fromEncoded(encoded), QUrl(original));
QCOMPARE(QUrl(QUrl(original).toString()).toString(), original);
}
@@ -2872,7 +2872,8 @@ void tst_QUrl::fromUserInput_data()
int c = 0;
while (it.hasNext()) {
it.next();
- QTest::newRow(QString("file-%1").arg(c++).toLatin1()) << it.filePath() << QUrl::fromLocalFile(it.filePath());
+ QTest::newRow(("file-" + QByteArray::number(c++)).constData())
+ << it.filePath() << QUrl::fromLocalFile(it.filePath());
}
// basic latin1
@@ -2960,7 +2961,8 @@ void tst_QUrl::fromUserInputWithCwd_data()
while (it.hasNext()) {
it.next();
QUrl url = QUrl::fromLocalFile(it.filePath());
- QTest::newRow(QString("file-%1").arg(c++).toLatin1()) << it.fileName() << QDir::currentPath() << url << url;
+ QTest::newRow(("file-" + QByteArray::number(c++)).constData())
+ << it.fileName() << QDir::currentPath() << url << url;
}
QDir parent = QDir::current();
QVERIFY(parent.cdUp());
@@ -3167,7 +3169,7 @@ void tst_QUrl::acceptEmptyAuthoritySegments()
// However, file:/bar is the same as file:///bar
QString file_triple_bar("file:///bar"), file_uni_bar("file:/bar");
- QVERIFY(QUrl(file_triple_bar) == QUrl(file_uni_bar));
+ QCOMPARE(QUrl(file_triple_bar), QUrl(file_uni_bar));
QCOMPARE(QUrl(file_uni_bar).toString(), file_triple_bar);
QCOMPARE(QUrl(file_uni_bar, QUrl::StrictMode).toString(), file_triple_bar);
diff --git a/tests/auto/corelib/io/qurlinternal/qurlinternal.pro b/tests/auto/corelib/io/qurlinternal/qurlinternal.pro
index c62cd045f3..ae5e023446 100644
--- a/tests/auto/corelib/io/qurlinternal/qurlinternal.pro
+++ b/tests/auto/corelib/io/qurlinternal/qurlinternal.pro
@@ -3,5 +3,3 @@ requires(contains(QT_CONFIG,private_tests))
TARGET = tst_qurlinternal
SOURCES += tst_qurlinternal.cpp ../../codecs/utf8/utf8data.cpp
QT = core core-private testlib
-CONFIG += parallel_test
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qurlquery/qurlquery.pro b/tests/auto/corelib/io/qurlquery/qurlquery.pro
index 3284903d5b..68129f356f 100644
--- a/tests/auto/corelib/io/qurlquery/qurlquery.pro
+++ b/tests/auto/corelib/io/qurlquery/qurlquery.pro
@@ -1,6 +1,5 @@
QT = core core-private testlib
TARGET = tst_qurlquery
-CONFIG += parallel_test testcase
+CONFIG += testcase
SOURCES += tst_qurlquery.cpp
DEFINES += SRCDIR=\\\"$$PWD/\\\"
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qurlquery/tst_qurlquery.cpp b/tests/auto/corelib/io/qurlquery/tst_qurlquery.cpp
index 769a96ac64..7df085df7c 100644
--- a/tests/auto/corelib/io/qurlquery/tst_qurlquery.cpp
+++ b/tests/auto/corelib/io/qurlquery/tst_qurlquery.cpp
@@ -103,7 +103,7 @@ static QByteArray prettyList(const T &items)
first = false;
result += prettyPair(it);
}
- result += ")";
+ result += QLatin1Char(')');
return result.toLocal8Bit();
}
@@ -176,20 +176,20 @@ void tst_QUrlQuery::constructing()
QUrlQuery copy(empty);
QVERIFY(copy.isEmpty());
QVERIFY(!copy.isDetached());
- QVERIFY(copy == empty);
+ QCOMPARE(copy, empty);
QCOMPARE(qHash(copy), qHash(empty));
QVERIFY(!(copy != empty));
copy = empty;
- QVERIFY(copy == empty);
+ QCOMPARE(copy, empty);
copy = QUrlQuery();
- QVERIFY(copy == empty);
+ QCOMPARE(copy, empty);
QCOMPARE(qHash(copy), qHash(empty));
}
{
QUrlQuery copy(emptyQuery());
- QVERIFY(copy == empty);
+ QCOMPARE(copy, empty);
}
QVERIFY(!empty.hasQueryItem("a"));
@@ -214,7 +214,7 @@ void tst_QUrlQuery::constructing()
QVERIFY(!(other == empty));
QUrlQuery copy(other);
- QVERIFY(copy == other);
+ QCOMPARE(copy, other);
copy.clear();
QVERIFY(copy.isEmpty());
@@ -222,7 +222,7 @@ void tst_QUrlQuery::constructing()
copy = other;
QVERIFY(!copy.isEmpty());
- QVERIFY(copy == other);
+ QCOMPARE(copy, other);
copy = QUrlQuery();
QVERIFY(copy.isEmpty());
@@ -298,7 +298,7 @@ void tst_QUrlQuery::addRemove()
QCOMPARE(allItems.at(0).first, QString("a"));
QCOMPARE(allItems.at(0).second, QString("b"));
- QVERIFY(query == original);
+ QCOMPARE(query, original);
QVERIFY(!(query != original));
QCOMPARE(qHash(query), qHash(original));
}
@@ -346,7 +346,7 @@ void tst_QUrlQuery::multiAddRemove()
QVERIFY(query.hasQueryItem("a"));
// returns the first one
- QVERIFY(query.queryItemValue("a") == "b");
+ QCOMPARE(query.queryItemValue("a"), QLatin1String("b"));
// order is the order we set them in
QVERIFY(query.allQueryItemValues("a") == QStringList() << "b" << "c");
@@ -359,9 +359,9 @@ void tst_QUrlQuery::multiAddRemove()
QVERIFY(query.hasQueryItem("A"));
QVERIFY(query.hasQueryItem("a"));
- QVERIFY(query.queryItemValue("a") == "b");
+ QCOMPARE(query.queryItemValue("a"), QLatin1String("b"));
QVERIFY(query.allQueryItemValues("a") == QStringList() << "b" << "c");
- QVERIFY(query.queryItemValue("A") == "B");
+ QCOMPARE(query.queryItemValue("A"), QLatin1String("B"));
QVERIFY(query.allQueryItemValues("A") == QStringList() << "B" << "C");
}
@@ -371,7 +371,7 @@ void tst_QUrlQuery::multiAddRemove()
QVERIFY(query.hasQueryItem("a"));
// it must have removed the first one
- QVERIFY(query.queryItemValue("a") == "c");
+ QCOMPARE(query.queryItemValue("a"), QLatin1String("c"));
}
{
@@ -720,7 +720,7 @@ void tst_QUrlQuery::old_queryItems()
QVERIFY(!url.isEmpty());
QList<QPair<QString, QString> > setItems = url.queryItems();
- QVERIFY(newItems == setItems);
+ QCOMPARE(newItems, setItems);
url.addQueryItem("1", "z");
@@ -746,18 +746,18 @@ void tst_QUrlQuery::old_queryItems()
url.removeAllQueryItems("1");
QVERIFY(!url.hasQueryItem("1"));
- QCOMPARE(url.queryItemValue("4").toLatin1().constData(), "a b");
- QCOMPARE(url.queryItemValue("5").toLatin1().constData(), "&");
- QCOMPARE(url.queryItemValue("tex").toLatin1().constData(), "a + b = c");
- QCOMPARE(url.queryItemValue("foo bar").toLatin1().constData(), "hello world");
+ QCOMPARE(url.queryItemValue("4"), QLatin1String("a b"));
+ QCOMPARE(url.queryItemValue("5"), QLatin1String("&"));
+ QCOMPARE(url.queryItemValue("tex"), QLatin1String("a + b = c"));
+ QCOMPARE(url.queryItemValue("foo bar"), QLatin1String("hello world"));
//url.setUrl("http://www.google.com/search?q=a+b");
url.setQuery("q=a+b");
- QCOMPARE(url.queryItemValue("q"), QString("a+b"));
+ QCOMPARE(url.queryItemValue("q"), QLatin1String("a+b"));
//url.setUrl("http://www.google.com/search?q=a=b"); // invalid, but should be tolerated
url.setQuery("q=a=b");
- QCOMPARE(url.queryItemValue("q"), QString("a=b"));
+ QCOMPARE(url.queryItemValue("q"), QLatin1String("a=b"));
}
void tst_QUrlQuery::old_hasQueryItem_data()
diff --git a/tests/auto/corelib/io/qwinoverlappedionotifier/qwinoverlappedionotifier.pro b/tests/auto/corelib/io/qwinoverlappedionotifier/qwinoverlappedionotifier.pro
index b7a36459f8..4f0e9da3c2 100644
--- a/tests/auto/corelib/io/qwinoverlappedionotifier/qwinoverlappedionotifier.pro
+++ b/tests/auto/corelib/io/qwinoverlappedionotifier/qwinoverlappedionotifier.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qwinoverlappedionotifier
QT = core-private testlib
SOURCES = tst_qwinoverlappedionotifier.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qwinoverlappedionotifier/tst_qwinoverlappedionotifier.cpp b/tests/auto/corelib/io/qwinoverlappedionotifier/tst_qwinoverlappedionotifier.cpp
index 57a01e0a79..ad2aa0dfd3 100644
--- a/tests/auto/corelib/io/qwinoverlappedionotifier/tst_qwinoverlappedionotifier.cpp
+++ b/tests/auto/corelib/io/qwinoverlappedionotifier/tst_qwinoverlappedionotifier.cpp
@@ -199,7 +199,7 @@ void tst_QWinOverlappedIoNotifier::waitForAnyNotified()
NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
notifier.setHandle(hFile);
notifier.setEnabled(true);
- QVERIFY(notifier.waitForAnyNotified(100) == 0);
+ QVERIFY(!notifier.waitForAnyNotified(100));
OVERLAPPED overlapped1;
ZeroMemory(&overlapped1, sizeof(OVERLAPPED));
@@ -224,7 +224,7 @@ void tst_QWinOverlappedIoNotifier::waitForAnyNotified()
CloseHandle(hFile);
QVERIFY(overlappedObjects.isEmpty());
- QVERIFY(notifier.waitForAnyNotified(100) == 0);
+ QVERIFY(!notifier.waitForAnyNotified(100));
}
void tst_QWinOverlappedIoNotifier::brokenPipe()
diff --git a/tests/auto/corelib/itemmodels/qabstractitemmodel/qabstractitemmodel.pro b/tests/auto/corelib/itemmodels/qabstractitemmodel/qabstractitemmodel.pro
index ef571de192..7480bd45f6 100644
--- a/tests/auto/corelib/itemmodels/qabstractitemmodel/qabstractitemmodel.pro
+++ b/tests/auto/corelib/itemmodels/qabstractitemmodel/qabstractitemmodel.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qabstractitemmodel
QT = core testlib
diff --git a/tests/auto/corelib/itemmodels/qabstractitemmodel/tst_qabstractitemmodel.cpp b/tests/auto/corelib/itemmodels/qabstractitemmodel/tst_qabstractitemmodel.cpp
index c4d2df7c3e..2570beb6c2 100644
--- a/tests/auto/corelib/itemmodels/qabstractitemmodel/tst_qabstractitemmodel.cpp
+++ b/tests/auto/corelib/itemmodels/qabstractitemmodel/tst_qabstractitemmodel.cpp
@@ -157,9 +157,10 @@ QtTestModel::QtTestModel(int rows, int columns, QObject *parent)
{
table.resize(rows);
for (int r = 0; r < rows; ++r) {
+ const QString prefix = QString::number(r) + QLatin1Char('/');
table[r].resize(columns);
for (int c = 0; c < columns; ++c)
- table[r][c] = QString("%1/%2").arg(r).arg(c);
+ table[r][c] = prefix + QString::number(c);
}
}
@@ -1699,8 +1700,8 @@ void tst_QAbstractItemModel::testMoveToDescendants()
moveCommand->setDestRow(row);
moveCommand->doCommand();
- QVERIFY(beforeSpy.size() == 0);
- QVERIFY(afterSpy.size() == 0);
+ QCOMPARE(beforeSpy.size(), 0);
+ QCOMPARE(afterSpy.size(), 0);
}
}
}
@@ -1757,8 +1758,8 @@ void tst_QAbstractItemModel::testMoveWithinOwnRange()
moveCommand->setDestRow(destRow);
moveCommand->doCommand();
- QVERIFY(beforeSpy.size() == 0);
- QVERIFY(afterSpy.size() == 0);
+ QCOMPARE(beforeSpy.size(), 0);
+ QCOMPARE(afterSpy.size(), 0);
}
class ListenerObject : public QObject
@@ -1823,7 +1824,7 @@ void ListenerObject::slotAboutToBeReset()
// Nothing has been changed yet. All indexes should be the same.
for (int i = 0; i < m_persistentIndexes.size(); ++i) {
QModelIndex idx = m_persistentIndexes.at(i);
- QVERIFY(idx == m_nonPersistentIndexes.at(i));
+ QCOMPARE(idx, m_nonPersistentIndexes.at(i));
QVERIFY(m_model->mapToSource(idx).isValid());
}
}
@@ -1859,13 +1860,13 @@ void tst_QAbstractItemModel::testReset()
resetCommand->doCommand();
// Verify that the correct signals were emitted
- QVERIFY(beforeResetSpy.size() == 1);
- QVERIFY(afterResetSpy.size() == 1);
+ QCOMPARE(beforeResetSpy.size(), 1);
+ QCOMPARE(afterResetSpy.size(), 1);
// Verify that the move actually happened.
- QVERIFY(m_model->rowCount() == 9);
+ QCOMPARE(m_model->rowCount(), 9);
QModelIndex destIndex = m_model->index(4, 0);
- QVERIFY(m_model->rowCount(destIndex) == 11);
+ QCOMPARE(m_model->rowCount(destIndex), 11);
// Delete it because its slots test things which are not true after this point.
delete listener;
@@ -1877,14 +1878,14 @@ void tst_QAbstractItemModel::testReset()
QCOMPARE(nullProxy->roleNames().value(Qt::UserRole + 1), QByteArray());
nullProxy->setSourceModel(new ModelWithCustomRole(this));
- QVERIFY(proxyBeforeResetSpy.size() == 1);
- QVERIFY(proxyAfterResetSpy.size() == 1);
+ QCOMPARE(proxyBeforeResetSpy.size(), 1);
+ QCOMPARE(proxyAfterResetSpy.size(), 1);
QCOMPARE(nullProxy->roleNames().value(Qt::UserRole + 1), QByteArray("custom"));
nullProxy->setSourceModel(m_model);
- QVERIFY(proxyBeforeResetSpy.size() == 2);
- QVERIFY(proxyAfterResetSpy.size() == 2);
+ QCOMPARE(proxyBeforeResetSpy.size(), 2);
+ QCOMPARE(proxyAfterResetSpy.size(), 2);
// After being reset the proxy must be queried again.
QCOMPARE(nullProxy->roleNames().value(Qt::UserRole + 1), QByteArray());
@@ -2055,10 +2056,10 @@ void tst_QAbstractItemModel::testChildrenLayoutsChanged()
QVERIFY(afterParents.contains(p2));
// The first will be the last, and the lest will be the first.
- QVERIFY(p1FirstPersistent.row() == 1);
- QVERIFY(p1LastPersistent.row() == 0);
- QVERIFY(p2FirstPersistent.row() == 9);
- QVERIFY(p2LastPersistent.row() == 8);
+ QCOMPARE(p1FirstPersistent.row(), 1);
+ QCOMPARE(p1LastPersistent.row(), 0);
+ QCOMPARE(p2FirstPersistent.row(), 9);
+ QCOMPARE(p2LastPersistent.row(), 8);
}
insertCommand = new ModelInsertCommand(&model, this);
@@ -2115,8 +2116,8 @@ void tst_QAbstractItemModel::testChildrenLayoutsChanged()
QCOMPARE(beforeSignal.size(), 2);
QCOMPARE(afterSignal.size(), 2);
- QVERIFY(p1FirstPersistent.row() == 1);
- QVERIFY(p1LastPersistent.row() == 0);
+ QCOMPARE(p1FirstPersistent.row(), 1);
+ QCOMPARE(p1LastPersistent.row(), 0);
QCOMPARE(p2FirstPersistent.row(), 9);
QCOMPARE(p2LastPersistent.row(), 8);
}
diff --git a/tests/auto/corelib/itemmodels/qabstractproxymodel/qabstractproxymodel.pro b/tests/auto/corelib/itemmodels/qabstractproxymodel/qabstractproxymodel.pro
index 7209620b91..19aec43072 100644
--- a/tests/auto/corelib/itemmodels/qabstractproxymodel/qabstractproxymodel.pro
+++ b/tests/auto/corelib/itemmodels/qabstractproxymodel/qabstractproxymodel.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qabstractproxymodel
QT += testlib
SOURCES += tst_qabstractproxymodel.cpp
diff --git a/tests/auto/corelib/itemmodels/qabstractproxymodel/tst_qabstractproxymodel.cpp b/tests/auto/corelib/itemmodels/qabstractproxymodel/tst_qabstractproxymodel.cpp
index fb9d118d60..fbe123bca0 100644
--- a/tests/auto/corelib/itemmodels/qabstractproxymodel/tst_qabstractproxymodel.cpp
+++ b/tests/auto/corelib/itemmodels/qabstractproxymodel/tst_qabstractproxymodel.cpp
@@ -351,7 +351,7 @@ static void verifySubSetOf(const QHash<int, QByteArray> &superSet, const QHash<i
const QHash<int, QByteArray>::const_iterator end = subSet.constEnd();
for ( ; it != end; ++it ) {
QVERIFY(superSet.contains(it.key()));
- QVERIFY(it.value() == superSet.value(it.key()));
+ QCOMPARE(it.value(), superSet.value(it.key()));
}
}
diff --git a/tests/auto/corelib/itemmodels/qidentityproxymodel/qidentityproxymodel.pro b/tests/auto/corelib/itemmodels/qidentityproxymodel/qidentityproxymodel.pro
index f57b419ae5..ba32f02962 100644
--- a/tests/auto/corelib/itemmodels/qidentityproxymodel/qidentityproxymodel.pro
+++ b/tests/auto/corelib/itemmodels/qidentityproxymodel/qidentityproxymodel.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qidentityproxymodel
mtdir = ../../../other/modeltest
@@ -7,4 +6,3 @@ INCLUDEPATH += $$PWD/$${mtdir}
QT += testlib
SOURCES += tst_qidentityproxymodel.cpp $${mtdir}/dynamictreemodel.cpp $${mtdir}/modeltest.cpp
HEADERS += $${mtdir}/dynamictreemodel.h $${mtdir}/modeltest.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp b/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp
index 9eb3bc5113..fbab95c975 100644
--- a/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp
+++ b/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp
@@ -111,25 +111,25 @@ void tst_QIdentityProxyModel::verifyIdentity(QAbstractItemModel *model, const QM
const int columns = model->columnCount(parent);
const QModelIndex proxyParent = m_proxy->mapFromSource(parent);
- QVERIFY(m_proxy->mapToSource(proxyParent) == parent);
- QVERIFY(rows == m_proxy->rowCount(proxyParent));
- QVERIFY(columns == m_proxy->columnCount(proxyParent));
+ QCOMPARE(m_proxy->mapToSource(proxyParent), parent);
+ QCOMPARE(rows, m_proxy->rowCount(proxyParent));
+ QCOMPARE(columns, m_proxy->columnCount(proxyParent));
for (int row = 0; row < rows; ++row) {
for (int column = 0; column < columns; ++column) {
const QModelIndex idx = model->index(row, column, parent);
const QModelIndex proxyIdx = m_proxy->mapFromSource(idx);
- QVERIFY(proxyIdx.model() == m_proxy);
- QVERIFY(m_proxy->mapToSource(proxyIdx) == idx);
+ QCOMPARE(proxyIdx.model(), m_proxy);
+ QCOMPARE(m_proxy->mapToSource(proxyIdx), idx);
QVERIFY(proxyIdx.isValid());
- QVERIFY(proxyIdx.row() == row);
- QVERIFY(proxyIdx.column() == column);
- QVERIFY(proxyIdx.parent() == proxyParent);
- QVERIFY(proxyIdx.data() == idx.data());
- QVERIFY(proxyIdx.flags() == idx.flags());
+ QCOMPARE(proxyIdx.row(), row);
+ QCOMPARE(proxyIdx.column(), column);
+ QCOMPARE(proxyIdx.parent(), proxyParent);
+ QCOMPARE(proxyIdx.data(), idx.data());
+ QCOMPARE(proxyIdx.flags(), idx.flags());
const int childCount = m_proxy->rowCount(proxyIdx);
const bool hasChildren = m_proxy->hasChildren(proxyIdx);
- QVERIFY(model->hasChildren(idx) == hasChildren);
+ QCOMPARE(model->hasChildren(idx), hasChildren);
QVERIFY((childCount > 0) == hasChildren);
if (hasChildren)
@@ -146,7 +146,7 @@ void tst_QIdentityProxyModel::insertRows()
{
QStandardItem *parentItem = m_model->invisibleRootItem();
for (int i = 0; i < 4; ++i) {
- QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
+ QStandardItem *item = new QStandardItem(QLatin1String("item ") + QString::number(i));
parentItem->appendRow(item);
parentItem = item;
}
@@ -171,13 +171,13 @@ void tst_QIdentityProxyModel::insertRows()
QVERIFY(modelBeforeSpy.size() == 1 && 1 == proxyBeforeSpy.size());
QVERIFY(modelAfterSpy.size() == 1 && 1 == proxyAfterSpy.size());
- QVERIFY(modelBeforeSpy.first().first().value<QModelIndex>() == m_proxy->mapToSource(proxyBeforeSpy.first().first().value<QModelIndex>()));
- QVERIFY(modelBeforeSpy.first().at(1) == proxyBeforeSpy.first().at(1));
- QVERIFY(modelBeforeSpy.first().at(2) == proxyBeforeSpy.first().at(2));
+ QCOMPARE(modelBeforeSpy.first().first().value<QModelIndex>(), m_proxy->mapToSource(proxyBeforeSpy.first().first().value<QModelIndex>()));
+ QCOMPARE(modelBeforeSpy.first().at(1), proxyBeforeSpy.first().at(1));
+ QCOMPARE(modelBeforeSpy.first().at(2), proxyBeforeSpy.first().at(2));
- QVERIFY(modelAfterSpy.first().first().value<QModelIndex>() == m_proxy->mapToSource(proxyAfterSpy.first().first().value<QModelIndex>()));
- QVERIFY(modelAfterSpy.first().at(1) == proxyAfterSpy.first().at(1));
- QVERIFY(modelAfterSpy.first().at(2) == proxyAfterSpy.first().at(2));
+ QCOMPARE(modelAfterSpy.first().first().value<QModelIndex>(), m_proxy->mapToSource(proxyAfterSpy.first().first().value<QModelIndex>()));
+ QCOMPARE(modelAfterSpy.first().at(1), proxyAfterSpy.first().at(1));
+ QCOMPARE(modelAfterSpy.first().at(2), proxyAfterSpy.first().at(2));
verifyIdentity(m_model);
}
@@ -186,7 +186,7 @@ void tst_QIdentityProxyModel::removeRows()
{
QStandardItem *parentItem = m_model->invisibleRootItem();
for (int i = 0; i < 4; ++i) {
- QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
+ QStandardItem *item = new QStandardItem(QLatin1String("item ") + QString::number(i));
parentItem->appendRow(item);
parentItem = item;
}
@@ -216,13 +216,13 @@ void tst_QIdentityProxyModel::removeRows()
QVERIFY(modelBeforeSpy.size() == 1 && 1 == proxyBeforeSpy.size());
QVERIFY(modelAfterSpy.size() == 1 && 1 == proxyAfterSpy.size());
- QVERIFY(modelBeforeSpy.first().first().value<QModelIndex>() == m_proxy->mapToSource(proxyBeforeSpy.first().first().value<QModelIndex>()));
- QVERIFY(modelBeforeSpy.first().at(1) == proxyBeforeSpy.first().at(1));
- QVERIFY(modelBeforeSpy.first().at(2) == proxyBeforeSpy.first().at(2));
+ QCOMPARE(modelBeforeSpy.first().first().value<QModelIndex>(), m_proxy->mapToSource(proxyBeforeSpy.first().first().value<QModelIndex>()));
+ QCOMPARE(modelBeforeSpy.first().at(1), proxyBeforeSpy.first().at(1));
+ QCOMPARE(modelBeforeSpy.first().at(2), proxyBeforeSpy.first().at(2));
- QVERIFY(modelAfterSpy.first().first().value<QModelIndex>() == m_proxy->mapToSource(proxyAfterSpy.first().first().value<QModelIndex>()));
- QVERIFY(modelAfterSpy.first().at(1) == proxyAfterSpy.first().at(1));
- QVERIFY(modelAfterSpy.first().at(2) == proxyAfterSpy.first().at(2));
+ QCOMPARE(modelAfterSpy.first().first().value<QModelIndex>(), m_proxy->mapToSource(proxyAfterSpy.first().first().value<QModelIndex>()));
+ QCOMPARE(modelAfterSpy.first().at(1), proxyAfterSpy.first().at(1));
+ QCOMPARE(modelAfterSpy.first().at(2), proxyAfterSpy.first().at(2));
verifyIdentity(m_model);
}
@@ -271,17 +271,17 @@ void tst_QIdentityProxyModel::moveRows()
QVERIFY(modelBeforeSpy.size() == 1 && 1 == proxyBeforeSpy.size());
QVERIFY(modelAfterSpy.size() == 1 && 1 == proxyAfterSpy.size());
- QVERIFY(modelBeforeSpy.first().first().value<QModelIndex>() == m_proxy->mapToSource(proxyBeforeSpy.first().first().value<QModelIndex>()));
- QVERIFY(modelBeforeSpy.first().at(1) == proxyBeforeSpy.first().at(1));
- QVERIFY(modelBeforeSpy.first().at(2) == proxyBeforeSpy.first().at(2));
- QVERIFY(modelBeforeSpy.first().at(3).value<QModelIndex>() == m_proxy->mapToSource(proxyBeforeSpy.first().at(3).value<QModelIndex>()));
- QVERIFY(modelBeforeSpy.first().at(4) == proxyBeforeSpy.first().at(4));
+ QCOMPARE(modelBeforeSpy.first().first().value<QModelIndex>(), m_proxy->mapToSource(proxyBeforeSpy.first().first().value<QModelIndex>()));
+ QCOMPARE(modelBeforeSpy.first().at(1), proxyBeforeSpy.first().at(1));
+ QCOMPARE(modelBeforeSpy.first().at(2), proxyBeforeSpy.first().at(2));
+ QCOMPARE(modelBeforeSpy.first().at(3).value<QModelIndex>(), m_proxy->mapToSource(proxyBeforeSpy.first().at(3).value<QModelIndex>()));
+ QCOMPARE(modelBeforeSpy.first().at(4), proxyBeforeSpy.first().at(4));
- QVERIFY(modelAfterSpy.first().first().value<QModelIndex>() == m_proxy->mapToSource(proxyAfterSpy.first().first().value<QModelIndex>()));
- QVERIFY(modelAfterSpy.first().at(1) == proxyAfterSpy.first().at(1));
- QVERIFY(modelAfterSpy.first().at(2) == proxyAfterSpy.first().at(2));
- QVERIFY(modelAfterSpy.first().at(3).value<QModelIndex>() == m_proxy->mapToSource(proxyAfterSpy.first().at(3).value<QModelIndex>()));
- QVERIFY(modelAfterSpy.first().at(4) == proxyAfterSpy.first().at(4));
+ QCOMPARE(modelAfterSpy.first().first().value<QModelIndex>(), m_proxy->mapToSource(proxyAfterSpy.first().first().value<QModelIndex>()));
+ QCOMPARE(modelAfterSpy.first().at(1), proxyAfterSpy.first().at(1));
+ QCOMPARE(modelAfterSpy.first().at(2), proxyAfterSpy.first().at(2));
+ QCOMPARE(modelAfterSpy.first().at(3).value<QModelIndex>(), m_proxy->mapToSource(proxyAfterSpy.first().at(3).value<QModelIndex>()));
+ QCOMPARE(modelAfterSpy.first().at(4), proxyAfterSpy.first().at(4));
verifyIdentity(&model);
@@ -352,7 +352,7 @@ void tst_QIdentityProxyModel::dataChanged()
model.changeData();
QCOMPARE(modelSpy.first().at(2).value<QVector<int> >(), QVector<int>() << 1);
- QVERIFY(modelSpy.first().at(2) == proxySpy.first().at(2));
+ QCOMPARE(modelSpy.first().at(2), proxySpy.first().at(2));
verifyIdentity(&model);
m_proxy->setSourceModel(0);
diff --git a/tests/auto/corelib/itemmodels/qitemmodel/modelstotest.cpp b/tests/auto/corelib/itemmodels/qitemmodel/modelstotest.cpp
index e0e688cc3a..24765a82a8 100644
--- a/tests/auto/corelib/itemmodels/qitemmodel/modelstotest.cpp
+++ b/tests/auto/corelib/itemmodels/qitemmodel/modelstotest.cpp
@@ -236,7 +236,7 @@ QModelIndex ModelsToTest::populateTestArea(QAbstractItemModel *model)
{
if (QStringListModel *stringListModel = qobject_cast<QStringListModel *>(model)) {
QString alphabet = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
- stringListModel->setStringList( alphabet.split(",") );
+ stringListModel->setStringList( alphabet.split(QLatin1Char(',')) );
return QModelIndex();
}
@@ -317,7 +317,7 @@ QModelIndex ModelsToTest::populateTestArea(QAbstractItemModel *model)
QDir tempDir(m_dirModelTempDir->path());
for (int i = 0; i < 26; ++i) {
- const QString subdir = QString("foo_") + QString::number(i);
+ const QString subdir = QLatin1String("foo_") + QString::number(i);
if (!tempDir.mkdir(subdir))
qFatal("Cannot create directory %s",
qPrintable(QDir::toNativeSeparators(tempDir.path() + QLatin1Char('/') +subdir)));
@@ -355,7 +355,7 @@ QModelIndex ModelsToTest::populateTestArea(QAbstractItemModel *model)
int items = 50;
#endif
while (items--)
- listWidget->addItem(QString("item %1").arg(items));
+ listWidget->addItem(QLatin1String("item ") + QString::number(items));
return QModelIndex();
}
@@ -370,9 +370,10 @@ QModelIndex ModelsToTest::populateTestArea(QAbstractItemModel *model)
treeWidget->setColumnCount(1);
QTreeWidgetItem *parent;
while (topItems--){
- parent = new QTreeWidgetItem(treeWidget, QStringList(QString("top %1").arg(topItems)));
+ const QString tS = QString::number(topItems);
+ parent = new QTreeWidgetItem(treeWidget, QStringList(QLatin1String("top ") + tS));
for (int i = 0; i < 20; ++i)
- new QTreeWidgetItem(parent, QStringList(QString("child %1").arg(topItems)));
+ new QTreeWidgetItem(parent, QStringList(QLatin1String("child ") + tS));
}
return QModelIndex();
}
diff --git a/tests/auto/corelib/itemmodels/qitemmodel/qitemmodel.pro b/tests/auto/corelib/itemmodels/qitemmodel/qitemmodel.pro
index 42c9c8f9fb..ff21d6afa5 100644
--- a/tests/auto/corelib/itemmodels/qitemmodel/qitemmodel.pro
+++ b/tests/auto/corelib/itemmodels/qitemmodel/qitemmodel.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qitemmodel
QT += widgets sql testlib
SOURCES = tst_qitemmodel.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp b/tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp
index 6971f7ef78..20ff670835 100644
--- a/tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp
+++ b/tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp
@@ -359,7 +359,7 @@ void tst_QItemModel::index()
// Make sure that the same index is always returned
QModelIndex a = currentModel->index(0,0);
QModelIndex b = currentModel->index(0,0);
- QVERIFY(a == b);
+ QCOMPARE(a, b);
// index is tested more extensivly more later in checkChildren(),
// but this catches the big mistakes
@@ -423,7 +423,7 @@ void checkChildren(QAbstractItemModel *currentModel, const QModelIndex &parent,
// Make sure we get the same index if we request it twice in a row
QModelIndex a = currentModel->index(r, c, parent);
QModelIndex b = currentModel->index(r, c, parent);
- QVERIFY(a == b);
+ QCOMPARE(a, b);
{
const QModelIndex sibling = currentModel->sibling( r, c, topLeftChild );
@@ -435,7 +435,7 @@ void checkChildren(QAbstractItemModel *currentModel, const QModelIndex &parent,
}
// Some basic checking on the index that is returned
- QVERIFY(index.model() == currentModel);
+ QCOMPARE(index.model(), currentModel);
QCOMPARE(index.row(), r);
QCOMPARE(index.column(), c);
QCOMPARE(currentModel->data(index, Qt::DisplayRole).isValid(), true);
diff --git a/tests/auto/corelib/itemmodels/qitemselectionmodel/qitemselectionmodel.pro b/tests/auto/corelib/itemmodels/qitemselectionmodel/qitemselectionmodel.pro
index 1b6279ba1b..4dcddc8feb 100644
--- a/tests/auto/corelib/itemmodels/qitemselectionmodel/qitemselectionmodel.pro
+++ b/tests/auto/corelib/itemmodels/qitemselectionmodel/qitemselectionmodel.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qitemselectionmodel
QT += testlib
SOURCES += tst_qitemselectionmodel.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp b/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp
index 38e2900c25..7d5c30dfb5 100644
--- a/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp
+++ b/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp
@@ -1515,7 +1515,7 @@ class MyStandardItemModel: public QStandardItemModel
Q_OBJECT
public:
inline MyStandardItemModel(int i1, int i2): QStandardItemModel(i1, i2) {}
- inline void reset() { QStandardItemModel::reset(); }
+ inline void reset() { beginResetModel(); endResetModel(); }
};
void tst_QItemSelectionModel::resetModel()
@@ -1760,7 +1760,7 @@ void tst_QItemSelectionModel::modelLayoutChanged()
// verify that selection is as expected
QItemSelection selection = selectionModel.selection();
QCOMPARE(selection.count(), expectedSelectedRanges.count());
- QVERIFY(selectionModel.hasSelection() == !expectedSelectedRanges.isEmpty());
+ QCOMPARE(selectionModel.hasSelection(), !expectedSelectedRanges.isEmpty());
for (int i = 0; i < expectedSelectedRanges.count(); ++i) {
IntPairPair expectedRange = expectedSelectedRanges.at(i);
@@ -1974,8 +1974,9 @@ void tst_QItemSelectionModel::rowIntersectsSelection2()
{
QStandardItemModel m;
for (int i=0; i<8; ++i) {
+ const QString text = QLatin1String("Item number ") + QString::number(i);
for (int j=0; j<8; ++j) {
- QStandardItem *item = new QStandardItem(QString("Item number %1").arg(i));
+ QStandardItem *item = new QStandardItem(text);
if ((i % 2 == 0 && j == 0) ||
(j % 2 == 0 && i == 0) ||
j == 5 || i == 5 ) {
@@ -2021,7 +2022,7 @@ void tst_QItemSelectionModel::rowIntersectsSelection3()
QStandardItemModel model;
QStandardItem *parentItem = model.invisibleRootItem();
for (int i = 0; i < 4; ++i) {
- QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
+ QStandardItem *item = new QStandardItem(QLatin1String("item ") + QString::number(i));
parentItem->appendRow(item);
parentItem = item;
}
@@ -2046,7 +2047,7 @@ void tst_QItemSelectionModel::unselectable()
QStandardItem *parentItem = model.invisibleRootItem();
for (int i = 0; i < 10; ++i) {
- QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
+ QStandardItem *item = new QStandardItem(QLatin1String("item ") + QString::number(i));
parentItem->appendRow(item);
}
QItemSelectionModel selectionModel(&model);
@@ -2093,7 +2094,8 @@ public:
QVariant data(const QModelIndex &idx, int role) const
{
if (role == Qt::DisplayRole || role == Qt::EditRole)
- return QString("[%1,%2]").arg(idx.row()).arg(idx.column());
+ return QLatin1Char('[') + QString::number(idx.row()) + QLatin1Char(',')
+ + QString::number(idx.column()) + QLatin1Char(']');
return QVariant();
}
@@ -2202,7 +2204,7 @@ void tst_QItemSelectionModel::childrenDeselectionSignal()
QStandardItem *parentItem = model.invisibleRootItem();
for (int i = 0; i < 4; ++i) {
- QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
+ QStandardItem *item = new QStandardItem(QLatin1String("item ") + QString::number(i));
parentItem->appendRow(item);
parentItem = item;
}
@@ -2217,7 +2219,7 @@ void tst_QItemSelectionModel::childrenDeselectionSignal()
QSignalSpy deselectSpy(&selectionModel, &QItemSelectionModel::selectionChanged);
QVERIFY(deselectSpy.isValid());
model.removeRows(0, 1, root);
- QVERIFY(deselectSpy.count() == 1);
+ QCOMPARE(deselectSpy.count(), 1);
// More testing stress for the patch.
model.clear();
@@ -2225,13 +2227,14 @@ void tst_QItemSelectionModel::childrenDeselectionSignal()
parentItem = model.invisibleRootItem();
for (int i = 0; i < 2; ++i) {
- QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
+ QStandardItem *item = new QStandardItem(QLatin1String("item ") + QString::number(i));
parentItem->appendRow(item);
}
for (int i = 0; i < 2; ++i) {
parentItem = model.invisibleRootItem()->child(i, 0);
+ const QString prefix = QLatin1String("item ") + QString::number(i) + QLatin1Char('.');
for (int j = 0; j < 2; ++j) {
- QStandardItem *item = new QStandardItem(QString("item %0.%1").arg(i).arg(j));
+ QStandardItem *item = new QStandardItem(prefix + QString::number(j));
parentItem->appendRow(item);
}
}
@@ -2245,7 +2248,7 @@ void tst_QItemSelectionModel::childrenDeselectionSignal()
QVERIFY(selectionModel.selection().contains(sel2));
deselectSpy.clear();
model.removeRow(0, model.index(0, 0));
- QVERIFY(deselectSpy.count() == 1);
+ QCOMPARE(deselectSpy.count(), 1);
QVERIFY(!selectionModel.selection().contains(sel));
QVERIFY(selectionModel.selection().contains(sel2));
}
@@ -2304,13 +2307,12 @@ void tst_QItemSelectionModel::layoutChangedWithAllSelected2()
// Populate the tree view.
for (unsigned int i = 0; i < cNumCols; i++)
- model.setHeaderData( i, Qt::Horizontal, QString::fromLatin1("Column %1").arg(i));
+ model.setHeaderData( i, Qt::Horizontal, QLatin1String("Column ") + QString::number(i));
for (unsigned int r = 0; r < cNumRows; r++) {
- for (unsigned int c = 0; c < cNumCols; c++) {
- model.setData(model.index(r, c, QModelIndex()),
- QString::fromLatin1("r:%1/c:%2").arg(r, c));
- }
+ const QString prefix = QLatin1String("r:") + QString::number(r) + QLatin1String("/c:");
+ for (unsigned int c = 0; c < cNumCols; c++)
+ model.setData(model.index(r, c, QModelIndex()), prefix + QString::number(c));
}
QCOMPARE(model.rowCount(), int(cNumRows));
@@ -2375,7 +2377,7 @@ public slots:
foreach(const QModelIndex &index, deselected.indexes()) {
QVERIFY(!m_itemSelectionModel->selection().contains(index));
}
- QVERIFY(m_itemSelectionModel->selection().size() == 2);
+ QCOMPARE(m_itemSelectionModel->selection().size(), 2);
}
};
@@ -2393,7 +2395,7 @@ void tst_QItemSelectionModel::deselectRemovedMiddleRange()
selModel.select(QItemSelection(model.index(3, 0), model.index(6, 0)), QItemSelectionModel::Select);
- QVERIFY(selModel.selection().size() == 1);
+ QCOMPARE(selModel.selection().size(), 1);
RemovalObserver ro(&selModel);
@@ -2402,7 +2404,7 @@ void tst_QItemSelectionModel::deselectRemovedMiddleRange()
bool ok = model.removeRows(4, 2);
QVERIFY(ok);
- QVERIFY(spy.size() == 1);
+ QCOMPARE(spy.size(), 1);
}
static QStandardItemModel* getModel(QObject *parent)
@@ -2412,15 +2414,16 @@ static QStandardItemModel* getModel(QObject *parent)
for (int i = 0; i < 4; ++i) {
QStandardItem *parentItem = model->invisibleRootItem();
QList<QStandardItem*> list;
+ const QString prefix = QLatin1String("item ") + QString::number(i) + QLatin1String(", ");
for (int j = 0; j < 4; ++j) {
- list.append(new QStandardItem(QString("item %1, %2").arg(i).arg(j)));
+ list.append(new QStandardItem(prefix + QString::number(j)));
}
parentItem->appendRow(list);
parentItem = list.first();
for (int j = 0; j < 4; ++j) {
QList<QStandardItem*> list;
for (int k = 0; k < 4; ++k) {
- list.append(new QStandardItem(QString("item %1, %2").arg(i).arg(j)));
+ list.append(new QStandardItem(prefix + QString::number(j)));
}
parentItem->appendRow(list);
}
@@ -2713,8 +2716,8 @@ void tst_QItemSelectionModel::testChainedSelectionClear()
QModelIndexList selectedIndexes = selectionModel.selection().indexes();
QModelIndexList duplicatedIndexes = duplicate.selection().indexes();
- QVERIFY(selectedIndexes.size() == duplicatedIndexes.size());
- QVERIFY(selectedIndexes.size() == 1);
+ QCOMPARE(selectedIndexes.size(), duplicatedIndexes.size());
+ QCOMPARE(selectedIndexes.size(), 1);
QVERIFY(selectedIndexes.first() == model.index(0, 0));
}
@@ -2724,18 +2727,18 @@ void tst_QItemSelectionModel::testChainedSelectionClear()
QModelIndexList selectedIndexes = selectionModel.selection().indexes();
QModelIndexList duplicatedIndexes = duplicate.selection().indexes();
- QVERIFY(selectedIndexes.size() == duplicatedIndexes.size());
- QVERIFY(selectedIndexes.size() == 0);
+ QCOMPARE(selectedIndexes.size(), duplicatedIndexes.size());
+ QCOMPARE(selectedIndexes.size(), 0);
}
duplicate.setCurrentIndex(model.index(0, 0), QItemSelectionModel::NoUpdate);
- QVERIFY(selectionModel.currentIndex() == duplicate.currentIndex());
+ QCOMPARE(selectionModel.currentIndex(), duplicate.currentIndex());
duplicate.clearCurrentIndex();
QVERIFY(!duplicate.currentIndex().isValid());
- QVERIFY(selectionModel.currentIndex() == duplicate.currentIndex());
+ QCOMPARE(selectionModel.currentIndex(), duplicate.currentIndex());
}
void tst_QItemSelectionModel::testClearCurrentIndex()
@@ -2750,13 +2753,13 @@ void tst_QItemSelectionModel::testClearCurrentIndex()
QModelIndex firstIndex = model.index(0, 0);
QVERIFY(firstIndex.isValid());
selectionModel.setCurrentIndex(firstIndex, QItemSelectionModel::NoUpdate);
- QVERIFY(selectionModel.currentIndex() == firstIndex);
- QVERIFY(currentIndexSpy.size() == 1);
+ QCOMPARE(selectionModel.currentIndex(), firstIndex);
+ QCOMPARE(currentIndexSpy.size(), 1);
selectionModel.clearCurrentIndex();
- QVERIFY(selectionModel.currentIndex() == QModelIndex());
- QVERIFY(currentIndexSpy.size() == 2);
+ QCOMPARE(selectionModel.currentIndex(), QModelIndex());
+ QCOMPARE(currentIndexSpy.size(), 2);
}
void tst_QItemSelectionModel::QTBUG48402_data()
diff --git a/tests/auto/corelib/itemmodels/qsortfilterproxymodel/qsortfilterproxymodel.pro b/tests/auto/corelib/itemmodels/qsortfilterproxymodel/qsortfilterproxymodel.pro
index 25947990a7..099f666def 100644
--- a/tests/auto/corelib/itemmodels/qsortfilterproxymodel/qsortfilterproxymodel.pro
+++ b/tests/auto/corelib/itemmodels/qsortfilterproxymodel/qsortfilterproxymodel.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsortfilterproxymodel
QT += widgets testlib
@@ -8,4 +7,3 @@ mtdir = ../../../other/modeltest
INCLUDEPATH += $$PWD/$${mtdir}
SOURCES += tst_qsortfilterproxymodel.cpp $${mtdir}/dynamictreemodel.cpp $${mtdir}/modeltest.cpp
HEADERS += $${mtdir}/dynamictreemodel.h $${mtdir}/modeltest.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp b/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp
index 0302ae5cbf..7d93818797 100644
--- a/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp
+++ b/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp
@@ -341,7 +341,7 @@ void tst_QSortFilterProxyModel::sort_data()
QStringList list;
for (int i = 10000; i < 20000; ++i)
- list.append(QString("Number: %1").arg(i));
+ list.append(QStringLiteral("Number: ") + QString::number(i));
QTest::newRow("large set ascending") << static_cast<int>(Qt::AscendingOrder) << int(Qt::CaseSensitive) << list << list;
}
@@ -1346,14 +1346,14 @@ void tst_QSortFilterProxyModel::buildHierarchy(const QStringList &l, QAbstractIt
QStack<QModelIndex> parent_stack;
for (int i = 0; i < l.count(); ++i) {
QString token = l.at(i);
- if (token == "<") { // start table
+ if (token == QLatin1String("<")) { // start table
++ind;
parent_stack.push(parent);
row_stack.push(row);
parent = m->index(row - 1, 0, parent);
row = 0;
QVERIFY(m->insertColumns(0, 1, parent)); // add column
- } else if (token == ">") { // end table
+ } else if (token == QLatin1String(">")) { // end table
--ind;
parent = parent_stack.pop();
row = row_stack.pop();
@@ -1376,14 +1376,14 @@ void tst_QSortFilterProxyModel::checkHierarchy(const QStringList &l, const QAbst
QStack<QModelIndex> parent_stack;
for (int i = 0; i < l.count(); ++i) {
QString token = l.at(i);
- if (token == "<") { // start table
+ if (token == QLatin1String("<")) { // start table
++indent;
parent_stack.push(parent);
row_stack.push(row);
parent = m->index(row - 1, 0, parent);
QVERIFY(parent.isValid());
row = 0;
- } else if (token == ">") { // end table
+ } else if (token == QLatin1String(">")) { // end table
--indent;
parent = parent_stack.pop();
row = row_stack.pop();
@@ -1418,7 +1418,7 @@ void tst_QSortFilterProxyModel::filterTable()
filter.setFilterRegExp("9");
for (int i = 0; i < filter.rowCount(); ++i)
- QVERIFY(filter.data(filter.index(i, 0)).toString().contains("9"));
+ QVERIFY(filter.data(filter.index(i, 0)).toString().contains(QLatin1Char('9')));
}
void tst_QSortFilterProxyModel::insertAfterSelect()
@@ -1663,16 +1663,16 @@ void tst_QSortFilterProxyModel::removeSourceRows()
QCOMPARE(aboutToRemoveSpy.count(), expectedRemovedProxyIntervals.count());
for (int i = 0; i < aboutToRemoveSpy.count(); ++i) {
QList<QVariant> args = aboutToRemoveSpy.at(i);
- QVERIFY(args.at(1).type() == QVariant::Int);
- QVERIFY(args.at(2).type() == QVariant::Int);
+ QCOMPARE(args.at(1).type(), QVariant::Int);
+ QCOMPARE(args.at(2).type(), QVariant::Int);
QCOMPARE(args.at(1).toInt(), expectedRemovedProxyIntervals.at(i).first);
QCOMPARE(args.at(2).toInt(), expectedRemovedProxyIntervals.at(i).second);
}
QCOMPARE(removeSpy.count(), expectedRemovedProxyIntervals.count());
for (int i = 0; i < removeSpy.count(); ++i) {
QList<QVariant> args = removeSpy.at(i);
- QVERIFY(args.at(1).type() == QVariant::Int);
- QVERIFY(args.at(2).type() == QVariant::Int);
+ QCOMPARE(args.at(1).type(), QVariant::Int);
+ QCOMPARE(args.at(2).type(), QVariant::Int);
QCOMPARE(args.at(1).toInt(), expectedRemovedProxyIntervals.at(i).first);
QCOMPARE(args.at(2).toInt(), expectedRemovedProxyIntervals.at(i).second);
}
@@ -1841,8 +1841,8 @@ void tst_QSortFilterProxyModel::changeFilter()
QCOMPARE(initialInsertSpy.count(), 0);
for (int i = 0; i < initialRemoveSpy.count(); ++i) {
QList<QVariant> args = initialRemoveSpy.at(i);
- QVERIFY(args.at(1).type() == QVariant::Int);
- QVERIFY(args.at(2).type() == QVariant::Int);
+ QCOMPARE(args.at(1).type(), QVariant::Int);
+ QCOMPARE(args.at(2).type(), QVariant::Int);
QCOMPARE(args.at(1).toInt(), initialRemoveIntervals.at(i).first);
QCOMPARE(args.at(2).toInt(), initialRemoveIntervals.at(i).second);
}
@@ -1864,8 +1864,8 @@ void tst_QSortFilterProxyModel::changeFilter()
QCOMPARE(finalRemoveSpy.count(), finalRemoveIntervals.count());
for (int i = 0; i < finalRemoveSpy.count(); ++i) {
QList<QVariant> args = finalRemoveSpy.at(i);
- QVERIFY(args.at(1).type() == QVariant::Int);
- QVERIFY(args.at(2).type() == QVariant::Int);
+ QCOMPARE(args.at(1).type(), QVariant::Int);
+ QCOMPARE(args.at(2).type(), QVariant::Int);
QCOMPARE(args.at(1).toInt(), finalRemoveIntervals.at(i).first);
QCOMPARE(args.at(2).toInt(), finalRemoveIntervals.at(i).second);
}
@@ -1876,8 +1876,8 @@ void tst_QSortFilterProxyModel::changeFilter()
QCOMPARE(finalInsertSpy.count(), insertIntervals.count());
for (int i = 0; i < finalInsertSpy.count(); ++i) {
QList<QVariant> args = finalInsertSpy.at(i);
- QVERIFY(args.at(1).type() == QVariant::Int);
- QVERIFY(args.at(2).type() == QVariant::Int);
+ QCOMPARE(args.at(1).type(), QVariant::Int);
+ QCOMPARE(args.at(2).type(), QVariant::Int);
QCOMPARE(args.at(1).toInt(), insertIntervals.at(i).first);
QCOMPARE(args.at(2).toInt(), insertIntervals.at(i).second);
}
@@ -2018,8 +2018,8 @@ void tst_QSortFilterProxyModel::changeSourceData()
QCOMPARE(removeSpy.count(), removeIntervals.count());
for (int i = 0; i < removeSpy.count(); ++i) {
QList<QVariant> args = removeSpy.at(i);
- QVERIFY(args.at(1).type() == QVariant::Int);
- QVERIFY(args.at(2).type() == QVariant::Int);
+ QCOMPARE(args.at(1).type(), QVariant::Int);
+ QCOMPARE(args.at(2).type(), QVariant::Int);
QCOMPARE(args.at(1).toInt(), removeIntervals.at(i).first);
QCOMPARE(args.at(2).toInt(), removeIntervals.at(i).second);
}
@@ -2027,8 +2027,8 @@ void tst_QSortFilterProxyModel::changeSourceData()
QCOMPARE(insertSpy.count(), insertIntervals.count());
for (int i = 0; i < insertSpy.count(); ++i) {
QList<QVariant> args = insertSpy.at(i);
- QVERIFY(args.at(1).type() == QVariant::Int);
- QVERIFY(args.at(2).type() == QVariant::Int);
+ QCOMPARE(args.at(1).type(), QVariant::Int);
+ QCOMPARE(args.at(2).type(), QVariant::Int);
QCOMPARE(args.at(1).toInt(), insertIntervals.at(i).first);
QCOMPARE(args.at(2).toInt(), insertIntervals.at(i).second);
}
@@ -2545,12 +2545,11 @@ void tst_QSortFilterProxyModel::sortStable()
{
QStandardItemModel* model = new QStandardItemModel(5, 2);
for (int r = 0; r < 5; r++) {
+ const QString prefix = QLatin1String("Row:") + QString::number(r) + QLatin1String(", Column:");
for (int c = 0; c < 2; c++) {
- QStandardItem* item = new QStandardItem(
- QString("Row:%0, Column:%1").arg(r).arg(c) );
+ QStandardItem* item = new QStandardItem(prefix + QString::number(c));
for (int i = 0; i < 3; i++) {
- QStandardItem* child = new QStandardItem(
- QString("Item %0").arg(i) );
+ QStandardItem* child = new QStandardItem(QLatin1String("Item ") + QString::number(i));
item->appendRow( child );
}
model->setItem(r, c, item);
@@ -2581,7 +2580,7 @@ void tst_QSortFilterProxyModel::hiddenColumns()
public:
MyStandardItemModel() : QStandardItemModel(0,5) {}
void reset()
- { QStandardItemModel::reset(); }
+ { beginResetModel(); endResetModel(); }
friend class tst_QSortFilterProxyModel;
} model;
QSortFilterProxyModel proxy;
@@ -2625,7 +2624,7 @@ void tst_QSortFilterProxyModel::staticSorting()
QSortFilterProxyModel proxy;
proxy.setSourceModel(&model);
proxy.setDynamicSortFilter(false);
- QStringList initial = QString("bateau avion dragon hirondelle flamme camion elephant").split(" ");
+ QStringList initial = QString("bateau avion dragon hirondelle flamme camion elephant").split(QLatin1Char(' '));
// prepare model
QStandardItem *root = model.invisibleRootItem ();
@@ -2680,7 +2679,7 @@ void tst_QSortFilterProxyModel::staticSorting()
void tst_QSortFilterProxyModel::dynamicSorting()
{
QStringListModel model1;
- const QStringList initial = QString("bateau avion dragon hirondelle flamme camion elephant").split(" ");
+ const QStringList initial = QString("bateau avion dragon hirondelle flamme camion elephant").split(QLatin1Char(' '));
model1.setStringList(initial);
QSortFilterProxyModel proxy1;
proxy1.setDynamicSortFilter(false);
@@ -2806,7 +2805,8 @@ public:
qWarning("Invalid modelIndex [%d,%d,%p]", idx.row(), idx.column(),
idx.internalPointer());
}
- return QString("[%1,%2]").arg(idx.row()).arg(idx.column());
+ return QLatin1Char('[') + QString::number(idx.row()) + QLatin1Char(',')
+ + QString::number(idx.column()) + QLatin1Char(']');
}
return QVariant();
}
@@ -2971,7 +2971,7 @@ void tst_QSortFilterProxyModel::doubleProxySelectionSetSourceModel()
QStandardItemModel *model1 = new QStandardItemModel;
QStandardItem *parentItem = model1->invisibleRootItem();
for (int i = 0; i < 4; ++i) {
- QStandardItem *item = new QStandardItem(QString("model1 item %0").arg(i));
+ QStandardItem *item = new QStandardItem(QLatin1String("model1 item ") + QString::number(i));
parentItem->appendRow(item);
parentItem = item;
}
@@ -2979,7 +2979,7 @@ void tst_QSortFilterProxyModel::doubleProxySelectionSetSourceModel()
QStandardItemModel *model2 = new QStandardItemModel;
QStandardItem *parentItem2 = model2->invisibleRootItem();
for (int i = 0; i < 4; ++i) {
- QStandardItem *item = new QStandardItem(QString("model2 item %0").arg(i));
+ QStandardItem *item = new QStandardItem(QLatin1String("model2 item ") + QString::number(i));
parentItem2->appendRow(item);
parentItem2 = item;
}
@@ -3078,7 +3078,7 @@ void tst_QSortFilterProxyModel::appearsAndSort()
void tst_QSortFilterProxyModel::unnecessaryDynamicSorting()
{
QStringListModel model;
- const QStringList initial = QString("bravo charlie delta echo").split(" ");
+ const QStringList initial = QString("bravo charlie delta echo").split(QLatin1Char(' '));
model.setStringList(initial);
QSortFilterProxyModel proxy;
proxy.setDynamicSortFilter(false);
@@ -3162,7 +3162,7 @@ private:
void tst_QSortFilterProxyModel::testMultipleProxiesWithSelection()
{
QStringListModel model;
- const QStringList initial = QString("bravo charlie delta echo").split(" ");
+ const QStringList initial = QString("bravo charlie delta echo").split(QLatin1Char(' '));
model.setStringList(initial);
QSortFilterProxyModel proxy;
@@ -3196,7 +3196,7 @@ static bool isValid(const QItemSelection &selection)
void tst_QSortFilterProxyModel::mapSelectionFromSource()
{
QStringListModel model;
- const QStringList initial = QString("bravo charlie delta echo").split(" ");
+ const QStringList initial = QString("bravo charlie delta echo").split(QLatin1Char(' '));
model.setStringList(initial);
QSortFilterProxyModel proxy;
@@ -3205,7 +3205,7 @@ void tst_QSortFilterProxyModel::mapSelectionFromSource()
proxy.setSourceModel(&model);
// Only "delta" remains.
- QVERIFY(proxy.rowCount() == 1);
+ QCOMPARE(proxy.rowCount(), 1);
QItemSelection selection;
QModelIndex charlie = model.index(1, 0);
@@ -3220,7 +3220,7 @@ void tst_QSortFilterProxyModel::mapSelectionFromSource()
QItemSelection proxiedSelection = proxy.mapSelectionFromSource(selection);
// Only "delta" is in the mapped result.
- QVERIFY(proxiedSelection.size() == 1);
+ QCOMPARE(proxiedSelection.size(), 1);
QVERIFY(isValid(proxiedSelection));
}
@@ -3377,7 +3377,10 @@ void tst_QSortFilterProxyModel::resetInvalidate()
{
switch (test) {
case 0: break;
- case 1: reset(); break;
+ case 1:
+ beginResetModel();
+ endResetModel();
+ break;
case 2: invalidate(); break;
case 3: invalidateFilter(); break;
}
@@ -3551,11 +3554,11 @@ void tst_QSortFilterProxyModel::testParentLayoutChanged()
QStandardItem *parentItem = model.invisibleRootItem();
for (int i = 0; i < 4; ++i) {
{
- QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
+ QStandardItem *item = new QStandardItem(QLatin1String("item ") + QString::number(i));
parentItem->appendRow(item);
}
{
- QStandardItem *item = new QStandardItem(QString("item 1%0").arg(i));
+ QStandardItem *item = new QStandardItem(QLatin1String("item 1") + QString::number(i));
parentItem->appendRow(item);
parentItem = item;
}
@@ -3852,9 +3855,10 @@ void tst_QSortFilterProxyModel::hierarchyFilterInvalidation()
{
QStandardItemModel model;
for (int i = 0; i < 10; ++i) {
- QStandardItem *child = new QStandardItem(QString("Row %1").arg(i));
+ const QString rowText = QLatin1String("Row ") + QString::number(i);
+ QStandardItem *child = new QStandardItem(rowText);
for (int j = 0; j < 1; ++j) {
- child->appendRow(new QStandardItem(QString("Row %1/%2").arg(i).arg(j)));
+ child->appendRow(new QStandardItem(rowText + QLatin1Char('/') + QString::number(j)));
}
model.appendRow(child);
}
@@ -3913,7 +3917,7 @@ void tst_QSortFilterProxyModel::simpleFilterInvalidation()
{
QStandardItemModel model;
for (int i = 0; i < 2; ++i) {
- QStandardItem *child = new QStandardItem(QString("Row %1").arg(i));
+ QStandardItem *child = new QStandardItem(QLatin1String("Row ") + QString::number(i));
child->appendRow(new QStandardItem("child"));
model.appendRow(child);
}
diff --git a/tests/auto/corelib/itemmodels/qstringlistmodel/qstringlistmodel.pro b/tests/auto/corelib/itemmodels/qstringlistmodel/qstringlistmodel.pro
index e11e16b203..91a4cf306c 100644
--- a/tests/auto/corelib/itemmodels/qstringlistmodel/qstringlistmodel.pro
+++ b/tests/auto/corelib/itemmodels/qstringlistmodel/qstringlistmodel.pro
@@ -1,7 +1,5 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qstringlistmodel
QT = core testlib
HEADERS += qmodellistener.h
SOURCES += tst_qstringlistmodel.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/json/json.pro b/tests/auto/corelib/json/json.pro
index 237e20685a..b3038d7ca1 100644
--- a/tests/auto/corelib/json/json.pro
+++ b/tests/auto/corelib/json/json.pro
@@ -2,10 +2,12 @@ TARGET = tst_json
QT = core testlib
CONFIG -= app_bundle
CONFIG += testcase
-CONFIG += parallel_test
-!android:TESTDATA += test.json test.bjson test3.json test2.json
+!android:TESTDATA += bom.json test.json test.bjson test3.json test2.json
else:RESOURCES += json.qrc
+!contains(QT_CONFIG, doubleconversion):!contains(QT_CONFIG, system-doubleconversion) {
+ DEFINES += QT_NO_DOUBLECONVERSION
+}
+
SOURCES += tst_qtjson.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/json/test.bjson b/tests/auto/corelib/json/test.bjson
index 9a0515f3ef..137b4dfeff 100644
--- a/tests/auto/corelib/json/test.bjson
+++ b/tests/auto/corelib/json/test.bjson
Binary files differ
diff --git a/tests/auto/corelib/json/test.json b/tests/auto/corelib/json/test.json
index 7c935fffc8..330756894a 100644
--- a/tests/auto/corelib/json/test.json
+++ b/tests/auto/corelib/json/test.json
@@ -32,7 +32,7 @@
"array":[ ],
"object":{ },
"address": "50 St. James Street",
- "url": "http://www.JSON.org/",
+ "url": "nix",
"comment": "// /* <!-- --",
"# -- --> */": " ",
" s p a c e d " :[1,2 , 3
@@ -58,9 +58,9 @@
2e-00,
"rosebud",
{"foo": "bar"},
-{"classification":{"relevancyScore":1000,"searchUrl":{"value":"http://www.bizrate.com/iphone-cases/index__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"}},"products":{"priceSet":{"minPrice":{"value":"$0.01","integral":1},"maxPrice":{"value":"$4,833.99","integral":483399}},"product":[{"type":"PRODUCT","title":"Silicone case for iPhone 3G/ 3GS","description":"Elite Horizontal Leather Pouch for Apple iPhone 3G/3Gs - Premium quality horizontal case for your Apple iPhone 3G/3Gs. This pouch is ideal for the style conscious on the go. This great looking case is made from high-quality leather with classic black...","manufacturer":"Apple","url":{"value":"http://www.bizrate.com/silicone-case-for-iphone-3g-3gs--pid1968262863/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=1968262863","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=1968262863","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=1968262863","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=1968262863","xsize":400,"ysize":400}]},"relevancy":310711221747712.000000,"priceSet":{"minPrice":{"value":"$1.56","integral":156},"maxPrice":{"value":"$29.99","integral":2999},"stores":14},"id":1968262863,"categoryId":8515},{"type":"PRODUCT","title":"Nonslip Checkered Silicone Skin Soft Case for iPhone 4 4G","description":"Specification:Product Name Silicone Skin Case Model for Apple iPhone 4 Color Black Material Soft Silicone Skin Weight 26g Package 1 x Case for Apple iPhone 4 Description:This is a non-OEM product.Accessory Only, Phone is not included.","manufacturer":"H&B","url":{"value":"http://www.bizrate.com/nonslip-checkered-silicone-skin-soft-case-for-iphone-4-4g--pid2534935499/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2534935499","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2534935499","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2534935499","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2534935499","xsize":400,"ysize":400}]},"relevancy":175580930637824.000000,"priceSet":{"minPrice":{"value":"$0.45","integral":45},"maxPrice":{"value":"$194.95","integral":19495},"stores":34},"id":2534935499,"categoryId":8515},{"type":"PRODUCT","title":"Plastic Case for iPhone 4 - Black","description":"Description:Detachable Windmill Type Matte Hard Plastic Case Cover for iPhone 4 (Black / Magenta)Customised your iPhone with this wonderful Plastic Case which is a accessory for your iPhone 4 which is made of high quality and durable plastic, protect","manufacturer":"Griffin","url":{"value":"http://www.bizrate.com/plastic-case-for-iphone-4-black--pid2305624670/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2305624670","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2305624670","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2305624670","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2305624670","xsize":400,"ysize":400}]},"relevancy":132488642953216.000000,"priceSet":{"minPrice":{"value":"$0.99","integral":99},"maxPrice":{"value":"$303.68","integral":30368},"stores":33},"id":2305624670,"categoryId":8515},{"type":"PRODUCT","title":"Protective Silicone Case for iPhone 4","description":"Made of high quality PVC material Protects your iPhone 4 from any scratch and dirt Easy to install and remove, no any tool needed Cut-out design allows user can access all keypad / button and slot without having to remove the case","manufacturer":"Griffin","url":{"value":"http://www.bizrate.com/protective-silicone-case-for-iphone-4--pid2120981405/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2120981405","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2120981405","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2120981405","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2120981405","xsize":400,"ysize":400}]},"relevancy":108614681362432.000000,"priceSet":{"minPrice":{"value":"$1.70","integral":170},"maxPrice":{"value":"$99.99","integral":9999},"stores":11},"id":2120981405,"categoryId":8515},{"type":"PRODUCT","title":"Iphone® 4 Aerosport Case","description":"Do more than just protect your iPhone 4 with this case bundle from rooCASE. This 3 in 1 bundle include a snap-on case, screen protector and a Nike+ sensor shoe pouch that can be use on most running shoes. Color: Purple Design: Love Provides protection...","manufacturer":"Luxmo","url":{"value":"http://www.bizrate.com/iphone-4-aerosport-case--pid2203798762/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2203798762","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2203798762","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2203798762","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2203798762","xsize":400,"ysize":400}]},"relevancy":96203484168192.000000,"priceSet":{"minPrice":{"value":"$2.49","integral":249},"maxPrice":{"value":"$79.95","integral":7995},"stores":16},"id":2203798762,"categoryId":8515},{"type":"PRODUCT","title":"Case Reflect For Iphone 3G","description":"NCAA iPhone 3G faceplate features the schools primary logo silk screened on the front of the case.","manufacturer":"Griffin","url":{"value":"http://www.bizrate.com/case-reflect-for-iphone-3g--pid1114627445/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=1114627445","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=1114627445","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=1114627445","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=1114627445","xsize":400,"ysize":400}]},"relevancy":84727583211520.000000,"priceSet":{"minPrice":{"value":"$0.69","integral":69},"maxPrice":{"value":"$75.52","integral":7552},"stores":59},"id":1114627445,"categoryId":8515},{"type":"PRODUCT","title":"Infuse Protector Case for iPhone 4 Black","description":"Protect and personalize your iPhone 4 with this front and back image design Protector Case. Form-fitting front and back hard plastic covers Protects your cell phone without adding a lot of bulk Smooth glossy finish Snaps on to the front edges, sides...","manufacturer":"Luxmo","url":{"value":"http://www.bizrate.com/infuse-protector-case-for-iphone-4-black--pid2557462717/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2557462717","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2557462717","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2557462717","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2557462717","xsize":400,"ysize":400}]},"relevancy":80831066406912.000000,"priceSet":{"minPrice":{"value":"$0.59","integral":59},"maxPrice":{"value":"$79.00","integral":7900},"stores":24},"id":2557462717,"categoryId":8515},{"type":"PRODUCT","title":"Dragonfly iPhone 4 Kream Case - Black","description":"DF-0030219 - White, Kream Case for iPhone 4 by Dragon-Fly","url":{"value":"http://www.bizrate.com/dragonfly-iphone-4-kream-case-black--pid2442061740/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2442061740","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2442061740","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2442061740","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2442061740","xsize":400,"ysize":400}]},"relevancy":70900229603328.000000,"priceSet":{"minPrice":{"value":"$1.05","integral":105},"maxPrice":{"value":"$94.49","integral":9449},"stores":30},"id":2442061740,"categoryId":8515},{"type":"PRODUCT","title":"Apple iPhone 3G/3GS Silicone Case (Black)","description":"Snap on Apple iPhone 3G 3GS Synthetic Leather Hardshell Case! Premium Qualtiy Synthetic Leather cover provides style, comfort, and protection to your iPhone 3G & 3GS. It also adds a sophisticated elegance and cool to your fashion. The case allows Quick...","manufacturer":"Luxmo","url":{"value":"http://www.bizrate.com/apple-iphone-3g3gs-silicone-case-black--pid2004746863/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2004746863","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2004746863","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2004746863","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2004746863","xsize":400,"ysize":400}]},"relevancy":65194915004416.000000,"priceSet":{"minPrice":{"value":"$0.01","integral":1},"maxPrice":{"value":"$414.99","integral":41499},"stores":39},"id":2004746863,"categoryId":8515},{"type":"PRODUCT","title":"Otterbox iPhone 4 Defender Case - Black","description":"Your iPhone 4 has become a big part of your life. With FaceTime video, retina display, multitasking, HD video recording and more - you've got a lot to lose. You won't find a tougher case than the OtterBox Defender Series for iPhone 4. This three-layer...","manufacturer":"Universal","url":{"value":"http://www.bizrate.com/otterbox-iphone-4-defender-case-black--pid2584611575/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2584611575","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2584611575","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2584611575","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2584611575","xsize":400,"ysize":400}]},"relevancy":61515478597632.000000,"priceSet":{"minPrice":{"value":"$3.28","integral":328},"maxPrice":{"value":"$110.65","integral":11065},"stores":25},"id":2584611575,"categoryId":8515}],"includedResults":10,"totalResults":2000}},
-{"classification":{"relevancyScore":1000,"searchUrl":{"value":"http://www.bizrate.com/iphone-cases/index__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"}},"products":{"priceSet":{"minPrice":{"value":"$0.01","integral":1},"maxPrice":{"value":"$4,833.99","integral":483399}},"product":[{"type":"PRODUCT","title":"Silicone case for iPhone 3G/ 3GS","description":"Elite Horizontal Leather Pouch for Apple iPhone 3G/3Gs - Premium quality horizontal case for your Apple iPhone 3G/3Gs. This pouch is ideal for the style conscious on the go. This great looking case is made from high-quality leather with classic black...","manufacturer":"Apple","url":{"value":"http://www.bizrate.com/silicone-case-for-iphone-3g-3gs--pid1968262863/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=1968262863","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=1968262863","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=1968262863","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=1968262863","xsize":400,"ysize":400}]},"relevancy":310711221747712.000000,"priceSet":{"minPrice":{"value":"$1.56","integral":156},"maxPrice":{"value":"$29.99","integral":2999},"stores":14},"id":1968262863,"categoryId":8515},{"type":"PRODUCT","title":"Nonslip Checkered Silicone Skin Soft Case for iPhone 4 4G","description":"Specification:Product Name Silicone Skin Case Model for Apple iPhone 4 Color Black Material Soft Silicone Skin Weight 26g Package 1 x Case for Apple iPhone 4 Description:This is a non-OEM product.Accessory Only, Phone is not included.","manufacturer":"H&B","url":{"value":"http://www.bizrate.com/nonslip-checkered-silicone-skin-soft-case-for-iphone-4-4g--pid2534935499/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2534935499","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2534935499","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2534935499","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2534935499","xsize":400,"ysize":400}]},"relevancy":175580930637824.000000,"priceSet":{"minPrice":{"value":"$0.45","integral":45},"maxPrice":{"value":"$194.95","integral":19495},"stores":34},"id":2534935499,"categoryId":8515},{"type":"PRODUCT","title":"Plastic Case for iPhone 4 - Black","description":"Description:Detachable Windmill Type Matte Hard Plastic Case Cover for iPhone 4 (Black / Magenta)Customised your iPhone with this wonderful Plastic Case which is a accessory for your iPhone 4 which is made of high quality and durable plastic, protect","manufacturer":"Griffin","url":{"value":"http://www.bizrate.com/plastic-case-for-iphone-4-black--pid2305624670/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2305624670","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2305624670","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2305624670","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2305624670","xsize":400,"ysize":400}]},"relevancy":132488642953216.000000,"priceSet":{"minPrice":{"value":"$0.99","integral":99},"maxPrice":{"value":"$303.68","integral":30368},"stores":33},"id":2305624670,"categoryId":8515},{"type":"PRODUCT","title":"Protective Silicone Case for iPhone 4","description":"Made of high quality PVC material Protects your iPhone 4 from any scratch and dirt Easy to install and remove, no any tool needed Cut-out design allows user can access all keypad / button and slot without having to remove the case","manufacturer":"Griffin","url":{"value":"http://www.bizrate.com/protective-silicone-case-for-iphone-4--pid2120981405/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2120981405","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2120981405","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2120981405","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2120981405","xsize":400,"ysize":400}]},"relevancy":108614681362432.000000,"priceSet":{"minPrice":{"value":"$1.70","integral":170},"maxPrice":{"value":"$99.99","integral":9999},"stores":11},"id":2120981405,"categoryId":8515},{"type":"PRODUCT","title":"Iphone® 4 Aerosport Case","description":"Do more than just protect your iPhone 4 with this case bundle from rooCASE. This 3 in 1 bundle include a snap-on case, screen protector and a Nike+ sensor shoe pouch that can be use on most running shoes. Color: Purple Design: Love Provides protection...","manufacturer":"Luxmo","url":{"value":"http://www.bizrate.com/iphone-4-aerosport-case--pid2203798762/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2203798762","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2203798762","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2203798762","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2203798762","xsize":400,"ysize":400}]},"relevancy":96203484168192.000000,"priceSet":{"minPrice":{"value":"$2.49","integral":249},"maxPrice":{"value":"$79.95","integral":7995},"stores":16},"id":2203798762,"categoryId":8515},{"type":"PRODUCT","title":"Case Reflect For Iphone 3G","description":"NCAA iPhone 3G faceplate features the schools primary logo silk screened on the front of the case.","manufacturer":"Griffin","url":{"value":"http://www.bizrate.com/case-reflect-for-iphone-3g--pid1114627445/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=1114627445","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=1114627445","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=1114627445","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=1114627445","xsize":400,"ysize":400}]},"relevancy":84727583211520.000000,"priceSet":{"minPrice":{"value":"$0.69","integral":69},"maxPrice":{"value":"$75.52","integral":7552},"stores":59},"id":1114627445,"categoryId":8515},{"type":"PRODUCT","title":"Infuse Protector Case for iPhone 4 Black","description":"Protect and personalize your iPhone 4 with this front and back image design Protector Case. Form-fitting front and back hard plastic covers Protects your cell phone without adding a lot of bulk Smooth glossy finish Snaps on to the front edges, sides...","manufacturer":"Luxmo","url":{"value":"http://www.bizrate.com/infuse-protector-case-for-iphone-4-black--pid2557462717/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2557462717","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2557462717","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2557462717","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2557462717","xsize":400,"ysize":400}]},"relevancy":80831066406912.000000,"priceSet":{"minPrice":{"value":"$0.59","integral":59},"maxPrice":{"value":"$79.00","integral":7900},"stores":24},"id":2557462717,"categoryId":8515},{"type":"PRODUCT","title":"Dragonfly iPhone 4 Kream Case - Black","description":"DF-0030219 - White, Kream Case for iPhone 4 by Dragon-Fly","url":{"value":"http://www.bizrate.com/dragonfly-iphone-4-kream-case-black--pid2442061740/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2442061740","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2442061740","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2442061740","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2442061740","xsize":400,"ysize":400}]},"relevancy":70900229603328.000000,"priceSet":{"minPrice":{"value":"$1.05","integral":105},"maxPrice":{"value":"$94.49","integral":9449},"stores":30},"id":2442061740,"categoryId":8515},{"type":"PRODUCT","title":"Apple iPhone 3G/3GS Silicone Case (Black)","description":"Snap on Apple iPhone 3G 3GS Synthetic Leather Hardshell Case! Premium Qualtiy Synthetic Leather cover provides style, comfort, and protection to your iPhone 3G & 3GS. It also adds a sophisticated elegance and cool to your fashion. The case allows Quick...","manufacturer":"Luxmo","url":{"value":"http://www.bizrate.com/apple-iphone-3g3gs-silicone-case-black--pid2004746863/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2004746863","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2004746863","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2004746863","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2004746863","xsize":400,"ysize":400}]},"relevancy":65194915004416.000000,"priceSet":{"minPrice":{"value":"$0.01","integral":1},"maxPrice":{"value":"$414.99","integral":41499},"stores":39},"id":2004746863,"categoryId":8515},{"type":"PRODUCT","title":"Otterbox iPhone 4 Defender Case - Black","description":"Your iPhone 4 has become a big part of your life. With FaceTime video, retina display, multitasking, HD video recording and more - you've got a lot to lose. You won't find a tougher case than the OtterBox Defender Series for iPhone 4. This three-layer...","manufacturer":"Universal","url":{"value":"http://www.bizrate.com/otterbox-iphone-4-defender-case-black--pid2584611575/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2584611575","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2584611575","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2584611575","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2584611575","xsize":400,"ysize":400}]},"relevancy":61515478597632.000000,"priceSet":{"minPrice":{"value":"$3.28","integral":328},"maxPrice":{"value":"$110.65","integral":11065},"stores":25},"id":2584611575,"categoryId":8515}],"includedResults":10,"totalResults":2000}},
-{"classification":{"relevancyScore":1000,"searchUrl":{"value":"http://www.bizrate.com/iphone-cases/index__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"}},"products":{"priceSet":{"minPrice":{"value":"$0.01","integral":1},"maxPrice":{"value":"$4,833.99","integral":483399}},"product":[{"type":"PRODUCT","title":"Silicone case for iPhone 3G/ 3GS","description":"Elite Horizontal Leather Pouch for Apple iPhone 3G/3Gs - Premium quality horizontal case for your Apple iPhone 3G/3Gs. This pouch is ideal for the style conscious on the go. This great looking case is made from high-quality leather with classic black...","manufacturer":"Apple","url":{"value":"http://www.bizrate.com/silicone-case-for-iphone-3g-3gs--pid1968262863/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=1968262863","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=1968262863","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=1968262863","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=1968262863","xsize":400,"ysize":400}]},"relevancy":310711221747712.000000,"priceSet":{"minPrice":{"value":"$1.56","integral":156},"maxPrice":{"value":"$29.99","integral":2999},"stores":14},"id":1968262863,"categoryId":8515},{"type":"PRODUCT","title":"Nonslip Checkered Silicone Skin Soft Case for iPhone 4 4G","description":"Specification:Product Name Silicone Skin Case Model for Apple iPhone 4 Color Black Material Soft Silicone Skin Weight 26g Package 1 x Case for Apple iPhone 4 Description:This is a non-OEM product.Accessory Only, Phone is not included.","manufacturer":"H&B","url":{"value":"http://www.bizrate.com/nonslip-checkered-silicone-skin-soft-case-for-iphone-4-4g--pid2534935499/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2534935499","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2534935499","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2534935499","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2534935499","xsize":400,"ysize":400}]},"relevancy":175580930637824.000000,"priceSet":{"minPrice":{"value":"$0.45","integral":45},"maxPrice":{"value":"$194.95","integral":19495},"stores":34},"id":2534935499,"categoryId":8515},{"type":"PRODUCT","title":"Plastic Case for iPhone 4 - Black","description":"Description:Detachable Windmill Type Matte Hard Plastic Case Cover for iPhone 4 (Black / Magenta)Customised your iPhone with this wonderful Plastic Case which is a accessory for your iPhone 4 which is made of high quality and durable plastic, protect","manufacturer":"Griffin","url":{"value":"http://www.bizrate.com/plastic-case-for-iphone-4-black--pid2305624670/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2305624670","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2305624670","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2305624670","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2305624670","xsize":400,"ysize":400}]},"relevancy":132488642953216.000000,"priceSet":{"minPrice":{"value":"$0.99","integral":99},"maxPrice":{"value":"$303.68","integral":30368},"stores":33},"id":2305624670,"categoryId":8515},{"type":"PRODUCT","title":"Protective Silicone Case for iPhone 4","description":"Made of high quality PVC material Protects your iPhone 4 from any scratch and dirt Easy to install and remove, no any tool needed Cut-out design allows user can access all keypad / button and slot without having to remove the case","manufacturer":"Griffin","url":{"value":"http://www.bizrate.com/protective-silicone-case-for-iphone-4--pid2120981405/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2120981405","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2120981405","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2120981405","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2120981405","xsize":400,"ysize":400}]},"relevancy":108614681362432.000000,"priceSet":{"minPrice":{"value":"$1.70","integral":170},"maxPrice":{"value":"$99.99","integral":9999},"stores":11},"id":2120981405,"categoryId":8515},{"type":"PRODUCT","title":"Iphone® 4 Aerosport Case","description":"Do more than just protect your iPhone 4 with this case bundle from rooCASE. This 3 in 1 bundle include a snap-on case, screen protector and a Nike+ sensor shoe pouch that can be use on most running shoes. Color: Purple Design: Love Provides protection...","manufacturer":"Luxmo","url":{"value":"http://www.bizrate.com/iphone-4-aerosport-case--pid2203798762/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2203798762","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2203798762","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2203798762","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2203798762","xsize":400,"ysize":400}]},"relevancy":96203484168192.000000,"priceSet":{"minPrice":{"value":"$2.49","integral":249},"maxPrice":{"value":"$79.95","integral":7995},"stores":16},"id":2203798762,"categoryId":8515},{"type":"PRODUCT","title":"Case Reflect For Iphone 3G","description":"NCAA iPhone 3G faceplate features the schools primary logo silk screened on the front of the case.","manufacturer":"Griffin","url":{"value":"http://www.bizrate.com/case-reflect-for-iphone-3g--pid1114627445/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=1114627445","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=1114627445","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=1114627445","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=1114627445","xsize":400,"ysize":400}]},"relevancy":84727583211520.000000,"priceSet":{"minPrice":{"value":"$0.69","integral":69},"maxPrice":{"value":"$75.52","integral":7552},"stores":59},"id":1114627445,"categoryId":8515},{"type":"PRODUCT","title":"Infuse Protector Case for iPhone 4 Black","description":"Protect and personalize your iPhone 4 with this front and back image design Protector Case. Form-fitting front and back hard plastic covers Protects your cell phone without adding a lot of bulk Smooth glossy finish Snaps on to the front edges, sides...","manufacturer":"Luxmo","url":{"value":"http://www.bizrate.com/infuse-protector-case-for-iphone-4-black--pid2557462717/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2557462717","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2557462717","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2557462717","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2557462717","xsize":400,"ysize":400}]},"relevancy":80831066406912.000000,"priceSet":{"minPrice":{"value":"$0.59","integral":59},"maxPrice":{"value":"$79.00","integral":7900},"stores":24},"id":2557462717,"categoryId":8515},{"type":"PRODUCT","title":"Dragonfly iPhone 4 Kream Case - Black","description":"DF-0030219 - White, Kream Case for iPhone 4 by Dragon-Fly","url":{"value":"http://www.bizrate.com/dragonfly-iphone-4-kream-case-black--pid2442061740/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2442061740","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2442061740","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2442061740","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2442061740","xsize":400,"ysize":400}]},"relevancy":70900229603328.000000,"priceSet":{"minPrice":{"value":"$1.05","integral":105},"maxPrice":{"value":"$94.49","integral":9449},"stores":30},"id":2442061740,"categoryId":8515},{"type":"PRODUCT","title":"Apple iPhone 3G/3GS Silicone Case (Black)","description":"Snap on Apple iPhone 3G 3GS Synthetic Leather Hardshell Case! Premium Qualtiy Synthetic Leather cover provides style, comfort, and protection to your iPhone 3G & 3GS. It also adds a sophisticated elegance and cool to your fashion. The case allows Quick...","manufacturer":"Luxmo","url":{"value":"http://www.bizrate.com/apple-iphone-3g3gs-silicone-case-black--pid2004746863/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2004746863","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2004746863","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2004746863","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2004746863","xsize":400,"ysize":400}]},"relevancy":65194915004416.000000,"priceSet":{"minPrice":{"value":"$0.01","integral":1},"maxPrice":{"value":"$414.99","integral":41499},"stores":39},"id":2004746863,"categoryId":8515},{"type":"PRODUCT","title":"Otterbox iPhone 4 Defender Case - Black","description":"Your iPhone 4 has become a big part of your life. With FaceTime video, retina display, multitasking, HD video recording and more - you've got a lot to lose. You won't find a tougher case than the OtterBox Defender Series for iPhone 4. This three-layer...","manufacturer":"Universal","url":{"value":"http://www.bizrate.com/otterbox-iphone-4-defender-case-black--pid2584611575/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2584611575","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2584611575","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2584611575","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2584611575","xsize":400,"ysize":400}]},"relevancy":61515478597632.000000,"priceSet":{"minPrice":{"value":"$3.28","integral":328},"maxPrice":{"value":"$110.65","integral":11065},"stores":25},"id":2584611575,"categoryId":8515}],"includedResults":10,"totalResults":2000}},
-{"classification":{"relevancyScore":1000,"searchUrl":{"value":"http://www.bizrate.com/iphone-cases/index__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"}},"products":{"priceSet":{"minPrice":{"value":"$0.01","integral":1},"maxPrice":{"value":"$4,833.99","integral":483399}},"product":[{"type":"PRODUCT","title":"Silicone case for iPhone 3G/ 3GS","description":"Elite Horizontal Leather Pouch for Apple iPhone 3G/3Gs - Premium quality horizontal case for your Apple iPhone 3G/3Gs. This pouch is ideal for the style conscious on the go. This great looking case is made from high-quality leather with classic black...","manufacturer":"Apple","url":{"value":"http://www.bizrate.com/silicone-case-for-iphone-3g-3gs--pid1968262863/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=1968262863","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=1968262863","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=1968262863","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=1968262863","xsize":400,"ysize":400}]},"relevancy":310711221747712.000000,"priceSet":{"minPrice":{"value":"$1.56","integral":156},"maxPrice":{"value":"$29.99","integral":2999},"stores":14},"id":1968262863,"categoryId":8515},{"type":"PRODUCT","title":"Nonslip Checkered Silicone Skin Soft Case for iPhone 4 4G","description":"Specification:Product Name Silicone Skin Case Model for Apple iPhone 4 Color Black Material Soft Silicone Skin Weight 26g Package 1 x Case for Apple iPhone 4 Description:This is a non-OEM product.Accessory Only, Phone is not included.","manufacturer":"H&B","url":{"value":"http://www.bizrate.com/nonslip-checkered-silicone-skin-soft-case-for-iphone-4-4g--pid2534935499/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2534935499","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2534935499","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2534935499","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2534935499","xsize":400,"ysize":400}]},"relevancy":175580930637824.000000,"priceSet":{"minPrice":{"value":"$0.45","integral":45},"maxPrice":{"value":"$194.95","integral":19495},"stores":34},"id":2534935499,"categoryId":8515},{"type":"PRODUCT","title":"Plastic Case for iPhone 4 - Black","description":"Description:Detachable Windmill Type Matte Hard Plastic Case Cover for iPhone 4 (Black / Magenta)Customised your iPhone with this wonderful Plastic Case which is a accessory for your iPhone 4 which is made of high quality and durable plastic, protect","manufacturer":"Griffin","url":{"value":"http://www.bizrate.com/plastic-case-for-iphone-4-black--pid2305624670/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2305624670","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2305624670","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2305624670","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2305624670","xsize":400,"ysize":400}]},"relevancy":132488642953216.000000,"priceSet":{"minPrice":{"value":"$0.99","integral":99},"maxPrice":{"value":"$303.68","integral":30368},"stores":33},"id":2305624670,"categoryId":8515},{"type":"PRODUCT","title":"Protective Silicone Case for iPhone 4","description":"Made of high quality PVC material Protects your iPhone 4 from any scratch and dirt Easy to install and remove, no any tool needed Cut-out design allows user can access all keypad / button and slot without having to remove the case","manufacturer":"Griffin","url":{"value":"http://www.bizrate.com/protective-silicone-case-for-iphone-4--pid2120981405/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2120981405","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2120981405","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2120981405","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2120981405","xsize":400,"ysize":400}]},"relevancy":108614681362432.000000,"priceSet":{"minPrice":{"value":"$1.70","integral":170},"maxPrice":{"value":"$99.99","integral":9999},"stores":11},"id":2120981405,"categoryId":8515},{"type":"PRODUCT","title":"Iphone® 4 Aerosport Case","description":"Do more than just protect your iPhone 4 with this case bundle from rooCASE. This 3 in 1 bundle include a snap-on case, screen protector and a Nike+ sensor shoe pouch that can be use on most running shoes. Color: Purple Design: Love Provides protection...","manufacturer":"Luxmo","url":{"value":"http://www.bizrate.com/iphone-4-aerosport-case--pid2203798762/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2203798762","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2203798762","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2203798762","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2203798762","xsize":400,"ysize":400}]},"relevancy":96203484168192.000000,"priceSet":{"minPrice":{"value":"$2.49","integral":249},"maxPrice":{"value":"$79.95","integral":7995},"stores":16},"id":2203798762,"categoryId":8515},{"type":"PRODUCT","title":"Case Reflect For Iphone 3G","description":"NCAA iPhone 3G faceplate features the schools primary logo silk screened on the front of the case.","manufacturer":"Griffin","url":{"value":"http://www.bizrate.com/case-reflect-for-iphone-3g--pid1114627445/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=1114627445","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=1114627445","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=1114627445","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=1114627445","xsize":400,"ysize":400}]},"relevancy":84727583211520.000000,"priceSet":{"minPrice":{"value":"$0.69","integral":69},"maxPrice":{"value":"$75.52","integral":7552},"stores":59},"id":1114627445,"categoryId":8515},{"type":"PRODUCT","title":"Infuse Protector Case for iPhone 4 Black","description":"Protect and personalize your iPhone 4 with this front and back image design Protector Case. Form-fitting front and back hard plastic covers Protects your cell phone without adding a lot of bulk Smooth glossy finish Snaps on to the front edges, sides...","manufacturer":"Luxmo","url":{"value":"http://www.bizrate.com/infuse-protector-case-for-iphone-4-black--pid2557462717/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2557462717","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2557462717","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2557462717","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2557462717","xsize":400,"ysize":400}]},"relevancy":80831066406912.000000,"priceSet":{"minPrice":{"value":"$0.59","integral":59},"maxPrice":{"value":"$79.00","integral":7900},"stores":24},"id":2557462717,"categoryId":8515},{"type":"PRODUCT","title":"Dragonfly iPhone 4 Kream Case - Black","description":"DF-0030219 - White, Kream Case for iPhone 4 by Dragon-Fly","url":{"value":"http://www.bizrate.com/dragonfly-iphone-4-kream-case-black--pid2442061740/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2442061740","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2442061740","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2442061740","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2442061740","xsize":400,"ysize":400}]},"relevancy":70900229603328.000000,"priceSet":{"minPrice":{"value":"$1.05","integral":105},"maxPrice":{"value":"$94.49","integral":9449},"stores":30},"id":2442061740,"categoryId":8515},{"type":"PRODUCT","title":"Apple iPhone 3G/3GS Silicone Case (Black)","description":"Snap on Apple iPhone 3G 3GS Synthetic Leather Hardshell Case! Premium Qualtiy Synthetic Leather cover provides style, comfort, and protection to your iPhone 3G & 3GS. It also adds a sophisticated elegance and cool to your fashion. The case allows Quick...","manufacturer":"Luxmo","url":{"value":"http://www.bizrate.com/apple-iphone-3g3gs-silicone-case-black--pid2004746863/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2004746863","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2004746863","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2004746863","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2004746863","xsize":400,"ysize":400}]},"relevancy":65194915004416.000000,"priceSet":{"minPrice":{"value":"$0.01","integral":1},"maxPrice":{"value":"$414.99","integral":41499},"stores":39},"id":2004746863,"categoryId":8515},{"type":"PRODUCT","title":"Otterbox iPhone 4 Defender Case - Black","description":"Your iPhone 4 has become a big part of your life. With FaceTime video, retina display, multitasking, HD video recording and more - you've got a lot to lose. You won't find a tougher case than the OtterBox Defender Series for iPhone 4. This three-layer...","manufacturer":"Universal","url":{"value":"http://www.bizrate.com/otterbox-iphone-4-defender-case-black--pid2584611575/compareprices__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html"},"images":{"image":[{"value":"http://image10.bizrate-images.com/resize?sq=60&uid=2584611575","xsize":60,"ysize":60},{"value":"http://image10.bizrate-images.com/resize?sq=100&uid=2584611575","xsize":100,"ysize":100},{"value":"http://image10.bizrate-images.com/resize?sq=160&uid=2584611575","xsize":160,"ysize":160},{"value":"http://image10.bizrate-images.com/resize?sq=400&uid=2584611575","xsize":400,"ysize":400}]},"relevancy":61515478597632.000000,"priceSet":{"minPrice":{"value":"$3.28","integral":328},"maxPrice":{"value":"$110.65","integral":11065},"stores":25},"id":2584611575,"categoryId":8515}],"includedResults":10,"totalResults":2000}}
+{"classification":{"relevancyScore":1000,"searchUrl":{"value":"nix"}},"products":{"priceSet":{"minPrice":{"value":"$0.01","integral":1},"maxPrice":{"value":"$4,833.99","integral":483399}},"product":[{"type":"PRODUCT","title":"Silicone c","description":"Elite Hori","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":310711221747712.000000,"priceSet":{"minPrice":{"value":"$1.56","integral":156},"maxPrice":{"value":"$29.99","integral":2999},"stores":14},"id":1968262863,"categoryId":8515},{"type":"PRODUCT","title":"Nonslip Ch","description":"Specificat","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":175580930637824.000000,"priceSet":{"minPrice":{"value":"$0.45","integral":45},"maxPrice":{"value":"$194.95","integral":19495},"stores":34},"id":2534935499,"categoryId":8515},{"type":"PRODUCT","title":"Plastic Ca","description":"Descriptio","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":132488642953216.000000,"priceSet":{"minPrice":{"value":"$0.99","integral":99},"maxPrice":{"value":"$303.68","integral":30368},"stores":33},"id":2305624670,"categoryId":8515},{"type":"PRODUCT","title":"Protective","description":"Made of hi","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":108614681362432.000000,"priceSet":{"minPrice":{"value":"$1.70","integral":170},"maxPrice":{"value":"$99.99","integral":9999},"stores":11},"id":2120981405,"categoryId":8515},{"type":"PRODUCT","title":"P® 4","description":"Do more th","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":96203484168192.000000,"priceSet":{"minPrice":{"value":"$2.49","integral":249},"maxPrice":{"value":"$79.95","integral":7995},"stores":16},"id":2203798762,"categoryId":8515},{"type":"PRODUCT","title":"Case Refle","description":"NCAA iPhon","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":84727583211520.000000,"priceSet":{"minPrice":{"value":"$0.69","integral":69},"maxPrice":{"value":"$75.52","integral":7552},"stores":59},"id":1114627445,"categoryId":8515},{"type":"PRODUCT","title":"Infuse Pro","description":"Protect an","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":80831066406912.000000,"priceSet":{"minPrice":{"value":"$0.59","integral":59},"maxPrice":{"value":"$79.00","integral":7900},"stores":24},"id":2557462717,"categoryId":8515},{"type":"PRODUCT","title":"Dragonfly ","description":"d","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":70900229603328.000000,"priceSet":{"minPrice":{"value":"$1.05","integral":105},"maxPrice":{"value":"$94.49","integral":9449},"stores":30},"id":2442061740,"categoryId":8515},{"type":"PRODUCT","title":"Pho","description":"Snap on Ap","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":65194915004416.000000,"priceSet":{"minPrice":{"value":"$0.01","integral":1},"maxPrice":{"value":"$414.99","integral":41499},"stores":39},"id":2004746863,"categoryId":8515},{"type":"PRODUCT","title":"Otterbox i","description":"Your iPhon","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":61515478597632.000000,"priceSet":{"minPrice":{"value":"$3.28","integral":328},"maxPrice":{"value":"$110.65","integral":11065},"stores":25},"id":2584611575,"categoryId":8515}],"includedResults":10,"totalResults":2000}},
+{"classification":{"relevancyScore":1000,"searchUrl":{"value":"nix"}},"products":{"priceSet":{"minPrice":{"value":"$0.01","integral":1},"maxPrice":{"value":"$4,833.99","integral":483399}},"product":[{"type":"PRODUCT","title":"Silicone c","description":"Elite Hori","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":310711221747712.000000,"priceSet":{"minPrice":{"value":"$1.56","integral":156},"maxPrice":{"value":"$29.99","integral":2999},"stores":14},"id":1968262863,"categoryId":8515},{"type":"PRODUCT","title":"Nonslip Ch","description":"Specificat","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":175580930637824.000000,"priceSet":{"minPrice":{"value":"$0.45","integral":45},"maxPrice":{"value":"$194.95","integral":19495},"stores":34},"id":2534935499,"categoryId":8515},{"type":"PRODUCT","title":"Plastic Ca","description":"Descriptio","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":132488642953216.000000,"priceSet":{"minPrice":{"value":"$0.99","integral":99},"maxPrice":{"value":"$303.68","integral":30368},"stores":33},"id":2305624670,"categoryId":8515},{"type":"PRODUCT","title":"Protective","description":"Made of hi","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":108614681362432.000000,"priceSet":{"minPrice":{"value":"$1.70","integral":170},"maxPrice":{"value":"$99.99","integral":9999},"stores":11},"id":2120981405,"categoryId":8515},{"type":"PRODUCT","title":"P® 4","description":"Do more th","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":96203484168192.000000,"priceSet":{"minPrice":{"value":"$2.49","integral":249},"maxPrice":{"value":"$79.95","integral":7995},"stores":16},"id":2203798762,"categoryId":8515},{"type":"PRODUCT","title":"Case Refle","description":"NCAA iPhon","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":84727583211520.000000,"priceSet":{"minPrice":{"value":"$0.69","integral":69},"maxPrice":{"value":"$75.52","integral":7552},"stores":59},"id":1114627445,"categoryId":8515},{"type":"PRODUCT","title":"Infuse Pro","description":"Protect an","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":80831066406912.000000,"priceSet":{"minPrice":{"value":"$0.59","integral":59},"maxPrice":{"value":"$79.00","integral":7900},"stores":24},"id":2557462717,"categoryId":8515},{"type":"PRODUCT","title":"Dragonfly ","description":"d","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":70900229603328.000000,"priceSet":{"minPrice":{"value":"$1.05","integral":105},"maxPrice":{"value":"$94.49","integral":9449},"stores":30},"id":2442061740,"categoryId":8515},{"type":"PRODUCT","title":"Pho","description":"Snap on Ap","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":65194915004416.000000,"priceSet":{"minPrice":{"value":"$0.01","integral":1},"maxPrice":{"value":"$414.99","integral":41499},"stores":39},"id":2004746863,"categoryId":8515},{"type":"PRODUCT","title":"Otterbox i","description":"Your iPhon","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":61515478597632.000000,"priceSet":{"minPrice":{"value":"$3.28","integral":328},"maxPrice":{"value":"$110.65","integral":11065},"stores":25},"id":2584611575,"categoryId":8515}],"includedResults":10,"totalResults":2000}},
+{"classification":{"relevancyScore":1000,"searchUrl":{"value":"nix"}},"products":{"priceSet":{"minPrice":{"value":"$0.01","integral":1},"maxPrice":{"value":"$4,833.99","integral":483399}},"product":[{"type":"PRODUCT","title":"Silicone c","description":"Elite Hori","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":310711221747712.000000,"priceSet":{"minPrice":{"value":"$1.56","integral":156},"maxPrice":{"value":"$29.99","integral":2999},"stores":14},"id":1968262863,"categoryId":8515},{"type":"PRODUCT","title":"Nonslip Ch","description":"Specificat","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":175580930637824.000000,"priceSet":{"minPrice":{"value":"$0.45","integral":45},"maxPrice":{"value":"$194.95","integral":19495},"stores":34},"id":2534935499,"categoryId":8515},{"type":"PRODUCT","title":"Plastic Ca","description":"Descriptio","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":132488642953216.000000,"priceSet":{"minPrice":{"value":"$0.99","integral":99},"maxPrice":{"value":"$303.68","integral":30368},"stores":33},"id":2305624670,"categoryId":8515},{"type":"PRODUCT","title":"Protective","description":"Made of hi","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":108614681362432.000000,"priceSet":{"minPrice":{"value":"$1.70","integral":170},"maxPrice":{"value":"$99.99","integral":9999},"stores":11},"id":2120981405,"categoryId":8515},{"type":"PRODUCT","title":"P® 4","description":"Do more th","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":96203484168192.000000,"priceSet":{"minPrice":{"value":"$2.49","integral":249},"maxPrice":{"value":"$79.95","integral":7995},"stores":16},"id":2203798762,"categoryId":8515},{"type":"PRODUCT","title":"Case Refle","description":"NCAA iPhon","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":84727583211520.000000,"priceSet":{"minPrice":{"value":"$0.69","integral":69},"maxPrice":{"value":"$75.52","integral":7552},"stores":59},"id":1114627445,"categoryId":8515},{"type":"PRODUCT","title":"Infuse Pro","description":"Protect an","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":80831066406912.000000,"priceSet":{"minPrice":{"value":"$0.59","integral":59},"maxPrice":{"value":"$79.00","integral":7900},"stores":24},"id":2557462717,"categoryId":8515},{"type":"PRODUCT","title":"Dragonfly ","description":"d","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":70900229603328.000000,"priceSet":{"minPrice":{"value":"$1.05","integral":105},"maxPrice":{"value":"$94.49","integral":9449},"stores":30},"id":2442061740,"categoryId":8515},{"type":"PRODUCT","title":"Pho","description":"Snap on Ap","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":65194915004416.000000,"priceSet":{"minPrice":{"value":"$0.01","integral":1},"maxPrice":{"value":"$414.99","integral":41499},"stores":39},"id":2004746863,"categoryId":8515},{"type":"PRODUCT","title":"Otterbox i","description":"Your iPhon","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":61515478597632.000000,"priceSet":{"minPrice":{"value":"$3.28","integral":328},"maxPrice":{"value":"$110.65","integral":11065},"stores":25},"id":2584611575,"categoryId":8515}],"includedResults":10,"totalResults":2000}},
+{"classification":{"relevancyScore":1000,"searchUrl":{"value":"nix"}},"products":{"priceSet":{"minPrice":{"value":"$0.01","integral":1},"maxPrice":{"value":"$4,833.99","integral":483399}},"product":[{"type":"PRODUCT","title":"Silicone c","description":"Elite Hori","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":310711221747712.000000,"priceSet":{"minPrice":{"value":"$1.56","integral":156},"maxPrice":{"value":"$29.99","integral":2999},"stores":14},"id":1968262863,"categoryId":8515},{"type":"PRODUCT","title":"Nonslip Ch","description":"Specificat","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":175580930637824.000000,"priceSet":{"minPrice":{"value":"$0.45","integral":45},"maxPrice":{"value":"$194.95","integral":19495},"stores":34},"id":2534935499,"categoryId":8515},{"type":"PRODUCT","title":"Plastic Ca","description":"Descriptio","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":132488642953216.000000,"priceSet":{"minPrice":{"value":"$0.99","integral":99},"maxPrice":{"value":"$303.68","integral":30368},"stores":33},"id":2305624670,"categoryId":8515},{"type":"PRODUCT","title":"Protective","description":"Made of hi","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":108614681362432.000000,"priceSet":{"minPrice":{"value":"$1.70","integral":170},"maxPrice":{"value":"$99.99","integral":9999},"stores":11},"id":2120981405,"categoryId":8515},{"type":"PRODUCT","title":"P® 4","description":"Do more th","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":96203484168192.000000,"priceSet":{"minPrice":{"value":"$2.49","integral":249},"maxPrice":{"value":"$79.95","integral":7995},"stores":16},"id":2203798762,"categoryId":8515},{"type":"PRODUCT","title":"Case Refle","description":"NCAA iPhon","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":84727583211520.000000,"priceSet":{"minPrice":{"value":"$0.69","integral":69},"maxPrice":{"value":"$75.52","integral":7552},"stores":59},"id":1114627445,"categoryId":8515},{"type":"PRODUCT","title":"Infuse Pro","description":"Protect an","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":80831066406912.000000,"priceSet":{"minPrice":{"value":"$0.59","integral":59},"maxPrice":{"value":"$79.00","integral":7900},"stores":24},"id":2557462717,"categoryId":8515},{"type":"PRODUCT","title":"Dragonfly ","description":"d","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":70900229603328.000000,"priceSet":{"minPrice":{"value":"$1.05","integral":105},"maxPrice":{"value":"$94.49","integral":9449},"stores":30},"id":2442061740,"categoryId":8515},{"type":"PRODUCT","title":"Pho","description":"Snap on Ap","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":65194915004416.000000,"priceSet":{"minPrice":{"value":"$0.01","integral":1},"maxPrice":{"value":"$414.99","integral":41499},"stores":39},"id":2004746863,"categoryId":8515},{"type":"PRODUCT","title":"Otterbox i","description":"Your iPhon","manufacturer":"someone","url":{"value":"nix"},"images":{"image":[{"value":"nix","xsize":60,"ysize":60},{"value":"nix","xsize":100,"ysize":100},{"value":"nix","xsize":160,"ysize":160},{"value":"nix","xsize":400,"ysize":400}]},"relevancy":61515478597632.000000,"priceSet":{"minPrice":{"value":"$3.28","integral":328},"maxPrice":{"value":"$110.65","integral":11065},"stores":25},"id":2584611575,"categoryId":8515}],"includedResults":10,"totalResults":2000}}
]
diff --git a/tests/auto/corelib/json/tst_qtjson.cpp b/tests/auto/corelib/json/tst_qtjson.cpp
index 884c4b3850..165464e7b9 100644
--- a/tests/auto/corelib/json/tst_qtjson.cpp
+++ b/tests/auto/corelib/json/tst_qtjson.cpp
@@ -46,14 +46,9 @@
class tst_QtJson: public QObject
{
Q_OBJECT
-public:
- tst_QtJson(QObject *parent = 0);
private Q_SLOTS:
void initTestCase();
- void cleanupTestCase();
- void init();
- void cleanup();
void testValueSimple();
void testNumbers();
@@ -151,10 +146,6 @@ private:
QString testDataDir;
};
-tst_QtJson::tst_QtJson(QObject *parent) : QObject(parent)
-{
-}
-
void tst_QtJson::initTestCase()
{
testDataDir = QFileInfo(QFINDTESTDATA("test.json")).absolutePath();
@@ -162,18 +153,6 @@ void tst_QtJson::initTestCase()
testDataDir = QCoreApplication::applicationDirPath();
}
-void tst_QtJson::cleanupTestCase()
-{
-}
-
-void tst_QtJson::init()
-{
-}
-
-void tst_QtJson::cleanup()
-{
-}
-
void tst_QtJson::testValueSimple()
{
QJsonObject object;
@@ -741,7 +720,7 @@ void tst_QtJson::testObjectIteration()
{
QJsonObject object2 = object;
- QVERIFY(object == object2);
+ QCOMPARE(object, object2);
QJsonValue val = *object2.begin();
object2.erase(object2.begin());
@@ -757,7 +736,7 @@ void tst_QtJson::testObjectIteration()
{
QJsonObject object2 = object;
- QVERIFY(object == object2);
+ QCOMPARE(object, object2);
QJsonObject::iterator it = object2.find(QString::number(5));
object2.erase(it);
@@ -793,7 +772,7 @@ void tst_QtJson::testObjectIteration()
while (!object.isEmpty())
it = object.erase(it);
QCOMPARE(object.size() , 0);
- QVERIFY(it == object.end());
+ QCOMPARE(it, object.end());
}
void tst_QtJson::testArrayIteration()
@@ -814,7 +793,7 @@ void tst_QtJson::testArrayIteration()
{
QJsonArray array2 = array;
- QVERIFY(array == array2);
+ QCOMPARE(array, array2);
QJsonValue val = *array2.begin();
array2.erase(array2.begin());
@@ -856,7 +835,7 @@ void tst_QtJson::testArrayIteration()
while (!array.isEmpty())
it = array.erase(it);
QCOMPARE(array.size() , 0);
- QVERIFY(it == array.end());
+ QCOMPARE(it, array.end());
}
void tst_QtJson::testObjectFind()
@@ -870,14 +849,14 @@ void tst_QtJson::testObjectFind()
QJsonObject::iterator it = object.find(QLatin1String("1"));
QCOMPARE((*it).toDouble(), 1.);
it = object.find(QLatin1String("11"));
- QVERIFY((*it).type() == QJsonValue::Undefined);
- QVERIFY(it == object.end());
+ QCOMPARE((*it).type(), QJsonValue::Undefined);
+ QCOMPARE(it, object.end());
QJsonObject::const_iterator cit = object.constFind(QLatin1String("1"));
QCOMPARE((*cit).toDouble(), 1.);
cit = object.constFind(QLatin1String("11"));
- QVERIFY((*it).type() == QJsonValue::Undefined);
- QVERIFY(it == object.end());
+ QCOMPARE((*it).type(), QJsonValue::Undefined);
+ QCOMPARE(it, object.end());
}
void tst_QtJson::testDocument()
@@ -898,8 +877,8 @@ void tst_QtJson::testDocument()
QCOMPARE(doc.isEmpty(), false);
QCOMPARE(doc.isArray(), false);
QCOMPARE(doc.isObject(), true);
- QVERIFY(doc.object() == object);
- QVERIFY(doc.array() == QJsonArray());
+ QCOMPARE(doc.object(), object);
+ QCOMPARE(doc.array(), QJsonArray());
doc = QJsonDocument();
QCOMPARE(doc.isEmpty(), true);
@@ -917,8 +896,8 @@ void tst_QtJson::testDocument()
QCOMPARE(doc.isEmpty(), false);
QCOMPARE(doc.isArray(), true);
QCOMPARE(doc.isObject(), false);
- QVERIFY(doc.array() == array);
- QVERIFY(doc.object() == QJsonObject());
+ QCOMPARE(doc.array(), array);
+ QCOMPARE(doc.object(), QJsonObject());
QJsonObject outer;
outer.insert(QLatin1String("outerKey"), 22);
@@ -1408,9 +1387,7 @@ void tst_QtJson::toJsonLargeNumericValues()
" \"Array\": [\n"
" 1.234567,\n"
" 1.7976931348623157e+308,\n"
- // ((4.9406564584124654e-324 == 5e-324) == true)
- // I can only think JavaScript has a special formatter to
- // emit this value for this IEEE754 bit pattern.
+#ifdef QT_NO_DOUBLECONVERSION // "shortest" double conversion is not very short then
" 4.9406564584124654e-324,\n"
" 2.2250738585072014e-308,\n"
" 1.7976931348623157e+308,\n"
@@ -1421,6 +1398,18 @@ void tst_QtJson::toJsonLargeNumericValues()
" -1.7976931348623157e+308,\n"
" -2.2204460492503131e-16,\n"
" -4.9406564584124654e-324,\n"
+#else
+ " 5e-324,\n"
+ " 2.2250738585072014e-308,\n"
+ " 1.7976931348623157e+308,\n"
+ " 2.220446049250313e-16,\n"
+ " 5e-324,\n"
+ " 0,\n"
+ " -2.2250738585072014e-308,\n"
+ " -1.7976931348623157e+308,\n"
+ " -2.220446049250313e-16,\n"
+ " -5e-324,\n"
+#endif
" 0,\n"
" 9007199254740992,\n"
" -9007199254740992\n"
@@ -1740,7 +1729,7 @@ void tst_QtJson::fromBinary()
QJsonDocument doc = QJsonDocument::fromJson(testJson);
QJsonDocument outdoc = QJsonDocument::fromBinaryData(doc.toBinaryData());
QVERIFY(!outdoc.isNull());
- QVERIFY(doc == outdoc);
+ QCOMPARE(doc, outdoc);
QFile bfile(testDataDir + "/test.bjson");
bfile.open(QFile::ReadOnly);
@@ -1748,8 +1737,8 @@ void tst_QtJson::fromBinary()
QJsonDocument bdoc = QJsonDocument::fromBinaryData(binary);
QVERIFY(!bdoc.isNull());
- QVERIFY(doc.toVariant() == bdoc.toVariant());
- QVERIFY(doc == bdoc);
+ QCOMPARE(doc.toVariant(), bdoc.toVariant());
+ QCOMPARE(doc, bdoc);
}
void tst_QtJson::toAndFromBinary_data()
@@ -1770,7 +1759,7 @@ void tst_QtJson::toAndFromBinary()
QVERIFY(!doc.isNull());
QJsonDocument outdoc = QJsonDocument::fromBinaryData(doc.toBinaryData());
QVERIFY(!outdoc.isNull());
- QVERIFY(doc == outdoc);
+ QCOMPARE(doc, outdoc);
}
void tst_QtJson::parseNumbers()
@@ -2086,7 +2075,7 @@ void tst_QtJson::assignToDocument()
QJsonDocument innerDoc(inner.toObject());
QVERIFY(innerDoc != doc);
- QVERIFY(innerDoc.object() == inner.toObject());
+ QCOMPARE(innerDoc.object(), inner.toObject());
}
{
const char *json = "[ [ true ] ]";
@@ -2098,7 +2087,7 @@ void tst_QtJson::assignToDocument()
QJsonDocument innerDoc(inner.toArray());
QVERIFY(innerDoc != doc);
- QVERIFY(innerDoc.array() == inner.toArray());
+ QCOMPARE(innerDoc.array(), inner.toArray());
}
}
@@ -2129,7 +2118,7 @@ void tst_QtJson::testCompaction()
QVERIFY(!doc.isEmpty());
QCOMPARE(doc.isArray(), false);
QCOMPARE(doc.isObject(), true);
- QVERIFY(doc.object() == obj);
+ QCOMPARE(doc.object(), obj);
}
void tst_QtJson::testDebugStream()
@@ -2328,14 +2317,14 @@ void tst_QtJson::testDetachBug()
void tst_QtJson::valueEquals()
{
- QVERIFY(QJsonValue() == QJsonValue());
+ QCOMPARE(QJsonValue(), QJsonValue());
QVERIFY(QJsonValue() != QJsonValue(QJsonValue::Undefined));
QVERIFY(QJsonValue() != QJsonValue(true));
QVERIFY(QJsonValue() != QJsonValue(1.));
QVERIFY(QJsonValue() != QJsonValue(QJsonArray()));
QVERIFY(QJsonValue() != QJsonValue(QJsonObject()));
- QVERIFY(QJsonValue(true) == QJsonValue(true));
+ QCOMPARE(QJsonValue(true), QJsonValue(true));
QVERIFY(QJsonValue(true) != QJsonValue(false));
QVERIFY(QJsonValue(true) != QJsonValue(QJsonValue::Undefined));
QVERIFY(QJsonValue(true) != QJsonValue());
@@ -2343,9 +2332,9 @@ void tst_QtJson::valueEquals()
QVERIFY(QJsonValue(true) != QJsonValue(QJsonArray()));
QVERIFY(QJsonValue(true) != QJsonValue(QJsonObject()));
- QVERIFY(QJsonValue(1) == QJsonValue(1));
+ QCOMPARE(QJsonValue(1), QJsonValue(1));
QVERIFY(QJsonValue(1) != QJsonValue(2));
- QVERIFY(QJsonValue(1) == QJsonValue(1.));
+ QCOMPARE(QJsonValue(1), QJsonValue(1.));
QVERIFY(QJsonValue(1) != QJsonValue(1.1));
QVERIFY(QJsonValue(1) != QJsonValue(QJsonValue::Undefined));
QVERIFY(QJsonValue(1) != QJsonValue());
@@ -2353,7 +2342,7 @@ void tst_QtJson::valueEquals()
QVERIFY(QJsonValue(1) != QJsonValue(QJsonArray()));
QVERIFY(QJsonValue(1) != QJsonValue(QJsonObject()));
- QVERIFY(QJsonValue(1.) == QJsonValue(1.));
+ QCOMPARE(QJsonValue(1.), QJsonValue(1.));
QVERIFY(QJsonValue(1.) != QJsonValue(2.));
QVERIFY(QJsonValue(1.) != QJsonValue(QJsonValue::Undefined));
QVERIFY(QJsonValue(1.) != QJsonValue());
@@ -2361,7 +2350,7 @@ void tst_QtJson::valueEquals()
QVERIFY(QJsonValue(1.) != QJsonValue(QJsonArray()));
QVERIFY(QJsonValue(1.) != QJsonValue(QJsonObject()));
- QVERIFY(QJsonValue(QJsonArray()) == QJsonValue(QJsonArray()));
+ QCOMPARE(QJsonValue(QJsonArray()), QJsonValue(QJsonArray()));
QJsonArray nonEmptyArray;
nonEmptyArray.append(true);
QVERIFY(QJsonValue(QJsonArray()) != nonEmptyArray);
@@ -2371,7 +2360,7 @@ void tst_QtJson::valueEquals()
QVERIFY(QJsonValue(QJsonArray()) != QJsonValue(1.));
QVERIFY(QJsonValue(QJsonArray()) != QJsonValue(QJsonObject()));
- QVERIFY(QJsonValue(QJsonObject()) == QJsonValue(QJsonObject()));
+ QCOMPARE(QJsonValue(QJsonObject()), QJsonValue(QJsonObject()));
QJsonObject nonEmptyObject;
nonEmptyObject.insert("Key", true);
QVERIFY(QJsonValue(QJsonObject()) != nonEmptyObject);
@@ -2381,13 +2370,13 @@ void tst_QtJson::valueEquals()
QVERIFY(QJsonValue(QJsonObject()) != QJsonValue(1.));
QVERIFY(QJsonValue(QJsonObject()) != QJsonValue(QJsonArray()));
- QVERIFY(QJsonValue("foo") == QJsonValue(QLatin1String("foo")));
- QVERIFY(QJsonValue("foo") == QJsonValue(QString("foo")));
- QVERIFY(QJsonValue("\x66\x6f\x6f") == QJsonValue(QString("foo")));
- QVERIFY(QJsonValue("\x62\x61\x72") == QJsonValue("bar"));
- QVERIFY(QJsonValue(UNICODE_NON_CHARACTER) == QJsonValue(QString(UNICODE_NON_CHARACTER)));
- QVERIFY(QJsonValue(UNICODE_DJE) == QJsonValue(QString(UNICODE_DJE)));
- QVERIFY(QJsonValue("\xc3\xa9") == QJsonValue(QString("\xc3\xa9")));
+ QCOMPARE(QJsonValue("foo"), QJsonValue(QLatin1String("foo")));
+ QCOMPARE(QJsonValue("foo"), QJsonValue(QString("foo")));
+ QCOMPARE(QJsonValue("\x66\x6f\x6f"), QJsonValue(QString("foo")));
+ QCOMPARE(QJsonValue("\x62\x61\x72"), QJsonValue("bar"));
+ QCOMPARE(QJsonValue(UNICODE_NON_CHARACTER), QJsonValue(QString(UNICODE_NON_CHARACTER)));
+ QCOMPARE(QJsonValue(UNICODE_DJE), QJsonValue(QString(UNICODE_DJE)));
+ QCOMPARE(QJsonValue("\xc3\xa9"), QJsonValue(QString("\xc3\xa9")));
}
void tst_QtJson::objectEquals_data()
@@ -2521,7 +2510,7 @@ void tst_QtJson::bom()
QJsonDocument doc = QJsonDocument::fromJson(json, &error);
QVERIFY(!doc.isNull());
- QVERIFY(error.error == QJsonParseError::NoError);
+ QCOMPARE(error.error, QJsonParseError::NoError);
}
void tst_QtJson::nesting()
@@ -2553,14 +2542,14 @@ void tst_QtJson::nesting()
QJsonDocument doc = QJsonDocument::fromJson(json, &error);
QVERIFY(!doc.isNull());
- QVERIFY(error.error == QJsonParseError::NoError);
+ QCOMPARE(error.error, QJsonParseError::NoError);
- json.prepend("[");
- json.append("]");
+ json.prepend('[');
+ json.append(']');
doc = QJsonDocument::fromJson(json, &error);
QVERIFY(doc.isNull());
- QVERIFY(error.error == QJsonParseError::DeepNesting);
+ QCOMPARE(error.error, QJsonParseError::DeepNesting);
json = QByteArray("true ");
@@ -2572,14 +2561,14 @@ void tst_QtJson::nesting()
doc = QJsonDocument::fromJson(json, &error);
QVERIFY(!doc.isNull());
- QVERIFY(error.error == QJsonParseError::NoError);
+ QCOMPARE(error.error, QJsonParseError::NoError);
- json.prepend("[");
- json.append("]");
+ json.prepend('[');
+ json.append(']');
doc = QJsonDocument::fromJson(json, &error);
QVERIFY(doc.isNull());
- QVERIFY(error.error == QJsonParseError::DeepNesting);
+ QCOMPARE(error.error, QJsonParseError::DeepNesting);
}
@@ -2589,7 +2578,7 @@ void tst_QtJson::longStrings()
// in the data structures (for Latin1String in qjson_p.h)
QString s(0x7ff0, 'a');
for (int i = 0x7ff0; i < 0x8010; i++) {
- s.append("c");
+ s.append(QLatin1Char('c'));
QMap <QString, QVariant> map;
map["key"] = s;
@@ -2603,12 +2592,12 @@ void tst_QtJson::longStrings()
QJsonDocument d2 = QJsonDocument::fromJson(a1);
/* ... and a QByteArray from the QJsonDocument */
QByteArray a2 = d2.toJson();
- QVERIFY(a1 == a2);
+ QCOMPARE(a1, a2);
}
s = QString(0xfff0, 'a');
for (int i = 0xfff0; i < 0x10010; i++) {
- s.append("c");
+ s.append(QLatin1Char('c'));
QMap <QString, QVariant> map;
map["key"] = s;
@@ -2622,7 +2611,7 @@ void tst_QtJson::longStrings()
QJsonDocument d2 = QJsonDocument::fromJson(a1);
/* ... and a QByteArray from the QJsonDocument */
QByteArray a2 = d2.toJson();
- QVERIFY(a1 == a2);
+ QCOMPARE(a1, a2);
}
}
@@ -2755,7 +2744,7 @@ void tst_QtJson::unicodeKeys()
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson(json, &error);
- QVERIFY(error.error == QJsonParseError::NoError);
+ QCOMPARE(error.error, QJsonParseError::NoError);
QJsonObject o = doc.object();
QCOMPARE(o.keys().size(), 5);
@@ -2769,12 +2758,12 @@ void tst_QtJson::garbageAtEnd()
{
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson("{},", &error);
- QVERIFY(error.error == QJsonParseError::GarbageAtEnd);
- QVERIFY(error.offset == 2);
+ QCOMPARE(error.error, QJsonParseError::GarbageAtEnd);
+ QCOMPARE(error.offset, 2);
QVERIFY(doc.isEmpty());
doc = QJsonDocument::fromJson("{} ", &error);
- QVERIFY(error.error == QJsonParseError::NoError);
+ QCOMPARE(error.error, QJsonParseError::NoError);
QVERIFY(!doc.isEmpty());
}
diff --git a/tests/auto/corelib/kernel/qcoreapplication/qcoreapplication.pro b/tests/auto/corelib/kernel/qcoreapplication/qcoreapplication.pro
index 1039f2c08d..a49bb9ae1f 100644
--- a/tests/auto/corelib/kernel/qcoreapplication/qcoreapplication.pro
+++ b/tests/auto/corelib/kernel/qcoreapplication/qcoreapplication.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qcoreapplication
QT = core testlib core-private
SOURCES = tst_qcoreapplication.cpp
diff --git a/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp b/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp
index 655719cffc..b889d61786 100644
--- a/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp
+++ b/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp
@@ -442,14 +442,14 @@ public slots:
void threadProgress(int v)
{
++count;
- QVERIFY(v == count);
+ QCOMPARE(v, count);
QCoreApplication::postEvent(this, new QEvent(QEvent::MaxUser), -1);
}
void threadFinished()
{
- QVERIFY(count == 7);
+ QCOMPARE(count, 7);
count = 0;
thread->deleteLater();
@@ -898,6 +898,7 @@ void tst_QCoreApplication::threadedEventDelivery()
QCOMPARE(receiver.recordedEvents.contains(QEvent::User + 1), eventsReceived);
}
+#ifndef QT_NO_LIBRARY
void tst_QCoreApplication::addRemoveLibPaths()
{
QStringList paths = QCoreApplication::libraryPaths();
@@ -922,8 +923,9 @@ void tst_QCoreApplication::addRemoveLibPaths()
QStringList replace;
replace << currentDir << paths[0];
QCoreApplication::setLibraryPaths(replace);
- QVERIFY(QCoreApplication::libraryPaths() == replace);
+ QCOMPARE(QCoreApplication::libraryPaths(), replace);
}
+#endif
static void createQObjectOnDestruction()
{
diff --git a/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.h b/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.h
index d9296b3846..6c24ab56f8 100644
--- a/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.h
+++ b/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.h
@@ -63,7 +63,9 @@ private slots:
void applicationEventFilters_auxThread();
void threadedEventDelivery_data();
void threadedEventDelivery();
+#ifndef QT_NO_LIBRARY
void addRemoveLibPaths();
+#endif
};
#endif // TST_QCOREAPPLICATION_H
diff --git a/tests/auto/corelib/kernel/qeventdispatcher/qeventdispatcher.pro b/tests/auto/corelib/kernel/qeventdispatcher/qeventdispatcher.pro
index c3019467ce..ff048d0429 100644
--- a/tests/auto/corelib/kernel/qeventdispatcher/qeventdispatcher.pro
+++ b/tests/auto/corelib/kernel/qeventdispatcher/qeventdispatcher.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qeventdispatcher
QT = core testlib
SOURCES += tst_qeventdispatcher.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qeventloop/qeventloop.pro b/tests/auto/corelib/kernel/qeventloop/qeventloop.pro
index ea4792fc1c..5cd043b584 100644
--- a/tests/auto/corelib/kernel/qeventloop/qeventloop.pro
+++ b/tests/auto/corelib/kernel/qeventloop/qeventloop.pro
@@ -1,10 +1,8 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qeventloop
QT = core network testlib core-private
SOURCES = $$PWD/tst_qeventloop.cpp
win32:!wince:!winrt: LIBS += -luser32
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
contains(QT_CONFIG, glib): DEFINES += HAVE_GLIB
diff --git a/tests/auto/corelib/kernel/qmath/qmath.pro b/tests/auto/corelib/kernel/qmath/qmath.pro
index 5b8cba4104..703c530e35 100644
--- a/tests/auto/corelib/kernel/qmath/qmath.pro
+++ b/tests/auto/corelib/kernel/qmath/qmath.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qmath
QT = core testlib
SOURCES = tst_qmath.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qmetaenum/qmetaenum.pro b/tests/auto/corelib/kernel/qmetaenum/qmetaenum.pro
index f045fc5d88..718f2b51de 100644
--- a/tests/auto/corelib/kernel/qmetaenum/qmetaenum.pro
+++ b/tests/auto/corelib/kernel/qmetaenum/qmetaenum.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qmetaenum
QT = core testlib
SOURCES = tst_qmetaenum.cpp
diff --git a/tests/auto/corelib/kernel/qmetamethod/qmetamethod.pro b/tests/auto/corelib/kernel/qmetamethod/qmetamethod.pro
index 8340bc06e3..a42cd60236 100644
--- a/tests/auto/corelib/kernel/qmetamethod/qmetamethod.pro
+++ b/tests/auto/corelib/kernel/qmetamethod/qmetamethod.pro
@@ -1,7 +1,5 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qmetamethod
QT = core testlib
SOURCES = tst_qmetamethod.cpp
mac:CONFIG -= app_bundle
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp b/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp
index cf3ff04aa4..8d5d34d10d 100644
--- a/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp
+++ b/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp
@@ -599,8 +599,8 @@ void tst_QMetaMethod::method()
QFETCH(QMetaMethod::MethodType, methodType);
QFETCH(QMetaMethod::Access, access);
- QVERIFY(parameterTypes.size() == parameterTypeNames.size());
- QVERIFY(parameterTypes.size() == parameterNames.size());
+ QCOMPARE(parameterTypes.size(), parameterTypeNames.size());
+ QCOMPARE(parameterTypes.size(), parameterNames.size());
const QMetaObject *mo = &MethodTestObject::staticMetaObject;
int index = (methodType == QMetaMethod::Constructor)
diff --git a/tests/auto/corelib/kernel/qmetaobject/qmetaobject.pro b/tests/auto/corelib/kernel/qmetaobject/qmetaobject.pro
index 509ade6e2a..e7e5a03a86 100644
--- a/tests/auto/corelib/kernel/qmetaobject/qmetaobject.pro
+++ b/tests/auto/corelib/kernel/qmetaobject/qmetaobject.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qmetaobject
QT = core-private testlib
SOURCES = tst_qmetaobject.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp
index 7c19bfb89c..0a84a019d0 100644
--- a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp
+++ b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp
@@ -811,7 +811,7 @@ void tst_QMetaObject::invokeBlockingQueuedMetaMember()
void tst_QMetaObject::qtMetaObjectInheritance()
{
- QVERIFY(QObject::staticMetaObject.superClass() == 0);
+ QVERIFY(!QObject::staticMetaObject.superClass());
QCOMPARE(QSortFilterProxyModel::staticMetaObject.indexOfEnumerator("Qt::CaseSensitivity"), -1);
QCOMPARE(QSortFilterProxyModel::staticMetaObject.indexOfEnumerator("CaseSensitivity"), -1);
int indexOfSortCaseSensitivity = QSortFilterProxyModel::staticMetaObject.indexOfProperty("sortCaseSensitivity");
@@ -878,7 +878,7 @@ void tst_QMetaObject::invokeMetaConstructor()
const QMetaObject *mo = &QtTestObject::staticMetaObject;
{
QObject *obj = mo->newInstance();
- QVERIFY(obj == 0);
+ QVERIFY(!obj);
}
{
QtTestObject obj;
diff --git a/tests/auto/corelib/kernel/qmetaobjectbuilder/qmetaobjectbuilder.pro b/tests/auto/corelib/kernel/qmetaobjectbuilder/qmetaobjectbuilder.pro
index 68d3b48086..f3153b3fd4 100644
--- a/tests/auto/corelib/kernel/qmetaobjectbuilder/qmetaobjectbuilder.pro
+++ b/tests/auto/corelib/kernel/qmetaobjectbuilder/qmetaobjectbuilder.pro
@@ -1,6 +1,5 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qmetaobjectbuilder
QT = core-private testlib
SOURCES = tst_qmetaobjectbuilder.cpp
mac:CONFIG -= app_bundle
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
index 74fcde2e71..6cf45bed1e 100644
--- a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
+++ b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
@@ -138,14 +138,14 @@ void tst_QMetaObjectBuilder::create()
{
QMetaObjectBuilder builder;
QVERIFY(builder.className().isEmpty());
- QVERIFY(builder.superClass() == &QObject::staticMetaObject);
+ QCOMPARE(builder.superClass(), &QObject::staticMetaObject);
QCOMPARE(builder.methodCount(), 0);
QCOMPARE(builder.constructorCount(), 0);
QCOMPARE(builder.propertyCount(), 0);
QCOMPARE(builder.enumeratorCount(), 0);
QCOMPARE(builder.classInfoCount(), 0);
QCOMPARE(builder.relatedMetaObjectCount(), 0);
- QVERIFY(builder.staticMetacallFunction() == 0);
+ QVERIFY(!builder.staticMetacallFunction());
}
void tst_QMetaObjectBuilder::className()
@@ -174,17 +174,17 @@ void tst_QMetaObjectBuilder::superClass()
// Change the super class.
builder.setSuperClass(&QObject::staticMetaObject);
- QVERIFY(builder.superClass() == &QObject::staticMetaObject);
+ QCOMPARE(builder.superClass(), &QObject::staticMetaObject);
// Change it again.
builder.setSuperClass(&staticMetaObject);
- QVERIFY(builder.superClass() == &staticMetaObject);
+ QCOMPARE(builder.superClass(), &staticMetaObject);
// Clone the super class off a static QMetaObject.
builder.addMetaObject(&QObject::staticMetaObject, QMetaObjectBuilder::SuperClass);
- QVERIFY(builder.superClass() == 0);
+ QVERIFY(!builder.superClass());
builder.addMetaObject(&staticMetaObject, QMetaObjectBuilder::SuperClass);
- QVERIFY(builder.superClass() == staticMetaObject.superClass());
+ QCOMPARE(builder.superClass(), staticMetaObject.superClass());
// Check that nothing else changed.
QVERIFY(checkForSideEffects(builder, QMetaObjectBuilder::SuperClass));
@@ -195,11 +195,11 @@ void tst_QMetaObjectBuilder::flags()
QMetaObjectBuilder builder;
// Check default
- QVERIFY(builder.flags() == 0);
+ QCOMPARE(builder.flags(), 0);
// Set flags
builder.setFlags(QMetaObjectBuilder::DynamicMetaObject);
- QVERIFY(builder.flags() == QMetaObjectBuilder::DynamicMetaObject);
+ QCOMPARE(builder.flags(), QMetaObjectBuilder::DynamicMetaObject);
}
void tst_QMetaObjectBuilder::method()
@@ -209,12 +209,12 @@ void tst_QMetaObjectBuilder::method()
// Check null method
QMetaMethodBuilder nullMethod;
QCOMPARE(nullMethod.signature(), QByteArray());
- QVERIFY(nullMethod.methodType() == QMetaMethod::Method);
+ QCOMPARE(nullMethod.methodType(), QMetaMethod::Method);
QVERIFY(nullMethod.returnType().isEmpty());
QVERIFY(nullMethod.parameterTypes().isEmpty());
QVERIFY(nullMethod.parameterNames().isEmpty());
QVERIFY(nullMethod.tag().isEmpty());
- QVERIFY(nullMethod.access() == QMetaMethod::Public);
+ QCOMPARE(nullMethod.access(), QMetaMethod::Public);
QCOMPARE(nullMethod.attributes(), 0);
QCOMPARE(nullMethod.revision(), 0);
QCOMPARE(nullMethod.index(), 0);
@@ -222,12 +222,12 @@ void tst_QMetaObjectBuilder::method()
// Add a method and check its attributes.
QMetaMethodBuilder method1 = builder.addMethod("foo(const QString&, int)");
QCOMPARE(method1.signature(), QByteArray("foo(QString,int)"));
- QVERIFY(method1.methodType() == QMetaMethod::Method);
+ QCOMPARE(method1.methodType(), QMetaMethod::Method);
QCOMPARE(method1.returnType(), QByteArray("void"));
QCOMPARE(method1.parameterTypes(), QList<QByteArray>() << "QString" << "int");
QVERIFY(method1.parameterNames().isEmpty());
QVERIFY(method1.tag().isEmpty());
- QVERIFY(method1.access() == QMetaMethod::Public);
+ QCOMPARE(method1.access(), QMetaMethod::Public);
QCOMPARE(method1.attributes(), 0);
QCOMPARE(method1.revision(), 0);
QCOMPARE(method1.index(), 0);
@@ -236,12 +236,12 @@ void tst_QMetaObjectBuilder::method()
// Add another method and check again.
QMetaMethodBuilder method2 = builder.addMethod("bar(QString)", "int");
QCOMPARE(method2.signature(), QByteArray("bar(QString)"));
- QVERIFY(method2.methodType() == QMetaMethod::Method);
+ QCOMPARE(method2.methodType(), QMetaMethod::Method);
QCOMPARE(method2.returnType(), QByteArray("int"));
QCOMPARE(method2.parameterTypes(), QList<QByteArray>() << "QString");
QVERIFY(method2.parameterNames().isEmpty());
QVERIFY(method2.tag().isEmpty());
- QVERIFY(method2.access() == QMetaMethod::Public);
+ QCOMPARE(method2.access(), QMetaMethod::Public);
QCOMPARE(method2.attributes(), 0);
QCOMPARE(method2.revision(), 0);
QCOMPARE(method2.index(), 1);
@@ -262,22 +262,22 @@ void tst_QMetaObjectBuilder::method()
// Check that method1 is changed, but method2 is not.
QCOMPARE(method1.signature(), QByteArray("foo(QString,int)"));
- QVERIFY(method1.methodType() == QMetaMethod::Method);
+ QCOMPARE(method1.methodType(), QMetaMethod::Method);
QCOMPARE(method1.returnType(), QByteArray("int"));
QCOMPARE(method1.parameterTypes(), QList<QByteArray>() << "QString" << "int");
QCOMPARE(method1.parameterNames(), QList<QByteArray>() << "a" << "b");
QCOMPARE(method1.tag(), QByteArray("tag"));
- QVERIFY(method1.access() == QMetaMethod::Private);
+ QCOMPARE(method1.access(), QMetaMethod::Private);
QCOMPARE(method1.attributes(), 42);
QCOMPARE(method1.revision(), 123);
QCOMPARE(method1.index(), 0);
QCOMPARE(method2.signature(), QByteArray("bar(QString)"));
- QVERIFY(method2.methodType() == QMetaMethod::Method);
+ QCOMPARE(method2.methodType(), QMetaMethod::Method);
QCOMPARE(method2.returnType(), QByteArray("int"));
QCOMPARE(method2.parameterTypes(), QList<QByteArray>() << "QString");
QVERIFY(method2.parameterNames().isEmpty());
QVERIFY(method2.tag().isEmpty());
- QVERIFY(method2.access() == QMetaMethod::Public);
+ QCOMPARE(method2.access(), QMetaMethod::Public);
QCOMPARE(method2.attributes(), 0);
QCOMPARE(method2.revision(), 0);
QCOMPARE(method2.index(), 1);
@@ -293,22 +293,22 @@ void tst_QMetaObjectBuilder::method()
// This time check that only method2 changed.
QCOMPARE(method1.signature(), QByteArray("foo(QString,int)"));
- QVERIFY(method1.methodType() == QMetaMethod::Method);
+ QCOMPARE(method1.methodType(), QMetaMethod::Method);
QCOMPARE(method1.returnType(), QByteArray("int"));
QCOMPARE(method1.parameterTypes(), QList<QByteArray>() << "QString" << "int");
QCOMPARE(method1.parameterNames(), QList<QByteArray>() << "a" << "b");
QCOMPARE(method1.tag(), QByteArray("tag"));
- QVERIFY(method1.access() == QMetaMethod::Private);
+ QCOMPARE(method1.access(), QMetaMethod::Private);
QCOMPARE(method1.attributes(), 42);
QCOMPARE(method1.revision(), 123);
QCOMPARE(method1.index(), 0);
QCOMPARE(method2.signature(), QByteArray("bar(QString)"));
- QVERIFY(method2.methodType() == QMetaMethod::Method);
+ QCOMPARE(method2.methodType(), QMetaMethod::Method);
QCOMPARE(method2.returnType(), QByteArray("QString"));
QCOMPARE(method2.parameterTypes(), QList<QByteArray>() << "QString");
QCOMPARE(method2.parameterNames(), QList<QByteArray>() << "c");
QCOMPARE(method2.tag(), QByteArray("Q_FOO"));
- QVERIFY(method2.access() == QMetaMethod::Protected);
+ QCOMPARE(method2.access(), QMetaMethod::Protected);
QCOMPARE(method2.attributes(), 24);
QCOMPARE(method2.revision(), 321);
QCOMPARE(method2.index(), 1);
@@ -319,12 +319,12 @@ void tst_QMetaObjectBuilder::method()
QCOMPARE(builder.methodCount(), 1);
method2 = builder.method(0);
QCOMPARE(method2.signature(), QByteArray("bar(QString)"));
- QVERIFY(method2.methodType() == QMetaMethod::Method);
+ QCOMPARE(method2.methodType(), QMetaMethod::Method);
QCOMPARE(method2.returnType(), QByteArray("QString"));
QCOMPARE(method2.parameterTypes(), QList<QByteArray>() << "QString");
QCOMPARE(method2.parameterNames(), QList<QByteArray>() << "c");
QCOMPARE(method2.tag(), QByteArray("Q_FOO"));
- QVERIFY(method2.access() == QMetaMethod::Protected);
+ QCOMPARE(method2.access(), QMetaMethod::Protected);
QCOMPARE(method2.attributes(), 24);
QCOMPARE(method2.revision(), 321);
QCOMPARE(method2.index(), 0);
@@ -347,12 +347,12 @@ void tst_QMetaObjectBuilder::slot()
// Add a slot and check its attributes.
QMetaMethodBuilder method1 = builder.addSlot("foo(const QString&, int)");
QCOMPARE(method1.signature(), QByteArray("foo(QString,int)"));
- QVERIFY(method1.methodType() == QMetaMethod::Slot);
+ QCOMPARE(method1.methodType(), QMetaMethod::Slot);
QCOMPARE(method1.returnType(), QByteArray("void"));
QCOMPARE(method1.parameterTypes(), QList<QByteArray>() << "QString" << "int");
QVERIFY(method1.parameterNames().isEmpty());
QVERIFY(method1.tag().isEmpty());
- QVERIFY(method1.access() == QMetaMethod::Public);
+ QCOMPARE(method1.access(), QMetaMethod::Public);
QCOMPARE(method1.attributes(), 0);
QCOMPARE(method1.index(), 0);
QCOMPARE(builder.methodCount(), 1);
@@ -360,12 +360,12 @@ void tst_QMetaObjectBuilder::slot()
// Add another slot and check again.
QMetaMethodBuilder method2 = builder.addSlot("bar(QString)");
QCOMPARE(method2.signature(), QByteArray("bar(QString)"));
- QVERIFY(method2.methodType() == QMetaMethod::Slot);
+ QCOMPARE(method2.methodType(), QMetaMethod::Slot);
QCOMPARE(method2.returnType(), QByteArray("void"));
QCOMPARE(method2.parameterTypes(), QList<QByteArray>() << "QString");
QVERIFY(method2.parameterNames().isEmpty());
QVERIFY(method2.tag().isEmpty());
- QVERIFY(method2.access() == QMetaMethod::Public);
+ QCOMPARE(method2.access(), QMetaMethod::Public);
QCOMPARE(method2.attributes(), 0);
QCOMPARE(method2.index(), 1);
QCOMPARE(builder.methodCount(), 2);
@@ -386,12 +386,12 @@ void tst_QMetaObjectBuilder::signal()
// Add a signal and check its attributes.
QMetaMethodBuilder method1 = builder.addSignal("foo(const QString&, int)");
QCOMPARE(method1.signature(), QByteArray("foo(QString,int)"));
- QVERIFY(method1.methodType() == QMetaMethod::Signal);
+ QCOMPARE(method1.methodType(), QMetaMethod::Signal);
QCOMPARE(method1.returnType(), QByteArray("void"));
QCOMPARE(method1.parameterTypes(), QList<QByteArray>() << "QString" << "int");
QVERIFY(method1.parameterNames().isEmpty());
QVERIFY(method1.tag().isEmpty());
- QVERIFY(method1.access() == QMetaMethod::Public);
+ QCOMPARE(method1.access(), QMetaMethod::Public);
QCOMPARE(method1.attributes(), 0);
QCOMPARE(method1.index(), 0);
QCOMPARE(builder.methodCount(), 1);
@@ -399,12 +399,12 @@ void tst_QMetaObjectBuilder::signal()
// Add another signal and check again.
QMetaMethodBuilder method2 = builder.addSignal("bar(QString)");
QCOMPARE(method2.signature(), QByteArray("bar(QString)"));
- QVERIFY(method2.methodType() == QMetaMethod::Signal);
+ QCOMPARE(method2.methodType(), QMetaMethod::Signal);
QCOMPARE(method2.returnType(), QByteArray("void"));
QCOMPARE(method2.parameterTypes(), QList<QByteArray>() << "QString");
QVERIFY(method2.parameterNames().isEmpty());
QVERIFY(method2.tag().isEmpty());
- QVERIFY(method2.access() == QMetaMethod::Public);
+ QCOMPARE(method2.access(), QMetaMethod::Public);
QCOMPARE(method2.attributes(), 0);
QCOMPARE(method2.index(), 1);
QCOMPARE(builder.methodCount(), 2);
@@ -425,12 +425,12 @@ void tst_QMetaObjectBuilder::constructor()
// Add a constructor and check its attributes.
QMetaMethodBuilder ctor1 = builder.addConstructor("foo(const QString&, int)");
QCOMPARE(ctor1.signature(), QByteArray("foo(QString,int)"));
- QVERIFY(ctor1.methodType() == QMetaMethod::Constructor);
+ QCOMPARE(ctor1.methodType(), QMetaMethod::Constructor);
QVERIFY(ctor1.returnType().isEmpty());
QCOMPARE(ctor1.parameterTypes(), QList<QByteArray>() << "QString" << "int");
QVERIFY(ctor1.parameterNames().isEmpty());
QVERIFY(ctor1.tag().isEmpty());
- QVERIFY(ctor1.access() == QMetaMethod::Public);
+ QCOMPARE(ctor1.access(), QMetaMethod::Public);
QCOMPARE(ctor1.attributes(), 0);
QCOMPARE(ctor1.index(), 0);
QCOMPARE(builder.constructorCount(), 1);
@@ -438,12 +438,12 @@ void tst_QMetaObjectBuilder::constructor()
// Add another constructor and check again.
QMetaMethodBuilder ctor2 = builder.addConstructor("bar(QString)");
QCOMPARE(ctor2.signature(), QByteArray("bar(QString)"));
- QVERIFY(ctor2.methodType() == QMetaMethod::Constructor);
+ QCOMPARE(ctor2.methodType(), QMetaMethod::Constructor);
QVERIFY(ctor2.returnType().isEmpty());
QCOMPARE(ctor2.parameterTypes(), QList<QByteArray>() << "QString");
QVERIFY(ctor2.parameterNames().isEmpty());
QVERIFY(ctor2.tag().isEmpty());
- QVERIFY(ctor2.access() == QMetaMethod::Public);
+ QCOMPARE(ctor2.access(), QMetaMethod::Public);
QCOMPARE(ctor2.attributes(), 0);
QCOMPARE(ctor2.index(), 1);
QCOMPARE(builder.constructorCount(), 2);
@@ -464,21 +464,21 @@ void tst_QMetaObjectBuilder::constructor()
// Check that ctor1 is changed, but ctor2 is not.
QCOMPARE(ctor1.signature(), QByteArray("foo(QString,int)"));
- QVERIFY(ctor1.methodType() == QMetaMethod::Constructor);
+ QCOMPARE(ctor1.methodType(), QMetaMethod::Constructor);
QCOMPARE(ctor1.returnType(), QByteArray("int"));
QCOMPARE(ctor1.parameterTypes(), QList<QByteArray>() << "QString" << "int");
QCOMPARE(ctor1.parameterNames(), QList<QByteArray>() << "a" << "b");
QCOMPARE(ctor1.tag(), QByteArray("tag"));
- QVERIFY(ctor1.access() == QMetaMethod::Private);
+ QCOMPARE(ctor1.access(), QMetaMethod::Private);
QCOMPARE(ctor1.attributes(), 42);
QCOMPARE(ctor1.index(), 0);
QCOMPARE(ctor2.signature(), QByteArray("bar(QString)"));
- QVERIFY(ctor2.methodType() == QMetaMethod::Constructor);
+ QCOMPARE(ctor2.methodType(), QMetaMethod::Constructor);
QVERIFY(ctor2.returnType().isEmpty());
QCOMPARE(ctor2.parameterTypes(), QList<QByteArray>() << "QString");
QVERIFY(ctor2.parameterNames().isEmpty());
QVERIFY(ctor2.tag().isEmpty());
- QVERIFY(ctor2.access() == QMetaMethod::Public);
+ QCOMPARE(ctor2.access(), QMetaMethod::Public);
QCOMPARE(ctor2.attributes(), 0);
QCOMPARE(ctor2.index(), 1);
QCOMPARE(builder.constructorCount(), 2);
@@ -492,21 +492,21 @@ void tst_QMetaObjectBuilder::constructor()
// This time check that only ctor2 changed.
QCOMPARE(ctor1.signature(), QByteArray("foo(QString,int)"));
- QVERIFY(ctor1.methodType() == QMetaMethod::Constructor);
+ QCOMPARE(ctor1.methodType(), QMetaMethod::Constructor);
QCOMPARE(ctor1.returnType(), QByteArray("int"));
QCOMPARE(ctor1.parameterTypes(), QList<QByteArray>() << "QString" << "int");
QCOMPARE(ctor1.parameterNames(), QList<QByteArray>() << "a" << "b");
QCOMPARE(ctor1.tag(), QByteArray("tag"));
- QVERIFY(ctor1.access() == QMetaMethod::Private);
+ QCOMPARE(ctor1.access(), QMetaMethod::Private);
QCOMPARE(ctor1.attributes(), 42);
QCOMPARE(ctor1.index(), 0);
QCOMPARE(ctor2.signature(), QByteArray("bar(QString)"));
- QVERIFY(ctor2.methodType() == QMetaMethod::Constructor);
+ QCOMPARE(ctor2.methodType(), QMetaMethod::Constructor);
QCOMPARE(ctor2.returnType(), QByteArray("QString"));
QCOMPARE(ctor2.parameterTypes(), QList<QByteArray>() << "QString");
QCOMPARE(ctor2.parameterNames(), QList<QByteArray>() << "c");
QCOMPARE(ctor2.tag(), QByteArray("Q_FOO"));
- QVERIFY(ctor2.access() == QMetaMethod::Protected);
+ QCOMPARE(ctor2.access(), QMetaMethod::Protected);
QCOMPARE(ctor2.attributes(), 24);
QCOMPARE(ctor2.index(), 1);
QCOMPARE(builder.constructorCount(), 2);
@@ -516,12 +516,12 @@ void tst_QMetaObjectBuilder::constructor()
QCOMPARE(builder.constructorCount(), 1);
ctor2 = builder.constructor(0);
QCOMPARE(ctor2.signature(), QByteArray("bar(QString)"));
- QVERIFY(ctor2.methodType() == QMetaMethod::Constructor);
+ QCOMPARE(ctor2.methodType(), QMetaMethod::Constructor);
QCOMPARE(ctor2.returnType(), QByteArray("QString"));
QCOMPARE(ctor2.parameterTypes(), QList<QByteArray>() << "QString");
QCOMPARE(ctor2.parameterNames(), QList<QByteArray>() << "c");
QCOMPARE(ctor2.tag(), QByteArray("Q_FOO"));
- QVERIFY(ctor2.access() == QMetaMethod::Protected);
+ QCOMPARE(ctor2.access(), QMetaMethod::Protected);
QCOMPARE(ctor2.attributes(), 24);
QCOMPARE(ctor2.index(), 0);
@@ -536,10 +536,10 @@ void tst_QMetaObjectBuilder::constructor()
QCOMPARE(builder.constructorCount(), 2);
QCOMPARE(prototypeConstructor.signature(), QByteArray("SomethingOfEverything()"));
- QVERIFY(prototypeConstructor.methodType() == QMetaMethod::Constructor);
+ QCOMPARE(prototypeConstructor.methodType(), QMetaMethod::Constructor);
QCOMPARE(prototypeConstructor.returnType(), QByteArray());
QVERIFY(prototypeConstructor.parameterTypes().isEmpty());
- QVERIFY(prototypeConstructor.access() == QMetaMethod::Public);
+ QCOMPARE(prototypeConstructor.access(), QMetaMethod::Public);
QCOMPARE(prototypeConstructor.index(), 1);
// Check that nothing else changed.
@@ -967,13 +967,13 @@ void tst_QMetaObjectBuilder::relatedMetaObject()
// Add two related meta objects and check their attributes.
QCOMPARE(builder.addRelatedMetaObject(&QObject::staticMetaObject), 0);
QCOMPARE(builder.addRelatedMetaObject(&staticMetaObject), 1);
- QVERIFY(builder.relatedMetaObject(0) == &QObject::staticMetaObject);
- QVERIFY(builder.relatedMetaObject(1) == &staticMetaObject);
+ QCOMPARE(builder.relatedMetaObject(0), &QObject::staticMetaObject);
+ QCOMPARE(builder.relatedMetaObject(1), &staticMetaObject);
QCOMPARE(builder.relatedMetaObjectCount(), 2);
// Remove the first one and check again.
builder.removeRelatedMetaObject(0);
- QVERIFY(builder.relatedMetaObject(0) == &staticMetaObject);
+ QCOMPARE(builder.relatedMetaObject(0), &staticMetaObject);
QCOMPARE(builder.relatedMetaObjectCount(), 1);
// Check that nothing else changed.
@@ -1617,7 +1617,7 @@ void tst_QMetaObjectBuilder::usage_slot()
QVERIFY(index != -1);
QMetaMethod voidSlotInt = testObject->metaObject()->method(index);
- QVERIFY(testObject->voidSlotIntArgument() == -1);
+ QCOMPARE(testObject->voidSlotIntArgument(), -1);
QVERIFY(voidSlotInt.invoke(testObject.data(), Q_ARG(int, 123)));
QCOMPARE(testObject->voidSlotIntArgument(), 123);
}
@@ -1658,7 +1658,7 @@ void tst_QMetaObjectBuilder::usage_connect()
QVERIFY(QObject::connect(testObject.data(), SIGNAL(intPropChanged(int)),
testObject.data(), SLOT(voidSlotInt(int))));
- QVERIFY(testObject->voidSlotIntArgument() == -1);
+ QCOMPARE(testObject->voidSlotIntArgument(), -1);
testObject->setProperty("intProp", 123);
QCOMPARE(testObject->voidSlotIntArgument(), 123);
@@ -1674,7 +1674,7 @@ void tst_QMetaObjectBuilder::usage_templateConnect()
testObject.data(), &TestObject::voidSlotInt);
QVERIFY(con);
- QVERIFY(testObject->voidSlotIntArgument() == -1);
+ QCOMPARE(testObject->voidSlotIntArgument(), -1);
testObject->setProperty("intProp", 123);
QCOMPARE(testObject->voidSlotIntArgument(), 123);
diff --git a/tests/auto/corelib/kernel/qmetaproperty/qmetaproperty.pro b/tests/auto/corelib/kernel/qmetaproperty/qmetaproperty.pro
index f103abdd2b..1f338a909b 100644
--- a/tests/auto/corelib/kernel/qmetaproperty/qmetaproperty.pro
+++ b/tests/auto/corelib/kernel/qmetaproperty/qmetaproperty.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qmetaproperty
QT = core testlib
SOURCES = tst_qmetaproperty.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qmetatype/qmetatype.pro b/tests/auto/corelib/kernel/qmetatype/qmetatype.pro
index fc262b8fc7..1d4e647a4b 100644
--- a/tests/auto/corelib/kernel/qmetatype/qmetatype.pro
+++ b/tests/auto/corelib/kernel/qmetatype/qmetatype.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qmetatype
QT = core testlib
INCLUDEPATH += $$PWD/../../../other/qvariant_common
diff --git a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp
index 10ffa06245..1fde3d4cff 100644
--- a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp
+++ b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp
@@ -193,8 +193,11 @@ protected:
Bar space[1];
space[0].~Bar();
+ const QByteArray postFix = '_'
+ + QByteArray::number(reinterpret_cast<quintptr>(QThread::currentThreadId()));
+
for (int i = 0; i < 1000; ++i) {
- const QByteArray name = QString("Bar%1_%2").arg(i).arg((size_t)QThread::currentThreadId()).toLatin1();
+ const QByteArray name = "Bar" + QByteArray::number(i) + postFix;
const char *nm = name.constData();
int tp = qRegisterMetaType<Bar>(nm);
#if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)
@@ -2394,8 +2397,8 @@ void tst_QMetaType::compareCustomEqualOnlyType()
QVERIFY(variant50 != variant100x);
QVERIFY(variant100 != variant50);
QVERIFY(variant100x != variant50);
- QVERIFY(variant100 == variant100x);
- QVERIFY(variant100 == variant100);
+ QCOMPARE(variant100, variant100x);
+ QCOMPARE(variant100, variant100);
// compare always fails
QVERIFY(!(variant50 < variant50));
diff --git a/tests/auto/corelib/kernel/qmimedata/qmimedata.pro b/tests/auto/corelib/kernel/qmimedata/qmimedata.pro
index 51389da6ee..502ec78024 100644
--- a/tests/auto/corelib/kernel/qmimedata/qmimedata.pro
+++ b/tests/auto/corelib/kernel/qmimedata/qmimedata.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qmimedata
QT += testlib
SOURCES = tst_qmimedata.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qmimedata/tst_qmimedata.cpp b/tests/auto/corelib/kernel/qmimedata/tst_qmimedata.cpp
index d368d9961b..4f88dc2a76 100644
--- a/tests/auto/corelib/kernel/qmimedata/tst_qmimedata.cpp
+++ b/tests/auto/corelib/kernel/qmimedata/tst_qmimedata.cpp
@@ -101,7 +101,7 @@ void tst_QMimeData::data() const
// set text, verify
mimeData.setData("text/plain", "pirates");
QCOMPARE(mimeData.data("text/plain"), QByteArray("pirates"));
- QVERIFY(mimeData.data("text/html").length() == 0);
+ QCOMPARE(mimeData.data("text/html").length(), 0);
// html time
mimeData.setData("text/html", "ninjas");
diff --git a/tests/auto/corelib/kernel/qobject/signalbug/signalbug.pro b/tests/auto/corelib/kernel/qobject/signalbug/signalbug.pro
index b08dfb1838..125915047a 100644
--- a/tests/auto/corelib/kernel/qobject/signalbug/signalbug.pro
+++ b/tests/auto/corelib/kernel/qobject/signalbug/signalbug.pro
@@ -12,4 +12,3 @@ SOURCES += signalbug.cpp
# This app is testdata for tst_qobject
target.path = $$[QT_INSTALL_TESTS]/tst_qobject/$$TARGET
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qobject/test/test.pro b/tests/auto/corelib/kernel/qobject/test/test.pro
index 3ac728931d..f3bc045455 100644
--- a/tests/auto/corelib/kernel/qobject/test/test.pro
+++ b/tests/auto/corelib/kernel/qobject/test/test.pro
@@ -1,5 +1,4 @@
CONFIG += testcase console
-CONFIG += parallel_test
TARGET = ../tst_qobject
QT = core-private network testlib
SOURCES = ../tst_qobject.cpp
diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
index a3c6d8e9df..90f7780344 100644
--- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
+++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
@@ -2038,57 +2038,57 @@ void tst_QObject::metamethod()
m = mobj->method(mobj->indexOfMethod("invoke1()"));
QVERIFY(m.methodSignature() == "invoke1()");
- QVERIFY(m.methodType() == QMetaMethod::Method);
- QVERIFY(m.access() == QMetaMethod::Public);
+ QCOMPARE(m.methodType(), QMetaMethod::Method);
+ QCOMPARE(m.access(), QMetaMethod::Public);
QVERIFY(!(m.attributes() & QMetaMethod::Scriptable));
QVERIFY(!(m.attributes() & QMetaMethod::Compatibility));
m = mobj->method(mobj->indexOfMethod("sinvoke1()"));
QVERIFY(m.methodSignature() == "sinvoke1()");
- QVERIFY(m.methodType() == QMetaMethod::Method);
- QVERIFY(m.access() == QMetaMethod::Public);
+ QCOMPARE(m.methodType(), QMetaMethod::Method);
+ QCOMPARE(m.access(), QMetaMethod::Public);
QVERIFY((m.attributes() & QMetaMethod::Scriptable));
QVERIFY(!(m.attributes() & QMetaMethod::Compatibility));
m = mobj->method(mobj->indexOfMethod("invoke2()"));
QVERIFY(m.methodSignature() == "invoke2()");
- QVERIFY(m.methodType() == QMetaMethod::Method);
- QVERIFY(m.access() == QMetaMethod::Protected);
+ QCOMPARE(m.methodType(), QMetaMethod::Method);
+ QCOMPARE(m.access(), QMetaMethod::Protected);
QVERIFY(!(m.attributes() & QMetaMethod::Scriptable));
QVERIFY((m.attributes() & QMetaMethod::Compatibility));
m = mobj->method(mobj->indexOfMethod("sinvoke2()"));
QVERIFY(m.methodSignature() == "sinvoke2()");
- QVERIFY(m.methodType() == QMetaMethod::Method);
- QVERIFY(m.access() == QMetaMethod::Protected);
+ QCOMPARE(m.methodType(), QMetaMethod::Method);
+ QCOMPARE(m.access(), QMetaMethod::Protected);
QVERIFY((m.attributes() & QMetaMethod::Scriptable));
QVERIFY((m.attributes() & QMetaMethod::Compatibility));
m = mobj->method(mobj->indexOfMethod("invoke3()"));
QVERIFY(m.methodSignature() == "invoke3()");
- QVERIFY(m.methodType() == QMetaMethod::Method);
- QVERIFY(m.access() == QMetaMethod::Private);
+ QCOMPARE(m.methodType(), QMetaMethod::Method);
+ QCOMPARE(m.access(), QMetaMethod::Private);
QVERIFY(!(m.attributes() & QMetaMethod::Scriptable));
QVERIFY(!(m.attributes() & QMetaMethod::Compatibility));
m = mobj->method(mobj->indexOfMethod("sinvoke3()"));
QVERIFY(m.methodSignature() == "sinvoke3()");
- QVERIFY(m.methodType() == QMetaMethod::Method);
- QVERIFY(m.access() == QMetaMethod::Private);
+ QCOMPARE(m.methodType(), QMetaMethod::Method);
+ QCOMPARE(m.access(), QMetaMethod::Private);
QVERIFY((m.attributes() & QMetaMethod::Scriptable));
QVERIFY(!(m.attributes() & QMetaMethod::Compatibility));
m = mobj->method(mobj->indexOfMethod("signal5()"));
QVERIFY(m.methodSignature() == "signal5()");
- QVERIFY(m.methodType() == QMetaMethod::Signal);
- QVERIFY(m.access() == QMetaMethod::Public);
+ QCOMPARE(m.methodType(), QMetaMethod::Signal);
+ QCOMPARE(m.access(), QMetaMethod::Public);
QVERIFY(!(m.attributes() & QMetaMethod::Scriptable));
QVERIFY((m.attributes() & QMetaMethod::Compatibility));
m = mobj->method(mobj->indexOfMethod("aPublicSlot()"));
QVERIFY(m.methodSignature() == "aPublicSlot()");
- QVERIFY(m.methodType() == QMetaMethod::Slot);
- QVERIFY(m.access() == QMetaMethod::Public);
+ QCOMPARE(m.methodType(), QMetaMethod::Slot);
+ QCOMPARE(m.access(), QMetaMethod::Public);
QVERIFY(!(m.attributes() & QMetaMethod::Scriptable));
QVERIFY(!(m.attributes() & QMetaMethod::Compatibility));
@@ -2360,7 +2360,7 @@ void tst_QObject::testUserData()
int id = user_data_ids[i];
CustomData *data = static_cast<CustomData *>(my_test_object.userData(id));
QVERIFY(data != 0);
- QVERIFY(data->id == id);
+ QCOMPARE(data->id, id);
}
}
@@ -2902,12 +2902,12 @@ void tst_QObject::floatProperty()
QVERIFY(idx > 0);
QMetaProperty prop = obj.metaObject()->property(idx);
QVERIFY(prop.isValid());
- QVERIFY(prop.type() == uint(QMetaType::type("float")));
+ QCOMPARE(int(prop.type()), QMetaType::type("float"));
QVERIFY(!prop.write(&obj, QVariant("Hello")));
QVERIFY(prop.write(&obj, QVariant::fromValue(128.0f)));
QVariant v = prop.read(&obj);
- QVERIFY(int(v.userType()) == QMetaType::Float);
- QVERIFY(qvariant_cast<float>(v) == 128.0f);
+ QCOMPARE(v.userType(), int(QMetaType::Float));
+ QCOMPARE(qvariant_cast<float>(v), 128.0f);
}
void tst_QObject::qrealProperty()
@@ -2917,18 +2917,18 @@ void tst_QObject::qrealProperty()
QVERIFY(idx > 0);
QMetaProperty prop = obj.metaObject()->property(idx);
QVERIFY(prop.isValid());
- QVERIFY(prop.type() == uint(QMetaType::type("qreal")));
+ QCOMPARE(int(prop.type()), QMetaType::type("qreal"));
QVERIFY(!prop.write(&obj, QVariant("Hello")));
QVERIFY(prop.write(&obj, QVariant::fromValue(128.0f)));
QVariant v = prop.read(&obj);
QCOMPARE(v.userType(), qMetaTypeId<qreal>());
- QVERIFY(qvariant_cast<qreal>(v) == 128.0);
+ QCOMPARE(qvariant_cast<qreal>(v), 128.0);
QVERIFY(prop.write(&obj, QVariant::fromValue(double(127))));
v = prop.read(&obj);
QCOMPARE(v.userType(), qMetaTypeId<qreal>());
- QVERIFY(qvariant_cast<qreal>(v) == 127.0);
+ QCOMPARE(qvariant_cast<qreal>(v), 127.0);
}
class DynamicPropertyObject : public PropertyObject
@@ -2994,7 +2994,7 @@ void tst_QObject::recursiveSignalEmission()
proc.start(path);
QVERIFY2(proc.waitForStarted(), qPrintable(QString::fromLatin1("Cannot start '%1': %2").arg(path, proc.errorString())));
QVERIFY(proc.waitForFinished());
- QVERIFY(proc.exitStatus() == QProcess::NormalExit);
+ QCOMPARE(proc.exitStatus(), QProcess::NormalExit);
QCOMPARE(proc.exitCode(), 0);
#endif
}
diff --git a/tests/auto/corelib/kernel/qpointer/qpointer.pro b/tests/auto/corelib/kernel/qpointer/qpointer.pro
index 4b573cb6a5..02765efdbd 100644
--- a/tests/auto/corelib/kernel/qpointer/qpointer.pro
+++ b/tests/auto/corelib/kernel/qpointer/qpointer.pro
@@ -1,7 +1,5 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpointer
QT = core testlib
qtHaveModule(widgets): QT += widgets
SOURCES = tst_qpointer.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qsharedmemory/test/tst_qsharedmemory.cpp b/tests/auto/corelib/kernel/qsharedmemory/test/tst_qsharedmemory.cpp
index 26bb70fc66..2cba521b61 100644
--- a/tests/auto/corelib/kernel/qsharedmemory/test/tst_qsharedmemory.cpp
+++ b/tests/auto/corelib/kernel/qsharedmemory/test/tst_qsharedmemory.cpp
@@ -145,7 +145,7 @@ void tst_QSharedMemory::init()
{
existingSharedMemory = new QSharedMemory(EXISTING_SHARE);
if (!existingSharedMemory->create(EXISTING_SIZE)) {
- QVERIFY(existingSharedMemory->error() == QSharedMemory::AlreadyExists);
+ QCOMPARE(existingSharedMemory->error(), QSharedMemory::AlreadyExists);
}
}
@@ -244,10 +244,10 @@ void tst_QSharedMemory::constructor()
QSharedMemory sm;
QCOMPARE(sm.key(), QString());
QVERIFY(!sm.isAttached());
- QVERIFY(sm.data() == 0);
+ QVERIFY(!sm.data());
QCOMPARE(sm.size(), 0);
QCOMPARE(sm.error(), QSharedMemory::NoError);
- QVERIFY(sm.errorString() == QString());
+ QCOMPARE(sm.errorString(), QString());
}
void tst_QSharedMemory::key_data()
@@ -288,8 +288,8 @@ void tst_QSharedMemory::key()
QCOMPARE(sm.isAttached(), false);
QCOMPARE(sm.error(), QSharedMemory::NoError);
- QVERIFY(sm.errorString() == QString());
- QVERIFY(sm.data() == 0);
+ QCOMPARE(sm.errorString(), QString());
+ QVERIFY(!sm.data());
QCOMPARE(sm.size(), 0);
QCOMPARE(sm.detach(), false);
@@ -328,11 +328,11 @@ void tst_QSharedMemory::create()
qDebug() << sm.errorString();
QCOMPARE(sm.key(), key);
if (canCreate) {
- QVERIFY(sm.errorString() == QString());
+ QCOMPARE(sm.errorString(), QString());
QVERIFY(sm.data() != 0);
QVERIFY(sm.size() != 0);
} else {
- QVERIFY(sm.data() == 0);
+ QVERIFY(!sm.data());
QVERIFY(sm.errorString() != QString());
}
}
@@ -377,10 +377,10 @@ void tst_QSharedMemory::attach()
QVERIFY(sm.size() != 0);
QVERIFY(sm.detach());
QCOMPARE(sm.size(), 0);
- QVERIFY(sm.data() == 0);
+ QVERIFY(!sm.data());
} else {
- QVERIFY(sm.data() == 0);
- QVERIFY(sm.size() == 0);
+ QVERIFY(!sm.data());
+ QCOMPARE(sm.size(), 0);
QVERIFY(sm.errorString() != QString());
QVERIFY(!sm.detach());
}
@@ -481,7 +481,7 @@ void tst_QSharedMemory::useTooMuchMemory()
bool success = true;
int count = 0;
while (success) {
- QString key = QString("maxmemorytest_%1").arg(count++);
+ QString key = QLatin1String("maxmemorytest_") + QString::number(count++);
QSharedMemory *sm = new QSharedMemory(rememberKey(key));
QVERIFY(sm);
jail.append(sm);
@@ -498,7 +498,7 @@ void tst_QSharedMemory::useTooMuchMemory()
QVERIFY(!sm->isAttached());
QCOMPARE(sm->key(), key);
QCOMPARE(sm->size(), 0);
- QVERIFY(sm->data() == 0);
+ QVERIFY(!sm->data());
if (sm->error() != QSharedMemory::OutOfResources)
qDebug() << sm->error() << sm->errorString();
// ### Linux won't return OutOfResources if there are not enough semaphores to use.
@@ -535,7 +535,7 @@ void tst_QSharedMemory::attachTooMuch()
QVERIFY(!war->isAttached());
QCOMPARE(war->key(), government.key());
QCOMPARE(war->size(), 0);
- QVERIFY(war->data() == 0);
+ QVERIFY(!war->data());
QCOMPARE(war->error(), QSharedMemory::OutOfResources);
QVERIFY(war->errorString() != QString());
QVERIFY(!war->detach());
diff --git a/tests/auto/corelib/kernel/qsignalblocker/qsignalblocker.pro b/tests/auto/corelib/kernel/qsignalblocker/qsignalblocker.pro
index c6c6f379eb..6e4913db5d 100644
--- a/tests/auto/corelib/kernel/qsignalblocker/qsignalblocker.pro
+++ b/tests/auto/corelib/kernel/qsignalblocker/qsignalblocker.pro
@@ -1,7 +1,5 @@
CONFIG += testcase console
-CONFIG += parallel_test
TARGET = tst_qsignalblocker
QT = core testlib
SOURCES = tst_qsignalblocker.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qsignalmapper/qsignalmapper.pro b/tests/auto/corelib/kernel/qsignalmapper/qsignalmapper.pro
index 526db5eef3..418d6dce62 100644
--- a/tests/auto/corelib/kernel/qsignalmapper/qsignalmapper.pro
+++ b/tests/auto/corelib/kernel/qsignalmapper/qsignalmapper.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsignalmapper
QT = core testlib
SOURCES = tst_qsignalmapper.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qsignalmapper/tst_qsignalmapper.cpp b/tests/auto/corelib/kernel/qsignalmapper/tst_qsignalmapper.cpp
index 579aa78ac4..8a5275e032 100644
--- a/tests/auto/corelib/kernel/qsignalmapper/tst_qsignalmapper.cpp
+++ b/tests/auto/corelib/kernel/qsignalmapper/tst_qsignalmapper.cpp
@@ -97,16 +97,16 @@ void tst_QSignalMapper::mapped()
connect(&mapper, SIGNAL(mapped(QString)), &target, SLOT(myslot(QString)));
src1.emit_mysignal(20);
- QVERIFY(target.id == 1);
+ QCOMPARE(target.id, 1);
QVERIFY(target.str.isEmpty());
src2.emit_mysignal(20);
- QVERIFY(target.id == 2);
- QVERIFY(target.str == "two");
+ QCOMPARE(target.id, 2);
+ QCOMPARE(target.str, QLatin1String("two"));
src3.emit_mysignal(20);
- QVERIFY(target.id == 2);
- QVERIFY(target.str == "three");
+ QCOMPARE(target.id, 2);
+ QCOMPARE(target.str, QLatin1String("three"));
}
QTEST_MAIN(tst_QSignalMapper)
diff --git a/tests/auto/corelib/kernel/qsocketnotifier/qsocketnotifier.pro b/tests/auto/corelib/kernel/qsocketnotifier/qsocketnotifier.pro
index 303a96c68f..58e4b98af7 100644
--- a/tests/auto/corelib/kernel/qsocketnotifier/qsocketnotifier.pro
+++ b/tests/auto/corelib/kernel/qsocketnotifier/qsocketnotifier.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsocketnotifier
QT = core-private network-private testlib
SOURCES = tst_qsocketnotifier.cpp
@@ -7,4 +6,3 @@ SOURCES = tst_qsocketnotifier.cpp
requires(contains(QT_CONFIG,private_tests))
include(../../../network/socket/platformsocketengine/platformsocketengine.pri)
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp b/tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp
index f49da1f5a8..30ce65849d 100644
--- a/tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp
+++ b/tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp
@@ -151,7 +151,7 @@ void tst_QSocketNotifier::unexpectedDisconnection()
readEnd1.initialize(QAbstractSocket::TcpSocket);
readEnd1.connectToHost(server.serverAddress(), server.serverPort());
QVERIFY(readEnd1.waitForWrite());
- QVERIFY(readEnd1.state() == QAbstractSocket::ConnectedState);
+ QCOMPARE(readEnd1.state(), QAbstractSocket::ConnectedState);
QVERIFY(server.waitForNewConnection());
QTcpSocket *writeEnd1 = server.nextPendingConnection();
QVERIFY(writeEnd1 != 0);
@@ -160,7 +160,7 @@ void tst_QSocketNotifier::unexpectedDisconnection()
readEnd2.initialize(QAbstractSocket::TcpSocket);
readEnd2.connectToHost(server.serverAddress(), server.serverPort());
QVERIFY(readEnd2.waitForWrite());
- QVERIFY(readEnd2.state() == QAbstractSocket::ConnectedState);
+ QCOMPARE(readEnd2.state(), QAbstractSocket::ConnectedState);
QVERIFY(server.waitForNewConnection());
QTcpSocket *writeEnd2 = server.nextPendingConnection();
QVERIFY(writeEnd2 != 0);
@@ -186,8 +186,8 @@ void tst_QSocketNotifier::unexpectedDisconnection()
QVERIFY(timer.isActive()); //escape if test would hang
} while(tester.sequence <= 0);
- QVERIFY(readEnd1.state() == QAbstractSocket::ConnectedState);
- QVERIFY(readEnd2.state() == QAbstractSocket::ConnectedState);
+ QCOMPARE(readEnd1.state(), QAbstractSocket::ConnectedState);
+ QCOMPARE(readEnd2.state(), QAbstractSocket::ConnectedState);
QCOMPARE(tester.sequence, 2);
diff --git a/tests/auto/corelib/kernel/qsystemsemaphore/test/tst_qsystemsemaphore.cpp b/tests/auto/corelib/kernel/qsystemsemaphore/test/tst_qsystemsemaphore.cpp
index 169a13aff2..0c0fdb8067 100644
--- a/tests/auto/corelib/kernel/qsystemsemaphore/test/tst_qsystemsemaphore.cpp
+++ b/tests/auto/corelib/kernel/qsystemsemaphore/test/tst_qsystemsemaphore.cpp
@@ -191,13 +191,13 @@ void tst_QSystemSemaphore::basicProcesses()
acquire.start(m_helperBinary, QStringList("acquire"));
QVERIFY2(acquire.waitForStarted(), "Could not start helper binary");
acquire.waitForFinished(HELPERWAITTIME);
- QVERIFY(acquire.state() == QProcess::Running);
+ QCOMPARE(acquire.state(), QProcess::Running);
acquire.kill();
release.start(m_helperBinary, QStringList("release"));
QVERIFY2(release.waitForStarted(), "Could not start helper binary");
acquire.waitForFinished(HELPERWAITTIME);
release.waitForFinished(HELPERWAITTIME);
- QVERIFY(acquire.state() == QProcess::NotRunning);
+ QCOMPARE(acquire.state(), QProcess::NotRunning);
#endif
}
diff --git a/tests/auto/corelib/kernel/qtimer/qtimer.pro b/tests/auto/corelib/kernel/qtimer/qtimer.pro
index 48adf07f64..8afdbb148e 100644
--- a/tests/auto/corelib/kernel/qtimer/qtimer.pro
+++ b/tests/auto/corelib/kernel/qtimer/qtimer.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtimer
QT = core testlib
SOURCES = tst_qtimer.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp b/tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp
index b34a3a6beb..c17d81ea9e 100644
--- a/tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp
+++ b/tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp
@@ -529,7 +529,7 @@ void tst_QTimer::restartedTimerFiresTooSoon()
{
RestartedTimerFiresTooSoonObject object;
object.timerFired();
- QVERIFY(object.eventLoop.exec() == 0);
+ QCOMPARE(object.eventLoop.exec(), 0);
}
class LongLastingSlotClass : public QObject
diff --git a/tests/auto/corelib/kernel/qtranslator/qtranslator.pro b/tests/auto/corelib/kernel/qtranslator/qtranslator.pro
index e588f44370..b7a5a85e09 100644
--- a/tests/auto/corelib/kernel/qtranslator/qtranslator.pro
+++ b/tests/auto/corelib/kernel/qtranslator/qtranslator.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtranslator
QT = core testlib
SOURCES = tst_qtranslator.cpp
diff --git a/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp b/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp
index 2707b6df41..5e967207d4 100644
--- a/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp
+++ b/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp
@@ -107,7 +107,7 @@ void tst_QTranslator::load()
QTranslator tor( 0 );
tor.load("hellotr_la");
QVERIFY(!tor.isEmpty());
- QCOMPARE(tor.translate("QPushButton", "Hello world!"), QString::fromLatin1("Hallo Welt!"));
+ QCOMPARE(tor.translate("QPushButton", "Hello world!"), QLatin1String("Hallo Welt!"));
}
void tst_QTranslator::load2()
@@ -118,7 +118,7 @@ void tst_QTranslator::load2()
QByteArray data = file.readAll();
tor.load((const uchar *)data.constData(), data.length());
QVERIFY(!tor.isEmpty());
- QCOMPARE(tor.translate("QPushButton", "Hello world!"), QString::fromLatin1("Hallo Welt!"));
+ QCOMPARE(tor.translate("QPushButton", "Hello world!"), QLatin1String("Hallo Welt!"));
}
class TranslatorThread : public QThread
@@ -129,7 +129,7 @@ class TranslatorThread : public QThread
if (tor.isEmpty())
qFatal("Could not load translation");
- if (tor.translate("QPushButton", "Hello world!") != QString::fromLatin1("Hallo Welt!"))
+ if (tor.translate("QPushButton", "Hello world!") != QLatin1String("Hallo Welt!"))
qFatal("Test string was not translated correctlys");
}
};
@@ -212,9 +212,9 @@ void tst_QTranslator::plural()
tor.load("hellotr_la");
QVERIFY(!tor.isEmpty());
QCoreApplication::installTranslator(&tor);
- QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 0), QString::fromLatin1("Hallo 0 Welten!"));
- QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 1), QString::fromLatin1("Hallo 1 Welt!"));
- QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 2), QString::fromLatin1("Hallo 2 Welten!"));
+ QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 0), QLatin1String("Hallo 0 Welten!"));
+ QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 1), QLatin1String("Hallo 1 Welt!"));
+ QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 2), QLatin1String("Hallo 2 Welten!"));
}
void tst_QTranslator::translate_qm_file_generated_with_msgfmt()
@@ -240,7 +240,7 @@ void tst_QTranslator::loadFromResource()
QTranslator tor;
tor.load(":/tst_qtranslator/hellotr_la.qm");
QVERIFY(!tor.isEmpty());
- QCOMPARE(tor.translate("QPushButton", "Hello world!"), QString::fromLatin1("Hallo Welt!"));
+ QCOMPARE(tor.translate("QPushButton", "Hello world!"), QLatin1String("Hallo Welt!"));
}
void tst_QTranslator::loadDirectory()
@@ -260,16 +260,16 @@ void tst_QTranslator::dependencies()
QTranslator tor;
tor.load("dependencies_la");
QVERIFY(!tor.isEmpty());
- QCOMPARE(tor.translate("QPushButton", "Hello world!"), QString::fromLatin1("Hallo Welt!"));
+ QCOMPARE(tor.translate("QPushButton", "Hello world!"), QLatin1String("Hallo Welt!"));
// plural
QCoreApplication::installTranslator(&tor);
- QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 0), QString::fromLatin1("Hallo 0 Welten!"));
- QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 1), QString::fromLatin1("Hallo 1 Welt!"));
- QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 2), QString::fromLatin1("Hallo 2 Welten!"));
+ QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 0), QLatin1String("Hallo 0 Welten!"));
+ QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 1), QLatin1String("Hallo 1 Welt!"));
+ QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 2), QLatin1String("Hallo 2 Welten!"));
// pick up translation from the file with dependencies
- QCOMPARE(tor.translate("QPushButton", "It's a small world"), QString::fromLatin1("Es ist eine kleine Welt"));
+ QCOMPARE(tor.translate("QPushButton", "It's a small world"), QLatin1String("Es ist eine kleine Welt"));
}
{
@@ -279,7 +279,7 @@ void tst_QTranslator::dependencies()
QByteArray data = file.readAll();
tor.load((const uchar *)data.constData(), data.length());
QVERIFY(!tor.isEmpty());
- QCOMPARE(tor.translate("QPushButton", "Hello world!"), QString::fromLatin1("Hallo Welt!"));
+ QCOMPARE(tor.translate("QPushButton", "Hello world!"), QLatin1String("Hallo Welt!"));
}
}
diff --git a/tests/auto/corelib/kernel/qvariant/qvariant.pro b/tests/auto/corelib/kernel/qvariant/qvariant.pro
index 39178ba9e6..33e8b6e2ad 100644
--- a/tests/auto/corelib/kernel/qvariant/qvariant.pro
+++ b/tests/auto/corelib/kernel/qvariant/qvariant.pro
@@ -1,9 +1,11 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qvariant
-QT = core testlib
+QT = core-private testlib
INCLUDEPATH += $$PWD/../../../other/qvariant_common
SOURCES = tst_qvariant.cpp
RESOURCES += qvariant.qrc
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
contains(QT_CONFIG, c++11): CONFIG += c++11
+!contains(QT_CONFIG, doubleconversion):!contains(QT_CONFIG, system-doubleconversion) {
+ DEFINES += QT_NO_DOUBLECONVERSION
+}
diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
index 40eb2e5c9d..846f560214 100644
--- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
+++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
@@ -57,6 +57,7 @@
#include <QBuffer>
#include "qnumeric.h"
+#include <private/qlocale_p.h>
#include "tst_qvariant_common.h"
class CustomNonQObject;
@@ -352,13 +353,13 @@ void tst_QVariant::constructor_invalid()
QTest::ignoreMessage(QtWarningMsg, QRegularExpression("^Trying to construct an instance of an invalid type, type id:"));
QVariant variant(static_cast<QVariant::Type>(typeId));
QVERIFY(!variant.isValid());
- QVERIFY(variant.userType() == QMetaType::UnknownType);
+ QCOMPARE(variant.userType(), int(QMetaType::UnknownType));
}
{
QTest::ignoreMessage(QtWarningMsg, QRegularExpression("^Trying to construct an instance of an invalid type, type id:"));
QVariant variant(typeId, /* copy */ 0);
QVERIFY(!variant.isValid());
- QVERIFY(variant.userType() == QMetaType::UnknownType);
+ QCOMPARE(variant.userType(), int(QMetaType::UnknownType));
}
}
@@ -902,7 +903,7 @@ void tst_QVariant::toFloat()
bool ok;
float d = value.toFloat(&ok);
QCOMPARE(d, result);
- QVERIFY(ok == valueOK);
+ QCOMPARE(ok, valueOK);
}
void tst_QVariant::toLongLong_data()
@@ -1029,7 +1030,11 @@ void tst_QVariant::toByteArray_data()
QTest::newRow( "int" ) << QVariant( -123 ) << QByteArray( "-123" );
QTest::newRow( "uint" ) << QVariant( (uint)123 ) << QByteArray( "123" );
QTest::newRow( "double" ) << QVariant( 123.456 ) << QByteArray( "123.456" );
- QTest::newRow( "float" ) << QVariant( 123.456f ) << QByteArray( "123.456001" );
+
+ // Conversion from float to double adds bits of which the double-to-string converter doesn't
+ // know they're insignificant
+ QTest::newRow( "float" ) << QVariant( 123.456f ) << QByteArray( "123.45600128173828" );
+
QTest::newRow( "longlong" ) << QVariant( (qlonglong)34 ) << QByteArray( "34" );
QTest::newRow( "ulonglong" ) << QVariant( (qulonglong)34 ) << QByteArray( "34" );
}
@@ -1055,7 +1060,11 @@ void tst_QVariant::toString_data()
QTest::newRow( "int" ) << QVariant( -123 ) << QString( "-123" );
QTest::newRow( "uint" ) << QVariant( (uint)123 ) << QString( "123" );
QTest::newRow( "double" ) << QVariant( 123.456 ) << QString( "123.456" );
- QTest::newRow( "float" ) << QVariant( 123.456f ) << QString( "123.456001" );
+
+ // Conversion from float to double adds bits of which the double-to-string converter doesn't
+ // know they're insignificant
+ QTest::newRow( "float" ) << QVariant( 123.456f ) << QString( "123.45600128173828" );
+
QTest::newRow( "bool" ) << QVariant( true ) << QString( "true" );
QTest::newRow( "qdate" ) << QVariant( QDate( 2002, 1, 1 ) ) << QString( "2002-01-01" );
QTest::newRow( "qtime" ) << QVariant( QTime( 12, 34, 56 ) ) << QString( "12:34:56" );
@@ -1324,9 +1333,9 @@ void tst_QVariant::writeToReadFromDataStream()
// the uninitialized float can be NaN (observed on Windows Mobile 5 ARMv4i)
float readFloat = qvariant_cast<float>(readVariant);
float writtenFloat = qvariant_cast<float>(writeVariant);
- QVERIFY(qIsNaN(readFloat) == qIsNaN(writtenFloat));
+ QCOMPARE(qIsNaN(readFloat), qIsNaN(writtenFloat));
if (!qIsNaN(readFloat))
- QVERIFY(readFloat == writtenFloat);
+ QCOMPARE(readFloat, writtenFloat);
}
break;
}
@@ -1412,12 +1421,28 @@ void tst_QVariant::operator_eq_eq_data()
QVariant mUIntQString(QString("42"));
QVariant mDouble(42.11);
+#ifdef QT_NO_DOUBLECONVERSION
+ // Without libdouble-conversion we don't get the shortest possible representation.
QVariant mDoubleString(QByteArray("42.109999999999999"));
- QVariant mDoubleQString(QString("42.109999999999999"));
+ QVariant mDoubleQString(QByteArray("42.109999999999999"));
+#else
+ // You cannot fool the double-to-string conversion into producing insignificant digits with
+ // libdouble-conversion. You can, of course, add insignificant digits to the string and fool
+ // the double-to-double comparison after converting the string to a double.
+ QVariant mDoubleString(QByteArray("42.11"));
+ QVariant mDoubleQString(QString("42.11"));
+#endif
+ // Float-to-double conversion produces insignificant extra bits.
QVariant mFloat(42.11f);
- QVariant mFloatString(QByteArray("42.1100006"));
- QVariant mFloatQString(QString("42.1100006"));
+#ifdef QT_NO_DOUBLECONVERSION
+ // The trailing '2' is not significant, but snprintf doesn't know this.
+ QVariant mFloatString(QByteArray("42.110000610351562"));
+ QVariant mFloatQString(QString("42.110000610351562"));
+#else
+ QVariant mFloatString(QByteArray("42.11000061035156"));
+ QVariant mFloatQString(QString("42.11000061035156"));
+#endif
QVariant mLongLong((qlonglong)-42);
QVariant mLongLongString(QByteArray("-42"));
@@ -2116,7 +2141,7 @@ void tst_QVariant::userType()
QVERIFY(!userVar.canConvert(QVariant::String));
QVariant userVar2(userVar);
- QVERIFY(userVar == userVar2);
+ QCOMPARE(userVar, userVar2);
userVar2.setValue(data2);
QVERIFY(userVar != userVar2);
@@ -2130,7 +2155,7 @@ void tst_QVariant::userType()
userVar3.setValue(data2);
userVar3 = userVar2;
- QVERIFY(userVar2 == userVar3);
+ QCOMPARE(userVar2, userVar3);
}
// At this point all QVariants got destroyed but we have 2 MyType instances.
QCOMPARE(instanceCount, 2);
@@ -2145,7 +2170,7 @@ void tst_QVariant::userType()
QVERIFY(!userVar.canConvert(QVariant::String));
QVariant userVar2(userVar);
- QVERIFY(userVar == userVar2);
+ QCOMPARE(userVar, userVar2);
userVar2.setValue(&data2);
QVERIFY(userVar != userVar2);
@@ -2159,10 +2184,10 @@ void tst_QVariant::userType()
/* This check is correct now. userVar2 contains a pointer to data2 and so
* does userVar3. */
- QVERIFY(userVar2 == userVar3);
+ QCOMPARE(userVar2, userVar3);
userVar3 = userVar2;
- QVERIFY(userVar2 == userVar3);
+ QCOMPARE(userVar2, userVar3);
}
QCOMPARE(instanceCount, 2);
@@ -2447,7 +2472,7 @@ void tst_QVariant::saveLoadCustomTypes()
qRegisterMetaTypeStreamOperators<Blah>("Blah");
QCOMPARE(v.userType(), tp);
- QVERIFY(v.type() == QVariant::UserType);
+ QCOMPARE(v.type(), QVariant::UserType);
{
QDataStream stream(&data, QIODevice::WriteOnly);
stream << v;
@@ -2635,7 +2660,7 @@ void tst_QVariant::qvariant_cast_QObject_derived()
{
CustomQObjectDerivedNoMetaType *object = new CustomQObjectDerivedNoMetaType(this);
QVariant data = QVariant::fromValue(object);
- QVERIFY(data.userType() == qMetaTypeId<CustomQObjectDerivedNoMetaType*>());
+ QCOMPARE(data.userType(), qMetaTypeId<CustomQObjectDerivedNoMetaType*>());
QCOMPARE(data.value<QObject *>(), object);
QCOMPARE(data.value<CustomQObjectDerivedNoMetaType *>(), object);
QCOMPARE(data.value<CustomQObject *>(), object);
@@ -2644,7 +2669,7 @@ void tst_QVariant::qvariant_cast_QObject_derived()
CustomQObjectDerived *object = new CustomQObjectDerived(this);
QVariant data = QVariant::fromValue(object);
- QVERIFY(data.userType() == qMetaTypeId<CustomQObjectDerived*>());
+ QCOMPARE(data.userType(), qMetaTypeId<CustomQObjectDerived*>());
QCOMPARE(data.value<QObject *>(), object);
QCOMPARE(data.value<CustomQObjectDerived *>(), object);
@@ -2911,10 +2936,10 @@ void tst_QVariant::voidStar() const
QVariant v1, v2;
v1 = QVariant::fromValue(p1);
v2 = v1;
- QVERIFY(v1 == v2);
+ QCOMPARE(v1, v2);
v2 = QVariant::fromValue(p2);
- QVERIFY(v1 == v2);
+ QCOMPARE(v1, v2);
p2 = 0;
v2 = QVariant::fromValue(p2);
@@ -2931,10 +2956,10 @@ void tst_QVariant::dataStar() const
QCOMPARE(qvariant_cast<Data*>(v1), p1);
QVariant v2 = v1;
- QVERIFY(v1 == v2);
+ QCOMPARE(v1, v2);
v2 = QVariant::fromValue(p1);
- QVERIFY(v1 == v2);
+ QCOMPARE(v1, v2);
delete p1;
}
@@ -3106,8 +3131,8 @@ void tst_QVariant::compareCustomTypes() const
/* We compare pointers. */
QVERIFY(variant1 != variant2);
- QVERIFY(variant1 == variant1);
- QVERIFY(variant2 == variant2);
+ QCOMPARE(variant1, variant1);
+ QCOMPARE(variant2, variant2);
}
void tst_QVariant::timeToDateTime() const
@@ -3330,7 +3355,7 @@ void tst_QVariant::toIntFromQString() const
void tst_QVariant::toIntFromDouble() const
{
double d = 2147483630; // max int 2147483647
- QVERIFY((int)d == 2147483630);
+ QCOMPARE((int)d, 2147483630);
QVariant var(d);
QVERIFY( var.canConvert( QVariant::Int ) );
@@ -3415,10 +3440,11 @@ void tst_QVariant::numericalConvert()
switch (v.userType())
{
case QVariant::Double:
- QCOMPARE(v.toString() , QString::number(num, 'g', DBL_MANT_DIG * std::log10(2.) + 2));
+ QCOMPARE(v.toString() , QString::number(num, 'g', QLocale::FloatingPointShortest));
break;
case QMetaType::Float:
- QCOMPARE(v.toString() , QString::number(float(num), 'g', FLT_MANT_DIG * std::log10(2.) + 2));
+ QCOMPARE(v.toString() ,
+ QString::number(float(num), 'g', QLocale::FloatingPointShortest));
break;
}
}
@@ -3654,8 +3680,17 @@ void tst_QVariant::moreCustomTypes()
QCOMPARE(MyNotMovable::count, 0);
{
+#ifdef QT_NO_DOUBLECONVERSION
+ // snprintf cannot do "shortest" conversion and always adds noise.
PLAY_WITH_VARIANT(12.12, false, "12.119999999999999", 12.12, true);
- PLAY_WITH_VARIANT(12.12f, false, "12.1199999", 12.12f, true);
+#else
+ // Double can be printed exactly with libdouble-conversion
+ PLAY_WITH_VARIANT(12.12, false, "12.12", 12.12, true);
+#endif
+
+ // Float is converted to double, adding insignificant bits
+ PLAY_WITH_VARIANT(12.12f, false, "12.119999885559082", 12.12f, true);
+
PLAY_WITH_VARIANT('a', false, "a", 'a', true);
PLAY_WITH_VARIANT((unsigned char)('a'), false, "a", 'a', true);
PLAY_WITH_VARIANT( quint8(12), false, "\xc", 12, true);
@@ -4160,7 +4195,7 @@ void tst_QVariant::saveInvalid()
QDataStream stream(&data, QIODevice::WriteOnly);
stream.setVersion(version);
stream << QVariant();
- QVERIFY(stream.status() == QDataStream::Ok);
+ QCOMPARE(stream.status(), QDataStream::Ok);
QVERIFY(data.size() >= 4);
QCOMPARE(int(data.constData()[0]), 0);
QCOMPARE(int(data.constData()[1]), 0);
@@ -4174,7 +4209,7 @@ void tst_QVariant::saveNewBuiltinWithOldStream()
QDataStream stream(&data, QIODevice::WriteOnly);
stream.setVersion(QDataStream::Qt_3_1);
stream << QVariant::fromValue<QJsonValue>(123); // QJsonValue class was introduced in Qt5
- QVERIFY(stream.status() == QDataStream::Ok);
+ QCOMPARE(stream.status(), QDataStream::Ok);
QVERIFY(data.size() >= 4);
QCOMPARE(int(data.constData()[0]), 0);
QCOMPARE(int(data.constData()[1]), 0);
diff --git a/tests/auto/corelib/kernel/qwineventnotifier/qwineventnotifier.pro b/tests/auto/corelib/kernel/qwineventnotifier/qwineventnotifier.pro
index f0ac7c621f..20ec7572fb 100644
--- a/tests/auto/corelib/kernel/qwineventnotifier/qwineventnotifier.pro
+++ b/tests/auto/corelib/kernel/qwineventnotifier/qwineventnotifier.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qwineventnotifier
QT = core-private testlib
SOURCES = tst_qwineventnotifier.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/qmimedatabase-cache.pro b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/qmimedatabase-cache.pro
index d0b834824a..e661ff8412 100644
--- a/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/qmimedatabase-cache.pro
+++ b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/qmimedatabase-cache.pro
@@ -10,6 +10,5 @@ RESOURCES += $$QT_SOURCE_TREE/src/corelib/mimetypes/mimetypes.qrc
RESOURCES += ../testdata.qrc
*-g++*:QMAKE_CXXFLAGS += -W -Wall -Wextra -Wshadow -Wno-long-long -Wnon-virtual-dtor
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
unix:!mac:!qnx: DEFINES += USE_XDG_DATA_DIRS
diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/qmimedatabase-xml.pro b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/qmimedatabase-xml.pro
index 4add6c2bcd..160f359116 100644
--- a/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/qmimedatabase-xml.pro
+++ b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/qmimedatabase-xml.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qmimedatabase-xml
@@ -11,6 +11,5 @@ RESOURCES += $$QT_SOURCE_TREE/src/corelib/mimetypes/mimetypes.qrc
RESOURCES += ../testdata.qrc
*-g++*:QMAKE_CXXFLAGS += -W -Wall -Wextra -Wshadow -Wno-long-long -Wnon-virtual-dtor
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
unix:!mac:!qnx: DEFINES += USE_XDG_DATA_DIRS
diff --git a/tests/auto/corelib/mimetypes/qmimetype/qmimetype.pro b/tests/auto/corelib/mimetypes/qmimetype/qmimetype.pro
index f76a4ab951..1540e75c28 100644
--- a/tests/auto/corelib/mimetypes/qmimetype/qmimetype.pro
+++ b/tests/auto/corelib/mimetypes/qmimetype/qmimetype.pro
@@ -1,6 +1,5 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qmimetype
QT = core-private testlib
SOURCES = tst_qmimetype.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/plugin.pro b/tests/auto/corelib/plugin/plugin.pro
index 506f6abaeb..e6b748e4f4 100644
--- a/tests/auto/corelib/plugin/plugin.pro
+++ b/tests/auto/corelib/plugin/plugin.pro
@@ -1,7 +1,10 @@
TEMPLATE=subdirs
SUBDIRS=\
qfactoryloader \
- qlibrary \
- qplugin \
- qpluginloader \
quuid
+
+load(qfeatures)
+!contains(QT_DISABLED_FEATURES, library): SUBDIRS += \
+ qpluginloader \
+ qplugin \
+ qlibrary
diff --git a/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.pro b/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.pro
index 2496cd2f1e..b7a641959a 100644
--- a/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.pro
+++ b/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.pro
@@ -9,4 +9,3 @@ DESTDIR = ../bin
# This is testdata for the tst_qpluginloader test.
target.path = $$[QT_INSTALL_TESTS]/tst_qfactoryloader/bin
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.pro b/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.pro
index e70ed4fb25..b536aff486 100644
--- a/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.pro
+++ b/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.pro
@@ -9,4 +9,3 @@ DESTDIR = ../bin
# This is testdata for the tst_qpluginloader test.
target.path = $$[QT_INSTALL_TESTS]/tst_qfactoryloader/bin
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qfactoryloader/qfactoryloader.pro b/tests/auto/corelib/plugin/qfactoryloader/qfactoryloader.pro
index 42bc01e2ed..ace9fe8fd0 100644
--- a/tests/auto/corelib/plugin/qfactoryloader/qfactoryloader.pro
+++ b/tests/auto/corelib/plugin/qfactoryloader/qfactoryloader.pro
@@ -12,4 +12,3 @@ TARGET = tst_qpluginloader
INSTALLS =
-CONFIG += parallel_test
diff --git a/tests/auto/corelib/plugin/qfactoryloader/test/test.pro b/tests/auto/corelib/plugin/qfactoryloader/test/test.pro
index d8dfaac29e..f1e76c31bf 100644
--- a/tests/auto/corelib/plugin/qfactoryloader/test/test.pro
+++ b/tests/auto/corelib/plugin/qfactoryloader/test/test.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = ../tst_qfactoryloader
QT = core-private testlib
@@ -19,4 +18,8 @@ win32 {
}
mac: CONFIG -= app_bundle
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
+
+load(qfeatures)
+contains(QT_DISABLED_FEATURES, library) {
+ LIBS += -L ../bin/ -lplugin1 -lplugin2
+}
diff --git a/tests/auto/corelib/plugin/qfactoryloader/tst_qfactoryloader.cpp b/tests/auto/corelib/plugin/qfactoryloader/tst_qfactoryloader.cpp
index 474f4e9868..92a4dda252 100644
--- a/tests/auto/corelib/plugin/qfactoryloader/tst_qfactoryloader.cpp
+++ b/tests/auto/corelib/plugin/qfactoryloader/tst_qfactoryloader.cpp
@@ -38,6 +38,11 @@
#include "plugin1/plugininterface1.h"
#include "plugin2/plugininterface2.h"
+#ifdef QT_NO_LIBRARY
+Q_IMPORT_PLUGIN(Plugin1)
+Q_IMPORT_PLUGIN(Plugin2)
+#endif
+
class tst_QFactoryLoader : public QObject
{
Q_OBJECT
@@ -54,8 +59,9 @@ void tst_QFactoryLoader::initTestCase()
{
const QString binFolder = QFINDTESTDATA(binFolderC);
QVERIFY2(!binFolder.isEmpty(), "Unable to locate 'bin' folder");
-
+#ifndef QT_NO_LIBRARY
QCoreApplication::setLibraryPaths(QStringList(QFileInfo(binFolder).absolutePath()));
+#endif
}
void tst_QFactoryLoader::usingTwoFactoriesFromSameDir()
diff --git a/tests/auto/corelib/plugin/qlibrary/lib/lib.pro b/tests/auto/corelib/plugin/qlibrary/lib/lib.pro
index 195e48da93..44bd0be14e 100644
--- a/tests/auto/corelib/plugin/qlibrary/lib/lib.pro
+++ b/tests/auto/corelib/plugin/qlibrary/lib/lib.pro
@@ -20,4 +20,3 @@ win32 {
DESTDIR = ../release/
}
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qlibrary/lib2/lib2.pro b/tests/auto/corelib/plugin/qlibrary/lib2/lib2.pro
index 52dd8b9679..d55747501c 100644
--- a/tests/auto/corelib/plugin/qlibrary/lib2/lib2.pro
+++ b/tests/auto/corelib/plugin/qlibrary/lib2/lib2.pro
@@ -46,4 +46,3 @@ renamed_target.extra = $$member(renamed_target.extra, 0, -2)
QMAKE_POST_LINK = $$member(QMAKE_POST_LINK, 0, -2)
INSTALLS += target renamed_target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qlibrary/qlibrary.pro b/tests/auto/corelib/plugin/qlibrary/qlibrary.pro
index 5bdf780fc0..ec58838e71 100644
--- a/tests/auto/corelib/plugin/qlibrary/qlibrary.pro
+++ b/tests/auto/corelib/plugin/qlibrary/qlibrary.pro
@@ -9,4 +9,3 @@ TARGET = tst_qlibrary
# no special install rule for subdir
INSTALLS =
-CONFIG += parallel_test
diff --git a/tests/auto/corelib/plugin/qlibrary/tst/tst.pro b/tests/auto/corelib/plugin/qlibrary/tst/tst.pro
index 27433d59c0..d59cd738bf 100644
--- a/tests/auto/corelib/plugin/qlibrary/tst/tst.pro
+++ b/tests/auto/corelib/plugin/qlibrary/tst/tst.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
CONFIG -= app_bundle
TARGET = ../tst_qlibrary
QT = core testlib
@@ -14,4 +13,3 @@ win32 {
}
TESTDATA += ../library_path/invalid.so
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qlibrary/tst_qlibrary.cpp b/tests/auto/corelib/plugin/qlibrary/tst_qlibrary.cpp
index f31a7af6dd..8ac4125145 100644
--- a/tests/auto/corelib/plugin/qlibrary/tst_qlibrary.cpp
+++ b/tests/auto/corelib/plugin/qlibrary/tst_qlibrary.cpp
@@ -96,7 +96,7 @@
static QString sys_qualifiedLibraryName(const QString &fileName)
{
QString appDir = QCoreApplication::applicationDirPath();
- return appDir + "/" + PREFIX + fileName + SUFFIX;
+ return appDir + QLatin1Char('/') + PREFIX + fileName + SUFFIX;
}
QT_FORWARD_DECLARE_CLASS(QLibrary)
diff --git a/tests/auto/corelib/plugin/qplugin/debugplugin/debugplugin.pro b/tests/auto/corelib/plugin/qplugin/debugplugin/debugplugin.pro
index a4db0eccf6..ca47df22bd 100644
--- a/tests/auto/corelib/plugin/qplugin/debugplugin/debugplugin.pro
+++ b/tests/auto/corelib/plugin/qplugin/debugplugin/debugplugin.pro
@@ -4,4 +4,3 @@ CONFIG -= release debug_and_release
SOURCES = main.cpp
QT = core
DESTDIR = ../plugins
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qplugin/qplugin.pro b/tests/auto/corelib/plugin/qplugin/qplugin.pro
index e8840a0fb2..918ffb44bd 100644
--- a/tests/auto/corelib/plugin/qplugin/qplugin.pro
+++ b/tests/auto/corelib/plugin/qplugin/qplugin.pro
@@ -25,4 +25,3 @@ mac {
SUBDIRS += tst_qplugin.pro
-CONFIG += parallel_test
diff --git a/tests/auto/corelib/plugin/qplugin/releaseplugin/releaseplugin.pro b/tests/auto/corelib/plugin/qplugin/releaseplugin/releaseplugin.pro
index 0f698312bd..b7dea67894 100644
--- a/tests/auto/corelib/plugin/qplugin/releaseplugin/releaseplugin.pro
+++ b/tests/auto/corelib/plugin/qplugin/releaseplugin/releaseplugin.pro
@@ -4,4 +4,3 @@ CONFIG -= debug debug_and_release
SOURCES = main.cpp
QT = core
DESTDIR = ../plugins
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qplugin/tst_qplugin.pro b/tests/auto/corelib/plugin/qplugin/tst_qplugin.pro
index d1ffff9c4e..8c6540fe87 100644
--- a/tests/auto/corelib/plugin/qplugin/tst_qplugin.pro
+++ b/tests/auto/corelib/plugin/qplugin/tst_qplugin.pro
@@ -1,8 +1,6 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qplugin
QT = core testlib
SOURCES = tst_qplugin.cpp
TESTDATA += plugins/*
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qpluginloader/almostplugin/almostplugin.pro b/tests/auto/corelib/plugin/qpluginloader/almostplugin/almostplugin.pro
index 70ab54a964..abfc70883e 100644
--- a/tests/auto/corelib/plugin/qpluginloader/almostplugin/almostplugin.pro
+++ b/tests/auto/corelib/plugin/qpluginloader/almostplugin/almostplugin.pro
@@ -10,4 +10,3 @@ QT = core
# This is testdata for the tst_qpluginloader test.
target.path = $$[QT_INSTALL_TESTS]/tst_qpluginloader/bin
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qpluginloader/lib/lib.pro b/tests/auto/corelib/plugin/qpluginloader/lib/lib.pro
index c74a00e9a6..bd6f19cb4f 100644
--- a/tests/auto/corelib/plugin/qpluginloader/lib/lib.pro
+++ b/tests/auto/corelib/plugin/qpluginloader/lib/lib.pro
@@ -11,4 +11,3 @@ win32-msvc: DEFINES += WIN32_MSVC
# This is testdata for the tst_qpluginloader test.
target.path = $$[QT_INSTALL_TESTS]/tst_qpluginloader/bin
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qpluginloader/qpluginloader.pro b/tests/auto/corelib/plugin/qpluginloader/qpluginloader.pro
index 5c6c56e389..83d00f7cd8 100644
--- a/tests/auto/corelib/plugin/qpluginloader/qpluginloader.pro
+++ b/tests/auto/corelib/plugin/qpluginloader/qpluginloader.pro
@@ -12,4 +12,3 @@ TARGET = tst_qpluginloader
INSTALLS =
-CONFIG += parallel_test
diff --git a/tests/auto/corelib/plugin/qpluginloader/theplugin/theplugin.pro b/tests/auto/corelib/plugin/qpluginloader/theplugin/theplugin.pro
index 2ea9c27cc9..6ec4a8de05 100644
--- a/tests/auto/corelib/plugin/qpluginloader/theplugin/theplugin.pro
+++ b/tests/auto/corelib/plugin/qpluginloader/theplugin/theplugin.pro
@@ -11,4 +11,3 @@ QT = core
# This is testdata for the tst_qpluginloader test.
target.path = $$[QT_INSTALL_TESTS]/tst_qpluginloader/bin
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qpluginloader/tst/tst.pro b/tests/auto/corelib/plugin/qpluginloader/tst/tst.pro
index 3894c90ae3..101392927c 100644
--- a/tests/auto/corelib/plugin/qpluginloader/tst/tst.pro
+++ b/tests/auto/corelib/plugin/qpluginloader/tst/tst.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = ../tst_qpluginloader
QT = core testlib
contains(QT_CONFIG, private_tests): QT += core-private
@@ -16,4 +15,3 @@ win32 {
}
TESTDATA += ../elftest ../machtest
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp b/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp
index 72bd38d116..9640c52623 100644
--- a/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp
+++ b/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp
@@ -95,7 +95,8 @@
static QString sys_qualifiedLibraryName(const QString &fileName)
{
- QString libname = QFINDTESTDATA(QString("bin/%1%2%3").arg(PREFIX).arg(fileName).arg(SUFFIX));
+ QString name = QLatin1String("bin/") + QLatin1String(PREFIX) + fileName + QLatin1String(SUFFIX);
+ const QString libname = QFINDTESTDATA(name);
QFileInfo fi(libname);
if (fi.exists())
return fi.canonicalFilePath();
@@ -386,7 +387,8 @@ void tst_QPluginLoader::loadMachO()
void tst_QPluginLoader::loadGarbage()
{
for (int i=0; i<5; i++) {
- QPluginLoader lib(QFINDTESTDATA(QString("elftest/garbage%1.so").arg(i+1)));
+ const QString name = QLatin1String("elftest/garbage") + QString::number(i + 1) + QLatin1String(".so");
+ QPluginLoader lib(QFINDTESTDATA(name));
QCOMPARE(lib.load(), false);
QVERIFY(lib.errorString() != QString("Unknown error"));
}
diff --git a/tests/auto/corelib/plugin/quuid/quuid.pro b/tests/auto/corelib/plugin/quuid/quuid.pro
index 461956f313..25e24561ae 100644
--- a/tests/auto/corelib/plugin/quuid/quuid.pro
+++ b/tests/auto/corelib/plugin/quuid/quuid.pro
@@ -4,4 +4,3 @@ SUBDIRS = testProcessUniqueness
SUBDIRS += test
-CONFIG += parallel_test
diff --git a/tests/auto/corelib/plugin/quuid/test/test.pro b/tests/auto/corelib/plugin/quuid/test/test.pro
index c8312c0985..562bfbdc25 100644
--- a/tests/auto/corelib/plugin/quuid/test/test.pro
+++ b/tests/auto/corelib/plugin/quuid/test/test.pro
@@ -1,9 +1,13 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_quuid
QT = core testlib
SOURCES = ../tst_quuid.cpp
+darwin {
+ OBJECTIVE_SOURCES = ../tst_quuid_darwin.mm
+ LIBS += -framework Foundation
+}
+
CONFIG(debug_and_release_target) {
CONFIG(debug, debug|release) {
DESTDIR = ../debug
@@ -13,4 +17,3 @@ CONFIG(debug_and_release_target) {
} else {
DESTDIR = ..
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/quuid/testProcessUniqueness/testProcessUniqueness.pro b/tests/auto/corelib/plugin/quuid/testProcessUniqueness/testProcessUniqueness.pro
index b2f7aaf2d3..5ee7b1a21f 100644
--- a/tests/auto/corelib/plugin/quuid/testProcessUniqueness/testProcessUniqueness.pro
+++ b/tests/auto/corelib/plugin/quuid/testProcessUniqueness/testProcessUniqueness.pro
@@ -7,4 +7,3 @@ DESTDIR = ./
# This app is testdata for tst_quuid
target.path = $$[QT_INSTALL_TESTS]/tst_quuid/$$TARGET
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/quuid/tst_quuid.cpp b/tests/auto/corelib/plugin/quuid/tst_quuid.cpp
index f31aed6976..ed549907d2 100644
--- a/tests/auto/corelib/plugin/quuid/tst_quuid.cpp
+++ b/tests/auto/corelib/plugin/quuid/tst_quuid.cpp
@@ -73,6 +73,8 @@ private slots:
void qvariant();
void qvariant_conversion();
+ void darwinTypes();
+
public:
// Variables
QUuid uuidNS;
@@ -223,11 +225,11 @@ void tst_QUuid::equal()
QVERIFY( !(uuidA == uuidB) );
QUuid copy(uuidA);
- QVERIFY(uuidA == copy);
+ QCOMPARE(uuidA, copy);
QUuid assigned;
assigned = uuidA;
- QVERIFY(uuidA == assigned);
+ QCOMPARE(uuidA, assigned);
}
@@ -406,5 +408,15 @@ void tst_QUuid::qvariant_conversion()
QCOMPARE(sv.value<QUuid>(), uuid);
}
+void tst_QUuid::darwinTypes()
+{
+#ifndef Q_OS_DARWIN
+ QSKIP("This is a Darwin-only test");
+#else
+ extern void tst_QUuid_darwinTypes(); // in tst_quuid_darwin.mm
+ tst_QUuid_darwinTypes();
+#endif
+}
+
QTEST_MAIN(tst_QUuid)
#include "tst_quuid.moc"
diff --git a/tests/auto/corelib/plugin/quuid/tst_quuid_darwin.mm b/tests/auto/corelib/plugin/quuid/tst_quuid_darwin.mm
new file mode 100644
index 0000000000..251250d4ce
--- /dev/null
+++ b/tests/auto/corelib/plugin/quuid/tst_quuid_darwin.mm
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore/QUuid>
+#include <QtTest/QtTest>
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <Foundation/Foundation.h>
+
+void tst_QUuid_darwinTypes()
+{
+ // QUuid <-> CFUUID
+ {
+ QUuid qtUuid(QByteArrayLiteral("0f7169cc-5711-4af9-99d9-fecb2329fdef"));
+ const CFUUIDRef cfuuid = qtUuid.toCFUUID();
+ QCOMPARE(QUuid::fromCFUUID(cfuuid), qtUuid);
+ CFStringRef cfstring = CFUUIDCreateString(0, cfuuid);
+ QCOMPARE(QString::fromCFString(cfstring), qtUuid.toString().mid(1, 36).toUpper());
+ CFRelease(cfstring);
+ CFRelease(cfuuid);
+ }
+ {
+ QUuid qtUuid(QByteArrayLiteral("0f7169cc-5711-4af9-99d9-fecb2329fdef"));
+ const CFUUIDRef cfuuid = qtUuid.toCFUUID();
+ QUuid qtUuidCopy(qtUuid);
+ qtUuid = QUuid(QByteArrayLiteral("93eec131-13c5-4d13-aaea-e456b4c57efa")); // modify
+ QCOMPARE(QUuid::fromCFUUID(cfuuid), qtUuidCopy);
+ CFStringRef cfstring = CFUUIDCreateString(0, cfuuid);
+ QCOMPARE(QString::fromCFString(cfstring), qtUuidCopy.toString().mid(1, 36).toUpper());
+ CFRelease(cfstring);
+ CFRelease(cfuuid);
+ }
+ // QUuid <-> NSUUID
+ {
+ QMacAutoReleasePool pool;
+
+ QUuid qtUuid(QByteArrayLiteral("0f7169cc-5711-4af9-99d9-fecb2329fdef"));
+ const NSUUID *nsuuid = qtUuid.toNSUUID();
+ QCOMPARE(QUuid::fromNSUUID(nsuuid), qtUuid);
+ QCOMPARE(QString::fromNSString([nsuuid UUIDString]), qtUuid.toString().mid(1, 36).toUpper());
+ }
+ {
+ QMacAutoReleasePool pool;
+
+ QUuid qtUuid(QByteArrayLiteral("0f7169cc-5711-4af9-99d9-fecb2329fdef"));
+ const NSUUID *nsuuid = qtUuid.toNSUUID();
+ QUuid qtUuidCopy(qtUuid);
+ qtUuid = QUuid(QByteArrayLiteral("93eec131-13c5-4d13-aaea-e456b4c57efa")); // modify
+ QCOMPARE(QUuid::fromNSUUID(nsuuid), qtUuidCopy);
+ QCOMPARE(QString::fromNSString([nsuuid UUIDString]), qtUuidCopy.toString().mid(1, 36).toUpper());
+ }
+}
diff --git a/tests/auto/corelib/statemachine/qstate/qstate.pro b/tests/auto/corelib/statemachine/qstate/qstate.pro
index 22e57d5615..e2251ded9d 100644
--- a/tests/auto/corelib/statemachine/qstate/qstate.pro
+++ b/tests/auto/corelib/statemachine/qstate/qstate.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstate
QT = core testlib
SOURCES = tst_qstate.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/statemachine/qstatemachine/qstatemachine.pro b/tests/auto/corelib/statemachine/qstatemachine/qstatemachine.pro
index f6fbbc83c6..4f16b2a9ca 100644
--- a/tests/auto/corelib/statemachine/qstatemachine/qstatemachine.pro
+++ b/tests/auto/corelib/statemachine/qstatemachine/qstatemachine.pro
@@ -1,7 +1,5 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qstatemachine
QT = core-private testlib
qtHaveModule(widgets): QT += widgets
SOURCES = tst_qstatemachine.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp b/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp
index cfbb88a123..379215a6c5 100644
--- a/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp
+++ b/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp
@@ -238,6 +238,9 @@ private slots:
void multiTargetTransitionInsideParallelStateGroup();
void signalTransitionNormalizeSignature();
+#ifdef Q_COMPILER_DELEGATING_CONSTRUCTORS
+ void createPointerToMemberSignalTransition();
+#endif
void createSignalTransitionWhenRunning();
void createEventTransitionWhenRunning();
void signalTransitionSenderInDifferentThread();
@@ -3036,7 +3039,7 @@ void tst_QStateMachine::graphicsSceneEventTransitions()
QVERIFY(runningSpy.isValid());
machine.start();
QTRY_COMPARE(startedSpy.count(), 1);
- QVERIFY(finishedSpy.count() == 0);
+ QCOMPARE(finishedSpy.count(), 0);
TEST_RUNNING_CHANGED(true);
QGraphicsSceneMouseEvent mouseEvent(QEvent::GraphicsSceneMouseMove);
scene.sendEvent(textItem, &mouseEvent);
@@ -5876,6 +5879,31 @@ void tst_QStateMachine::signalTransitionNormalizeSignature()
TEST_ACTIVE_CHANGED(s1, 1);
}
+#ifdef Q_COMPILER_DELEGATING_CONSTRUCTORS
+void tst_QStateMachine::createPointerToMemberSignalTransition()
+{
+ QStateMachine machine;
+ QState *s1 = new QState(&machine);
+ DEFINE_ACTIVE_SPY(s1);
+ machine.setInitialState(s1);
+ machine.start();
+ TEST_ACTIVE_CHANGED(s1, 1);
+ QTRY_VERIFY(machine.configuration().contains(s1));
+
+ QState *s2 = new QState(&machine);
+ DEFINE_ACTIVE_SPY(s2);
+ SignalEmitter emitter;
+ QSignalTransition *t1 = new QSignalTransition(&emitter, &SignalEmitter::signalWithNoArg, s1);
+ QCOMPARE(t1->sourceState(), s1);
+ t1->setTargetState(s2);
+ s1->addTransition(t1);
+ emitter.emitSignalWithNoArg();
+ TEST_ACTIVE_CHANGED(s1, 2);
+ TEST_ACTIVE_CHANGED(s2, 1);
+ QTRY_VERIFY(machine.configuration().contains(s2));
+}
+#endif
+
void tst_QStateMachine::createSignalTransitionWhenRunning()
{
QStateMachine machine;
@@ -6158,26 +6186,26 @@ void tst_QStateMachine::childModeConstructor()
{
QStateMachine machine(QState::ExclusiveStates);
QCOMPARE(machine.childMode(), QState::ExclusiveStates);
- QVERIFY(machine.parent() == 0);
- QVERIFY(machine.parentState() == 0);
+ QVERIFY(!machine.parent());
+ QVERIFY(!machine.parentState());
}
{
QStateMachine machine(QState::ParallelStates);
QCOMPARE(machine.childMode(), QState::ParallelStates);
- QVERIFY(machine.parent() == 0);
- QVERIFY(machine.parentState() == 0);
+ QVERIFY(!machine.parent());
+ QVERIFY(!machine.parentState());
}
{
QStateMachine machine(QState::ExclusiveStates, this);
QCOMPARE(machine.childMode(), QState::ExclusiveStates);
QCOMPARE(machine.parent(), static_cast<QObject *>(this));
- QVERIFY(machine.parentState() == 0);
+ QVERIFY(!machine.parentState());
}
{
QStateMachine machine(QState::ParallelStates, this);
QCOMPARE(machine.childMode(), QState::ParallelStates);
QCOMPARE(machine.parent(), static_cast<QObject *>(this));
- QVERIFY(machine.parentState() == 0);
+ QVERIFY(!machine.parentState());
}
QState state;
{
diff --git a/tests/auto/corelib/thread/qatomicint/qatomicint.pro b/tests/auto/corelib/thread/qatomicint/qatomicint.pro
index 1a3f7cc926..89ac465e81 100644
--- a/tests/auto/corelib/thread/qatomicint/qatomicint.pro
+++ b/tests/auto/corelib/thread/qatomicint/qatomicint.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qatomicint
QT = core testlib
SOURCES = tst_qatomicint.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qatomicinteger/qatomicinteger.pri b/tests/auto/corelib/thread/qatomicinteger/qatomicinteger.pri
index e80e71f238..29e9464a4d 100644
--- a/tests/auto/corelib/thread/qatomicinteger/qatomicinteger.pri
+++ b/tests/auto/corelib/thread/qatomicinteger/qatomicinteger.pri
@@ -13,7 +13,7 @@ equals(FORCE, no-cxx11) {
suffix = $$TYPE
}
-CONFIG += testcase parallel_test
+CONFIG += testcase
QT = core testlib
TARGET = tst_qatomicinteger_$$lower($$suffix)
SOURCES = $$PWD/tst_qatomicinteger.cpp
diff --git a/tests/auto/corelib/thread/qatomicpointer/qatomicpointer.pro b/tests/auto/corelib/thread/qatomicpointer/qatomicpointer.pro
index 8468496d9c..cce822da6e 100644
--- a/tests/auto/corelib/thread/qatomicpointer/qatomicpointer.pro
+++ b/tests/auto/corelib/thread/qatomicpointer/qatomicpointer.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qatomicpointer
QT = core testlib
SOURCES = tst_qatomicpointer.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qatomicpointer/tst_qatomicpointer.cpp b/tests/auto/corelib/thread/qatomicpointer/tst_qatomicpointer.cpp
index dbc239a3f9..392c4be1c6 100644
--- a/tests/auto/corelib/thread/qatomicpointer/tst_qatomicpointer.cpp
+++ b/tests/auto/corelib/thread/qatomicpointer/tst_qatomicpointer.cpp
@@ -123,15 +123,15 @@ void tst_QAtomicPointer::constructor()
{
void *one = this;
QAtomicPointer<void> atomic1 = one;
- QVERIFY(atomic1.load() == one);
+ QCOMPARE(atomic1.load(), one);
void *two = &one;
QAtomicPointer<void> atomic2 = two;
- QVERIFY(atomic2.load() == two);
+ QCOMPARE(atomic2.load(), two);
void *three = &two;
QAtomicPointer<void> atomic3 = three;
- QVERIFY(atomic3.load() == three);
+ QCOMPARE(atomic3.load(), three);
}
void tst_QAtomicPointer::copy_constructor()
@@ -139,19 +139,19 @@ void tst_QAtomicPointer::copy_constructor()
void *one = this;
QAtomicPointer<void> atomic1 = one;
QAtomicPointer<void> atomic1_copy = atomic1;
- QVERIFY(atomic1_copy.load() == one);
+ QCOMPARE(atomic1_copy.load(), one);
QCOMPARE(atomic1_copy.load(), atomic1.load());
void *two = &one;
QAtomicPointer<void> atomic2 = two;
QAtomicPointer<void> atomic2_copy = atomic2;
- QVERIFY(atomic2_copy.load() == two);
+ QCOMPARE(atomic2_copy.load(), two);
QCOMPARE(atomic2_copy.load(), atomic2.load());
void *three = &two;
QAtomicPointer<void> atomic3 = three;
QAtomicPointer<void> atomic3_copy = atomic3;
- QVERIFY(atomic3_copy.load() == three);
+ QCOMPARE(atomic3_copy.load(), three);
QCOMPARE(atomic3_copy.load(), atomic3.load());
}
@@ -165,17 +165,17 @@ void tst_QAtomicPointer::assignment_operator()
QAtomicPointer<void> atomic2 = two;
QAtomicPointer<void> atomic3 = three;
- QVERIFY(atomic1.load() == one);
- QVERIFY(atomic2.load() == two);
- QVERIFY(atomic3.load() == three);
+ QCOMPARE(atomic1.load(), one);
+ QCOMPARE(atomic2.load(), two);
+ QCOMPARE(atomic3.load(), three);
atomic1 = two;
atomic2 = three;
atomic3 = one;
- QVERIFY(atomic1.load() == two);
- QVERIFY(atomic2.load() == three);
- QVERIFY(atomic3.load() == one);
+ QCOMPARE(atomic1.load(), two);
+ QCOMPARE(atomic2.load(), three);
+ QCOMPARE(atomic3.load(), one);
}
void tst_QAtomicPointer::isTestAndSetNative()
@@ -240,15 +240,15 @@ void tst_QAtomicPointer::testAndSet()
QCOMPARE(atomic1.load(), one);
QCOMPARE(atomic2.load(), two);
- QVERIFY(atomic3.load() == three);
+ QCOMPARE(atomic3.load(), three);
QVERIFY(atomic1.testAndSetRelaxed(one, two));
QVERIFY(atomic2.testAndSetRelaxed(two, three));
QVERIFY(atomic3.testAndSetRelaxed(three, one));
- QVERIFY(atomic1.load() == two);
- QVERIFY(atomic2.load() == three);
- QVERIFY(atomic3.load() == one);
+ QCOMPARE(atomic1.load(), two);
+ QCOMPARE(atomic2.load(), three);
+ QCOMPARE(atomic3.load(), one);
}
{
@@ -258,15 +258,15 @@ void tst_QAtomicPointer::testAndSet()
QCOMPARE(atomic1.load(), one);
QCOMPARE(atomic2.load(), two);
- QVERIFY(atomic3.load() == three);
+ QCOMPARE(atomic3.load(), three);
QVERIFY(atomic1.testAndSetAcquire(one, two));
QVERIFY(atomic2.testAndSetAcquire(two, three));
QVERIFY(atomic3.testAndSetAcquire(three, one));
- QVERIFY(atomic1.load() == two);
- QVERIFY(atomic2.load() == three);
- QVERIFY(atomic3.load() == one);
+ QCOMPARE(atomic1.load(), two);
+ QCOMPARE(atomic2.load(), three);
+ QCOMPARE(atomic3.load(), one);
}
{
@@ -276,15 +276,15 @@ void tst_QAtomicPointer::testAndSet()
QCOMPARE(atomic1.load(), one);
QCOMPARE(atomic2.load(), two);
- QVERIFY(atomic3.load() == three);
+ QCOMPARE(atomic3.load(), three);
QVERIFY(atomic1.testAndSetRelease(one, two));
QVERIFY(atomic2.testAndSetRelease(two, three));
QVERIFY(atomic3.testAndSetRelease(three, one));
- QVERIFY(atomic1.load() == two);
- QVERIFY(atomic2.load() == three);
- QVERIFY(atomic3.load() == one);
+ QCOMPARE(atomic1.load(), two);
+ QCOMPARE(atomic2.load(), three);
+ QCOMPARE(atomic3.load(), one);
}
{
@@ -294,15 +294,15 @@ void tst_QAtomicPointer::testAndSet()
QCOMPARE(atomic1.load(), one);
QCOMPARE(atomic2.load(), two);
- QVERIFY(atomic3.load() == three);
+ QCOMPARE(atomic3.load(), three);
QVERIFY(atomic1.testAndSetOrdered(one, two));
QVERIFY(atomic2.testAndSetOrdered(two, three));
QVERIFY(atomic3.testAndSetOrdered(three, one));
- QVERIFY(atomic1.load() == two);
- QVERIFY(atomic2.load() == three);
- QVERIFY(atomic3.load() == one);
+ QCOMPARE(atomic1.load(), two);
+ QCOMPARE(atomic2.load(), three);
+ QCOMPARE(atomic3.load(), one);
}
}
@@ -368,15 +368,15 @@ void tst_QAtomicPointer::fetchAndStore()
QCOMPARE(atomic1.load(), one);
QCOMPARE(atomic2.load(), two);
- QVERIFY(atomic3.load() == three);
+ QCOMPARE(atomic3.load(), three);
QCOMPARE(atomic1.fetchAndStoreRelaxed(two), one);
QCOMPARE(atomic2.fetchAndStoreRelaxed(three), two);
QCOMPARE(atomic3.fetchAndStoreRelaxed(one), three);
- QVERIFY(atomic1.load() == two);
- QVERIFY(atomic2.load() == three);
- QVERIFY(atomic3.load() == one);
+ QCOMPARE(atomic1.load(), two);
+ QCOMPARE(atomic2.load(), three);
+ QCOMPARE(atomic3.load(), one);
}
{
@@ -386,15 +386,15 @@ void tst_QAtomicPointer::fetchAndStore()
QCOMPARE(atomic1.load(), one);
QCOMPARE(atomic2.load(), two);
- QVERIFY(atomic3.load() == three);
+ QCOMPARE(atomic3.load(), three);
QCOMPARE(atomic1.fetchAndStoreAcquire(two), one);
QCOMPARE(atomic2.fetchAndStoreAcquire(three), two);
QCOMPARE(atomic3.fetchAndStoreAcquire(one), three);
- QVERIFY(atomic1.load() == two);
- QVERIFY(atomic2.load() == three);
- QVERIFY(atomic3.load() == one);
+ QCOMPARE(atomic1.load(), two);
+ QCOMPARE(atomic2.load(), three);
+ QCOMPARE(atomic3.load(), one);
}
{
@@ -404,15 +404,15 @@ void tst_QAtomicPointer::fetchAndStore()
QCOMPARE(atomic1.load(), one);
QCOMPARE(atomic2.load(), two);
- QVERIFY(atomic3.load() == three);
+ QCOMPARE(atomic3.load(), three);
QCOMPARE(atomic1.fetchAndStoreRelease(two), one);
QCOMPARE(atomic2.fetchAndStoreRelease(three), two);
QCOMPARE(atomic3.fetchAndStoreRelease(one), three);
- QVERIFY(atomic1.load() == two);
- QVERIFY(atomic2.load() == three);
- QVERIFY(atomic3.load() == one);
+ QCOMPARE(atomic1.load(), two);
+ QCOMPARE(atomic2.load(), three);
+ QCOMPARE(atomic3.load(), one);
}
{
@@ -422,15 +422,15 @@ void tst_QAtomicPointer::fetchAndStore()
QCOMPARE(atomic1.load(), one);
QCOMPARE(atomic2.load(), two);
- QVERIFY(atomic3.load() == three);
+ QCOMPARE(atomic3.load(), three);
QCOMPARE(atomic1.fetchAndStoreOrdered(two), one);
QCOMPARE(atomic2.fetchAndStoreOrdered(three), two);
QCOMPARE(atomic3.fetchAndStoreOrdered(one), three);
- QVERIFY(atomic1.load() == two);
- QVERIFY(atomic2.load() == three);
- QVERIFY(atomic3.load() == one);
+ QCOMPARE(atomic1.load(), two);
+ QCOMPARE(atomic2.load(), three);
+ QCOMPARE(atomic3.load(), one);
}
}
diff --git a/tests/auto/corelib/thread/qfuture/qfuture.pro b/tests/auto/corelib/thread/qfuture/qfuture.pro
index 36853de2f0..ed9e189668 100644
--- a/tests/auto/corelib/thread/qfuture/qfuture.pro
+++ b/tests/auto/corelib/thread/qfuture/qfuture.pro
@@ -1,6 +1,5 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qfuture
QT = core core-private testlib concurrent
SOURCES = tst_qfuture.cpp
DEFINES += QT_STRICT_ITERATORS
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp b/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp
index ad690a094b..e9db99f3cd 100644
--- a/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp
+++ b/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp
@@ -84,9 +84,9 @@ void tst_QFuture::resultStore()
{
QtPrivate::ResultStore<int> store;
- QVERIFY(store.begin() == store.end());
- QVERIFY(store.resultAt(0) == store.end());
- QVERIFY(store.resultAt(1) == store.end());
+ QCOMPARE(store.begin(), store.end());
+ QCOMPARE(store.resultAt(0), store.end());
+ QCOMPARE(store.resultAt(1), store.end());
}
@@ -118,7 +118,7 @@ void tst_QFuture::resultStore()
store.addResults(-1, &vec1, 2, 2);
QtPrivate::ResultIteratorBase it = store.begin();
QCOMPARE(it.resultIndex(), 0);
- QVERIFY(it == store.begin());
+ QCOMPARE(it, store.begin());
QVERIFY(it != store.end());
++it;
@@ -133,7 +133,7 @@ void tst_QFuture::resultStore()
QCOMPARE(it.resultIndex(), 3);
++it;
- QVERIFY(it == store.end());
+ QCOMPARE(it, store.end());
}
{
QtPrivate::ResultStoreBase store;
@@ -1012,14 +1012,14 @@ void tst_QFuture::iterators()
QFuture<int>::const_iterator i1 = f.begin(), i2 = i1 + 1;
QFuture<int>::const_iterator c1 = i1, c2 = c1 + 1;
- QVERIFY(i1 == i1);
- QVERIFY(i1 == c1);
- QVERIFY(c1 == i1);
- QVERIFY(c1 == c1);
- QVERIFY(i2 == i2);
- QVERIFY(i2 == c2);
- QVERIFY(c2 == i2);
- QVERIFY(c2 == c2);
+ QCOMPARE(i1, i1);
+ QCOMPARE(i1, c1);
+ QCOMPARE(c1, i1);
+ QCOMPARE(c1, c1);
+ QCOMPARE(i2, i2);
+ QCOMPARE(i2, c2);
+ QCOMPARE(c2, i2);
+ QCOMPARE(c2, c2);
QVERIFY(i1 != i2);
QVERIFY(i1 != c2);
@@ -1061,14 +1061,14 @@ void tst_QFuture::iterators()
QFuture<QString>::const_iterator i1 = f.begin(), i2 = i1 + 1;
QFuture<QString>::const_iterator c1 = i1, c2 = c1 + 1;
- QVERIFY(i1 == i1);
- QVERIFY(i1 == c1);
- QVERIFY(c1 == i1);
- QVERIFY(c1 == c1);
- QVERIFY(i2 == i2);
- QVERIFY(i2 == c2);
- QVERIFY(c2 == i2);
- QVERIFY(c2 == c2);
+ QCOMPARE(i1, i1);
+ QCOMPARE(i1, c1);
+ QCOMPARE(c1, i1);
+ QCOMPARE(c1, c1);
+ QCOMPARE(i2, i2);
+ QCOMPARE(i2, c2);
+ QCOMPARE(c2, i2);
+ QCOMPARE(c2, c2);
QVERIFY(i1 != i2);
QVERIFY(i1 != c2);
@@ -1438,6 +1438,8 @@ void tst_QFuture::nestedExceptions()
QVERIFY(MyClass::caught);
}
+#endif // QT_NO_EXCEPTIONS
+
void tst_QFuture::nonGlobalThreadPool()
{
static Q_CONSTEXPR int Answer = 42;
@@ -1485,7 +1487,5 @@ void tst_QFuture::nonGlobalThreadPool()
}
}
-#endif // QT_NO_EXCEPTIONS
-
QTEST_MAIN(tst_QFuture)
#include "tst_qfuture.moc"
diff --git a/tests/auto/corelib/thread/qfuturesynchronizer/qfuturesynchronizer.pro b/tests/auto/corelib/thread/qfuturesynchronizer/qfuturesynchronizer.pro
index a828213ade..5eebd12deb 100644
--- a/tests/auto/corelib/thread/qfuturesynchronizer/qfuturesynchronizer.pro
+++ b/tests/auto/corelib/thread/qfuturesynchronizer/qfuturesynchronizer.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qfuturesynchronizer
QT = core testlib concurrent
SOURCES = tst_qfuturesynchronizer.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qfuturewatcher/qfuturewatcher.pro b/tests/auto/corelib/thread/qfuturewatcher/qfuturewatcher.pro
index 17c0363ce4..d0e8b4c982 100644
--- a/tests/auto/corelib/thread/qfuturewatcher/qfuturewatcher.pro
+++ b/tests/auto/corelib/thread/qfuturewatcher/qfuturewatcher.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qfuturewatcher
QT = core core-private testlib concurrent
SOURCES = tst_qfuturewatcher.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qmutex/qmutex.pro b/tests/auto/corelib/thread/qmutex/qmutex.pro
index dde0a7f88f..229e57eb89 100644
--- a/tests/auto/corelib/thread/qmutex/qmutex.pro
+++ b/tests/auto/corelib/thread/qmutex/qmutex.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qmutex
QT = core testlib
SOURCES = tst_qmutex.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qmutexlocker/qmutexlocker.pro b/tests/auto/corelib/thread/qmutexlocker/qmutexlocker.pro
index d35eca1009..76ec0471ca 100644
--- a/tests/auto/corelib/thread/qmutexlocker/qmutexlocker.pro
+++ b/tests/auto/corelib/thread/qmutexlocker/qmutexlocker.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qmutexlocker
QT = core testlib
SOURCES = tst_qmutexlocker.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qreadlocker/qreadlocker.pro b/tests/auto/corelib/thread/qreadlocker/qreadlocker.pro
index d391768102..ba46786750 100644
--- a/tests/auto/corelib/thread/qreadlocker/qreadlocker.pro
+++ b/tests/auto/corelib/thread/qreadlocker/qreadlocker.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qreadlocker
QT = core testlib
SOURCES = tst_qreadlocker.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qreadwritelock/qreadwritelock.pro b/tests/auto/corelib/thread/qreadwritelock/qreadwritelock.pro
index b38d731049..c108c3d8af 100644
--- a/tests/auto/corelib/thread/qreadwritelock/qreadwritelock.pro
+++ b/tests/auto/corelib/thread/qreadwritelock/qreadwritelock.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qreadwritelock
QT = core testlib
SOURCES = tst_qreadwritelock.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qresultstore/qresultstore.pro b/tests/auto/corelib/thread/qresultstore/qresultstore.pro
index 5e9e83c503..2f6c18f64c 100644
--- a/tests/auto/corelib/thread/qresultstore/qresultstore.pro
+++ b/tests/auto/corelib/thread/qresultstore/qresultstore.pro
@@ -1,6 +1,5 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qresultstore
QT = core-private testlib concurrent
SOURCES = tst_qresultstore.cpp
DEFINES += QT_STRICT_ITERATORS
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qresultstore/tst_qresultstore.cpp b/tests/auto/corelib/thread/qresultstore/tst_qresultstore.cpp
index ff850683ac..821077de18 100644
--- a/tests/auto/corelib/thread/qresultstore/tst_qresultstore.cpp
+++ b/tests/auto/corelib/thread/qresultstore/tst_qresultstore.cpp
@@ -80,9 +80,9 @@ void tst_QtConcurrentResultStore::iterators()
{
{
ResultStore<int> store;
- QVERIFY(store.begin() == store.end());
- QVERIFY(store.resultAt(0) == store.end());
- QVERIFY(store.resultAt(1) == store.end());
+ QCOMPARE(store.begin(), store.end());
+ QCOMPARE(store.resultAt(0), store.end());
+ QCOMPARE(store.resultAt(1), store.end());
}
{
ResultStoreBase storebase;
@@ -90,7 +90,7 @@ void tst_QtConcurrentResultStore::iterators()
storebase.addResult(1, &int1); // ResultStoreBase does not take ownership, only ResultStore<> does.
ResultIteratorBase it = storebase.begin();
QCOMPARE(it.resultIndex(), 0);
- QVERIFY(it == storebase.begin());
+ QCOMPARE(it, storebase.begin());
QVERIFY(it != storebase.end());
++it;
@@ -100,7 +100,7 @@ void tst_QtConcurrentResultStore::iterators()
++it;
QVERIFY(it != storebase.begin());
- QVERIFY(it == storebase.end());
+ QCOMPARE(it, storebase.end());
}
}
@@ -160,7 +160,7 @@ void tst_QtConcurrentResultStore::addResults()
store.addResults(-1, &vec1, 2, 2);
ResultIteratorBase it = store.begin();
QCOMPARE(it.resultIndex(), 0);
- QVERIFY(it == store.begin());
+ QCOMPARE(it, store.begin());
QVERIFY(it != store.end());
++it;
@@ -175,7 +175,7 @@ void tst_QtConcurrentResultStore::addResults()
QCOMPARE(it.resultIndex(), 3);
++it;
- QVERIFY(it == store.end());
+ QCOMPARE(it, store.end());
}
void tst_QtConcurrentResultStore::resultIndex()
diff --git a/tests/auto/corelib/thread/qsemaphore/qsemaphore.pro b/tests/auto/corelib/thread/qsemaphore/qsemaphore.pro
index 56e9fd5da6..5a0f0337e6 100644
--- a/tests/auto/corelib/thread/qsemaphore/qsemaphore.pro
+++ b/tests/auto/corelib/thread/qsemaphore/qsemaphore.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qsemaphore
QT = core testlib
SOURCES = tst_qsemaphore.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qthread/qthread.pro b/tests/auto/corelib/thread/qthread/qthread.pro
index 9efce4e7ed..18d867ecef 100644
--- a/tests/auto/corelib/thread/qthread/qthread.pro
+++ b/tests/auto/corelib/thread/qthread/qthread.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qthread
QT = core testlib
SOURCES = tst_qthread.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qthreadonce/qthreadonce.pro b/tests/auto/corelib/thread/qthreadonce/qthreadonce.pro
index 2c189e7422..e8b95a06a7 100644
--- a/tests/auto/corelib/thread/qthreadonce/qthreadonce.pro
+++ b/tests/auto/corelib/thread/qthreadonce/qthreadonce.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qthreadonce
QT = core testlib
SOURCES = tst_qthreadonce.cpp
@@ -10,4 +10,3 @@ SOURCES = tst_qthreadonce.cpp
# Temporary:
SOURCES += qthreadonce.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qthreadonce/tst_qthreadonce.cpp b/tests/auto/corelib/thread/qthreadonce/tst_qthreadonce.cpp
index 0699c50464..7a3054abb0 100644
--- a/tests/auto/corelib/thread/qthreadonce/tst_qthreadonce.cpp
+++ b/tests/auto/corelib/thread/qthreadonce/tst_qthreadonce.cpp
@@ -163,7 +163,7 @@ void tst_QThreadOnce::nesting()
}
}
- QVERIFY(variable == 1);
+ QCOMPARE(variable, 1);
}
static void reentrant(int control, int &counter)
diff --git a/tests/auto/corelib/thread/qthreadpool/qthreadpool.pro b/tests/auto/corelib/thread/qthreadpool/qthreadpool.pro
index 387b79b012..eac4ef9365 100644
--- a/tests/auto/corelib/thread/qthreadpool/qthreadpool.pro
+++ b/tests/auto/corelib/thread/qthreadpool/qthreadpool.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qthreadpool
QT = core testlib
SOURCES = tst_qthreadpool.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qthreadstorage/crashonexit/crashonexit.pro b/tests/auto/corelib/thread/qthreadstorage/crashonexit/crashonexit.pro
index eb8d06d094..94a0a01e94 100644
--- a/tests/auto/corelib/thread/qthreadstorage/crashonexit/crashonexit.pro
+++ b/tests/auto/corelib/thread/qthreadstorage/crashonexit/crashonexit.pro
@@ -7,4 +7,3 @@ CONFIG += console
# This app is testdata for tst_qthreadstorage
target.path = $$[QT_INSTALL_TESTS]/tst_qthreadstorage/$$TARGET
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qthreadstorage/qthreadstorage.pro b/tests/auto/corelib/thread/qthreadstorage/qthreadstorage.pro
index e81038a4be..b9bc456dcf 100644
--- a/tests/auto/corelib/thread/qthreadstorage/qthreadstorage.pro
+++ b/tests/auto/corelib/thread/qthreadstorage/qthreadstorage.pro
@@ -4,4 +4,4 @@ SUBDIRS = \
!winrt: SUBDIRS += crashonexit
-CONFIG += ordered parallel_test
+CONFIG += ordered
diff --git a/tests/auto/corelib/thread/qthreadstorage/test/test.pro b/tests/auto/corelib/thread/qthreadstorage/test/test.pro
index d97d474e51..b9d661a9af 100644
--- a/tests/auto/corelib/thread/qthreadstorage/test/test.pro
+++ b/tests/auto/corelib/thread/qthreadstorage/test/test.pro
@@ -7,4 +7,3 @@ SOURCES = ../tst_qthreadstorage.cpp
!winrt: TEST_HELPER_INSTALLS = ../crashonexit/crashonexit
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qwaitcondition/qwaitcondition.pro b/tests/auto/corelib/thread/qwaitcondition/qwaitcondition.pro
index 7383997e67..2098d9dd2f 100644
--- a/tests/auto/corelib/thread/qwaitcondition/qwaitcondition.pro
+++ b/tests/auto/corelib/thread/qwaitcondition/qwaitcondition.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qwaitcondition
QT = core testlib
SOURCES = tst_qwaitcondition.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qwritelocker/qwritelocker.pro b/tests/auto/corelib/thread/qwritelocker/qwritelocker.pro
index 4a797975ab..a6c4f70b8d 100644
--- a/tests/auto/corelib/thread/qwritelocker/qwritelocker.pro
+++ b/tests/auto/corelib/thread/qwritelocker/qwritelocker.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qwritelocker
QT = core testlib
SOURCES = tst_qwritelocker.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/collections/collections.pro b/tests/auto/corelib/tools/collections/collections.pro
index 51ea667f58..5c04515fa0 100644
--- a/tests/auto/corelib/tools/collections/collections.pro
+++ b/tests/auto/corelib/tools/collections/collections.pro
@@ -2,8 +2,6 @@ CONFIG += testcase
TARGET = tst_collections
SOURCES += tst_collections.cpp
QT = core testlib
-CONFIG += parallel_test
# This test does not work with strict iterators
DEFINES -= QT_STRICT_ITERATORS
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/collections/tst_collections.cpp b/tests/auto/corelib/tools/collections/tst_collections.cpp
index ae8ffe48be..9aa86d3b35 100644
--- a/tests/auto/corelib/tools/collections/tst_collections.cpp
+++ b/tests/auto/corelib/tools/collections/tst_collections.cpp
@@ -96,13 +96,6 @@ class tst_Collections : public QObject
{
Q_OBJECT
-public:
- tst_Collections();
- ~tst_Collections();
-
-public slots:
- void init();
- void cleanup();
private slots:
void typeinfo();
void qstring();
@@ -174,23 +167,6 @@ struct Pod {
int i1, i2;
};
-tst_Collections::tst_Collections()
-{
-}
-
-tst_Collections::~tst_Collections()
-{
-
-}
-
-void tst_Collections::init()
-{
-}
-
-void tst_Collections::cleanup()
-{
-}
-
void tst_Collections::typeinfo()
{
QVERIFY(QTypeInfo<int*>::isPointer);
@@ -517,11 +493,11 @@ void tst_Collections::list()
QList<QString> list = vector.toList();
QVERIFY(list.size() == 5);
- QVERIFY(list.at(0) == "99");
- QVERIFY(list.at(4) == "100");
+ QCOMPARE(list.at(0), QLatin1String("99"));
+ QCOMPARE(list.at(4), QLatin1String("100"));
list[0] = "10";
- QVERIFY(list.at(0) == "10");
- QVERIFY(vector.at(0) == "99");
+ QCOMPARE(list.at(0), QLatin1String("10"));
+ QCOMPARE(vector.at(0), QLatin1String("99"));
}
@@ -533,15 +509,15 @@ void tst_Collections::list()
QVERIFY((*it)[0] == QChar('H'));
QVERIFY(it->constData()[0] == QChar('H'));
it->replace(QChar('H'), QChar('X'));
- QVERIFY(list.first() == "Xello");
+ QCOMPARE(list.first(), QLatin1String("Xello"));
QList<QString>::const_iterator cit = list.constBegin();
- QVERIFY((*cit).toLower() == "xello");
- QVERIFY(cit->toUpper() == "XELLO");
+ QCOMPARE((*cit).toLower(), QLatin1String("xello"));
+ QCOMPARE(cit->toUpper(), QLatin1String("XELLO"));
cit = list.cbegin();
- QVERIFY((*cit).toLower() == "xello");
- QVERIFY(cit->toUpper() == "XELLO");
+ QCOMPARE((*cit).toLower(),QLatin1String("xello"));
+ QCOMPARE(cit->toUpper(), QLatin1String("XELLO"));
}
{
@@ -575,10 +551,10 @@ void tst_Collections::list()
list << "alpha" << "beta";
list += list;
QVERIFY(list.size() == 4);
- QVERIFY(list.at(0) == "alpha");
- QVERIFY(list.at(1) == "beta");
- QVERIFY(list.at(2) == "alpha");
- QVERIFY(list.at(3) == "beta");
+ QCOMPARE(list.at(0), QLatin1String("alpha"));
+ QCOMPARE(list.at(1), QLatin1String("beta"));
+ QCOMPARE(list.at(2), QLatin1String("alpha"));
+ QCOMPARE(list.at(3), QLatin1String("beta"));
}
// test endcases for inserting into a qlist
@@ -954,15 +930,15 @@ void tst_Collections::linkedList()
QVERIFY((*it)[0] == QChar('H'));
QVERIFY(it->constData()[0] == QChar('H'));
it->replace(QChar('H'), QChar('X'));
- QVERIFY(list.first() == "Xello");
+ QCOMPARE(list.first(), QLatin1String("Xello"));
QLinkedList<QString>::const_iterator cit = list.constBegin();
- QVERIFY((*cit).toLower() == "xello");
- QVERIFY(cit->toUpper() == "XELLO");
+ QCOMPARE((*cit).toLower(), QLatin1String("xello"));
+ QCOMPARE(cit->toUpper(), QLatin1String("XELLO"));
cit = list.cbegin();
- QVERIFY((*cit).toLower() == "xello");
- QVERIFY(cit->toUpper() == "XELLO");
+ QCOMPARE((*cit).toLower(), QLatin1String("xello"));
+ QCOMPARE(cit->toUpper(), QLatin1String("XELLO"));
}
{
@@ -970,10 +946,10 @@ void tst_Collections::linkedList()
list << "alpha" << "beta";
list += list;
QVERIFY(list.size() == 4);
- QVERIFY(*list.begin() == "alpha");
- QVERIFY(*(list.begin() + 1) == "beta");
- QVERIFY(*(list.begin() + 2) == "alpha");
- QVERIFY(*(list.begin() + 3) == "beta");
+ QCOMPARE(*list.begin(), QLatin1String("alpha"));
+ QCOMPARE(*(list.begin() + 1), QLatin1String("beta"));
+ QCOMPARE(*(list.begin() + 2), QLatin1String("alpha"));
+ QCOMPARE(*(list.begin() + 3), QLatin1String("beta"));
}
{
@@ -1054,8 +1030,8 @@ void tst_Collections::vector()
QVector<QString> vec;
vec << "foo" << "bar";
vec.reserve( 512 );
- QVERIFY(vec[0] == "foo");
- QVERIFY(vec[1] == "bar");
+ QCOMPARE(vec[0], QLatin1String("foo"));
+ QCOMPARE(vec[1], QLatin1String("bar"));
int initialLargeStaticCount = LargeStatic::count;
{
@@ -1070,10 +1046,10 @@ void tst_Collections::vector()
vector << "alpha" << "beta";
vector += vector;
QVERIFY(vector.size() == 4);
- QVERIFY(vector.at(0) == "alpha");
- QVERIFY(vector.at(1) == "beta");
- QVERIFY(vector.at(2) == "alpha");
- QVERIFY(vector.at(3) == "beta");
+ QCOMPARE(vector.at(0), QLatin1String("alpha"));
+ QCOMPARE(vector.at(1), QLatin1String("beta"));
+ QCOMPARE(vector.at(2), QLatin1String("alpha"));
+ QCOMPARE(vector.at(3), QLatin1String("beta"));
}
int originalLargeStaticCount = LargeStatic::count;
@@ -1594,15 +1570,15 @@ void tst_Collections::hash()
QVERIFY((*it)[0] == QChar('H'));
QVERIFY(it->constData()[0] == QChar('H'));
it->replace(QChar('H'), QChar('X'));
- QVERIFY(*hash.begin() == "Xello");
+ QCOMPARE(*hash.begin(), QLatin1String("Xello"));
QHash<int, QString>::const_iterator cit = hash.constBegin();
- QVERIFY((*cit).toLower() == "xello");
- QVERIFY(cit->toUpper() == "XELLO");
+ QCOMPARE((*cit).toLower(), QLatin1String("xello"));
+ QCOMPARE(cit->toUpper(), QLatin1String("XELLO"));
cit = hash.cbegin();
- QVERIFY((*cit).toLower() == "xello");
- QVERIFY(cit->toUpper() == "XELLO");
+ QCOMPARE((*cit).toLower(), QLatin1String("xello"));
+ QCOMPARE(cit->toUpper(), QLatin1String("XELLO"));
}
{
@@ -1915,15 +1891,15 @@ void tst_Collections::map()
QVERIFY((*it)[0] == QChar('H'));
QVERIFY(it->constData()[0] == QChar('H'));
it->replace(QChar('H'), QChar('X'));
- QVERIFY(*map.begin() == "Xello");
+ QCOMPARE(*map.begin(), QLatin1String("Xello"));
QMap<int, QString>::const_iterator cit = map.constBegin();
- QVERIFY((*cit).toLower() == "xello");
- QVERIFY(cit->toUpper() == "XELLO");
+ QCOMPARE((*cit).toLower(), QLatin1String("xello"));
+ QCOMPARE(cit->toUpper(), QLatin1String("XELLO"));
cit = map.cbegin();
- QVERIFY((*cit).toLower() == "xello");
- QVERIFY(cit->toUpper() == "XELLO");
+ QCOMPARE((*cit).toLower(), QLatin1String("xello"));
+ QCOMPARE(cit->toUpper(), QLatin1String("XELLO"));
}
{
@@ -2005,17 +1981,17 @@ void tst_Collections::qstring()
QVERIFY(hello.left(0) == "");
QVERIFY(!hello.left(0).isNull());
- QVERIFY(hello.left(1) == "h");
- QVERIFY(hello.left(2) == "he");
- QVERIFY(hello.left(200) == "hello");
+ QCOMPARE(hello.left(1), QLatin1String("h"));
+ QCOMPARE(hello.left(2), QLatin1String("he"));
+ QCOMPARE(hello.left(200), QLatin1String("hello"));
QVERIFY(hello.left(hello.size()) == hello);
QVERIFY(hello.left(hello.size()+1) == hello);
QVERIFY(hello.right(0) == "");
QVERIFY(!hello.right(0).isNull());
- QVERIFY(hello.right(1) == "o");
- QVERIFY(hello.right(2) == "lo");
- QVERIFY(hello.right(200) == "hello");
+ QCOMPARE(hello.right(1), QLatin1String("o"));
+ QCOMPARE(hello.right(2), QLatin1String("lo"));
+ QCOMPARE(hello.right(200), QLatin1String("hello"));
QVERIFY(hello.right(hello.size()) == hello);
QVERIFY(hello.right(hello.size()+1) == hello);
@@ -2023,16 +1999,16 @@ void tst_Collections::qstring()
QVERIFY(hello.mid(0, 1) == "h");
QVERIFY(hello.mid(0, 2) == "he");
QVERIFY(hello.mid(0, 200) == "hello");
- QVERIFY(hello.mid(0) == "hello");
+ QCOMPARE(hello.mid(0), QLatin1String("hello"));
QVERIFY(hello.mid(0, hello.size()) == hello);
QVERIFY(hello.mid(0, hello.size()+1) == hello);
QVERIFY(hello.mid(hello.size()-0) == "");
QVERIFY(hello.mid(hello.size()-0).isEmpty());
QVERIFY(!hello.mid(hello.size()-0).isNull());
- QVERIFY(hello.mid(hello.size()-1) == "o");
- QVERIFY(hello.mid(hello.size()-2) == "lo");
- QVERIFY(hello.mid(hello.size()-200) == "hello");
+ QCOMPARE(hello.mid(hello.size()-1), QLatin1String("o"));
+ QCOMPARE(hello.mid(hello.size()-2), QLatin1String("lo"));
+ QCOMPARE(hello.mid(hello.size()-200), QLatin1String("hello"));
QString null;
QString nonNull = "";
@@ -2048,7 +2024,7 @@ void tst_Collections::qstring()
QString fill = "123";
fill.fill('a');
- QVERIFY(fill == "aaa");
+ QCOMPARE(fill, QLatin1String("aaa"));
s.clear();
s = hello;
@@ -2060,15 +2036,15 @@ void tst_Collections::qstring()
QVERIFY(s == helloWorld);
s = "012345";
s.insert(3, 'E');
- QVERIFY(s == "012E345");
+ QCOMPARE(s, QLatin1String("012E345"));
s.insert(3, "INSID");
- QVERIFY(s == "012INSIDE345");
+ QCOMPARE(s, QLatin1String("012INSIDE345"));
s = "short";
s.insert(7, 'E');
- QVERIFY(s == "short E");
+ QCOMPARE(s, QLatin1String("short E"));
s = "short";
s.insert(7, "END");
- QVERIFY(s == "short END");
+ QCOMPARE(s, QLatin1String("short END"));
QVERIFY(QString::fromLatin1("hello") == "hello");
@@ -2125,25 +2101,25 @@ void tst_Collections::qstring()
s += QChar((uchar) 0xb0);
QVERIFY(s.toUtf8() != s.toLatin1());
QCOMPARE(s[s.length()-1].unicode(), (ushort)0xb0);
- QVERIFY(s.left(s.length()-1) == "ascii");
+ QCOMPARE(s.left(s.length()-1), QLatin1String("ascii"));
QVERIFY(s == QString::fromUtf8(s.toUtf8().constData()));
s = "12";
s.append('3');
s += '4';
- QVERIFY(s == "1234");
+ QCOMPARE(s, QLatin1String("1234"));
s = "repend";
s.prepend('p');
- QVERIFY(s == "prepend");
+ QCOMPARE(s, QLatin1String("prepend"));
s.prepend("abc ");
- QVERIFY(s == "abc prepend");
+ QCOMPARE(s, QLatin1String("abc prepend"));
s = " whitespace ";
- QVERIFY(s.trimmed() == "whitespace");
+ QCOMPARE(s.trimmed(), QLatin1String("whitespace"));
s = " lots of stuff ";
- QVERIFY(s.simplified() == "lots of stuff");
+ QCOMPARE(s.simplified(), QLatin1String("lots of stuff"));
s = "a hat, a stick, a ski";
QVERIFY(s[2] == 'h');
@@ -2152,17 +2128,17 @@ void tst_Collections::qstring()
s = "12223";
s.remove(1, 2);
- QVERIFY(s == "123");
+ QCOMPARE(s, QLatin1String("123"));
s = "(%1)(%2)";
s = s.arg("foo").arg(7);
- QVERIFY(s == "(foo)(7)");
+ QCOMPARE(s, QLatin1String("(foo)(7)"));
s = "stl rocks";
std::string stl_string = s.toStdString(); // TODO: std::string stl_string = s does not work.
- QVERIFY(s == "stl rocks");
+ QCOMPARE(s, QLatin1String("stl rocks"));
s = QString::fromStdString(stl_string); // TODO: s = stl_string does not work.
- QVERIFY(s == "stl rocks");
+ QCOMPARE(s, QLatin1String("stl rocks"));
{
QString str("Bananas");
@@ -2178,10 +2154,10 @@ void tst_Collections::qstring()
QString str = "Hello";
QString cstr = QString::fromRawData(str.unicode(), str.length());
- QVERIFY(str == "Hello");
- QVERIFY(cstr == "Hello");
+ QCOMPARE(str, QLatin1String("Hello"));
+ QCOMPARE(cstr, QLatin1String("Hello"));
cstr.clear();
- QVERIFY(str == "Hello");
+ QCOMPARE(str, QLatin1String("Hello"));
QVERIFY(cstr.isEmpty());
{
@@ -2328,7 +2304,7 @@ void tst_Collections::pair()
QPair<int, QString> a(1, "Zebra"), b(2, "Ying"), c(3, "Yang"), d(3, "Ying"), e(5, "Alabama");
QVERIFY(a.first == 1);
- QVERIFY(a.second == "Zebra");
+ QCOMPARE(a.second, QLatin1String("Zebra"));
QVERIFY(a == qMakePair(1, QString("Zebra")));
QVERIFY(a == a && b == b && c == c && d == d && e == e);
@@ -3482,7 +3458,7 @@ template<class Container> void foreach_test_arrays(const Container &container)
void tst_Collections::foreach_2()
{
- QStringList strlist = QString::fromLatin1("a,b,c,d,e,f,g,h,ih,kl,mn,op,qr,st,uvw,xyz").split(",");
+ QStringList strlist = QString::fromLatin1("a,b,c,d,e,f,g,h,ih,kl,mn,op,qr,st,uvw,xyz").split(QLatin1Char(','));
foreach_test_arrays(strlist);
foreach_test_arrays(QList<QString>(strlist));
foreach_test_arrays(strlist.toVector());
diff --git a/tests/auto/corelib/tools/qalgorithms/qalgorithms.pro b/tests/auto/corelib/tools/qalgorithms/qalgorithms.pro
index cb6f6595b4..0e6e830185 100644
--- a/tests/auto/corelib/tools/qalgorithms/qalgorithms.pro
+++ b/tests/auto/corelib/tools/qalgorithms/qalgorithms.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qalgorithms
QT = core testlib
SOURCES = tst_qalgorithms.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qalgorithms/tst_qalgorithms.cpp b/tests/auto/corelib/tools/qalgorithms/tst_qalgorithms.cpp
index 99e5c4c85d..105b8b45d8 100644
--- a/tests/auto/corelib/tools/qalgorithms/tst_qalgorithms.cpp
+++ b/tests/auto/corelib/tools/qalgorithms/tst_qalgorithms.cpp
@@ -312,24 +312,24 @@ void tst_QAlgorithms::swap()
{
QString a = "1", b = "2";
qSwap(a, b);
- QVERIFY(a == "2");
- QVERIFY(b == "1");
+ QCOMPARE(a, QLatin1String("2"));
+ QCOMPARE(b, QLatin1String("1"));
qSwap(a, a);
- QVERIFY(a == "2");
- QVERIFY(b == "1");
+ QCOMPARE(a, QLatin1String("2"));
+ QCOMPARE(b, QLatin1String("1"));
qSwap(b, b);
- QVERIFY(a == "2");
- QVERIFY(b == "1");
+ QCOMPARE(a, QLatin1String("2"));
+ QCOMPARE(b, QLatin1String("1"));
qSwap(a, b);
- QVERIFY(a == "1");
- QVERIFY(b == "2");
+ QCOMPARE(a, QLatin1String("1"));
+ QCOMPARE(b, QLatin1String("2"));
qSwap(b, a);
- QVERIFY(a == "2");
- QVERIFY(b == "1");
+ QCOMPARE(a, QLatin1String("2"));
+ QCOMPARE(b, QLatin1String("1"));
}
{
diff --git a/tests/auto/corelib/tools/qarraydata/qarraydata.pro b/tests/auto/corelib/tools/qarraydata/qarraydata.pro
index d5fe08c009..ee3faa9ad7 100644
--- a/tests/auto/corelib/tools/qarraydata/qarraydata.pro
+++ b/tests/auto/corelib/tools/qarraydata/qarraydata.pro
@@ -2,5 +2,4 @@ TARGET = tst_qarraydata
SOURCES += $$PWD/tst_qarraydata.cpp
HEADERS += $$PWD/simplevector.h
QT = core testlib
-CONFIG += testcase parallel_test
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
+CONFIG += testcase
diff --git a/tests/auto/corelib/tools/qbitarray/qbitarray.pro b/tests/auto/corelib/tools/qbitarray/qbitarray.pro
index 22f62faaca..1e7185b600 100644
--- a/tests/auto/corelib/tools/qbitarray/qbitarray.pro
+++ b/tests/auto/corelib/tools/qbitarray/qbitarray.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qbitarray
QT = core testlib
SOURCES = tst_qbitarray.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qbitarray/tst_qbitarray.cpp b/tests/auto/corelib/tools/qbitarray/tst_qbitarray.cpp
index d3bbfa338b..5e6459c58b 100644
--- a/tests/auto/corelib/tools/qbitarray/tst_qbitarray.cpp
+++ b/tests/auto/corelib/tools/qbitarray/tst_qbitarray.cpp
@@ -126,9 +126,9 @@ void tst_QBitArray::size()
for (int j=0; j<len; j++) {
bool b = a[j];
if (b)
- S+= "1";
+ S+= QLatin1Char('1');
else
- S+= "0";
+ S+= QLatin1Char('0');
}
QTEST(S,"res");
}
diff --git a/tests/auto/corelib/tools/qbytearray/qbytearray.pro b/tests/auto/corelib/tools/qbytearray/qbytearray.pro
index 22104f817f..a4501611d6 100644
--- a/tests/auto/corelib/tools/qbytearray/qbytearray.pro
+++ b/tests/auto/corelib/tools/qbytearray/qbytearray.pro
@@ -1,10 +1,9 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qbytearray
QT = core-private testlib
SOURCES = tst_qbytearray.cpp
TESTDATA += rfc3252.txt
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
mac {
OBJECTIVE_SOURCES += tst_qbytearray_mac.mm
diff --git a/tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp b/tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp
index f942eab800..4a8190da6d 100644
--- a/tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp
+++ b/tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp
@@ -212,12 +212,12 @@ QByteArray verifyZeroTermination(const QByteArray &ba)
const_cast<char *>(baData)[baSize] = 'x';
if ('x' != ba.constData()[baSize]) {
- return QString::fromLatin1("*** Failed to replace null-terminator in "
- "result ('%1') ***").arg(QString::fromLatin1(ba)).toLatin1();
+ return "*** Failed to replace null-terminator in "
+ "result ('" + ba + "') ***";
}
if (ba != baCopy) {
- return QString::fromLatin1( "*** Result ('%1') differs from its copy "
- "after null-terminator was replaced ***").arg(QString::fromLatin1(ba)).toLatin1();
+ return "*** Result ('" + ba + "') differs from its copy "
+ "after null-terminator was replaced ***";
}
const_cast<char *>(baData)[baSize] = '\0'; // Restore sanity
@@ -896,7 +896,9 @@ void tst_QByteArray::prepend()
QCOMPARE(ba.prepend("1"), QByteArray("1foo"));
QCOMPARE(ba.prepend(QByteArray("2")), QByteArray("21foo"));
QCOMPARE(ba.prepend('3'), QByteArray("321foo"));
- QCOMPARE(ba.prepend("\0 ", 2), QByteArray::fromRawData("\0 321foo", 8));
+ QCOMPARE(ba.prepend(-1, 'x'), QByteArray("321foo"));
+ QCOMPARE(ba.prepend(3, 'x'), QByteArray("xxx321foo"));
+ QCOMPARE(ba.prepend("\0 ", 2), QByteArray::fromRawData("\0 xxx321foo", 11));
}
void tst_QByteArray::prependExtended_data()
@@ -924,8 +926,10 @@ void tst_QByteArray::prependExtended()
QCOMPARE(array.prepend("1"), QByteArray("1data"));
QCOMPARE(array.prepend(QByteArray("2")), QByteArray("21data"));
QCOMPARE(array.prepend('3'), QByteArray("321data"));
- QCOMPARE(array.prepend("\0 ", 2), QByteArray::fromRawData("\0 321data", 9));
- QCOMPARE(array.size(), 9);
+ QCOMPARE(array.prepend(-1, 'x'), QByteArray("321data"));
+ QCOMPARE(array.prepend(3, 'x'), QByteArray("xxx321data"));
+ QCOMPARE(array.prepend("\0 ", 2), QByteArray::fromRawData("\0 xxx321data", 12));
+ QCOMPARE(array.size(), 12);
}
void tst_QByteArray::append()
@@ -936,9 +940,11 @@ void tst_QByteArray::append()
QCOMPARE(ba.append("1"), QByteArray("foo1"));
QCOMPARE(ba.append(QByteArray("2")), QByteArray("foo12"));
QCOMPARE(ba.append('3'), QByteArray("foo123"));
- QCOMPARE(ba.append("\0"), QByteArray("foo123"));
- QCOMPARE(ba.append("\0", 1), QByteArray::fromRawData("foo123\0", 7));
- QCOMPARE(ba.size(), 7);
+ QCOMPARE(ba.append(-1, 'x'), QByteArray("foo123"));
+ QCOMPARE(ba.append(3, 'x'), QByteArray("foo123xxx"));
+ QCOMPARE(ba.append("\0"), QByteArray("foo123xxx"));
+ QCOMPARE(ba.append("\0", 1), QByteArray::fromRawData("foo123xxx\0", 10));
+ QCOMPARE(ba.size(), 10);
}
void tst_QByteArray::appendExtended_data()
@@ -958,9 +964,11 @@ void tst_QByteArray::appendExtended()
QCOMPARE(array.append("1"), QByteArray("data1"));
QCOMPARE(array.append(QByteArray("2")), QByteArray("data12"));
QCOMPARE(array.append('3'), QByteArray("data123"));
- QCOMPARE(array.append("\0"), QByteArray("data123"));
- QCOMPARE(array.append("\0", 1), QByteArray::fromRawData("data123\0", 8));
- QCOMPARE(array.size(), 8);
+ QCOMPARE(array.append(-1, 'x'), QByteArray("data123"));
+ QCOMPARE(array.append(3, 'x'), QByteArray("data123xxx"));
+ QCOMPARE(array.append("\0"), QByteArray("data123xxx"));
+ QCOMPARE(array.append("\0", 1), QByteArray::fromRawData("data123xxx\0", 11));
+ QCOMPARE(array.size(), 11);
}
void tst_QByteArray::insert()
@@ -976,6 +984,12 @@ void tst_QByteArray::insert()
QCOMPARE(ba.insert(1, 'b'), QByteArray("abc"));
QCOMPARE(ba.size(), 3);
+ ba = "ac";
+ QCOMPARE(ba.insert(-1, 3, 'x'), QByteArray("ac"));
+ QCOMPARE(ba.insert(1, 3, 'x'), QByteArray("axxxc"));
+ QCOMPARE(ba.insert(6, 3, 'x'), QByteArray("axxxc xxx"));
+ QCOMPARE(ba.size(), 9);
+
ba = "ikl";
QCOMPARE(ba.insert(1, "j"), QByteArray("ijkl"));
QCOMPARE(ba.size(), 4);
@@ -994,7 +1008,8 @@ void tst_QByteArray::insertExtended()
{
QFETCH(QByteArray, array);
QCOMPARE(array.insert(1, "i"), QByteArray("diata"));
- QCOMPARE(array.size(), 5);
+ QCOMPARE(array.insert(1, 3, 'x'), QByteArray("dxxxiata"));
+ QCOMPARE(array.size(), 8);
}
void tst_QByteArray::remove_data()
@@ -1969,15 +1984,15 @@ void tst_QByteArray::movablity()
QCOMPARE(array.isEmpty(), newIsEmpty);
QCOMPARE(array.isNull(), newIsNull);
QCOMPARE(array.capacity(), newCapacity);
- QVERIFY(array.startsWith("a"));
- QVERIFY(array.endsWith("b"));
+ QVERIFY(array.startsWith('a'));
+ QVERIFY(array.endsWith('b'));
QCOMPARE(copy.size(), newSize);
QCOMPARE(copy.isEmpty(), newIsEmpty);
QCOMPARE(copy.isNull(), newIsNull);
QCOMPARE(copy.capacity(), newCapacity);
- QVERIFY(copy.startsWith("a"));
- QVERIFY(copy.endsWith("b"));
+ QVERIFY(copy.startsWith('a'));
+ QVERIFY(copy.endsWith('b'));
// try to not crash
array.squeeze();
diff --git a/tests/auto/corelib/tools/qbytearraylist/qbytearraylist.pro b/tests/auto/corelib/tools/qbytearraylist/qbytearraylist.pro
index 2cd4522f67..6c05c288cf 100644
--- a/tests/auto/corelib/tools/qbytearraylist/qbytearraylist.pro
+++ b/tests/auto/corelib/tools/qbytearraylist/qbytearraylist.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qbytearraylist
QT = core testlib
SOURCES = tst_qbytearraylist.cpp
diff --git a/tests/auto/corelib/tools/qbytearraymatcher/qbytearraymatcher.pro b/tests/auto/corelib/tools/qbytearraymatcher/qbytearraymatcher.pro
index 7da193d01a..0624e1886c 100644
--- a/tests/auto/corelib/tools/qbytearraymatcher/qbytearraymatcher.pro
+++ b/tests/auto/corelib/tools/qbytearraymatcher/qbytearraymatcher.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qbytearraymatcher
QT = core testlib
SOURCES = tst_qbytearraymatcher.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qcache/qcache.pro b/tests/auto/corelib/tools/qcache/qcache.pro
index 80a616ce38..07488ef40f 100644
--- a/tests/auto/corelib/tools/qcache/qcache.pro
+++ b/tests/auto/corelib/tools/qcache/qcache.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qcache
QT = core testlib
SOURCES = tst_qcache.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qchar/qchar.pro b/tests/auto/corelib/tools/qchar/qchar.pro
index a72f16fa49..771e4290b8 100644
--- a/tests/auto/corelib/tools/qchar/qchar.pro
+++ b/tests/auto/corelib/tools/qchar/qchar.pro
@@ -1,10 +1,9 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qchar
QT = core-private testlib
SOURCES = tst_qchar.cpp
TESTDATA += data/NormalizationTest.txt
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
android: !android-no-sdk {
RESOURCES += \
diff --git a/tests/auto/corelib/tools/qchar/tst_qchar.cpp b/tests/auto/corelib/tools/qchar/tst_qchar.cpp
index 22fbce9f8e..29e48a1cc8 100644
--- a/tests/auto/corelib/tools/qchar/tst_qchar.cpp
+++ b/tests/auto/corelib/tools/qchar/tst_qchar.cpp
@@ -43,10 +43,8 @@
class tst_QChar : public QObject
{
Q_OBJECT
-public slots:
- void init();
- void cleanup();
private slots:
+ void operator_eqeq_int();
void operators_data();
void operators();
void toUpper();
@@ -80,25 +78,30 @@ private slots:
void normalization_manual();
void normalizationCorrections();
void unicodeVersion();
-#if defined(Q_OS_WINCE)
-private:
- QCoreApplication* app;
-#endif
};
-void tst_QChar::init()
-{
-#if defined(Q_OS_WINCE)
- int argc = 0;
- app = new QCoreApplication(argc, NULL);
-#endif
-}
-
-void tst_QChar::cleanup()
+void tst_QChar::operator_eqeq_int()
{
-#if defined(Q_OS_WINCE)
- delete app;
-#endif
+ {
+ const QChar ch = QLatin1Char(' ');
+ QVERIFY(ch != 0);
+ QVERIFY(!(ch == 0));
+
+ QVERIFY(ch == 0x20);
+ QVERIFY(!(ch != 0x20));
+ QVERIFY(0x20 == ch);
+ QVERIFY(!(0x20 != ch));
+ }
+ {
+ const QChar ch = QLatin1Char('\0');
+ QVERIFY(ch == 0);
+ QVERIFY(!(ch != 0));
+
+ QVERIFY(ch != 0x20);
+ QVERIFY(!(ch == 0x20));
+ QVERIFY(0x20 != ch);
+ QVERIFY(!(0x20 == ch));
+ }
}
void tst_QChar::operators_data()
@@ -239,8 +242,8 @@ void tst_QChar::isDigit_data()
for (ushort ucs = 0; ucs < 256; ++ucs) {
bool isDigit = (ucs <= '9' && ucs >= '0');
- QString tag = QString::fromLatin1("0x%0").arg(QString::number(ucs, 16));
- QTest::newRow(tag.toLatin1()) << ucs << isDigit;
+ const QByteArray tag = "0x" + QByteArray::number(ucs, 16);
+ QTest::newRow(tag.constData()) << ucs << isDigit;
}
}
@@ -266,8 +269,8 @@ void tst_QChar::isLetter_data()
QTest::addColumn<bool>("expected");
for (ushort ucs = 0; ucs < 256; ++ucs) {
- QString tag = QString::fromLatin1("0x%0").arg(QString::number(ucs, 16));
- QTest::newRow(tag.toLatin1()) << ucs << isExpectedLetter(ucs);
+ const QByteArray tag = "0x" + QByteArray::number(ucs, 16);
+ QTest::newRow(tag.constData()) << ucs << isExpectedLetter(ucs);
}
}
@@ -288,8 +291,8 @@ void tst_QChar::isLetterOrNumber_data()
|| (ucs >= '0' && ucs <= '9')
|| ucs == 0xB2 || ucs == 0xB3 || ucs == 0xB9
|| (ucs >= 0xBC && ucs <= 0xBE);
- QString tag = QString::fromLatin1("0x%0").arg(QString::number(ucs, 16));
- QTest::newRow(tag.toLatin1()) << ucs << isLetterOrNumber;
+ const QByteArray tag = "0x" + QByteArray::number(ucs, 16);
+ QTest::newRow(tag.constData()) << ucs << isLetterOrNumber;
}
}
@@ -403,8 +406,8 @@ void tst_QChar::isSpace_data()
for (ushort ucs = 0; ucs < 256; ++ucs) {
bool isSpace = (ucs <= 0x0D && ucs >= 0x09) || ucs == 0x20 || ucs == 0xA0 || ucs == 0x85;
- QString tag = QString::fromLatin1("0x%0").arg(QString::number(ucs, 16));
- QTest::newRow(tag.toLatin1()) << ucs << isSpace;
+ const QByteArray tag = "0x" + QByteArray::number(ucs, 16);
+ QTest::newRow(tag.constData()) << ucs << isSpace;
}
}
@@ -760,7 +763,7 @@ void tst_QChar::normalization_data()
if (comment >= 0)
line = line.left(comment);
- if (line.startsWith("@")) {
+ if (line.startsWith('@')) {
if (line.startsWith("@Part") && line.size() > 5 && QChar(line.at(5)).isDigit())
part = QChar(line.at(5)).digitValue();
continue;
@@ -797,8 +800,10 @@ void tst_QChar::normalization_data()
}
}
- QString nm = QString("line #%1 (part %2").arg(linenum).arg(part);
- QTest::newRow(nm.toLatin1()) << columns << part;
+
+ const QByteArray nm = "line #" + QByteArray::number(linenum) + " (part "
+ + QByteArray::number(part);
+ QTest::newRow(nm.constData()) << columns << part;
}
}
diff --git a/tests/auto/corelib/tools/qcollator/qcollator.pro b/tests/auto/corelib/tools/qcollator/qcollator.pro
index 3c5987ffa0..ed879ee70e 100644
--- a/tests/auto/corelib/tools/qcollator/qcollator.pro
+++ b/tests/auto/corelib/tools/qcollator/qcollator.pro
@@ -1,7 +1,6 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qcollator
QT = core testlib
SOURCES = tst_qcollator.cpp
DEFINES += QT_NO_CAST_TO_ASCII
contains(QT_CONFIG,icu):DEFINES += QT_USE_ICU
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qcommandlineparser/tst_qcommandlineparser.pro b/tests/auto/corelib/tools/qcommandlineparser/tst_qcommandlineparser.pro
index 6d3e6d677f..75b74bbf4d 100644
--- a/tests/auto/corelib/tools/qcommandlineparser/tst_qcommandlineparser.pro
+++ b/tests/auto/corelib/tools/qcommandlineparser/tst_qcommandlineparser.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qcommandlineparser
QT = core testlib
SOURCES = tst_qcommandlineparser.cpp
diff --git a/tests/auto/corelib/tools/qcontiguouscache/qcontiguouscache.pro b/tests/auto/corelib/tools/qcontiguouscache/qcontiguouscache.pro
index db4412ed59..d79bd16c76 100644
--- a/tests/auto/corelib/tools/qcontiguouscache/qcontiguouscache.pro
+++ b/tests/auto/corelib/tools/qcontiguouscache/qcontiguouscache.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qcontiguouscache
QT = core testlib
SOURCES = tst_qcontiguouscache.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qcryptographichash/qcryptographichash.pro b/tests/auto/corelib/tools/qcryptographichash/qcryptographichash.pro
index 941a068f8e..15a57c692e 100644
--- a/tests/auto/corelib/tools/qcryptographichash/qcryptographichash.pro
+++ b/tests/auto/corelib/tools/qcryptographichash/qcryptographichash.pro
@@ -1,10 +1,9 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qcryptographichash
QT = core testlib
SOURCES = tst_qcryptographichash.cpp
TESTDATA += data/*
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
android: !android-no-sdk {
RESOURCES += \
diff --git a/tests/auto/corelib/tools/qdate/qdate.pro b/tests/auto/corelib/tools/qdate/qdate.pro
index 6be3164fd7..dd7c6cb888 100644
--- a/tests/auto/corelib/tools/qdate/qdate.pro
+++ b/tests/auto/corelib/tools/qdate/qdate.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qdate
QT = core testlib
SOURCES = tst_qdate.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qdate/tst_qdate.cpp b/tests/auto/corelib/tools/qdate/tst_qdate.cpp
index e515fcf5b9..27988e5b5b 100644
--- a/tests/auto/corelib/tools/qdate/tst_qdate.cpp
+++ b/tests/auto/corelib/tools/qdate/tst_qdate.cpp
@@ -1047,7 +1047,7 @@ void tst_QDate::fromStringFormat_data()
QTest::newRow("data14") << QString("132") << QString("Md") << invalidDate();
QTest::newRow("data15") << february << QString("MMMM") << QDate(defDate().year(), 2, 1);
- QString date = mon + " " + august + " 8 2005";
+ QString date = mon + QLatin1Char(' ') + august + " 8 2005";
QTest::newRow("data16") << date << QString("ddd MMMM d yyyy") << QDate(2005, 8, 8);
QTest::newRow("data17") << QString("2000:00") << QString("yyyy:yy") << QDate(2000, 1, 1);
QTest::newRow("data18") << QString("1999:99") << QString("yyyy:yy") << QDate(1999, 1, 1);
diff --git a/tests/auto/corelib/tools/qdatetime/qdatetime.pro b/tests/auto/corelib/tools/qdatetime/qdatetime.pro
index 25d11443e4..ba36621cf1 100644
--- a/tests/auto/corelib/tools/qdatetime/qdatetime.pro
+++ b/tests/auto/corelib/tools/qdatetime/qdatetime.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qdatetime
QT = core-private testlib
SOURCES = tst_qdatetime.cpp
@@ -10,7 +10,6 @@ win32-msvc|win32-msvc9x {
QMAKE_CFLAGS_RELEASE -= -O1
QMAKE_CXXFLAGS_RELEASE -= -O1
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
mac {
OBJECTIVE_SOURCES += tst_qdatetime_mac.mm
diff --git a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp
index 833dfe87d7..906129d1af 100644
--- a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp
+++ b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp
@@ -1735,13 +1735,15 @@ void tst_QDateTime::operator_insert_extract_data()
const int thisVersion = tmpDataStream.version();
for (int version = QDataStream::Qt_1_0; version <= thisVersion; ++version) {
const QDataStream::Version dataStreamVersion = static_cast<QDataStream::Version>(version);
- QTest::newRow(QString::fromLatin1("v%1 WA => HAWAII %2").arg(dataStreamVersion).arg(positiveYear.toString()).toLocal8Bit().constData())
+ const QByteArray vN = QByteArray::number(dataStreamVersion);
+ const QByteArray pY = positiveYear.toString().toLatin1();
+ QTest::newRow(('v' + vN + " WA => HAWAII " + pY).constData())
<< positiveYear << westernAustralia << hawaii << dataStreamVersion;
- QTest::newRow(QString::fromLatin1("v%1 WA => WA %2").arg(dataStreamVersion).arg(positiveYear.toString()).toLocal8Bit().constData())
+ QTest::newRow(('v' + vN + " WA => WA " + pY).constData())
<< positiveYear << westernAustralia << westernAustralia << dataStreamVersion;
- QTest::newRow(QString::fromLatin1("v%1 HAWAII => WA %2").arg(dataStreamVersion).arg(negativeYear.toString()).toLocal8Bit().constData())
+ QTest::newRow(('v' + vN + " HAWAII => WA " + negativeYear.toString().toLatin1()).constData())
<< negativeYear << hawaii << westernAustralia << dataStreamVersion;
- QTest::newRow(QString::fromLatin1("v%1 HAWAII => HAWAII %2").arg(dataStreamVersion).arg(positiveYear.toString()).toLocal8Bit().constData())
+ QTest::newRow(('v' + vN + " HAWAII => HAWAII " + pY).constData())
<< positiveYear << hawaii << hawaii << dataStreamVersion;
}
}
@@ -2140,11 +2142,11 @@ void tst_QDateTime::fromStringStringFormat_data()
QTest::newRow("data9") << QString("101010") << QString("dMyy") << QDateTime(QDate(1910, 10, 10), QTime());
QTest::newRow("data10") << QString("101010") << QString("dMyy") << QDateTime(QDate(1910, 10, 10), QTime());
QTest::newRow("data11") << date << QString("dd MMM yy") << QDateTime(QDate(1910, 10, 10), QTime());
- date = fri + " " + december + " 3 2004";
+ date = fri + QLatin1Char(' ') + december + " 3 2004";
QTest::newRow("data12") << date << QString("ddd MMMM d yyyy") << QDateTime(QDate(2004, 12, 3), QTime());
QTest::newRow("data13") << QString("30.02.2004") << QString("dd.MM.yyyy") << invalidDateTime();
QTest::newRow("data14") << QString("32.01.2004") << QString("dd.MM.yyyy") << invalidDateTime();
- date = thu + " " + january + " 2004";
+ date = thu + QLatin1Char(' ') + january + " 2004";
QTest::newRow("data15") << date << QString("ddd MMMM yyyy") << QDateTime(QDate(2004, 1, 1), QTime());
QTest::newRow("data16") << QString("2005-06-28T07:57:30.001Z")
<< QString("yyyy-MM-ddThh:mm:ss.zZ")
diff --git a/tests/auto/corelib/tools/qeasingcurve/qeasingcurve.pro b/tests/auto/corelib/tools/qeasingcurve/qeasingcurve.pro
index 679f9bbda4..80c5a94a83 100644
--- a/tests/auto/corelib/tools/qeasingcurve/qeasingcurve.pro
+++ b/tests/auto/corelib/tools/qeasingcurve/qeasingcurve.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qeasingcurve
QT = core testlib
SOURCES = tst_qeasingcurve.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qelapsedtimer/qelapsedtimer.pro b/tests/auto/corelib/tools/qelapsedtimer/qelapsedtimer.pro
index 7e9f907915..657a63a5d7 100644
--- a/tests/auto/corelib/tools/qelapsedtimer/qelapsedtimer.pro
+++ b/tests/auto/corelib/tools/qelapsedtimer/qelapsedtimer.pro
@@ -1,6 +1,5 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qelapsedtimer
QT = core testlib
SOURCES = tst_qelapsedtimer.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qexplicitlyshareddatapointer/qexplicitlyshareddatapointer.pro b/tests/auto/corelib/tools/qexplicitlyshareddatapointer/qexplicitlyshareddatapointer.pro
index 2ee091c139..45fe1f60fe 100644
--- a/tests/auto/corelib/tools/qexplicitlyshareddatapointer/qexplicitlyshareddatapointer.pro
+++ b/tests/auto/corelib/tools/qexplicitlyshareddatapointer/qexplicitlyshareddatapointer.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qexplicitlyshareddatapointer
QT = core testlib
SOURCES = tst_qexplicitlyshareddatapointer.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qfreelist/qfreelist.pro b/tests/auto/corelib/tools/qfreelist/qfreelist.pro
index 60ae819f87..fb108338bd 100644
--- a/tests/auto/corelib/tools/qfreelist/qfreelist.pro
+++ b/tests/auto/corelib/tools/qfreelist/qfreelist.pro
@@ -1,7 +1,5 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qfreelist
QT = core-private testlib
SOURCES = tst_qfreelist.cpp
!contains(QT_CONFIG,private_tests): SOURCES += $$QT_SOURCE_TREE/src/corelib/tools/qfreelist.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qhash/qhash.pro b/tests/auto/corelib/tools/qhash/qhash.pro
index 1ed062ca91..79ffd4e9d1 100644
--- a/tests/auto/corelib/tools/qhash/qhash.pro
+++ b/tests/auto/corelib/tools/qhash/qhash.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qhash
QT = core testlib
SOURCES = $$PWD/tst_qhash.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qhash/tst_qhash.cpp b/tests/auto/corelib/tools/qhash/tst_qhash.cpp
index 6a5c6b5670..340453fb3e 100644
--- a/tests/auto/corelib/tools/qhash/tst_qhash.cpp
+++ b/tests/auto/corelib/tools/qhash/tst_qhash.cpp
@@ -510,24 +510,24 @@ void tst_QHash::key()
QCOMPARE(hash1.key(1, def), def);
hash1.insert("one", 1);
- QCOMPARE(hash1.key(1), QString("one"));
- QCOMPARE(hash1.key(1, def), QString("one"));
+ QCOMPARE(hash1.key(1), QLatin1String("one"));
+ QCOMPARE(hash1.key(1, def), QLatin1String("one"));
QCOMPARE(hash1.key(2), QString());
QCOMPARE(hash1.key(2, def), def);
hash1.insert("two", 2);
- QCOMPARE(hash1.key(1), QString("one"));
- QCOMPARE(hash1.key(1, def), QString("one"));
- QCOMPARE(hash1.key(2), QString("two"));
- QCOMPARE(hash1.key(2, def), QString("two"));
+ QCOMPARE(hash1.key(1), QLatin1String("one"));
+ QCOMPARE(hash1.key(1, def), QLatin1String("one"));
+ QCOMPARE(hash1.key(2), QLatin1String("two"));
+ QCOMPARE(hash1.key(2, def), QLatin1String("two"));
QCOMPARE(hash1.key(3), QString());
QCOMPARE(hash1.key(3, def), def);
hash1.insert("deux", 2);
- QCOMPARE(hash1.key(1), QString("one"));
- QCOMPARE(hash1.key(1, def), QString("one"));
- QVERIFY(hash1.key(2) == "deux" || hash1.key(2) == "two");
- QVERIFY(hash1.key(2, def) == "deux" || hash1.key(2, def) == "two");
+ QCOMPARE(hash1.key(1), QLatin1String("one"));
+ QCOMPARE(hash1.key(1, def), QLatin1String("one"));
+ QVERIFY(hash1.key(2) == QLatin1String("deux") || hash1.key(2) == QLatin1String("two"));
+ QVERIFY(hash1.key(2, def) == QLatin1String("deux") || hash1.key(2, def) == QLatin1String("two"));
QCOMPARE(hash1.key(3), QString());
QCOMPARE(hash1.key(3, def), def);
}
@@ -628,8 +628,8 @@ void tst_QHash::find()
map1.insert(1,"Mayer");
map1.insert(2,"Hej");
- QVERIFY(map1.find(1).value() == "Mayer");
- QVERIFY(map1.find(2).value() == "Hej");
+ QCOMPARE(map1.find(1).value(), QLatin1String("Mayer"));
+ QCOMPARE(map1.find(2).value(), QLatin1String("Hej"));
for(i = 3; i < 10; ++i) {
compareString = testString.arg(i);
@@ -661,8 +661,8 @@ void tst_QHash::constFind()
map1.insert(1,"Mayer");
map1.insert(2,"Hej");
- QVERIFY(map1.constFind(1).value() == "Mayer");
- QVERIFY(map1.constFind(2).value() == "Hej");
+ QCOMPARE(map1.constFind(1).value(), QLatin1String("Mayer"));
+ QCOMPARE(map1.constFind(2).value(), QLatin1String("Hej"));
for(i = 3; i < 10; ++i) {
compareString = testString.arg(i);
@@ -706,7 +706,7 @@ void tst_QHash::take()
map.insert(2, "zwei");
map.insert(3, "drei");
- QVERIFY(map.take(3) == "drei");
+ QCOMPARE(map.take(3), QLatin1String("drei"));
QVERIFY(!map.contains(3));
}
diff --git a/tests/auto/corelib/tools/qhashfunctions/qhashfunctions.pro b/tests/auto/corelib/tools/qhashfunctions/qhashfunctions.pro
index 21426a4f55..853e9f30e5 100644
--- a/tests/auto/corelib/tools/qhashfunctions/qhashfunctions.pro
+++ b/tests/auto/corelib/tools/qhashfunctions/qhashfunctions.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qhashfunctions
QT = core testlib
SOURCES = $$PWD/tst_qhashfunctions.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qline/qline.pro b/tests/auto/corelib/tools/qline/qline.pro
index 56f852ac52..c66df2cd68 100644
--- a/tests/auto/corelib/tools/qline/qline.pro
+++ b/tests/auto/corelib/tools/qline/qline.pro
@@ -1,6 +1,5 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qline
QT = core testlib
SOURCES = tst_qline.cpp
unix:!mac:!vxworks:!haiku:LIBS+=-lm
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qline/tst_qline.cpp b/tests/auto/corelib/tools/qline/tst_qline.cpp
index 20373bfb15..a215464d8a 100644
--- a/tests/auto/corelib/tools/qline/tst_qline.cpp
+++ b/tests/auto/corelib/tools/qline/tst_qline.cpp
@@ -179,7 +179,7 @@ void tst_QLine::testIntersection_data()
a = a.translated(1, 1);
b = b.translated(1, 1);
- QTest::newRow(qPrintable(QString::fromLatin1("rotation-%0").arg(i)))
+ QTest::newRow(("rotation-" + QByteArray::number(i)).constData())
<< (double)a.x1() << (double)a.y1() << (double)a.x2() << (double)a.y2()
<< (double)b.x1() << (double)b.y1() << (double)b.x2() << (double)b.y2()
<< int(QLineF::BoundedIntersection)
@@ -332,7 +332,7 @@ void tst_QLine::testAngle_data()
<< 135.0;
for (int i=0; i<180; ++i) {
- QTest::newRow(QString("angle:%1").arg(i).toLatin1())
+ QTest::newRow(("angle:" + QByteArray::number(i)).constData())
<< 0.0 << 0.0 << double(cos(i*M_2PI/360)) << double(sin(i*M_2PI/360))
<< 0.0 << 0.0 << 1.0 << 0.0
<< double(i);
@@ -460,7 +460,7 @@ void tst_QLine::testAngleTo_data()
for (int i = 0; i < 360; ++i) {
const QLineF l = QLineF::fromPolar(1, i);
- QTest::newRow(QString("angle:%1").arg(i).toLatin1())
+ QTest::newRow(("angle:" + QByteArray::number(i)).constData())
<< qreal(0.0) << qreal(0.0) << qreal(1.0) << qreal(0.0)
<< qreal(0.0) << qreal(0.0) << l.p2().x() << l.p2().y()
<< qreal(i);
diff --git a/tests/auto/corelib/tools/qlinkedlist/qlinkedlist.pro b/tests/auto/corelib/tools/qlinkedlist/qlinkedlist.pro
index 439bf03707..80630f78ad 100644
--- a/tests/auto/corelib/tools/qlinkedlist/qlinkedlist.pro
+++ b/tests/auto/corelib/tools/qlinkedlist/qlinkedlist.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qlinkedlist
QT = core testlib
SOURCES = tst_qlinkedlist.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qlist/qlist.pro b/tests/auto/corelib/tools/qlist/qlist.pro
index 43c06e0ee1..47f0140abb 100644
--- a/tests/auto/corelib/tools/qlist/qlist.pro
+++ b/tests/auto/corelib/tools/qlist/qlist.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qlist
QT = core testlib
SOURCES = $$PWD/tst_qlist.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qlocale/syslocaleapp/syslocaleapp.pro b/tests/auto/corelib/tools/qlocale/syslocaleapp/syslocaleapp.pro
index 8995fce52c..b61f51d53a 100644
--- a/tests/auto/corelib/tools/qlocale/syslocaleapp/syslocaleapp.pro
+++ b/tests/auto/corelib/tools/qlocale/syslocaleapp/syslocaleapp.pro
@@ -6,4 +6,3 @@ CONFIG -= app_bundle
QT = core
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qlocale/test/test.pro b/tests/auto/corelib/tools/qlocale/test/test.pro
index 60afb29233..d9004d1eb6 100644
--- a/tests/auto/corelib/tools/qlocale/test/test.pro
+++ b/tests/auto/corelib/tools/qlocale/test/test.pro
@@ -1,10 +1,13 @@
CONFIG += console testcase
-CONFIG += parallel_test
CONFIG -= app_bundle
QT = core testlib core-private
embedded: QT += gui
SOURCES = ../tst_qlocale.cpp
+!contains(QT_CONFIG, doubleconversion):!contains(QT_CONFIG, system-doubleconversion) {
+ DEFINES += QT_NO_DOUBLECONVERSION
+}
+
TARGET = ../tst_qlocale
win32 {
CONFIG(debug, debug|release) {
@@ -15,6 +18,3 @@ win32 {
}
!winrt: TEST_HELPER_INSTALLS = ../syslocaleapp/syslocaleapp
-
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
-blackberry:LIBS += -lpps
diff --git a/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp b/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp
index 0466ced10a..ee45f95d83 100644
--- a/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp
+++ b/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp
@@ -42,6 +42,7 @@
#include <qdatetime.h>
#include <qprocess.h>
#include <float.h>
+#include <locale.h>
#include <qlocale.h>
#include <private/qlocale_p.h>
@@ -68,52 +69,6 @@ extern "C" DWORD GetThreadLocale(void) {
# include <stdlib.h>
#endif
-#ifdef Q_OS_BLACKBERRY
-#include <unistd.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/pps.h>
-
-static const char ppsLanguageLocalePath[] = "/pps/services/confstr/_CS_LOCALE";
-static const size_t ppsBufferSize = 256;
-
-static QByteArray readPpsValue(const char *ppsObject, int ppsFd)
-{
- QByteArray result;
- if (!ppsObject || ppsFd == -1)
- return result;
-
- char buffer[ppsBufferSize];
-
- int bytes = read(ppsFd, buffer, ppsBufferSize - 1);
- if (bytes == -1) {
- qFatal("Failed to read Locale pps, errno=%d", errno);
- return result;
- }
- // ensure data is null terminated
- buffer[bytes] = '\0';
-
- pps_decoder_t ppsDecoder;
- pps_decoder_initialize(&ppsDecoder, 0);
- if (pps_decoder_parse_pps_str(&ppsDecoder, buffer) == PPS_DECODER_OK) {
- pps_decoder_push(&ppsDecoder, 0);
- const char *ppsBuff;
- if (pps_decoder_get_string(&ppsDecoder, ppsObject, &ppsBuff) == PPS_DECODER_OK) {
- result = ppsBuff;
- } else {
- int val;
- if (pps_decoder_get_int(&ppsDecoder, ppsObject, &val) == PPS_DECODER_OK)
- result = QByteArray::number(val);
- }
- }
-
- pps_decoder_cleanup(&ppsDecoder);
-
- return result;
-}
-#endif // Q_OS_BLACKBERRY
-
Q_DECLARE_METATYPE(QLocale::FormatType)
class tst_QLocale : public QObject
@@ -140,8 +95,10 @@ private slots:
void legacyNames();
void unixLocaleName();
void matchingLocales();
- void double_conversion_data();
- void double_conversion();
+ void stringToDouble_data();
+ void stringToDouble();
+ void doubleToString_data();
+ void doubleToString();
void long_long_conversion_data();
void long_long_conversion();
void long_long_conversion_extra();
@@ -194,10 +151,6 @@ private:
QString m_decimal, m_thousand, m_sdate, m_ldate, m_time;
QString m_sysapp;
bool europeanTimeZone;
-
-#ifdef Q_OS_BLACKBERRY
- int m_languageFd;
-#endif
};
tst_QLocale::tst_QLocale()
@@ -224,19 +177,10 @@ void tst_QLocale::initTestCase()
QVERIFY2(fi.exists() && fi.isExecutable(),
qPrintable(QDir::toNativeSeparators(m_sysapp)
+ QStringLiteral(" does not exist or is not executable.")));
-
-#ifdef Q_OS_BLACKBERRY
- if ((m_languageFd = open(ppsLanguageLocalePath, O_RDONLY)) == -1)
- QFAIL("Failed to open language pps.");
-#endif
}
void tst_QLocale::cleanupTestCase()
-{
-#ifdef Q_OS_BLACKBERRY
- close(m_languageFd);
-#endif
-}
+{}
void tst_QLocale::ctor()
{
@@ -370,7 +314,7 @@ void tst_QLocale::ctor()
&& l.country() == QLocale::exp_country, \
QString("requested: \"" + QString(req_lc) + "\", got: " \
+ QLocale::languageToString(l.language()) \
- + "/" + QLocale::countryToString(l.country())).toLatin1().constData()); \
+ + QLatin1Char('/') + QLocale::countryToString(l.country())).toLatin1().constData()); \
QCOMPARE(l, QLocale(QLocale::exp_lang, QLocale::exp_country)); \
QCOMPARE(qHash(l), qHash(QLocale(QLocale::exp_lang, QLocale::exp_country))); \
}
@@ -431,8 +375,8 @@ void tst_QLocale::ctor()
&& l.country() == QLocale::exp_country, \
QString("requested: \"" + QString(req_lc) + "\", got: " \
+ QLocale::languageToString(l.language()) \
- + "/" + QLocale::scriptToString(l.script()) \
- + "/" + QLocale::countryToString(l.country())).toLatin1().constData()); \
+ + QLatin1Char('/') + QLocale::scriptToString(l.script()) \
+ + QLatin1Char('/') + QLocale::countryToString(l.country())).toLatin1().constData()); \
}
TEST_CTOR("zh_CN", Chinese, SimplifiedHanScript, China)
@@ -532,11 +476,6 @@ void tst_QLocale::emptyCtor()
QVERIFY2(runSysApp(m_sysapp, env, &defaultLoc, &errorMessage),
qPrintable(errorMessage));
-#ifdef Q_OS_BLACKBERRY
- QString locale = readPpsValue("_CS_LOCALE", m_languageFd);
- QVERIFY2(runSysApp(m_sysapp, env, &locale, &errorMessage),
- qPrintable(errorMessage));
-#else
TEST_CTOR("C", "C")
TEST_CTOR("bla", "C")
TEST_CTOR("zz", "C")
@@ -574,7 +513,6 @@ void tst_QLocale::emptyCtor()
TEST_CTOR("en/", defaultLoc.toLatin1())
TEST_CTOR("asdfghj", defaultLoc.toLatin1());
TEST_CTOR("123456", defaultLoc.toLatin1());
-#endif // Q_OS_BLACKBERRY
#undef TEST_CTOR
#endif
@@ -606,7 +544,7 @@ void tst_QLocale::legacyNames()
&& l.country() == QLocale::exp_country, \
QString("requested: \"" + QString(req_lc) + "\", got: " \
+ QLocale::languageToString(l.language()) \
- + "/" + QLocale::countryToString(l.country())).toLatin1().constData()); \
+ + QLatin1Char('/') + QLocale::countryToString(l.country())).toLatin1().constData()); \
}
TEST_CTOR("mo_MD", Romanian, Moldova)
@@ -664,7 +602,7 @@ void tst_QLocale::unixLocaleName()
#undef TEST_NAME
}
-void tst_QLocale::double_conversion_data()
+void tst_QLocale::stringToDouble_data()
{
QTest::addColumn<QString>("locale_name");
QTest::addColumn<QString>("num_str");
@@ -786,7 +724,7 @@ void tst_QLocale::double_conversion_data()
QTest::newRow("de_DE 9.876543,0e--2") << QString("de_DE") << QString("9.876543,0e")+QChar(8722)+QString("2") << false << 0.0;
}
-void tst_QLocale::double_conversion()
+void tst_QLocale::stringToDouble()
{
#define MY_DOUBLE_EPSILON (2.22045e-16)
@@ -803,6 +741,11 @@ void tst_QLocale::double_conversion()
double d = locale.toDouble(num_str, &ok);
QCOMPARE(ok, good);
+ char *currentLocale = setlocale(LC_ALL, "de_DE");
+ QCOMPARE(locale.toDouble(num_str, &ok), d); // make sure result is independent of locale
+ QCOMPARE(ok, good);
+ setlocale(LC_ALL, currentLocale);
+
if (ok) {
double diff = d - num;
if (diff < 0)
@@ -821,6 +764,121 @@ void tst_QLocale::double_conversion()
}
}
+void tst_QLocale::doubleToString_data()
+{
+ QTest::addColumn<QString>("locale_name");
+ QTest::addColumn<QString>("num_str");
+ QTest::addColumn<double>("num");
+ QTest::addColumn<char>("mode");
+ QTest::addColumn<int>("precision");
+
+ int shortest = QLocale::FloatingPointShortest;
+
+ QTest::newRow("C 3.4 f 5") << QString("C") << QString("3.40000") << 3.4 << 'f' << 5;
+ QTest::newRow("C 3.4 f 0") << QString("C") << QString("3") << 3.4 << 'f' << 0;
+ QTest::newRow("C 3.4 e 5") << QString("C") << QString("3.40000e+00") << 3.4 << 'e' << 5;
+ QTest::newRow("C 3.4 e 0") << QString("C") << QString("3e+00") << 3.4 << 'e' << 0;
+ QTest::newRow("C 3.4 g 5") << QString("C") << QString("3.4") << 3.4 << 'g' << 5;
+ QTest::newRow("C 3.4 g 1") << QString("C") << QString("3") << 3.4 << 'g' << 1;
+
+ QTest::newRow("C 3.4 f 1") << QString("C") << QString("3.4") << 3.4 << 'f' << 1;
+ QTest::newRow("C 3.4 f -") << QString("C") << QString("3.4") << 3.4 << 'f' << shortest;
+ QTest::newRow("C 3.4 e 1") << QString("C") << QString("3.4e+00") << 3.4 << 'e' << 1;
+ QTest::newRow("C 3.4 e -") << QString("C") << QString("3.4e+00") << 3.4 << 'e' << shortest;
+ QTest::newRow("C 3.4 g 2") << QString("C") << QString("3.4") << 3.4 << 'g' << 2;
+ QTest::newRow("C 3.4 g -") << QString("C") << QString("3.4") << 3.4 << 'g' << shortest;
+
+ QTest::newRow("de_DE 3,4 f 1") << QString("de_DE") << QString("3,4") << 3.4 << 'f' << 1;
+ QTest::newRow("de_DE 3,4 f -") << QString("de_DE") << QString("3,4") << 3.4 << 'f' << shortest;
+ QTest::newRow("de_DE 3,4 e 1") << QString("de_DE") << QString("3,4e+00") << 3.4 << 'e' << 1;
+ QTest::newRow("de_DE 3,4 e -") << QString("de_DE") << QString("3,4e+00") << 3.4 << 'e' << shortest;
+ QTest::newRow("de_DE 3,4 g 2") << QString("de_DE") << QString("3,4") << 3.4 << 'g' << 2;
+ QTest::newRow("de_DE 3,4 g -") << QString("de_DE") << QString("3,4") << 3.4 << 'g' << shortest;
+
+ QTest::newRow("C 0.035003945 f 12") << QString("C") << QString("0.035003945000") << 0.035003945 << 'f' << 12;
+ QTest::newRow("C 0.035003945 f 6") << QString("C") << QString("0.035004") << 0.035003945 << 'f' << 6;
+ QTest::newRow("C 0.035003945 e 10") << QString("C") << QString("3.5003945000e-02") << 0.035003945 << 'e' << 10;
+ QTest::newRow("C 0.035003945 e 4") << QString("C") << QString("3.5004e-02") << 0.035003945 << 'e' << 4;
+ QTest::newRow("C 0.035003945 g 11") << QString("C") << QString("0.035003945") << 0.035003945 << 'g' << 11;
+ QTest::newRow("C 0.035003945 g 5") << QString("C") << QString("0.035004") << 0.035003945 << 'g' << 5;
+
+ QTest::newRow("C 0.035003945 f 9") << QString("C") << QString("0.035003945") << 0.035003945 << 'f' << 9;
+ QTest::newRow("C 0.035003945 f -") << QString("C") << QString("0.035003945") << 0.035003945 << 'f' << shortest;
+ QTest::newRow("C 0.035003945 e 7") << QString("C") << QString("3.5003945e-02") << 0.035003945 << 'e' << 7;
+ QTest::newRow("C 0.035003945 e -") << QString("C") << QString("3.5003945e-02") << 0.035003945 << 'e' << shortest;
+ QTest::newRow("C 0.035003945 g 8") << QString("C") << QString("0.035003945") << 0.035003945 << 'g' << 8;
+ QTest::newRow("C 0.035003945 g -") << QString("C") << QString("0.035003945") << 0.035003945 << 'g' << shortest;
+
+ QTest::newRow("de_DE 0,035003945 f 9") << QString("de_DE") << QString("0,035003945") << 0.035003945 << 'f' << 9;
+ QTest::newRow("de_DE 0,035003945 f -") << QString("de_DE") << QString("0,035003945") << 0.035003945 << 'f' << shortest;
+ QTest::newRow("de_DE 0,035003945 e 7") << QString("de_DE") << QString("3,5003945e-02") << 0.035003945 << 'e' << 7;
+ QTest::newRow("de_DE 0,035003945 e -") << QString("de_DE") << QString("3,5003945e-02") << 0.035003945 << 'e' << shortest;
+ QTest::newRow("de_DE 0,035003945 g 8") << QString("de_DE") << QString("0,035003945") << 0.035003945 << 'g' << 8;
+ QTest::newRow("de_DE 0,035003945 g -") << QString("de_DE") << QString("0,035003945") << 0.035003945 << 'g' << shortest;
+
+ QTest::newRow("C 0.000003945 f 12") << QString("C") << QString("0.000003945000") << 0.000003945 << 'f' << 12;
+ QTest::newRow("C 0.000003945 f 6") << QString("C") << QString("0.000004") << 0.000003945 << 'f' << 6;
+ QTest::newRow("C 0.000003945 e 6") << QString("C") << QString("3.945000e-06") << 0.000003945 << 'e' << 6;
+ QTest::newRow("C 0.000003945 e 0") << QString("C") << QString("4e-06") << 0.000003945 << 'e' << 0;
+ QTest::newRow("C 0.000003945 g 7") << QString("C") << QString("3.945e-06") << 0.000003945 << 'g' << 7;
+ QTest::newRow("C 0.000003945 g 1") << QString("C") << QString("4e-06") << 0.000003945 << 'g' << 1;
+
+ QTest::newRow("C 0.000003945 f 9") << QString("C") << QString("0.000003945") << 0.000003945 << 'f' << 9;
+ QTest::newRow("C 0.000003945 f -") << QString("C") << QString("0.000003945") << 0.000003945 << 'f' << shortest;
+ QTest::newRow("C 0.000003945 e 3") << QString("C") << QString("3.945e-06") << 0.000003945 << 'e' << 3;
+ QTest::newRow("C 0.000003945 e -") << QString("C") << QString("3.945e-06") << 0.000003945 << 'e' << shortest;
+ QTest::newRow("C 0.000003945 g 4") << QString("C") << QString("3.945e-06") << 0.000003945 << 'g' << 4;
+ QTest::newRow("C 0.000003945 g -") << QString("C") << QString("3.945e-06") << 0.000003945 << 'g' << shortest;
+
+ QTest::newRow("de_DE 0,000003945 f 9") << QString("de_DE") << QString("0,000003945") << 0.000003945 << 'f' << 9;
+ QTest::newRow("de_DE 0,000003945 f -") << QString("de_DE") << QString("0,000003945") << 0.000003945 << 'f' << shortest;
+ QTest::newRow("de_DE 0,000003945 e 3") << QString("de_DE") << QString("3,945e-06") << 0.000003945 << 'e' << 3;
+ QTest::newRow("de_DE 0,000003945 e -") << QString("de_DE") << QString("3,945e-06") << 0.000003945 << 'e' << shortest;
+ QTest::newRow("de_DE 0,000003945 g 4") << QString("de_DE") << QString("3,945e-06") << 0.000003945 << 'g' << 4;
+ QTest::newRow("de_DE 0,000003945 g -") << QString("de_DE") << QString("3,945e-06") << 0.000003945 << 'g' << shortest;
+
+ QTest::newRow("C 12456789012 f 3") << QString("C") << QString("12456789012.000") << 12456789012.0 << 'f' << 3;
+ QTest::newRow("C 12456789012 e 13") << QString("C") << QString("1.2456789012000e+10") << 12456789012.0 << 'e' << 13;
+ QTest::newRow("C 12456789012 e 7") << QString("C") << QString("1.2456789e+10") << 12456789012.0 << 'e' << 7;
+ QTest::newRow("C 12456789012 g 14") << QString("C") << QString("12456789012") << 12456789012.0 << 'g' << 14;
+ QTest::newRow("C 12456789012 g 8") << QString("C") << QString("1.2456789e+10") << 12456789012.0 << 'g' << 8;
+
+ QTest::newRow("C 12456789012 f 0") << QString("C") << QString("12456789012") << 12456789012.0 << 'f' << 0;
+ QTest::newRow("C 12456789012 f -") << QString("C") << QString("12456789012") << 12456789012.0 << 'f' << shortest;
+ QTest::newRow("C 12456789012 e 10") << QString("C") << QString("1.2456789012e+10") << 12456789012.0 << 'e' << 10;
+ QTest::newRow("C 12456789012 e -") << QString("C") << QString("1.2456789012e+10") << 12456789012.0 << 'e' << shortest;
+ QTest::newRow("C 12456789012 g 11") << QString("C") << QString("12456789012") << 12456789012.0 << 'g' << 11;
+ QTest::newRow("C 12456789012 g -") << QString("C") << QString("12456789012") << 12456789012.0 << 'g' << shortest;
+
+ QTest::newRow("de_DE 12456789012 f 0") << QString("de_DE") << QString("12.456.789.012") << 12456789012.0 << 'f' << 0;
+ QTest::newRow("de_DE 12456789012 f -") << QString("de_DE") << QString("12.456.789.012") << 12456789012.0 << 'f' << shortest;
+ QTest::newRow("de_DE 12456789012 e 10") << QString("de_DE") << QString("1,2456789012e+10") << 12456789012.0 << 'e' << 10;
+ QTest::newRow("de_DE 12456789012 e -") << QString("de_DE") << QString("1,2456789012e+10") << 12456789012.0 << 'e' << shortest;
+ QTest::newRow("de_DE 12456789012 g 11") << QString("de_DE") << QString("12.456.789.012") << 12456789012.0 << 'g' << 11;
+ QTest::newRow("de_DE 12456789012 g -") << QString("de_DE") << QString("12.456.789.012") << 12456789012.0 << 'g' << shortest;
+}
+
+void tst_QLocale::doubleToString()
+{
+ QFETCH(QString, locale_name);
+ QFETCH(QString, num_str);
+ QFETCH(double, num);
+ QFETCH(char, mode);
+ QFETCH(int, precision);
+
+#ifdef QT_NO_DOUBLECONVERSION
+ if (precision == QLocale::FloatingPointShortest)
+ QSKIP("'Shortest' double conversion is not that short without libdouble-conversion");
+#endif
+
+ const QLocale locale(locale_name);
+ QCOMPARE(locale.toString(num, mode, precision), num_str);
+
+ char *currentLocale = setlocale(LC_ALL, "de_DE");
+ QCOMPARE(locale.toString(num, mode, precision), num_str);
+ setlocale(LC_ALL, currentLocale);
+}
+
void tst_QLocale::long_long_conversion_data()
{
QTest::addColumn<QString>("locale_name");
@@ -952,7 +1010,8 @@ void tst_QLocale::fpExceptions()
#define _EM_INEXACT 0x00000001
#endif
- // check that qdtoa doesn't throw floating point exceptions when they are enabled
+ // check that double-to-string conversion doesn't throw floating point exceptions when they are
+ // enabled
#ifdef Q_OS_WIN
unsigned int oldbits = _control87(0, 0);
_control87( 0 | _EM_INEXACT, _MCW_EM );
@@ -1278,13 +1337,13 @@ void tst_QLocale::formatTimeZone()
QLocale enUS("en_US");
QDateTime dt1(QDate(2013, 1, 1), QTime(1, 0, 0), Qt::OffsetFromUTC, 60 * 60);
- QCOMPARE(enUS.toString(dt1, "t"), QString("UTC+01:00"));
+ QCOMPARE(enUS.toString(dt1, "t"), QLatin1String("UTC+01:00"));
QDateTime dt2(QDate(2013, 1, 1), QTime(1, 0, 0), Qt::OffsetFromUTC, -60 * 60);
- QCOMPARE(enUS.toString(dt2, "t"), QString("UTC-01:00"));
+ QCOMPARE(enUS.toString(dt2, "t"), QLatin1String("UTC-01:00"));
QDateTime dt3(QDate(2013, 1, 1), QTime(0, 0, 0), Qt::UTC);
- QCOMPARE(enUS.toString(dt3, "t"), QString("UTC"));
+ QCOMPARE(enUS.toString(dt3, "t"), QLatin1String("UTC"));
// LocalTime should vary
if (europeanTimeZone) {
@@ -1293,14 +1352,14 @@ void tst_QLocale::formatTimeZone()
#ifdef Q_OS_WIN
QEXPECT_FAIL("", "Windows only returns long name (QTBUG-32759)", Continue);
#endif // Q_OS_WIN
- QCOMPARE(enUS.toString(dt4, "t"), QString("CET"));
+ QCOMPARE(enUS.toString(dt4, "t"), QLatin1String("CET"));
// Time definitely in Daylight Time
QDateTime dt5(QDate(2013, 6, 1), QTime(0, 0, 0), Qt::LocalTime);
#ifdef Q_OS_WIN
QEXPECT_FAIL("", "Windows only returns long name (QTBUG-32759)", Continue);
#endif // Q_OS_WIN
- QCOMPARE(enUS.toString(dt5, "t"), QString("CEST"));
+ QCOMPARE(enUS.toString(dt5, "t"), QLatin1String("CEST"));
} else {
QSKIP("You must test using Central European (CET/CEST) time zone, e.g. TZ=Europe/Oslo");
}
@@ -1309,13 +1368,13 @@ void tst_QLocale::formatTimeZone()
#ifdef Q_OS_WIN
QEXPECT_FAIL("", "QTimeZone windows backend only returns long name", Continue);
#endif
- QCOMPARE(enUS.toString(dt6, "t"), QString("CET"));
+ QCOMPARE(enUS.toString(dt6, "t"), QLatin1String("CET"));
QDateTime dt7(QDate(2013, 6, 1), QTime(0, 0, 0), QTimeZone("Europe/Berlin"));
#ifdef Q_OS_WIN
QEXPECT_FAIL("", "QTimeZone windows backend only returns long name", Continue);
#endif
- QCOMPARE(enUS.toString(dt7, "t"), QString("CEST"));
+ QCOMPARE(enUS.toString(dt7, "t"), QLatin1String("CEST"));
// Current datetime should return current abbreviation
QCOMPARE(enUS.toString(QDateTime::currentDateTime(), "t"),
@@ -1461,9 +1520,9 @@ void tst_QLocale::macDefaultLocale()
if (timeString.contains(QString("GMT"))) {
QString expectedGMTSpecifierBase("GMT");
if (diff >= 0)
- expectedGMTSpecifierBase.append("+");
+ expectedGMTSpecifierBase.append(QLatin1Char('+'));
else
- expectedGMTSpecifierBase.append("-");
+ expectedGMTSpecifierBase.append(QLatin1Char('-'));
QString expectedGMTSpecifier = expectedGMTSpecifierBase + QString("%1").arg(qAbs(diff));
QString expectedGMTSpecifierZeroExtended = expectedGMTSpecifierBase + QString("0%1").arg(qAbs(diff));
@@ -1639,6 +1698,20 @@ void tst_QLocale::numberOptions()
QLocale locale2 = locale;
QCOMPARE(locale2.numberOptions(), QLocale::RejectGroupSeparator);
+
+ QCOMPARE(locale.toString(12.4, 'e', 2), QString("1.24e+01"));
+ locale.setNumberOptions(QLocale::OmitLeadingZeroInExponent);
+ QCOMPARE(locale.numberOptions(), QLocale::OmitLeadingZeroInExponent);
+ QCOMPARE(locale.toString(12.4, 'e', 2), QString("1.24e+1"));
+
+ locale.toDouble(QString("1.24e+01"), &ok);
+ QVERIFY(ok);
+ locale.setNumberOptions(QLocale::RejectLeadingZeroInExponent);
+ QCOMPARE(locale.numberOptions(), QLocale::RejectLeadingZeroInExponent);
+ locale.toDouble(QString("1.24e+1"), &ok);
+ QVERIFY(ok);
+ locale.toDouble(QString("1.24e+01"), &ok);
+ QVERIFY(!ok);
}
void tst_QLocale::negativeNumbers()
@@ -1698,9 +1771,11 @@ void tst_QLocale::testNames_data()
for (int i = 0; i < locale_data_count; ++i) {
const QLocaleData &item = locale_data[i];
- const QString testName = QString::fromLatin1("data_%1 (%2/%3)").arg(i)
- .arg(QLocale::languageToString((QLocale::Language)item.m_language_id))
- .arg(QLocale::countryToString((QLocale::Country)item.m_country_id));
+
+ const QString testName = QLatin1String("data_") + QString::number(i) + QLatin1String(" (")
+ + QLocale::languageToString((QLocale::Language)item.m_language_id)
+ + QLatin1Char('/') + QLocale::countryToString((QLocale::Country)item.m_country_id)
+ + QLatin1Char(')');
QTest::newRow(testName.toLatin1().constData()) << (int)item.m_language_id << (int)item.m_country_id;
}
}
@@ -1828,13 +1903,27 @@ void tst_QLocale::underflowOverflow()
a(QLatin1String("0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e10"));
bool ok = false;
- a.toDouble(&ok);
+ double d = a.toDouble(&ok);
QVERIFY(!ok);
+ QCOMPARE(d, 0.0);
a = QLatin1String("1e600");
ok = false;
- a.toDouble(&ok);
+ d = a.toDouble(&ok);
+ QVERIFY(!ok); // detectable overflow
+ QVERIFY(qIsInf(d));
+
+ a = QLatin1String("-1e600");
+ ok = false;
+ d = a.toDouble(&ok);
+ QVERIFY(!ok); // detectable underflow
+ QVERIFY(qIsInf(-d));
+
+ a = QLatin1String("1e-600");
+ ok = false;
+ d = a.toDouble(&ok);
QVERIFY(!ok);
+ QCOMPARE(d, 0.0);
a = QLatin1String("-9223372036854775809");
a.toLongLong(&ok);
diff --git a/tests/auto/corelib/tools/qmap/qmap.pro b/tests/auto/corelib/tools/qmap/qmap.pro
index 460b6654fb..27820a76c8 100644
--- a/tests/auto/corelib/tools/qmap/qmap.pro
+++ b/tests/auto/corelib/tools/qmap/qmap.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qmap
QT = core testlib
SOURCES = $$PWD/tst_qmap.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qmap/tst_qmap.cpp b/tests/auto/corelib/tools/qmap/tst_qmap.cpp
index bb6535b635..daaabbb523 100644
--- a/tests/auto/corelib/tools/qmap/tst_qmap.cpp
+++ b/tests/auto/corelib/tools/qmap/tst_qmap.cpp
@@ -413,24 +413,24 @@ void tst_QMap::key()
QCOMPARE(map1.key(1, def), def);
map1.insert("one", 1);
- QCOMPARE(map1.key(1), QString("one"));
- QCOMPARE(map1.key(1, def), QString("one"));
+ QCOMPARE(map1.key(1), QLatin1String("one"));
+ QCOMPARE(map1.key(1, def), QLatin1String("one"));
QCOMPARE(map1.key(2), QString());
QCOMPARE(map1.key(2, def), def);
map1.insert("two", 2);
- QCOMPARE(map1.key(1), QString("one"));
- QCOMPARE(map1.key(1, def), QString("one"));
- QCOMPARE(map1.key(2), QString("two"));
- QCOMPARE(map1.key(2, def), QString("two"));
+ QCOMPARE(map1.key(1), QLatin1String("one"));
+ QCOMPARE(map1.key(1, def), QLatin1String("one"));
+ QCOMPARE(map1.key(2), QLatin1String("two"));
+ QCOMPARE(map1.key(2, def), QLatin1String("two"));
QCOMPARE(map1.key(3), QString());
QCOMPARE(map1.key(3, def), def);
map1.insert("deux", 2);
- QCOMPARE(map1.key(1), QString("one"));
- QCOMPARE(map1.key(1, def), QString("one"));
- QVERIFY(map1.key(2) == "deux" || map1.key(2) == "two");
- QVERIFY(map1.key(2, def) == "deux" || map1.key(2, def) == "two");
+ QCOMPARE(map1.key(1), QLatin1String("one"));
+ QCOMPARE(map1.key(1, def), QLatin1String("one"));
+ QVERIFY(map1.key(2) == QLatin1String("deux") || map1.key(2) == QLatin1String("two"));
+ QVERIFY(map1.key(2, def) == QLatin1String("deux") || map1.key(2, def) == QLatin1String("two"));
QCOMPARE(map1.key(3), QString());
QCOMPARE(map1.key(3, def), def);
}
@@ -608,8 +608,8 @@ void tst_QMap::find()
map1.insert(1,"Mayer");
map1.insert(2,"Hej");
- QVERIFY(map1.find(1).value() == "Mayer");
- QVERIFY(map1.find(2).value() == "Hej");
+ QCOMPARE(map1.find(1).value(), QLatin1String("Mayer"));
+ QCOMPARE(map1.find(2).value(), QLatin1String("Hej"));
for(i = 3; i < 10; ++i) {
compareString = testString.arg(i);
@@ -643,8 +643,8 @@ void tst_QMap::constFind()
QVERIFY(map1.constFind(4) == map1.constEnd());
- QVERIFY(map1.constFind(1).value() == "Mayer");
- QVERIFY(map1.constFind(2).value() == "Hej");
+ QCOMPARE(map1.constFind(1).value(), QLatin1String("Mayer"));
+ QCOMPARE(map1.constFind(2).value(), QLatin1String("Hej"));
for(i = 3; i < 10; ++i) {
compareString = testString.arg(i);
@@ -705,10 +705,10 @@ void tst_QMap::lowerUpperBound()
QCOMPARE(map1.lowerBound(5).key(), 5);
QCOMPARE(map1.lowerBound(6).key(), 7);
QCOMPARE(map1.lowerBound(7).key(), 7);
- QCOMPARE(map1.lowerBound(6).value(), QString("seven_2"));
- QCOMPARE(map1.lowerBound(7).value(), QString("seven_2"));
- QCOMPARE((++map1.lowerBound(6)).value(), QString("seven"));
- QCOMPARE((++map1.lowerBound(7)).value(), QString("seven"));
+ QCOMPARE(map1.lowerBound(6).value(), QLatin1String("seven_2"));
+ QCOMPARE(map1.lowerBound(7).value(), QLatin1String("seven_2"));
+ QCOMPARE((++map1.lowerBound(6)).value(), QLatin1String("seven"));
+ QCOMPARE((++map1.lowerBound(7)).value(), QLatin1String("seven"));
QCOMPARE(map1.lowerBound(10).key(), 10);
QVERIFY(map1.lowerBound(999) == map1.end());
}
@@ -733,11 +733,11 @@ void tst_QMap::mergeCompare()
map1b.unite(map2b);
sanityCheckTree(map1b, __LINE__);
- QVERIFY(map1.value(1) == "ett");
- QVERIFY(map1.value(2) == "tvo");
- QVERIFY(map1.value(3) == "tre");
- QVERIFY(map1.value(4) == "fyra");
- QVERIFY(map1.value(5) == "fem");
+ QCOMPARE(map1.value(1), QLatin1String("ett"));
+ QCOMPARE(map1.value(2), QLatin1String("tvo"));
+ QCOMPARE(map1.value(3), QLatin1String("tre"));
+ QCOMPARE(map1.value(4), QLatin1String("fyra"));
+ QCOMPARE(map1.value(5), QLatin1String("fem"));
map3.insert(1, "ett");
map3.insert(2, "tvo");
@@ -755,7 +755,7 @@ void tst_QMap::take()
map.insert(2, "zwei");
map.insert(3, "drei");
- QVERIFY(map.take(3) == "drei");
+ QCOMPARE(map.take(3), QLatin1String("drei"));
QVERIFY(!map.contains(3));
}
@@ -771,19 +771,19 @@ void tst_QMap::iterators()
//STL-Style iterators
QMap<int, QString>::iterator stlIt = map.begin();
- QVERIFY(stlIt.value() == "Teststring 1");
+ QCOMPARE(stlIt.value(), QLatin1String("Teststring 1"));
stlIt+=5;
- QVERIFY(stlIt.value() == "Teststring 6");
+ QCOMPARE(stlIt.value(), QLatin1String("Teststring 6"));
stlIt++;
- QVERIFY(stlIt.value() == "Teststring 7");
+ QCOMPARE(stlIt.value(), QLatin1String("Teststring 7"));
stlIt-=3;
- QVERIFY(stlIt.value() == "Teststring 4");
+ QCOMPARE(stlIt.value(), QLatin1String("Teststring 4"));
stlIt--;
- QVERIFY(stlIt.value() == "Teststring 3");
+ QCOMPARE(stlIt.value(), QLatin1String("Teststring 3"));
for(stlIt = map.begin(), i = 1; stlIt != map.end(); ++stlIt, ++i)
QVERIFY(stlIt.value() == testString.arg(i));
@@ -792,19 +792,19 @@ void tst_QMap::iterators()
//STL-Style const-iterators
QMap<int, QString>::const_iterator cstlIt = map.constBegin();
- QVERIFY(cstlIt.value() == "Teststring 1");
+ QCOMPARE(cstlIt.value(), QLatin1String("Teststring 1"));
cstlIt+=5;
- QVERIFY(cstlIt.value() == "Teststring 6");
+ QCOMPARE(cstlIt.value(), QLatin1String("Teststring 6"));
cstlIt++;
- QVERIFY(cstlIt.value() == "Teststring 7");
+ QCOMPARE(cstlIt.value(), QLatin1String("Teststring 7"));
cstlIt-=3;
- QVERIFY(cstlIt.value() == "Teststring 4");
+ QCOMPARE(cstlIt.value(), QLatin1String("Teststring 4"));
cstlIt--;
- QVERIFY(cstlIt.value() == "Teststring 3");
+ QCOMPARE(cstlIt.value(), QLatin1String("Teststring 3"));
for(cstlIt = map.constBegin(), i = 1; cstlIt != map.constEnd(); ++cstlIt, ++i)
QVERIFY(cstlIt.value() == testString.arg(i));
@@ -1062,7 +1062,7 @@ void tst_QMap::equal_range()
QCOMPARE(cresult.second, cmap.cend());
for (int i = -10; i < 10; i += 2)
- map.insert(i, QString("%1").arg(i));
+ map.insert(i, QString::number(i));
result = map.equal_range(0);
QCOMPARE(result.first, map.find(0));
diff --git a/tests/auto/corelib/tools/qmargins/qmargins.pro b/tests/auto/corelib/tools/qmargins/qmargins.pro
index 25fe715edf..696f9374a2 100644
--- a/tests/auto/corelib/tools/qmargins/qmargins.pro
+++ b/tests/auto/corelib/tools/qmargins/qmargins.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qmargins
QT = core testlib
SOURCES = tst_qmargins.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qmessageauthenticationcode/qmessageauthenticationcode.pro b/tests/auto/corelib/tools/qmessageauthenticationcode/qmessageauthenticationcode.pro
index afd0c1176d..a62b702f22 100644
--- a/tests/auto/corelib/tools/qmessageauthenticationcode/qmessageauthenticationcode.pro
+++ b/tests/auto/corelib/tools/qmessageauthenticationcode/qmessageauthenticationcode.pro
@@ -1,6 +1,5 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qmessageauthenticationcode
QT = core testlib
SOURCES = tst_qmessageauthenticationcode.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qpair/qpair.pro b/tests/auto/corelib/tools/qpair/qpair.pro
index c49215cb1c..659be887d3 100644
--- a/tests/auto/corelib/tools/qpair/qpair.pro
+++ b/tests/auto/corelib/tools/qpair/qpair.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qpair
QT = core testlib
SOURCES = tst_qpair.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qpair/tst_qpair.cpp b/tests/auto/corelib/tools/qpair/tst_qpair.cpp
index 076efc5428..bce02d1a42 100644
--- a/tests/auto/corelib/tools/qpair/tst_qpair.cpp
+++ b/tests/auto/corelib/tools/qpair/tst_qpair.cpp
@@ -41,6 +41,8 @@ class tst_QPair : public QObject
Q_OBJECT
private Q_SLOTS:
void testConstexpr();
+ void testConversions();
+ void taskQTBUG_48780_pairContainingCArray();
};
class C { char _[4]; };
@@ -108,5 +110,72 @@ void tst_QPair::testConstexpr()
Q_UNUSED(pSI);
}
+void tst_QPair::testConversions()
+{
+ // construction from lvalue:
+ {
+ const QPair<int, double> rhs(42, 4.5);
+ const QPair<int, int> pii = rhs;
+ QCOMPARE(pii.first, 42);
+ QCOMPARE(pii.second, 4);
+
+ const QPair<int, float> pif = rhs;
+ QCOMPARE(pif.first, 42);
+ QCOMPARE(pif.second, 4.5f);
+ }
+
+ // assignment from lvalue:
+ {
+ const QPair<int, double> rhs(42, 4.5);
+ QPair<int, int> pii;
+ pii = rhs;
+ QCOMPARE(pii.first, 42);
+ QCOMPARE(pii.second, 4);
+
+ QPair<int, float> pif;
+ pif = rhs;
+ QCOMPARE(pif.first, 42);
+ QCOMPARE(pif.second, 4.5f);
+ }
+
+ // construction from rvalue:
+ {
+#define rhs qMakePair(42, 4.5)
+ const QPair<int, int> pii = rhs;
+ QCOMPARE(pii.first, 42);
+ QCOMPARE(pii.second, 4);
+
+ const QPair<int, float> pif = rhs;
+ QCOMPARE(pif.first, 42);
+ QCOMPARE(pif.second, 4.5f);
+#undef rhs
+ }
+
+ // assignment from rvalue:
+ {
+#define rhs qMakePair(42, 4.5)
+ QPair<int, int> pii;
+ pii = rhs;
+ QCOMPARE(pii.first, 42);
+ QCOMPARE(pii.second, 4);
+
+ QPair<int, float> pif;
+ pif = rhs;
+ QCOMPARE(pif.first, 42);
+ QCOMPARE(pif.second, 4.5f);
+#undef rhs
+ }
+}
+
+void tst_QPair::taskQTBUG_48780_pairContainingCArray()
+{
+ // compile-only:
+ QPair<int[2], int> pair;
+ pair.first[0] = 0;
+ pair.first[1] = 1;
+ pair.second = 2;
+ Q_UNUSED(pair);
+}
+
QTEST_APPLESS_MAIN(tst_QPair)
#include "tst_qpair.moc"
diff --git a/tests/auto/corelib/tools/qpoint/qpoint.pro b/tests/auto/corelib/tools/qpoint/qpoint.pro
index 0923abbc88..8321d08fe0 100644
--- a/tests/auto/corelib/tools/qpoint/qpoint.pro
+++ b/tests/auto/corelib/tools/qpoint/qpoint.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qpoint
QT = core testlib
SOURCES = tst_qpoint.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qpointf/qpointf.pro b/tests/auto/corelib/tools/qpointf/qpointf.pro
index 1c594cd47c..5715b95d96 100644
--- a/tests/auto/corelib/tools/qpointf/qpointf.pro
+++ b/tests/auto/corelib/tools/qpointf/qpointf.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qpointf
QT = core testlib
SOURCES = tst_qpointf.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qqueue/qqueue.pro b/tests/auto/corelib/tools/qqueue/qqueue.pro
index 7b1e28baf3..55ceb65fbd 100644
--- a/tests/auto/corelib/tools/qqueue/qqueue.pro
+++ b/tests/auto/corelib/tools/qqueue/qqueue.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qqueue
QT = core testlib
SOURCES = tst_qqueue.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qrect/qrect.pro b/tests/auto/corelib/tools/qrect/qrect.pro
index 06fe15b0d6..8ec31db215 100644
--- a/tests/auto/corelib/tools/qrect/qrect.pro
+++ b/tests/auto/corelib/tools/qrect/qrect.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qrect
QT = core testlib
SOURCES = tst_qrect.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qregexp/qregexp.pro b/tests/auto/corelib/tools/qregexp/qregexp.pro
index d8f67eed25..5f6ff0a71c 100644
--- a/tests/auto/corelib/tools/qregexp/qregexp.pro
+++ b/tests/auto/corelib/tools/qregexp/qregexp.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qregexp
QT = core testlib
SOURCES = tst_qregexp.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qregexp/tst_qregexp.cpp b/tests/auto/corelib/tools/qregexp/tst_qregexp.cpp
index b9a3fc13c5..1d8b719d16 100644
--- a/tests/auto/corelib/tools/qregexp/tst_qregexp.cpp
+++ b/tests/auto/corelib/tools/qregexp/tst_qregexp.cpp
@@ -880,19 +880,19 @@ void tst_QRegExp::caretAnchoredOptimization()
{
QString s = "---babnana----";
s.replace( QRegExp("^-*|(-*)$"), "" );
- QVERIFY(s == "babnana");
+ QCOMPARE(s, QLatin1String("babnana"));
s = "---babnana----";
s.replace( QRegExp("^-*|(-{0,})$"), "" );
- QVERIFY(s == "babnana");
+ QCOMPARE(s, QLatin1String("babnana"));
s = "---babnana----";
s.replace( QRegExp("^-*|(-{1,})$"), "" );
- QVERIFY(s == "babnana");
+ QCOMPARE(s, QLatin1String("babnana"));
s = "---babnana----";
s.replace( QRegExp("^-*|(-+)$"), "" );
- QVERIFY(s == "babnana");
+ QCOMPARE(s, QLatin1String("babnana"));
}
void tst_QRegExp::isEmpty()
@@ -1370,12 +1370,14 @@ void tst_QRegExp::escapeSequences()
{
QString perlSyntaxSpecialChars("0123456789afnrtvbBdDwWsSx\\|[]{}()^$?+*");
QString w3cXmlSchema11SyntaxSpecialChars("cCiIpP"); // as well as the perl ones
+ QString pattern = QLatin1String("\\?");
for (int i = ' '; i <= 127; ++i) {
QLatin1Char c(i);
if (perlSyntaxSpecialChars.indexOf(c) == -1) {
- QRegExp rx(QString("\\%1").arg(c), Qt::CaseSensitive, QRegExp::RegExp);
+ pattern[1] = c;
+ QRegExp rx(pattern, Qt::CaseSensitive, QRegExp::RegExp);
// we'll never have c == 'a' since it's a special character
- QString s = QString("aaa%1aaa").arg(c);
+ const QString s = QLatin1String("aaa") + c + QLatin1String("aaa");
QCOMPARE(rx.indexIn(s), 3);
rx.setPatternSyntax(QRegExp::RegExp2);
diff --git a/tests/auto/corelib/tools/qregularexpression/alwaysoptimize/alwaysoptimize.pro b/tests/auto/corelib/tools/qregularexpression/alwaysoptimize/alwaysoptimize.pro
index 3ecf16918c..a27286ff20 100644
--- a/tests/auto/corelib/tools/qregularexpression/alwaysoptimize/alwaysoptimize.pro
+++ b/tests/auto/corelib/tools/qregularexpression/alwaysoptimize/alwaysoptimize.pro
@@ -1,8 +1,7 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qregularexpression_alwaysoptimize
QT = core testlib
HEADERS = ../tst_qregularexpression.h
SOURCES = \
tst_qregularexpression_alwaysoptimize.cpp \
../tst_qregularexpression.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qregularexpression/defaultoptimize/defaultoptimize.pro b/tests/auto/corelib/tools/qregularexpression/defaultoptimize/defaultoptimize.pro
index 9e366c0f48..0b36c79c1b 100644
--- a/tests/auto/corelib/tools/qregularexpression/defaultoptimize/defaultoptimize.pro
+++ b/tests/auto/corelib/tools/qregularexpression/defaultoptimize/defaultoptimize.pro
@@ -1,8 +1,7 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qregularexpression_defaultoptimize
QT = core testlib
HEADERS = ../tst_qregularexpression.h
SOURCES = \
tst_qregularexpression_defaultoptimize.cpp \
../tst_qregularexpression.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qregularexpression/forceoptimize/forceoptimize.pro b/tests/auto/corelib/tools/qregularexpression/forceoptimize/forceoptimize.pro
index d34bc9b93d..1db77781dd 100644
--- a/tests/auto/corelib/tools/qregularexpression/forceoptimize/forceoptimize.pro
+++ b/tests/auto/corelib/tools/qregularexpression/forceoptimize/forceoptimize.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qregularexpression_forceoptimize
QT = core testlib
HEADERS = ../tst_qregularexpression.h
diff --git a/tests/auto/corelib/tools/qregularexpression/tst_qregularexpression.cpp b/tests/auto/corelib/tools/qregularexpression/tst_qregularexpression.cpp
index 8ddd4979b6..6be4e69eb7 100644
--- a/tests/auto/corelib/tools/qregularexpression/tst_qregularexpression.cpp
+++ b/tests/auto/corelib/tools/qregularexpression/tst_qregularexpression.cpp
@@ -656,7 +656,7 @@ void tst_QRegularExpression::normalMatch_data()
m.captured << "c123def" << "c12" << "3" << "def";
offset = 2;
for (int i = 0; i <= offset; ++i) {
- QTest::newRow(QStringLiteral("match06-offset%1").arg(i).toUtf8().constData())
+ QTest::newRow(("match06-offset" + QByteArray::number(i)).constData())
<< QRegularExpression("(\\w*)(\\d+)(\\w*)")
<< QStringLiteral("abc123def").mid(offset - i)
<< i
@@ -669,7 +669,7 @@ void tst_QRegularExpression::normalMatch_data()
m.captured << QString("");
offset = 9;
for (int i = 0; i <= offset; ++i) {
- QTest::newRow(QStringLiteral("match07-offset%1").arg(i).toUtf8().constData())
+ QTest::newRow(("match07-offset" + QByteArray::number(i)).constData())
<< QRegularExpression("\\w*")
<< QStringLiteral("abc123def").mid(offset - i)
<< i
@@ -747,7 +747,7 @@ void tst_QRegularExpression::normalMatch_data()
m.isValid = true;
offset = 1;
for (int i = 0; i <= offset; ++i) {
- QTest::newRow(QStringLiteral("nomatch02-offset%1").arg(i).toUtf8().constData())
+ QTest::newRow(("nomatch02-offset" + QByteArray::number(i)).constData())
<< QRegularExpression("(\\w+) (\\w+)")
<< QStringLiteral("a string").mid(offset - i)
<< i
@@ -759,7 +759,7 @@ void tst_QRegularExpression::normalMatch_data()
m.isValid = true;
offset = 9;
for (int i = 0; i <= offset; ++i) {
- QTest::newRow(QStringLiteral("nomatch03-offset%1").arg(i).toUtf8().constData())
+ QTest::newRow(("nomatch03-offset" + QByteArray::number(i)).constData())
<< QRegularExpression("\\w+")
<< QStringLiteral("abc123def").mid(offset - i)
<< i
@@ -930,7 +930,7 @@ void tst_QRegularExpression::partialMatch_data()
m.captured << "def";
offset = 1;
for (int i = 0; i <= offset; ++i) {
- QTest::newRow(QStringLiteral("softmatch08-offset%1").arg(i).toUtf8().constData())
+ QTest::newRow(("softmatch08-offset" + QByteArray::number(i)).constData())
<< QRegularExpression("abc\\w+X|defY")
<< QStringLiteral("abcdef").mid(offset - i)
<< i
@@ -1016,7 +1016,7 @@ void tst_QRegularExpression::partialMatch_data()
m.captured << "def";
offset = 1;
for (int i = 0; i <= offset; ++i) {
- QTest::newRow(QStringLiteral("hardmatch08-offset%1").arg(i).toUtf8().constData())
+ QTest::newRow(("hardmatch08-offset" + QByteArray::number(i)).constData())
<< QRegularExpression("abc\\w+X|defY")
<< QStringLiteral("abcdef").mid(offset - i)
<< i
diff --git a/tests/auto/corelib/tools/qringbuffer/qringbuffer.pro b/tests/auto/corelib/tools/qringbuffer/qringbuffer.pro
index 0618b03309..c63544035a 100644
--- a/tests/auto/corelib/tools/qringbuffer/qringbuffer.pro
+++ b/tests/auto/corelib/tools/qringbuffer/qringbuffer.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qringbuffer
QT = core-private testlib
SOURCES = tst_qringbuffer.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qringbuffer/tst_qringbuffer.cpp b/tests/auto/corelib/tools/qringbuffer/tst_qringbuffer.cpp
index 77fc6ad6ae..b77fe23bd6 100644
--- a/tests/auto/corelib/tools/qringbuffer/tst_qringbuffer.cpp
+++ b/tests/auto/corelib/tools/qringbuffer/tst_qringbuffer.cpp
@@ -39,11 +39,11 @@ class tst_QRingBuffer : public QObject
{
Q_OBJECT
private slots:
+ void constructing();
void readPointerAtPositionWriteRead();
void readPointerAtPositionEmptyRead();
void readPointerAtPositionWithHead();
void readPointerAtPositionReadTooMuch();
- void sizeWhenEmpty();
void sizeWhenReservedAndChopped();
void sizeWhenReserved();
void free();
@@ -57,6 +57,23 @@ private slots:
void readLine();
};
+void tst_QRingBuffer::constructing()
+{
+ QRingBuffer ringBuffer;
+
+ QCOMPARE(ringBuffer.size(), Q_INT64_C(0));
+ QVERIFY(ringBuffer.isEmpty());
+ QCOMPARE(ringBuffer.nextDataBlockSize(), Q_INT64_C(0));
+ QVERIFY(ringBuffer.readPointer() == Q_NULLPTR);
+ QCOMPARE(ringBuffer.skip(5), Q_INT64_C(0));
+ QCOMPARE(ringBuffer.read(), QByteArray());
+ QCOMPARE(ringBuffer.getChar(), -1);
+ QVERIFY(!ringBuffer.canReadLine());
+
+ char buf[5];
+ QCOMPARE(ringBuffer.peek(buf, sizeof(buf)), Q_INT64_C(0));
+}
+
void tst_QRingBuffer::sizeWhenReserved()
{
QRingBuffer ringBuffer;
@@ -74,13 +91,6 @@ void tst_QRingBuffer::sizeWhenReservedAndChopped()
QCOMPARE(ringBuffer.size(), Q_INT64_C(0));
}
-void tst_QRingBuffer::sizeWhenEmpty()
-{
- QRingBuffer ringBuffer;
-
- QCOMPARE(ringBuffer.size(), Q_INT64_C(0));
-}
-
void tst_QRingBuffer::readPointerAtPositionReadTooMuch()
{
QRingBuffer ringBuffer;
@@ -140,7 +150,7 @@ void tst_QRingBuffer::readPointerAtPositionWriteRead()
inData.putChar(0x23);
inData.write("Qt rocks!");
for (int i = 0; i < 5000; i++)
- inData.write(QString("Number %1").arg(i).toUtf8());
+ inData.write("Number " + QByteArray::number(i));
inData.reset();
QVERIFY(inData.size() > 0);
@@ -284,7 +294,8 @@ void tst_QRingBuffer::indexOf()
for (int i = 1; i < 256; ++i) {
qint64 index = ringBuffer.indexOf(char(i));
QCOMPARE(index, qint64(i - 1));
- QCOMPARE(ringBuffer.indexOf(char(i), i), index);
+ QCOMPARE(ringBuffer.indexOf(char(i), i, i >> 1), index);
+ QCOMPARE(ringBuffer.indexOf(char(i), 256, i), Q_INT64_C(-1));
QCOMPARE(ringBuffer.indexOf(char(i), i - 1), -1); // test for absent char
}
}
diff --git a/tests/auto/corelib/tools/qscopedpointer/qscopedpointer.pro b/tests/auto/corelib/tools/qscopedpointer/qscopedpointer.pro
index 5fa529e175..5248ad5528 100644
--- a/tests/auto/corelib/tools/qscopedpointer/qscopedpointer.pro
+++ b/tests/auto/corelib/tools/qscopedpointer/qscopedpointer.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qscopedpointer
QT = core testlib
SOURCES = tst_qscopedpointer.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qscopedvaluerollback/qscopedvaluerollback.pro b/tests/auto/corelib/tools/qscopedvaluerollback/qscopedvaluerollback.pro
index f823e6284b..c9c0a029d3 100644
--- a/tests/auto/corelib/tools/qscopedvaluerollback/qscopedvaluerollback.pro
+++ b/tests/auto/corelib/tools/qscopedvaluerollback/qscopedvaluerollback.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qscopedvaluerollback
QT = core testlib
SOURCES = tst_qscopedvaluerollback.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qset/qset.pro b/tests/auto/corelib/tools/qset/qset.pro
index 8b5cdbc3f0..10ae3307d1 100644
--- a/tests/auto/corelib/tools/qset/qset.pro
+++ b/tests/auto/corelib/tools/qset/qset.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qset
QT = core testlib
SOURCES = tst_qset.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qset/tst_qset.cpp b/tests/auto/corelib/tools/qset/tst_qset.cpp
index fe4d81085c..f8f368f51c 100644
--- a/tests/auto/corelib/tools/qset/tst_qset.cpp
+++ b/tests/auto/corelib/tools/qset/tst_qset.cpp
@@ -753,7 +753,7 @@ void tst_QSet::stlMutableIterator()
QSet<QString>::const_iterator k = set2.insert("foo");
i = reinterpret_cast<QSet<QString>::iterator &>(k);
// #endif
- QVERIFY(*i == "foo");
+ QCOMPARE(*i, QLatin1String("foo"));
}
}
diff --git a/tests/auto/corelib/tools/qsharedpointer/qsharedpointer.pro b/tests/auto/corelib/tools/qsharedpointer/qsharedpointer.pro
index 2e8e335472..240137d563 100644
--- a/tests/auto/corelib/tools/qsharedpointer/qsharedpointer.pro
+++ b/tests/auto/corelib/tools/qsharedpointer/qsharedpointer.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsharedpointer
QT = core testlib
diff --git a/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp b/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp
index b63485e91e..76341db701 100644
--- a/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp
+++ b/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp
@@ -63,6 +63,7 @@ private slots:
void basics();
void operators();
void swap();
+ void moveSemantics();
void useOfForwardDeclared();
void memoryManagement();
void dropLastReferenceOfForwardDeclared();
@@ -419,6 +420,66 @@ void tst_QSharedPointer::swap()
QVERIFY(w2.isNull());
}
+void tst_QSharedPointer::moveSemantics()
+{
+#ifdef Q_COMPILER_RVALUE_REFS
+ QSharedPointer<int> p1, p2(new int(42)), control = p2;
+ QVERIFY(p1 != control);
+ QVERIFY(p1.isNull());
+ QVERIFY(p2 == control);
+ QVERIFY(!p2.isNull());
+ QVERIFY(*p2 == 42);
+
+ // move assignment
+ p1 = std::move(p2);
+ QVERIFY(p1 == control);
+ QVERIFY(!p1.isNull());
+ QVERIFY(p2 != control);
+ QVERIFY(p2.isNull());
+ QVERIFY(*p1 == 42);
+
+ // move construction
+ QSharedPointer<int> p3 = std::move(p1);
+ QVERIFY(p1 != control);
+ QVERIFY(p1.isNull());
+ QVERIFY(p3 == control);
+ QVERIFY(!p3.isNull());
+ QVERIFY(*p3 == 42);
+
+ QWeakPointer<int> w1, w2 = control;
+
+ QVERIFY(w1.isNull());
+ QVERIFY(!w2.isNull());
+ QVERIFY(w2.lock() == control);
+ QVERIFY(!w1.lock());
+
+ // move assignment
+ w1 = std::move(w2);
+ QVERIFY(w2.isNull());
+ QVERIFY(!w1.isNull());
+ QVERIFY(w1.lock() == control);
+ QVERIFY(!w2.lock());
+
+ // move construction
+ QWeakPointer<int> w3 = std::move(w1);
+ QVERIFY(w1.isNull());
+ QVERIFY(!w3.isNull());
+ QVERIFY(w3.lock() == control);
+ QVERIFY(!w1.lock());
+
+ p1.reset();
+ p2.reset();
+ p3.reset();
+ control.reset();
+
+ QVERIFY(w1.isNull());
+ QVERIFY(w2.isNull());
+ QVERIFY(w3.isNull());
+#else
+ QSKIP("This test requires C++11 rvalue/move semantics support in the compiler.");
+#endif
+}
+
void tst_QSharedPointer::useOfForwardDeclared()
{
// this just a compile test: use the forward-declared class
diff --git a/tests/auto/corelib/tools/qsize/qsize.pro b/tests/auto/corelib/tools/qsize/qsize.pro
index 310194ad12..9462e98e49 100644
--- a/tests/auto/corelib/tools/qsize/qsize.pro
+++ b/tests/auto/corelib/tools/qsize/qsize.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qsize
QT = core testlib
SOURCES = tst_qsize.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qsizef/qsizef.pro b/tests/auto/corelib/tools/qsizef/qsizef.pro
index c456e450fd..f5ba220b06 100644
--- a/tests/auto/corelib/tools/qsizef/qsizef.pro
+++ b/tests/auto/corelib/tools/qsizef/qsizef.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qsizef
QT = core testlib
SOURCES = tst_qsizef.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qstl/qstl.pro b/tests/auto/corelib/tools/qstl/qstl.pro
index 88fb53c6c6..e57e62b828 100644
--- a/tests/auto/corelib/tools/qstl/qstl.pro
+++ b/tests/auto/corelib/tools/qstl/qstl.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstl
QT = core testlib
SOURCES = tst_qstl.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qstring/qstring.pro b/tests/auto/corelib/tools/qstring/qstring.pro
index 1eda27e1ff..1ff9a4fc9e 100644
--- a/tests/auto/corelib/tools/qstring/qstring.pro
+++ b/tests/auto/corelib/tools/qstring/qstring.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstring
QT = core testlib
SOURCES = tst_qstring.cpp
@@ -7,6 +7,10 @@ contains(QT_CONFIG,icu):DEFINES += QT_USE_ICU
contains(QT_CONFIG,c++11): CONFIG += c++11
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
+!contains(QT_CONFIG, doubleconversion):!contains(QT_CONFIG, system-doubleconversion) {
+ DEFINES += QT_NO_DOUBLECONVERSION
+}
+
mac {
OBJECTIVE_SOURCES += tst_qstring_mac.mm
LIBS += -framework Foundation
diff --git a/tests/auto/corelib/tools/qstring/tst_qstring.cpp b/tests/auto/corelib/tools/qstring/tst_qstring.cpp
index 907dcf17e1..f8a4d8a00a 100644
--- a/tests/auto/corelib/tools/qstring/tst_qstring.cpp
+++ b/tests/auto/corelib/tools/qstring/tst_qstring.cpp
@@ -63,7 +63,7 @@
#include <algorithm>
#define CREATE_REF(string) \
- const QString padded = QString::fromLatin1(" %1 ").arg(string); \
+ const QString padded = QLatin1Char(' ') + string + QLatin1Char(' '); \
QStringRef ref = padded.midRef(1, padded.size() - 2);
namespace {
@@ -480,6 +480,7 @@ private slots:
void indexOf3_data();
// void indexOf3();
void sprintf();
+ void sprintfS();
void fill();
void truncate();
void constructor();
@@ -970,61 +971,61 @@ void tst_QString::acc_01()
QString f;
f = e;
f[7]='F';
- QCOMPARE(e,(QString)"String E");
+ QCOMPARE(e, QLatin1String("String E"));
char text[]="String f";
f = text;
text[7]='!';
- QCOMPARE(f,(QString)"String f");
+ QCOMPARE(f, QLatin1String("String f"));
f[7]='F';
QCOMPARE(text[7],'!');
a="";
a[0]='A';
- QCOMPARE(a,(QString)"A");
+ QCOMPARE(a, QLatin1String("A"));
QCOMPARE(a.length(),1);
a[1]='B';
- QCOMPARE(a,(QString)"AB");
+ QCOMPARE(a, QLatin1String("AB"));
QCOMPARE(a.length(),2);
a[2]='C';
- QCOMPARE(a,(QString)"ABC");
+ QCOMPARE(a, QLatin1String("ABC"));
QCOMPARE(a.length(),3);
a = QString();
QVERIFY(a.isNull());
a[0]='A';
- QCOMPARE(a,(QString)"A");
+ QCOMPARE(a, QLatin1String("A"));
QCOMPARE(a.length(),1);
a[1]='B';
- QCOMPARE(a,(QString)"AB");
+ QCOMPARE(a, QLatin1String("AB"));
QCOMPARE(a.length(),2);
a[2]='C';
- QCOMPARE(a,(QString)"ABC");
+ QCOMPARE(a, QLatin1String("ABC"));
QCOMPARE(a.length(),3);
a="123";
b="456";
a[0]=a[1];
- QCOMPARE(a,(QString)"223");
+ QCOMPARE(a, QLatin1String("223"));
a[1]=b[1];
- QCOMPARE(b,(QString)"456");
- QCOMPARE(a,(QString)"253");
+ QCOMPARE(b, QLatin1String("456"));
+ QCOMPARE(a, QLatin1String("253"));
char t[]="TEXT";
a="A";
a=t;
- QCOMPARE(a,(QString)"TEXT");
+ QCOMPARE(a, QLatin1String("TEXT"));
QCOMPARE(a,(QString)t);
a[0]='X';
- QCOMPARE(a,(QString)"XEXT");
+ QCOMPARE(a, QLatin1String("XEXT"));
QCOMPARE(t[0],'T');
t[0]='Z';
- QCOMPARE(a,(QString)"XEXT");
+ QCOMPARE(a, QLatin1String("XEXT"));
a="ABC";
QCOMPARE(char(a.toLatin1()[1]),'B');
- QCOMPARE(strcmp(a.toLatin1(),((QString)"ABC").toLatin1()),0);
- QCOMPARE(a+="DEF",(QString)"ABCDEF");
- QCOMPARE(a+='G',(QString)"ABCDEFG");
- QCOMPARE(a+=((const char*)(0)),(QString)"ABCDEFG");
+ QCOMPARE(strcmp(a.toLatin1(), QByteArrayLiteral("ABC")), 0);
+ QCOMPARE(a+="DEF", QLatin1String("ABCDEF"));
+ QCOMPARE(a+='G', QLatin1String("ABCDEFG"));
+ QCOMPARE(a+=((const char*)(0)), QLatin1String("ABCDEFG"));
// non-member operators
@@ -1046,11 +1047,11 @@ void tst_QString::acc_01()
QVERIFY(a<=c);
QVERIFY(!(c<=a));
QVERIFY(!(d<=a));
- QCOMPARE(QString(a+b),(QString)"ABCABC");
- QCOMPARE(QString(a+"XXXX"),(QString)"ABCXXXX");
- QCOMPARE(QString(a+'X'),(QString)"ABCX");
- QCOMPARE(QString("XXXX"+a),(QString)"XXXXABC");
- QCOMPARE(QString('X'+a),(QString)"XABC");
+ QCOMPARE(QString(a+b), QLatin1String("ABCABC"));
+ QCOMPARE(QString(a+"XXXX"), QLatin1String("ABCXXXX"));
+ QCOMPARE(QString(a+'X'), QLatin1String("ABCX"));
+ QCOMPARE(QString("XXXX"+a), QLatin1String("XXXXABC"));
+ QCOMPARE(QString('X'+a), QLatin1String("XABC"));
a = (const char*)0;
QVERIFY(a.isNull());
QVERIFY(*a.toLatin1().constData() == '\0');
@@ -1116,7 +1117,7 @@ void tst_QString::constructor()
QVERIFY(a == (QString)"");
QCOMPARE(b,cb);
QCOMPARE(c,cc);
- QCOMPARE(d,(QString)"String D");
+ QCOMPARE(d, QLatin1String("String D"));
QString nullStr;
QVERIFY( nullStr.isNull() );
@@ -1205,11 +1206,11 @@ void tst_QString::truncate()
{
QString e("String E");
e.truncate(4);
- QCOMPARE(e,(QString)"Stri");
+ QCOMPARE(e, QLatin1String("Stri"));
e = "String E";
e.truncate(0);
- QCOMPARE(e,(QString)"");
+ QCOMPARE(e, QLatin1String(""));
QVERIFY(e.isEmpty());
QVERIFY(!e.isNull());
@@ -1219,25 +1220,25 @@ void tst_QString::fill()
{
QString e;
e.fill('e',1);
- QCOMPARE(e,(QString)"e");
+ QCOMPARE(e, QLatin1String("e"));
QString f;
f.fill('f',3);
- QCOMPARE(f,(QString)"fff");
+ QCOMPARE(f, QLatin1String("fff"));
f.fill('F');
- QCOMPARE(f,(QString)"FFF");
+ QCOMPARE(f, QLatin1String("FFF"));
}
void tst_QString::sprintf()
{
QString a;
a.sprintf("COMPARE");
- QCOMPARE(a,(QString)"COMPARE");
+ QCOMPARE(a, QLatin1String("COMPARE"));
a.sprintf("%%%d",1);
- QCOMPARE(a,(QString)"%1");
- QCOMPARE(a.sprintf("X%dY",2),(QString)"X2Y");
- QCOMPARE(a.sprintf("X%9iY", 50000 ),(QString)"X 50000Y");
- QCOMPARE(a.sprintf("X%-9sY","hello"),(QString)"Xhello Y");
- QCOMPARE(a.sprintf("X%-9iY", 50000 ),(QString)"X50000 Y");
+ QCOMPARE(a, QLatin1String("%1"));
+ QCOMPARE(a.sprintf("X%dY",2), QLatin1String("X2Y"));
+ QCOMPARE(a.sprintf("X%9iY", 50000 ), QLatin1String("X 50000Y"));
+ QCOMPARE(a.sprintf("X%-9sY","hello"), QLatin1String("Xhello Y"));
+ QCOMPARE(a.sprintf("X%-9iY", 50000 ), QLatin1String("X50000 Y"));
QCOMPARE(a.sprintf("%lf", 1.23), QString("1.230000"));
QCOMPARE(a.sprintf("%lf", 1.23456789), QString("1.234568"));
QCOMPARE(a.sprintf("%p", (void *)0xbfffd350), QString("0xbfffd350"));
@@ -1253,14 +1254,18 @@ void tst_QString::sprintf()
double d = -514.25683;
S1.sprintf("%f",d);
QCOMPARE(S1, QString("-514.256830"));
+}
- QCOMPARE(a.sprintf("%.3s", "Hello" ),(QString)"Hel");
- QCOMPARE(a.sprintf("%10.3s", "Hello" ),(QString)" Hel");
- QCOMPARE(a.sprintf("%.10s", "Hello" ),(QString)"Hello");
- QCOMPARE(a.sprintf("%10.10s", "Hello" ),(QString)" Hello");
- QCOMPARE(a.sprintf("%-10.10s", "Hello" ),(QString)"Hello ");
- QCOMPARE(a.sprintf("%-10.3s", "Hello" ),(QString)"Hel ");
- QCOMPARE(a.sprintf("%-5.5s", "Hello" ),(QString)"Hello");
+void tst_QString::sprintfS()
+{
+ QString a;
+ QCOMPARE(a.sprintf("%.3s", "Hello" ), QLatin1String("Hel"));
+ QCOMPARE(a.sprintf("%10.3s", "Hello" ), QLatin1String(" Hel"));
+ QCOMPARE(a.sprintf("%.10s", "Hello" ), QLatin1String("Hello"));
+ QCOMPARE(a.sprintf("%10.10s", "Hello" ), QLatin1String(" Hello"));
+ QCOMPARE(a.sprintf("%-10.10s", "Hello" ), QLatin1String("Hello "));
+ QCOMPARE(a.sprintf("%-10.3s", "Hello" ), QLatin1String("Hel "));
+ QCOMPARE(a.sprintf("%-5.5s", "Hello" ), QLatin1String("Hello"));
// Check utf8 conversion for %s
QCOMPARE(a.sprintf("%s", "\303\266\303\244\303\274\303\226\303\204\303\234\303\270\303\246\303\245\303\230\303\206\303\205"), QString::fromLatin1("\366\344\374\326\304\334\370\346\345\330\306\305"));
@@ -1269,12 +1274,30 @@ void tst_QString::sprintf()
a.sprintf("%s%n%s", "hello", &n1, "goodbye");
QCOMPARE(n1, 5);
QCOMPARE(a, QString("hellogoodbye"));
-#ifndef Q_CC_MINGW // does not know %ll
qlonglong n2;
a.sprintf("%s%s%lln%s", "foo", "bar", &n2, "whiz");
QCOMPARE((int)n2, 6);
QCOMPARE(a, QString("foobarwhiz"));
-#endif
+
+ { // %ls
+ QCOMPARE(a.sprintf("%.3ls", qUtf16Printable("Hello")), QLatin1String("Hel"));
+ QCOMPARE(a.sprintf("%10.3ls", qUtf16Printable("Hello")), QLatin1String(" Hel"));
+ QCOMPARE(a.sprintf("%.10ls", qUtf16Printable("Hello")), QLatin1String("Hello"));
+ QCOMPARE(a.sprintf("%10.10ls", qUtf16Printable("Hello")), QLatin1String(" Hello"));
+ QCOMPARE(a.sprintf("%-10.10ls", qUtf16Printable("Hello")), QLatin1String("Hello "));
+ QCOMPARE(a.sprintf("%-10.3ls", qUtf16Printable("Hello")), QLatin1String("Hel "));
+ QCOMPARE(a.sprintf("%-5.5ls", qUtf16Printable("Hello")), QLatin1String("Hello"));
+
+ // Check utf16 is preserved for %ls
+ QCOMPARE(a.sprintf("%ls",
+ qUtf16Printable("\303\266\303\244\303\274\303\226\303\204\303\234\303\270\303\246\303\245\303\230\303\206\303\205")),
+ QLatin1String("\366\344\374\326\304\334\370\346\345\330\306\305"));
+
+ int n;
+ a.sprintf("%ls%n%s", qUtf16Printable("hello"), &n, "goodbye");
+ QCOMPARE(n, 5);
+ QCOMPARE(a, QLatin1String("hellogoodbye"));
+ }
}
/*
@@ -1363,7 +1386,7 @@ void tst_QString::indexOf_data()
QString s2;
s2 += QChar(0x3bc);
QTest::newRow( "data58" ) << s1 << s2 << 0 << false << 3;
- s2.prepend("C");
+ s2.prepend(QLatin1Char('C'));
QTest::newRow( "data59" ) << s1 << s2 << 0 << false << 2;
QString veryBigHaystack(500, 'a');
@@ -1810,9 +1833,9 @@ void tst_QString::left()
{
QString a;
a="ABCDEFGHIEfGEFG"; // 15 chars
- QCOMPARE(a.left(3),(QString)"ABC");
+ QCOMPARE(a.left(3), QLatin1String("ABC"));
QVERIFY(!a.left(0).isNull());
- QCOMPARE(a.left(0),(QString)"");
+ QCOMPARE(a.left(0), QLatin1String(""));
QString n;
QVERIFY(n.left(3).isNull());
@@ -1828,10 +1851,10 @@ void tst_QString::leftRef()
{
QString a;
a="ABCDEFGHIEfGEFG"; // 15 chars
- QCOMPARE(a.leftRef(3).toString(),(QString)"ABC");
+ QCOMPARE(a.leftRef(3).toString(), QLatin1String("ABC"));
QVERIFY(a.leftRef(0).toString().isEmpty());
- QCOMPARE(a.leftRef(0).toString(),(QString)"");
+ QCOMPARE(a.leftRef(0).toString(), QLatin1String(""));
QString n;
QVERIFY(n.leftRef(3).toString().isEmpty());
@@ -1847,8 +1870,8 @@ void tst_QString::right()
{
QString a;
a="ABCDEFGHIEfGEFG"; // 15 chars
- QCOMPARE(a.right(3),(QString)"EFG");
- QCOMPARE(a.right(0),(QString)"");
+ QCOMPARE(a.right(3), QLatin1String("EFG"));
+ QCOMPARE(a.right(0), QLatin1String(""));
QString n;
QVERIFY(n.right(3).isNull());
@@ -1863,8 +1886,8 @@ void tst_QString::rightRef()
{
QString a;
a="ABCDEFGHIEfGEFG"; // 15 chars
- QCOMPARE(a.rightRef(3).toString(),(QString)"EFG");
- QCOMPARE(a.rightRef(0).toString(),(QString)"");
+ QCOMPARE(a.rightRef(3).toString(), QLatin1String("EFG"));
+ QCOMPARE(a.rightRef(0).toString(), QLatin1String(""));
QString n;
QVERIFY(n.rightRef(3).toString().isEmpty());
@@ -1880,8 +1903,8 @@ void tst_QString::mid()
QString a;
a="ABCDEFGHIEfGEFG"; // 15 chars
- QCOMPARE(a.mid(3,3),(QString)"DEF");
- QCOMPARE(a.mid(0,0),(QString)"");
+ QCOMPARE(a.mid(3,3), QLatin1String("DEF"));
+ QCOMPARE(a.mid(0,0), QLatin1String(""));
QVERIFY(!a.mid(15,0).isNull());
QVERIFY(a.mid(15,0).isEmpty());
QVERIFY(!a.mid(15,1).isNull());
@@ -1959,8 +1982,8 @@ void tst_QString::midRef()
QString a;
a="ABCDEFGHIEfGEFG"; // 15 chars
- QCOMPARE(a.midRef(3,3).toString(),(QString)"DEF");
- QCOMPARE(a.midRef(0,0).toString(),(QString)"");
+ QCOMPARE(a.midRef(3,3).toString(), QLatin1String("DEF"));
+ QCOMPARE(a.midRef(0,0).toString(), QLatin1String(""));
QVERIFY(!a.midRef(15,0).toString().isNull());
QVERIFY(a.midRef(15,0).toString().isEmpty());
QVERIFY(!a.midRef(15,1).toString().isNull());
@@ -2084,44 +2107,44 @@ void tst_QString::leftJustified()
{
QString a;
a="ABC";
- QCOMPARE(a.leftJustified(5,'-'),(QString)"ABC--");
- QCOMPARE(a.leftJustified(4,'-'),(QString)"ABC-");
- QCOMPARE(a.leftJustified(4),(QString)"ABC ");
- QCOMPARE(a.leftJustified(3),(QString)"ABC");
- QCOMPARE(a.leftJustified(2),(QString)"ABC");
- QCOMPARE(a.leftJustified(1),(QString)"ABC");
- QCOMPARE(a.leftJustified(0),(QString)"ABC");
+ QCOMPARE(a.leftJustified(5,'-'), QLatin1String("ABC--"));
+ QCOMPARE(a.leftJustified(4,'-'), QLatin1String("ABC-"));
+ QCOMPARE(a.leftJustified(4), QLatin1String("ABC "));
+ QCOMPARE(a.leftJustified(3), QLatin1String("ABC"));
+ QCOMPARE(a.leftJustified(2), QLatin1String("ABC"));
+ QCOMPARE(a.leftJustified(1), QLatin1String("ABC"));
+ QCOMPARE(a.leftJustified(0), QLatin1String("ABC"));
QString n;
QVERIFY(!n.leftJustified(3).isNull());
- QCOMPARE(a.leftJustified(4,' ',true),(QString)"ABC ");
- QCOMPARE(a.leftJustified(3,' ',true),(QString)"ABC");
- QCOMPARE(a.leftJustified(2,' ',true),(QString)"AB");
- QCOMPARE(a.leftJustified(1,' ',true),(QString)"A");
- QCOMPARE(a.leftJustified(0,' ',true),(QString)"");
+ QCOMPARE(a.leftJustified(4,' ',true), QLatin1String("ABC "));
+ QCOMPARE(a.leftJustified(3,' ',true), QLatin1String("ABC"));
+ QCOMPARE(a.leftJustified(2,' ',true), QLatin1String("AB"));
+ QCOMPARE(a.leftJustified(1,' ',true), QLatin1String("A"));
+ QCOMPARE(a.leftJustified(0,' ',true), QLatin1String(""));
}
void tst_QString::rightJustified()
{
QString a;
a="ABC";
- QCOMPARE(a.rightJustified(5,'-'),(QString)"--ABC");
- QCOMPARE(a.rightJustified(4,'-'),(QString)"-ABC");
- QCOMPARE(a.rightJustified(4),(QString)" ABC");
- QCOMPARE(a.rightJustified(3),(QString)"ABC");
- QCOMPARE(a.rightJustified(2),(QString)"ABC");
- QCOMPARE(a.rightJustified(1),(QString)"ABC");
- QCOMPARE(a.rightJustified(0),(QString)"ABC");
+ QCOMPARE(a.rightJustified(5,'-'), QLatin1String("--ABC"));
+ QCOMPARE(a.rightJustified(4,'-'), QLatin1String("-ABC"));
+ QCOMPARE(a.rightJustified(4), QLatin1String(" ABC"));
+ QCOMPARE(a.rightJustified(3), QLatin1String("ABC"));
+ QCOMPARE(a.rightJustified(2), QLatin1String("ABC"));
+ QCOMPARE(a.rightJustified(1), QLatin1String("ABC"));
+ QCOMPARE(a.rightJustified(0), QLatin1String("ABC"));
QString n;
QVERIFY(!n.rightJustified(3).isNull());
- QCOMPARE(a.rightJustified(4,'-',true),(QString)"-ABC");
- QCOMPARE(a.rightJustified(4,' ',true),(QString)" ABC");
- QCOMPARE(a.rightJustified(3,' ',true),(QString)"ABC");
- QCOMPARE(a.rightJustified(2,' ',true),(QString)"AB");
- QCOMPARE(a.rightJustified(1,' ',true),(QString)"A");
- QCOMPARE(a.rightJustified(0,' ',true),(QString)"");
- QCOMPARE(a,(QString)"ABC");
+ QCOMPARE(a.rightJustified(4,'-',true), QLatin1String("-ABC"));
+ QCOMPARE(a.rightJustified(4,' ',true), QLatin1String(" ABC"));
+ QCOMPARE(a.rightJustified(3,' ',true), QLatin1String("ABC"));
+ QCOMPARE(a.rightJustified(2,' ',true), QLatin1String("AB"));
+ QCOMPARE(a.rightJustified(1,' ',true), QLatin1String("A"));
+ QCOMPARE(a.rightJustified(0,' ',true), QLatin1String(""));
+ QCOMPARE(a, QLatin1String("ABC"));
}
void tst_QString::toUpper()
@@ -2319,21 +2342,21 @@ void tst_QString::trimmed()
{
QString a;
a="Text";
- QCOMPARE(a,(QString)"Text");
- QCOMPARE(a.trimmed(),(QString)"Text");
- QCOMPARE(a,(QString)"Text");
+ QCOMPARE(a, QLatin1String("Text"));
+ QCOMPARE(a.trimmed(), QLatin1String("Text"));
+ QCOMPARE(a, QLatin1String("Text"));
a=" ";
- QCOMPARE(a.trimmed(),(QString)"");
- QCOMPARE(a,(QString)" ");
+ QCOMPARE(a.trimmed(), QLatin1String(""));
+ QCOMPARE(a, QLatin1String(" "));
a=" a ";
- QCOMPARE(a.trimmed(),(QString)"a");
+ QCOMPARE(a.trimmed(), QLatin1String("a"));
a="Text";
- QCOMPARE(qMove(a).trimmed(),(QString)"Text");
+ QCOMPARE(qMove(a).trimmed(), QLatin1String("Text"));
a=" ";
- QCOMPARE(qMove(a).trimmed(),(QString)"");
+ QCOMPARE(qMove(a).trimmed(), QLatin1String(""));
a=" a ";
- QCOMPARE(qMove(a).trimmed(),(QString)"a");
+ QCOMPARE(qMove(a).trimmed(), QLatin1String("a"));
}
void tst_QString::simplified_data()
@@ -2459,12 +2482,13 @@ void tst_QString::insert_special_cases()
QCOMPARE(a.insert(1,'>'), QString("<>ABCABCABCABC"));
a = "Meal";
- QCOMPARE(a.insert(1, QLatin1String("ontr")), QString("Montreal"));
- QCOMPARE(a.insert(4, ""), QString("Montreal"));
- QCOMPARE(a.insert(3, QLatin1String("")), QString("Montreal"));
- QCOMPARE(a.insert(3, QLatin1String(0)), QString("Montreal"));
- QCOMPARE(a.insert(3, static_cast<const char *>(0)), QString("Montreal"));
- QCOMPARE(a.insert(0, QLatin1String("a")), QString("aMontreal"));
+ const QString montreal = QStringLiteral("Montreal");
+ QCOMPARE(a.insert(1, QLatin1String("ontr")), montreal);
+ QCOMPARE(a.insert(4, ""), montreal);
+ QCOMPARE(a.insert(3, QLatin1String("")), montreal);
+ QCOMPARE(a.insert(3, QLatin1String(0)), montreal);
+ QCOMPARE(a.insert(3, static_cast<const char *>(0)), montreal);
+ QCOMPARE(a.insert(0, QLatin1String("a")), QLatin1String("aMontreal"));
}
void tst_QString::append_data(bool emptyIsNoop)
@@ -3575,12 +3599,12 @@ void tst_QString::toDouble()
void tst_QString::setNum()
{
QString a;
- QCOMPARE(a.setNum(123),(QString)"123");
- QCOMPARE(a.setNum(-123),(QString)"-123");
- QCOMPARE(a.setNum(0x123,16),(QString)"123");
- QCOMPARE(a.setNum((short)123),(QString)"123");
- QCOMPARE(a.setNum(123L),(QString)"123");
- QCOMPARE(a.setNum(123UL),(QString)"123");
+ QCOMPARE(a.setNum(123), QLatin1String("123"));
+ QCOMPARE(a.setNum(-123), QLatin1String("-123"));
+ QCOMPARE(a.setNum(0x123,16), QLatin1String("123"));
+ QCOMPARE(a.setNum((short)123), QLatin1String("123"));
+ QCOMPARE(a.setNum(123L), QLatin1String("123"));
+ QCOMPARE(a.setNum(123UL), QLatin1String("123"));
QCOMPARE(a.setNum(2147483647L), QString("2147483647")); // 32 bit LONG_MAX
QCOMPARE(a.setNum(-2147483647L), QString("-2147483647")); // LONG_MIN + 1
QCOMPARE(a.setNum(-2147483647L-1L), QString("-2147483648")); // LONG_MIN
@@ -3837,7 +3861,7 @@ void tst_QString::check_QDataStream()
{
QDataStream in(&ar,QIODevice::ReadOnly);
in >> a;
- QCOMPARE(a,(QString)"COMPARE Text");
+ QCOMPARE(a, QLatin1String("COMPARE Text"));
}
}
@@ -3852,7 +3876,7 @@ void tst_QString::check_QTextStream()
{
QTextStream in(&ar,QIODevice::ReadOnly);
in >> a;
- QCOMPARE(a,(QString)"This");
+ QCOMPARE(a, QLatin1String("This"));
}
}
@@ -4545,100 +4569,100 @@ void tst_QString::arg()
QString s13( "%1% %x%c%2 %d%2-%" );
QString s14( "%1%2%3" );
- QCOMPARE( s4.arg("foo"), QString("[foo]") );
- QCOMPARE( s5.arg("foo"), QString("[foo]") );
- QCOMPARE( s6.arg("foo"), QString("[foo]") );
- QCOMPARE( s7.arg("foo"), QString("[foo]") );
- QCOMPARE( s8.arg("foo"), QString("[foo %1]") );
- QCOMPARE( s8.arg("foo").arg("bar"), QString("[foo bar]") );
- QCOMPARE( s8.arg("foo", "bar"), QString("[foo bar]") );
- QCOMPARE( s9.arg("foo"), QString("[foo %3]") );
- QCOMPARE( s9.arg("foo").arg("bar"), QString("[foo bar]") );
- QCOMPARE( s9.arg("foo", "bar"), QString("[foo bar]") );
- QCOMPARE( s10.arg("foo"), QString("[foo %2 %3]") );
- QCOMPARE( s10.arg("foo").arg("bar"), QString("[foo bar %3]") );
- QCOMPARE( s10.arg("foo", "bar"), QString("[foo bar %3]") );
- QCOMPARE( s10.arg("foo").arg("bar").arg("baz"), QString("[foo bar baz]") );
- QCOMPARE( s10.arg("foo", "bar", "baz"), QString("[foo bar baz]") );
- QCOMPARE( s11.arg("foo"), QString("[%9 %3 foo]") );
- QCOMPARE( s11.arg("foo").arg("bar"), QString("[%9 bar foo]") );
- QCOMPARE( s11.arg("foo", "bar"), QString("[%9 bar foo]") );
- QCOMPARE( s11.arg("foo").arg("bar").arg("baz"), QString("[baz bar foo]") );
- QCOMPARE( s11.arg("foo", "bar", "baz"), QString("[baz bar foo]") );
+ QCOMPARE( s4.arg("foo"), QLatin1String("[foo]") );
+ QCOMPARE( s5.arg("foo"), QLatin1String("[foo]") );
+ QCOMPARE( s6.arg("foo"), QLatin1String("[foo]") );
+ QCOMPARE( s7.arg("foo"), QLatin1String("[foo]") );
+ QCOMPARE( s8.arg("foo"), QLatin1String("[foo %1]") );
+ QCOMPARE( s8.arg("foo").arg("bar"), QLatin1String("[foo bar]") );
+ QCOMPARE( s8.arg("foo", "bar"), QLatin1String("[foo bar]") );
+ QCOMPARE( s9.arg("foo"), QLatin1String("[foo %3]") );
+ QCOMPARE( s9.arg("foo").arg("bar"), QLatin1String("[foo bar]") );
+ QCOMPARE( s9.arg("foo", "bar"), QLatin1String("[foo bar]") );
+ QCOMPARE( s10.arg("foo"), QLatin1String("[foo %2 %3]") );
+ QCOMPARE( s10.arg("foo").arg("bar"), QLatin1String("[foo bar %3]") );
+ QCOMPARE( s10.arg("foo", "bar"), QLatin1String("[foo bar %3]") );
+ QCOMPARE( s10.arg("foo").arg("bar").arg("baz"), QLatin1String("[foo bar baz]") );
+ QCOMPARE( s10.arg("foo", "bar", "baz"), QLatin1String("[foo bar baz]") );
+ QCOMPARE( s11.arg("foo"), QLatin1String("[%9 %3 foo]") );
+ QCOMPARE( s11.arg("foo").arg("bar"), QLatin1String("[%9 bar foo]") );
+ QCOMPARE( s11.arg("foo", "bar"), QLatin1String("[%9 bar foo]") );
+ QCOMPARE( s11.arg("foo").arg("bar").arg("baz"), QLatin1String("[baz bar foo]") );
+ QCOMPARE( s11.arg("foo", "bar", "baz"), QLatin1String("[baz bar foo]") );
QCOMPARE( s12.arg("a").arg("b").arg("c").arg("d").arg("e"),
- QString("[e b c e a d]") );
- QCOMPARE( s12.arg("a", "b", "c", "d").arg("e"), QString("[e b c e a d]") );
- QCOMPARE( s12.arg("a").arg("b", "c", "d", "e"), QString("[e b c e a d]") );
+ QLatin1String("[e b c e a d]") );
+ QCOMPARE( s12.arg("a", "b", "c", "d").arg("e"), QLatin1String("[e b c e a d]") );
+ QCOMPARE( s12.arg("a").arg("b", "c", "d", "e"), QLatin1String("[e b c e a d]") );
QCOMPARE( s13.arg("alpha").arg("beta"),
- QString("alpha% %x%cbeta %dbeta-%") );
- QCOMPARE( s13.arg("alpha", "beta"), QString("alpha% %x%cbeta %dbeta-%") );
- QCOMPARE( s14.arg("a", "b", "c"), QString("abc") );
- QCOMPARE( s8.arg("%1").arg("foo"), QString("[foo foo]") );
- QCOMPARE( s8.arg("%1", "foo"), QString("[%1 foo]") );
- QCOMPARE( s4.arg("foo", 2), QString("[foo]") );
- QCOMPARE( s4.arg("foo", -2), QString("[foo]") );
- QCOMPARE( s4.arg("foo", 10), QString("[ foo]") );
- QCOMPARE( s4.arg("foo", -10), QString("[foo ]") );
+ QLatin1String("alpha% %x%cbeta %dbeta-%") );
+ QCOMPARE( s13.arg("alpha", "beta"), QLatin1String("alpha% %x%cbeta %dbeta-%") );
+ QCOMPARE( s14.arg("a", "b", "c"), QLatin1String("abc") );
+ QCOMPARE( s8.arg("%1").arg("foo"), QLatin1String("[foo foo]") );
+ QCOMPARE( s8.arg("%1", "foo"), QLatin1String("[%1 foo]") );
+ QCOMPARE( s4.arg("foo", 2), QLatin1String("[foo]") );
+ QCOMPARE( s4.arg("foo", -2), QLatin1String("[foo]") );
+ QCOMPARE( s4.arg("foo", 10), QLatin1String("[ foo]") );
+ QCOMPARE( s4.arg("foo", -10), QLatin1String("[foo ]") );
QString firstName( "James" );
QString lastName( "Bond" );
QString fullName = QString( "My name is %2, %1 %2" )
.arg( firstName ).arg( lastName );
- QCOMPARE( fullName, QString("My name is Bond, James Bond") );
+ QCOMPARE( fullName, QLatin1String("My name is Bond, James Bond") );
// number overloads
- QCOMPARE( s4.arg(0), QString("[0]") );
- QCOMPARE( s4.arg(-1), QString("[-1]") );
- QCOMPARE( s4.arg(4294967295UL), QString("[4294967295]") ); // ULONG_MAX 32
+ QCOMPARE( s4.arg(0), QLatin1String("[0]") );
+ QCOMPARE( s4.arg(-1), QLatin1String("[-1]") );
+ QCOMPARE( s4.arg(4294967295UL), QLatin1String("[4294967295]") ); // ULONG_MAX 32
QCOMPARE( s4.arg(Q_INT64_C(9223372036854775807)), // LLONG_MAX
- QString("[9223372036854775807]") );
+ QLatin1String("[9223372036854775807]") );
QTest::ignoreMessage(QtWarningMsg, "QString::arg: Argument missing: \"\" , 0");
QCOMPARE( QString().arg(0), QString() );
QTest::ignoreMessage(QtWarningMsg, "QString::arg: Argument missing: \"\" , 0");
QCOMPARE( QString("").arg(0), QString("") );
QTest::ignoreMessage(QtWarningMsg, "QString::arg: Argument missing: \" \" , 0");
- QCOMPARE( QString(" ").arg(0), QString(" ") );
+ QCOMPARE( QString(" ").arg(0), QLatin1String(" ") );
QTest::ignoreMessage(QtWarningMsg, "QString::arg: Argument missing: \"%\" , 0");
- QCOMPARE( QString("%").arg(0), QString("%") );
+ QCOMPARE( QString("%").arg(0), QLatin1String("%") );
QTest::ignoreMessage(QtWarningMsg, "QString::arg: Argument missing: \"%%\" , 0");
- QCOMPARE( QString("%%").arg(0), QString("%%") );
+ QCOMPARE( QString("%%").arg(0), QLatin1String("%%") );
QTest::ignoreMessage(QtWarningMsg, "QString::arg: Argument missing: \"%%%\" , 0");
- QCOMPARE( QString("%%%").arg(0), QString("%%%") );
- QCOMPARE( QString("%%%1%%%2").arg("foo").arg("bar"), QString("%%foo%%bar") );
-
- QCOMPARE( QString("%1").arg("hello", -10), QString("hello ") );
- QCOMPARE( QString("%1").arg("hello", -5), QString("hello") );
- QCOMPARE( QString("%1").arg("hello", -2), QString("hello") );
- QCOMPARE( QString("%1").arg("hello", 0), QString("hello") );
- QCOMPARE( QString("%1").arg("hello", 2), QString("hello") );
- QCOMPARE( QString("%1").arg("hello", 5), QString("hello") );
- QCOMPARE( QString("%1").arg("hello", 10), QString(" hello") );
- QCOMPARE( QString("%1%1").arg("hello"), QString("hellohello") );
- QCOMPARE( QString("%2%1").arg("hello"), QString("%2hello") );
- QCOMPARE( QString("%1%1").arg(QString::null), QString("") );
- QCOMPARE( QString("%2%1").arg(""), QString("%2") );
+ QCOMPARE( QString("%%%").arg(0), QLatin1String("%%%") );
+ QCOMPARE( QString("%%%1%%%2").arg("foo").arg("bar"), QLatin1String("%%foo%%bar") );
+
+ QCOMPARE( QString("%1").arg("hello", -10), QLatin1String("hello ") );
+ QCOMPARE( QString("%1").arg("hello", -5), QLatin1String("hello") );
+ QCOMPARE( QString("%1").arg("hello", -2), QLatin1String("hello") );
+ QCOMPARE( QString("%1").arg("hello", 0), QLatin1String("hello") );
+ QCOMPARE( QString("%1").arg("hello", 2), QLatin1String("hello") );
+ QCOMPARE( QString("%1").arg("hello", 5), QLatin1String("hello") );
+ QCOMPARE( QString("%1").arg("hello", 10), QLatin1String(" hello") );
+ QCOMPARE( QString("%1%1").arg("hello"), QLatin1String("hellohello") );
+ QCOMPARE( QString("%2%1").arg("hello"), QLatin1String("%2hello") );
+ QCOMPARE( QString("%1%1").arg(QString::null), QLatin1String("") );
+ QCOMPARE( QString("%2%1").arg(""), QLatin1String("%2") );
QCOMPARE( QString("%2 %L1").arg(12345.6789).arg(12345.6789),
- QString("12345.7 12.345,7") );
+ QLatin1String("12345.7 12.345,7") );
QCOMPARE( QString("[%2] [%L1]").arg(12345.6789, 9).arg(12345.6789, 9),
- QString("[ 12345.7] [ 12.345,7]") );
+ QLatin1String("[ 12345.7] [ 12.345,7]") );
QCOMPARE( QString("[%2] [%L1]").arg(12345.6789, 9, 'g', 7).arg(12345.6789, 9, 'g', 7),
- QString("[ 12345.68] [12.345,68]") );
+ QLatin1String("[ 12345.68] [12.345,68]") );
QCOMPARE( QString("[%2] [%L1]").arg(12345.6789, 10, 'g', 7, QLatin1Char('0')).arg(12345.6789, 10, 'g', 7, QLatin1Char('0')),
- QString("[0012345.68] [012.345,68]") );
+ QLatin1String("[0012345.68] [012.345,68]") );
QCOMPARE( QString("%2 %L1").arg(123456789).arg(123456789),
- QString("123456789 123.456.789") );
+ QLatin1String("123456789 123.456.789") );
QCOMPARE( QString("[%2] [%L1]").arg(123456789, 12).arg(123456789, 12),
- QString("[ 123456789] [ 123.456.789]") );
+ QLatin1String("[ 123456789] [ 123.456.789]") );
QCOMPARE( QString("[%2] [%L1]").arg(123456789, 13, 10, QLatin1Char('0')).arg(123456789, 12, 10, QLatin1Char('0')),
- QString("[000123456789] [00123.456.789]") );
+ QLatin1String("[000123456789] [00123.456.789]") );
QCOMPARE( QString("[%2] [%L1]").arg(123456789, 13, 16, QLatin1Char('0')).arg(123456789, 12, 16, QLatin1Char('0')),
- QString("[0000075bcd15] [00000075bcd15]") );
+ QLatin1String("[0000075bcd15] [00000075bcd15]") );
QCOMPARE( QString("%L2 %L1 %3").arg(12345.7).arg(123456789).arg('c'),
- QString("123.456.789 12.345,7 c") );
+ QLatin1String("123.456.789 12.345,7 c") );
// multi-digit replacement
QString input("%%%L0 %1 %02 %3 %4 %5 %L6 %7 %8 %%% %090 %10 %11 %L12 %14 %L9888 %9999 %%%%%%%L");
@@ -4648,36 +4672,36 @@ void tst_QString::arg()
.arg("k").arg("l").arg("m")
.arg("n").arg("o").arg("p");
- QCOMPARE(input, QString("%%A B C D E f g h i %%% j0 k l m n o88 p99 %%%%%%%L"));
+ QCOMPARE(input, QLatin1String("%%A B C D E f g h i %%% j0 k l m n o88 p99 %%%%%%%L"));
QString str("%1 %2 %3 %4 %5 %6 %7 %8 %9 foo %10 %11 bar");
str = str.arg("one", "2", "3", "4", "5", "6", "7", "8", "9");
str = str.arg("ahoy", "there");
- QCOMPARE(str, QString("one 2 3 4 5 6 7 8 9 foo ahoy there bar"));
+ QCOMPARE(str, QLatin1String("one 2 3 4 5 6 7 8 9 foo ahoy there bar"));
QString str2("%123 %234 %345 %456 %567 %999 %1000 %1230");
str2 = str2.arg("A", "B", "C", "D", "E", "F");
- QCOMPARE(str2, QString("A B C D E F %1000 %1230"));
-
- QCOMPARE(QString("%1").arg(-1, 3, 10, QChar('0')), QString("-01"));
- QCOMPARE(QString("%1").arg(-100, 3, 10, QChar('0')), QString("-100"));
- QCOMPARE(QString("%1").arg(-1, 3, 10, QChar(' ')), QString(" -1"));
- QCOMPARE(QString("%1").arg(-100, 3, 10, QChar(' ')), QString("-100"));
- QCOMPARE(QString("%1").arg(1U, 3, 10, QChar(' ')), QString(" 1"));
- QCOMPARE(QString("%1").arg(1000U, 3, 10, QChar(' ')), QString("1000"));
- QCOMPARE(QString("%1").arg(-1, 3, 10, QChar('x')), QString("x-1"));
- QCOMPARE(QString("%1").arg(-100, 3, 10, QChar('x')), QString("-100"));
- QCOMPARE(QString("%1").arg(1U, 3, 10, QChar('x')), QString("xx1"));
- QCOMPARE(QString("%1").arg(1000U, 3, 10, QChar('x')), QString("1000"));
-
- QCOMPARE(QString("%1").arg(-1., 3, 'g', -1, QChar('0')), QString("-01"));
- QCOMPARE(QString("%1").arg(-100., 3, 'g', -1, QChar('0')), QString("-100"));
- QCOMPARE(QString("%1").arg(-1., 3, 'g', -1, QChar(' ')), QString(" -1"));
- QCOMPARE(QString("%1").arg(-100., 3, 'g', -1, QChar(' ')), QString("-100"));
- QCOMPARE(QString("%1").arg(1., 3, 'g', -1, QChar('x')), QString("xx1"));
- QCOMPARE(QString("%1").arg(1000., 3, 'g', -1, QChar('x')), QString("1000"));
- QCOMPARE(QString("%1").arg(-1., 3, 'g', -1, QChar('x')), QString("x-1"));
- QCOMPARE(QString("%1").arg(-100., 3, 'g', -1, QChar('x')), QString("-100"));
+ QCOMPARE(str2, QLatin1String("A B C D E F %1000 %1230"));
+
+ QCOMPARE(QString("%1").arg(-1, 3, 10, QChar('0')), QLatin1String("-01"));
+ QCOMPARE(QString("%1").arg(-100, 3, 10, QChar('0')), QLatin1String("-100"));
+ QCOMPARE(QString("%1").arg(-1, 3, 10, QChar(' ')), QLatin1String(" -1"));
+ QCOMPARE(QString("%1").arg(-100, 3, 10, QChar(' ')), QLatin1String("-100"));
+ QCOMPARE(QString("%1").arg(1U, 3, 10, QChar(' ')), QLatin1String(" 1"));
+ QCOMPARE(QString("%1").arg(1000U, 3, 10, QChar(' ')), QLatin1String("1000"));
+ QCOMPARE(QString("%1").arg(-1, 3, 10, QChar('x')), QLatin1String("x-1"));
+ QCOMPARE(QString("%1").arg(-100, 3, 10, QChar('x')), QLatin1String("-100"));
+ QCOMPARE(QString("%1").arg(1U, 3, 10, QChar('x')), QLatin1String("xx1"));
+ QCOMPARE(QString("%1").arg(1000U, 3, 10, QChar('x')), QLatin1String("1000"));
+
+ QCOMPARE(QString("%1").arg(-1., 3, 'g', -1, QChar('0')), QLatin1String("-01"));
+ QCOMPARE(QString("%1").arg(-100., 3, 'g', -1, QChar('0')), QLatin1String("-100"));
+ QCOMPARE(QString("%1").arg(-1., 3, 'g', -1, QChar(' ')), QLatin1String(" -1"));
+ QCOMPARE(QString("%1").arg(-100., 3, 'g', -1, QChar(' ')), QLatin1String("-100"));
+ QCOMPARE(QString("%1").arg(1., 3, 'g', -1, QChar('x')), QLatin1String("xx1"));
+ QCOMPARE(QString("%1").arg(1000., 3, 'g', -1, QChar('x')), QLatin1String("1000"));
+ QCOMPARE(QString("%1").arg(-1., 3, 'g', -1, QChar('x')), QLatin1String("x-1"));
+ QCOMPARE(QString("%1").arg(-100., 3, 'g', -1, QChar('x')), QLatin1String("-100"));
QLocale::setDefault(QString("ar"));
QCOMPARE( QString("%L1").arg(12345.6789, 10, 'g', 7, QLatin1Char('0')),
@@ -4690,13 +4714,18 @@ void tst_QString::arg()
void tst_QString::number()
{
- QCOMPARE( QString::number(int(0)), QString("0") );
- QCOMPARE( QString::number((unsigned int)(11)), QString("11") );
- QCOMPARE( QString::number(-22L), QString("-22") );
- QCOMPARE( QString::number(333UL), QString("333") );
- QCOMPARE( QString::number(4.4), QString("4.4") );
- QCOMPARE( QString::number(Q_INT64_C(-555)), QString("-555") );
- QCOMPARE( QString::number(Q_UINT64_C(6666)), QString("6666") );
+ QCOMPARE( QString::number(int(0)), QLatin1String("0") );
+ QCOMPARE( QString::number((unsigned int)(11)), QLatin1String("11") );
+ QCOMPARE( QString::number(-22L), QLatin1String("-22") );
+ QCOMPARE( QString::number(333UL), QLatin1String("333") );
+ QCOMPARE( QString::number(4.4), QLatin1String("4.4") );
+ QCOMPARE( QString::number(Q_INT64_C(-555)), QLatin1String("-555") );
+ QCOMPARE( QString::number(Q_UINT64_C(6666)), QLatin1String("6666") );
+
+#ifndef QT_NO_DOUBLECONVERSION // snprintf_l is too stupid for this
+ QCOMPARE( QString::number(12.05, 'f', 1), QString("12.1") );
+ QCOMPARE( QString::number(12.5, 'f', 0), QString("13") );
+#endif
}
void tst_QString::capacity_data()
@@ -6122,9 +6151,6 @@ void tst_QString::QCharRefDetaching() const
void tst_QString::sprintfZU() const
{
-#ifdef Q_CC_MINGW
- QSKIP("MinGW does not support '%zu'.");
-#else
{
QString string;
size_t s = 6;
@@ -6153,7 +6179,6 @@ void tst_QString::sprintfZU() const
string.sprintf("%zu %s\n", s, "foo");
QCOMPARE(string, QString::fromLatin1("6 foo\n"));
}
-#endif // !Q_CC_MINGW
}
void tst_QString::repeatedSignature() const
diff --git a/tests/auto/corelib/tools/qstring_no_cast_from_bytearray/qstring_no_cast_from_bytearray.pro b/tests/auto/corelib/tools/qstring_no_cast_from_bytearray/qstring_no_cast_from_bytearray.pro
index 1719af631d..14dbe779db 100644
--- a/tests/auto/corelib/tools/qstring_no_cast_from_bytearray/qstring_no_cast_from_bytearray.pro
+++ b/tests/auto/corelib/tools/qstring_no_cast_from_bytearray/qstring_no_cast_from_bytearray.pro
@@ -1,7 +1,6 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstring_no_cast_from_bytearray
QT = core testlib
SOURCES = tst_qstring_no_cast_from_bytearray.cpp
DEFINES += QT_NO_CAST_FROM_BYTEARRAY
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/qstringbuilder1.pro b/tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/qstringbuilder1.pro
index 64ce377c29..d9cdad1bf5 100644
--- a/tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/qstringbuilder1.pro
+++ b/tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/qstringbuilder1.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstringbuilder1
QT = core testlib
SOURCES = tst_qstringbuilder1.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qstringbuilder/qstringbuilder2/qstringbuilder2.pro b/tests/auto/corelib/tools/qstringbuilder/qstringbuilder2/qstringbuilder2.pro
index 56ed7707d0..e134c5d934 100644
--- a/tests/auto/corelib/tools/qstringbuilder/qstringbuilder2/qstringbuilder2.pro
+++ b/tests/auto/corelib/tools/qstringbuilder/qstringbuilder2/qstringbuilder2.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstringbuilder2
QT = core testlib
SOURCES = tst_qstringbuilder2.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qstringbuilder/qstringbuilder3/qstringbuilder3.pro b/tests/auto/corelib/tools/qstringbuilder/qstringbuilder3/qstringbuilder3.pro
index 2be2c24de4..29607551c3 100644
--- a/tests/auto/corelib/tools/qstringbuilder/qstringbuilder3/qstringbuilder3.pro
+++ b/tests/auto/corelib/tools/qstringbuilder/qstringbuilder3/qstringbuilder3.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstringbuilder3
QT = core testlib
SOURCES = tst_qstringbuilder3.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qstringbuilder/qstringbuilder4/qstringbuilder4.pro b/tests/auto/corelib/tools/qstringbuilder/qstringbuilder4/qstringbuilder4.pro
index 3a97d49483..e55848e4bd 100644
--- a/tests/auto/corelib/tools/qstringbuilder/qstringbuilder4/qstringbuilder4.pro
+++ b/tests/auto/corelib/tools/qstringbuilder/qstringbuilder4/qstringbuilder4.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstringbuilder4
QT = core testlib
SOURCES = tst_qstringbuilder4.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qstringiterator/qstringiterator.pro b/tests/auto/corelib/tools/qstringiterator/qstringiterator.pro
index e5e625d520..3a1678b5f3 100644
--- a/tests/auto/corelib/tools/qstringiterator/qstringiterator.pro
+++ b/tests/auto/corelib/tools/qstringiterator/qstringiterator.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstringiterator
QT = core core-private testlib
SOURCES = tst_qstringiterator.cpp
diff --git a/tests/auto/corelib/tools/qstringlist/qstringlist.pro b/tests/auto/corelib/tools/qstringlist/qstringlist.pro
index c3b2fe07c0..a87257decb 100644
--- a/tests/auto/corelib/tools/qstringlist/qstringlist.pro
+++ b/tests/auto/corelib/tools/qstringlist/qstringlist.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstringlist
QT = core testlib
SOURCES = tst_qstringlist.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qstringmatcher/qstringmatcher.pro b/tests/auto/corelib/tools/qstringmatcher/qstringmatcher.pro
index 3a6e22b469..e34928776f 100644
--- a/tests/auto/corelib/tools/qstringmatcher/qstringmatcher.pro
+++ b/tests/auto/corelib/tools/qstringmatcher/qstringmatcher.pro
@@ -1,6 +1,5 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstringmatcher
QT = core testlib
SOURCES = tst_qstringmatcher.cpp
DEFINES += QT_NO_CAST_TO_ASCII
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qstringref/qstringref.pro b/tests/auto/corelib/tools/qstringref/qstringref.pro
index edb5ef995c..04f3ba6a92 100644
--- a/tests/auto/corelib/tools/qstringref/qstringref.pro
+++ b/tests/auto/corelib/tools/qstringref/qstringref.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstringref
QT = core testlib
SOURCES = tst_qstringref.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qstringref/tst_qstringref.cpp b/tests/auto/corelib/tools/qstringref/tst_qstringref.cpp
index 82d103c460..b3599b6a5c 100644
--- a/tests/auto/corelib/tools/qstringref/tst_qstringref.cpp
+++ b/tests/auto/corelib/tools/qstringref/tst_qstringref.cpp
@@ -97,7 +97,7 @@ static QStringRef emptyRef()
}
#define CREATE_REF(string) \
- const QString padded = QString::fromLatin1(" %1 ").arg(string); \
+ const QString padded = QLatin1Char(' ') + string + QLatin1Char(' '); \
QStringRef ref = padded.midRef(1, padded.size() - 2);
typedef QList<int> IntList;
@@ -292,7 +292,7 @@ void tst_QStringRef::indexOf_data()
QString s2;
s2 += QChar(0x3bc);
QTest::newRow("data58") << QString(s1) << QString(s2) << 0 << false << 3;
- s2.prepend("C");
+ s2.prepend(QLatin1Char('C'));
QTest::newRow("data59") << QString(s1) << QString(s2) << 0 << false << 2;
QString veryBigHaystack(500, 'a');
@@ -317,8 +317,8 @@ void tst_QStringRef::indexOf()
QFETCH(bool, bcs);
QFETCH(int, resultpos);
- const QString haystackPadded = QString::fromLatin1(" %1 ").arg(haystack);
- const QString needlePadded = QString::fromLatin1(" %1 ").arg(needle);
+ const QString haystackPadded = QLatin1Char(' ') + haystack + QLatin1Char(' ');
+ const QString needlePadded = QLatin1Char(' ') + needle + QLatin1Char(' ');
const QStringRef haystackRef(&haystackPadded, 1, haystack.size());
const QStringRef needleRef(&needlePadded, 1, needle.size());
@@ -407,8 +407,8 @@ void tst_QStringRef::indexOf2()
QFETCH(QString, needle);
QFETCH(int, resultpos);
- const QString haystackPadded = QString::fromLatin1(" %1 ").arg(haystack);
- const QString needlePadded = QString::fromLatin1(" %1 ").arg(needle);
+ const QString haystackPadded = QLatin1Char(' ') + haystack + QLatin1Char(' ');
+ const QString needlePadded = QLatin1Char(' ') + needle + QLatin1Char(' ');
const QStringRef haystackRef(&haystackPadded, 1, haystack.size());
const QStringRef needleRef(&needlePadded, 1, needle.size());
@@ -490,8 +490,8 @@ void tst_QStringRef::lastIndexOf()
QFETCH(int, expected);
QFETCH(bool, caseSensitive);
- const QString haystackPadded = QString::fromLatin1(" %1 ").arg(haystack);
- const QString needlePadded = QString::fromLatin1(" %1 ").arg(needle);
+ const QString haystackPadded = QLatin1Char(' ') + haystack + QLatin1Char(' ');
+ const QString needlePadded = QLatin1Char(' ') + needle + QLatin1Char(' ');
const QStringRef haystackRef(&haystackPadded, 1, haystack.size());
const QStringRef needleRef(&needlePadded, 1, needle.size());
diff --git a/tests/auto/corelib/tools/qtextboundaryfinder/qtextboundaryfinder.pro b/tests/auto/corelib/tools/qtextboundaryfinder/qtextboundaryfinder.pro
index 29b9854ebb..9d26ec1fd5 100644
--- a/tests/auto/corelib/tools/qtextboundaryfinder/qtextboundaryfinder.pro
+++ b/tests/auto/corelib/tools/qtextboundaryfinder/qtextboundaryfinder.pro
@@ -1,10 +1,9 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtextboundaryfinder
QT = core testlib
SOURCES = tst_qtextboundaryfinder.cpp
TESTDATA += data
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
android: !android-no-sdk {
RESOURCES += \
diff --git a/tests/auto/corelib/tools/qtextboundaryfinder/tst_qtextboundaryfinder.cpp b/tests/auto/corelib/tools/qtextboundaryfinder/tst_qtextboundaryfinder.cpp
index 753d61f02c..927c07f9e6 100644
--- a/tests/auto/corelib/tools/qtextboundaryfinder/tst_qtextboundaryfinder.cpp
+++ b/tests/auto/corelib/tools/qtextboundaryfinder/tst_qtextboundaryfinder.cpp
@@ -166,8 +166,8 @@ static void generateDataFromFile(const QString &fname)
}
}
- QString nm = QString("line #%1: %2").arg(linenum).arg(comments);
- QTest::newRow(nm.toLatin1()) << testString << expectedBreakPositions;
+ const QByteArray nm = "line #" + QByteArray::number(linenum) + ": " + comments.toLatin1();
+ QTest::newRow(nm.constData()) << testString << expectedBreakPositions;
}
}
#endif
diff --git a/tests/auto/corelib/tools/qtime/qtime.pro b/tests/auto/corelib/tools/qtime/qtime.pro
index 48db4c6664..0973b7a9ef 100644
--- a/tests/auto/corelib/tools/qtime/qtime.pro
+++ b/tests/auto/corelib/tools/qtime/qtime.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtime
QT = core testlib
SOURCES = tst_qtime.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qtimeline/qtimeline.pro b/tests/auto/corelib/tools/qtimeline/qtimeline.pro
index ca8eba41fb..9424cf8fd2 100644
--- a/tests/auto/corelib/tools/qtimeline/qtimeline.pro
+++ b/tests/auto/corelib/tools/qtimeline/qtimeline.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtimeline
QT = core testlib
SOURCES = tst_qtimeline.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qtimezone/qtimezone.pro b/tests/auto/corelib/tools/qtimezone/qtimezone.pro
index fa2397a6bb..4459ed6020 100644
--- a/tests/auto/corelib/tools/qtimezone/qtimezone.pro
+++ b/tests/auto/corelib/tools/qtimezone/qtimezone.pro
@@ -1,8 +1,7 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtimezone
QT = core-private testlib
SOURCES = tst_qtimezone.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
contains(QT_CONFIG,icu) {
DEFINES += QT_USE_ICU
}
diff --git a/tests/auto/corelib/tools/qvarlengtharray/qvarlengtharray.pro b/tests/auto/corelib/tools/qvarlengtharray/qvarlengtharray.pro
index 4fb8a1cf30..108fb33db5 100644
--- a/tests/auto/corelib/tools/qvarlengtharray/qvarlengtharray.pro
+++ b/tests/auto/corelib/tools/qvarlengtharray/qvarlengtharray.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qvarlengtharray
QT = core testlib
SOURCES = tst_qvarlengtharray.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp b/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp
index 82f78b2b0b..1c736fba65 100644
--- a/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp
+++ b/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp
@@ -148,14 +148,14 @@ void tst_QVarLengthArray::oldTests()
QVarLengthArray<QString> sa(10);
sa[0] = "Hello";
sa[9] = "World";
- QVERIFY(*sa.data() == "Hello");
- QVERIFY(sa[9] == "World");
+ QCOMPARE(*sa.data(), QLatin1String("Hello"));
+ QCOMPARE(sa[9], QLatin1String("World"));
sa.reserve(512);
- QVERIFY(*sa.data() == "Hello");
- QVERIFY(sa[9] == "World");
+ QCOMPARE(*sa.data(), QLatin1String("Hello"));
+ QCOMPARE(sa[9], QLatin1String("World"));
sa.resize(512);
- QVERIFY(*sa.data() == "Hello");
- QVERIFY(sa[9] == "World");
+ QCOMPARE(*sa.data(), QLatin1String("Hello"));
+ QCOMPARE(sa[9], QLatin1String("World"));
}
{
int arr[2] = {1, 2};
diff --git a/tests/auto/corelib/tools/qvector/qvector.pro b/tests/auto/corelib/tools/qvector/qvector.pro
index c1e0564915..d49516923f 100644
--- a/tests/auto/corelib/tools/qvector/qvector.pro
+++ b/tests/auto/corelib/tools/qvector/qvector.pro
@@ -1,6 +1,5 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
contains(QT_CONFIG, c++11):CONFIG += c++11
TARGET = tst_qvector
QT = core testlib
SOURCES = $$PWD/tst_qvector.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qvector/tst_qvector.cpp b/tests/auto/corelib/tools/qvector/tst_qvector.cpp
index 87822bca6f..bdfb567331 100644
--- a/tests/auto/corelib/tools/qvector/tst_qvector.cpp
+++ b/tests/auto/corelib/tools/qvector/tst_qvector.cpp
@@ -2391,6 +2391,7 @@ void tst_QVector::reallocAfterCopy_data()
int result1, result2, result3, result4;
int fill_size;
for (int i = 70; i <= 100; i += 10) {
+ const QByteArray prefix = "reallocAfterCopy:" + QByteArray::number(i) + ',';
fill_size = i - 20;
for (int j = 0; j <= 3; j++) {
if (j == 0) { // append
@@ -2414,7 +2415,8 @@ void tst_QVector::reallocAfterCopy_data()
result3 = i - 10;
result4 = i - 20;
}
- QTest::newRow(qPrintable(QString("reallocAfterCopy:%1,%2").arg(i).arg(j))) << i << fill_size << j << result1 << result2 << result3 << result4;
+ QTest::newRow((prefix + QByteArray::number(j)).constData())
+ << i << fill_size << j << result1 << result2 << result3 << result4;
}
}
}
diff --git a/tests/auto/corelib/tools/qversionnumber/qversionnumber.pro b/tests/auto/corelib/tools/qversionnumber/qversionnumber.pro
index e83a2b507c..834fc85a29 100644
--- a/tests/auto/corelib/tools/qversionnumber/qversionnumber.pro
+++ b/tests/auto/corelib/tools/qversionnumber/qversionnumber.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
contains(QT_CONFIG, c++11):CONFIG += c++11
contains(QT_CONFIG, c++14):CONFIG += c++14
TARGET = tst_qversionnumber
diff --git a/tests/auto/corelib/xml/qxmlstream/qxmlstream.pro b/tests/auto/corelib/xml/qxmlstream/qxmlstream.pro
index 0a9580da62..0a739f0a0e 100644
--- a/tests/auto/corelib/xml/qxmlstream/qxmlstream.pro
+++ b/tests/auto/corelib/xml/qxmlstream/qxmlstream.pro
@@ -1,8 +1,6 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qxmlstream
QT = core xml network testlib
SOURCES = tst_qxmlstream.cpp
TESTDATA += data XML-Test-Suite
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp b/tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp
index 341b169113..c87595c3c9 100644
--- a/tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp
+++ b/tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp
@@ -119,7 +119,7 @@ static QByteArray makeCanonical(const QString &filename,
if (notation.publicId().isEmpty()) {
writeDtd << " SYSTEM \'";
writeDtd << notation.systemId().toString();
- writeDtd << "\'";
+ writeDtd << '\'';
} else {
writeDtd << " PUBLIC \'";
writeDtd << notation.publicId().toString();
@@ -127,10 +127,10 @@ static QByteArray makeCanonical(const QString &filename,
if (!notation.systemId().isEmpty() ) {
writeDtd << " \'";
writeDtd << notation.systemId().toString();
- writeDtd << "\'";
+ writeDtd << '\'';
}
}
- writeDtd << ">";
+ writeDtd << '>';
writeDtd << endl;
}
@@ -157,7 +157,7 @@ static QByteArray makeCanonical(const QString &filename,
text.indexOf(QLatin1Char(13), p),
text.indexOf(QLatin1Char(9), p))) >= 0) {
writer.writeCharacters(text.mid(p, i - p));
- writer.writeEntityReference(QString("#%1").arg(text.at(i).unicode()));
+ writer.writeEntityReference(QLatin1Char('#') + QString::number(text.at(i).unicode()));
p = i + 1;
}
writer.writeCharacters(text.mid(p));
@@ -357,7 +357,7 @@ public:
QFile inputFile(inputFilePath);
if(!inputFile.open(QIODevice::ReadOnly))
{
- failures.append(qMakePair(id, QString::fromLatin1("Failed to open input file %1").arg(inputFilePath)));
+ failures.append(qMakePair(id, QLatin1String("Failed to open input file ") + inputFilePath));
return true;
}
@@ -365,8 +365,8 @@ public:
{
if(isWellformed(&inputFile, ParseSinglePass))
{
- failures.append(qMakePair(id, QString::fromLatin1("Failed to flag %1 as not well-formed.")
- .arg(inputFilePath)));
+ failures.append(qMakePair(id, QLatin1String("Failed to flag ") + inputFilePath
+ + QLatin1String(" as not well-formed.")));
/* Exit, the incremental test will fail as well, no need to flood the output. */
return true;
@@ -376,8 +376,8 @@ public:
if(isWellformed(&inputFile, ParseIncrementally))
{
- failures.append(qMakePair(id, QString::fromLatin1("Failed to flag %1 as not well-formed with incremental parsing.")
- .arg(inputFilePath)));
+ failures.append(qMakePair(id, QLatin1String("Failed to flag ") + inputFilePath
+ + QLatin1String(" as not well-formed with incremental parsing.")));
}
else
successes.append(id);
@@ -402,7 +402,7 @@ public:
if(!expectedFile.open(QIODevice::ReadOnly))
{
- failures.append(qMakePair(id, QString::fromLatin1("Failed to open baseline %1").arg(expectedFilePath)));
+ failures.append(qMakePair(id, QLatin1String("Failed to open baseline ") + expectedFilePath));
return true;
}
@@ -665,8 +665,10 @@ void tst_QXmlStream::reportSuccess_data() const
const int len = m_handler.successes.count();
- for(int i = 0; i < len; ++i)
- QTest::newRow(qPrintable(QString("%1. %2").arg(i).arg(m_handler.successes.at(i)))) << false;
+ for (int i = 0; i < len; ++i) {
+ const QByteArray testName = QByteArray::number(i) + ". " + m_handler.successes.at(i).toLatin1();
+ QTest::newRow(testName.constData()) << false;
+ }
if(len == 0)
QTest::newRow("No test cases succeeded.") << true;
@@ -687,7 +689,7 @@ QByteArray tst_QXmlStream::readFile(const QString &filename)
while (!reader.atEnd()) {
reader.readNext();
- writer << reader.tokenString() << "(";
+ writer << reader.tokenString() << '(';
if (reader.isWhitespace())
writer << " whitespace";
if (reader.isCDATA())
@@ -695,42 +697,42 @@ QByteArray tst_QXmlStream::readFile(const QString &filename)
if (reader.isStartDocument() && reader.isStandaloneDocument())
writer << " standalone";
if (!reader.text().isEmpty())
- writer << " text=\"" << reader.text().toString() << "\"";
+ writer << " text=\"" << reader.text().toString() << '"';
if (!reader.processingInstructionTarget().isEmpty())
- writer << " processingInstructionTarget=\"" << reader.processingInstructionTarget().toString() << "\"";
+ writer << " processingInstructionTarget=\"" << reader.processingInstructionTarget().toString() << '"';
if (!reader.processingInstructionData().isEmpty())
- writer << " processingInstructionData=\"" << reader.processingInstructionData().toString() << "\"";
+ writer << " processingInstructionData=\"" << reader.processingInstructionData().toString() << '"';
if (!reader.dtdName().isEmpty())
- writer << " dtdName=\"" << reader.dtdName().toString() << "\"";
+ writer << " dtdName=\"" << reader.dtdName().toString() << '"';
if (!reader.dtdPublicId().isEmpty())
- writer << " dtdPublicId=\"" << reader.dtdPublicId().toString() << "\"";
+ writer << " dtdPublicId=\"" << reader.dtdPublicId().toString() << '"';
if (!reader.dtdSystemId().isEmpty())
- writer << " dtdSystemId=\"" << reader.dtdSystemId().toString() << "\"";
+ writer << " dtdSystemId=\"" << reader.dtdSystemId().toString() << '"';
if (!reader.documentVersion().isEmpty())
- writer << " documentVersion=\"" << reader.documentVersion().toString() << "\"";
+ writer << " documentVersion=\"" << reader.documentVersion().toString() << '"';
if (!reader.documentEncoding().isEmpty())
- writer << " documentEncoding=\"" << reader.documentEncoding().toString() << "\"";
+ writer << " documentEncoding=\"" << reader.documentEncoding().toString() << '"';
if (!reader.name().isEmpty())
- writer << " name=\"" << reader.name().toString() << "\"";
+ writer << " name=\"" << reader.name().toString() << '"';
if (!reader.namespaceUri().isEmpty())
- writer << " namespaceUri=\"" << reader.namespaceUri().toString() << "\"";
+ writer << " namespaceUri=\"" << reader.namespaceUri().toString() << '"';
if (!reader.qualifiedName().isEmpty())
- writer << " qualifiedName=\"" << reader.qualifiedName().toString() << "\"";
+ writer << " qualifiedName=\"" << reader.qualifiedName().toString() << '"';
if (!reader.prefix().isEmpty())
- writer << " prefix=\"" << reader.prefix().toString() << "\"";
+ writer << " prefix=\"" << reader.prefix().toString() << '"';
if (reader.attributes().size()) {
foreach(QXmlStreamAttribute attribute, reader.attributes()) {
writer << endl << " Attribute(";
if (!attribute.name().isEmpty())
- writer << " name=\"" << attribute.name().toString() << "\"";
+ writer << " name=\"" << attribute.name().toString() << '"';
if (!attribute.namespaceUri().isEmpty())
- writer << " namespaceUri=\"" << attribute.namespaceUri().toString() << "\"";
+ writer << " namespaceUri=\"" << attribute.namespaceUri().toString() << '"';
if (!attribute.qualifiedName().isEmpty())
- writer << " qualifiedName=\"" << attribute.qualifiedName().toString() << "\"";
+ writer << " qualifiedName=\"" << attribute.qualifiedName().toString() << '"';
if (!attribute.prefix().isEmpty())
- writer << " prefix=\"" << attribute.prefix().toString() << "\"";
+ writer << " prefix=\"" << attribute.prefix().toString() << '"';
if (!attribute.value().isEmpty())
- writer << " value=\"" << attribute.value().toString() << "\"";
+ writer << " value=\"" << attribute.value().toString() << '"';
writer << " )" << endl;
}
}
@@ -738,9 +740,9 @@ QByteArray tst_QXmlStream::readFile(const QString &filename)
foreach(QXmlStreamNamespaceDeclaration namespaceDeclaration, reader.namespaceDeclarations()) {
writer << endl << " NamespaceDeclaration(";
if (!namespaceDeclaration.prefix().isEmpty())
- writer << " prefix=\"" << namespaceDeclaration.prefix().toString() << "\"";
+ writer << " prefix=\"" << namespaceDeclaration.prefix().toString() << '"';
if (!namespaceDeclaration.namespaceUri().isEmpty())
- writer << " namespaceUri=\"" << namespaceDeclaration.namespaceUri().toString() << "\"";
+ writer << " namespaceUri=\"" << namespaceDeclaration.namespaceUri().toString() << '"';
writer << " )" << endl;
}
}
@@ -748,11 +750,11 @@ QByteArray tst_QXmlStream::readFile(const QString &filename)
foreach(QXmlStreamNotationDeclaration notationDeclaration, reader.notationDeclarations()) {
writer << endl << " NotationDeclaration(";
if (!notationDeclaration.name().isEmpty())
- writer << " name=\"" << notationDeclaration.name().toString() << "\"";
+ writer << " name=\"" << notationDeclaration.name().toString() << '"';
if (!notationDeclaration.systemId().isEmpty())
- writer << " systemId=\"" << notationDeclaration.systemId().toString() << "\"";
+ writer << " systemId=\"" << notationDeclaration.systemId().toString() << '"';
if (!notationDeclaration.publicId().isEmpty())
- writer << " publicId=\"" << notationDeclaration.publicId().toString() << "\"";
+ writer << " publicId=\"" << notationDeclaration.publicId().toString() << '"';
writer << " )" << endl;
}
}
@@ -760,15 +762,15 @@ QByteArray tst_QXmlStream::readFile(const QString &filename)
foreach(QXmlStreamEntityDeclaration entityDeclaration, reader.entityDeclarations()) {
writer << endl << " EntityDeclaration(";
if (!entityDeclaration.name().isEmpty())
- writer << " name=\"" << entityDeclaration.name().toString() << "\"";
+ writer << " name=\"" << entityDeclaration.name().toString() << '"';
if (!entityDeclaration.notationName().isEmpty())
- writer << " notationName=\"" << entityDeclaration.notationName().toString() << "\"";
+ writer << " notationName=\"" << entityDeclaration.notationName().toString() << '"';
if (!entityDeclaration.systemId().isEmpty())
- writer << " systemId=\"" << entityDeclaration.systemId().toString() << "\"";
+ writer << " systemId=\"" << entityDeclaration.systemId().toString() << '"';
if (!entityDeclaration.publicId().isEmpty())
- writer << " publicId=\"" << entityDeclaration.publicId().toString() << "\"";
+ writer << " publicId=\"" << entityDeclaration.publicId().toString() << '"';
if (!entityDeclaration.value().isEmpty())
- writer << " value=\"" << entityDeclaration.value().toString() << "\"";
+ writer << " value=\"" << entityDeclaration.value().toString() << '"';
writer << " )" << endl;
}
}
@@ -877,13 +879,13 @@ void tst_QXmlStream::testFalsePrematureError() const
while (!xml.atEnd()) {
xml.readNext();
}
- QVERIFY(xml.error() == QXmlStreamReader::PrematureEndOfDocumentError);
+ QCOMPARE(xml.error(), QXmlStreamReader::PrematureEndOfDocumentError);
QCOMPARE(xml.errorString(), QLatin1String("Premature end of document."));
xml.addData(legal_start);
while (!xml.atEnd()) {
xml.readNext();
}
- QVERIFY(xml.error() == QXmlStreamReader::PrematureEndOfDocumentError);
+ QCOMPARE(xml.error(), QXmlStreamReader::PrematureEndOfDocumentError);
QCOMPARE(xml.errorString(), QLatin1String("Premature end of document."));
xml.addData(end);
while (!xml.atEnd()) {
@@ -898,7 +900,7 @@ void tst_QXmlStream::testFalsePrematureError() const
}
QVERIFY(xml.hasError());
QCOMPARE(xml.errorString(), QLatin1String("Start tag expected."));
- QVERIFY(xml.error() == QXmlStreamReader::NotWellFormedError);
+ QCOMPARE(xml.error(), QXmlStreamReader::NotWellFormedError);
}
}
@@ -978,7 +980,8 @@ void tst_QXmlStream::writeAttributesWithSpace() const
writer.writeEmptyElement("A");
writer.writeAttribute("attribute", QStringLiteral("value") + QChar(QChar::Nbsp));
writer.writeEndDocument();
- QString s = QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><A attribute=\"value%1\"/>\n").arg(QChar(QChar::Nbsp));
+ QString s = QLatin1String("<?xml version=\"1.0\" encoding=\"UTF-8\"?><A attribute=\"value")
+ + QChar(QChar::Nbsp) + QLatin1String("\"/>\n");
QCOMPARE(buffer.buffer().data(), s.toUtf8().data());
}
@@ -1051,11 +1054,11 @@ void tst_QXmlStream::readNextStartElement() const
QXmlStreamReader reader(in);
QVERIFY(reader.readNextStartElement());
- QVERIFY(reader.isStartElement() && reader.name() == "A");
+ QVERIFY(reader.isStartElement() && reader.name() == QLatin1String("A"));
int amountOfB = 0;
while (reader.readNextStartElement()) {
- QVERIFY(reader.isStartElement() && reader.name() == "B");
+ QVERIFY(reader.isStartElement() && reader.name() == QLatin1String("B"));
++amountOfB;
reader.skipCurrentElement();
}
diff --git a/tests/auto/dbus/qdbusabstractadaptor/qdbusabstractadaptor/qdbusabstractadaptor.pro b/tests/auto/dbus/qdbusabstractadaptor/qdbusabstractadaptor/qdbusabstractadaptor.pro
index d95fa941f0..c05a575acf 100644
--- a/tests/auto/dbus/qdbusabstractadaptor/qdbusabstractadaptor/qdbusabstractadaptor.pro
+++ b/tests/auto/dbus/qdbusabstractadaptor/qdbusabstractadaptor/qdbusabstractadaptor.pro
@@ -5,4 +5,3 @@ TARGET = ../tst_qdbusabstractadaptor
DESTDIR = ./
QT = core core-private dbus testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusabstractadaptor/qmyserver/qmyserver.pro b/tests/auto/dbus/qdbusabstractadaptor/qmyserver/qmyserver.pro
index ddafd528ee..8f2d261899 100644
--- a/tests/auto/dbus/qdbusabstractadaptor/qmyserver/qmyserver.pro
+++ b/tests/auto/dbus/qdbusabstractadaptor/qmyserver/qmyserver.pro
@@ -4,4 +4,3 @@ TARGET = qmyserver
DESTDIR = ./
QT = core dbus
CONFIG -= app_bundle
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp b/tests/auto/dbus/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp
index d26af847cf..7a73dddfe3 100644
--- a/tests/auto/dbus/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp
+++ b/tests/auto/dbus/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp
@@ -507,7 +507,7 @@ void tst_QDBusAbstractAdaptor::initTestCase()
// get peer server address
QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "address");
QDBusMessage rpl = QDBusConnection::sessionBus().call(req);
- QVERIFY(rpl.type() == QDBusMessage::ReplyMessage);
+ QCOMPARE(rpl.type(), QDBusMessage::ReplyMessage);
QString address = rpl.arguments().at(0).toString();
// connect to peer server
@@ -1870,7 +1870,7 @@ void tst_QDBusAbstractAdaptor::methodWithMoreThanOneReturnValue()
QDBusInterface remote(con.baseService(), "/", "local.Interface3", con);
QDBusMessage reply = remote.call(QDBus::BlockWithGui, "methodStringString", testString);
- QVERIFY(reply.arguments().count() == 2);
+ QCOMPARE(reply.arguments().count(), 2);
QDBusReply<int> intreply = reply;
QVERIFY(intreply.isValid());
@@ -1892,7 +1892,7 @@ void tst_QDBusAbstractAdaptor::methodWithMoreThanOneReturnValuePeer()
QDBusInterface remote(QString(), "/", "local.Interface3", con);
QDBusMessage reply = remote.call(QDBus::BlockWithGui, "methodStringString", testString);
- QVERIFY(reply.arguments().count() == 2);
+ QCOMPARE(reply.arguments().count(), 2);
QDBusReply<int> intreply = reply;
QVERIFY(intreply.isValid());
diff --git a/tests/auto/dbus/qdbusabstractinterface/qdbusabstractinterface/qdbusabstractinterface.pro b/tests/auto/dbus/qdbusabstractinterface/qdbusabstractinterface/qdbusabstractinterface.pro
index a8cc4c2b38..702c81ff54 100644
--- a/tests/auto/dbus/qdbusabstractinterface/qdbusabstractinterface/qdbusabstractinterface.pro
+++ b/tests/auto/dbus/qdbusabstractinterface/qdbusabstractinterface/qdbusabstractinterface.pro
@@ -7,7 +7,6 @@ DESTDIR = ./
QT = core testlib
QT += dbus
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
DBUS_INTERFACES = ../org.qtproject.QtDBus.Pinger.xml
QDBUSXML2CPP_INTERFACE_HEADER_FLAGS += -i ../interface.h
diff --git a/tests/auto/dbus/qdbusabstractinterface/qpinger/qpinger.pro b/tests/auto/dbus/qdbusabstractinterface/qpinger/qpinger.pro
index 957b47e413..206522b557 100644
--- a/tests/auto/dbus/qdbusabstractinterface/qpinger/qpinger.pro
+++ b/tests/auto/dbus/qdbusabstractinterface/qpinger/qpinger.pro
@@ -5,4 +5,3 @@ DESTDIR = ./
CONFIG -= app_bundle
CONFIG += console
QT = core dbus
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp b/tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp
index cd23f2cb47..2db687e21b 100644
--- a/tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp
+++ b/tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp
@@ -247,7 +247,7 @@ void tst_QDBusAbstractInterface::initTestCase()
// get peer server address
QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "address");
QDBusMessage rpl = con.call(req);
- QVERIFY(rpl.type() == QDBusMessage::ReplyMessage);
+ QCOMPARE(rpl.type(), QDBusMessage::ReplyMessage);
peerAddress = rpl.arguments().at(0).toString();
}
@@ -283,7 +283,7 @@ void tst_QDBusAbstractInterface::cleanup()
targetObj.m_complexProp = RegisteredType();
QDBusMessage resetCall = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "reset");
- QVERIFY(QDBusConnection::sessionBus().call(resetCall).type() == QDBusMessage::ReplyMessage);
+ QCOMPARE(QDBusConnection::sessionBus().call(resetCall).type(), QDBusMessage::ReplyMessage);
}
void tst_QDBusAbstractInterface::makeVoidCall()
@@ -441,7 +441,7 @@ void tst_QDBusAbstractInterface::makeAsyncStringCallPeer()
QVERIFY2(p, "Not connected to D-Bus");
QDBusMessage reply = p->call(QDBus::BlockWithGui, QLatin1String("voidMethod"));
- QVERIFY(reply.type() == QDBusMessage::ReplyMessage);
+ QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
QDBusPendingReply<QString> r = p->stringMethod();
r.waitForFinished();
@@ -622,7 +622,7 @@ void tst_QDBusAbstractInterface::complexPropRead()
RegisteredType expectedValue = targetObj.m_complexProp = RegisteredType("This is a test");
QVariant v = p->property("complexProp");
- QVERIFY(v.userType() == qMetaTypeId<RegisteredType>());
+ QCOMPARE(v.userType(), qMetaTypeId<RegisteredType>());
QCOMPARE(v.value<RegisteredType>(), targetObj.m_complexProp);
}
@@ -694,7 +694,7 @@ void tst_QDBusAbstractInterface::complexPropReadPeer()
RegisteredType expectedValue = RegisteredType("This is a test");
QVariant v = p->property("complexProp");
- QVERIFY(v.userType() == qMetaTypeId<RegisteredType>());
+ QCOMPARE(v.userType(), qMetaTypeId<RegisteredType>());
QCOMPARE(v.value<RegisteredType>(), expectedValue);
}
@@ -861,8 +861,8 @@ void tst_QDBusAbstractInterface::getVoidSignal()
QTestEventLoop::instance().enterLoop(2);
QVERIFY(!QTestEventLoop::instance().timeout());
- QVERIFY(s.size() == 1);
- QVERIFY(s.at(0).size() == 0);
+ QCOMPARE(s.size(), 1);
+ QCOMPARE(s.at(0).size(), 0);
}
void tst_QDBusAbstractInterface::getStringSignal_data()
@@ -886,8 +886,8 @@ void tst_QDBusAbstractInterface::getStringSignal()
QTestEventLoop::instance().enterLoop(2);
QVERIFY(!QTestEventLoop::instance().timeout());
- QVERIFY(s.size() == 1);
- QVERIFY(s[0].size() == 1);
+ QCOMPARE(s.size(), 1);
+ QCOMPARE(s[0].size(), 1);
QCOMPARE(s[0][0].userType(), int(QVariant::String));
QCOMPARE(s[0][0].toString(), expectedValue);
}
@@ -913,8 +913,8 @@ void tst_QDBusAbstractInterface::getComplexSignal()
QTestEventLoop::instance().enterLoop(2);
QVERIFY(!QTestEventLoop::instance().timeout());
- QVERIFY(s.size() == 1);
- QVERIFY(s[0].size() == 1);
+ QCOMPARE(s.size(), 1);
+ QCOMPARE(s[0].size(), 1);
QCOMPARE(s[0][0].userType(), qMetaTypeId<RegisteredType>());
QCOMPARE(s[0][0].value<RegisteredType>(), expectedValue);
}
@@ -942,8 +942,8 @@ void tst_QDBusAbstractInterface::getVoidSignalPeer()
QTestEventLoop::instance().enterLoop(2);
QVERIFY(!QTestEventLoop::instance().timeout());
- QVERIFY(s.size() == 1);
- QVERIFY(s.at(0).size() == 0);
+ QCOMPARE(s.size(), 1);
+ QCOMPARE(s.at(0).size(), 0);
}
void tst_QDBusAbstractInterface::getStringSignalPeer_data()
@@ -968,8 +968,8 @@ void tst_QDBusAbstractInterface::getStringSignalPeer()
QTestEventLoop::instance().enterLoop(2);
QVERIFY(!QTestEventLoop::instance().timeout());
- QVERIFY(s.size() == 1);
- QVERIFY(s[0].size() == 1);
+ QCOMPARE(s.size(), 1);
+ QCOMPARE(s[0].size(), 1);
QCOMPARE(s[0][0].userType(), int(QVariant::String));
QCOMPARE(s[0][0].toString(), expectedValue);
}
@@ -996,8 +996,8 @@ void tst_QDBusAbstractInterface::getComplexSignalPeer()
QTestEventLoop::instance().enterLoop(2);
QVERIFY(!QTestEventLoop::instance().timeout());
- QVERIFY(s.size() == 1);
- QVERIFY(s[0].size() == 1);
+ QCOMPARE(s.size(), 1);
+ QCOMPARE(s[0].size(), 1);
QCOMPARE(s[0][0].userType(), qMetaTypeId<RegisteredType>());
QCOMPARE(s[0][0].value<RegisteredType>(), expectedValue);
}
@@ -1045,7 +1045,7 @@ void tst_QDBusAbstractInterface::followSignal()
// now the signal must have been received:
QCOMPARE(s.size(), 1);
- QVERIFY(s.at(0).size() == 0);
+ QCOMPARE(s.at(0).size(), 0);
// cleanup:
con.interface()->unregisterService(serviceToFollow);
diff --git a/tests/auto/dbus/qdbusconnection/qdbusconnection.pro b/tests/auto/dbus/qdbusconnection/qdbusconnection.pro
index 83ae29de0a..3fcf3e076b 100644
--- a/tests/auto/dbus/qdbusconnection/qdbusconnection.pro
+++ b/tests/auto/dbus/qdbusconnection/qdbusconnection.pro
@@ -3,4 +3,3 @@ TARGET = tst_qdbusconnection
QT = core dbus testlib
SOURCES += tst_qdbusconnection.cpp
HEADERS += tst_qdbusconnection.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp
index e91f87d6c8..7cd8c875ec 100644
--- a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp
+++ b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp
@@ -71,7 +71,7 @@ void tst_QDBusConnection::noConnection()
QVERIFY(con.callWithCallback(msg, &spy, SLOT(asyncReply)) == 0);
QDBusMessage reply = con.call(msg);
- QVERIFY(reply.type() == QDBusMessage::ErrorMessage);
+ QCOMPARE(reply.type(), QDBusMessage::ErrorMessage);
QDBusReply<void> voidreply(reply);
QVERIFY(!voidreply.isValid());
@@ -877,14 +877,14 @@ void tst_QDBusConnection::callSelfByAnotherName()
break;
case 1:
- QVERIFY(con.interface()->registerService(sname).value() == QDBusConnectionInterface::ServiceRegistered);
+ QCOMPARE(con.interface()->registerService(sname).value(), QDBusConnectionInterface::ServiceRegistered);
break;
case 2: {
// flag is DBUS_NAME_FLAG_DO_NOT_QUEUE = 0x04
// reply is DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER = 1
QDBusReply<uint> reply = con.interface()->call("RequestName", sname, 4u);
- QVERIFY(reply.value() == 1);
+ QCOMPARE(reply.value(), uint(1));
}
}
@@ -907,7 +907,7 @@ void tst_QDBusConnection::callSelfByAnotherName()
QString(), "test0");
QDBusMessage reply = con.call(msg, QDBus::Block, 1000);
- QVERIFY(reply.type() == QDBusMessage::ReplyMessage);
+ QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
}
void tst_QDBusConnection::multipleInterfacesInQObject()
@@ -923,7 +923,7 @@ void tst_QDBusConnection::multipleInterfacesInQObject()
"local.BaseObject", "anotherMethod");
QDBusMessage reply = con.call(msg, QDBus::Block);
QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
- QVERIFY(reply.arguments().count() == 0);
+ QCOMPARE(reply.arguments().count(), 0);
}
void tst_QDBusConnection::slotsWithLessParameters()
diff --git a/tests/auto/dbus/qdbusconnection_no_bus/qdbusconnection_no_bus.pro b/tests/auto/dbus/qdbusconnection_no_bus/qdbusconnection_no_bus.pro
index 7b15a4fb81..97d3c0ebf4 100644
--- a/tests/auto/dbus/qdbusconnection_no_bus/qdbusconnection_no_bus.pro
+++ b/tests/auto/dbus/qdbusconnection_no_bus/qdbusconnection_no_bus.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qdbusconnection_no_bus
QT = core dbus testlib
SOURCES += tst_qdbusconnection_no_bus.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbuscontext/qdbuscontext.pro b/tests/auto/dbus/qdbuscontext/qdbuscontext.pro
index a426c4cfd1..42cf425d52 100644
--- a/tests/auto/dbus/qdbuscontext/qdbuscontext.pro
+++ b/tests/auto/dbus/qdbuscontext/qdbuscontext.pro
@@ -2,5 +2,4 @@ CONFIG += testcase
TARGET = tst_qdbuscontext
QT = core dbus testlib
SOURCES += tst_qdbuscontext.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusinterface/qdbusinterface/qdbusinterface.pro b/tests/auto/dbus/qdbusinterface/qdbusinterface/qdbusinterface.pro
index 170b555ee7..b7dedad133 100644
--- a/tests/auto/dbus/qdbusinterface/qdbusinterface/qdbusinterface.pro
+++ b/tests/auto/dbus/qdbusinterface/qdbusinterface/qdbusinterface.pro
@@ -5,4 +5,3 @@ TARGET = ../tst_qdbusinterface
DESTDIR = ./
QT = core core-private dbus testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusinterface/qmyserver/qmyserver.pro b/tests/auto/dbus/qdbusinterface/qmyserver/qmyserver.pro
index ddafd528ee..8f2d261899 100644
--- a/tests/auto/dbus/qdbusinterface/qmyserver/qmyserver.pro
+++ b/tests/auto/dbus/qdbusinterface/qmyserver/qmyserver.pro
@@ -4,4 +4,3 @@ TARGET = qmyserver
DESTDIR = ./
QT = core dbus
CONFIG -= app_bundle
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusinterface/tst_qdbusinterface.cpp b/tests/auto/dbus/qdbusinterface/tst_qdbusinterface.cpp
index 93d3eacb08..47364e9217 100644
--- a/tests/auto/dbus/qdbusinterface/tst_qdbusinterface.cpp
+++ b/tests/auto/dbus/qdbusinterface/tst_qdbusinterface.cpp
@@ -283,7 +283,7 @@ void tst_QDBusInterface::initTestCase()
// get peer server address
QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "address");
QDBusMessage rpl = con.call(req);
- QVERIFY(rpl.type() == QDBusMessage::ReplyMessage);
+ QCOMPARE(rpl.type(), QDBusMessage::ReplyMessage);
QString address = rpl.arguments().at(0).toString();
// connect to peer server
@@ -292,7 +292,7 @@ void tst_QDBusInterface::initTestCase()
QDBusMessage req2 = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "waitForConnected");
QDBusMessage rpl2 = con.call(req2);
- QVERIFY(rpl2.type() == QDBusMessage::ReplyMessage);
+ QCOMPARE(rpl2.type(), QDBusMessage::ReplyMessage);
QVERIFY2(rpl2.type() == QDBusMessage::ReplyMessage, rpl2.errorMessage().toLatin1());
}
@@ -348,7 +348,7 @@ void tst_QDBusInterface::invalidAfterServiceOwnerChanged()
QTestEventLoop::instance().connect(connIface, SIGNAL(serviceOwnerChanged(QString,QString,QString)),
SLOT(exitLoop()));
- QVERIFY(connIface->registerService("com.example.Test") == QDBusConnectionInterface::ServiceRegistered);
+ QCOMPARE(connIface->registerService("com.example.Test").value(), QDBusConnectionInterface::ServiceRegistered);
QTestEventLoop::instance().enterLoop(5);
diff --git a/tests/auto/dbus/qdbuslocalcalls/qdbuslocalcalls.pro b/tests/auto/dbus/qdbuslocalcalls/qdbuslocalcalls.pro
index cbe3e89a16..3577210b86 100644
--- a/tests/auto/dbus/qdbuslocalcalls/qdbuslocalcalls.pro
+++ b/tests/auto/dbus/qdbuslocalcalls/qdbuslocalcalls.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qdbuslocalcalls
QT = core dbus testlib
SOURCES += tst_qdbuslocalcalls.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusmarshall/qdbusmarshall/qdbusmarshall.pro b/tests/auto/dbus/qdbusmarshall/qdbusmarshall/qdbusmarshall.pro
index b0656231d2..b0442a0ee4 100644
--- a/tests/auto/dbus/qdbusmarshall/qdbusmarshall/qdbusmarshall.pro
+++ b/tests/auto/dbus/qdbusmarshall/qdbusmarshall/qdbusmarshall.pro
@@ -12,4 +12,3 @@ contains(QT_CONFIG, dbus-linked) {
} else {
SOURCES += ../../../../../src/dbus/qdbus_symbols.cpp
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusmarshall/qpong/qpong.pro b/tests/auto/dbus/qdbusmarshall/qpong/qpong.pro
index a4c5efba85..57f8b2a598 100644
--- a/tests/auto/dbus/qdbusmarshall/qpong/qpong.pro
+++ b/tests/auto/dbus/qdbusmarshall/qpong/qpong.pro
@@ -5,4 +5,3 @@ QT = core dbus
CONFIG -= app_bundle
CONFIG += console
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusmetaobject/qdbusmetaobject.pro b/tests/auto/dbus/qdbusmetaobject/qdbusmetaobject.pro
index c0b38cf478..12f801613d 100644
--- a/tests/auto/dbus/qdbusmetaobject/qdbusmetaobject.pro
+++ b/tests/auto/dbus/qdbusmetaobject/qdbusmetaobject.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qdbusmetaobject
QT = core dbus-private testlib
SOURCES += tst_qdbusmetaobject.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusmetatype/qdbusmetatype.pro b/tests/auto/dbus/qdbusmetatype/qdbusmetatype.pro
index aef9bc73cb..38d7370667 100644
--- a/tests/auto/dbus/qdbusmetatype/qdbusmetatype.pro
+++ b/tests/auto/dbus/qdbusmetatype/qdbusmetatype.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qdbusmetatype
QT = core dbus testlib
SOURCES += tst_qdbusmetatype.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbuspendingcall/qdbuspendingcall.pro b/tests/auto/dbus/qdbuspendingcall/qdbuspendingcall.pro
index 7b5f867798..ddfe3008a5 100644
--- a/tests/auto/dbus/qdbuspendingcall/qdbuspendingcall.pro
+++ b/tests/auto/dbus/qdbuspendingcall/qdbuspendingcall.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qdbuspendingcall
QT = core dbus testlib
SOURCES += tst_qdbuspendingcall.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbuspendingcall/tst_qdbuspendingcall.cpp b/tests/auto/dbus/qdbuspendingcall/tst_qdbuspendingcall.cpp
index cc12ef8bcc..8cb9aa70e9 100644
--- a/tests/auto/dbus/qdbuspendingcall/tst_qdbuspendingcall.cpp
+++ b/tests/auto/dbus/qdbuspendingcall/tst_qdbuspendingcall.cpp
@@ -178,7 +178,7 @@ void tst_QDBusPendingCall::waitForFinished()
QVERIFY(!ac.isError());
const QDBusMessage reply = ac.reply();
- QVERIFY(reply.type() == QDBusMessage::ReplyMessage);
+ QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
QCOMPARE(reply.signature(), QString("as"));
const QVariantList args = ac.reply().arguments();
@@ -334,7 +334,7 @@ void tst_QDBusPendingCall::watcher_waitForFinished_threaded()
QDBusPendingCall ac = tst->sendMessage();
// QVERIFY(!ac.isFinished());
// QVERIFY(!ac.isError());
-// QVERIFY(ac.reply().type() == QDBusMessage::InvalidMessage);
+// QCOMPARE(ac.reply().type(), QDBusMessage::InvalidMessage);
QDBusPendingCallWatcher watch(ac);
tst->connect(&watch, SIGNAL(finished(QDBusPendingCallWatcher*)),
@@ -344,7 +344,7 @@ void tst_QDBusPendingCall::watcher_waitForFinished_threaded()
// QVERIFY(!ac.isFinished());
// QVERIFY(!ac.isError());
-// QVERIFY(ac.reply().type() == QDBusMessage::InvalidMessage);
+// QCOMPARE(ac.reply().type(), QDBusMessage::InvalidMessage);
QCOMPARE(tst->callCount, 0);
QCOMPARE(tst->slotCalled, 0);
diff --git a/tests/auto/dbus/qdbuspendingreply/qdbuspendingreply.pro b/tests/auto/dbus/qdbuspendingreply/qdbuspendingreply.pro
index d6b9e71084..814e40decc 100644
--- a/tests/auto/dbus/qdbuspendingreply/qdbuspendingreply.pro
+++ b/tests/auto/dbus/qdbuspendingreply/qdbuspendingreply.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qdbuspendingreply
QT = core dbus testlib
SOURCES += tst_qdbuspendingreply.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusreply/qdbusreply.pro b/tests/auto/dbus/qdbusreply/qdbusreply.pro
index 0ffb35e461..42e9e6dddc 100644
--- a/tests/auto/dbus/qdbusreply/qdbusreply.pro
+++ b/tests/auto/dbus/qdbusreply/qdbusreply.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qdbusreply
QT = core dbus testlib
SOURCES += tst_qdbusreply.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusservicewatcher/qdbusservicewatcher.pro b/tests/auto/dbus/qdbusservicewatcher/qdbusservicewatcher.pro
index 82a0f3bb7e..e689a5cfa3 100644
--- a/tests/auto/dbus/qdbusservicewatcher/qdbusservicewatcher.pro
+++ b/tests/auto/dbus/qdbusservicewatcher/qdbusservicewatcher.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qdbusservicewatcher
QT = core dbus testlib
SOURCES += tst_qdbusservicewatcher.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusthreading/qdbusthreading.pro b/tests/auto/dbus/qdbusthreading/qdbusthreading.pro
index e50804336b..95358b2003 100644
--- a/tests/auto/dbus/qdbusthreading/qdbusthreading.pro
+++ b/tests/auto/dbus/qdbusthreading/qdbusthreading.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qdbusthreading
QT = core dbus testlib
SOURCES += tst_qdbusthreading.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusthreading/tst_qdbusthreading.cpp b/tests/auto/dbus/qdbusthreading/tst_qdbusthreading.cpp
index 6b89b84990..8dc6c8cb8f 100644
--- a/tests/auto/dbus/qdbusthreading/tst_qdbusthreading.cpp
+++ b/tests/auto/dbus/qdbusthreading/tst_qdbusthreading.cpp
@@ -96,7 +96,6 @@ public Q_SLOTS:
void callbackInAnotherAuxThread_thread();
private Q_SLOTS:
- void initTestCase();
void dyingThread();
void lastInstanceInOtherThread();
void concurrentCreation();
@@ -236,10 +235,6 @@ void tst_QDBusThreading::cleanup()
QTest::qWait(500);
}
-void tst_QDBusThreading::initTestCase()
-{
-}
-
void tst_QDBusThreading::dyingThread_thread()
{
QDBusConnection::connectToBus(QDBusConnection::SessionBus, myConnectionName);
diff --git a/tests/auto/dbus/qdbustype/qdbustype.pro b/tests/auto/dbus/qdbustype/qdbustype.pro
index 21df33d2c7..1b3e0f8008 100644
--- a/tests/auto/dbus/qdbustype/qdbustype.pro
+++ b/tests/auto/dbus/qdbustype/qdbustype.pro
@@ -9,4 +9,3 @@ contains(QT_CONFIG, dbus-linked) {
} else {
SOURCES += ../../../../src/dbus/qdbus_symbols.cpp
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbustype/tst_qdbustype.cpp b/tests/auto/dbus/qdbustype/tst_qdbustype.cpp
index 4408729e7c..5634bc20f8 100644
--- a/tests/auto/dbus/qdbustype/tst_qdbustype.cpp
+++ b/tests/auto/dbus/qdbustype/tst_qdbustype.cpp
@@ -260,11 +260,11 @@ void tst_QDBusType::isValidArray()
QFETCH(QString, data);
QFETCH(bool, result);
- data.prepend("a");
+ data.prepend(QLatin1Char('a'));
QCOMPARE(bool(q_dbus_signature_validate_single(data.toLatin1(), 0)), result);
QCOMPARE(QDBusUtil::isValidSingleSignature(data), result);
- data.prepend("a");
+ data.prepend(QLatin1Char('a'));
QCOMPARE(bool(q_dbus_signature_validate_single(data.toLatin1(), 0)), result);
QCOMPARE(QDBusUtil::isValidSingleSignature(data), result);
}
diff --git a/tests/auto/dbus/qdbusxmlparser/qdbusxmlparser.pro b/tests/auto/dbus/qdbusxmlparser/qdbusxmlparser.pro
index a7186c341b..3e47b00814 100644
--- a/tests/auto/dbus/qdbusxmlparser/qdbusxmlparser.pro
+++ b/tests/auto/dbus/qdbusxmlparser/qdbusxmlparser.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qdbusxmlparser
QT = core-private dbus-private xml testlib
SOURCES += tst_qdbusxmlparser.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/gui/image/qicoimageformat/qicoimageformat.pro b/tests/auto/gui/image/qicoimageformat/qicoimageformat.pro
index 7ed69ce1d1..485472c70c 100644
--- a/tests/auto/gui/image/qicoimageformat/qicoimageformat.pro
+++ b/tests/auto/gui/image/qicoimageformat/qicoimageformat.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qicoimageformat
SOURCES+= tst_qicoimageformat.cpp
QT += testlib
diff --git a/tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp b/tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp
index bff762fd04..c940498935 100644
--- a/tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp
+++ b/tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp
@@ -38,17 +38,8 @@ class tst_QIcoImageFormat : public QObject
{
Q_OBJECT
-public:
- tst_QIcoImageFormat();
- virtual ~tst_QIcoImageFormat();
-
-
-public slots:
- void initTestCase();
- void cleanupTestCase();
- void init();
- void cleanup();
private slots:
+ void initTestCase();
void format();
void canRead_data();
void canRead();
@@ -69,26 +60,6 @@ private:
QString m_IconPath;
};
-
-tst_QIcoImageFormat::tst_QIcoImageFormat()
-{
-}
-
-tst_QIcoImageFormat::~tst_QIcoImageFormat()
-{
-
-}
-
-void tst_QIcoImageFormat::init()
-{
-
-}
-
-void tst_QIcoImageFormat::cleanup()
-{
-
-}
-
void tst_QIcoImageFormat::initTestCase()
{
m_IconPath = QFINDTESTDATA("icons");
@@ -96,11 +67,6 @@ void tst_QIcoImageFormat::initTestCase()
QFAIL("Cannot find icons directory containing testdata!");
}
-void tst_QIcoImageFormat::cleanupTestCase()
-{
-
-}
-
void tst_QIcoImageFormat::format()
{
{
@@ -141,7 +107,7 @@ void tst_QIcoImageFormat::canRead()
QFETCH(QString, fileName);
QFETCH(int, isValid);
- QImageReader reader(m_IconPath + "/" + fileName);
+ QImageReader reader(m_IconPath + QLatin1Char('/') + fileName);
QCOMPARE(reader.canRead(), (isValid == 0 ? false : true));
}
@@ -175,7 +141,7 @@ void tst_QIcoImageFormat::SequentialFile()
QFETCH(QString, fileName);
QFETCH(int, isValid);
- QSequentialFile *file = new QSequentialFile(m_IconPath + "/" + fileName);
+ QSequentialFile *file = new QSequentialFile(m_IconPath + QLatin1Char('/') + fileName);
QVERIFY(file);
QVERIFY(file->open(QFile::ReadOnly));
QImageReader reader(file);
@@ -212,7 +178,7 @@ void tst_QIcoImageFormat::imageCount()
QFETCH(QString, fileName);
QFETCH(int, count);
- QImageReader reader(m_IconPath + "/" + fileName);
+ QImageReader reader(m_IconPath + QLatin1Char('/') + fileName);
QCOMPARE(reader.imageCount(), count);
}
@@ -240,7 +206,7 @@ void tst_QIcoImageFormat::jumpToNextImage()
QFETCH(QString, fileName);
QFETCH(int, count);
- QImageReader reader(m_IconPath + "/" + fileName);
+ QImageReader reader(m_IconPath + QLatin1Char('/') + fileName);
bool bJumped = reader.jumpToImage(0);
while (bJumped) {
count--;
@@ -263,7 +229,7 @@ void tst_QIcoImageFormat::loopCount()
QFETCH(QString, fileName);
QFETCH(int, count);
- QImageReader reader(m_IconPath + "/" + fileName);
+ QImageReader reader(m_IconPath + QLatin1Char('/') + fileName);
QCOMPARE(reader.loopCount(), count);
}
@@ -291,7 +257,7 @@ void tst_QIcoImageFormat::nextImageDelay()
QFETCH(QString, fileName);
QFETCH(int, count);
- QImageReader reader(m_IconPath + "/" + fileName);
+ QImageReader reader(m_IconPath + QLatin1Char('/') + fileName);
if (count == -1) {
QCOMPARE(reader.nextImageDelay(), 0);
} else {
@@ -320,7 +286,7 @@ void tst_QIcoImageFormat::pngCompression()
QFETCH(int, width);
QFETCH(int, height);
- QImageReader reader(m_IconPath + "/" + fileName);
+ QImageReader reader(m_IconPath + QLatin1Char('/') + fileName);
QImage image;
reader.jumpToImage(index);
diff --git a/tests/auto/gui/image/qicon/icons/themeparent/icon-theme.cache b/tests/auto/gui/image/qicon/icons/themeparent/icon-theme.cache
new file mode 100644
index 0000000000..a323875989
--- /dev/null
+++ b/tests/auto/gui/image/qicon/icons/themeparent/icon-theme.cache
Binary files differ
diff --git a/tests/auto/gui/image/qicon/qicon.pro b/tests/auto/gui/image/qicon/qicon.pro
index 6ff20ec8fa..f5570c2497 100644
--- a/tests/auto/gui/image/qicon/qicon.pro
+++ b/tests/auto/gui/image/qicon/qicon.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qicon
QT += testlib
diff --git a/tests/auto/gui/image/qicon/tst_qicon.cpp b/tests/auto/gui/image/qicon/tst_qicon.cpp
index 7333dd739f..329c3ae66d 100644
--- a/tests/auto/gui/image/qicon/tst_qicon.cpp
+++ b/tests/auto/gui/image/qicon/tst_qicon.cpp
@@ -64,6 +64,7 @@ private slots:
void streamAvailableSizes_data();
void streamAvailableSizes();
void fromTheme();
+ void fromThemeCache();
#ifndef QT_NO_WIDGETS
void task184901_badCache();
@@ -648,6 +649,69 @@ void tst_QIcon::fromTheme()
QVERIFY(abIcon.isNull());
}
+void tst_QIcon::fromThemeCache()
+{
+ QTemporaryDir dir;
+ QVERIFY(QDir().mkpath(dir.path() + QLatin1String("/testcache/16x16/actions")));
+ QVERIFY(QFile(QStringLiteral(":/styles/commonstyle/images/standardbutton-open-16.png"))
+ .copy( dir.path() + QLatin1String("/testcache/16x16/actions/button-open.png")));
+
+ {
+ QFile index(dir.path() + QLatin1String("/testcache/index.theme"));
+ QVERIFY(index.open(QFile::WriteOnly));
+ index.write("[Icon Theme]\nDirectories=16x16/actions\n[16x16/actions]\nSize=16\nContext=Actions\nType=Fixed\n");
+ }
+ QIcon::setThemeSearchPaths(QStringList() << dir.path());
+ QIcon::setThemeName("testcache");
+
+ // We just created a theme with that icon, it must exist
+ QVERIFY(!QIcon::fromTheme("button-open").isNull());
+
+ QString cacheName = dir.path() + QLatin1String("/testcache/icon-theme.cache");
+
+ // An invalid cache should not prevent lookup
+ {
+ QFile cacheFile(cacheName);
+ QVERIFY(cacheFile.open(QFile::WriteOnly));
+ QDataStream(&cacheFile) << quint16(1) << quint16(0) << "invalid corrupted stuff in there\n";
+ }
+ QIcon::setThemeSearchPaths(QStringList() << dir.path()); // reload themes
+ QVERIFY(!QIcon::fromTheme("button-open").isNull());
+
+ // An empty cache should prevent the lookup
+ {
+ QFile cacheFile(cacheName);
+ QVERIFY(cacheFile.open(QFile::WriteOnly));
+ QDataStream ds(&cacheFile);
+ ds << quint16(1) << quint16(0); // 0: version
+ ds << quint32(12) << quint32(20); // 4: hash offset / dir list offset
+ ds << quint32(1) << quint32(0xffffffff); // 12: one empty bucket
+ ds << quint32(1) << quint32(28); // 20: list with one element
+ ds.writeRawData("16x16/actions", sizeof("16x16/actions")); // 28
+ }
+ QIcon::setThemeSearchPaths(QStringList() << dir.path()); // reload themes
+ QVERIFY(QIcon::fromTheme("button-open").isNull()); // The icon was not in the cache, it should not be found
+
+ // Adding an icon should be changing the modification date of one sub directory which should make the cache ignored
+ QTest::qWait(1000); // wait enough to have a different modification time in seconds
+ QVERIFY(QFile(QStringLiteral(":/styles/commonstyle/images/standardbutton-save-16.png"))
+ .copy(dir.path() + QLatin1String("/testcache/16x16/actions/button-save.png")));
+ QVERIFY(QFileInfo(cacheName).lastModified() < QFileInfo(dir.path() + QLatin1String("/testcache/16x16/actions")).lastModified());
+ QIcon::setThemeSearchPaths(QStringList() << dir.path()); // reload themes
+ QVERIFY(!QIcon::fromTheme("button-open").isNull());
+
+ // Try to run the actual gtk-update-icon-cache and make sure that icons are still found
+ QProcess process;
+ process.start(QStringLiteral("gtk-update-icon-cache"),
+ QStringList() << QStringLiteral("-f") << QStringLiteral("-t") << (dir.path() + QLatin1String("/testcache")));
+ if (!process.waitForFinished())
+ QSKIP("gtk-update-icon-cache not run");
+ QVERIFY(QFileInfo(cacheName).lastModified() >= QFileInfo(dir.path() + QLatin1String("/testcache/16x16/actions")).lastModified());
+ QIcon::setThemeSearchPaths(QStringList() << dir.path()); // reload themes
+ QVERIFY(!QIcon::fromTheme("button-open").isNull());
+ QVERIFY(!QIcon::fromTheme("button-open-fallback").isNull());
+ QVERIFY(QIcon::fromTheme("notexist-fallback").isNull());
+}
void tst_QIcon::task223279_inconsistentAddFile()
{
diff --git a/tests/auto/gui/image/qicon/tst_qicon.qrc b/tests/auto/gui/image/qicon/tst_qicon.qrc
index 1505ca925b..3c8fbba7c2 100644
--- a/tests/auto/gui/image/qicon/tst_qicon.qrc
+++ b/tests/auto/gui/image/qicon/tst_qicon.qrc
@@ -15,6 +15,7 @@
<file>./icons/themeparent/32x32/actions/address-book-new.png</file>
<file>./icons/themeparent/32x32/actions/appointment-new.png</file>
<file>./icons/themeparent/index.theme</file>
+<file>./icons/themeparent/icon-theme.cache</file>
<file>./icons/themeparent/scalable/actions/address-book-new.svg</file>
<file>./icons/themeparent/scalable/actions/appointment-new.svg</file>
<file>./styles/commonstyle/images/standardbutton-open-16.png</file>
diff --git a/tests/auto/gui/image/qimage/qimage.pro b/tests/auto/gui/image/qimage/qimage.pro
index 42280d3bd4..d32e84c0d7 100644
--- a/tests/auto/gui/image/qimage/qimage.pro
+++ b/tests/auto/gui/image/qimage/qimage.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qimage
SOURCES += tst_qimage.cpp
diff --git a/tests/auto/gui/image/qimage/tst_qimage.cpp b/tests/auto/gui/image/qimage/tst_qimage.cpp
index 23ddfbdd58..1c3e3ade39 100644
--- a/tests/auto/gui/image/qimage/tst_qimage.cpp
+++ b/tests/auto/gui/image/qimage/tst_qimage.cpp
@@ -112,6 +112,7 @@ private slots:
void smoothScale2_data();
void smoothScale2();
void smoothScale3();
+ void smoothScale4();
void smoothScaleBig();
void smoothScaleAlpha();
@@ -972,13 +973,17 @@ void tst_QImage::createAlphaMask_data()
int alphas[] = { 0, 127, 255 };
for (unsigned a1 = 0; a1 < sizeof(alphas) / sizeof(int); ++a1) {
+ const QByteArray a1B = QByteArray::number(alphas[a1]);
for (unsigned a2 = 0; a2 < sizeof(alphas) / sizeof(int); ++a2) {
if (a1 == a2)
continue;
+ const QByteArray a2B = QByteArray::number(alphas[a2]);
for (int x=10; x<18; x+=3) {
+ const QByteArray xB = QByteArray::number(x);
for (int y=100; y<108; y+=3) {
- QTest::newRow(qPrintable(QString::fromLatin1("x=%1, y=%2, a1=%3, a2=%4").arg(x).arg(y).arg(alphas[a1]).arg(alphas[a2])))
- << x << y << alphas[a1] << alphas[a2];
+ const QByteArray testName = "x=" + xB + ", y=" + QByteArray::number(y)
+ + ", a1=" + a1B + ", a2=" + a2B;
+ QTest::newRow(testName.constData()) << x << y << alphas[a1] << alphas[a2];
}
}
}
@@ -1075,34 +1080,34 @@ void tst_QImage::rotate_data()
degrees << 0 << 90 << 180 << 270;
foreach (int d, degrees) {
- QString title = QString("%1 %2").arg(d);
- QTest::newRow(qPrintable(title.arg("Format_RGB32")))
+ const QByteArray dB = QByteArray::number(d);
+ QTest::newRow((dB + " Format_RGB32").constData())
<< QImage::Format_RGB32 << d;
- QTest::newRow(qPrintable(title.arg("Format_ARGB32")))
+ QTest::newRow((dB + " Format_ARGB32").constData())
<< QImage::Format_ARGB32 << d;
- QTest::newRow(qPrintable(title.arg("Format_ARGB32_Premultiplied")))
+ QTest::newRow((dB + " Format_ARGB32_Premultiplied").constData())
<< QImage::Format_ARGB32_Premultiplied << d;
- QTest::newRow(qPrintable(title.arg("Format_RGB16")))
+ QTest::newRow((dB + " Format_RGB16").constData())
<< QImage::Format_RGB16 << d;
- QTest::newRow(qPrintable(title.arg("Format_ARGB8565_Premultiplied")))
+ QTest::newRow((dB + " Format_ARGB8565_Premultiplied").constData())
<< QImage::Format_ARGB8565_Premultiplied << d;
- QTest::newRow(qPrintable(title.arg("Format_RGB666")))
+ QTest::newRow((dB + " Format_RGB666").constData())
<< QImage::Format_RGB666 << d;
- QTest::newRow(qPrintable(title.arg("Format_RGB555")))
+ QTest::newRow((dB + " Format_RGB555").constData())
<< QImage::Format_RGB555 << d;
- QTest::newRow(qPrintable(title.arg("Format_ARGB8555_Premultiplied")))
+ QTest::newRow((dB + " Format_ARGB8555_Premultiplied").constData())
<< QImage::Format_ARGB8555_Premultiplied << d;
- QTest::newRow(qPrintable(title.arg("Format_RGB888")))
+ QTest::newRow((dB + " Format_RGB888").constData())
<< QImage::Format_RGB888 << d;
- QTest::newRow(qPrintable(title.arg("Format_Indexed8")))
+ QTest::newRow((dB + " Format_Indexed8").constData())
<< QImage::Format_Indexed8 << d;
- QTest::newRow(qPrintable(title.arg("Format_RGBX8888")))
+ QTest::newRow((dB + " Format_RGBX8888").constData())
<< QImage::Format_RGBX8888 << d;
- QTest::newRow(qPrintable(title.arg("Format_RGBA8888_Premultiplied")))
+ QTest::newRow((dB + " Format_RGBA8888_Premultiplied").constData())
<< QImage::Format_RGBA8888_Premultiplied << d;
- QTest::newRow(qPrintable(title.arg("Format_Alpha8")))
+ QTest::newRow((dB + " Format_Alpha8").constData())
<< QImage::Format_Alpha8 << d;
- QTest::newRow(qPrintable(title.arg("Format_Grayscale8")))
+ QTest::newRow((dB + " Format_Grayscale8").constData())
<< QImage::Format_Grayscale8 << d;
}
}
@@ -1626,9 +1631,11 @@ void tst_QImage::smoothScale2_data()
int sizes[] = { 2, 3, 4, 6, 7, 8, 10, 16, 20, 32, 40, 64, 100, 101, 128, 0 };
QImage::Format formats[] = { QImage::Format_RGB32, QImage::Format_ARGB32_Premultiplied, QImage::Format_Invalid };
for (int j = 0; formats[j] != QImage::Format_Invalid; ++j) {
- QString formatstr = formats[j] == QImage::Format_RGB32 ? QStringLiteral("rgb32") : QStringLiteral("argb32pm");
+ QByteArray formatstr = formats[j] == QImage::Format_RGB32 ? QByteArrayLiteral("rgb32") : QByteArrayLiteral("argb32pm");
for (int i = 0; sizes[i] != 0; ++i) {
- QTest::newRow(QString("%1 %2x%2").arg(formatstr).arg(sizes[i]).toUtf8()) << (int)formats[j] << sizes[i];
+ const QByteArray sizeB = QByteArray::number(sizes[i]);
+ QTest::newRow((formatstr + ' ' + sizeB + 'x' + sizeB).constData())
+ << (int)formats[j] << sizes[i];
}
}
}
@@ -1671,6 +1678,30 @@ void tst_QImage::smoothScale2()
QCOMPARE(qBlue(pixel), qBlue(expected));
}
+ // scale x up
+ scaled = img.scaled(QSize(size, size * 2), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+ for (int y = 0; y < scaled.height(); ++y) {
+ for (int x = 0; x < scaled.width(); ++x) {
+ pixel = scaled.pixel(x, y);
+ QCOMPARE(qAlpha(pixel), qAlpha(expected));
+ QCOMPARE(qRed(pixel), qRed(expected));
+ QCOMPARE(qGreen(pixel), qGreen(expected));
+ QCOMPARE(qBlue(pixel), qBlue(expected));
+ }
+ }
+
+ // scale y up
+ scaled = img.scaled(QSize(size * 2, size), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+ for (int y = 0; y < scaled.height(); ++y) {
+ for (int x = 0; x < scaled.width(); ++x) {
+ pixel = scaled.pixel(x, y);
+ QCOMPARE(qAlpha(pixel), qAlpha(expected));
+ QCOMPARE(qRed(pixel), qRed(expected));
+ QCOMPARE(qGreen(pixel), qGreen(expected));
+ QCOMPARE(qBlue(pixel), qBlue(expected));
+ }
+ }
+
// scale x up, y up
scaled = img.scaled(QSize(size * 2, size * 2), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
for (int y = 0; y < scaled.height(); ++y) {
@@ -1736,6 +1767,26 @@ void tst_QImage::smoothScale3()
}
}
+// Tests smooth upscale is smooth
+void tst_QImage::smoothScale4()
+{
+ QImage img(4, 4, QImage::Format_RGB32);
+ for (int y = 0; y < 4; ++y) {
+ for (int x = 0; x < 4; ++x) {
+ img.setPixel(x, y, qRgb(x * 255 / 3, y * 255 / 3, 0));
+ }
+ }
+ QImage scaled = img.scaled(37, 23, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+ for (int y = 0; y < scaled.height(); ++y) {
+ for (int x = 0; x < scaled.width(); ++x) {
+ if (x > 0)
+ QVERIFY(qRed(scaled.pixel(x, y)) >= qRed(scaled.pixel(x - 1, y)));
+ if (y > 0)
+ QVERIFY(qGreen(scaled.pixel(x, y)) >= qGreen(scaled.pixel(x, y - 1)));
+ }
+ }
+}
+
void tst_QImage::smoothScaleBig()
{
#if defined(Q_OS_WINCE)
@@ -2600,10 +2651,11 @@ void tst_QImage::genericRgbConversion_data()
QTest::addColumn<QImage::Format>("dest_format");
for (int i = QImage::Format_RGB32; i < QImage::Format_Alpha8; ++i) {
+ const QString formatI = formatToString(QImage::Format(i));
for (int j = QImage::Format_RGB32; j < QImage::Format_Alpha8; ++j) {
if (i == j)
continue;
- QString test = QString::fromLatin1("%1 -> %2").arg(formatToString(QImage::Format(i))).arg(formatToString(QImage::Format(j)));
+ const QString test = formatI + QLatin1String(" -> ") + formatToString(QImage::Format(j));
QTest::newRow(qPrintable(test)) << QImage::Format(i) << QImage::Format(j);
}
}
diff --git a/tests/auto/gui/image/qimageiohandler/qimageiohandler.pro b/tests/auto/gui/image/qimageiohandler/qimageiohandler.pro
index bbcf8d23c9..428ff62959 100644
--- a/tests/auto/gui/image/qimageiohandler/qimageiohandler.pro
+++ b/tests/auto/gui/image/qimageiohandler/qimageiohandler.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qimageiohandler
QT += testlib
diff --git a/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp b/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp
index 86dd8c4daf..68b92e1851 100644
--- a/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp
+++ b/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp
@@ -174,7 +174,7 @@ private:
// helper to skip an autotest when the given image format is not supported
#define SKIP_IF_UNSUPPORTED(format) do { \
if (!QByteArray(format).isEmpty() && !QImageReader::supportedImageFormats().contains(format)) \
- QSKIP("\"" + QByteArray(format) + "\" images are not supported"); \
+ QSKIP('"' + QByteArray(format) + "\" images are not supported"); \
} while (0)
// Testing get/set functions
@@ -802,7 +802,7 @@ void tst_QImageReader::animatedGif()
QVERIFY(!image.isNull());
int i = 0;
while(!image.isNull()){
- QString frameName = QString(":images/qt%1.gif").arg(++i);
+ QString frameName = QLatin1String(":images/qt") + QString::number(++i) + QLatin1String(".gif");
QCOMPARE(image, QImage(frameName));
image = io.read();
}
@@ -1653,14 +1653,14 @@ void tst_QImageReader::pixelCompareWithBaseline()
// least one file succeeded we know that the plugin was built.
// The other failures are then real failures.
QImage icoImg;
- const QString inputFileName(QString::fromLatin1("images/%1").arg(fileName));
+ const QString inputFileName(QLatin1String("images/") + fileName);
QFileInfo fi(inputFileName);
++enteredCount;
// might fail if the plugin does not exist, which is ok.
if (icoImg.load(inputFileName)) {
icoImg = icoImg.convertToFormat(QImage::Format_ARGB32_Premultiplied);
- const QString baselineFileName(QString::fromLatin1("baseline/%1.png").arg(fi.baseName()));
+ const QString baselineFileName(QLatin1String("baseline/") + fi.baseName() + QLatin1String(".png"));
#if 0
icoImg.save(baselineFileName);
#else
diff --git a/tests/auto/gui/image/qimagewriter/tst_qimagewriter.cpp b/tests/auto/gui/image/qimagewriter/tst_qimagewriter.cpp
index 1dd4d69ea8..c6a4d9107f 100644
--- a/tests/auto/gui/image/qimagewriter/tst_qimagewriter.cpp
+++ b/tests/auto/gui/image/qimagewriter/tst_qimagewriter.cpp
@@ -61,13 +61,10 @@ class tst_QImageWriter : public QObject
Q_OBJECT
public:
- tst_QImageWriter();
virtual ~tst_QImageWriter();
public slots:
- void init();
void initTestCase();
- void cleanup();
private slots:
void getSetCheck();
@@ -97,7 +94,7 @@ private:
// helper to skip an autotest when the given image format is not supported
#define SKIP_IF_UNSUPPORTED(format) do { \
if (!QByteArray(format).isEmpty() && !QImageReader::supportedImageFormats().contains(format)) \
- QSKIP("\"" + QByteArray(format) + "\" images are not supported"); \
+ QSKIP('"' + QByteArray(format) + "\" images are not supported"); \
} while (0)
static void initializePadding(QImage *image)
@@ -163,10 +160,6 @@ void tst_QImageWriter::getSetCheck()
QCOMPARE(1.1f, obj1.gamma());
}
-tst_QImageWriter::tst_QImageWriter()
-{
-}
-
tst_QImageWriter::~tst_QImageWriter()
{
QDir dir(prefix);
@@ -177,14 +170,6 @@ tst_QImageWriter::~tst_QImageWriter()
}
-void tst_QImageWriter::init()
-{
-}
-
-void tst_QImageWriter::cleanup()
-{
-}
-
void tst_QImageWriter::writeImage_data()
{
QTest::addColumn<QString>("fileName");
@@ -269,8 +254,8 @@ void tst_QImageWriter::writeImage2_data()
QImage image = image0.convertToFormat(imgFormat);
initializePadding(&image);
foreach (const QString format, formats) {
- const QString fileName = QString("solidcolor_%1.%2").arg(imgFormat)
- .arg(format);
+ const QString fileName = QLatin1String("solidcolor_")
+ + QString::number(imgFormat) + QLatin1Char('.') + format;
QTest::newRow(fileName.toLatin1()) << fileName
<< format.toLatin1()
<< image;
diff --git a/tests/auto/gui/image/qmovie/qmovie.pro b/tests/auto/gui/image/qmovie/qmovie.pro
index 4e7030b1f7..a04ad73b80 100644
--- a/tests/auto/gui/image/qmovie/qmovie.pro
+++ b/tests/auto/gui/image/qmovie/qmovie.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qmovie
QT += testlib
qtHaveModule(widgets): QT += widgets
diff --git a/tests/auto/gui/image/qpicture/qpicture.pro b/tests/auto/gui/image/qpicture/qpicture.pro
index a24b8ec481..0fc851ce11 100644
--- a/tests/auto/gui/image/qpicture/qpicture.pro
+++ b/tests/auto/gui/image/qpicture/qpicture.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpicture
QT += testlib
qtHaveModule(widgets): QT += widgets
diff --git a/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp b/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp
index 67d7e57fd4..9a8761d076 100644
--- a/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp
+++ b/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp
@@ -64,12 +64,8 @@ class tst_QPixmap : public QObject
public:
tst_QPixmap();
- virtual ~tst_QPixmap();
-
public slots:
- void init();
- void cleanup();
void initTestCase();
void cleanupTestCase();
@@ -212,18 +208,6 @@ tst_QPixmap::tst_QPixmap()
{
}
-tst_QPixmap::~tst_QPixmap()
-{
-}
-
-void tst_QPixmap::init()
-{
-}
-
-void tst_QPixmap::cleanup()
-{
-}
-
void tst_QPixmap::initTestCase()
{
QVERIFY(!m_prefix.isEmpty());
@@ -445,7 +429,8 @@ void tst_QPixmap::scroll()
else
QVERIFY(pixmap.cacheKey() != oldKey);
- QString fileName = QString(":/images/%1.png").arg(QTest::currentDataTag());
+ const QString fileName = QLatin1String(":/images/") + QLatin1String(QTest::currentDataTag())
+ + QLatin1String(".png");
QPixmap output(fileName);
QCOMPARE(input.isNull(), output.isNull());
QVERIFY(lenientCompare(pixmap, output));
@@ -458,7 +443,7 @@ void tst_QPixmap::fill_data()
QTest::addColumn<bool>("syscolor");
QTest::addColumn<bool>("bitmap");
for (int color = Qt::black; color < Qt::darkYellow; ++color)
- QTest::newRow(QString("syscolor_%1").arg(color).toLatin1())
+ QTest::newRow(("syscolor_" + QByteArray::number(color)).constData())
<< uint(color) << true << false;
#if defined (Q_OS_WINCE)
@@ -1000,7 +985,9 @@ void tst_QPixmap::toWinHICON()
HBITMAP bitmap = qt_pixmapToWinHBITMAP(empty, Alpha);
SelectObject(bitmap_dc, bitmap);
- QImage imageFromFile(image + QString(QLatin1String("_%1x%2.png")).arg(width).arg(height));
+ const QString fileName = image + QLatin1Char('_') + QString::number(width) + QLatin1Char('x')
+ + QString::number(height) + QLatin1String(".png");
+ QImage imageFromFile(fileName);
imageFromFile = imageFromFile.convertToFormat(QImage::Format_ARGB32_Premultiplied);
HICON icon = qt_pixmapToWinHICON(QPixmap::fromImage(imageFromFile));
@@ -1036,7 +1023,9 @@ void tst_QPixmap::fromWinHICON()
QImage imageFromHICON = qt_pixmapFromWinHICON(icon).toImage();
DestroyIcon(icon);
- QImage imageFromFile(image + QString(QLatin1String("_%1x%2.png")).arg(width).arg(height));
+ const QString fileName = image + QLatin1Char('_') + QString::number(width) + QLatin1Char('x')
+ + QString::number(height) + QLatin1String(".png");
+ QImage imageFromFile(fileName);
imageFromFile = imageFromFile.convertToFormat(QImage::Format_ARGB32_Premultiplied);
// fuzzy comparison must be used, as the pixel values change slightly during conversion
diff --git a/tests/auto/gui/image/qpixmapcache/qpixmapcache.pro b/tests/auto/gui/image/qpixmapcache/qpixmapcache.pro
index a81712ba23..fe3b5a2db3 100644
--- a/tests/auto/gui/image/qpixmapcache/qpixmapcache.pro
+++ b/tests/auto/gui/image/qpixmapcache/qpixmapcache.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpixmapcache
QT += gui-private testlib
SOURCES += tst_qpixmapcache.cpp
diff --git a/tests/auto/gui/image/qpixmapcache/tst_qpixmapcache.cpp b/tests/auto/gui/image/qpixmapcache/tst_qpixmapcache.cpp
index a3cf66da18..d1f76e8742 100644
--- a/tests/auto/gui/image/qpixmapcache/tst_qpixmapcache.cpp
+++ b/tests/auto/gui/image/qpixmapcache/tst_qpixmapcache.cpp
@@ -147,7 +147,7 @@ void tst_QPixmapCache::setCacheLimit()
QVERIFY(QPixmapCache::find(key, p1) == 0);
QPixmapCache::setCacheLimit(1000);
key = QPixmapCache::insert(*p1);
- QCOMPARE(getPrivate(key)->isValid, true);
+ QVERIFY(key.isValid());
QCOMPARE(getPrivate(key)->key, 1);
delete p1;
@@ -189,7 +189,7 @@ void tst_QPixmapCache::setCacheLimit()
key2 = QPixmapCache::insert(*p1);
QCOMPARE(getPrivate(key2)->key, 1);
//This old key is not valid anymore after the flush
- QCOMPARE(getPrivate(key)->isValid, false);
+ QVERIFY(!key.isValid());
QVERIFY(QPixmapCache::find(key, &p2) == 0);
delete p1;
}
@@ -233,7 +233,7 @@ void tst_QPixmapCache::find()
//at that time the first key has been erase because no more place in the cache
QVERIFY(QPixmapCache::find(key, &p1) == 0);
- QCOMPARE(getPrivate(key)->isValid, false);
+ QVERIFY(!key.isValid());
}
void tst_QPixmapCache::insert()
@@ -313,7 +313,7 @@ void tst_QPixmapCache::replace()
p2.fill(Qt::yellow);
QPixmapCache::Key key = QPixmapCache::insert(p1);
- QCOMPARE(getPrivate(key)->isValid, true);
+ QVERIFY(key.isValid());
QPixmap p3;
QVERIFY(QPixmapCache::find(key, &p3) == 1);
@@ -321,7 +321,7 @@ void tst_QPixmapCache::replace()
QPixmapCache::replace(key, p2);
QVERIFY(QPixmapCache::find(key, &p3) == 1);
- QCOMPARE(getPrivate(key)->isValid, true);
+ QVERIFY(key.isValid());
QCOMPARE(getPrivate(key)->key, 1);
QCOMPARE(p3.width(), 10);
@@ -438,7 +438,7 @@ void tst_QPixmapCache::clear()
for (int k = 0; k < numberOfKeys; ++k) {
QVERIFY(QPixmapCache::find(keys.at(k), &p1) == 0);
- QCOMPARE(getPrivate(keys[k])->isValid, false);
+ QVERIFY(!keys[k].isValid());
}
}
diff --git a/tests/auto/gui/itemmodels/qstandarditem/qstandarditem.pro b/tests/auto/gui/itemmodels/qstandarditem/qstandarditem.pro
index b85d475e97..50426612dc 100644
--- a/tests/auto/gui/itemmodels/qstandarditem/qstandarditem.pro
+++ b/tests/auto/gui/itemmodels/qstandarditem/qstandarditem.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qstandarditem
QT += testlib
SOURCES += tst_qstandarditem.cpp
diff --git a/tests/auto/gui/itemmodels/qstandarditem/tst_qstandarditem.cpp b/tests/auto/gui/itemmodels/qstandarditem/tst_qstandarditem.cpp
index ff263c166a..418b609189 100644
--- a/tests/auto/gui/itemmodels/qstandarditem/tst_qstandarditem.cpp
+++ b/tests/auto/gui/itemmodels/qstandarditem/tst_qstandarditem.cpp
@@ -40,14 +40,6 @@ class tst_QStandardItem : public QObject
{
Q_OBJECT
-public:
- tst_QStandardItem();
- virtual ~tst_QStandardItem();
-
-public slots:
- void init();
- void cleanup();
-
private slots:
void ctor();
void textCtor();
@@ -84,22 +76,6 @@ private slots:
void lessThan();
};
-tst_QStandardItem::tst_QStandardItem()
-{
-}
-
-tst_QStandardItem::~tst_QStandardItem()
-{
-}
-
-void tst_QStandardItem::init()
-{
-}
-
-void tst_QStandardItem::cleanup()
-{
-}
-
void tst_QStandardItem::ctor()
{
QStandardItem item;
@@ -140,7 +116,8 @@ void tst_QStandardItem::getSetData()
QStandardItem item;
for (int x = 0; x < 2; ++x) {
for (int i = 1; i <= 2; ++i) {
- QString text = QString("text %0").arg(i);
+ const QString iS = QString::number(i);
+ QString text = QLatin1String("text ") + iS;
item.setText(text);
QCOMPARE(item.text(), text);
@@ -150,15 +127,15 @@ void tst_QStandardItem::getSetData()
item.setIcon(icon);
QCOMPARE(item.icon(), icon);
- QString toolTip = QString("toolTip %0").arg(i);
+ QString toolTip = QLatin1String("toolTip ") + iS;
item.setToolTip(toolTip);
QCOMPARE(item.toolTip(), toolTip);
- QString statusTip = QString("statusTip %0").arg(i);
+ QString statusTip = QLatin1String("statusTip ") + iS;
item.setStatusTip(statusTip);
QCOMPARE(item.statusTip(), statusTip);
- QString whatsThis = QString("whatsThis %0").arg(i);
+ QString whatsThis = QLatin1String("whatsThis ") + iS;
item.setWhatsThis(whatsThis);
QCOMPARE(item.whatsThis(), whatsThis);
@@ -188,11 +165,11 @@ void tst_QStandardItem::getSetData()
item.setCheckState(checkState);
QCOMPARE(item.checkState(), checkState);
- QString accessibleText = QString("accessibleText %0").arg(i);
+ QString accessibleText = QLatin1String("accessibleText ") + iS;
item.setAccessibleText(accessibleText);
QCOMPARE(item.accessibleText(), accessibleText);
- QString accessibleDescription = QString("accessibleDescription %0").arg(i);
+ QString accessibleDescription = QLatin1String("accessibleDescription ") + iS;
item.setAccessibleDescription(accessibleDescription);
QCOMPARE(item.accessibleDescription(), accessibleDescription);
diff --git a/tests/auto/gui/itemmodels/qstandarditemmodel/qstandarditemmodel.pro b/tests/auto/gui/itemmodels/qstandarditemmodel/qstandarditemmodel.pro
index 71ef4acb88..eef165d9f7 100644
--- a/tests/auto/gui/itemmodels/qstandarditemmodel/qstandarditemmodel.pro
+++ b/tests/auto/gui/itemmodels/qstandarditemmodel/qstandarditemmodel.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qstandarditemmodel
QT += widgets widgets-private testlib
diff --git a/tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp b/tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp
index ae47b2053b..1e866c2324 100644
--- a/tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp
+++ b/tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp
@@ -44,7 +44,6 @@ class tst_QStandardItemModel : public QObject
public:
tst_QStandardItemModel();
- virtual ~tst_QStandardItemModel();
enum ModelChanged {
RowsAboutToBeInserted,
@@ -151,10 +150,8 @@ Q_DECLARE_METATYPE(Qt::Orientation)
tst_QStandardItemModel::tst_QStandardItemModel() : m_model(0), rcParent(8), rcFirst(8,0), rcLast(8,0)
{
-}
-
-tst_QStandardItemModel::~tst_QStandardItemModel()
-{
+ qRegisterMetaType<QStandardItem*>("QStandardItem*");
+ qRegisterMetaType<Qt::Orientation>("Qt::Orientation");
}
/*
@@ -169,9 +166,6 @@ tst_QStandardItemModel::~tst_QStandardItemModel()
*/
void tst_QStandardItemModel::init()
{
- qRegisterMetaType<QStandardItem*>("QStandardItem*");
- qRegisterMetaType<Qt::Orientation>("Qt::Orientation");
-
m_model = new QStandardItemModel(defaultSize, defaultSize);
connect(m_model, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)),
this, SLOT(rowsAboutToBeInserted(QModelIndex,int,int)));
@@ -256,7 +250,7 @@ void tst_QStandardItemModel::insertRow()
QCOMPARE(rcLast[RowsInserted], expectedRow);
//check that the inserted item has different DisplayRole than initial items
- QVERIFY(m_model->data(m_model->index(expectedRow, 0), Qt::DisplayRole).toString() != "initialitem");
+ QVERIFY(m_model->data(m_model->index(expectedRow, 0), Qt::DisplayRole).toString() != QLatin1String("initialitem"));
} else {
// We inserted something outside the bounds, do nothing
QCOMPARE(m_model->rowCount(), defaultSize);
@@ -300,7 +294,7 @@ void tst_QStandardItemModel::insertRowsItems()
QStandardItemModel *m = qobject_cast<QStandardItemModel*>(m_model);
QStandardItem *hiddenRoot = m->invisibleRootItem();
for (int i = 0; i < 3; ++i)
- items.append(new QStandardItem(QString("%1").arg(i + 10)));
+ items.append(new QStandardItem(QString::number(i + 10)));
hiddenRoot->appendRows(items);
QCOMPARE(m_model->rowCount(), rowCount + 3);
QCOMPARE(m_model->index(rowCount + 0, 0).data().toInt(), 10);
@@ -365,7 +359,7 @@ void tst_QStandardItemModel::insertColumn()
QCOMPARE(rcLast[ColumnsInserted], expectedColumn);
//check that the inserted item has different DisplayRole than initial items
- QVERIFY(m_model->data(m_model->index(0, expectedColumn), Qt::DisplayRole).toString() != "initialitem");
+ QVERIFY(m_model->data(m_model->index(0, expectedColumn), Qt::DisplayRole).toString() != QLatin1String("initialitem"));
} else {
// We inserted something outside the bounds, do nothing
QCOMPARE(m_model->columnCount(), defaultSize);
@@ -729,8 +723,8 @@ void tst_QStandardItemModel::data()
}
}
- QVERIFY(m_model->data(m_model->index(0, 0), Qt::DisplayRole).toString() == "initialitem");
- QVERIFY(m_model->data(m_model->index(0, 0), Qt::ToolTipRole).toString() == "tooltip");
+ QCOMPARE(m_model->data(m_model->index(0, 0), Qt::DisplayRole).toString(), QLatin1String("initialitem"));
+ QCOMPARE(m_model->data(m_model->index(0, 0), Qt::ToolTipRole).toString(), QLatin1String("tooltip"));
}
@@ -874,7 +868,7 @@ void tst_QStandardItemModel::sort_data()
<< "zulu");
QStringList list;
for (int i=1000; i < 2000; ++i)
- list.append(QString("Number: %1").arg(i));
+ list.append(QStringLiteral("Number: ") + QString::number(i));
QTest::newRow("large set ascending") << static_cast<int>(Qt::AscendingOrder) << list << list;
}
@@ -1336,7 +1330,7 @@ void tst_QStandardItemModel::useCase3()
// create the tree structure first
QStandardItem *childItem = 0;
for (int i = 0; i < 100; ++i) {
- QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
+ QStandardItem *item = new QStandardItem(QStringLiteral("item ") + QString::number(i));
if (childItem)
item->appendRow(childItem);
childItem = item;
@@ -1466,55 +1460,48 @@ struct FriendlyTreeView : public QTreeView
#endif
#ifdef QT_BUILD_INTERNAL
-void tst_QStandardItemModel::treeDragAndDrop()
-{
- const int nRow = 5;
- const int nCol = 3;
-
- QStandardItemModel model;
- QStandardItemModel checkModel;
+static void populateDragAndDropModel(QStandardItemModel &model, int nRow, int nCol)
+{
+ const QString item = QStringLiteral("item ");
+ const QString dash = QStringLiteral(" - ");
for (int i = 0; i < nRow; ++i) {
+ const QString iS = QString::number(i);
QList<QStandardItem *> colItems1;
for (int c = 0 ; c < nCol; c ++)
- colItems1 << new QStandardItem(QString("item %1 - %0").arg(c).arg(i));
+ colItems1 << new QStandardItem(item + iS + dash + QString::number(c));
model.appendRow(colItems1);
for (int j = 0; j < nRow; ++j) {
+ const QString jS = QString::number(j);
QList<QStandardItem *> colItems2;
for (int c = 0 ; c < nCol; c ++)
- colItems2 << new QStandardItem(QString("item %1/%2 - %0").arg(c).arg(i).arg(j));
+ colItems2 << new QStandardItem(item + iS + QLatin1Char('/') + jS + dash + QString::number(c));
colItems1.at(0)->appendRow(colItems2);
for (int k = 0; k < nRow; ++k) {
QList<QStandardItem *> colItems3;
+ const QString kS = QString::number(k);
for (int c = 0 ; c < nCol; c ++)
- colItems3 << new QStandardItem(QString("item %1/%2/%3 - %0").arg(c).arg(i).arg(j).arg(k));
+ colItems3 << new QStandardItem(item + iS + QLatin1Char('/') + jS
+ + QLatin1Char('/') + kS
+ + dash + QString::number(c));
colItems2.at(0)->appendRow(colItems3);
}
}
}
+}
- for (int i = 0; i < nRow; ++i) {
- QList<QStandardItem *> colItems1;
- for (int c = 0 ; c < nCol; c ++)
- colItems1 << new QStandardItem(QString("item %1 - %0").arg(c).arg(i));
- checkModel.appendRow(colItems1);
+void tst_QStandardItemModel::treeDragAndDrop()
+{
+ const int nRow = 5;
+ const int nCol = 3;
- for (int j = 0; j < nRow; ++j) {
- QList<QStandardItem *> colItems2;
- for (int c = 0 ; c < nCol; c ++)
- colItems2 << new QStandardItem(QString("item %1/%2 - %0").arg(c).arg(i).arg(j));
- colItems1.at(0)->appendRow(colItems2);
+ QStandardItemModel model;
+ QStandardItemModel checkModel;
- for (int k = 0; k < nRow; ++k) {
- QList<QStandardItem *> colItems3;
- for (int c = 0 ; c < nCol; c ++)
- colItems3 << new QStandardItem(QString("item %1/%2/%3 - %0").arg(c).arg(i).arg(j).arg(k));
- colItems2.at(0)->appendRow(colItems3);
- }
- }
- }
+ populateDragAndDropModel(model, nRow, nCol);
+ populateDragAndDropModel(checkModel, nRow, nCol);
QVERIFY(compareModels(&model, &checkModel));
@@ -1613,14 +1600,14 @@ void tst_QStandardItemModel::removeRowsAndColumns()
#define VERIFY_MODEL \
for (int c = 0; c < col_list.count(); c++) \
for (int r = 0; r < row_list.count(); r++) \
- QCOMPARE(model.item(r,c)->text() , row_list[r] + "x" + col_list[c]);
+ QCOMPARE(model.item(r,c)->text() , row_list[r] + QLatin1Char('x') + col_list[c]);
QVector<QString> row_list = QString("1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20").split(',').toVector();
QVector<QString> col_list = row_list;
QStandardItemModel model;
for (int c = 0; c < col_list.count(); c++)
for (int r = 0; r < row_list.count(); r++)
- model.setItem(r, c, new QStandardItem(row_list[r] + "x" + col_list[c]));
+ model.setItem(r, c, new QStandardItem(row_list[r] + QLatin1Char('x') + col_list[c]));
VERIFY_MODEL
row_list.remove(3);
@@ -1642,14 +1629,14 @@ void tst_QStandardItemModel::removeRowsAndColumns()
QList<QStandardItem *> row_taken = model.takeRow(6);
QCOMPARE(row_taken.count(), col_list.count());
for (int c = 0; c < col_list.count(); c++)
- QCOMPARE(row_taken[c]->text() , row_list[6] + "x" + col_list[c]);
+ QCOMPARE(row_taken[c]->text() , row_list[6] + QLatin1Char('x') + col_list[c]);
row_list.remove(6);
VERIFY_MODEL
QList<QStandardItem *> col_taken = model.takeColumn(10);
QCOMPARE(col_taken.count(), row_list.count());
for (int r = 0; r < row_list.count(); r++)
- QCOMPARE(col_taken[r]->text() , row_list[r] + "x" + col_list[10]);
+ QCOMPARE(col_taken[r]->text() , row_list[r] + QLatin1Char('x') + col_list[10]);
col_list.remove(10);
VERIFY_MODEL
}
@@ -1661,7 +1648,7 @@ void tst_QStandardItemModel::itemRoleNames()
QStandardItemModel model;
for (int c = 0; c < col_list.count(); c++)
for (int r = 0; r < row_list.count(); r++)
- model.setItem(r, c, new QStandardItem(row_list[r] + "x" + col_list[c]));
+ model.setItem(r, c, new QStandardItem(row_list[r] + QLatin1Char('x') + col_list[c]));
VERIFY_MODEL
QHash<int, QByteArray> newRoleNames;
diff --git a/tests/auto/gui/kernel/noqteventloop/tst_noqteventloop.cpp b/tests/auto/gui/kernel/noqteventloop/tst_noqteventloop.cpp
index d21569dcc0..0257a50924 100644
--- a/tests/auto/gui/kernel/noqteventloop/tst_noqteventloop.cpp
+++ b/tests/auto/gui/kernel/noqteventloop/tst_noqteventloop.cpp
@@ -44,20 +44,10 @@ class tst_NoQtEventLoop : public QObject
Q_OBJECT
private slots:
- void initTestCase();
- void cleanup();
void consumeMouseEvents();
};
-void tst_NoQtEventLoop::initTestCase()
-{
-}
-
-void tst_NoQtEventLoop::cleanup()
-{
-}
-
class Window : public QWindow
{
public:
diff --git a/tests/auto/gui/kernel/qdrag/qdrag.pro b/tests/auto/gui/kernel/qdrag/qdrag.pro
index d4a7bc2705..ac3fde8028 100644
--- a/tests/auto/gui/kernel/qdrag/qdrag.pro
+++ b/tests/auto/gui/kernel/qdrag/qdrag.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qdrag
QT += testlib
SOURCES += tst_qdrag.cpp
diff --git a/tests/auto/gui/kernel/qevent/qevent.pro b/tests/auto/gui/kernel/qevent/qevent.pro
index 09d4395f4d..2959089ce3 100644
--- a/tests/auto/gui/kernel/qevent/qevent.pro
+++ b/tests/auto/gui/kernel/qevent/qevent.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qevent
SOURCES += tst_qevent.cpp
QT = core testlib
-CONFIG += parallel_test
diff --git a/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp b/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp
index d18f9664fc..ea8f594f9c 100644
--- a/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp
+++ b/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp
@@ -63,6 +63,7 @@ private slots:
void initTestCase();
void cleanup();
void displayName();
+ void desktopFileName();
void firstWindowTitle();
void windowIcon();
void focusObject();
@@ -117,6 +118,21 @@ void tst_QGuiApplication::displayName()
QCOMPARE(QGuiApplication::applicationDisplayName(), QString::fromLatin1("The GUI Application"));
}
+void tst_QGuiApplication::desktopFileName()
+{
+ int argc = 1;
+ char *argv[] = { const_cast<char*>("tst_qguiapplication") };
+ QGuiApplication app(argc, argv);
+
+ QCOMPARE(QGuiApplication::desktopFileName(), QString());
+
+ QGuiApplication::setDesktopFileName("io.qt.QGuiApplication.desktop");
+ QCOMPARE(QGuiApplication::desktopFileName(), QString::fromLatin1("io.qt.QGuiApplication.desktop"));
+
+ QGuiApplication::setDesktopFileName(QString());
+ QCOMPARE(QGuiApplication::desktopFileName(), QString());
+}
+
void tst_QGuiApplication::firstWindowTitle()
{
int argc = 3;
diff --git a/tests/auto/gui/kernel/qguimetatype/qguimetatype.pro b/tests/auto/gui/kernel/qguimetatype/qguimetatype.pro
index 914142404b..331295bab9 100644
--- a/tests/auto/gui/kernel/qguimetatype/qguimetatype.pro
+++ b/tests/auto/gui/kernel/qguimetatype/qguimetatype.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qguimetatype
SOURCES += tst_qguimetatype.cpp
QT = core gui testlib
-CONFIG += parallel_test
diff --git a/tests/auto/gui/kernel/qguitimer/qguitimer.pro b/tests/auto/gui/kernel/qguitimer/qguitimer.pro
index 15793d6e70..8a71e48007 100644
--- a/tests/auto/gui/kernel/qguitimer/qguitimer.pro
+++ b/tests/auto/gui/kernel/qguitimer/qguitimer.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qguitimer
QT = core gui testlib
SOURCES += ../../../corelib/kernel/qtimer/tst_qtimer.cpp
diff --git a/tests/auto/gui/kernel/qguivariant/no_application/no_application.pro b/tests/auto/gui/kernel/qguivariant/no_application/no_application.pro
index cc72c225a3..ada3817e55 100644
--- a/tests/auto/gui/kernel/qguivariant/no_application/no_application.pro
+++ b/tests/auto/gui/kernel/qguivariant/no_application/no_application.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = no_application
SOURCES += main.cpp
QT += testlib
diff --git a/tests/auto/gui/kernel/qguivariant/test/test.pro b/tests/auto/gui/kernel/qguivariant/test/test.pro
index c4123797d2..39e4b3b71f 100644
--- a/tests/auto/gui/kernel/qguivariant/test/test.pro
+++ b/tests/auto/gui/kernel/qguivariant/test/test.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qguivariant
SOURCES += tst_qguivariant.cpp
RESOURCES = tst_qguivariant.qrc
diff --git a/tests/auto/gui/kernel/qguivariant/test/tst_qguivariant.cpp b/tests/auto/gui/kernel/qguivariant/test/tst_qguivariant.cpp
index 0a704b9f64..c45342cc06 100644
--- a/tests/auto/gui/kernel/qguivariant/test/tst_qguivariant.cpp
+++ b/tests/auto/gui/kernel/qguivariant/test/tst_qguivariant.cpp
@@ -390,7 +390,7 @@ void tst_QGuiVariant::toString_data()
#ifndef Q_OS_MAC
<< QString( "Ctrl+A" );
#else
- << QString(QChar(0x2318)) + "A";
+ << QString(QChar(0x2318)) + QLatin1Char('A');
#endif
QFont font( "times", 12 );
diff --git a/tests/auto/gui/kernel/qkeysequence/qkeysequence.pro b/tests/auto/gui/kernel/qkeysequence/qkeysequence.pro
index 7c1e8d52de..9f79fe9ab7 100644
--- a/tests/auto/gui/kernel/qkeysequence/qkeysequence.pro
+++ b/tests/auto/gui/kernel/qkeysequence/qkeysequence.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qkeysequence
QT += testlib
@@ -8,4 +7,3 @@ QT += core-private gui-private
SOURCES += tst_qkeysequence.cpp
RESOURCES += qkeysequence.qrc
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp b/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp
index 3fcbd0a16f..84680fb7a6 100644
--- a/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp
+++ b/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp
@@ -250,7 +250,7 @@ void tst_QKeySequence::operatorQString()
seq = QKeySequence( modifiers | keycode );
- QCOMPARE( (QString)seq, keystring );
+ QCOMPARE( seq.toString(QKeySequence::NativeText), keystring );
}
// this verifies that the constructors can handle the same strings in and out
@@ -260,7 +260,7 @@ void tst_QKeySequence::symetricConstructors()
QFETCH( int, keycode );
QKeySequence seq1( modifiers | keycode );
- QKeySequence seq2( (QString)seq1 );
+ QKeySequence seq2( seq1.toString(QKeySequence::NativeText) );
QVERIFY( seq1 == seq2 );
}
diff --git a/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp b/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp
index e6aa579ecd..e44f9c7da2 100644
--- a/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp
+++ b/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp
@@ -75,16 +75,10 @@ class tst_QMouseEvent : public QObject
{
Q_OBJECT
-public:
- tst_QMouseEvent();
- virtual ~tst_QMouseEvent();
-
-
public slots:
void initTestCase();
void cleanupTestCase();
void init();
- void cleanup();
private slots:
void checkMousePressEvent_data();
void checkMousePressEvent();
@@ -95,17 +89,6 @@ private:
MouseEventWidget* testMouseWidget;
};
-
-
-tst_QMouseEvent::tst_QMouseEvent()
-{
-}
-
-tst_QMouseEvent::~tst_QMouseEvent()
-{
-
-}
-
void tst_QMouseEvent::initTestCase()
{
testMouseWidget = new MouseEventWidget(0);
@@ -129,10 +112,6 @@ void tst_QMouseEvent::init()
testMouseWidget->mouseReleaseModifiers = 0;
}
-void tst_QMouseEvent::cleanup()
-{
-}
-
void tst_QMouseEvent::checkMousePressEvent_data()
{
QTest::addColumn<int>("buttonPressed");
diff --git a/tests/auto/gui/kernel/qmouseevent_modal/tst_qmouseevent_modal.cpp b/tests/auto/gui/kernel/qmouseevent_modal/tst_qmouseevent_modal.cpp
index 4fae6fa096..ecf7a6a248 100644
--- a/tests/auto/gui/kernel/qmouseevent_modal/tst_qmouseevent_modal.cpp
+++ b/tests/auto/gui/kernel/qmouseevent_modal/tst_qmouseevent_modal.cpp
@@ -51,17 +51,9 @@ class tst_qmouseevent_modal : public QObject
{
Q_OBJECT
-public:
- tst_qmouseevent_modal();
- virtual ~tst_qmouseevent_modal();
-
-
-public slots:
+private slots:
void initTestCase();
void cleanupTestCase();
- void init();
- void cleanup();
-private slots:
void mousePressRelease();
private:
@@ -97,14 +89,6 @@ private:
int c;
};
-tst_qmouseevent_modal::tst_qmouseevent_modal()
-{
-}
-
-tst_qmouseevent_modal::~tst_qmouseevent_modal()
-{
-}
-
void tst_qmouseevent_modal::initTestCase()
{
w = new TstWidget;
@@ -117,14 +101,6 @@ void tst_qmouseevent_modal::cleanupTestCase()
w = 0;
}
-void tst_qmouseevent_modal::init()
-{
-}
-
-void tst_qmouseevent_modal::cleanup()
-{
-}
-
/*
Test for task 22500
*/
diff --git a/tests/auto/gui/kernel/qopenglwindow/qopenglwindow.pro b/tests/auto/gui/kernel/qopenglwindow/qopenglwindow.pro
index 43a62b4811..d09af5084b 100644
--- a/tests/auto/gui/kernel/qopenglwindow/qopenglwindow.pro
+++ b/tests/auto/gui/kernel/qopenglwindow/qopenglwindow.pro
@@ -5,4 +5,4 @@ QT += core-private gui-private testlib
SOURCES += tst_qopenglwindow.cpp
-win32:CONFIG+=insignificant_test # QTBUG-28264
+win32:CONFIG+=insignificant_test # QTBUG-46452, QTBUG-49630
diff --git a/tests/auto/gui/kernel/qpalette/qpalette.pro b/tests/auto/gui/kernel/qpalette/qpalette.pro
index de87e8fafe..9dd3f3e715 100644
--- a/tests/auto/gui/kernel/qpalette/qpalette.pro
+++ b/tests/auto/gui/kernel/qpalette/qpalette.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpalette
QT += testlib
SOURCES += tst_qpalette.cpp
diff --git a/tests/auto/gui/kernel/qscreen/qscreen.pro b/tests/auto/gui/kernel/qscreen/qscreen.pro
index b2c98a9dfd..b631f4cf37 100644
--- a/tests/auto/gui/kernel/qscreen/qscreen.pro
+++ b/tests/auto/gui/kernel/qscreen/qscreen.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qscreen
QT += core-private gui-private testlib
diff --git a/tests/auto/gui/kernel/qsurfaceformat/qsurfaceformat.pro b/tests/auto/gui/kernel/qsurfaceformat/qsurfaceformat.pro
index 9a705f443e..97d9d69fb7 100644
--- a/tests/auto/gui/kernel/qsurfaceformat/qsurfaceformat.pro
+++ b/tests/auto/gui/kernel/qsurfaceformat/qsurfaceformat.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsurfaceformat
QT += core-private gui-private testlib
diff --git a/tests/auto/gui/kernel/qwindow/BLACKLIST b/tests/auto/gui/kernel/qwindow/BLACKLIST
index ee9709e68b..774c22a8e9 100644
--- a/tests/auto/gui/kernel/qwindow/BLACKLIST
+++ b/tests/auto/gui/kernel/qwindow/BLACKLIST
@@ -4,3 +4,5 @@ ubuntu-14.04
ubuntu-14.04
[modalWithChildWindow]
ubuntu-14.04
+[setVisible]
+ubuntu-14.04
diff --git a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
index a89f0da4d2..d764b88ef7 100644
--- a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
+++ b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
@@ -58,12 +58,17 @@ class tst_QWindow: public QObject
Q_OBJECT
private slots:
+ void create();
+ void setParent();
+ void setVisible();
void eventOrderOnShow();
void resizeEventAfterResize();
void mapGlobal();
void positioning_data();
void positioning();
void positioningDuringMinimized();
+ void childWindowPositioning_data();
+ void childWindowPositioning();
void platformSurface();
void isExposed();
void isActive();
@@ -126,6 +131,111 @@ void tst_QWindow::cleanup()
QVERIFY(QGuiApplication::allWindows().isEmpty());
}
+void tst_QWindow::create()
+{
+ QWindow a;
+ QVERIFY2(!a.handle(), "QWindow should lazy init the platform window");
+
+ a.create();
+ QVERIFY2(a.handle(), "Explicitly creating a platform window should never fail");
+
+ QWindow b;
+ QWindow c(&b);
+ b.create();
+ QVERIFY(b.handle());
+ QVERIFY2(!c.handle(), "Creating a parent window should not automatically create children");
+
+ QWindow d;
+ QWindow e(&d);
+ e.create();
+ QVERIFY(e.handle());
+ QVERIFY2(d.handle(), "Creating a child window should automatically create parents");
+
+ QWindow f;
+ QWindow g(&f);
+ f.create();
+ QVERIFY(f.handle());
+ QPlatformWindow *platformWindow = f.handle();
+ g.create();
+ QVERIFY(g.handle());
+ QVERIFY2(f.handle() == platformWindow, "Creating a child window should not affect parent if already created");
+}
+
+void tst_QWindow::setParent()
+{
+ QWindow a;
+ QWindow b(&a);
+ QVERIFY2(b.parent() == &a, "Setting parent at construction time should work");
+ QVERIFY2(a.children().contains(&b), "Parent should have child in list of children");
+
+ QWindow c;
+ QWindow d;
+ d.setParent(&c);
+ QVERIFY2(d.parent() == &c, "Setting parent after construction should work");
+ QVERIFY2(c.children().contains(&d), "Parent should have child in list of children");
+
+ a.create();
+ b.setParent(0);
+ QVERIFY2(!b.handle(), "Making window top level shouild not automatically create it");
+
+ QWindow e;
+ c.create();
+ e.setParent(&c);
+ QVERIFY2(!e.handle(), "Making window a child of a created window should not automatically create it");
+
+ QWindow f;
+ QWindow g;
+ g.create();
+ QVERIFY(g.handle());
+ g.setParent(&f);
+ QVERIFY2(f.handle(), "Making a created window a child of a non-created window should automatically create it");
+}
+
+void tst_QWindow::setVisible()
+{
+ QWindow a;
+ QWindow b(&a);
+ a.setVisible(true);
+ QVERIFY2(!b.handle(), "Making a top level window visible doesn't create its children");
+ QVERIFY2(!b.isVisible(), "Making a top level window visible doesn't make its children visible");
+ QVERIFY(QTest::qWaitForWindowExposed(&a));
+
+ QWindow c;
+ QWindow d(&c);
+ d.setVisible(true);
+ QVERIFY2(!c.handle(), "Making a child window visible doesn't create parent window if parent is hidden");
+ QVERIFY2(!c.isVisible(), "Making a child window visible doesn't make its parent visible");
+
+ QVERIFY2(!d.handle(), "Making a child window visible doesn't create platform window if parent is hidden");
+
+ c.create();
+ QVERIFY(c.handle());
+ QVERIFY2(d.handle(), "Creating a parent window should automatically create children if they are visible");
+ QVERIFY2(!c.isVisible(), "Creating a parent window should not make it visible just because it has visible children");
+
+ QWindow e;
+ QWindow f(&e);
+ f.setVisible(true);
+ QVERIFY(!f.handle());
+ QVERIFY(!e.handle());
+ f.setParent(0);
+ QVERIFY2(f.handle(), "Making a visible but not created child window top level should create it");
+ QVERIFY(QTest::qWaitForWindowExposed(&f));
+
+ QWindow g;
+ QWindow h;
+ QWindow i(&g);
+ i.setVisible(true);
+ h.setVisible(true);
+ QVERIFY(QTest::qWaitForWindowExposed(&h));
+ QVERIFY(!i.handle());
+ QVERIFY(!g.handle());
+ QVERIFY(h.handle());
+ i.setParent(&h);
+ QVERIFY2(i.handle(), "Making a visible but not created child window child of a created window should create it");
+ QVERIFY(QTest::qWaitForWindowExposed(&i));
+}
+
void tst_QWindow::mapGlobal()
{
QWindow a;
@@ -214,6 +324,19 @@ private:
QPlatformSurfaceEvent::SurfaceEventType m_surfaceventType;
};
+class ColoredWindow : public QRasterWindow {
+public:
+ explicit ColoredWindow(const QColor &color, QWindow *parent = 0) : QRasterWindow(parent), m_color(color) {}
+ void paintEvent(QPaintEvent *) Q_DECL_OVERRIDE
+ {
+ QPainter p(this);
+ p.fillRect(QRect(QPoint(0, 0), size()), m_color);
+ }
+
+private:
+ const QColor m_color;
+};
+
void tst_QWindow::eventOrderOnShow()
{
// Some platforms enforce minimum widths for windows, which can cause extra resize
@@ -249,12 +372,7 @@ void tst_QWindow::resizeEventAfterResize()
// Make sure we get a resizeEvent after calling resize
window.resize(m_testWindowSize);
-#if defined(Q_OS_BLACKBERRY) // "window" is the "root" window and will always be shown fullscreen
- // so we only expect one resize event
- QTRY_COMPARE(window.received(QEvent::Resize), 1);
-#else
QTRY_COMPARE(window.received(QEvent::Resize), 2);
-#endif
}
void tst_QWindow::positioning_data()
@@ -338,21 +456,15 @@ void tst_QWindow::positioning()
window.reset();
window.setWindowState(Qt::WindowFullScreen);
QCoreApplication::processEvents();
- // On BB10 the window is the root window and fullscreen, so nothing is resized.
-#if !defined(Q_OS_BLACKBERRY)
- QTRY_VERIFY(window.received(QEvent::Resize) > 0);
-#endif
+ QTRY_VERIFY(window.received(QEvent::Resize) > 0);
QTest::qWait(2000);
window.reset();
window.setWindowState(Qt::WindowNoState);
QCoreApplication::processEvents();
- // On BB10 the window is the root window and fullscreen, so nothing is resized.
-#if !defined(Q_OS_BLACKBERRY)
- QTRY_VERIFY(window.received(QEvent::Resize) > 0);
-#endif
+ QTRY_VERIFY(window.received(QEvent::Resize) > 0);
QTest::qWait(2000);
QTRY_COMPARE(originalPos, window.position());
@@ -415,6 +527,61 @@ void tst_QWindow::positioningDuringMinimized()
QTRY_COMPARE(window.geometry(), newGeometry);
}
+void tst_QWindow::childWindowPositioning_data()
+{
+ QTest::addColumn<bool>("showInsteadOfCreate");
+
+ QTest::newRow("create") << false;
+ QTest::newRow("show") << true;
+}
+
+void tst_QWindow::childWindowPositioning()
+{
+ const QPoint topLeftOrigin(0, 0);
+
+ ColoredWindow topLevelWindowFirst(Qt::green);
+ topLevelWindowFirst.setObjectName("topLevelWindowFirst");
+ ColoredWindow childWindowAfter(Qt::yellow, &topLevelWindowFirst);
+ childWindowAfter.setObjectName("childWindowAfter");
+
+ topLevelWindowFirst.setFramePosition(m_availableTopLeft);
+ childWindowAfter.setFramePosition(topLeftOrigin);
+
+ ColoredWindow topLevelWindowAfter(Qt::green);
+ topLevelWindowAfter.setObjectName("topLevelWindowAfter");
+ ColoredWindow childWindowFirst(Qt::yellow, &topLevelWindowAfter);
+ childWindowFirst.setObjectName("childWindowFirst");
+
+ topLevelWindowAfter.setFramePosition(m_availableTopLeft);
+ childWindowFirst.setFramePosition(topLeftOrigin);
+
+ QFETCH(bool, showInsteadOfCreate);
+
+ QWindow* windows[] = { &topLevelWindowFirst, &childWindowAfter, &childWindowFirst, &topLevelWindowAfter, 0 };
+ for (int i = 0; windows[i]; ++i) {
+ QWindow *window = windows[i];
+ if (showInsteadOfCreate) {
+ window->showNormal();
+ } else {
+ window->create();
+ }
+ }
+
+ if (showInsteadOfCreate) {
+ QVERIFY(QTest::qWaitForWindowExposed(&topLevelWindowFirst));
+ QVERIFY(QTest::qWaitForWindowExposed(&topLevelWindowAfter));
+ }
+
+ // Creation order shouldn't affect the geometry
+ // Use try compare since on X11 the window manager may still re-position the window after expose
+ QTRY_COMPARE(topLevelWindowFirst.geometry(), topLevelWindowAfter.geometry());
+ QTRY_COMPARE(childWindowAfter.geometry(), childWindowFirst.geometry());
+
+ // Creation order shouldn't affect the child ending up at 0,0
+ QCOMPARE(childWindowFirst.framePosition(), topLeftOrigin);
+ QCOMPARE(childWindowAfter.framePosition(), topLeftOrigin);
+}
+
// QTBUG-49709: Verify that the normal geometry is correctly restored
// when executing a sequence of window state changes. So far, Windows
// only where state changes have immediate effect.
@@ -1565,12 +1732,7 @@ void tst_QWindow::initialSize()
Window w;
w.setWidth(m_testWindowSize.width());
w.showNormal();
-#if defined(Q_OS_BLACKBERRY) // "window" is the "root" window and will always be shown fullscreen
- // so we only expect one resize event
- QTRY_COMPARE(w.width(), qGuiApp->primaryScreen()->availableGeometry().width());
-#else
QTRY_COMPARE(w.width(), m_testWindowSize.width());
-#endif
QTRY_VERIFY(w.height() > 0);
}
{
@@ -1579,12 +1741,7 @@ void tst_QWindow::initialSize()
w.resize(testSize);
w.showNormal();
-#if defined(Q_OS_BLACKBERRY) // "window" is the "root" window and will always be shown fullscreen
- // so we only expect one resize event
- const QSize expectedSize = QGuiApplication::primaryScreen()->availableGeometry().size();
-#else
const QSize expectedSize = testSize;
-#endif
QTRY_COMPARE(w.size(), expectedSize);
}
}
@@ -1732,19 +1889,6 @@ void tst_QWindow::modalWindowPosition()
QCOMPARE(window.geometry(), origGeo);
}
-class ColoredWindow : public QRasterWindow {
-public:
- explicit ColoredWindow(const QColor &color, QWindow *parent = 0) : QRasterWindow(parent), m_color(color) {}
- void paintEvent(QPaintEvent *) Q_DECL_OVERRIDE
- {
- QPainter p(this);
- p.fillRect(QRect(QPoint(0, 0), size()), m_color);
- }
-
-private:
- const QColor m_color;
-};
-
static bool isNativeWindowVisible(const QWindow *window)
{
#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) && !defined(Q_OS_WINRT)
diff --git a/tests/auto/gui/math3d/qmatrixnxn/qmatrixnxn.pro b/tests/auto/gui/math3d/qmatrixnxn/qmatrixnxn.pro
index 3302535dda..1401619cd0 100644
--- a/tests/auto/gui/math3d/qmatrixnxn/qmatrixnxn.pro
+++ b/tests/auto/gui/math3d/qmatrixnxn/qmatrixnxn.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qmatrixnxn
SOURCES += tst_qmatrixnxn.cpp
QT += testlib
diff --git a/tests/auto/gui/math3d/qquaternion/qquaternion.pro b/tests/auto/gui/math3d/qquaternion/qquaternion.pro
index d20719fd11..f578a38580 100644
--- a/tests/auto/gui/math3d/qquaternion/qquaternion.pro
+++ b/tests/auto/gui/math3d/qquaternion/qquaternion.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qquaternion
SOURCES += tst_qquaternion.cpp
QT += testlib
diff --git a/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp b/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp
index 1fbad5b829..53d9a987a6 100644
--- a/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp
+++ b/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp
@@ -999,16 +999,16 @@ static QByteArray testnameForAxis(const QVector3D &axis)
testname = "null";
} else {
if (axis.x()) {
- testname += axis.x() < 0 ? "-" : "+";
- testname += "X";
+ testname += axis.x() < 0 ? '-' : '+';
+ testname += 'X';
}
if (axis.y()) {
- testname += axis.y() < 0 ? "-" : "+";
- testname += "Y";
+ testname += axis.y() < 0 ? '-' : '+';
+ testname += 'Y';
}
if (axis.z()) {
- testname += axis.z() < 0 ? "-" : "+";
- testname += "Z";
+ testname += axis.z() < 0 ? '-' : '+';
+ testname += 'Z';
}
}
return testname;
diff --git a/tests/auto/gui/math3d/qvectornd/qvectornd.pro b/tests/auto/gui/math3d/qvectornd/qvectornd.pro
index 9504b4a02b..9e5155aa6f 100644
--- a/tests/auto/gui/math3d/qvectornd/qvectornd.pro
+++ b/tests/auto/gui/math3d/qvectornd/qvectornd.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qvectornd
SOURCES += tst_qvectornd.cpp
QT += testlib
diff --git a/tests/auto/gui/painting/qbrush/qbrush.pro b/tests/auto/gui/painting/qbrush/qbrush.pro
index 0cb11398dc..5016267e66 100644
--- a/tests/auto/gui/painting/qbrush/qbrush.pro
+++ b/tests/auto/gui/painting/qbrush/qbrush.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qbrush
QT += testlib gui-private
SOURCES += tst_qbrush.cpp
diff --git a/tests/auto/gui/painting/qcolor/qcolor.pro b/tests/auto/gui/painting/qcolor/qcolor.pro
index 44d65bb50b..c8aab4ab75 100644
--- a/tests/auto/gui/painting/qcolor/qcolor.pro
+++ b/tests/auto/gui/painting/qcolor/qcolor.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qcolor
SOURCES += tst_qcolor.cpp
QT += testlib gui-private core-private
diff --git a/tests/auto/gui/painting/qpagelayout/qpagelayout.pro b/tests/auto/gui/painting/qpagelayout/qpagelayout.pro
index 38a1064357..21fc8e0bb7 100644
--- a/tests/auto/gui/painting/qpagelayout/qpagelayout.pro
+++ b/tests/auto/gui/painting/qpagelayout/qpagelayout.pro
@@ -1,9 +1,7 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpagelayout
SOURCES += tst_qpagelayout.cpp
QT += gui-private testlib
DEFINES += QT_USE_USING_NAMESPACE
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/gui/painting/qpagesize/qpagesize.pro b/tests/auto/gui/painting/qpagesize/qpagesize.pro
index 5836dc9ba0..5e1cdb64eb 100644
--- a/tests/auto/gui/painting/qpagesize/qpagesize.pro
+++ b/tests/auto/gui/painting/qpagesize/qpagesize.pro
@@ -1,9 +1,7 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpagesize
SOURCES += tst_qpagesize.cpp
QT += testlib
DEFINES += QT_USE_USING_NAMESPACE
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/gui/painting/qpaintengine/qpaintengine.pro b/tests/auto/gui/painting/qpaintengine/qpaintengine.pro
index 1cf79af0a7..810dd81311 100644
--- a/tests/auto/gui/painting/qpaintengine/qpaintengine.pro
+++ b/tests/auto/gui/painting/qpaintengine/qpaintengine.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpaintengine
SOURCES += tst_qpaintengine.cpp
QT += testlib
diff --git a/tests/auto/gui/painting/qpainter/qpainter.pro b/tests/auto/gui/painting/qpainter/qpainter.pro
index e90b516ef2..d4f1d43a74 100644
--- a/tests/auto/gui/painting/qpainter/qpainter.pro
+++ b/tests/auto/gui/painting/qpainter/qpainter.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpainter
QT += testlib gui-private core-private
@@ -9,7 +8,6 @@ SOURCES += tst_qpainter.cpp
TESTDATA += drawEllipse/* drawLine_rop_bitmap/* drawPixmap_rop/* drawPixmap_rop_bitmap/* \
task217400.png
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
android: !android-no-sdk {
RESOURCES += \
diff --git a/tests/auto/gui/painting/qpainter/tst_qpainter.cpp b/tests/auto/gui/painting/qpainter/tst_qpainter.cpp
index 1ed78fa0ef..266b1c2896 100644
--- a/tests/auto/gui/painting/qpainter/tst_qpainter.cpp
+++ b/tests/auto/gui/painting/qpainter/tst_qpainter.cpp
@@ -81,14 +81,9 @@ Q_OBJECT
public:
tst_QPainter();
- virtual ~tst_QPainter();
-
-public slots:
- void init();
- void cleanup();
- void cleanupTestCase();
private slots:
+ void cleanupTestCase();
void getSetCheck();
#ifndef QT_NO_WIDGETS
void drawPixmap_comp_data();
@@ -392,18 +387,6 @@ tst_QPainter::tst_QPainter()
QGuiApplication::setDesktopSettingsAware(true);
}
-tst_QPainter::~tst_QPainter()
-{
-}
-
-void tst_QPainter::init()
-{
-}
-
-void tst_QPainter::cleanup()
-{
-}
-
void tst_QPainter::cleanupTestCase()
{
QFile::remove(QLatin1String("dest.png"));
@@ -663,7 +646,7 @@ QColor tst_QPainter::baseColor( int k, int intensity )
QImage tst_QPainter::getResImage( const QString &dir, const QString &addition, const QString &extension )
{
QImage res;
- QString resFilename = dir + QString( "/res_%1." ).arg( addition ) + extension;
+ QString resFilename = dir + QLatin1String("/res_") + addition + QLatin1Char('.') + extension;
if ( !res.load( resFilename ) ) {
QWARN(QString("Could not load result data %s %1").arg(resFilename).toLatin1());
return QImage();
@@ -674,14 +657,14 @@ QImage tst_QPainter::getResImage( const QString &dir, const QString &addition, c
QBitmap tst_QPainter::getBitmap( const QString &dir, const QString &filename, bool mask )
{
QBitmap bm;
- QString bmFilename = dir + QString( "/%1.xbm" ).arg( filename );
+ QString bmFilename = dir + QLatin1Char('/') + filename + QLatin1String(".xbm");
if ( !bm.load( bmFilename ) ) {
QWARN(QString("Could not load bitmap '%1'").arg(bmFilename).toLatin1());
return QBitmap();
}
if ( mask ) {
QBitmap mask;
- QString maskFilename = dir + QString( "/%1-mask.xbm" ).arg( filename );
+ QString maskFilename = dir + QLatin1Char('/') + filename + QLatin1String("-mask.xbm");
if (!mask.load(maskFilename)) {
QWARN(QString("Could not load mask '%1'").arg(maskFilename).toLatin1());
return QBitmap();
@@ -1521,10 +1504,11 @@ void tst_QPainter::drawEllipse_data()
// ratio between width and hight is too large/small (task 114874). Those
// ratios are therefore currently avoided.
for (int w = 10; w < 128; w += 7) {
+ const QByteArray wB = QByteArray::number(w);
for (int h = w/2; h < qMin(2*w, 128); h += 13) {
- QString s = QString("%1x%2").arg(w).arg(h);
- QTest::newRow(QString("%1 with pen").arg(s).toLatin1()) << QSize(w, h) << true;
- QTest::newRow(QString("%1 no pen").arg(s).toLatin1()) << QSize(w, h) << false;
+ const QByteArray sB = wB + 'x' + QByteArray::number(h);
+ QTest::newRow((sB + " with pen").constData()) << QSize(w, h) << true;
+ QTest::newRow((sB + " no pen").constData()) << QSize(w, h) << false;
}
}
}
@@ -1562,16 +1546,17 @@ void tst_QPainter::drawClippedEllipse_data()
QTest::addColumn<QRect>("rect");
for (int w = 20; w < 128; w += 7) {
+ const QByteArray wB = QByteArray::number(w);
for (int h = w/2; h < qMin(2*w, 128); h += 13) {
- QString s = QString("%1x%2").arg(w).arg(h);
- QTest::newRow(QString("%1 top").arg(s).toLatin1()) << QRect(0, -h/2, w, h);
- QTest::newRow(QString("%1 topright").arg(s).toLatin1()) << QRect(w/2, -h/2, w, h);
- QTest::newRow(QString("%1 right").arg(s).toLatin1()) << QRect(w/2, 0, w, h);
- QTest::newRow(QString("%1 bottomright").arg(s).toLatin1()) << QRect(w/2, h/2, w, h);
- QTest::newRow(QString("%1 bottom").arg(s).toLatin1()) << QRect(0, h/2, w, h);
- QTest::newRow(QString("%1 bottomleft").arg(s).toLatin1()) << QRect(-w/2, h/2, w, h);
- QTest::newRow(QString("%1 left").arg(s).toLatin1()) << QRect(-w/2, 0, w, h);
- QTest::newRow(QString("%1 topleft").arg(s).toLatin1()) << QRect(-w/2, -h/2, w, h);
+ const QByteArray sB = wB + 'x' + QByteArray::number(h);
+ QTest::newRow((sB + " top").constData()) << QRect(0, -h/2, w, h);
+ QTest::newRow((sB + " topright").constData()) << QRect(w/2, -h/2, w, h);
+ QTest::newRow((sB + " right").constData()) << QRect(w/2, 0, w, h);
+ QTest::newRow((sB + " bottomright").constData()) << QRect(w/2, h/2, w, h);
+ QTest::newRow((sB + " bottom").constData()) << QRect(0, h/2, w, h);
+ QTest::newRow((sB + " bottomleft").constData()) << QRect(-w/2, h/2, w, h);
+ QTest::newRow((sB + " left").constData()) << QRect(-w/2, 0, w, h);
+ QTest::newRow((sB + " topleft").constData()) << QRect(-w/2, -h/2, w, h);
}
}
}
@@ -1678,13 +1663,14 @@ void tst_QPainter::fillData()
QTest::addColumn<bool>("usePen");
for (int w = 3; w < 50; w += 7) {
+ const QByteArray wB = QByteArray::number(w);
for (int h = 3; h < 50; h += 11) {
int x = w/2 + 5;
int y = h/2 + 5;
- QTest::newRow(QString("rect(%1, %2, %3, %4) with pen").arg(x).arg(y).arg(w).arg(h).toLatin1())
- << QRect(x, y, w, h) << true;
- QTest::newRow(QString("rect(%1, %2, %3, %4) no pen").arg(x).arg(y).arg(w).arg(h).toLatin1())
- << QRect(x, y, w, h) << false;
+ const QByteArray rB = "rect(" + QByteArray::number(x) + ", " + QByteArray::number(y)
+ + ", " + QByteArray::number(w) + ", " + QByteArray::number(h) + ')';
+ QTest::newRow((rB + " with pen").constData()) << QRect(x, y, w, h) << true;
+ QTest::newRow((rB + " no pen").constData()) << QRect(x, y, w, h) << false;
}
}
}
@@ -2167,21 +2153,23 @@ void tst_QPainter::clippedLines_data()
<< QLineF(15, 50, 66, 50);
foreach (QLineF line, lines) {
- QString desc = QString("line (%1, %2, %3, %4) %5").arg(line.x1())
- .arg(line.y1()).arg(line.x2()).arg(line.y2());
- QTest::newRow(qPrintable(desc.arg(0))) << QSize(100, 100) << line
+ const QByteArray desc = "line (" + QByteArray::number(line.x1())
+ + ", " + QByteArray::number(line.y1()) + ", "
+ + QByteArray::number(line.x2()) + ", " + QByteArray::number(line.y2())
+ + ") ";
+ QTest::newRow((desc + '0').constData()) << QSize(100, 100) << line
<< QRect(15, 15, 49, 49)
<< QPen(Qt::black);
- QTest::newRow(qPrintable(desc.arg(1))) << QSize(100, 100) << line
+ QTest::newRow((desc + '1').constData()) << QSize(100, 100) << line
<< QRect(15, 15, 50, 50)
<< QPen(Qt::black);
- QTest::newRow(qPrintable(desc.arg(2))) << QSize(100, 100) << line
+ QTest::newRow((desc + '2').constData()) << QSize(100, 100) << line
<< QRect(15, 15, 51, 51)
<< QPen(Qt::black);
- QTest::newRow(qPrintable(desc.arg(3))) << QSize(100, 100) << line
+ QTest::newRow((desc + '3').constData()) << QSize(100, 100) << line
<< QRect(15, 15, 51, 51)
<< QPen(Qt::NoPen);
- QTest::newRow(qPrintable(desc.arg(4))) << QSize(100, 100) << line
+ QTest::newRow((desc + '4').constData()) << QSize(100, 100) << line
<< QRect(15, 15, 51, 51)
<< pen2;
}
@@ -4487,7 +4475,7 @@ void tst_QPainter::QTBUG5939_attachPainterPrivate()
TestWidget *widget = new TestWidget();
proxy->setWidget(widget);
scene->addItem(proxy);
- proxy->rotate(45);
+ proxy->setTransform(QTransform().rotate(45));
w->resize(scene->sceneRect().size().toSize());
w->show();
diff --git a/tests/auto/gui/painting/qpainterpath/tst_qpainterpath.cpp b/tests/auto/gui/painting/qpainterpath/tst_qpainterpath.cpp
index ae30719ee7..b5e2ef96d1 100644
--- a/tests/auto/gui/painting/qpainterpath/tst_qpainterpath.cpp
+++ b/tests/auto/gui/painting/qpainterpath/tst_qpainterpath.cpp
@@ -270,13 +270,13 @@ void tst_QPainterPath::contains_QPointF_data()
inside.addEllipse(base_rect.adjusted(5, 5, -5, -5));
QPolygonF inside_poly = inside.toFillPolygon();
for (int i=0; i<inside_poly.size(); ++i)
- QTest::newRow(qPrintable(QString("inside_ellipse %1").arg(i))) << path << inside_poly.at(i) << true;
+ QTest::newRow(("inside_ellipse " + QByteArray::number(i)).constData()) << path << inside_poly.at(i) << true;
QPainterPath outside;
outside.addEllipse(base_rect.adjusted(-5, -5, 5, 5));
QPolygonF outside_poly = outside.toFillPolygon();
for (int i=0; i<outside_poly.size(); ++i)
- QTest::newRow(qPrintable(QString("outside_ellipse %1").arg(i))) << path << outside_poly.at(i) << false;
+ QTest::newRow(("outside_ellipse " + QByteArray::number(i)).constData()) << path << outside_poly.at(i) << false;
path = QPainterPath();
base_rect = QRectF(50, 50, 200, 200);
@@ -852,8 +852,10 @@ void tst_QPainterPath::testArcMoveTo_data()
<< QRectF(100, 100, -100, -100);
for (int domain=0; domain<rects.size(); ++domain) {
+ const QByteArray dB = QByteArray::number(domain);
for (int i=-360; i<=360; ++i) {
- QTest::newRow(qPrintable(QString("test %1 %2").arg(domain).arg(i))) << rects.at(domain) << (qreal) i;
+ QTest::newRow(("test " + dB + ' ' + QByteArray::number(i)).constData())
+ << rects.at(domain) << (qreal) i;
}
// test low angles
diff --git a/tests/auto/gui/painting/qpainterpathstroker/qpainterpathstroker.pro b/tests/auto/gui/painting/qpainterpathstroker/qpainterpathstroker.pro
index 8ad476b498..218183da3d 100644
--- a/tests/auto/gui/painting/qpainterpathstroker/qpainterpathstroker.pro
+++ b/tests/auto/gui/painting/qpainterpathstroker/qpainterpathstroker.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpainterpathstroker
SOURCES += tst_qpainterpathstroker.cpp
QT += testlib
diff --git a/tests/auto/gui/painting/qpathclipper/qpathclipper.pro b/tests/auto/gui/painting/qpathclipper/qpathclipper.pro
index b90bca8df3..2536cb24c0 100644
--- a/tests/auto/gui/painting/qpathclipper/qpathclipper.pro
+++ b/tests/auto/gui/painting/qpathclipper/qpathclipper.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpathclipper
INCLUDEPATH += .
HEADERS += paths.h
diff --git a/tests/auto/gui/painting/qpdfwriter/qpdfwriter.pro b/tests/auto/gui/painting/qpdfwriter/qpdfwriter.pro
index fda0fad3b5..4d2dd70e26 100644
--- a/tests/auto/gui/painting/qpdfwriter/qpdfwriter.pro
+++ b/tests/auto/gui/painting/qpdfwriter/qpdfwriter.pro
@@ -1,9 +1,7 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpdfwriter
SOURCES += tst_qpdfwriter.cpp
QT += gui-private testlib
DEFINES += QT_USE_USING_NAMESPACE
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/gui/painting/qpen/qpen.pro b/tests/auto/gui/painting/qpen/qpen.pro
index cafec29947..762b8f47d4 100644
--- a/tests/auto/gui/painting/qpen/qpen.pro
+++ b/tests/auto/gui/painting/qpen/qpen.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpen
SOURCES += tst_qpen.cpp
QT += testlib
diff --git a/tests/auto/gui/painting/qpolygon/qpolygon.pro b/tests/auto/gui/painting/qpolygon/qpolygon.pro
index 4783e4b5d4..9385b6458d 100644
--- a/tests/auto/gui/painting/qpolygon/qpolygon.pro
+++ b/tests/auto/gui/painting/qpolygon/qpolygon.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpolygon
QT += testlib
SOURCES += tst_qpolygon.cpp
diff --git a/tests/auto/gui/painting/qregion/qregion.pro b/tests/auto/gui/painting/qregion/qregion.pro
index 01eb9dd937..e9dff9a32e 100644
--- a/tests/auto/gui/painting/qregion/qregion.pro
+++ b/tests/auto/gui/painting/qregion/qregion.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qregion
QT += gui-private testlib
diff --git a/tests/auto/gui/painting/qtransform/qtransform.pro b/tests/auto/gui/painting/qtransform/qtransform.pro
index d59c040fb8..62c7518da0 100644
--- a/tests/auto/gui/painting/qtransform/qtransform.pro
+++ b/tests/auto/gui/painting/qtransform/qtransform.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtransform
SOURCES += tst_qtransform.cpp
QT += testlib
diff --git a/tests/auto/gui/painting/qtransform/tst_qtransform.cpp b/tests/auto/gui/painting/qtransform/tst_qtransform.cpp
index 60b89aa6ab..fa6a11022d 100644
--- a/tests/auto/gui/painting/qtransform/tst_qtransform.cpp
+++ b/tests/auto/gui/painting/qtransform/tst_qtransform.cpp
@@ -43,14 +43,6 @@ class tst_QTransform : public QObject
{
Q_OBJECT
-public:
- tst_QTransform();
- virtual ~tst_QTransform();
-
-
-public slots:
- void init();
- void cleanup();
private slots:
void mapRect_data();
void mapToPolygon_data();
@@ -80,24 +72,6 @@ private:
Q_DECLARE_METATYPE(QTransform)
-tst_QTransform::tst_QTransform()
-{
-}
-
-tst_QTransform::~tst_QTransform()
-{
-}
-
-void tst_QTransform::init()
-{
- // No initialisation is required
-}
-
-void tst_QTransform::cleanup()
-{
- // No cleanup is required.
-}
-
#if defined(Q_OS_WIN) && !defined(M_PI)
#define M_PI 3.14159265897932384626433832795f
#endif
diff --git a/tests/auto/gui/painting/qwmatrix/qwmatrix.pro b/tests/auto/gui/painting/qwmatrix/qwmatrix.pro
index b3bec3d4ff..efa2963091 100644
--- a/tests/auto/gui/painting/qwmatrix/qwmatrix.pro
+++ b/tests/auto/gui/painting/qwmatrix/qwmatrix.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qwmatrix
SOURCES += tst_qwmatrix.cpp
QT += testlib
diff --git a/tests/auto/gui/painting/qwmatrix/tst_qwmatrix.cpp b/tests/auto/gui/painting/qwmatrix/tst_qwmatrix.cpp
index c4c4789b7a..9d87bddbe7 100644
--- a/tests/auto/gui/painting/qwmatrix/tst_qwmatrix.cpp
+++ b/tests/auto/gui/painting/qwmatrix/tst_qwmatrix.cpp
@@ -42,14 +42,6 @@ class tst_QWMatrix : public QObject
{
Q_OBJECT
-public:
- tst_QWMatrix();
- virtual ~tst_QWMatrix();
-
-
-public slots:
- void init();
- void cleanup();
private slots:
void mapRect_data();
void mapToPolygon_data();
@@ -65,25 +57,6 @@ private:
void mapping_data();
};
-
-tst_QWMatrix::tst_QWMatrix()
-{
-}
-
-tst_QWMatrix::~tst_QWMatrix()
-{
-}
-
-void tst_QWMatrix::init()
-{
- // No initialisation is required
-}
-
-void tst_QWMatrix::cleanup()
-{
- // No cleanup is required.
-}
-
void tst_QWMatrix::mapRect_data()
{
mapping_data();
diff --git a/tests/auto/gui/qopengl/qopengl.pro b/tests/auto/gui/qopengl/qopengl.pro
index bddccac747..a4ef016e39 100644
--- a/tests/auto/gui/qopengl/qopengl.pro
+++ b/tests/auto/gui/qopengl/qopengl.pro
@@ -3,12 +3,9 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qopengl
QT += gui-private core-private testlib
SOURCES += tst_qopengl.cpp
-win32-msvc2010:contains(QT_CONFIG, angle):CONFIG += insignificant_test # QTBUG-31611
-
linux:contains(QT_CONFIG, xcb-glx):contains(QT_CONFIG, xcb-xlib):!contains(QT_CONFIG, egl): DEFINES += USE_GLX
diff --git a/tests/auto/gui/qopenglconfig/qopenglconfig.pro b/tests/auto/gui/qopenglconfig/qopenglconfig.pro
index bcf7215eea..9b0175acea 100644
--- a/tests/auto/gui/qopenglconfig/qopenglconfig.pro
+++ b/tests/auto/gui/qopenglconfig/qopenglconfig.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qopenglconfig
QT += gui-private core-private testlib
diff --git a/tests/auto/gui/text/qabstracttextdocumentlayout/qabstracttextdocumentlayout.pro b/tests/auto/gui/text/qabstracttextdocumentlayout/qabstracttextdocumentlayout.pro
index 866638f154..ec71130350 100644
--- a/tests/auto/gui/text/qabstracttextdocumentlayout/qabstracttextdocumentlayout.pro
+++ b/tests/auto/gui/text/qabstracttextdocumentlayout/qabstracttextdocumentlayout.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qabstracttextdocumentlayout
QT += testlib
SOURCES += tst_qabstracttextdocumentlayout.cpp
diff --git a/tests/auto/gui/text/qcssparser/qcssparser.pro b/tests/auto/gui/text/qcssparser/qcssparser.pro
index bb0c8c4f40..88d1fcfd2d 100644
--- a/tests/auto/gui/text/qcssparser/qcssparser.pro
+++ b/tests/auto/gui/text/qcssparser/qcssparser.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qcssparser
SOURCES += tst_qcssparser.cpp
QT += xml gui-private testlib
diff --git a/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp b/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp
index b1beb0ffd0..2308f4f215 100644
--- a/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp
+++ b/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp
@@ -185,7 +185,7 @@ static void debug(const QVector<QCss::Symbol> &symbols, int index = -1)
{
qDebug() << "all symbols:";
for (int i = 0; i < symbols.count(); ++i)
- qDebug() << "(" << i << "); Token:" << tokenName(symbols.at(i).token) << "; Lexem:" << symbols.at(i).lexem();
+ qDebug() << '(' << i << "); Token:" << tokenName(symbols.at(i).token) << "; Lexem:" << symbols.at(i).lexem();
if (index != -1)
qDebug() << "failure at index" << index;
}
@@ -916,21 +916,37 @@ void tst_QCssParser::marginValue_data()
int ex = QFontMetrics(f).xHeight();
int em = QFontMetrics(f).height();
+ const QString ex1234 = QString::number(ex) + QLatin1Char(' ') + QString::number(2 * ex)
+ + QLatin1Char(' ') + QString::number(3 * ex) + QLatin1Char(' ')
+ + QString::number(4 * ex);
+ const QString em2ex4 = QLatin1String("1 ") + QString::number(2*em) + QLatin1String(" 3 ")
+ + QString::number(4 * ex);
+
QTest::newRow("one value") << "margin: 1px" << "1 1 1 1";
QTest::newRow("two values") << "margin: 1px 2px" << "1 2 1 2";
QTest::newRow("three value") << "margin: 1px 2px 3px" << "1 2 3 2";
QTest::newRow("four values") << "margin: 1px 2px 3px 4px" << "1 2 3 4";
QTest::newRow("default px") << "margin: 1 2 3 4" << "1 2 3 4";
QTest::newRow("no unit") << "margin: 1 2 3 4" << "1 2 3 4";
- QTest::newRow("em") << "margin: 1ex 2ex 3ex 4ex" << QString("%1 %2 %3 %4").arg(ex).arg(2*ex).arg(3*ex).arg(4*ex);
- QTest::newRow("ex") << "margin: 1 2em 3px 4ex" << QString("%1 %2 %3 %4").arg(1).arg(2*em).arg(3).arg(4*ex);
+ QTest::newRow("em") << "margin: 1ex 2ex 3ex 4ex"
+ << (QString::number(ex) + QLatin1Char(' ') + QString::number(2 * ex)
+ + QLatin1Char(' ') + QString::number(3 * ex) + QLatin1Char(' ')
+ + QString::number(4 * ex));
+ QTest::newRow("ex") << "margin: 1 2em 3px 4ex"
+ << (QLatin1String("1 ") + QString::number(2 * em) + QLatin1String(" 3 ")
+ + QString::number(4 * ex));
f.setPointSize(20);
f.setBold(true);
ex = QFontMetrics(f).xHeight();
em = QFontMetrics(f).height();
- QTest::newRow("em2") << "font: bold 20pt; margin: 1ex 2ex 3ex 4ex" << QString("%1 %2 %3 %4").arg(ex).arg(2*ex).arg(3*ex).arg(4*ex);
- QTest::newRow("ex2") << "margin: 1 2em 3px 4ex; font-size: 20pt; font-weight: bold;" << QString("%1 %2 %3 %4").arg(1).arg(2*em).arg(3).arg(4*ex);
+ QTest::newRow("em2") << "font: bold 20pt; margin: 1ex 2ex 3ex 4ex"
+ << (QString::number(ex) + QLatin1Char(' ') + QString::number(2 * ex)
+ + QLatin1Char(' ') + QString::number(3 * ex) + QLatin1Char(' ')
+ + QString::number(4 * ex));
+ QTest::newRow("ex2") << "margin: 1 2em 3px 4ex; font-size: 20pt; font-weight: bold;"
+ << (QLatin1String("1 ") + QString::number(2 * em) + QLatin1String(" 3 ")
+ + QString::number(4 * ex));
QTest::newRow("crap") << "margin: crap" << "0 0 0 0";
}
@@ -963,7 +979,8 @@ void tst_QCssParser::marginValue()
int p[4];
int spacing;
v.extractBox(m, p, &spacing);
- QString str = QString("%1 %2 %3 %4").arg(m[0]).arg(m[1]).arg(m[2]).arg(m[3]);
+ QString str = QString::number(m[0]) + QLatin1Char(' ') + QString::number(m[1])
+ + QLatin1Char(' ') + QString::number(m[2]) + QLatin1Char(' ') + QString::number(m[3]);
QCOMPARE(str, expectedMargin);
}
}
@@ -1090,7 +1107,7 @@ void tst_QCssParser::styleSelector()
QFETCH(QString, xml);
QFETCH(QString, elementToCheck);
- QString css = QString("%1 { background-color: green }").arg(selector);
+ const QString css = selector + QLatin1String(" { background-color: green }");
QCss::Parser parser(css);
QCss::StyleSheet sheet;
QVERIFY(parser.parse(&sheet));
@@ -1154,7 +1171,7 @@ void tst_QCssParser::specificity()
{
QFETCH(QString, selector);
- QString css = QString("%1 { }").arg(selector);
+ QString css = selector + QLatin1String(" { }");
QCss::Parser parser(css);
QCss::StyleSheet sheet;
QVERIFY(parser.parse(&sheet));
@@ -1340,7 +1357,7 @@ void tst_QCssParser::shorthandBackgroundProperty()
QVERIFY(doc.setContent(QLatin1String("<!DOCTYPE test><test> <dummy/> </test>")));
css.prepend("dummy {");
- css.append("}");
+ css.append(QLatin1Char('}'));
QCss::Parser parser(css);
QCss::StyleSheet sheet;
@@ -1500,7 +1517,7 @@ void tst_QCssParser::gradient()
QVERIFY(doc.setContent(QLatin1String("<!DOCTYPE test><test> <dummy/> </test>")));
css.prepend("dummy {");
- css.append("}");
+ css.append(QLatin1Char('}'));
QCss::Parser parser(css);
QCss::StyleSheet sheet;
@@ -1560,7 +1577,7 @@ void tst_QCssParser::extractFontFamily()
{
QFETCH(QString, css);
css.prepend("dummy {");
- css.append("}");
+ css.append(QLatin1Char('}'));
QCss::Parser parser(css);
QCss::StyleSheet sheet;
@@ -1618,7 +1635,7 @@ void tst_QCssParser::extractBorder()
QFETCH(QColor, expectedTopColor);
css.prepend("dummy {");
- css.append("}");
+ css.append(QLatin1Char('}'));
QCss::Parser parser(css);
QCss::StyleSheet sheet;
diff --git a/tests/auto/gui/text/qfont/qfont.pro b/tests/auto/gui/text/qfont/qfont.pro
index ced66c226c..048d952faf 100644
--- a/tests/auto/gui/text/qfont/qfont.pro
+++ b/tests/auto/gui/text/qfont/qfont.pro
@@ -1,10 +1,6 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qfont
QT += testlib
QT += core-private gui-private
qtHaveModule(widgets): QT += widgets
SOURCES += tst_qfont.cpp
-
-
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/gui/text/qfont/tst_qfont.cpp b/tests/auto/gui/text/qfont/tst_qfont.cpp
index 93e308b96a..320ca68f1a 100644
--- a/tests/auto/gui/text/qfont/tst_qfont.cpp
+++ b/tests/auto/gui/text/qfont/tst_qfont.cpp
@@ -50,13 +50,6 @@ class tst_QFont : public QObject
{
Q_OBJECT
-public:
- tst_QFont();
- virtual ~tst_QFont();
-
-public slots:
- void init();
- void cleanup();
private slots:
void getSetCheck();
void exactMatch();
@@ -115,27 +108,6 @@ void tst_QFont::getSetCheck()
QCOMPARE(QFont::StyleStrategy(QFont::OpenGLCompatible), obj1.styleStrategy());
}
-tst_QFont::tst_QFont()
-{
-}
-
-tst_QFont::~tst_QFont()
-{
-
-}
-
-void tst_QFont::init()
-{
-// TODO: Add initialization code here.
-// This will be executed immediately before each test is run.
-}
-
-void tst_QFont::cleanup()
-{
-// TODO: Add cleanup code here.
-// This will be executed immediately after each test is run.
-}
-
void tst_QFont::exactMatch()
{
QFont font;
@@ -504,7 +476,7 @@ void tst_QFont::isCopyOf()
void tst_QFont::insertAndRemoveSubstitutions()
{
- QFont::removeSubstitution("BogusFontFamily");
+ QFont::removeSubstitutions("BogusFontFamily");
// make sure it is empty before we start
QVERIFY(QFont::substitutes("BogusFontFamily").isEmpty());
QVERIFY(QFont::substitutes("bogusfontfamily").isEmpty());
@@ -521,7 +493,7 @@ void tst_QFont::insertAndRemoveSubstitutions()
QCOMPARE(QFont::substitutes("BogusFontFamily").count(), 3);
QCOMPARE(QFont::substitutes("bogusfontfamily").count(), 3);
- QFont::removeSubstitution("BogusFontFamily");
+ QFont::removeSubstitutions("BogusFontFamily");
// make sure it is empty again
QVERIFY(QFont::substitutes("BogusFontFamily").isEmpty());
QVERIFY(QFont::substitutes("bogusfontfamily").isEmpty());
@@ -679,7 +651,7 @@ static inline QByteArray msgNotAcceptableFont(const QString &defaultFamily, cons
{
QString res = QString::fromLatin1("Font family '%1' is not one of the following acceptable results: ").arg(defaultFamily);
Q_FOREACH (const QString &family, acceptableFamilies)
- res += QString::fromLatin1("\n %1").arg(family);
+ res += QLatin1String("\n ") + family;
return res.toLocal8Bit();
}
diff --git a/tests/auto/gui/text/qfontcache/qfontcache.pro b/tests/auto/gui/text/qfontcache/qfontcache.pro
index 5068c12cd6..bc1042a91b 100644
--- a/tests/auto/gui/text/qfontcache/qfontcache.pro
+++ b/tests/auto/gui/text/qfontcache/qfontcache.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qfontcache
QT += testlib
QT += core-private gui-private
diff --git a/tests/auto/gui/text/qfontdatabase/qfontdatabase.pro b/tests/auto/gui/text/qfontdatabase/qfontdatabase.pro
index 831ed1f572..5dba2fc06a 100644
--- a/tests/auto/gui/text/qfontdatabase/qfontdatabase.pro
+++ b/tests/auto/gui/text/qfontdatabase/qfontdatabase.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qfontdatabase
SOURCES += tst_qfontdatabase.cpp
QT += testlib core-private gui-private
diff --git a/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp b/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp
index 5cc27f32b3..d142617666 100644
--- a/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp
+++ b/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp
@@ -46,13 +46,9 @@ Q_OBJECT
public:
tst_QFontDatabase();
- virtual ~tst_QFontDatabase();
-public slots:
- void initTestCase();
- void init();
- void cleanup();
private slots:
+ void initTestCase();
void styles_data();
void styles();
@@ -82,28 +78,11 @@ tst_QFontDatabase::tst_QFontDatabase()
{
}
-tst_QFontDatabase::~tst_QFontDatabase()
-{
-
-}
-
void tst_QFontDatabase::initTestCase()
{
QVERIFY(!m_testFont.isEmpty());
}
-void tst_QFontDatabase::init()
-{
-// TODO: Add initialization code here.
-// This will be executed immediately before each test is run.
-}
-
-void tst_QFontDatabase::cleanup()
-{
-// TODO: Add cleanup code here.
-// This will be executed immediately after each test is run.
-}
-
void tst_QFontDatabase::styles_data()
{
QTest::addColumn<QString>("font");
diff --git a/tests/auto/gui/text/qfontmetrics/qfontmetrics.pro b/tests/auto/gui/text/qfontmetrics/qfontmetrics.pro
index 7286c53d74..5dfabadd1a 100644
--- a/tests/auto/gui/text/qfontmetrics/qfontmetrics.pro
+++ b/tests/auto/gui/text/qfontmetrics/qfontmetrics.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qfontmetrics
QT += testlib core-private gui-private
SOURCES += tst_qfontmetrics.cpp
diff --git a/tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp b/tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp
index ec62bafd6c..f0a2b24873 100644
--- a/tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp
+++ b/tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp
@@ -44,13 +44,6 @@ class tst_QFontMetrics : public QObject
{
Q_OBJECT
-public:
- tst_QFontMetrics();
- virtual ~tst_QFontMetrics();
-
-public slots:
- void init();
- void cleanup();
private slots:
void same();
void metrics();
@@ -68,24 +61,6 @@ private slots:
void leadingBelowLine();
};
-tst_QFontMetrics::tst_QFontMetrics()
-
-{
-}
-
-tst_QFontMetrics::~tst_QFontMetrics()
-{
-
-}
-
-void tst_QFontMetrics::init()
-{
-}
-
-void tst_QFontMetrics::cleanup()
-{
-}
-
void tst_QFontMetrics::same()
{
QFont font;
diff --git a/tests/auto/gui/text/qglyphrun/qglyphrun.pro b/tests/auto/gui/text/qglyphrun/qglyphrun.pro
index b7d9f164c9..39f641a3b2 100644
--- a/tests/auto/gui/text/qglyphrun/qglyphrun.pro
+++ b/tests/auto/gui/text/qglyphrun/qglyphrun.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qglyphrun
QT = core gui testlib
diff --git a/tests/auto/gui/text/qrawfont/qrawfont.pro b/tests/auto/gui/text/qrawfont/qrawfont.pro
index 20da2e9a22..47e760e1da 100644
--- a/tests/auto/gui/text/qrawfont/qrawfont.pro
+++ b/tests/auto/gui/text/qrawfont/qrawfont.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qrawfont
QT = core core-private gui gui-private testlib
diff --git a/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp b/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp
index c12acf65cc..b1e292f094 100644
--- a/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp
+++ b/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp
@@ -93,6 +93,8 @@ private slots:
void multipleRawFontsFromData();
void rawFontFromInvalidData();
+
+ void kernedAdvances();
private:
QString testFont;
QString testFontBoldItalic;
@@ -954,6 +956,38 @@ void tst_QRawFont::rawFontFromInvalidData()
QVERIFY(!font.isValid());
}
+#define FUZZY_LTEQ(X, Y) (X < Y || qFuzzyCompare(X, Y))
+
+void tst_QRawFont::kernedAdvances()
+{
+ const int emSquareSize = 1000;
+ const qreal pixelSize = 16.0;
+ const int underScoreAW = 500;
+ const int underscoreTwoKerning = -500;
+ const qreal errorMargin = 1.0 / 16.0; // Fixed point error margin
+
+ QRawFont font(testFont, pixelSize);
+ QVERIFY(font.isValid());
+
+ QVector<quint32> glyphIndexes = font.glyphIndexesForString(QStringLiteral("__"));
+ QCOMPARE(glyphIndexes.size(), 2);
+
+ QVector<QPointF> advances = font.advancesForGlyphIndexes(glyphIndexes, QRawFont::KernedAdvances);
+ QCOMPARE(advances.size(), 2);
+
+ qreal expectedAdvanceWidth = pixelSize * underScoreAW / emSquareSize;
+ QVERIFY(FUZZY_LTEQ(qAbs(advances.at(0).x() - expectedAdvanceWidth), errorMargin));
+
+ glyphIndexes = font.glyphIndexesForString(QStringLiteral("_2"));
+ QCOMPARE(glyphIndexes.size(), 2);
+
+ advances = font.advancesForGlyphIndexes(glyphIndexes, QRawFont::KernedAdvances);
+ QCOMPARE(advances.size(), 2);
+
+ expectedAdvanceWidth = pixelSize * (underScoreAW + underscoreTwoKerning) / emSquareSize;
+ QVERIFY(FUZZY_LTEQ(qAbs(advances.at(0).x() - expectedAdvanceWidth), errorMargin));
+}
+
#endif // QT_NO_RAWFONT
QTEST_MAIN(tst_QRawFont)
diff --git a/tests/auto/gui/text/qstatictext/qstatictext.pro b/tests/auto/gui/text/qstatictext/qstatictext.pro
index 435b132ffd..002cead51d 100644
--- a/tests/auto/gui/text/qstatictext/qstatictext.pro
+++ b/tests/auto/gui/text/qstatictext/qstatictext.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
-linux: CONFIG += insignificant_test
TARGET = tst_qstatictext
QT += testlib
QT += core-private gui-private
diff --git a/tests/auto/gui/text/qstatictext/tst_qstatictext.cpp b/tests/auto/gui/text/qstatictext/tst_qstatictext.cpp
index b8134291af..4992d6927b 100644
--- a/tests/auto/gui/text/qstatictext/tst_qstatictext.cpp
+++ b/tests/auto/gui/text/qstatictext/tst_qstatictext.cpp
@@ -43,18 +43,22 @@
// #define DEBUG_SAVE_IMAGE
+static inline QImage blankSquare()
+{
+ // a "blank" square; we compare against in our testfunctions to verify
+ // that we have actually painted something
+ QPixmap pm(1000, 1000);
+ pm.fill(Qt::white);
+ return pm.toImage();
+}
+
class tst_QStaticText: public QObject
{
Q_OBJECT
public:
- tst_QStaticText() {}
+ tst_QStaticText() : m_whiteSquare(blankSquare()) {}
private slots:
- void initTestCase();
-
- void init();
- void cleanup();
-
void constructionAndDestruction();
void drawToPoint_data();
void drawToPoint();
@@ -96,28 +100,11 @@ private slots:
private:
bool supportsTransformations() const;
- QImage const m_whiteSquare;
+ const QImage m_whiteSquare;
};
Q_DECLARE_METATYPE(QImage::Format);
-void tst_QStaticText::initTestCase()
-{
- // a "blank" square; we compare against in our testfunctions to verify
- // that we have actually painted something
- QPixmap pm(1000, 1000);
- pm.fill(Qt::white);
- const_cast<QImage&>(m_whiteSquare) = pm.toImage();
-}
-
-void tst_QStaticText::init()
-{
-}
-
-void tst_QStaticText::cleanup()
-{
-}
-
void tst_QStaticText::constructionAndDestruction()
{
QStaticText text("My text");
diff --git a/tests/auto/gui/text/qsyntaxhighlighter/qsyntaxhighlighter.pro b/tests/auto/gui/text/qsyntaxhighlighter/qsyntaxhighlighter.pro
index a8dd6437ba..a78c429433 100644
--- a/tests/auto/gui/text/qsyntaxhighlighter/qsyntaxhighlighter.pro
+++ b/tests/auto/gui/text/qsyntaxhighlighter/qsyntaxhighlighter.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsyntaxhighlighter
SOURCES += tst_qsyntaxhighlighter.cpp
QT += testlib
diff --git a/tests/auto/gui/text/qsyntaxhighlighter/tst_qsyntaxhighlighter.cpp b/tests/auto/gui/text/qsyntaxhighlighter/tst_qsyntaxhighlighter.cpp
index 06448d11fe..a085d628d3 100644
--- a/tests/auto/gui/text/qsyntaxhighlighter/tst_qsyntaxhighlighter.cpp
+++ b/tests/auto/gui/text/qsyntaxhighlighter/tst_qsyntaxhighlighter.cpp
@@ -69,14 +69,10 @@ public:
class tst_QSyntaxHighlighter : public QObject
{
Q_OBJECT
-public:
- inline tst_QSyntaxHighlighter() {}
-public slots:
+private slots:
void init();
void cleanup();
-
-private slots:
void basic();
void basicTwo();
void removeFormatsOnDelete();
diff --git a/tests/auto/gui/text/qtextblock/qtextblock.pro b/tests/auto/gui/text/qtextblock/qtextblock.pro
index 6048361f7a..cf3456bbf6 100644
--- a/tests/auto/gui/text/qtextblock/qtextblock.pro
+++ b/tests/auto/gui/text/qtextblock/qtextblock.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtextblock
QT += testlib
diff --git a/tests/auto/gui/text/qtextblock/tst_qtextblock.cpp b/tests/auto/gui/text/qtextblock/tst_qtextblock.cpp
index 49300871d9..3301b0b003 100644
--- a/tests/auto/gui/text/qtextblock/tst_qtextblock.cpp
+++ b/tests/auto/gui/text/qtextblock/tst_qtextblock.cpp
@@ -48,14 +48,9 @@ class tst_QTextBlock : public QObject
{
Q_OBJECT
-public:
- tst_QTextBlock();
-
-
-public slots:
+private slots:
void init();
void cleanup();
-private slots:
void fragmentOverBlockBoundaries();
void excludeParagraphSeparatorFragment();
void backwardsBlockIterator();
@@ -67,9 +62,6 @@ private:
QTextCursor cursor;
};
-tst_QTextBlock::tst_QTextBlock()
-{}
-
void tst_QTextBlock::init()
{
doc = new QTextDocument;
diff --git a/tests/auto/gui/text/qtextcursor/qtextcursor.pro b/tests/auto/gui/text/qtextcursor/qtextcursor.pro
index 5e045404f1..bae85d9c37 100644
--- a/tests/auto/gui/text/qtextcursor/qtextcursor.pro
+++ b/tests/auto/gui/text/qtextcursor/qtextcursor.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtextcursor
SOURCES += tst_qtextcursor.cpp
QT += testlib
diff --git a/tests/auto/gui/text/qtextcursor/tst_qtextcursor.cpp b/tests/auto/gui/text/qtextcursor/tst_qtextcursor.cpp
index 9396cd678b..1e42fc4686 100644
--- a/tests/auto/gui/text/qtextcursor/tst_qtextcursor.cpp
+++ b/tests/auto/gui/text/qtextcursor/tst_qtextcursor.cpp
@@ -51,14 +51,9 @@ class tst_QTextCursor : public QObject
{
Q_OBJECT
-public:
- tst_QTextCursor();
-
-
-public slots:
+private slots:
void init();
void cleanup();
-private slots:
void navigation1();
void navigation2_data();
void navigation2();
@@ -154,10 +149,6 @@ private:
QTextCursor cursor;
};
-
-tst_QTextCursor::tst_QTextCursor()
-{}
-
void tst_QTextCursor::init()
{
doc = new QTextDocument;
@@ -175,7 +166,7 @@ void tst_QTextCursor::navigation1()
{
cursor.insertText("Hello World");
- QVERIFY(doc->toPlainText() == "Hello World");
+ QCOMPARE(doc->toPlainText(), QLatin1String("Hello World"));
cursor.movePosition(QTextCursor::End);
QCOMPARE(cursor.position(), 11);
@@ -205,7 +196,7 @@ void tst_QTextCursor::navigation1()
doc->undo();
doc->undo();
- QVERIFY(doc->toPlainText() == "Hello World");
+ QCOMPARE(doc->toPlainText(), QLatin1String("Hello World"));
cursor.movePosition(QTextCursor::Start);
cursor.movePosition(QTextCursor::Right, QTextCursor::MoveAnchor, 6);
diff --git a/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp b/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp
index 7378ca85ee..3658a37ca7 100644
--- a/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp
+++ b/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp
@@ -64,13 +64,11 @@ class tst_QTextDocument : public QObject
public:
tst_QTextDocument();
- virtual ~tst_QTextDocument();
-public slots:
+private slots:
void init();
void cleanup();
void cleanupTestCase();
-private slots:
void getSetCheck();
void isEmpty();
void find_data();
@@ -216,8 +214,8 @@ public:
QString tst_QTextDocument::cssFontSizeString(const QFont &font)
{
return font.pointSize() >= 0
- ? QStringLiteral("%1pt").arg(font.pointSizeF())
- : QStringLiteral("%1px").arg(font.pixelSize());
+ ? QString::number(font.pointSizeF()) + QStringLiteral("pt")
+ : QString::number(font.pixelSize()) + QStringLiteral("px");
}
// Testing get/set functions
@@ -247,10 +245,6 @@ tst_QTextDocument::tst_QTextDocument()
img.save("foo.png");
}
-tst_QTextDocument::~tst_QTextDocument()
-{
-}
-
void tst_QTextDocument::init()
{
doc = new QTextDocument;
@@ -3082,7 +3076,7 @@ void tst_QTextDocument::baseUrl()
document.setBaseUrl(base);
QCOMPARE(document.baseUrl(), base);
- document.setHtml(QString("<img src='%1'/>").arg(resource.toString()));
+ document.setHtml(QLatin1String("<img src='") + resource.toString() + QLatin1String("'/>"));
document.resource(QTextDocument::ImageResource, resource);
QCOMPARE(document.loadedResource(), loaded);
}
diff --git a/tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp b/tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp
index 1cd9d9bcbe..2ec64e5acc 100644
--- a/tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp
+++ b/tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp
@@ -1177,9 +1177,11 @@ void tst_QTextDocumentFragment::copySubTable()
fmt.setColumnWidthConstraints(constraints);
QTextTable *table = cursor.insertTable(4, 4, fmt);
- for (int row = 0; row < 4; ++row)
+ for (int row = 0; row < 4; ++row) {
+ const QString rowS = QString::number(row) + QLatin1Char('/');
for (int col = 0; col < 4; ++col)
- table->cellAt(row, col).firstCursorPosition().insertText(QString("%1/%2").arg(row).arg(col));
+ table->cellAt(row, col).firstCursorPosition().insertText(rowS + QString::number(col));
+ }
QCOMPARE(table->format().columnWidthConstraints().count(), table->columns());
diff --git a/tests/auto/gui/text/qtextdocumentlayout/qtextdocumentlayout.pro b/tests/auto/gui/text/qtextdocumentlayout/qtextdocumentlayout.pro
index 42c6406fdb..5d31ee3930 100644
--- a/tests/auto/gui/text/qtextdocumentlayout/qtextdocumentlayout.pro
+++ b/tests/auto/gui/text/qtextdocumentlayout/qtextdocumentlayout.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtextdocumentlayout
QT += testlib
qtHaveModule(widgets) QT += widgets
diff --git a/tests/auto/gui/text/qtextdocumentlayout/tst_qtextdocumentlayout.cpp b/tests/auto/gui/text/qtextdocumentlayout/tst_qtextdocumentlayout.cpp
index f59f542a2b..1ae3462801 100644
--- a/tests/auto/gui/text/qtextdocumentlayout/tst_qtextdocumentlayout.cpp
+++ b/tests/auto/gui/text/qtextdocumentlayout/tst_qtextdocumentlayout.cpp
@@ -47,16 +47,11 @@
class tst_QTextDocumentLayout : public QObject
{
Q_OBJECT
-public:
- inline tst_QTextDocumentLayout() {}
- virtual ~tst_QTextDocumentLayout() {}
-public slots:
+private slots:
void init();
void cleanup();
void cleanupTestCase();
-
-private slots:
void defaultPageSizeHandling();
void idealWidth();
void lineSeparatorFollowingTable();
diff --git a/tests/auto/gui/text/qtextformat/qtextformat.pro b/tests/auto/gui/text/qtextformat/qtextformat.pro
index c64d266916..bf909bafd2 100644
--- a/tests/auto/gui/text/qtextformat/qtextformat.pro
+++ b/tests/auto/gui/text/qtextformat/qtextformat.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtextformat
QT += testlib core-private gui-private
SOURCES += tst_qtextformat.cpp
diff --git a/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp b/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp
index de0c2d6dbe..4b99875f8f 100644
--- a/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp
+++ b/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp
@@ -59,13 +59,10 @@ class tst_QTextLayout : public QObject
public:
tst_QTextLayout();
- virtual ~tst_QTextLayout();
-
-public slots:
+private slots:
void init();
void cleanup();
-private slots:
void getSetCheck();
void lineBreaking();
#ifdef QT_BUILD_INTERNAL
@@ -199,10 +196,6 @@ tst_QTextLayout::tst_QTextLayout()
#endif
}
-tst_QTextLayout::~tst_QTextLayout()
-{
-}
-
void tst_QTextLayout::init()
{
testFont = QFont();
@@ -1123,10 +1116,10 @@ void tst_QTextLayout::boundingRectTopLeft()
void tst_QTextLayout::graphemeBoundaryForSurrogatePairs()
{
QString txt;
- txt.append("a");
+ txt.append(QLatin1Char('a'));
txt.append(0xd87e);
txt.append(0xdc25);
- txt.append("b");
+ txt.append(QLatin1Char('b'));
QTextLayout layout(txt);
QTextEngine *engine = layout.engine();
const QCharAttributes *attrs = engine->attributes();
diff --git a/tests/auto/gui/text/qtextlist/qtextlist.pro b/tests/auto/gui/text/qtextlist/qtextlist.pro
index b837f1f81b..e9ca3ad0a0 100644
--- a/tests/auto/gui/text/qtextlist/qtextlist.pro
+++ b/tests/auto/gui/text/qtextlist/qtextlist.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtextlist
QT += core-private gui-private testlib
diff --git a/tests/auto/gui/text/qtextlist/tst_qtextlist.cpp b/tests/auto/gui/text/qtextlist/tst_qtextlist.cpp
index 03e557d8dd..f73b4e1d93 100644
--- a/tests/auto/gui/text/qtextlist/tst_qtextlist.cpp
+++ b/tests/auto/gui/text/qtextlist/tst_qtextlist.cpp
@@ -45,14 +45,9 @@ class tst_QTextList : public QObject
{
Q_OBJECT
-public:
- tst_QTextList();
-
-
-public slots:
+private slots:
void init();
void cleanup();
-private slots:
void item();
void autoNumbering();
void autoNumberingRTL();
@@ -78,9 +73,6 @@ private:
QTestDocumentLayout *layout;
};
-tst_QTextList::tst_QTextList()
-{}
-
void tst_QTextList::init()
{
doc = new QTextDocument();
diff --git a/tests/auto/gui/text/qtextobject/qtextobject.pro b/tests/auto/gui/text/qtextobject/qtextobject.pro
index b2bf793e8e..3c69757410 100644
--- a/tests/auto/gui/text/qtextobject/qtextobject.pro
+++ b/tests/auto/gui/text/qtextobject/qtextobject.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtextobject
QT += testlib
qtHaveModule(widgets): QT += widgets
diff --git a/tests/auto/gui/text/qtextodfwriter/tst_qtextodfwriter.cpp b/tests/auto/gui/text/qtextodfwriter/tst_qtextodfwriter.cpp
index f12bbbdd7e..17541912ce 100644
--- a/tests/auto/gui/text/qtextodfwriter/tst_qtextodfwriter.cpp
+++ b/tests/auto/gui/text/qtextodfwriter/tst_qtextodfwriter.cpp
@@ -135,7 +135,7 @@ void tst_QTextOdfWriter::testWriteParagraph_data()
"<text:p text:style-name=\"p1\"><text:span text:style-name=\"c0\">foobar <text:s text:c=\"2\"/>word<text:tab/>tab x</text:span></text:p>";
QTest::newRow("misc2") << "\t \tFoo" <<
"<text:p text:style-name=\"p1\"><text:span text:style-name=\"c0\"><text:tab/> <text:s text:c=\"4\"/><text:tab/>Foo</text:span></text:p>";
- QTest::newRow("linefeed") << QString("line1%1line2").arg(QChar(0x2028)) <<
+ QTest::newRow("linefeed") << (QStringLiteral("line1") + QChar(0x2028) + QStringLiteral("line2")) <<
"<text:p text:style-name=\"p1\"><text:span text:style-name=\"c0\">line1<text:line-break/>line2</text:span></text:p>";
QTest::newRow("spaces") << "The quick brown fox jumped over the lazy dog" <<
"<text:p text:style-name=\"p1\"><text:span text:style-name=\"c0\">The quick brown fox jumped over the lazy dog</text:span></text:p>";
diff --git a/tests/auto/gui/text/qtextscriptengine/qtextscriptengine.pro b/tests/auto/gui/text/qtextscriptengine/qtextscriptengine.pro
index 2179fcbdf8..756073e171 100644
--- a/tests/auto/gui/text/qtextscriptengine/qtextscriptengine.pro
+++ b/tests/auto/gui/text/qtextscriptengine/qtextscriptengine.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtextscriptengine
QT += core-private gui-private testlib
diff --git a/tests/auto/gui/text/qtextscriptengine/tst_qtextscriptengine.cpp b/tests/auto/gui/text/qtextscriptengine/tst_qtextscriptengine.cpp
index 2595bba2a9..7c0962fcb6 100644
--- a/tests/auto/gui/text/qtextscriptengine/tst_qtextscriptengine.cpp
+++ b/tests/auto/gui/text/qtextscriptengine/tst_qtextscriptengine.cpp
@@ -44,14 +44,9 @@ class tst_QTextScriptEngine : public QObject
public:
tst_QTextScriptEngine();
- virtual ~tst_QTextScriptEngine();
-
-public slots:
- void initTestCase();
- void init();
- void cleanup();
private slots:
+ void initTestCase();
void devanagari_data();
void devanagari();
void bengali_data();
@@ -97,10 +92,6 @@ tst_QTextScriptEngine::tst_QTextScriptEngine()
{
}
-tst_QTextScriptEngine::~tst_QTextScriptEngine()
-{
-}
-
void tst_QTextScriptEngine::initTestCase()
{
if (!haveTestFonts) {
@@ -114,14 +105,6 @@ void tst_QTextScriptEngine::initTestCase()
}
}
-void tst_QTextScriptEngine::init()
-{
-}
-
-void tst_QTextScriptEngine::cleanup()
-{
-}
-
struct ShapeTable {
unsigned short unicode[16];
unsigned short glyphs[16];
@@ -130,7 +113,7 @@ struct ShapeTable {
static void prepareShapingTest(const QFont &font, const ShapeTable *shape_table)
{
for (const ShapeTable *s = shape_table; s->unicode[0]; ++s) {
- QByteArray testName = font.family().toLatin1() + ":";
+ QByteArray testName = font.family().toLatin1() + ':';
QString string;
for (const ushort *u = s->unicode; *u; ++u) {
string.append(QChar(*u));
diff --git a/tests/auto/gui/text/qtexttable/qtexttable.pro b/tests/auto/gui/text/qtexttable/qtexttable.pro
index 1e7249090a..2faadfcb0d 100644
--- a/tests/auto/gui/text/qtexttable/qtexttable.pro
+++ b/tests/auto/gui/text/qtexttable/qtexttable.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtexttable
QT += testlib
qtHaveModule(widgets): QT += widgets
diff --git a/tests/auto/gui/text/qtexttable/tst_qtexttable.cpp b/tests/auto/gui/text/qtexttable/tst_qtexttable.cpp
index 1c099acc56..0ac0bf719c 100644
--- a/tests/auto/gui/text/qtexttable/tst_qtexttable.cpp
+++ b/tests/auto/gui/text/qtexttable/tst_qtexttable.cpp
@@ -58,14 +58,9 @@ class tst_QTextTable : public QObject
{
Q_OBJECT
-public:
- tst_QTextTable();
-
-
-public slots:
+private slots:
void init();
void cleanup();
-private slots:
void cursorPositioning();
void variousTableModifications();
void tableShrinking();
@@ -115,9 +110,6 @@ private:
QTextCursor cursor;
};
-tst_QTextTable::tst_QTextTable()
-{}
-
void tst_QTextTable::init()
{
doc = new QTextDocument;
diff --git a/tests/auto/gui/util/qdesktopservices/qdesktopservices.pro b/tests/auto/gui/util/qdesktopservices/qdesktopservices.pro
index 162cc796e5..f5fb11effd 100644
--- a/tests/auto/gui/util/qdesktopservices/qdesktopservices.pro
+++ b/tests/auto/gui/util/qdesktopservices/qdesktopservices.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
QT += testlib
SOURCES += tst_qdesktopservices.cpp
diff --git a/tests/auto/gui/util/qdesktopservices/tst_qdesktopservices.cpp b/tests/auto/gui/util/qdesktopservices/tst_qdesktopservices.cpp
index db4b15530c..643afe5509 100644
--- a/tests/auto/gui/util/qdesktopservices/tst_qdesktopservices.cpp
+++ b/tests/auto/gui/util/qdesktopservices/tst_qdesktopservices.cpp
@@ -41,34 +41,12 @@ class tst_qdesktopservices : public QObject
{
Q_OBJECT
-public:
- tst_qdesktopservices();
- virtual ~tst_qdesktopservices();
-
private slots:
- void init();
- void cleanup();
void openUrl();
void handlers();
void testDataLocation();
};
-tst_qdesktopservices::tst_qdesktopservices()
-{
-}
-
-tst_qdesktopservices::~tst_qdesktopservices()
-{
-}
-
-void tst_qdesktopservices::init()
-{
-}
-
-void tst_qdesktopservices::cleanup()
-{
-}
-
void tst_qdesktopservices::openUrl()
{
// At the bare minimum check that they return false for invalid url's
diff --git a/tests/auto/gui/util/qdoublevalidator/qdoublevalidator.pro b/tests/auto/gui/util/qdoublevalidator/qdoublevalidator.pro
index 9f04bdbb60..955369527f 100644
--- a/tests/auto/gui/util/qdoublevalidator/qdoublevalidator.pro
+++ b/tests/auto/gui/util/qdoublevalidator/qdoublevalidator.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qdoublevalidator
QT += testlib
SOURCES += tst_qdoublevalidator.cpp
diff --git a/tests/auto/gui/util/qdoublevalidator/tst_qdoublevalidator.cpp b/tests/auto/gui/util/qdoublevalidator/tst_qdoublevalidator.cpp
index 78ab769137..f810a92dc5 100644
--- a/tests/auto/gui/util/qdoublevalidator/tst_qdoublevalidator.cpp
+++ b/tests/auto/gui/util/qdoublevalidator/tst_qdoublevalidator.cpp
@@ -43,6 +43,8 @@ class tst_QDoubleValidator : public QObject
private slots:
void validate_data();
void validate();
+ void zeroPaddedExponent_data();
+ void zeroPaddedExponent();
void validateThouSep_data();
void validateThouSep();
void validateIntEquiv_data();
@@ -240,6 +242,61 @@ void tst_QDoubleValidator::validate()
dv.setNotation(QDoubleValidator::StandardNotation);
QCOMPARE((int)dv.validate(value, dummy), (int)standard_state);
}
+
+void tst_QDoubleValidator::zeroPaddedExponent_data()
+{
+ QTest::addColumn<double>("minimum");
+ QTest::addColumn<double>("maximum");
+ QTest::addColumn<int>("decimals");
+ QTest::addColumn<QString>("value");
+ QTest::addColumn<bool>("rejectZeroPaddedExponent");
+ QTest::addColumn<QValidator::State>("state");
+
+ QTest::newRow("data01") << 1229.0 << 1231.0 << 0 << QString("123e+1") << false << ACC;
+ QTest::newRow("data02") << 12290.0 << 12310.0 << 0 << QString("123e2") << false << ACC;
+ QTest::newRow("data03") << 12.290 << 12.310 << 2 << QString("123e-") << false << ITM;
+ QTest::newRow("data04") << 12.290 << 12.310 << 2 << QString("123e-1") << false << ACC;
+ QTest::newRow("data05") << 1.2290 << 1.2310 << 3 << QString("123e-2") << false << ACC;
+
+ QTest::newRow("data11") << 1229.0 << 1231.0 << 0 << QString("123e+1") << true << ACC;
+ QTest::newRow("data12") << 12290.0 << 12310.0 << 0 << QString("123e2") << true << ACC;
+ QTest::newRow("data13") << 12.290 << 12.310 << 2 << QString("123e-") << true << ITM;
+ QTest::newRow("data14") << 12.290 << 12.310 << 2 << QString("123e-1") << true << ACC;
+ QTest::newRow("data15") << 1.2290 << 1.2310 << 3 << QString("123e-2") << true << ACC;
+
+ QTest::newRow("data21") << 1229.0 << 1231.0 << 0 << QString("123e+01") << false << ACC;
+ QTest::newRow("data22") << 12290.0 << 12310.0 << 0 << QString("123e02") << false << ACC;
+ QTest::newRow("data23") << 12.290 << 12.310 << 2 << QString("123e-0") << false << ITM;
+ QTest::newRow("data24") << 12.290 << 12.310 << 2 << QString("123e-01") << false << ACC;
+ QTest::newRow("data25") << 1.2290 << 1.2310 << 3 << QString("123e-02") << false << ACC;
+
+ QTest::newRow("data31") << 1229.0 << 1231.0 << 0 << QString("123e+01") << true << INV;
+ QTest::newRow("data32") << 12290.0 << 12310.0 << 0 << QString("123e02") << true << INV;
+ QTest::newRow("data33") << 12.290 << 12.310 << 2 << QString("123e-0") << true << INV;
+ QTest::newRow("data34") << 12.290 << 12.310 << 2 << QString("123e-01") << true << INV;
+ QTest::newRow("data35") << 1.2290 << 1.2310 << 3 << QString("123e-02") << true << INV;
+
+}
+
+void tst_QDoubleValidator::zeroPaddedExponent()
+{
+ QFETCH(double, minimum);
+ QFETCH(double, maximum);
+ QFETCH(int, decimals);
+ QFETCH(QString, value);
+ QFETCH(bool, rejectZeroPaddedExponent);
+ QFETCH(QValidator::State, state);
+
+ QLocale locale(QLocale::C);
+ if (rejectZeroPaddedExponent)
+ locale.setNumberOptions(QLocale::RejectLeadingZeroInExponent);
+
+ QDoubleValidator dv(minimum, maximum, decimals, 0);
+ dv.setLocale(locale);
+ int dummy;
+ QCOMPARE((int)dv.validate(value, dummy), (int)state);
+}
+
void tst_QDoubleValidator::notifySignals()
{
QLocale::setDefault(QLocale("C"));
diff --git a/tests/auto/gui/util/qintvalidator/qintvalidator.pro b/tests/auto/gui/util/qintvalidator/qintvalidator.pro
index 4bc35416b5..52e0b85735 100644
--- a/tests/auto/gui/util/qintvalidator/qintvalidator.pro
+++ b/tests/auto/gui/util/qintvalidator/qintvalidator.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qintvalidator
SOURCES += tst_qintvalidator.cpp
QT += testlib
diff --git a/tests/auto/gui/util/qregexpvalidator/qregexpvalidator.pro b/tests/auto/gui/util/qregexpvalidator/qregexpvalidator.pro
index 5b70d7b11d..8f1de5b747 100644
--- a/tests/auto/gui/util/qregexpvalidator/qregexpvalidator.pro
+++ b/tests/auto/gui/util/qregexpvalidator/qregexpvalidator.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qregexpvalidator
SOURCES += tst_qregexpvalidator.cpp
QT += testlib
diff --git a/tests/auto/gui/util/qregexpvalidator/tst_qregexpvalidator.cpp b/tests/auto/gui/util/qregexpvalidator/tst_qregexpvalidator.cpp
index 00876d934d..fb3a1cb5a9 100644
--- a/tests/auto/gui/util/qregexpvalidator/tst_qregexpvalidator.cpp
+++ b/tests/auto/gui/util/qregexpvalidator/tst_qregexpvalidator.cpp
@@ -42,38 +42,11 @@ class tst_QRegExpValidator : public QObject
{
Q_OBJECT
-public:
- tst_QRegExpValidator();
- virtual ~tst_QRegExpValidator();
-
-
- // I can think of no other way to do this for the moment
- enum State { Invalid=0, Intermediate=1, Acceptable=2 };
-public slots:
- void init();
- void cleanup();
private slots:
void validate_data();
void validate();
};
-tst_QRegExpValidator::tst_QRegExpValidator()
-{
-}
-
-tst_QRegExpValidator::~tst_QRegExpValidator()
-{
-
-}
-
-void tst_QRegExpValidator::init()
-{
-}
-
-void tst_QRegExpValidator::cleanup()
-{
-}
-
void tst_QRegExpValidator::validate_data()
{
diff --git a/tests/auto/gui/util/qregularexpressionvalidator/qregularexpressionvalidator.pro b/tests/auto/gui/util/qregularexpressionvalidator/qregularexpressionvalidator.pro
index 1e8e50563e..ab76cef3d1 100644
--- a/tests/auto/gui/util/qregularexpressionvalidator/qregularexpressionvalidator.pro
+++ b/tests/auto/gui/util/qregularexpressionvalidator/qregularexpressionvalidator.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qregularexpressionvalidator
SOURCES += tst_qregularexpressionvalidator.cpp
QT += testlib
diff --git a/tests/auto/network/access/qabstractnetworkcache/qabstractnetworkcache.pro b/tests/auto/network/access/qabstractnetworkcache/qabstractnetworkcache.pro
index 4772af9af9..1874f001ab 100644
--- a/tests/auto/network/access/qabstractnetworkcache/qabstractnetworkcache.pro
+++ b/tests/auto/network/access/qabstractnetworkcache/qabstractnetworkcache.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qabstractnetworkcache
QT = core network testlib
SOURCES += tst_qabstractnetworkcache.cpp
diff --git a/tests/auto/network/access/qabstractnetworkcache/tst_qabstractnetworkcache.cpp b/tests/auto/network/access/qabstractnetworkcache/tst_qabstractnetworkcache.cpp
index fd48ec3253..62f87db6df 100644
--- a/tests/auto/network/access/qabstractnetworkcache/tst_qabstractnetworkcache.cpp
+++ b/tests/auto/network/access/qabstractnetworkcache/tst_qabstractnetworkcache.cpp
@@ -44,7 +44,7 @@
#include <algorithm>
-#define TESTFILE QString("http://%1/qtest/cgi-bin/").arg(QtNetworkSettings::serverName())
+#define TESTFILE QLatin1String("http://") + QtNetworkSettings::serverName() + QLatin1String("/qtest/cgi-bin/")
class tst_QAbstractNetworkCache : public QObject
{
diff --git a/tests/auto/network/access/qftp/tst_qftp.cpp b/tests/auto/network/access/qftp/tst_qftp.cpp
index 795548ccc8..65c04cb5ac 100644
--- a/tests/auto/network/access/qftp/tst_qftp.cpp
+++ b/tests/auto/network/access/qftp/tst_qftp.cpp
@@ -63,16 +63,13 @@ class tst_QFtp : public QObject
public:
tst_QFtp();
- virtual ~tst_QFtp();
-
-public slots:
+private slots:
void initTestCase_data();
void initTestCase();
void cleanupTestCase();
void init();
void cleanup();
-private slots:
void connectToHost_data();
void connectToHost();
void connectToUnresponsiveHost();
@@ -187,10 +184,6 @@ tst_QFtp::tst_QFtp() :
{
}
-tst_QFtp::~tst_QFtp()
-{
-}
-
void tst_QFtp::initTestCase_data()
{
QTest::addColumn<bool>("setProxy");
@@ -290,10 +283,11 @@ void tst_QFtp::init()
#if !defined(Q_OS_WINCE)
srand(time(0));
- uniqueExtension = QString("%1%2%3").arg((qulonglong)this).arg(rand()).arg((qulonglong)time(0));
+ uniqueExtension = QString::number((quintptr)this) + QString::number(rand())
+ + QString::number((qulonglong)time(0));
#else
srand(0);
- uniqueExtension = QString("%1%2%3").arg((qulonglong)this).arg(rand()).arg((qulonglong)(0));
+ uniqueExtension = QString::number((quintptr)this) + QString::number(rand()) + QLatin1Char('0');
#endif
}
@@ -643,19 +637,20 @@ void tst_QFtp::get_data()
// test the two get() overloads in one routine
for ( int i=0; i<2; i++ ) {
- QTest::newRow( QString("relPath01_%1").arg(i).toLatin1().constData() ) << QtNetworkSettings::serverName() << (uint)21 << QString() << QString()
+ const QByteArray iB = QByteArray::number(i);
+ QTest::newRow(("relPath01_" + iB).constData()) << QtNetworkSettings::serverName() << (uint)21 << QString() << QString()
<< "qtest/rfc3252" << 1 << rfc3252 << (bool)(i==1);
- QTest::newRow( QString("relPath02_%1").arg(i).toLatin1().constData() ) << QtNetworkSettings::serverName() << (uint)21 << QString("ftptest") << QString("password")
+ QTest::newRow(("relPath02_" + iB).constData()) << QtNetworkSettings::serverName() << (uint)21 << QString("ftptest") << QString("password")
<< "qtest/rfc3252" << 1 << rfc3252 << (bool)(i==1);
- QTest::newRow( QString("absPath01_%1").arg(i).toLatin1().constData() ) << QtNetworkSettings::serverName() << (uint)21 << QString() << QString()
+ QTest::newRow(("absPath01_" + iB).constData()) << QtNetworkSettings::serverName() << (uint)21 << QString() << QString()
<< "/qtest/rfc3252" << 1 << rfc3252 << (bool)(i==1);
- QTest::newRow( QString("absPath02_%1").arg(i).toLatin1().constData() ) << QtNetworkSettings::serverName() << (uint)21 << QString("ftptest") << QString("password")
+ QTest::newRow(("absPath02_" + iB).constData()) << QtNetworkSettings::serverName() << (uint)21 << QString("ftptest") << QString("password")
<< "/var/ftp/qtest/rfc3252" << 1 << rfc3252 << (bool)(i==1);
- QTest::newRow( QString("nonExist01_%1").arg(i).toLatin1().constData() ) << QtNetworkSettings::serverName() << (uint)21 << QString() << QString()
+ QTest::newRow(("nonExist01_" + iB).constData()) << QtNetworkSettings::serverName() << (uint)21 << QString() << QString()
<< QString("foo") << 0 << QByteArray() << (bool)(i==1);
- QTest::newRow( QString("nonExist02_%1").arg(i).toLatin1().constData() ) << QtNetworkSettings::serverName() << (uint)21 << QString() << QString()
+ QTest::newRow(("nonExist02_" + iB).constData()) << QtNetworkSettings::serverName() << (uint)21 << QString() << QString()
<< QString("/foo") << 0 << QByteArray() << (bool)(i==1);
}
}
@@ -734,7 +729,7 @@ void tst_QFtp::put_data()
// test the two put() overloads in one routine
for ( int i=0; i<2; i++ ) {
- QTest::newRow( QString("relPath01_%1").arg(i).toLatin1().constData() ) << QtNetworkSettings::serverName() << (uint)21 << QString() << QString()
+ QTest::newRow(("relPath01_" + QByteArray::number(i)).constData()) << QtNetworkSettings::serverName() << (uint)21 << QString() << QString()
<< QString("qtest/upload/rel01_%1") << rfc3252
<< (bool)(i==1) << 1;
/*
@@ -2048,10 +2043,10 @@ bool tst_QFtp::dirExists( const QString &host, quint16 port, const QString &user
addCommand( QFtp::ConnectToHost, ftp->connectToHost( host, port ) );
addCommand( QFtp::Login, ftp->login( user, password ) );
- if ( dirToCreate.startsWith( "/" ) )
+ if ( dirToCreate.startsWith( QLatin1Char('/') ) )
addCommand( QFtp::Cd, ftp->cd( dirToCreate ) );
else
- addCommand( QFtp::Cd, ftp->cd( cdDir + "/" + dirToCreate ) );
+ addCommand( QFtp::Cd, ftp->cd( cdDir + QLatin1Char('/') + dirToCreate ) );
addCommand( QFtp::Close, ftp->close() );
inFileDirExistsFunction = true;
diff --git a/tests/auto/network/access/qhttpnetworkconnection/qhttpnetworkconnection.pro b/tests/auto/network/access/qhttpnetworkconnection/qhttpnetworkconnection.pro
index fa19fa7ac9..bd20fd33dd 100644
--- a/tests/auto/network/access/qhttpnetworkconnection/qhttpnetworkconnection.pro
+++ b/tests/auto/network/access/qhttpnetworkconnection/qhttpnetworkconnection.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qhttpnetworkconnection
SOURCES += tst_qhttpnetworkconnection.cpp
requires(contains(QT_CONFIG,private_tests))
diff --git a/tests/auto/network/access/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp b/tests/auto/network/access/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp
index 0d188a8fec..ffe6880a5f 100644
--- a/tests/auto/network/access/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp
+++ b/tests/auto/network/access/qhttpnetworkconnection/tst_qhttpnetworkconnection.cpp
@@ -44,9 +44,6 @@ class tst_QHttpNetworkConnection: public QObject
{
Q_OBJECT
-public:
- tst_QHttpNetworkConnection();
-
public Q_SLOTS:
void finishedReply();
void finishedWithError(QNetworkReply::NetworkError errorCode, const QString &detail);
@@ -60,11 +57,7 @@ private:
QNetworkReply::NetworkError netErrorCode;
private Q_SLOTS:
- void init();
- void cleanup();
void initTestCase();
- void cleanupTestCase();
-
void options_data();
void options();
void get_data();
@@ -111,27 +104,11 @@ private Q_SLOTS:
void overlappingCloseAndWrite();
};
-tst_QHttpNetworkConnection::tst_QHttpNetworkConnection()
-{
-}
-
void tst_QHttpNetworkConnection::initTestCase()
{
QVERIFY(QtNetworkSettings::verifyTestNetworkSettings());
}
-void tst_QHttpNetworkConnection::cleanupTestCase()
-{
-}
-
-void tst_QHttpNetworkConnection::init()
-{
-}
-
-void tst_QHttpNetworkConnection::cleanup()
-{
-}
-
void tst_QHttpNetworkConnection::options_data()
{
// not tested yet
diff --git a/tests/auto/network/access/qhttpnetworkreply/qhttpnetworkreply.pro b/tests/auto/network/access/qhttpnetworkreply/qhttpnetworkreply.pro
index f5dbc7f010..1810a38f6e 100644
--- a/tests/auto/network/access/qhttpnetworkreply/qhttpnetworkreply.pro
+++ b/tests/auto/network/access/qhttpnetworkreply/qhttpnetworkreply.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qhttpnetworkreply
SOURCES += tst_qhttpnetworkreply.cpp
requires(contains(QT_CONFIG,private_tests))
diff --git a/tests/auto/network/access/qhttpnetworkreply/tst_qhttpnetworkreply.cpp b/tests/auto/network/access/qhttpnetworkreply/tst_qhttpnetworkreply.cpp
index 16faee9705..2721e032d0 100644
--- a/tests/auto/network/access/qhttpnetworkreply/tst_qhttpnetworkreply.cpp
+++ b/tests/auto/network/access/qhttpnetworkreply/tst_qhttpnetworkreply.cpp
@@ -39,32 +39,10 @@ class tst_QHttpNetworkReply: public QObject
{
Q_OBJECT
private Q_SLOTS:
- void init();
- void cleanup();
- void initTestCase();
- void cleanupTestCase();
-
void parseHeader_data();
void parseHeader();
};
-
-void tst_QHttpNetworkReply::initTestCase()
-{
-}
-
-void tst_QHttpNetworkReply::cleanupTestCase()
-{
-}
-
-void tst_QHttpNetworkReply::init()
-{
-}
-
-void tst_QHttpNetworkReply::cleanup()
-{
-}
-
void tst_QHttpNetworkReply::parseHeader_data()
{
QTest::addColumn<QByteArray>("headers");
diff --git a/tests/auto/network/access/qnetworkaccessmanager/qnetworkaccessmanager.pro b/tests/auto/network/access/qnetworkaccessmanager/qnetworkaccessmanager.pro
index 8b3de90f54..e84f9f7dba 100644
--- a/tests/auto/network/access/qnetworkaccessmanager/qnetworkaccessmanager.pro
+++ b/tests/auto/network/access/qnetworkaccessmanager/qnetworkaccessmanager.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qnetworkaccessmanager
SOURCES += tst_qnetworkaccessmanager.cpp
QT = core network testlib
diff --git a/tests/auto/network/access/qnetworkcachemetadata/qnetworkcachemetadata.pro b/tests/auto/network/access/qnetworkcachemetadata/qnetworkcachemetadata.pro
index d308c286fb..0e942cd4f4 100644
--- a/tests/auto/network/access/qnetworkcachemetadata/qnetworkcachemetadata.pro
+++ b/tests/auto/network/access/qnetworkcachemetadata/qnetworkcachemetadata.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qnetworkcachemetadata
QT = core network testlib
SOURCES += tst_qnetworkcachemetadata.cpp
diff --git a/tests/auto/network/access/qnetworkcachemetadata/tst_qnetworkcachemetadata.cpp b/tests/auto/network/access/qnetworkcachemetadata/tst_qnetworkcachemetadata.cpp
index c33644cfad..ff36958b39 100644
--- a/tests/auto/network/access/qnetworkcachemetadata/tst_qnetworkcachemetadata.cpp
+++ b/tests/auto/network/access/qnetworkcachemetadata/tst_qnetworkcachemetadata.cpp
@@ -41,12 +41,6 @@ class tst_QNetworkCacheMetaData : public QObject
{
Q_OBJECT
-public slots:
- void initTestCase();
- void cleanupTestCase();
- void init();
- void cleanup();
-
private slots:
void qnetworkcachemetadata_data();
void qnetworkcachemetadata();
@@ -76,28 +70,6 @@ class SubQNetworkCacheMetaData : public QNetworkCacheMetaData
{
public:};
-// This will be called before the first test function is executed.
-// It is only called once.
-void tst_QNetworkCacheMetaData::initTestCase()
-{
-}
-
-// This will be called after the last test function is executed.
-// It is only called once.
-void tst_QNetworkCacheMetaData::cleanupTestCase()
-{
-}
-
-// This will be called before each test function is executed.
-void tst_QNetworkCacheMetaData::init()
-{
-}
-
-// This will be called after every test function.
-void tst_QNetworkCacheMetaData::cleanup()
-{
-}
-
void tst_QNetworkCacheMetaData::qnetworkcachemetadata_data()
{
}
diff --git a/tests/auto/network/access/qnetworkcookie/qnetworkcookie.pro b/tests/auto/network/access/qnetworkcookie/qnetworkcookie.pro
index ba3ece8576..320e3a81c5 100644
--- a/tests/auto/network/access/qnetworkcookie/qnetworkcookie.pro
+++ b/tests/auto/network/access/qnetworkcookie/qnetworkcookie.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qnetworkcookie
SOURCES += tst_qnetworkcookie.cpp
diff --git a/tests/auto/network/access/qnetworkcookie/tst_qnetworkcookie.cpp b/tests/auto/network/access/qnetworkcookie/tst_qnetworkcookie.cpp
index be3e839725..9738cf157e 100644
--- a/tests/auto/network/access/qnetworkcookie/tst_qnetworkcookie.cpp
+++ b/tests/auto/network/access/qnetworkcookie/tst_qnetworkcookie.cpp
@@ -63,16 +63,16 @@ namespace QTest {
template<>
char *toString(const QList<QNetworkCookie> &list)
{
- QString result = "QList(";
+ QByteArray result = "QList(";
bool first = true;
foreach (QNetworkCookie cookie, list) {
if (!first)
result += ", ";
first = false;
- result += QString::fromLatin1("QNetworkCookie(%1)").arg(QLatin1String(cookie.toRawForm()));
+ result += "QNetworkCookie(" + cookie.toRawForm() + ')';
}
-
- return qstrdup(result.append(')').toLocal8Bit());
+ result.append(')');
+ return qstrdup(result.constData());
}
}
diff --git a/tests/auto/network/access/qnetworkcookiejar/qnetworkcookiejar.pro b/tests/auto/network/access/qnetworkcookiejar/qnetworkcookiejar.pro
index bb39f83af6..e679f8a930 100644
--- a/tests/auto/network/access/qnetworkcookiejar/qnetworkcookiejar.pro
+++ b/tests/auto/network/access/qnetworkcookiejar/qnetworkcookiejar.pro
@@ -1,6 +1,6 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qnetworkcookiejar
SOURCES += tst_qnetworkcookiejar.cpp
QT = core core-private network network-private testlib
+TESTDATA = parser.json
diff --git a/tests/auto/network/access/qnetworkcookiejar/tst_qnetworkcookiejar.cpp b/tests/auto/network/access/qnetworkcookiejar/tst_qnetworkcookiejar.cpp
index 12ac1e519d..f1ac7bc386 100644
--- a/tests/auto/network/access/qnetworkcookiejar/tst_qnetworkcookiejar.cpp
+++ b/tests/auto/network/access/qnetworkcookiejar/tst_qnetworkcookiejar.cpp
@@ -72,16 +72,17 @@ namespace QTest {
template<>
char *toString(const QList<QNetworkCookie> &list)
{
- QString result = "QList(";
+ QByteArray result = "QList(";
bool first = true;
foreach (QNetworkCookie cookie, list) {
if (!first)
result += ", ";
first = false;
- result += QString::fromLatin1("QNetworkCookie(%1)").arg(QLatin1String(cookie.toRawForm()));
+ result += "QNetworkCookie(" + cookie.toRawForm() + ')';
}
- return qstrdup(result.append(')').toLocal8Bit());
+ result.append(')');
+ return qstrdup(result.constData());
}
}
diff --git a/tests/auto/network/access/qnetworkdiskcache/qnetworkdiskcache.pro b/tests/auto/network/access/qnetworkdiskcache/qnetworkdiskcache.pro
index 7e26abbe08..4a78544bf8 100644
--- a/tests/auto/network/access/qnetworkdiskcache/qnetworkdiskcache.pro
+++ b/tests/auto/network/access/qnetworkdiskcache/qnetworkdiskcache.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qnetworkdiskcache
QT = core network testlib
SOURCES += tst_qnetworkdiskcache.cpp
diff --git a/tests/auto/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp b/tests/auto/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
index 1685838e9e..76a44fc812 100644
--- a/tests/auto/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
+++ b/tests/auto/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
@@ -50,14 +50,12 @@ public:
tst_QNetworkDiskCache();
public slots:
- void initTestCase();
- void cleanupTestCase();
- void init();
- void cleanup();
void accessAfterRemoveReadyReadSlot();
void setCookieHeaderMetaDataChangedSlot();
private slots:
+ void initTestCase();
+ void cleanupTestCase();
void qnetworkdiskcache_data();
void qnetworkdiskcache();
@@ -202,16 +200,6 @@ void tst_QNetworkDiskCache::cleanupTestCase()
workingDir.removeRecursively();
}
-// This will be called before each test function is executed.
-void tst_QNetworkDiskCache::init()
-{
-}
-
-// This will be called after every test function.
-void tst_QNetworkDiskCache::cleanup()
-{
-}
-
void tst_QNetworkDiskCache::qnetworkdiskcache_data()
{
}
@@ -540,7 +528,7 @@ void tst_QNetworkDiskCache::expire()
std::sort(cacheList.begin(), cacheList.end());
for (int i = 0; i < cacheList.count(); ++i) {
QString fileName = cacheList[i];
- QCOMPARE(fileName, QString("http://localhost:4/%1").arg(i + 6));
+ QCOMPARE(fileName, QLatin1String("http://localhost:4/") + QString::number(i + 6));
}
}
@@ -782,7 +770,10 @@ void tst_QNetworkDiskCache::crashWhenParentingCache()
QNetworkAccessManager *manager = new QNetworkAccessManager();
QNetworkDiskCache *diskCache = new QNetworkDiskCache(manager); // parent to qnam!
// we expect the temp dir to be cleaned at some point anyway
- diskCache->setCacheDirectory(QString("%1/cacheDir_%2").arg(QDir::tempPath()).arg(QCoreApplication::applicationPid()));
+
+ const QString diskCachePath = QDir::tempPath() + QLatin1String("/cacheDir_")
+ + QString::number(QCoreApplication::applicationPid());
+ diskCache->setCacheDirectory(diskCachePath);
manager->setCache(diskCache);
QUrl url("http://127.0.0.1:" + QString::number(server.serverPort()));
diff --git a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
index ce56dcacba..66aa26ccea 100644
--- a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
@@ -125,9 +125,10 @@ class tst_QNetworkReply: public QObject
qsrand(QTime(0,0,0).msecsTo(QTime::currentTime()) + QCoreApplication::applicationPid());
seedCreated = true; // not thread-safe, but who cares
}
- QString s = QString("%1-%2-%3").arg(QTime(0,0,0).msecsTo(QTime::currentTime())).arg(QCoreApplication::applicationPid()).arg(qrand());
- return s;
- };
+ return QString::number(QTime(0, 0, 0).msecsTo(QTime::currentTime()))
+ + QLatin1Char('-') + QString::number(QCoreApplication::applicationPid())
+ + QLatin1Char('-') + QString::number(qrand());
+ }
static QString tempRedirectReplyStr() {
QString s = "HTTP/1.1 307 Temporary Redirect\r\n"
@@ -198,6 +199,7 @@ public Q_SLOTS:
protected Q_SLOTS:
void nestedEventLoops_slot();
+ void notEnoughData();
private Q_SLOTS:
void cleanup() { cleanupTestData(); }
@@ -487,6 +489,7 @@ private:
void cleanupTestData();
QString testDataDir;
+ bool notEnoughDataForFastSender;
};
bool tst_QNetworkReply::seedCreated = false;
@@ -515,16 +518,16 @@ namespace QTest {
template<>
char *toString(const QList<QNetworkCookie> &list)
{
- QString result = "QList(";
+ QByteArray result = "QList(";
bool first = true;
foreach (QNetworkCookie cookie, list) {
if (!first)
result += ", ";
first = false;
- result += QString::fromLatin1("QNetworkCookie(%1)").arg(QLatin1String(cookie.toRawForm()));
+ result += "QNetworkCookie(" + cookie.toRawForm() + ')';
}
-
- return qstrdup(result.append(')').toLocal8Bit());
+ result.append(')');
+ return qstrdup(result.constData());
}
}
@@ -991,11 +994,13 @@ public:
}
// a server that sends the data provided at construction time, useful for HTTP
- FastSender(const QByteArray& data, bool https, bool fillBuffer)
+ FastSender(const QByteArray& data, bool https, bool fillBuffer, tst_QNetworkReply *listener = 0)
: wantedSize(data.size()), port(-1), protocol(ProvidedData),
doSsl(https), fillKernelBuffer(fillBuffer), transferRate(-1),
dataToTransmit(data), dataIndex(0)
{
+ if (listener)
+ connect(this, SIGNAL(notEnoughData()), listener, SLOT(notEnoughData()));
start();
ready.acquire();
}
@@ -1058,6 +1063,7 @@ protected:
do {
if (writeNextData(client, BlockSize) < BlockSize) {
qDebug() << "ERROR: FastSender: not enough data to write in order to fill buffers; or client is reading too fast";
+ emit notEnoughData();
return;
}
while (client->bytesToWrite() > 0) {
@@ -1118,6 +1124,7 @@ protected:
}
signals:
void dataReady();
+ void notEnoughData();
};
class RateControlledReader: public QObject
@@ -2778,7 +2785,7 @@ void tst_QNetworkReply::postToHttpsMultipart()
// hack for testing the setting of the content-type header by hand:
if (contentType == "custom") {
- QByteArray contentType("multipart/custom; boundary=\"" + multiPart->boundary() + "\"");
+ QByteArray contentType("multipart/custom; boundary=\"" + multiPart->boundary() + '"');
request.setHeader(QNetworkRequest::ContentTypeHeader, contentType);
}
@@ -2930,7 +2937,7 @@ void tst_QNetworkReply::connectToIPv6Address()
QVERIFY2(waitForFinish(reply) == Success, msgWaitForFinished(reply));
QByteArray content = reply->readAll();
//qDebug() << server.receivedData;
- QByteArray hostinfo = "\r\nHost: " + hostfield + ":" + QByteArray::number(server.serverPort()) + "\r\n";
+ QByteArray hostinfo = "\r\nHost: " + hostfield + ':' + QByteArray::number(server.serverPort()) + "\r\n";
QVERIFY(server.receivedData.contains(hostinfo));
QCOMPARE(content, dataToSend);
QCOMPARE(reply->url(), request.url());
@@ -4814,7 +4821,7 @@ void tst_QNetworkReply::ioPostToHttpsUploadProgress()
server.listen(QHostAddress(QHostAddress::LocalHost), 0);
// create the request
- QUrl url = QUrl(QString("https://127.0.0.1:%1/").arg(server.serverPort()));
+ QUrl url = QUrl(QLatin1String("https://127.0.0.1:") + QString::number(server.serverPort()) + QLatin1Char('/'));
QNetworkRequest request(url);
request.setRawHeader("Content-Type", "application/octet-stream");
@@ -4898,7 +4905,8 @@ void tst_QNetworkReply::ioGetFromBuiltinHttp()
<< testData.size() << "bytes of data";
const bool fillKernelBuffer = bufferSize > 0;
- FastSender server(httpResponse, https, fillKernelBuffer);
+ notEnoughDataForFastSender = false;
+ FastSender server(httpResponse, https, fillKernelBuffer, this);
QUrl url(QString("%1://127.0.0.1:%2/qtest/rfc3252.txt")
.arg(https?"https":"http")
@@ -4913,7 +4921,13 @@ void tst_QNetworkReply::ioGetFromBuiltinHttp()
QTime loopTime;
loopTime.start();
- QVERIFY2(waitForFinish(reply) == Success, msgWaitForFinished(reply));
+ const int result = waitForFinish(reply);
+ if (notEnoughDataForFastSender) {
+ server.wait();
+ QSKIP("kernel socket buffers are too big for this test to work");
+ }
+
+ QVERIFY2(result == Success, msgWaitForFinished(reply));
const int elapsedTime = loopTime.elapsed();
server.wait();
@@ -4941,7 +4955,7 @@ void tst_QNetworkReply::ioGetFromBuiltinHttp()
const int allowedDeviation = 16; // TODO find out why the send rate is 13% faster currently
const int minRate = rate * 1024 * (100-allowedDeviation) / 100;
const int maxRate = rate * 1024 * (100+allowedDeviation) / 100;
- qDebug() << minRate << "<="<< server.transferRate << "<=" << maxRate << "?";
+ qDebug() << minRate << "<="<< server.transferRate << "<=" << maxRate << '?';
// The test takes too long to run if sending enough data to overwhelm the
// reciever's kernel buffers.
//QEXPECT_FAIL("http+limited", "Limiting is broken right now, check QTBUG-15065", Continue);
@@ -5030,7 +5044,7 @@ void tst_QNetworkReply::emitAllUploadProgressSignals()
server.listen(QHostAddress(QHostAddress::LocalHost), 0);
connect(&server, SIGNAL(newConnection()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QUrl url = QUrl(QString("http://127.0.0.1:%1/").arg(server.serverPort()));
+ QUrl url = QUrl(QLatin1String("http://127.0.0.1:") + QString::number(server.serverPort()) + QLatin1Char('/'));
QNetworkRequest normalRequest(url);
normalRequest.setRawHeader("Content-Type", "application/octet-stream");
@@ -5085,7 +5099,7 @@ void tst_QNetworkReply::ioPostToHttpEmptyUploadProgress()
server.listen(QHostAddress(QHostAddress::LocalHost), 0);
// create the request
- QUrl url = QUrl(QString("http://127.0.0.1:%1/").arg(server.serverPort()));
+ QUrl url = QUrl(QLatin1String("http://127.0.0.1:") + QString::number(server.serverPort()) + QLatin1Char('/'));
QNetworkRequest request(url);
request.setRawHeader("Content-Type", "application/octet-stream");
QNetworkReplyPtr reply(manager.post(request, &buffer));
@@ -5517,7 +5531,7 @@ void tst_QNetworkReply::sendCookies_data()
list.clear();
cookie = QNetworkCookie("a", "b");
cookie.setPath("/");
- cookie.setDomain("." + QtNetworkSettings::serverDomainName());
+ cookie.setDomain(QLatin1Char('.') + QtNetworkSettings::serverDomainName());
list << cookie;
QTest::newRow("domain-match") << list << "a=b";
@@ -5586,6 +5600,11 @@ void tst_QNetworkReply::nestedEventLoops_slot()
QTestEventLoop::instance().exitLoop();
}
+void tst_QNetworkReply::notEnoughData()
+{
+ notEnoughDataForFastSender = true;
+}
+
void tst_QNetworkReply::nestedEventLoops()
{
// Slightly fragile test, it may not be testing anything
@@ -5850,7 +5869,7 @@ void tst_QNetworkReply::httpConnectionCount()
QCoreApplication::instance()->processEvents();
for (int i = 0; i < 10; i++) {
- QNetworkRequest request (QUrl("http://127.0.0.1:" + QString::number(server.serverPort()) + "/" + QString::number(i)));
+ QNetworkRequest request (QUrl("http://127.0.0.1:" + QString::number(server.serverPort()) + QLatin1Char('/') + QString::number(i)));
QNetworkReply* reply = manager.get(request);
reply->setParent(&server);
}
@@ -6463,9 +6482,10 @@ public slots:
QByteArray data(amount, '@');
if (chunkedEncoding) {
- client->write(QString(QString("%1").arg(amount,0,16).toUpper() + "\r\n").toLatin1());
+ client->write(QByteArray::number(amount, 16).toUpper());
+ client->write("\r\n");
client->write(data.constData(), amount);
- client->write(QString("\r\n").toLatin1());
+ client->write("\r\n");
} else {
client->write(data.constData(), amount);
}
@@ -7734,6 +7754,7 @@ void tst_QNetworkReply::emitErrorForAllReplies() // QTBUG-36890
#ifdef QT_BUILD_INTERNAL
void tst_QNetworkReply::backgroundRequest_data()
{
+#ifndef QT_NO_BEARERMANAGEMENT
QTest::addColumn<QUrl>("url");
QTest::addColumn<bool>("background");
QTest::addColumn<int>("policy");
@@ -7759,7 +7780,7 @@ void tst_QNetworkReply::backgroundRequest_data()
QTest::newRow("ftp, bg, normal") << ftpurl << true << (int)QNetworkSession::NoPolicy << QNetworkReply::NoError;
QTest::newRow("ftp, fg, nobg") << ftpurl << false << (int)QNetworkSession::NoBackgroundTrafficPolicy << QNetworkReply::NoError;
QTest::newRow("ftp, bg, nobg") << ftpurl << true << (int)QNetworkSession::NoBackgroundTrafficPolicy << QNetworkReply::BackgroundRequestNotAllowedError;
-
+#endif // !QT_NO_BEARERMANAGEMENT
}
#endif
@@ -8296,10 +8317,15 @@ void tst_QNetworkReply::putWithServerClosingConnectionImmediately()
server.m_expectedReplies = numUploads;
server.listen(QHostAddress(QHostAddress::LocalHost), 0);
+ QString urlPrefix = QLatin1String("http");
+ if (withSsl)
+ urlPrefix += QLatin1Char('s');
+ urlPrefix += QLatin1String("://127.0.0.1:");
+ urlPrefix += QString::number(server.serverPort());
+ urlPrefix += QLatin1String("/file=");
for (int i = 0; i < numUploads; i++) {
// create the request
- QUrl url = QUrl(QString("http%1://127.0.0.1:%2/file=%3").arg(withSsl ? "s" : "").arg(server.serverPort()).arg(i));
- QNetworkRequest request(url);
+ QNetworkRequest request(QUrl(urlPrefix + QString::number(i)));
QNetworkReply *reply = manager.put(request, sourceFile);
connect(reply, SIGNAL(sslErrors(QList<QSslError>)), reply, SLOT(ignoreSslErrors()));
connect(reply, SIGNAL(finished()), &server, SLOT(replyFinished()));
diff --git a/tests/auto/network/access/qnetworkrequest/qnetworkrequest.pro b/tests/auto/network/access/qnetworkrequest/qnetworkrequest.pro
index 0470d96b8c..c00c2c30a2 100644
--- a/tests/auto/network/access/qnetworkrequest/qnetworkrequest.pro
+++ b/tests/auto/network/access/qnetworkrequest/qnetworkrequest.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qnetworkrequest
SOURCES += tst_qnetworkrequest.cpp
diff --git a/tests/auto/network/access/qnetworkrequest/tst_qnetworkrequest.cpp b/tests/auto/network/access/qnetworkrequest/tst_qnetworkrequest.cpp
index 7370339b2b..7136a136b0 100644
--- a/tests/auto/network/access/qnetworkrequest/tst_qnetworkrequest.cpp
+++ b/tests/auto/network/access/qnetworkrequest/tst_qnetworkrequest.cpp
@@ -73,16 +73,16 @@ namespace QTest {
template<>
char *toString(const QList<QNetworkCookie> &list)
{
- QString result = "QList(";
+ QByteArray result = "QList(";
bool first = true;
foreach (QNetworkCookie cookie, list) {
if (!first)
result += ", ";
first = false;
- result += QString::fromLatin1("QNetworkCookie(%1)").arg(QLatin1String(cookie.toRawForm()));
+ result += "QNetworkCookie(" + cookie.toRawForm() + ')';
}
-
- return qstrdup(result.append(')').toLocal8Bit());
+ result.append(')');
+ return qstrdup(result.constData());
}
}
diff --git a/tests/auto/network/access/spdy/spdy.pro b/tests/auto/network/access/spdy/spdy.pro
index 23efa85b47..cdbe60a19b 100644
--- a/tests/auto/network/access/spdy/spdy.pro
+++ b/tests/auto/network/access/spdy/spdy.pro
@@ -1,9 +1,7 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_spdy
SOURCES += tst_spdy.cpp
QT = core core-private network network-private testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
win32:CONFIG += insignificant_test # QTBUG-47128
diff --git a/tests/auto/network/bearer/qnetworksession/lackey/main.cpp b/tests/auto/network/bearer/qnetworksession/lackey/main.cpp
index 74b26107bc..a7ff336382 100644
--- a/tests/auto/network/bearer/qnetworksession/lackey/main.cpp
+++ b/tests/auto/network/bearer/qnetworksession/lackey/main.cpp
@@ -132,8 +132,9 @@ int main(int argc, char** argv)
return SESSION_OPEN_ERROR;
}
- QString output = QString("Started session for %1\n").arg(session->configuration().identifier());
- oopSocket.write(output.toLatin1());
+ QByteArray output = "Started session for "
+ + session->configuration().identifier().toLatin1() + '\n';
+ oopSocket.write(output);
oopSocket.waitForBytesWritten();
oopSocket.waitForReadyRead();
diff --git a/tests/auto/network/kernel/qdnslookup/qdnslookup.pro b/tests/auto/network/kernel/qdnslookup/qdnslookup.pro
index 3727736fad..f14ffd003e 100644
--- a/tests/auto/network/kernel/qdnslookup/qdnslookup.pro
+++ b/tests/auto/network/kernel/qdnslookup/qdnslookup.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qdnslookup
diff --git a/tests/auto/network/kernel/qdnslookup/tst_qdnslookup.cpp b/tests/auto/network/kernel/qdnslookup/tst_qdnslookup.cpp
index 301a915dd6..976b895b53 100644
--- a/tests/auto/network/kernel/qdnslookup/tst_qdnslookup.cpp
+++ b/tests/auto/network/kernel/qdnslookup/tst_qdnslookup.cpp
@@ -275,7 +275,7 @@ void tst_QDnsLookup::lookup()
QStringList mailExchanges;
foreach (const QDnsMailExchangeRecord &record, lookup.mailExchangeRecords()) {
QCOMPARE(record.name(), domain);
- mailExchanges << QString("%1 %2").arg(QString::number(record.preference()), record.exchange());
+ mailExchanges << QString::number(record.preference()) + QLatin1Char(' ') + record.exchange();
}
QVERIFY2(mx_alternatives.contains(mailExchanges.join(';')),
qPrintable("Actual: " + mailExchanges.join(';') + "\nExpected one of:\n" + mx_alternatives.join('\n')));
@@ -304,11 +304,9 @@ void tst_QDnsLookup::lookup()
QStringList services;
foreach (const QDnsServiceRecord &record, lookup.serviceRecords()) {
QCOMPARE(record.name(), domain);
- services << QString("%1 %2 %3 %4").arg(
- QString::number(record.priority()),
- QString::number(record.weight()),
- QString::number(record.port()),
- record.target());
+ services << (QString::number(record.priority()) + QLatin1Char(' ')
+ + QString::number(record.weight()) + QLatin1Char(' ')
+ + QString::number(record.port()) + QLatin1Char(' ') + record.target());
}
QVERIFY2(srv_alternatives.contains(services.join(';')),
qPrintable("Actual: " + services.join(';') + "\nExpected one of:\n" + srv_alternatives.join('\n')));
diff --git a/tests/auto/network/kernel/qdnslookup_appless/qdnslookup_appless.pro b/tests/auto/network/kernel/qdnslookup_appless/qdnslookup_appless.pro
index 0515bbad3b..25d76b5739 100644
--- a/tests/auto/network/kernel/qdnslookup_appless/qdnslookup_appless.pro
+++ b/tests/auto/network/kernel/qdnslookup_appless/qdnslookup_appless.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qdnslookup_appless
diff --git a/tests/auto/network/kernel/qhostaddress/qhostaddress.pro b/tests/auto/network/kernel/qhostaddress/qhostaddress.pro
index f349cab976..19d74dfd9b 100644
--- a/tests/auto/network/kernel/qhostaddress/qhostaddress.pro
+++ b/tests/auto/network/kernel/qhostaddress/qhostaddress.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qhostaddress
SOURCES += tst_qhostaddress.cpp
diff --git a/tests/auto/network/kernel/qhostaddress/tst_qhostaddress.cpp b/tests/auto/network/kernel/qhostaddress/tst_qhostaddress.cpp
index 8069865d93..808cc3ef34 100644
--- a/tests/auto/network/kernel/qhostaddress/tst_qhostaddress.cpp
+++ b/tests/auto/network/kernel/qhostaddress/tst_qhostaddress.cpp
@@ -57,12 +57,7 @@ class tst_QHostAddress : public QObject
public:
tst_QHostAddress();
- virtual ~tst_QHostAddress();
-
-public slots:
- void init();
- void cleanup();
private slots:
void constructor_QString_data();
void constructor_QString();
@@ -89,26 +84,13 @@ private slots:
void convertv4v6();
};
-tst_QHostAddress::tst_QHostAddress()
-{
-}
-
-tst_QHostAddress::~tst_QHostAddress()
-{
-}
-
Q_DECLARE_METATYPE(QHostAddress)
-void tst_QHostAddress::init()
+tst_QHostAddress::tst_QHostAddress()
{
qRegisterMetaType<QHostAddress>("QHostAddress");
}
-void tst_QHostAddress::cleanup()
-{
- // No cleanup is required.
-}
-
void tst_QHostAddress::constructor_QString_data()
{
setAddress_QString_data();
diff --git a/tests/auto/network/kernel/qhostinfo/tst_qhostinfo.cpp b/tests/auto/network/kernel/qhostinfo/tst_qhostinfo.cpp
index 5f0addba98..a38b8d0873 100644
--- a/tests/auto/network/kernel/qhostinfo/tst_qhostinfo.cpp
+++ b/tests/auto/network/kernel/qhostinfo/tst_qhostinfo.cpp
@@ -92,17 +92,9 @@ class tst_QHostInfo : public QObject
{
Q_OBJECT
-public:
- tst_QHostInfo();
- virtual ~tst_QHostInfo();
-
-
-public slots:
+private slots:
void init();
- void cleanup();
void initTestCase();
-
-private slots:
void getSetCheck();
void staticInformation();
void lookupIPv4_data();
@@ -169,14 +161,6 @@ void tst_QHostInfo::staticInformation()
qDebug() << "Domain name:" << QHostInfo::localDomainName();
}
-tst_QHostInfo::tst_QHostInfo()
-{
-}
-
-tst_QHostInfo::~tst_QHostInfo()
-{
-}
-
void tst_QHostInfo::initTestCase()
{
QVERIFY(QtNetworkSettings::verifyTestNetworkSettings());
@@ -237,10 +221,6 @@ void tst_QHostInfo::init()
qt_qhostinfo_enable_cache(cache);
}
-void tst_QHostInfo::cleanup()
-{
-}
-
void tst_QHostInfo::lookupIPv4_data()
{
QTest::addColumn<QString>("hostname");
diff --git a/tests/auto/network/kernel/qnetworkaddressentry/qnetworkaddressentry.pro b/tests/auto/network/kernel/qnetworkaddressentry/qnetworkaddressentry.pro
index ae207e9c79..427f2e0f19 100644
--- a/tests/auto/network/kernel/qnetworkaddressentry/qnetworkaddressentry.pro
+++ b/tests/auto/network/kernel/qnetworkaddressentry/qnetworkaddressentry.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qnetworkaddressentry
SOURCES += tst_qnetworkaddressentry.cpp
diff --git a/tests/auto/network/kernel/qnetworkinterface/qnetworkinterface.pro b/tests/auto/network/kernel/qnetworkinterface/qnetworkinterface.pro
index 79279514d1..694dec2ed7 100644
--- a/tests/auto/network/kernel/qnetworkinterface/qnetworkinterface.pro
+++ b/tests/auto/network/kernel/qnetworkinterface/qnetworkinterface.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qnetworkinterface
SOURCES += tst_qnetworkinterface.cpp
diff --git a/tests/auto/network/kernel/qnetworkinterface/tst_qnetworkinterface.cpp b/tests/auto/network/kernel/qnetworkinterface/tst_qnetworkinterface.cpp
index 519ee0dc84..cc3b99ff76 100644
--- a/tests/auto/network/kernel/qnetworkinterface/tst_qnetworkinterface.cpp
+++ b/tests/auto/network/kernel/qnetworkinterface/tst_qnetworkinterface.cpp
@@ -142,7 +142,7 @@ void tst_QNetworkInterface::dump()
s.nospace() << ": " << qPrintable(e.ip().toString());
if (!e.netmask().isNull())
s.nospace() << '/' << e.prefixLength()
- << " (" << qPrintable(e.netmask().toString()) << ")";
+ << " (" << qPrintable(e.netmask().toString()) << ')';
if (!e.broadcast().isNull())
s.nospace() << " broadcast " << qPrintable(e.broadcast().toString());
}
@@ -222,6 +222,11 @@ void tst_QNetworkInterface::interfaceFromXXX()
QFETCH(QNetworkInterface, iface);
QVERIFY(QNetworkInterface::interfaceFromName(iface.name()).isValid());
+ if (int idx = iface.index()) {
+ QVERIFY(QNetworkInterface::interfaceFromIndex(idx).isValid());
+ QCOMPARE(QNetworkInterface::interfaceNameFromIndex(idx), iface.name());
+ QCOMPARE(QNetworkInterface::interfaceIndexFromName(iface.name()), idx);
+ }
foreach (QNetworkAddressEntry entry, iface.addressEntries()) {
QVERIFY(!entry.ip().isNull());
diff --git a/tests/auto/network/kernel/qnetworkproxyfactory/qnetworkproxyfactory.pro b/tests/auto/network/kernel/qnetworkproxyfactory/qnetworkproxyfactory.pro
index c63c7742a1..ed73e3e10e 100644
--- a/tests/auto/network/kernel/qnetworkproxyfactory/qnetworkproxyfactory.pro
+++ b/tests/auto/network/kernel/qnetworkproxyfactory/qnetworkproxyfactory.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qnetworkproxyfactory
QT = core network testlib
diff --git a/tests/auto/network/kernel/qnetworkproxyfactory/tst_qnetworkproxyfactory.cpp b/tests/auto/network/kernel/qnetworkproxyfactory/tst_qnetworkproxyfactory.cpp
index d67813b954..457ddfa1a0 100644
--- a/tests/auto/network/kernel/qnetworkproxyfactory/tst_qnetworkproxyfactory.cpp
+++ b/tests/auto/network/kernel/qnetworkproxyfactory/tst_qnetworkproxyfactory.cpp
@@ -372,7 +372,7 @@ void tst_QNetworkProxyFactory::genericSystemProxy()
QFETCH(int, port);
// The generic system proxy is only available on the following platforms
-#if (!defined Q_OS_BLACKBERRY) && (!defined Q_OS_WIN) && (!defined Q_OS_OSX)
+#if (!defined Q_OS_WIN) && (!defined Q_OS_OSX)
qputenv(envVar, url);
const QList<QNetworkProxy> systemProxy = QNetworkProxyFactory::systemProxyForQuery();
QCOMPARE(systemProxy.size(), 1);
diff --git a/tests/auto/network/socket/platformsocketengine/tst_platformsocketengine.cpp b/tests/auto/network/socket/platformsocketengine/tst_platformsocketengine.cpp
index 71125f463a..dd5f912f3a 100644
--- a/tests/auto/network/socket/platformsocketengine/tst_platformsocketengine.cpp
+++ b/tests/auto/network/socket/platformsocketengine/tst_platformsocketengine.cpp
@@ -70,16 +70,8 @@ class tst_PlatformSocketEngine : public QObject
{
Q_OBJECT
-public:
- tst_PlatformSocketEngine();
- virtual ~tst_PlatformSocketEngine();
-
-
-public slots:
- void initTestCase();
- void init();
- void cleanup();
private slots:
+ void initTestCase();
void construction();
void simpleConnectToIMAP();
void udpLoopbackTest();
@@ -99,27 +91,11 @@ private slots:
void tooManySockets();
};
-tst_PlatformSocketEngine::tst_PlatformSocketEngine()
-{
-}
-
-tst_PlatformSocketEngine::~tst_PlatformSocketEngine()
-{
-}
-
void tst_PlatformSocketEngine::initTestCase()
{
QVERIFY(QtNetworkSettings::verifyTestNetworkSettings());
}
-void tst_PlatformSocketEngine::init()
-{
-}
-
-void tst_PlatformSocketEngine::cleanup()
-{
-}
-
//---------------------------------------------------------------------------
void tst_PlatformSocketEngine::construction()
{
diff --git a/tests/auto/network/socket/qhttpsocketengine/tst_qhttpsocketengine.cpp b/tests/auto/network/socket/qhttpsocketengine/tst_qhttpsocketengine.cpp
index 179cdb76bc..be0fcb6a08 100644
--- a/tests/auto/network/socket/qhttpsocketengine/tst_qhttpsocketengine.cpp
+++ b/tests/auto/network/socket/qhttpsocketengine/tst_qhttpsocketengine.cpp
@@ -51,16 +51,9 @@ class tst_QHttpSocketEngine : public QObject
{
Q_OBJECT
-public:
- tst_QHttpSocketEngine();
- virtual ~tst_QHttpSocketEngine();
-
-
-public slots:
+private slots:
void initTestCase();
void init();
- void cleanup();
-private slots:
void construction();
void errorTest_data();
void errorTest();
@@ -131,14 +124,6 @@ public slots:
}
};
-tst_QHttpSocketEngine::tst_QHttpSocketEngine()
-{
-}
-
-tst_QHttpSocketEngine::~tst_QHttpSocketEngine()
-{
-}
-
void tst_QHttpSocketEngine::initTestCase()
{
QVERIFY(QtNetworkSettings::verifyTestNetworkSettings());
@@ -150,10 +135,6 @@ void tst_QHttpSocketEngine::init()
bytesAvailable = 0;
}
-void tst_QHttpSocketEngine::cleanup()
-{
-}
-
//---------------------------------------------------------------------------
void tst_QHttpSocketEngine::construction()
{
diff --git a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp
index d7480a4109..9362195839 100644
--- a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp
+++ b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp
@@ -54,9 +54,8 @@ class tst_QLocalSocket : public QObject
{
Q_OBJECT
-public Q_SLOTS:
- void init();
- void cleanup();
+public:
+ tst_QLocalSocket();
private slots:
// basics
@@ -116,7 +115,7 @@ private slots:
};
-void tst_QLocalSocket::init()
+tst_QLocalSocket::tst_QLocalSocket()
{
qRegisterMetaType<QLocalSocket::LocalSocketState>("QLocalSocket::LocalSocketState");
qRegisterMetaType<QLocalSocket::LocalSocketError>("QLocalSocket::LocalSocketError");
@@ -124,10 +123,6 @@ void tst_QLocalSocket::init()
qRegisterMetaType<QFile::Permissions>("QFile::Permissions");
}
-void tst_QLocalSocket::cleanup()
-{
-}
-
class LocalServer : public QLocalServer
{
Q_OBJECT
@@ -190,7 +185,7 @@ private slots:
}
void slotError(QLocalSocket::LocalSocketError newError)
{
- QVERIFY(errorString() != "Unknown error");
+ QVERIFY(errorString() != QLatin1String("Unknown error"));
QCOMPARE(error(), newError);
}
void slotStateChanged(QLocalSocket::LocalSocketState newState)
@@ -328,8 +323,9 @@ void tst_QLocalSocket::listenAndConnect_data()
int connections = i;
if (i == 2)
connections = 5;
- QTest::newRow(QString("null %1").arg(i).toLatin1()) << QString() << false << connections;
- QTest::newRow(QString("tst_localsocket %1").arg(i).toLatin1()) << "tst_localsocket" << true << connections;
+ const QByteArray iB = QByteArray::number(i);
+ QTest::newRow(("null " + iB).constData()) << QString() << false << connections;
+ QTest::newRow(("tst_localsocket " + iB).constData()) << "tst_localsocket" << true << connections;
}
}
@@ -535,7 +531,7 @@ void tst_QLocalSocket::sendData()
if (server.hasPendingConnections()) {
QString testLine = "test";
for (int i = 0; i < 50000; ++i)
- testLine += "a";
+ testLine += QLatin1Char('a');
QLocalSocket *serverSocket = server.nextPendingConnection();
QVERIFY(serverSocket);
QCOMPARE(serverSocket->state(), QLocalSocket::ConnectedState);
@@ -1237,7 +1233,7 @@ void tst_QLocalSocket::verifyListenWithDescriptor()
QVERIFY2(server.fullServerName().at(0) == at, "abstract sockets should start with a '@'");
} else {
QCOMPARE(server.fullServerName(), path);
- if (path.contains(QLatin1String("/"))) {
+ if (path.contains(QLatin1Char('/'))) {
QVERIFY2(server.serverName() == path.mid(path.lastIndexOf(QLatin1Char('/'))+1), "server name invalid short name");
} else {
QVERIFY2(server.serverName() == path, "servier name doesn't match the path provided");
diff --git a/tests/auto/network/socket/qsocks5socketengine/tst_qsocks5socketengine.cpp b/tests/auto/network/socket/qsocks5socketengine/tst_qsocks5socketengine.cpp
index 8da656aab7..dfe882bdae 100644
--- a/tests/auto/network/socket/qsocks5socketengine/tst_qsocks5socketengine.cpp
+++ b/tests/auto/network/socket/qsocks5socketengine/tst_qsocks5socketengine.cpp
@@ -57,16 +57,9 @@ class tst_QSocks5SocketEngine : public QObject, public QAbstractSocketEngineRece
{
Q_OBJECT
-public:
- tst_QSocks5SocketEngine();
- virtual ~tst_QSocks5SocketEngine();
-
-
-public slots:
+private slots:
void initTestCase();
void init();
- void cleanup();
-private slots:
void construction();
void errorTest_data();
void errorTest();
@@ -160,14 +153,6 @@ private slots:
}
};
-tst_QSocks5SocketEngine::tst_QSocks5SocketEngine()
-{
-}
-
-tst_QSocks5SocketEngine::~tst_QSocks5SocketEngine()
-{
-}
-
void tst_QSocks5SocketEngine::initTestCase()
{
QVERIFY(QtNetworkSettings::verifyTestNetworkSettings());
@@ -179,10 +164,6 @@ void tst_QSocks5SocketEngine::init()
bytesAvailable = 0;
}
-void tst_QSocks5SocketEngine::cleanup()
-{
-}
-
//---------------------------------------------------------------------------
void tst_QSocks5SocketEngine::construction()
{
@@ -613,8 +594,8 @@ void tst_QSocks5SocketEngine::tcpSocketBlockingTest()
// Read greeting
QVERIFY(socket.waitForReadyRead(5000));
- QString s = socket.readLine();
- QVERIFY2(QtNetworkSettings::compareReplyIMAP(s.toLatin1()), s.toLatin1().constData());
+ QByteArray s = socket.readLine();
+ QVERIFY2(QtNetworkSettings::compareReplyIMAP(s), s.constData());
// Write NOOP
QCOMPARE((int) socket.write("1 NOOP\r\n", 8), 8);
@@ -624,7 +605,7 @@ void tst_QSocks5SocketEngine::tcpSocketBlockingTest()
// Read response
s = socket.readLine();
- QCOMPARE(s.toLatin1().constData(), "1 OK Completed\r\n");
+ QCOMPARE(s, QByteArrayLiteral("1 OK Completed\r\n"));
// Write LOGOUT
QCOMPARE((int) socket.write("2 LOGOUT\r\n", 10), 10);
@@ -634,13 +615,13 @@ void tst_QSocks5SocketEngine::tcpSocketBlockingTest()
// Read two lines of respose
s = socket.readLine();
- QCOMPARE(s.toLatin1().constData(), "* BYE LOGOUT received\r\n");
+ QCOMPARE(s, QByteArrayLiteral("* BYE LOGOUT received\r\n"));
if (!socket.canReadLine())
QVERIFY(socket.waitForReadyRead(5000));
s = socket.readLine();
- QCOMPARE(s.toLatin1().constData(), "2 OK Completed\r\n");
+ QCOMPARE(s, QByteArrayLiteral("2 OK Completed\r\n"));
// Close the socket
socket.close();
@@ -715,7 +696,7 @@ void tst_QSocks5SocketEngine::tcpSocketNonBlockingTest()
// Read response
QVERIFY(!tcpSocketNonBlocking_data.isEmpty());
- QCOMPARE(tcpSocketNonBlocking_data.at(0).toLatin1().constData(), "1 OK Completed\r\n");
+ QCOMPARE(tcpSocketNonBlocking_data.at(0), QLatin1String("1 OK Completed\r\n"));
tcpSocketNonBlocking_data.clear();
diff --git a/tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp b/tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp
index 5df5432cdd..5f5528c405 100644
--- a/tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp
+++ b/tests/auto/network/socket/qtcpserver/tst_qtcpserver.cpp
@@ -70,17 +70,11 @@ class tst_QTcpServer : public QObject
{
Q_OBJECT
-public:
- tst_QTcpServer();
- virtual ~tst_QTcpServer();
-
-
-public slots:
+private slots:
void initTestCase_data();
void initTestCase();
void init();
void cleanup();
-private slots:
void getSetCheck();
void constructing();
void clientServerLoop();
@@ -138,14 +132,6 @@ void tst_QTcpServer::getSetCheck()
QCOMPARE(INT_MAX, obj1.maxPendingConnections());
}
-tst_QTcpServer::tst_QTcpServer()
-{
-}
-
-tst_QTcpServer::~tst_QTcpServer()
-{
-}
-
void tst_QTcpServer::initTestCase_data()
{
QTest::addColumn<bool>("setProxy");
diff --git a/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp b/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp
index abbc560414..c7494e6f35 100644
--- a/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp
+++ b/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp
@@ -94,7 +94,6 @@ class tst_QTcpSocket : public QObject
public:
tst_QTcpSocket();
- virtual ~tst_QTcpSocket();
static void enterLoop(int secs)
{
@@ -201,6 +200,7 @@ private slots:
void setSocketOption();
void clientSendDataOnDelayedDisconnect();
void serverDisconnectWithBuffered();
+ void socketDiscardDataInWriteMode();
protected slots:
void nonBlockingIMAP_hostFound();
@@ -321,11 +321,6 @@ tst_QTcpSocket::tst_QTcpSocket()
firstFailInfo.setAddresses(QList<QHostAddress>() << QHostAddress("224.0.0.0") << QtNetworkSettings::serverIP());
}
-tst_QTcpSocket::~tst_QTcpSocket()
-{
-
-}
-
void tst_QTcpSocket::initTestCase_data()
{
QTest::addColumn<bool>("setProxy");
@@ -1775,7 +1770,7 @@ void tst_QTcpSocket::atEnd()
// Test server must use some vsFTPd 2.x.x version
QVERIFY2(greeting.length() == sizeof("220 (vsFTPd 2.x.x)")-1, qPrintable(greeting));
QVERIFY2(greeting.startsWith("220 (vsFTPd 2."), qPrintable(greeting));
- QVERIFY2(greeting.endsWith(")"), qPrintable(greeting));
+ QVERIFY2(greeting.endsWith(QLatin1Char(')')), qPrintable(greeting));
delete socket;
}
@@ -3028,5 +3023,36 @@ void tst_QTcpSocket::serverDisconnectWithBuffered()
delete socket;
}
+// Test buffered sockets discard input when opened in WriteOnly mode
+void tst_QTcpSocket::socketDiscardDataInWriteMode()
+{
+ QFETCH_GLOBAL(bool, setProxy);
+ if (setProxy)
+ return;
+
+ QTcpServer tcpServer;
+ QTcpSocket *socket = newSocket();
+
+ QVERIFY(tcpServer.listen(QHostAddress::LocalHost));
+ socket->connectToHost(tcpServer.serverAddress(), tcpServer.serverPort(),
+ QIODevice::WriteOnly);
+ QVERIFY(socket->waitForConnected(5000)); // ready for write
+ QCOMPARE(socket->state(), QAbstractSocket::ConnectedState);
+
+ // Accept connection on server side
+ QVERIFY2(tcpServer.waitForNewConnection(5000), "Network timeout");
+ QTcpSocket *newConnection = tcpServer.nextPendingConnection();
+ // Send one char and drop link
+ QVERIFY(newConnection != NULL);
+ QVERIFY(newConnection->putChar(0));
+ QVERIFY(newConnection->flush());
+ delete newConnection;
+
+ QVERIFY(socket->waitForReadyRead(5000)); // discard input
+ QVERIFY(socket->atEnd());
+
+ delete socket;
+}
+
QTEST_MAIN(tst_QTcpSocket)
#include "tst_qtcpsocket.moc"
diff --git a/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp b/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp
index 0ee3255502..62286bedb6 100644
--- a/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp
+++ b/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp
@@ -63,17 +63,11 @@ class tst_QUdpSocket : public QObject
{
Q_OBJECT
-public:
- tst_QUdpSocket();
- virtual ~tst_QUdpSocket();
-
-
-public slots:
+private slots:
void initTestCase_data();
void initTestCase();
void init();
void cleanup();
-private slots:
void constructing();
void unconnectedServerAndClientTest();
void broadcasting();
@@ -144,14 +138,6 @@ static QHostAddress makeNonAny(const QHostAddress &address, QHostAddress::Specia
return address;
}
-tst_QUdpSocket::tst_QUdpSocket()
-{
-}
-
-tst_QUdpSocket::~tst_QUdpSocket()
-{
-}
-
void tst_QUdpSocket::initTestCase_data()
{
// hack: we only enable the Socks5 over UDP tests on the old
@@ -1119,12 +1105,13 @@ void tst_QUdpSocket::multicastTtlOption_data()
addresses += QHostAddress(QHostAddress::AnyIPv6);
foreach (const QHostAddress &address, addresses) {
- QTest::newRow(QString("%1 0").arg(address.toString()).toLatin1()) << address << 0 << 0;
- QTest::newRow(QString("%1 1").arg(address.toString()).toLatin1()) << address << 1 << 1;
- QTest::newRow(QString("%1 2").arg(address.toString()).toLatin1()) << address << 2 << 2;
- QTest::newRow(QString("%1 128").arg(address.toString()).toLatin1()) << address << 128 << 128;
- QTest::newRow(QString("%1 255").arg(address.toString()).toLatin1()) << address << 255 << 255;
- QTest::newRow(QString("%1 1024").arg(address.toString()).toLatin1()) << address << 1024 << 1;
+ const QByteArray addressB = address.toString().toLatin1();
+ QTest::newRow((addressB + " 0").constData()) << address << 0 << 0;
+ QTest::newRow((addressB + " 1").constData()) << address << 1 << 1;
+ QTest::newRow((addressB + " 2").constData()) << address << 2 << 2;
+ QTest::newRow((addressB + " 128").constData()) << address << 128 << 128;
+ QTest::newRow((addressB + " 255").constData()) << address << 255 << 255;
+ QTest::newRow((addressB + " 1024").constData()) << address << 1024 << 1;
}
}
@@ -1163,13 +1150,14 @@ void tst_QUdpSocket::multicastLoopbackOption_data()
addresses += QHostAddress(QHostAddress::AnyIPv6);
foreach (const QHostAddress &address, addresses) {
- QTest::newRow(QString("%1 0").arg(address.toString()).toLatin1()) << address << 0 << 0;
- QTest::newRow(QString("%1 1").arg(address.toString()).toLatin1()) << address << 1 << 1;
- QTest::newRow(QString("%1 2").arg(address.toString()).toLatin1()) << address << 2 << 1;
- QTest::newRow(QString("%1 0 again").arg(address.toString()).toLatin1()) << address << 0 << 0;
- QTest::newRow(QString("%1 2 again").arg(address.toString()).toLatin1()) << address << 2 << 1;
- QTest::newRow(QString("%1 0 last time").arg(address.toString()).toLatin1()) << address << 0 << 0;
- QTest::newRow(QString("%1 1 again").arg(address.toString()).toLatin1()) << address << 1 << 1;
+ const QByteArray addressB = address.toString().toLatin1();
+ QTest::newRow((addressB + " 0").constData()) << address << 0 << 0;
+ QTest::newRow((addressB + " 1").constData()) << address << 1 << 1;
+ QTest::newRow((addressB + " 2").constData()) << address << 2 << 1;
+ QTest::newRow((addressB + " 0 again").constData()) << address << 0 << 0;
+ QTest::newRow((addressB + " 2 again").constData()) << address << 2 << 1;
+ QTest::newRow((addressB + " 0 last time").constData()) << address << 0 << 0;
+ QTest::newRow((addressB + " 1 again").constData()) << address << 1 << 1;
}
}
@@ -1266,9 +1254,8 @@ void tst_QUdpSocket::setMulticastInterface_data()
if ((iface.flags() & QNetworkInterface::IsUp) == 0)
continue;
foreach (const QNetworkAddressEntry &entry, iface.addressEntries()) {
- QTest::newRow(QString("%1:%2").arg(iface.name()).arg(entry.ip().toString()).toLatin1())
- << iface
- << entry.ip();
+ const QByteArray testName = iface.name().toLatin1() + ':' + entry.ip().toString().toLatin1();
+ QTest::newRow(testName.constData()) << iface << entry.ip();
}
}
}
diff --git a/tests/auto/network/ssl/qasn1element/qasn1element.pro b/tests/auto/network/ssl/qasn1element/qasn1element.pro
index 524c772443..006ac3428c 100644
--- a/tests/auto/network/ssl/qasn1element/qasn1element.pro
+++ b/tests/auto/network/ssl/qasn1element/qasn1element.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
SOURCES += tst_qasn1element.cpp
QT = core network network-private testlib
diff --git a/tests/auto/network/ssl/qsslcertificate/qsslcertificate.pro b/tests/auto/network/ssl/qsslcertificate/qsslcertificate.pro
index 26d6424a97..87a210c051 100644
--- a/tests/auto/network/ssl/qsslcertificate/qsslcertificate.pro
+++ b/tests/auto/network/ssl/qsslcertificate/qsslcertificate.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
SOURCES += tst_qsslcertificate.cpp
!wince:win32:LIBS += -lws2_32
diff --git a/tests/auto/network/ssl/qsslcertificate/tst_qsslcertificate.cpp b/tests/auto/network/ssl/qsslcertificate/tst_qsslcertificate.cpp
index 4c288fffaf..4ebaedd8de 100644
--- a/tests/auto/network/ssl/qsslcertificate/tst_qsslcertificate.cpp
+++ b/tests/auto/network/ssl/qsslcertificate/tst_qsslcertificate.cpp
@@ -423,15 +423,15 @@ void tst_QSslCertificate::subjectAlternativeNames()
QMapIterator<QSsl::AlternativeNameEntryType, QString> it(altSubjectNames);
while (it.hasNext()) {
it.next();
- QString type;
+ QByteArray type;
if (it.key() == QSsl::EmailEntry)
- type = QLatin1String("email");
+ type = "email";
else if (it.key() == QSsl::DnsEntry)
- type = QLatin1String("DNS");
+ type = "DNS";
else
QFAIL("unsupported alternative name type");
- QString entry = QString("%1:%2").arg(type).arg(it.value());
- QVERIFY(fileContents.contains(entry.toLatin1()));
+ const QByteArray entry = type + ':' + it.value().toLatin1();
+ QVERIFY(fileContents.contains(entry));
}
// verify that each entry in fileContents is present in subjAltNames
@@ -844,7 +844,7 @@ void tst_QSslCertificate::nulInCN()
QVERIFY(!cert.isNull());
QString cn = cert.subjectInfo(QSslCertificate::CommonName)[0];
- QVERIFY(cn != "www.bank.com");
+ QVERIFY(cn != QLatin1String("www.bank.com"));
static const char realCN[] = "www.bank.com\0.badguy.com";
QCOMPARE(cn, QString::fromLatin1(realCN, sizeof realCN - 1));
@@ -1064,7 +1064,7 @@ QString tst_QSslCertificate::toString(const QList<QSslError>& errors)
QStringList errorStrings;
foreach (const QSslError& error, errors) {
- errorStrings.append(QLatin1String("\"") + error.errorString() + QLatin1String("\""));
+ errorStrings.append(QLatin1Char('"') + error.errorString() + QLatin1Char('"'));
}
return QLatin1String("[ ") + errorStrings.join(QLatin1String(", ")) + QLatin1String(" ]");
diff --git a/tests/auto/network/ssl/qsslcipher/qsslcipher.pro b/tests/auto/network/ssl/qsslcipher/qsslcipher.pro
index 36e3c29b31..4cb2dfebab 100644
--- a/tests/auto/network/ssl/qsslcipher/qsslcipher.pro
+++ b/tests/auto/network/ssl/qsslcipher/qsslcipher.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
SOURCES += tst_qsslcipher.cpp
win32:!wince: LIBS += -lws2_32
diff --git a/tests/auto/network/ssl/qsslcipher/tst_qsslcipher.cpp b/tests/auto/network/ssl/qsslcipher/tst_qsslcipher.cpp
index 37c3762eec..f5e58e03ca 100644
--- a/tests/auto/network/ssl/qsslcipher/tst_qsslcipher.cpp
+++ b/tests/auto/network/ssl/qsslcipher/tst_qsslcipher.cpp
@@ -42,44 +42,14 @@ class tst_QSslCipher : public QObject
{
Q_OBJECT
-public:
- tst_QSslCipher();
- virtual ~tst_QSslCipher();
-
-public slots:
- void initTestCase_data();
- void init();
- void cleanup();
-
#ifndef QT_NO_SSL
private slots:
void constructing();
-#endif
+#endif // QT_NO_SSL
};
-tst_QSslCipher::tst_QSslCipher()
-{
-}
-
-tst_QSslCipher::~tst_QSslCipher()
-{
-
-}
-
-void tst_QSslCipher::initTestCase_data()
-{
-}
-
-void tst_QSslCipher::init()
-{
-}
-
-void tst_QSslCipher::cleanup()
-{
-}
-
#ifndef QT_NO_SSL
void tst_QSslCipher::constructing()
diff --git a/tests/auto/network/ssl/qsslellipticcurve/qsslellipticcurve.pro b/tests/auto/network/ssl/qsslellipticcurve/qsslellipticcurve.pro
index 747bb55ade..e67b64b2b7 100644
--- a/tests/auto/network/ssl/qsslellipticcurve/qsslellipticcurve.pro
+++ b/tests/auto/network/ssl/qsslellipticcurve/qsslellipticcurve.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
SOURCES += tst_qsslellipticcurve.cpp
win32:!wince: LIBS += -lws2_32
diff --git a/tests/auto/network/ssl/qsslerror/qsslerror.pro b/tests/auto/network/ssl/qsslerror/qsslerror.pro
index 6b7090db99..7737aae3f1 100644
--- a/tests/auto/network/ssl/qsslerror/qsslerror.pro
+++ b/tests/auto/network/ssl/qsslerror/qsslerror.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
SOURCES += tst_qsslerror.cpp
win32:!wince: LIBS += -lws2_32
diff --git a/tests/auto/network/ssl/qsslkey/qsslkey.pro b/tests/auto/network/ssl/qsslkey/qsslkey.pro
index a74f432890..7eb04793f3 100644
--- a/tests/auto/network/ssl/qsslkey/qsslkey.pro
+++ b/tests/auto/network/ssl/qsslkey/qsslkey.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
SOURCES += tst_qsslkey.cpp
win32:!wince: LIBS += -lws2_32
diff --git a/tests/auto/network/ssl/qsslkey/tst_qsslkey.cpp b/tests/auto/network/ssl/qsslkey/tst_qsslkey.cpp
index a7957d3288..81257a460f 100644
--- a/tests/auto/network/ssl/qsslkey/tst_qsslkey.cpp
+++ b/tests/auto/network/ssl/qsslkey/tst_qsslkey.cpp
@@ -279,13 +279,13 @@ void tst_QSslKey::toEncryptedPemOrDer_data()
<< "aAzZ`1234567890-=~!@#$%^&*()_+[]{}\\|;:'\",.<>/?"; // ### add more (?)
foreach (KeyInfo keyInfo, keyInfoList) {
foreach (QString password, passwords) {
- QString testName = QString("%1-%2-%3-%4-%5").arg(keyInfo.fileInfo.fileName())
- .arg(keyInfo.algorithm == QSsl::Rsa ? "RSA" :
- (keyInfo.algorithm == QSsl::Dsa ? "DSA" : "EC"))
- .arg(keyInfo.type == QSsl::PrivateKey ? "PrivateKey" : "PublicKey")
- .arg(keyInfo.format == QSsl::Pem ? "PEM" : "DER")
- .arg(password);
- QTest::newRow(testName.toLatin1())
+ const QByteArray testName = keyInfo.fileInfo.fileName().toLatin1()
+ + '-' + (keyInfo.algorithm == QSsl::Rsa ? "RSA" :
+ (keyInfo.algorithm == QSsl::Dsa ? "DSA" : "EC"))
+ + '-' + (keyInfo.type == QSsl::PrivateKey ? "PrivateKey" : "PublicKey")
+ + '-' + (keyInfo.format == QSsl::Pem ? "PEM" : "DER")
+ + password.toLatin1();
+ QTest::newRow(testName.constData())
<< keyInfo.fileInfo.absoluteFilePath() << keyInfo.algorithm << keyInfo.type
<< keyInfo.format << password;
}
diff --git a/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp b/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp
index 257df13343..3e127e8111 100644
--- a/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp
+++ b/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp
@@ -102,7 +102,6 @@ class tst_QSslSocket : public QObject
public:
tst_QSslSocket();
- virtual ~tst_QSslSocket();
static void enterLoop(int secs)
{
@@ -290,10 +289,6 @@ tst_QSslSocket::tst_QSslSocket()
#endif
}
-tst_QSslSocket::~tst_QSslSocket()
-{
-}
-
enum ProxyTests {
NoProxy = 0x00,
Socks5Proxy = 0x01,
diff --git a/tests/auto/network/ssl/qsslsocket_onDemandCertificates_member/qsslsocket_onDemandCertificates_member.pro b/tests/auto/network/ssl/qsslsocket_onDemandCertificates_member/qsslsocket_onDemandCertificates_member.pro
index 4f216ebb37..ae911e43ed 100644
--- a/tests/auto/network/ssl/qsslsocket_onDemandCertificates_member/qsslsocket_onDemandCertificates_member.pro
+++ b/tests/auto/network/ssl/qsslsocket_onDemandCertificates_member/qsslsocket_onDemandCertificates_member.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
testcase.timeout = 300 # this test is slow
SOURCES += tst_qsslsocket_onDemandCertificates_member.cpp
diff --git a/tests/auto/network/ssl/qsslsocket_onDemandCertificates_member/tst_qsslsocket_onDemandCertificates_member.cpp b/tests/auto/network/ssl/qsslsocket_onDemandCertificates_member/tst_qsslsocket_onDemandCertificates_member.cpp
index 3a31241b77..a2b2af008c 100644
--- a/tests/auto/network/ssl/qsslsocket_onDemandCertificates_member/tst_qsslsocket_onDemandCertificates_member.cpp
+++ b/tests/auto/network/ssl/qsslsocket_onDemandCertificates_member/tst_qsslsocket_onDemandCertificates_member.cpp
@@ -57,8 +57,6 @@ class tst_QSslSocket_onDemandCertificates_member : public QObject
int proxyAuthCalled;
public:
- tst_QSslSocket_onDemandCertificates_member();
- virtual ~tst_QSslSocket_onDemandCertificates_member();
#ifndef QT_NO_OPENSSL
QSslSocketPtr newSocket();
@@ -80,14 +78,6 @@ private:
#endif // QT_NO_OPENSSL
};
-tst_QSslSocket_onDemandCertificates_member::tst_QSslSocket_onDemandCertificates_member()
-{
-}
-
-tst_QSslSocket_onDemandCertificates_member::~tst_QSslSocket_onDemandCertificates_member()
-{
-}
-
enum ProxyTests {
NoProxy = 0x00,
Socks5Proxy = 0x01,
@@ -215,7 +205,7 @@ void tst_QSslSocket_onDemandCertificates_member::onDemandRootCertLoadingMemberMe
socket4->connectToHostEncrypted(host, 443);
#ifdef QT_BUILD_INTERNAL
bool rootCertLoadingAllowed = QSslSocketPrivate::rootCertOnDemandLoadingSupported();
-#if defined(Q_OS_LINUX) || defined (Q_OS_BLACKBERRY)
+#if defined(Q_OS_LINUX)
QCOMPARE(rootCertLoadingAllowed, true);
#elif defined(Q_OS_MAC)
QCOMPARE(rootCertLoadingAllowed, false);
diff --git a/tests/auto/network/ssl/qsslsocket_onDemandCertificates_static/qsslsocket_onDemandCertificates_static.pro b/tests/auto/network/ssl/qsslsocket_onDemandCertificates_static/qsslsocket_onDemandCertificates_static.pro
index 96a6162ce6..25e5a5d5c7 100644
--- a/tests/auto/network/ssl/qsslsocket_onDemandCertificates_static/qsslsocket_onDemandCertificates_static.pro
+++ b/tests/auto/network/ssl/qsslsocket_onDemandCertificates_static/qsslsocket_onDemandCertificates_static.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
SOURCES += tst_qsslsocket_onDemandCertificates_static.cpp
win32:!wince: LIBS += -lws2_32
diff --git a/tests/auto/network/ssl/qsslsocket_onDemandCertificates_static/tst_qsslsocket_onDemandCertificates_static.cpp b/tests/auto/network/ssl/qsslsocket_onDemandCertificates_static/tst_qsslsocket_onDemandCertificates_static.cpp
index 877cc5c12b..ed6a0bd52f 100644
--- a/tests/auto/network/ssl/qsslsocket_onDemandCertificates_static/tst_qsslsocket_onDemandCertificates_static.cpp
+++ b/tests/auto/network/ssl/qsslsocket_onDemandCertificates_static/tst_qsslsocket_onDemandCertificates_static.cpp
@@ -53,8 +53,6 @@ class tst_QSslSocket_onDemandCertificates_static : public QObject
int proxyAuthCalled;
public:
- tst_QSslSocket_onDemandCertificates_static();
- virtual ~tst_QSslSocket_onDemandCertificates_static();
#ifndef QT_NO_OPENSSL
QSslSocketPtr newSocket();
@@ -76,14 +74,6 @@ private:
#endif // QT_NO_OPENSSL
};
-tst_QSslSocket_onDemandCertificates_static::tst_QSslSocket_onDemandCertificates_static()
-{
-}
-
-tst_QSslSocket_onDemandCertificates_static::~tst_QSslSocket_onDemandCertificates_static()
-{
-}
-
enum ProxyTests {
NoProxy = 0x00,
Socks5Proxy = 0x01,
diff --git a/tests/auto/opengl/qgl/qgl.pro b/tests/auto/opengl/qgl/qgl.pro
index 35b5c6888b..af930c5be7 100644
--- a/tests/auto/opengl/qgl/qgl.pro
+++ b/tests/auto/opengl/qgl/qgl.pro
@@ -9,7 +9,3 @@ QT += widgets widgets-private opengl-private gui-private core-private testlib
SOURCES += tst_qgl.cpp
RESOURCES = qgl.qrc
-
-linux-*:system(". /etc/lsb-release && [ $DISTRIB_CODENAME = lucid ]"): CONFIG+=insignificant_test # QTBUG-25293
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
-win32-msvc2010:contains(QT_CONFIG, angle):CONFIG += insignificant_test # QTQAINFRA-711
diff --git a/tests/auto/opengl/qglbuffer/qglbuffer.pro b/tests/auto/opengl/qglbuffer/qglbuffer.pro
index 72117322da..f12a191f79 100644
--- a/tests/auto/opengl/qglbuffer/qglbuffer.pro
+++ b/tests/auto/opengl/qglbuffer/qglbuffer.pro
@@ -3,10 +3,8 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qglbuffer
requires(qtHaveModule(opengl))
QT += opengl widgets testlib
SOURCES += tst_qglbuffer.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/opengl/qglfunctions/qglfunctions.pro b/tests/auto/opengl/qglfunctions/qglfunctions.pro
index a512ea0dd9..9b349eaf34 100644
--- a/tests/auto/opengl/qglfunctions/qglfunctions.pro
+++ b/tests/auto/opengl/qglfunctions/qglfunctions.pro
@@ -1,10 +1,6 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qglfunctions
requires(qtHaveModule(opengl))
QT += opengl widgets testlib
SOURCES += tst_qglfunctions.cpp
-
-win32:CONFIG+=insignificant_test # QTBUG-26390
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/opengl/qglthreads/qglthreads.pro b/tests/auto/opengl/qglthreads/qglthreads.pro
index 3502c41c87..ab8bda741e 100644
--- a/tests/auto/opengl/qglthreads/qglthreads.pro
+++ b/tests/auto/opengl/qglthreads/qglthreads.pro
@@ -10,6 +10,5 @@ x11 {
LIBS += $$QMAKE_LIBS_X11
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
-win32:CONFIG+=insignificant_test # QTBUG-28264
+
diff --git a/tests/auto/opengl/qglthreads/tst_qglthreads.cpp b/tests/auto/opengl/qglthreads/tst_qglthreads.cpp
index ff5a18dedb..7b7064529f 100644
--- a/tests/auto/opengl/qglthreads/tst_qglthreads.cpp
+++ b/tests/auto/opengl/qglthreads/tst_qglthreads.cpp
@@ -702,6 +702,9 @@ private:
*/
void tst_QGLThreads::painterOnGLWidgetInThread()
{
+ //QTBUG-46446 tst_qglthreads is unstable on windows 7
+ if (QGuiApplication::platformName().compare("windows 7", Qt::CaseInsensitive))
+ QSKIP("Doesn't work on this platform. QTBUG-46446");
if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ThreadedOpenGL))
QSKIP("No platformsupport for ThreadedOpenGL");
if (!((QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_2_0) ||
@@ -746,6 +749,9 @@ void tst_QGLThreads::painterOnPixmapInThread()
*/
void tst_QGLThreads::painterOnPboInThread()
{
+ //QTBUG-46446 tst_qglthreads is unstable on windows 7
+ if (QGuiApplication::platformName().compare("windows 7", Qt::CaseInsensitive))
+ QSKIP("Doesn't work on this platform. QTBUG-46446");
if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ThreadedOpenGL))
QSKIP("No platformsupport for ThreadedOpenGL");
if (!((QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_2_0) ||
@@ -773,6 +779,9 @@ void tst_QGLThreads::painterOnPboInThread()
*/
void tst_QGLThreads::painterOnFboInThread()
{
+ //QTBUG-46446 tst_qglthreads is unstable on windows 7
+ if (QGuiApplication::platformName().compare("windows 7", Qt::CaseInsensitive))
+ QSKIP("Doesn't work on this platform. QTBUG-46446");
if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ThreadedOpenGL))
QSKIP("No platformsupport for ThreadedOpenGL");
if (!((QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_2_0) ||
diff --git a/tests/auto/other/atwrapper/atWrapper.cpp b/tests/auto/other/atwrapper/atWrapper.cpp
index 4260ca18b8..a75a7b91bf 100644
--- a/tests/auto/other/atwrapper/atWrapper.cpp
+++ b/tests/auto/other/atwrapper/atWrapper.cpp
@@ -149,9 +149,10 @@ void atWrapper::ftpMgetDone( bool error)
if ( mgetDirList.size() > 1 )
for ( int i = 1; i < mgetDirList.size(); ++i )
{
- file = new QFile( QString( output ) + "/" + mgetDirList.at( 0 ) + "/" + mgetDirList.at( i ) );
+ file = new QFile( QString( output ) + QLatin1Char('/') + mgetDirList.at( 0 )
+ + QLatin1Char('/') + mgetDirList.at( i ) );
if (file->open(QIODevice::WriteOnly)) {
- ftp.get( ftpBaseDir + "/" + mgetDirList.at( 0 ) + "/" + mgetDirList.at( i ), file );
+ ftp.get( ftpBaseDir + QLatin1Char('/') + mgetDirList.at( 0 ) + QLatin1Char('/') + mgetDirList.at( i ), file );
ftp.list(); //Only there to fill up a slot in the pendingCommands queue.
while ( ftp.hasPendingCommands() )
QCoreApplication::instance()->processEvents();
@@ -192,11 +193,11 @@ bool atWrapper::setupFTP()
QString dir = "";
ftpMkDir( ftpBaseDir );
- ftpBaseDir += "/" + QLibraryInfo::buildKey();
+ ftpBaseDir += QLatin1Char('/') + QLibraryInfo::buildKey();
ftpMkDir( ftpBaseDir );
- ftpBaseDir += "/" + QString( qVersion() );
+ ftpBaseDir += QLatin1Char('/') + QString( qVersion() );
ftpMkDir( ftpBaseDir );
@@ -209,9 +210,9 @@ bool atWrapper::setupFTP()
{
i.next();
//qDebug() << "Creating dir with key:" << i.key();
- ftpMkDir( ftpBaseDir + "/" + QString( i.key() ) + ".failed" );
- ftpMkDir( ftpBaseDir + "/" + QString( i.key() ) + ".diff" );
- if (!ftpMkDir( ftpBaseDir + "/" + QString( i.key() ) + ".baseline" ))
+ ftpMkDir( ftpBaseDir + QLatin1Char('/') + QString( i.key() ) + ".failed" );
+ ftpMkDir( ftpBaseDir + QLatin1Char('/') + QString( i.key() ) + ".diff" );
+ if (!ftpMkDir( ftpBaseDir + QLatin1Char('/') + QString( i.key() ) + ".baseline" ))
haveBaseline = false;
}
@@ -226,7 +227,7 @@ bool atWrapper::setupFTP()
{
j.next();
rmDirList.clear();
- rmDirList << ftpBaseDir + "/" + j.key() + ".failed" + "/";
+ rmDirList << ftpBaseDir + QLatin1Char('/') + j.key() + ".failed/";
ftpRmDir( j.key() + ".failed" );
ftp.rmdir( j.key() + ".failed" );
ftp.mkdir( j.key() + ".failed" );
@@ -236,7 +237,7 @@ bool atWrapper::setupFTP()
QCoreApplication::instance()->processEvents();
rmDirList.clear();
- rmDirList << ftpBaseDir + "/" + j.key() + ".diff" + "/";
+ rmDirList << ftpBaseDir + QLatin1Char('/') + j.key() + ".diff/";
ftpRmDir( j.key() + ".diff" );
ftp.rmdir( j.key() + ".diff" );
ftp.mkdir( j.key() + ".diff" );
@@ -396,7 +397,7 @@ void atWrapper::createBaseline()
for (int n = 0; n < list.size(); n++)
{
QFileInfo fileInfo = list.at( n );
- QFile file( QString( output ) + "/" + i.key() + "/" + fileInfo.fileName() );
+ QFile file( QString( output ) + QLatin1Char('/') + i.key() + QLatin1Char('/') + fileInfo.fileName() );
file.open( QIODevice::ReadOnly );
QByteArray fileData = file.readAll();
//qDebug() << "Sending up:" << fileInfo.fileName() << "with file size" << fileData.size();
@@ -470,9 +471,9 @@ bool atWrapper::diff( QString basedir, QString dir, QString target )
//Comparing the two specified files, and then uploading them to
//the ftp server if they differ
- basedir += "/" + dir;
+ basedir += QLatin1Char('/') + dir;
QString one = basedir + ".baseline/" + target;
- QString two = basedir + "/" + target;
+ QString two = basedir + QLatin1Char('/') + target;
QFile file( one );
@@ -517,7 +518,7 @@ void atWrapper::uploadDiff( QString basedir, QString dir, QString filename )
qDebug() << basedir;
QImage im1( basedir + ".baseline/" + filename );
- QImage im2( basedir + "/" + filename );
+ QImage im2( basedir + QLatin1Char('/') + filename );
QImage im3(im1.size(), QImage::Format_ARGB32);
@@ -591,16 +592,16 @@ bool atWrapper::loadConfig( QString path )
QDir::current().mkdir( output );
- output += "/" + QLibraryInfo::buildKey();
+ output += QLatin1Char('/') + QLibraryInfo::buildKey();
QDir::current().mkdir( output );
- output += "/" + QString( qVersion() );
+ output += QLatin1Char('/') + QString( qVersion() );
QDir::current().mkdir( output );
- ftpBaseDir += "/" + QHostInfo::localHostName().split( "." ).first();
+ ftpBaseDir += QLatin1Char('/') + QHostInfo::localHostName().split( QLatin1Char('.') ).first();
/*
diff --git a/tests/auto/other/compiler/compiler.pro b/tests/auto/other/compiler/compiler.pro
index 356013c8f1..19f86582e9 100644
--- a/tests/auto/other/compiler/compiler.pro
+++ b/tests/auto/other/compiler/compiler.pro
@@ -7,4 +7,3 @@ contains(QT_CONFIG, c++11): CONFIG += c++11
contains(QT_CONFIG, c++14): CONFIG += c++14
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/gestures/gestures.pro b/tests/auto/other/gestures/gestures.pro
index fa87dbddfb..3d0ef7c745 100644
--- a/tests/auto/other/gestures/gestures.pro
+++ b/tests/auto/other/gestures/gestures.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_gestures
QT += widgets testlib gui-private
SOURCES += tst_gestures.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/gestures/tst_gestures.cpp b/tests/auto/other/gestures/tst_gestures.cpp
index 2a4f88c627..fa65c29b00 100644
--- a/tests/auto/other/gestures/tst_gestures.cpp
+++ b/tests/auto/other/gestures/tst_gestures.cpp
@@ -36,6 +36,7 @@
#include <QtTest/qtesttouch.h>
#include <qevent.h>
+#include <qtouchdevice.h>
#include <qwidget.h>
#include <qlayout.h>
#include <qgesture.h>
@@ -308,17 +309,9 @@ class tst_Gestures : public QObject
{
Q_OBJECT
-public:
- tst_Gestures();
- virtual ~tst_Gestures();
-
-public slots:
+private slots:
void initTestCase();
void cleanupTestCase();
- void init();
- void cleanup();
-
-private slots:
void customGesture();
void autoCancelingGestures();
void gestureOverChild();
@@ -354,14 +347,6 @@ private slots:
void bug_13501_gesture_not_accepted();
};
-tst_Gestures::tst_Gestures()
-{
-}
-
-tst_Gestures::~tst_Gestures()
-{
-}
-
void tst_Gestures::initTestCase()
{
CustomGesture::GestureType = QGestureRecognizer::registerRecognizer(new CustomGestureRecognizer);
@@ -374,14 +359,6 @@ void tst_Gestures::cleanupTestCase()
QGestureRecognizer::unregisterRecognizer(CustomGesture::GestureType);
}
-void tst_Gestures::init()
-{
-}
-
-void tst_Gestures::cleanup()
-{
-}
-
void tst_Gestures::customGesture()
{
GestureWidget widget;
diff --git a/tests/auto/other/lancelot/lancelot.pro b/tests/auto/other/lancelot/lancelot.pro
index ef557691e3..6e79566649 100644
--- a/tests/auto/other/lancelot/lancelot.pro
+++ b/tests/auto/other/lancelot/lancelot.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
CONFIG -= app_bundle
TARGET = tst_lancelot
QT += xml widgets testlib
@@ -12,4 +11,3 @@ RESOURCES += images.qrc
include($$PWD/../../../baselineserver/shared/qbaselinetest.pri)
TESTDATA += scripts/*
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/lancelot/paintcommands.cpp b/tests/auto/other/lancelot/paintcommands.cpp
index 4fc41fd649..15454b59d2 100644
--- a/tests/auto/other/lancelot/paintcommands.cpp
+++ b/tests/auto/other/lancelot/paintcommands.cpp
@@ -650,7 +650,7 @@ template <typename T> T PaintCommands::image_load(const QString &filepath)
QDir dir = fi.absoluteDir();
dir.cdUp();
dir.cd("images");
- QString fileName = QString("%1/%2").arg(dir.absolutePath()).arg(fi.fileName());
+ QString fileName = dir.absolutePath() + QLatin1Char('/') + fi.fileName();
t = T(fileName);
if (t.isNull() && !fileName.endsWith(".png")) {
fileName.append(".png");
@@ -841,10 +841,11 @@ void PaintCommands::command_import(QRegExp re)
qPrintable(fi.fileName()));
QFileInfo fileinfo(*file);
- m_commands[m_currentCommandIndex] = QString("# import file (%1) start").arg(fileinfo.fileName());
+ m_commands[m_currentCommandIndex] = QLatin1String("# import file (") + fileinfo.fileName()
+ + QLatin1String(") start");
QString rawContent = QString::fromUtf8(file->readAll());
QStringList importedData = rawContent.split('\n', QString::SkipEmptyParts);
- importedData.append(QString("# import file (%1) end ---").arg(fileinfo.fileName()));
+ importedData.append(QLatin1String("# import file (") + fileinfo.fileName() + QLatin1String(") end ---"));
insertAt(m_currentCommandIndex, importedData);
if (m_verboseMode) {
@@ -862,13 +863,13 @@ void PaintCommands::command_begin_block(QRegExp re)
if (m_verboseMode)
printf(" -(lance) begin_block (%s)\n", qPrintable(blockName));
- m_commands[m_currentCommandIndex] = QString("# begin block (%1)").arg(blockName);
+ m_commands[m_currentCommandIndex] = QLatin1String("# begin block (") + blockName + QLatin1Char(')');
QStringList newBlock;
int i = m_currentCommandIndex + 1;
for (; i < m_commands.count(); ++i) {
const QString &nextCmd = m_commands.at(i);
if (nextCmd.startsWith("end_block")) {
- m_commands[i] = QString("# end block (%1)").arg(blockName);
+ m_commands[i] = QLatin1String("# end block (") + blockName + QLatin1Char(')');
break;
}
newBlock += nextCmd;
@@ -905,7 +906,7 @@ void PaintCommands::command_repeat_block(QRegExp re)
return;
}
- m_commands[m_currentCommandIndex] = QString("# repeated block (%1)").arg(blockName);
+ m_commands[m_currentCommandIndex] = QLatin1String("# repeated block (") + blockName + QLatin1Char(')');
insertAt(m_currentCommandIndex, block);
}
@@ -946,7 +947,7 @@ void PaintCommands::command_drawPixmap(QRegExp re)
QDir dir = fi.absoluteDir();
dir.cdUp();
dir.cd("images");
- QString fileName = QString("%1/%2").arg(dir.absolutePath()).arg(re.cap(1));
+ QString fileName = dir.absolutePath() + QLatin1Char('/') + re.cap(1);
pm = QPixmap(fileName);
if (pm.isNull() && !fileName.endsWith(".png")) {
fileName.append(".png");
@@ -995,7 +996,7 @@ void PaintCommands::command_drawImage(QRegExp re)
QDir dir = fi.absoluteDir();
dir.cdUp();
dir.cd("images");
- QString fileName = QString("%1/%2").arg(dir.absolutePath()).arg(re.cap(1));
+ QString fileName = dir.absolutePath() + QLatin1Char('/') + re.cap(1);
im = QImage(fileName);
if (im.isNull() && !fileName.endsWith(".png")) {
fileName.append(".png");
@@ -1041,7 +1042,7 @@ void PaintCommands::command_drawTiledPixmap(QRegExp re)
QDir dir = fi.absoluteDir();
dir.cdUp();
dir.cd("images");
- QString fileName = QString("%1/%2").arg(dir.absolutePath()).arg(re.cap(1));
+ QString fileName = dir.absolutePath() + QLatin1Char('/') + re.cap(1);
pm = QPixmap(fileName);
if (pm.isNull() && !fileName.endsWith(".png")) {
fileName.append(".png");
diff --git a/tests/auto/other/languagechange/languagechange.pro b/tests/auto/other/languagechange/languagechange.pro
index 0b9c04d2ed..7dbd47f63d 100644
--- a/tests/auto/other/languagechange/languagechange.pro
+++ b/tests/auto/other/languagechange/languagechange.pro
@@ -1,7 +1,5 @@
CONFIG += testcase
-CONFIG += parallel_test
win32:testcase.timeout = 1800 # test runtime varies greatly on Windows, QTBUG-26006
TARGET = tst_languagechange
QT += widgets core-private gui-private testlib
SOURCES += tst_languagechange.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/languagechange/tst_languagechange.cpp b/tests/auto/other/languagechange/tst_languagechange.cpp
index 68d604547d..493e279e18 100644
--- a/tests/auto/other/languagechange/tst_languagechange.cpp
+++ b/tests/auto/other/languagechange/tst_languagechange.cpp
@@ -253,7 +253,7 @@ void tst_languageChange::retranslatability()
switch (dialogType) {
case InputDialog:
stateMachine.start();
- QInputDialog::getInteger(0, QLatin1String("title"), QLatin1String("label"));
+ QInputDialog::getInt(0, QLatin1String("title"), QLatin1String("label"));
break;
case ColorDialog:
diff --git a/tests/auto/other/macgui/macgui.pro b/tests/auto/other/macgui/macgui.pro
index bf805ccd75..b557806555 100644
--- a/tests/auto/other/macgui/macgui.pro
+++ b/tests/auto/other/macgui/macgui.pro
@@ -7,4 +7,3 @@ HEADERS += guitest.h
QT = core-private widgets-private testlib
requires(mac)
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/macnativeevents/qnativeevents.cpp b/tests/auto/other/macnativeevents/qnativeevents.cpp
index 1402182042..db8f2bd193 100644
--- a/tests/auto/other/macnativeevents/qnativeevents.cpp
+++ b/tests/auto/other/macnativeevents/qnativeevents.cpp
@@ -222,46 +222,46 @@ QDebug operator<<(QDebug d, const QNativeEvent &e)
QTextStream &operator<<(QTextStream &s, QNativeEvent *e)
{
- return s << e->eventId << " " << e->modifiers << " QNativeEvent";
+ return s << e->eventId << ' ' << e->modifiers << " QNativeEvent";
}
QTextStream &operator<<(QTextStream &s, QNativeMouseEvent *e)
{
- return s << e->eventId << " " << e->globalPos.x() << " " << e->globalPos.y() << " " << e->modifiers << " " << e->toString();
+ return s << e->eventId << ' ' << e->globalPos.x() << ' ' << e->globalPos.y() << ' ' << e->modifiers << ' ' << e->toString();
}
QTextStream &operator<<(QTextStream &s, QNativeMouseMoveEvent *e)
{
- return s << e->eventId << " " << e->globalPos.x() << " " << e->globalPos.y() << " " << e->modifiers << " " << e->toString();
+ return s << e->eventId << ' ' << e->globalPos.x() << ' ' << e->globalPos.y() << ' ' << e->modifiers << ' ' << e->toString();
}
QTextStream &operator<<(QTextStream &s, QNativeMouseButtonEvent *e)
{
- return s << e->eventId << " " << e->globalPos.x() << " " << e->globalPos.y() << " " << e->button
- << " " << e->clickCount << " " << e->modifiers << " " << e->toString();
+ return s << e->eventId << ' ' << e->globalPos.x() << ' ' << e->globalPos.y() << ' ' << e->button
+ << ' ' << e->clickCount << ' ' << e->modifiers << ' ' << e->toString();
}
QTextStream &operator<<(QTextStream &s, QNativeMouseDragEvent *e)
{
- return s << e->eventId << " " << e->globalPos.x() << " " << e->globalPos.y() << " " << e->button << " " << e->clickCount
- << " " << e->modifiers << " " << e->toString();
+ return s << e->eventId << ' ' << e->globalPos.x() << ' ' << e->globalPos.y() << ' ' << e->button << ' ' << e->clickCount
+ << ' ' << e->modifiers << ' ' << e->toString();
}
QTextStream &operator<<(QTextStream &s, QNativeMouseWheelEvent *e)
{
- return s << e->eventId << " " << e->globalPos.x() << " " << e->globalPos.y() << " " << e->delta
- << " " << e->modifiers << " " << e->toString();
+ return s << e->eventId << ' ' << e->globalPos.x() << ' ' << e->globalPos.y() << ' ' << e->delta
+ << ' ' << e->modifiers << ' ' << e->toString();
}
QTextStream &operator<<(QTextStream &s, QNativeKeyEvent *e)
{
- return s << e->eventId << " " << e->press << " " << e->nativeKeyCode << " " << e->character
- << " " << e->modifiers << " " << e->toString();
+ return s << e->eventId << ' ' << e->press << ' ' << e->nativeKeyCode << ' ' << e->character
+ << ' ' << e->modifiers << ' ' << e->toString();
}
QTextStream &operator<<(QTextStream &s, QNativeModifierEvent *e)
{
- return s << e->eventId << " " << e->modifiers << " " << e->nativeKeyCode << " " << e->toString();
+ return s << e->eventId << ' ' << e->modifiers << ' ' << e->nativeKeyCode << ' ' << e->toString();
}
diff --git a/tests/auto/other/macplist/app/app.pro b/tests/auto/other/macplist/app/app.pro
index c4dfedb104..9ccac831d0 100644
--- a/tests/auto/other/macplist/app/app.pro
+++ b/tests/auto/other/macplist/app/app.pro
@@ -1,4 +1,3 @@
QT += widgets
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/macplist/test/test.pro b/tests/auto/other/macplist/test/test.pro
index 6dad17ab67..5018abeca9 100644
--- a/tests/auto/other/macplist/test/test.pro
+++ b/tests/auto/other/macplist/test/test.pro
@@ -10,4 +10,3 @@ win32 {
TARGET = ../../release/tst_macplist
}
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/modeltest/dynamictreemodel.cpp b/tests/auto/other/modeltest/dynamictreemodel.cpp
index c7cf04231f..bdf2b604fd 100644
--- a/tests/auto/other/modeltest/dynamictreemodel.cpp
+++ b/tests/auto/other/modeltest/dynamictreemodel.cpp
@@ -299,7 +299,8 @@ bool ModelResetCommand::emitPreSignal(const QModelIndex &srcParent, int srcStart
void ModelResetCommand::emitPostSignal()
{
- m_model->reset();
+ m_model->beginResetModel();
+ m_model->endResetModel();
}
ModelResetCommandFixed::ModelResetCommandFixed(DynamicTreeModel* model, QObject* parent)
diff --git a/tests/auto/other/modeltest/modeltest.pro b/tests/auto/other/modeltest/modeltest.pro
index 045299e095..8e96058449 100644
--- a/tests/auto/other/modeltest/modeltest.pro
+++ b/tests/auto/other/modeltest/modeltest.pro
@@ -3,7 +3,3 @@ TARGET = tst_modeltest
QT += widgets testlib
SOURCES += tst_modeltest.cpp modeltest.cpp dynamictreemodel.cpp
HEADERS += modeltest.h dynamictreemodel.h
-
-
-
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/modeltest/tst_modeltest.cpp b/tests/auto/other/modeltest/tst_modeltest.cpp
index 06195fdbae..f07609b230 100644
--- a/tests/auto/other/modeltest/tst_modeltest.cpp
+++ b/tests/auto/other/modeltest/tst_modeltest.cpp
@@ -44,16 +44,6 @@ class tst_ModelTest : public QObject
{
Q_OBJECT
-public:
- tst_ModelTest() {}
- virtual ~tst_ModelTest() {}
-
-public slots:
- void initTestCase();
- void cleanupTestCase();
- void init();
- void cleanup();
-
private slots:
void stringListModel();
void treeWidgetModel();
@@ -63,24 +53,6 @@ private slots:
void testResetThroughProxy();
};
-
-
-void tst_ModelTest::initTestCase()
-{
-}
-
-void tst_ModelTest::cleanupTestCase()
-{
-}
-
-void tst_ModelTest::init()
-{
-
-}
-
-void tst_ModelTest::cleanup()
-{
-}
/*
tests
*/
diff --git a/tests/auto/other/networkselftest/networkselftest.pro b/tests/auto/other/networkselftest/networkselftest.pro
index 60b45e6b5e..7c307a097b 100644
--- a/tests/auto/other/networkselftest/networkselftest.pro
+++ b/tests/auto/other/networkselftest/networkselftest.pro
@@ -3,5 +3,3 @@ TARGET = tst_networkselftest
SOURCES += tst_networkselftest.cpp
QT = core core-private network testlib
-
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/networkselftest/tst_networkselftest.cpp b/tests/auto/other/networkselftest/tst_networkselftest.cpp
index 7ce385121c..257a7fc03d 100644
--- a/tests/auto/other/networkselftest/tst_networkselftest.cpp
+++ b/tests/auto/other/networkselftest/tst_networkselftest.cpp
@@ -986,8 +986,8 @@ void tst_NetworkSelfTest::smbServer()
static const char contents[] = "This is 34 bytes. Do not change...";
#ifdef Q_OS_WIN
// use Windows's native UNC support to try and open a file on the server
- QString filepath = QString("\\\\%1\\testshare\\test.pri").arg(QtNetworkSettings::winServerName());
- FILE *f = fopen(filepath.toLatin1(), "rb");
+ QByteArray filepath = "\\\\" + QtNetworkSettings::winServerName().toLatin1() + "\\testshare\\test.pri";
+ FILE *f = fopen(filepath.constData(), "rb");
QVERIFY2(f, qt_error_string().toLocal8Bit());
char buf[128];
diff --git a/tests/auto/other/qaccessibility/qaccessibility.pro b/tests/auto/other/qaccessibility/qaccessibility.pro
index 1d6fc6bcd1..ef3b469ba1 100644
--- a/tests/auto/other/qaccessibility/qaccessibility.pro
+++ b/tests/auto/other/qaccessibility/qaccessibility.pro
@@ -21,4 +21,3 @@ win32 {
LIBS += -luuid
!winphone: LIBS += -loleacc -loleaut32 -lole32
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
index 62c2c0a916..5ba789a0ea 100644
--- a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
+++ b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
@@ -205,7 +205,6 @@ class tst_QAccessibility : public QObject
Q_OBJECT
public:
tst_QAccessibility();
- virtual ~tst_QAccessibility();
public slots:
void initTestCase();
@@ -286,10 +285,6 @@ tst_QAccessibility::tst_QAccessibility()
click_count = 0;
}
-tst_QAccessibility::~tst_QAccessibility()
-{
-}
-
void tst_QAccessibility::onClicked()
{
click_count++;
@@ -573,7 +568,7 @@ static QWidget *createWidgets()
int i = 0;
box->addWidget(new QComboBox(w));
- box->addWidget(new QPushButton(QString::fromLatin1("widget text %1").arg(i++), w));
+ box->addWidget(new QPushButton(QLatin1String("widget text ") + QString::number(i++), w));
box->addWidget(new QHeaderView(Qt::Vertical, w));
box->addWidget(new QTreeView(w));
box->addWidget(new QTreeWidget(w));
@@ -583,25 +578,25 @@ static QWidget *createWidgets()
box->addWidget(new QTableWidget(w));
box->addWidget(new QCalendarWidget(w));
box->addWidget(new QDialogButtonBox(w));
- box->addWidget(new QGroupBox(QString::fromLatin1("widget text %1").arg(i++), w));
+ box->addWidget(new QGroupBox(QLatin1String("widget text ") + QString::number(i++), w));
box->addWidget(new QFrame(w));
- box->addWidget(new QLineEdit(QString::fromLatin1("widget text %1").arg(i++), w));
+ box->addWidget(new QLineEdit(QLatin1String("widget text ") + QString::number(i++), w));
box->addWidget(new QProgressBar(w));
box->addWidget(new QTabWidget(w));
- box->addWidget(new QCheckBox(QString::fromLatin1("widget text %1").arg(i++), w));
- box->addWidget(new QRadioButton(QString::fromLatin1("widget text %1").arg(i++), w));
+ box->addWidget(new QCheckBox(QLatin1String("widget text ") + QString::number(i++), w));
+ box->addWidget(new QRadioButton(QLatin1String("widget text ") + QString::number(i++), w));
box->addWidget(new QDial(w));
box->addWidget(new QScrollBar(w));
box->addWidget(new QSlider(w));
box->addWidget(new QDateTimeEdit(w));
box->addWidget(new QDoubleSpinBox(w));
box->addWidget(new QSpinBox(w));
- box->addWidget(new QLabel(QString::fromLatin1("widget text %1").arg(i++), w));
+ box->addWidget(new QLabel(QLatin1String("widget text ") + QString::number(i++), w));
box->addWidget(new QLCDNumber(w));
box->addWidget(new QStackedWidget(w));
box->addWidget(new QToolBox(w));
- box->addWidget(new QLabel(QString::fromLatin1("widget text %1").arg(i++), w));
- box->addWidget(new QTextEdit(QString::fromLatin1("widget text %1").arg(i++), w));
+ box->addWidget(new QLabel(QLatin1String("widget text ") + QString::number(i++), w));
+ box->addWidget(new QTextEdit(QLatin1String("widget text ") + QString::number(i++), w));
/* Not in the list
* QAbstractItemView, QGraphicsView, QScrollArea,
@@ -1763,7 +1758,7 @@ void tst_QAccessibility::textEditTest()
}
edit.show();
- QTest::qWaitForWindowShown(&edit);
+ QTest::qWaitForWindowExposed(&edit);
QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(&edit);
QCOMPARE(iface->text(QAccessible::Value), edit.toPlainText());
QVERIFY(iface->state().focusable);
@@ -2175,7 +2170,7 @@ void tst_QAccessibility::lineEditTest()
QLineEdit le(QStringLiteral("My characters have geometries."), toplevel);
// characterRect()
le.show();
- QTest::qWaitForWindowShown(&le);
+ QTest::qWaitForWindowExposed(&le);
QAccessibleInterface *iface(QAccessible::queryAccessibleInterface(&le));
QAccessibleTextInterface* textIface = iface->textInterface();
QVERIFY(textIface);
@@ -2322,9 +2317,13 @@ void tst_QAccessibility::lineEditTextFunctions_data()
QTest::newRow("char after 6") << "hello" << 2 << (int) QAccessible::CharBoundary << 3 << 6 << -1 << -1 << "";
for (int i = -2; i < 6; ++i) {
- QTest::newRow(QString::fromLatin1("line before %1").arg(i).toLocal8Bit().constData()) << "hello" << 0 << (int) QAccessible::LineBoundary << 3 << i << -1 << -1 << "";
- QTest::newRow(QString::fromLatin1("line at %1").arg(i).toLocal8Bit().constData()) << "hello" << 1 << (int) QAccessible::LineBoundary << 3 << i << 0 << 5 << "hello";
- QTest::newRow(QString::fromLatin1("line after %1").arg(i).toLocal8Bit().constData()) << "hello" << 2 << (int) QAccessible::LineBoundary << 3 << i << -1 << -1 << "";
+ const QByteArray iB = QByteArray::number(i);
+ QTest::newRow(("line before " + iB).constData())
+ << "hello" << 0 << (int) QAccessible::LineBoundary << 3 << i << -1 << -1 << "";
+ QTest::newRow(("line at " + iB).constData())
+ << "hello" << 1 << (int) QAccessible::LineBoundary << 3 << i << 0 << 5 << "hello";
+ QTest::newRow(("line after " + iB).constData())
+ << "hello" << 2 << (int) QAccessible::LineBoundary << 3 << i << -1 << -1 << "";
}
}
@@ -3576,7 +3575,7 @@ void tst_QAccessibility::comboBoxTest()
// Fully decorated windows have a minimum width of 160 on Windows.
combo.setMinimumWidth(200);
combo.show();
- QVERIFY(QTest::qWaitForWindowShown(&combo));
+ QVERIFY(QTest::qWaitForWindowExposed(&combo));
QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(&combo);
QCOMPARE(verifyHierarchy(iface), 0);
diff --git a/tests/auto/other/qaccessibilitymac/qaccessibilitymac.pro b/tests/auto/other/qaccessibilitymac/qaccessibilitymac.pro
index 5d81567f45..ceed81c914 100644
--- a/tests/auto/other/qaccessibilitymac/qaccessibilitymac.pro
+++ b/tests/auto/other/qaccessibilitymac/qaccessibilitymac.pro
@@ -13,4 +13,3 @@ mac {
requires(mac)
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac_helpers.mm b/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac_helpers.mm
index 65dbff4f92..b16c4c0d9c 100644
--- a/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac_helpers.mm
+++ b/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac_helpers.mm
@@ -42,7 +42,7 @@
#include <QtTest>
#include <unistd.h>
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#import <ApplicationServices/ApplicationServices.h>
QT_USE_NAMESPACE
diff --git a/tests/auto/other/qcomplextext/qcomplextext.pro b/tests/auto/other/qcomplextext/qcomplextext.pro
index 28acc397bf..98dbd3b214 100644
--- a/tests/auto/other/qcomplextext/qcomplextext.pro
+++ b/tests/auto/other/qcomplextext/qcomplextext.pro
@@ -1,7 +1,5 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qcomplextext
QT += testlib
QT += core-private gui-private
SOURCES += tst_qcomplextext.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/qcomplextext/tst_qcomplextext.cpp b/tests/auto/other/qcomplextext/tst_qcomplextext.cpp
index 1428a63123..32065c3dd0 100644
--- a/tests/auto/other/qcomplextext/tst_qcomplextext.cpp
+++ b/tests/auto/other/qcomplextext/tst_qcomplextext.cpp
@@ -41,14 +41,6 @@ class tst_QComplexText : public QObject
{
Q_OBJECT
-public:
- tst_QComplexText();
- virtual ~tst_QComplexText();
-
-
-public slots:
- void init();
- void cleanup();
private slots:
void bidiReorderString_data();
void bidiReorderString();
@@ -62,27 +54,6 @@ private slots:
void bidiInvalidCursorNoMovement();
};
-tst_QComplexText::tst_QComplexText()
-{
-}
-
-tst_QComplexText::~tst_QComplexText()
-{
-
-}
-
-void tst_QComplexText::init()
-{
-// This will be executed immediately before each test is run.
-// TODO: Add initialization code here.
-}
-
-void tst_QComplexText::cleanup()
-{
-// This will be executed immediately after each test is run.
-// TODO: Add cleanup code here.
-}
-
void tst_QComplexText::bidiReorderString_data()
{
QTest::addColumn<QString>("logical");
diff --git a/tests/auto/other/qfocusevent/qfocusevent.pro b/tests/auto/other/qfocusevent/qfocusevent.pro
index c6e31d2e50..5f799291c6 100644
--- a/tests/auto/other/qfocusevent/qfocusevent.pro
+++ b/tests/auto/other/qfocusevent/qfocusevent.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qfocusevent
QT += widgets testlib
SOURCES += tst_qfocusevent.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/qfocusevent/tst_qfocusevent.cpp b/tests/auto/other/qfocusevent/tst_qfocusevent.cpp
index 7cb6e67cbb..e044f5227a 100644
--- a/tests/auto/other/qfocusevent/tst_qfocusevent.cpp
+++ b/tests/auto/other/qfocusevent/tst_qfocusevent.cpp
@@ -81,18 +81,12 @@ class tst_QFocusEvent : public QObject
Q_OBJECT
public:
- tst_QFocusEvent();
- virtual ~tst_QFocusEvent();
-
-
void initWidget();
-public slots:
+private slots:
void initTestCase();
void cleanupTestCase();
- void init();
void cleanup();
-private slots:
void checkReason_Tab();
void checkReason_ShiftTab();
void checkReason_BackTab();
@@ -107,15 +101,6 @@ private:
FocusLineEdit* childFocusWidgetTwo;
};
-tst_QFocusEvent::tst_QFocusEvent()
-{
-}
-
-tst_QFocusEvent::~tst_QFocusEvent()
-{
-
-}
-
void tst_QFocusEvent::initTestCase()
{
testFocusWidget = new QWidget( 0 );
@@ -139,10 +124,6 @@ void tst_QFocusEvent::cleanupTestCase()
delete testFocusWidget;
}
-void tst_QFocusEvent::init()
-{
-}
-
void tst_QFocusEvent::cleanup()
{
childFocusWidgetTwo->setGeometry( 10, 50, 180, 20 );
diff --git a/tests/auto/other/qnetworkaccessmanager_and_qprogressdialog/qnetworkaccessmanager_and_qprogressdialog.pro b/tests/auto/other/qnetworkaccessmanager_and_qprogressdialog/qnetworkaccessmanager_and_qprogressdialog.pro
index e34990d513..b03a448dfb 100644
--- a/tests/auto/other/qnetworkaccessmanager_and_qprogressdialog/qnetworkaccessmanager_and_qprogressdialog.pro
+++ b/tests/auto/other/qnetworkaccessmanager_and_qprogressdialog/qnetworkaccessmanager_and_qprogressdialog.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qnetworkaccessmanager_and_qprogressdialog
SOURCES += tst_qnetworkaccessmanager_and_qprogressdialog.cpp
QT += network widgets testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/qobjectperformance/qobjectperformance.pro b/tests/auto/other/qobjectperformance/qobjectperformance.pro
index 78423bee9c..189f8eeb2a 100644
--- a/tests/auto/other/qobjectperformance/qobjectperformance.pro
+++ b/tests/auto/other/qobjectperformance/qobjectperformance.pro
@@ -5,4 +5,3 @@ SOURCES += tst_qobjectperformance.cpp
QT = core network testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/qobjectrace/qobjectrace.pro b/tests/auto/other/qobjectrace/qobjectrace.pro
index b5848edb01..94e7928585 100644
--- a/tests/auto/other/qobjectrace/qobjectrace.pro
+++ b/tests/auto/other/qobjectrace/qobjectrace.pro
@@ -2,6 +2,3 @@ CONFIG += testcase
SOURCES += tst_qobjectrace.cpp
QT = core testlib
-TARGET.EPOCHEAPSIZE = 20000000 40000000
-CONFIG += parallel_test
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/qprocess_and_guieventloop/test.pro b/tests/auto/other/qprocess_and_guieventloop/test.pro
index 54d6f194b0..50c4e1d72b 100644
--- a/tests/auto/other/qprocess_and_guieventloop/test.pro
+++ b/tests/auto/other/qprocess_and_guieventloop/test.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
QT = core gui testlib
SOURCES = tst_qprocess_and_guieventloop.cpp
TARGET = tst_qprocess_and_guieventloop
diff --git a/tests/auto/other/qsharedpointer_and_qwidget/qsharedpointer_and_qwidget.pro b/tests/auto/other/qsharedpointer_and_qwidget/qsharedpointer_and_qwidget.pro
index c7a4f3e216..722f575f80 100644
--- a/tests/auto/other/qsharedpointer_and_qwidget/qsharedpointer_and_qwidget.pro
+++ b/tests/auto/other/qsharedpointer_and_qwidget/qsharedpointer_and_qwidget.pro
@@ -1,7 +1,5 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsharedpointer_and_qwidget
QT += widgets testlib
SOURCES += tst_qsharedpointer_and_qwidget.cpp
DEFINES += SRCDIR=\\\"$$PWD/\\\"
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/qtokenautomaton/qtokenautomaton.pro b/tests/auto/other/qtokenautomaton/qtokenautomaton.pro
index 2c0b3dae9b..e4d0160f80 100644
--- a/tests/auto/other/qtokenautomaton/qtokenautomaton.pro
+++ b/tests/auto/other/qtokenautomaton/qtokenautomaton.pro
@@ -16,5 +16,3 @@ HEADERS += tokenizers/basic/basic.h \
tokenizers/withNamespace/withNamespace.h
QT = core testlib
-CONFIG += parallel_test
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/qvariant_common/tst_qvariant_common.h b/tests/auto/other/qvariant_common/tst_qvariant_common.h
index 79a5707de8..6a7c125089 100644
--- a/tests/auto/other/qvariant_common/tst_qvariant_common.h
+++ b/tests/auto/other/qvariant_common/tst_qvariant_common.h
@@ -72,7 +72,7 @@ protected:
currentName.chop(1);
ok &= (msg.contains(", " + currentName) || msg.contains(", 0x0"));
}
- ok &= msg.endsWith(")");
+ ok &= msg.endsWith(QLatin1Char(')'));
QVERIFY2(ok, (QString::fromLatin1("Message is not correctly finished: '") + msg + '\'').toLatin1().constData());
}
diff --git a/tests/auto/other/toolsupport/toolsupport.pro b/tests/auto/other/toolsupport/toolsupport.pro
index 274ead2c35..7603dea79e 100644
--- a/tests/auto/other/toolsupport/toolsupport.pro
+++ b/tests/auto/other/toolsupport/toolsupport.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_toolsupport
QT = testlib core-private
SOURCES = $$PWD/tst_toolsupport.cpp
diff --git a/tests/auto/other/toolsupport/tst_toolsupport.cpp b/tests/auto/other/toolsupport/tst_toolsupport.cpp
index f3c99af8ba..fdbb6e13d4 100644
--- a/tests/auto/other/toolsupport/tst_toolsupport.cpp
+++ b/tests/auto/other/toolsupport/tst_toolsupport.cpp
@@ -29,6 +29,16 @@
#include <QtTest>
+//
+// Note:
+//
+// When this test here fails and the change leading to the failure
+// intentionally changed a private class, adjust the test here and bump
+// the TypeInformationVersion field in src/corelib/global/qhooks.cpp
+// in the same commit as the modification to the private class.
+//
+
+
// Don't do this at home. This is test code, not production.
#define protected public
#define private public
diff --git a/tests/auto/other/windowsmobile/test/test.pro b/tests/auto/other/windowsmobile/test/test.pro
index 5f744c2acb..36dd15f60e 100644
--- a/tests/auto/other/windowsmobile/test/test.pro
+++ b/tests/auto/other/windowsmobile/test/test.pro
@@ -1,6 +1,5 @@
CONFIG += testcase
-CONFIG += parallel_test
QT += widgets testlib
HEADERS += ddhelper.h
SOURCES += tst_windowsmobile.cpp ddhelper.cpp
@@ -22,4 +21,3 @@ wincewm*: {
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/printsupport/dialogs/qabstractprintdialog/qabstractprintdialog.pro b/tests/auto/printsupport/dialogs/qabstractprintdialog/qabstractprintdialog.pro
index 2e9ae33592..b867610009 100644
--- a/tests/auto/printsupport/dialogs/qabstractprintdialog/qabstractprintdialog.pro
+++ b/tests/auto/printsupport/dialogs/qabstractprintdialog/qabstractprintdialog.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qabstractprintdialog
QT += widgets printsupport testlib
SOURCES += tst_qabstractprintdialog.cpp
diff --git a/tests/auto/printsupport/kernel/qprintdevice/qprintdevice.pro b/tests/auto/printsupport/kernel/qprintdevice/qprintdevice.pro
index fb11b0361e..56c1b60d94 100644
--- a/tests/auto/printsupport/kernel/qprintdevice/qprintdevice.pro
+++ b/tests/auto/printsupport/kernel/qprintdevice/qprintdevice.pro
@@ -1,9 +1,7 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qprintdevice
SOURCES += tst_qprintdevice.cpp
QT += printsupport-private network testlib
DEFINES += QT_USE_USING_NAMESPACE
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/printsupport/kernel/qprinter/qprinter.pro b/tests/auto/printsupport/kernel/qprinter/qprinter.pro
index 9fc6ed13fc..462929c153 100644
--- a/tests/auto/printsupport/kernel/qprinter/qprinter.pro
+++ b/tests/auto/printsupport/kernel/qprinter/qprinter.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qprinter
QT += printsupport widgets testlib
SOURCES += tst_qprinter.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/printsupport/kernel/qprinterinfo/qprinterinfo.pro b/tests/auto/printsupport/kernel/qprinterinfo/qprinterinfo.pro
index 6dcf50a838..f397f48bb8 100644
--- a/tests/auto/printsupport/kernel/qprinterinfo/qprinterinfo.pro
+++ b/tests/auto/printsupport/kernel/qprinterinfo/qprinterinfo.pro
@@ -1,9 +1,7 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qprinterinfo
SOURCES += tst_qprinterinfo.cpp
QT += printsupport network testlib
DEFINES += QT_USE_USING_NAMESPACE
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/shared/resources/testfont.ttf b/tests/auto/shared/resources/testfont.ttf
index d6042d2e58..93b728c776 100644
--- a/tests/auto/shared/resources/testfont.ttf
+++ b/tests/auto/shared/resources/testfont.ttf
Binary files differ
diff --git a/tests/auto/sql/kernel/qsql/qsql.pro b/tests/auto/sql/kernel/qsql/qsql.pro
index 03918f5d3d..71e2989572 100644
--- a/tests/auto/sql/kernel/qsql/qsql.pro
+++ b/tests/auto/sql/kernel/qsql/qsql.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsql
SOURCES += tst_qsql.cpp
diff --git a/tests/auto/sql/kernel/qsqldatabase/tst_databases.h b/tests/auto/sql/kernel/qsqldatabase/tst_databases.h
index fe8a3689b0..3ba4833dd5 100644
--- a/tests/auto/sql/kernel/qsqldatabase/tst_databases.h
+++ b/tests/auto/sql/kernel/qsqldatabase/tst_databases.h
@@ -119,7 +119,7 @@ inline static QString qTableName(const QString& prefix, QSqlDatabase db)
QString tableStr;
if (db.driverName().toLower().contains("ODBC"))
tableStr += QLatin1String("_odbc");
- return fixupTableName(QString(db.driver()->escapeIdentifier(prefix + tableStr + "_" +
+ return fixupTableName(QString(db.driver()->escapeIdentifier(prefix + tableStr + QLatin1Char('_') +
qGetHostName(), QSqlDriver::TableName)),db);
}
@@ -219,12 +219,12 @@ public:
}
// construct a stupid unique name
- QString cName = QString::number( counter++ ) + "_" + driver + "@";
+ QString cName = QString::number( counter++ ) + QLatin1Char('_') + driver + QLatin1Char('@');
cName += host.isEmpty() ? dbName : host;
if ( port > 0 )
- cName += ":" + QString::number( port );
+ cName += QLatin1Char(':') + QString::number( port );
db = QSqlDatabase::addDatabase( driver, cName );
@@ -364,7 +364,7 @@ public:
// for debugging only: outputs the connection as string
static QString dbToString( const QSqlDatabase db )
{
- QString res = db.driverName() + "@";
+ QString res = db.driverName() + QLatin1Char('@');
if ( db.driverName().startsWith( "QODBC" ) || db.driverName().startsWith( "QOCI" ) ) {
res += db.databaseName();
@@ -373,7 +373,7 @@ public:
}
if ( db.port() > 0 ) {
- res += ":" + QString::number( db.port() );
+ res += QLatin1Char(':') + QString::number( db.port() );
}
return res;
@@ -522,7 +522,7 @@ public:
result += '\'';
if(!err.driverText().isEmpty())
result += err.driverText() + "' || '";
- result += err.databaseText() + "'";
+ result += err.databaseText() + QLatin1Char('\'');
return result.toLocal8Bit();
}
@@ -534,7 +534,7 @@ public:
result += '\'';
if(!err.driverText().isEmpty())
result += err.driverText() + "' || '";
- result += err.databaseText() + "'";
+ result += err.databaseText() + QLatin1Char('\'');
return result.toLocal8Bit();
}
diff --git a/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp b/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp
index 83cf0394f9..5738f20f15 100644
--- a/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp
+++ b/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp
@@ -217,7 +217,7 @@ struct FieldDef {
{
QString rt = typeName;
rt.replace(QRegExp("\\s"), QString("_"));
- int i = rt.indexOf("(");
+ int i = rt.indexOf(QLatin1Char('('));
if (i == -1)
i = rt.length();
if (i > 20)
diff --git a/tests/auto/sql/kernel/qsqldriver/qsqldriver.pro b/tests/auto/sql/kernel/qsqldriver/qsqldriver.pro
index 5633840635..8bfe1da1ce 100644
--- a/tests/auto/sql/kernel/qsqldriver/qsqldriver.pro
+++ b/tests/auto/sql/kernel/qsqldriver/qsqldriver.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsqldriver
SOURCES += tst_qsqldriver.cpp
diff --git a/tests/auto/sql/kernel/qsqldriver/tst_qsqldriver.cpp b/tests/auto/sql/kernel/qsqldriver/tst_qsqldriver.cpp
index 2f48b65e74..5273632138 100644
--- a/tests/auto/sql/kernel/qsqldriver/tst_qsqldriver.cpp
+++ b/tests/auto/sql/kernel/qsqldriver/tst_qsqldriver.cpp
@@ -79,7 +79,7 @@ void tst_QSqlDriver::recreateTestTables(QSqlDatabase db)
tst_Databases::safeDropTable( db, relTEST1 );
QString doubleField = (dbType == QSqlDriver::SQLite) ? "more_data double" : "more_data double(8,7)";
QVERIFY_SQL( q, exec("create table " + relTEST1 +
- " (id int not null primary key, name varchar(20), title_key int, another_title_key int, " + doubleField + ")"));
+ " (id int not null primary key, name varchar(20), title_key int, another_title_key int, " + doubleField + QLatin1Char(')')));
QVERIFY_SQL( q, exec("insert into " + relTEST1 + " values(1, 'harry', 1, 2, 1.234567)"));
QVERIFY_SQL( q, exec("insert into " + relTEST1 + " values(2, 'trond', 2, 1, 8.901234)"));
QVERIFY_SQL( q, exec("insert into " + relTEST1 + " values(3, 'vohi', 1, 2, 5.678901)"));
diff --git a/tests/auto/sql/kernel/qsqlerror/qsqlerror.pro b/tests/auto/sql/kernel/qsqlerror/qsqlerror.pro
index c217e27645..ef0d213dba 100644
--- a/tests/auto/sql/kernel/qsqlerror/qsqlerror.pro
+++ b/tests/auto/sql/kernel/qsqlerror/qsqlerror.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsqlerror
QT = core sql testlib
diff --git a/tests/auto/sql/kernel/qsqlfield/qsqlfield.pro b/tests/auto/sql/kernel/qsqlfield/qsqlfield.pro
index 6b74041a17..5e0f4afe4c 100644
--- a/tests/auto/sql/kernel/qsqlfield/qsqlfield.pro
+++ b/tests/auto/sql/kernel/qsqlfield/qsqlfield.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsqlfield
SOURCES += tst_qsqlfield.cpp
diff --git a/tests/auto/sql/kernel/qsqlfield/tst_qsqlfield.cpp b/tests/auto/sql/kernel/qsqlfield/tst_qsqlfield.cpp
index b77e1fe9ef..1d31f921f0 100644
--- a/tests/auto/sql/kernel/qsqlfield/tst_qsqlfield.cpp
+++ b/tests/auto/sql/kernel/qsqlfield/tst_qsqlfield.cpp
@@ -201,9 +201,9 @@ void tst_QSqlField::name()
{
QSqlField field( "test", QVariant::String );
QFETCH( QString, val );
- QVERIFY( field.name() == "test" );
+ QCOMPARE(field.name(), QLatin1String("test"));
field.setName( val );
- QVERIFY( field.name() == val );
+ QCOMPARE(field.name(), val);
}
void tst_QSqlField::operator_Assign()
@@ -253,9 +253,9 @@ void tst_QSqlField::setName()
{
QSqlField field( "test", QVariant::String );
QFETCH( QString, val );
- QVERIFY( field.name() == "test" );
+ QCOMPARE(field.name(), QLatin1String("test"));
field.setName( val );
- QVERIFY( field.name() == val );
+ QCOMPARE(field.name(), val);
}
void tst_QSqlField::setNull()
@@ -273,16 +273,16 @@ void tst_QSqlField::setReadOnly()
field.setValue( "test" );
field.setReadOnly( true );
field.setValue( "Harry" );
- QVERIFY( field.value() == "test" );
+ QCOMPARE(field.value().toString(), QLatin1String("test"));
field.clear();
- QVERIFY( field.value() == "test" );
+ QCOMPARE(field.value().toString(), QLatin1String("test"));
QVERIFY( !field.isNull() );
field.clear();
- QVERIFY( field.value() == "test" );
+ QCOMPARE(field.value().toString(), QLatin1String("test"));
QVERIFY( !field.isNull() );
field.setReadOnly( false );
field.setValue( "Harry" );
- QVERIFY( field.value() == "Harry" );
+ QCOMPARE(field.value().toString(), QLatin1String("Harry"));
field.clear();
QVERIFY( field.value() == QVariant().toString() );
QVERIFY( field.isNull() );
diff --git a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
index b98ab68ae9..6311e4c480 100644
--- a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
+++ b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
@@ -959,14 +959,14 @@ void tst_QSqlQuery::value()
if (dbType == QSqlDriver::Interbase)
QVERIFY( q.value( 1 ).toString().startsWith( "VarChar" + QString::number( i ) ) );
- else if ( q.value( 1 ).toString().right( 1 ) == " " )
+ else if ( q.value( 1 ).toString().endsWith(QLatin1Char(' ')))
QCOMPARE( q.value( 1 ).toString(), ( "VarChar" + QString::number( i ) + " " ) );
else
QCOMPARE( q.value( 1 ).toString(), ( "VarChar" + QString::number( i ) ) );
if (dbType == QSqlDriver::Interbase)
QVERIFY( q.value( 2 ).toString().startsWith( "Char" + QString::number( i ) ) );
- else if ( q.value( 2 ).toString().right( 1 ) != " " )
+ else if (!q.value( 2 ).toString().endsWith(QLatin1Char(' ')))
QCOMPARE( q.value( 2 ).toString(), ( "Char" + QString::number( i ) ) );
else
QCOMPARE( q.value( 2 ).toString(), ( "Char" + QString::number( i ) + " " ) );
@@ -3145,7 +3145,7 @@ void tst_QSqlQuery::sqlServerReturn0()
"SELECT * FROM "+tableName+" WHERE ID = 2 "
"RETURN 0"));
- QVERIFY_SQL(q, exec("{CALL "+procName+"}"));
+ QVERIFY_SQL(q, exec("{CALL " + procName + QLatin1Char('}')));
QVERIFY_SQL(q, next());
}
@@ -3162,7 +3162,7 @@ void tst_QSqlQuery::QTBUG_551()
TYPE IntType IS TABLE OF INTEGER INDEX BY BINARY_INTEGER;\n\
TYPE VCType IS TABLE OF VARCHAR2(60) INDEX BY BINARY_INTEGER;\n\
PROCEDURE P (Inp IN IntType, Outp OUT VCType);\n\
- END "+pkgname+";"));
+ END "+ pkgname + QLatin1Char(';')));
QVERIFY_SQL(q, exec("CREATE OR REPLACE PACKAGE BODY "+pkgname+" IS\n\
PROCEDURE P (Inp IN IntType, Outp OUT VCType)\n\
@@ -3172,7 +3172,7 @@ void tst_QSqlQuery::QTBUG_551()
Outp(2) := '2. Value is ' ||TO_CHAR(Inp(2));\n\
Outp(3) := '3. Value is ' ||TO_CHAR(Inp(3));\n\
END p;\n\
- END "+pkgname+";"));
+ END " + pkgname + QLatin1Char(';')));
QVariantList inLst, outLst, res_outLst;
@@ -3310,7 +3310,7 @@ void tst_QSqlQuery::QTBUG_6421()
QVERIFY_SQL(q, exec("create index INDEX2 on "+tableName+" (COL2 desc)"));
QVERIFY_SQL(q, exec("create index INDEX3 on "+tableName+" (COL3 desc)"));
q.setForwardOnly(true);
- QVERIFY_SQL(q, exec("select COLUMN_EXPRESSION from ALL_IND_EXPRESSIONS where TABLE_NAME='"+tableName+"'"));
+ QVERIFY_SQL(q, exec("select COLUMN_EXPRESSION from ALL_IND_EXPRESSIONS where TABLE_NAME='" + tableName + QLatin1Char('\'')));
QVERIFY_SQL(q, next());
QCOMPARE(q.value(0).toString(), QLatin1String("\"COL1\""));
QVERIFY_SQL(q, next());
@@ -3338,7 +3338,7 @@ void tst_QSqlQuery::QTBUG_6618()
"begin\n"
" raiserror('" + errorString + "', 16, 1)\n"
"end\n" ));
- q.exec("{call " + qTableName("tst_raiseError", __FILE__, db) + "}");
+ q.exec("{call " + qTableName("tst_raiseError", __FILE__, db) + QLatin1Char('}'));
QVERIFY(q.lastError().text().contains(errorString));
}
@@ -3430,7 +3430,7 @@ void tst_QSqlQuery::QTBUG_21884()
QStringList stList;
QString tableName(qTableName("bug21884", __FILE__, db));
stList << "create table " + tableName + "(id integer primary key, note string)";
- stList << "select * from " + tableName + ";";
+ stList << "select * from " + tableName + QLatin1Char(';');
stList << "select * from " + tableName + "; \t\n\r";
stList << "drop table " + tableName;
@@ -3984,7 +3984,7 @@ void runIntegralTypesMysqlTest(QSqlDatabase &db, const QString &tableName, const
{
QSqlQuery q(db);
QVERIFY_SQL(q, exec("DROP TABLE IF EXISTS " + tableName));
- QVERIFY_SQL(q, exec("CREATE TABLE " + tableName + " (id " + type + ")"));
+ QVERIFY_SQL(q, exec("CREATE TABLE " + tableName + " (id " + type + ')'));
const int steps = 20;
const T increment = max / steps - min / steps;
@@ -4001,7 +4001,7 @@ void runIntegralTypesMysqlTest(QSqlDatabase &db, const QString &tableName, const
q.bindValue(0, v);
QVERIFY_SQL(q, exec());
} else {
- QVERIFY_SQL(q, exec("INSERT INTO " + tableName + " (id) VALUES (" + QString::number(v) + ")"));
+ QVERIFY_SQL(q, exec("INSERT INTO " + tableName + " (id) VALUES (" + QString::number(v) + QLatin1Char(')')));
}
values[i] = v;
v += increment;
diff --git a/tests/auto/sql/kernel/qsqlrecord/qsqlrecord.pro b/tests/auto/sql/kernel/qsqlrecord/qsqlrecord.pro
index 0e92797bb0..ee17b5f249 100644
--- a/tests/auto/sql/kernel/qsqlrecord/qsqlrecord.pro
+++ b/tests/auto/sql/kernel/qsqlrecord/qsqlrecord.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsqlrecord
SOURCES += tst_qsqlrecord.cpp
diff --git a/tests/auto/sql/kernel/qsqlrecord/tst_qsqlrecord.cpp b/tests/auto/sql/kernel/qsqlrecord/tst_qsqlrecord.cpp
index 8a90f16dce..722a391c13 100644
--- a/tests/auto/sql/kernel/qsqlrecord/tst_qsqlrecord.cpp
+++ b/tests/auto/sql/kernel/qsqlrecord/tst_qsqlrecord.cpp
@@ -484,7 +484,7 @@ void tst_QSqlRecord::setValue()
QVERIFY( rec2.value( 3 ) == QVariant(bval) );
rec2.setValue( "string", "__Harry__" );
- QVERIFY( rec2.value( 0 ) == "__Harry__" );
+ QCOMPARE(rec2.value(0).toString(), QLatin1String("__Harry__"));
for ( i = 0; i < 4; ++i )
QVERIFY( !rec2.isNull( i ) );
@@ -501,7 +501,7 @@ void tst_QSqlRecord::value()
QSqlRecord rec2;
rec2.append( QSqlField( "string", QVariant::String ) );
rec2.setValue( "string", "Harry" );
- QVERIFY( rec2.value( "string" ) == "Harry" );
+ QCOMPARE(rec2.value("string").toString(), QLatin1String("Harry"));
}
QTEST_MAIN(tst_QSqlRecord)
diff --git a/tests/auto/sql/models/qsqlquerymodel/qsqlquerymodel.pro b/tests/auto/sql/models/qsqlquerymodel/qsqlquerymodel.pro
index bc627e0724..2576fbad71 100644
--- a/tests/auto/sql/models/qsqlquerymodel/qsqlquerymodel.pro
+++ b/tests/auto/sql/models/qsqlquerymodel/qsqlquerymodel.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsqlquerymodel
SOURCES += tst_qsqlquerymodel.cpp
diff --git a/tests/auto/sql/models/qsqlrelationaltablemodel/qsqlrelationaltablemodel.pro b/tests/auto/sql/models/qsqlrelationaltablemodel/qsqlrelationaltablemodel.pro
index 5ce1b5694c..cade7c171d 100644
--- a/tests/auto/sql/models/qsqlrelationaltablemodel/qsqlrelationaltablemodel.pro
+++ b/tests/auto/sql/models/qsqlrelationaltablemodel/qsqlrelationaltablemodel.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsqlrelationaltablemodel
SOURCES += tst_qsqlrelationaltablemodel.cpp
diff --git a/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp b/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp
index 3702631275..fbc583f341 100644
--- a/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp
+++ b/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp
@@ -1115,7 +1115,7 @@ void tst_QSqlRelationalTableModel::casing()
QCOMPARE( rec.count(), 0);
//try an owner that does exist
- rec = db.driver()->record(db.userName() + "." + qTableName("CASETEST1", db).toUpper());
+ rec = db.driver()->record(db.userName() + QLatin1Char('.') + qTableName("CASETEST1", db).toUpper());
QCOMPARE( rec.count(), 4);
}
QSqlRecord rec = db.driver()->record(qTableName("CASETEST1", db).toUpper());
@@ -1464,13 +1464,13 @@ void tst_QSqlRelationalTableModel::psqlSchemaTest()
QSqlQuery q(db);
QVERIFY_SQL(q, exec("create schema " + qTableName("QTBUG_5373", __FILE__, db)));
QVERIFY_SQL(q, exec("create schema " + qTableName("QTBUG_5373_s2", __FILE__, db)));
- QVERIFY_SQL(q, exec("create table " + qTableName("QTBUG_5373", __FILE__, db) + "." + qTableName("document", __FILE__, db) +
+ QVERIFY_SQL(q, exec("create table " + qTableName("QTBUG_5373", __FILE__, db) + QLatin1Char('.') + qTableName("document", __FILE__, db) +
"(document_id int primary key, relatingid int, userid int)"));
- QVERIFY_SQL(q, exec("create table " + qTableName("QTBUG_5373_s2", __FILE__, db) + "." + qTableName("user", __FILE__, db) +
+ QVERIFY_SQL(q, exec("create table " + qTableName("QTBUG_5373_s2", __FILE__, db) + QLatin1Char('.') + qTableName("user", __FILE__, db) +
"(userid int primary key, username char(40))"));
- model.setTable(qTableName("QTBUG_5373", __FILE__, db) + "." + qTableName("document", __FILE__, db));
- model.setRelation(1, QSqlRelation(qTableName("QTBUG_5373_s2", __FILE__, db) + "." + qTableName("user", __FILE__, db), "userid", "username"));
- model.setRelation(2, QSqlRelation(qTableName("QTBUG_5373_s2", __FILE__, db) + "." + qTableName("user", __FILE__, db), "userid", "username"));
+ model.setTable(qTableName("QTBUG_5373", __FILE__, db) + QLatin1Char('.') + qTableName("document", __FILE__, db));
+ model.setRelation(1, QSqlRelation(qTableName("QTBUG_5373_s2", __FILE__, db) + QLatin1Char('.') + qTableName("user", __FILE__, db), "userid", "username"));
+ model.setRelation(2, QSqlRelation(qTableName("QTBUG_5373_s2", __FILE__, db) + QLatin1Char('.') + qTableName("user", __FILE__, db), "userid", "username"));
QVERIFY_SQL(model, select());
model.setJoinMode(QSqlRelationalTableModel::LeftJoin);
@@ -1515,14 +1515,14 @@ void tst_QSqlRelationalTableModel::relationOnFirstColumn()
//prepare test1 table
QSqlQuery q(db);
QVERIFY_SQL(q, exec("CREATE TABLE " + testTable1 + " (val1 INTEGER, id1 INTEGER PRIMARY KEY);"));
- QVERIFY_SQL(q, exec("DELETE FROM " + testTable1 + ";"));
+ QVERIFY_SQL(q, exec("DELETE FROM " + testTable1 + QLatin1Char(';')));
QVERIFY_SQL(q, exec("INSERT INTO " + testTable1 + " (id1, val1) VALUES(1, 10);"));
QVERIFY_SQL(q, exec("INSERT INTO " + testTable1 + " (id1, val1) VALUES(2, 20);"));
QVERIFY_SQL(q, exec("INSERT INTO " + testTable1 + " (id1, val1) VALUES(3, 30);"));
//prepare test2 table
QVERIFY_SQL(q, exec("CREATE TABLE " + testTable2 + " (id INTEGER PRIMARY KEY, name TEXT);"));
- QVERIFY_SQL(q, exec("DELETE FROM " + testTable2 + ";"));
+ QVERIFY_SQL(q, exec("DELETE FROM " + testTable2 + QLatin1Char(';')));
QVERIFY_SQL(q, exec("INSERT INTO " + testTable2 + " (id, name) VALUES (10, 'Hervanta');"));
QVERIFY_SQL(q, exec("INSERT INTO " + testTable2 + " (id, name) VALUES (20, 'Keskusta');"));
QVERIFY_SQL(q, exec("INSERT INTO " + testTable2 + " (id, name) VALUES (30, 'Annala');"));
diff --git a/tests/auto/sql/models/qsqltablemodel/qsqltablemodel.pro b/tests/auto/sql/models/qsqltablemodel/qsqltablemodel.pro
index fedb41ba1d..2af39b341f 100644
--- a/tests/auto/sql/models/qsqltablemodel/qsqltablemodel.pro
+++ b/tests/auto/sql/models/qsqltablemodel/qsqltablemodel.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsqltablemodel
SOURCES += tst_qsqltablemodel.cpp
diff --git a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
index 2ace79973b..fff9811e60 100644
--- a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
+++ b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
@@ -1987,7 +1987,7 @@ void tst_QSqlTableModel::tableModifyWithBlank()
//set a filter on the table so the only record we get is the one we just made
//I could just do another setData command, but I want to make sure the TableModel
//matches exactly what is stored in the database
- model.setFilter("column1='"+timeString+"'"); //filter to get just the newly entered row
+ model.setFilter("column1='" + timeString + QLatin1Char('\'')); //filter to get just the newly entered row
QVERIFY_SQL(model, select());
//Make sure we only get one record, and that it is the one we just made
diff --git a/tests/auto/testlib/qsignalspy/qsignalspy.pro b/tests/auto/testlib/qsignalspy/qsignalspy.pro
index 72ae3a5009..1578802bf8 100644
--- a/tests/auto/testlib/qsignalspy/qsignalspy.pro
+++ b/tests/auto/testlib/qsignalspy/qsignalspy.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qsignalspy
SOURCES += tst_qsignalspy.cpp
QT = core testlib
-CONFIG += parallel_test
diff --git a/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp b/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp
index 6446fec510..8b95771c1d 100644
--- a/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp
+++ b/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp
@@ -123,9 +123,14 @@ class tst_Cmptest: public QObject
{
Q_OBJECT
+public:
+ enum class MyClassEnum { MyClassEnumValue1, MyClassEnumValue2 };
+ Q_ENUM(MyClassEnum)
+
private slots:
void compare_unregistered_enums();
void compare_registered_enums();
+ void compare_class_enums();
void compare_boolfuncs();
void compare_pointerfuncs();
void compare_tostring();
@@ -160,6 +165,12 @@ void tst_Cmptest::compare_registered_enums()
QCOMPARE(Qt::ArrowCursor, Qt::BusyCursor);
}
+void tst_Cmptest::compare_class_enums()
+{
+ QCOMPARE(MyClassEnum::MyClassEnumValue1, MyClassEnum::MyClassEnumValue1);
+ QCOMPARE(MyClassEnum::MyClassEnumValue1, MyClassEnum::MyClassEnumValue2);
+}
+
static bool boolfunc() { return true; }
static bool boolfunc2() { return true; }
diff --git a/tests/auto/testlib/selftests/expected_cmptest.lightxml b/tests/auto/testlib/selftests/expected_cmptest.lightxml
index 36929cec6b..1719d2a79d 100644
--- a/tests/auto/testlib/selftests/expected_cmptest.lightxml
+++ b/tests/auto/testlib/selftests/expected_cmptest.lightxml
@@ -8,19 +8,27 @@
<Duration msecs="0"/>
</TestFunction>
<TestFunction name="compare_unregistered_enums">
-<Incident type="fail" file="tst_cmptest.cpp" line="154">
+<Incident type="fail" file="tst_cmptest.cpp" line="159">
<Description><![CDATA[Compared values are not the same]]></Description>
</Incident>
<Duration msecs="0"/>
</TestFunction>
<TestFunction name="compare_registered_enums">
-<Incident type="fail" file="tst_cmptest.cpp" line="160">
+<Incident type="fail" file="tst_cmptest.cpp" line="165">
<Description><![CDATA[Compared values are not the same
Actual (Qt::ArrowCursor): ArrowCursor
Expected (Qt::BusyCursor) : BusyCursor]]></Description>
</Incident>
<Duration msecs="0"/>
</TestFunction>
+<TestFunction name="compare_class_enums">
+<Incident type="fail" file="tst_cmptest.cpp" line="171">
+ <Description><![CDATA[Compared values are not the same
+ Actual (MyClassEnum::MyClassEnumValue1): MyClassEnumValue1
+ Expected (MyClassEnum::MyClassEnumValue2): MyClassEnumValue2]]></Description>
+</Incident>
+ <Duration msecs="0"/>
+</TestFunction>
<TestFunction name="compare_boolfuncs">
<Incident type="pass" file="" line="0" />
<Duration msecs="0"/>
@@ -30,7 +38,7 @@
<Duration msecs="0"/>
</TestFunction>
<TestFunction name="compare_tostring">
-<Incident type="fail" file="tst_cmptest.cpp" line="231">
+<Incident type="fail" file="tst_cmptest.cpp" line="242">
<DataTag><![CDATA[int, string]]></DataTag>
<Description><![CDATA[Compared values are not the same
Actual (actual) : QVariant(int,123)
@@ -39,19 +47,19 @@
<Incident type="pass" file="" line="0">
<DataTag><![CDATA[both invalid]]></DataTag>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="231">
+<Incident type="fail" file="tst_cmptest.cpp" line="242">
<DataTag><![CDATA[null hash, invalid]]></DataTag>
<Description><![CDATA[Compared values are not the same
Actual (actual) : QVariant(QVariantHash)
Expected (expected): QVariant()]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="231">
+<Incident type="fail" file="tst_cmptest.cpp" line="242">
<DataTag><![CDATA[string, null user type]]></DataTag>
<Description><![CDATA[Compared values are not the same
Actual (actual) : QVariant(QString,A simple string)
Expected (expected): QVariant(PhonyClass)]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="231">
+<Incident type="fail" file="tst_cmptest.cpp" line="242">
<DataTag><![CDATA[both non-null user type]]></DataTag>
<Description><![CDATA[Compared values are not the same
Actual (actual) : QVariant(PhonyClass,<value not representable as string>)
@@ -66,31 +74,31 @@
<Incident type="pass" file="" line="0">
<DataTag><![CDATA[equal lists]]></DataTag>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="325">
+<Incident type="fail" file="tst_cmptest.cpp" line="336">
<DataTag><![CDATA[last item different]]></DataTag>
<Description><![CDATA[Compared lists differ at index 2.
Actual (opA): "string3"
Expected (opB): "DIFFERS"]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="325">
+<Incident type="fail" file="tst_cmptest.cpp" line="336">
<DataTag><![CDATA[second-last item different]]></DataTag>
<Description><![CDATA[Compared lists differ at index 2.
Actual (opA): "string3"
Expected (opB): "DIFFERS"]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="325">
+<Incident type="fail" file="tst_cmptest.cpp" line="336">
<DataTag><![CDATA[prefix]]></DataTag>
<Description><![CDATA[Compared lists have different sizes.
Actual (opA) size: 2
Expected (opB) size: 1]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="325">
+<Incident type="fail" file="tst_cmptest.cpp" line="336">
<DataTag><![CDATA[short list second]]></DataTag>
<Description><![CDATA[Compared lists have different sizes.
Actual (opA) size: 12
Expected (opB) size: 1]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="325">
+<Incident type="fail" file="tst_cmptest.cpp" line="336">
<DataTag><![CDATA[short list first]]></DataTag>
<Description><![CDATA[Compared lists have different sizes.
Actual (opA) size: 1
@@ -99,7 +107,7 @@
<Duration msecs="0"/>
</TestFunction>
<TestFunction name="compareQListInt">
-<Incident type="fail" file="tst_cmptest.cpp" line="332">
+<Incident type="fail" file="tst_cmptest.cpp" line="343">
<Description><![CDATA[Compared lists differ at index 2.
Actual (int1): 3
Expected (int2): 4]]></Description>
@@ -107,7 +115,7 @@
<Duration msecs="0"/>
</TestFunction>
<TestFunction name="compareQListDouble">
-<Incident type="fail" file="tst_cmptest.cpp" line="339">
+<Incident type="fail" file="tst_cmptest.cpp" line="350">
<Description><![CDATA[Compared lists differ at index 0.
Actual (double1): 1.5
Expected (double2): 1]]></Description>
@@ -118,13 +126,13 @@
<Incident type="pass" file="" line="0">
<DataTag><![CDATA[both null]]></DataTag>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="365">
+<Incident type="fail" file="tst_cmptest.cpp" line="376">
<DataTag><![CDATA[one null]]></DataTag>
<Description><![CDATA[Compared QPixmaps differ.
Actual (opA).isNull(): 1
Expected (opB).isNull(): 0]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="365">
+<Incident type="fail" file="tst_cmptest.cpp" line="376">
<DataTag><![CDATA[other null]]></DataTag>
<Description><![CDATA[Compared QPixmaps differ.
Actual (opA).isNull(): 0
@@ -133,13 +141,13 @@
<Incident type="pass" file="" line="0">
<DataTag><![CDATA[equal]]></DataTag>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="365">
+<Incident type="fail" file="tst_cmptest.cpp" line="376">
<DataTag><![CDATA[different size]]></DataTag>
<Description><![CDATA[Compared QPixmaps differ in size.
Actual (opA): 11x20
Expected (opB): 20x20]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="365">
+<Incident type="fail" file="tst_cmptest.cpp" line="376">
<DataTag><![CDATA[different pixels]]></DataTag>
<Description><![CDATA[Compared values are not the same]]></Description>
</Incident>
@@ -149,13 +157,13 @@
<Incident type="pass" file="" line="0">
<DataTag><![CDATA[both null]]></DataTag>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="392">
+<Incident type="fail" file="tst_cmptest.cpp" line="403">
<DataTag><![CDATA[one null]]></DataTag>
<Description><![CDATA[Compared QImages differ.
Actual (opA).isNull(): 1
Expected (opB).isNull(): 0]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="392">
+<Incident type="fail" file="tst_cmptest.cpp" line="403">
<DataTag><![CDATA[other null]]></DataTag>
<Description><![CDATA[Compared QImages differ.
Actual (opA).isNull(): 0
@@ -164,44 +172,44 @@
<Incident type="pass" file="" line="0">
<DataTag><![CDATA[equal]]></DataTag>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="392">
+<Incident type="fail" file="tst_cmptest.cpp" line="403">
<DataTag><![CDATA[different size]]></DataTag>
<Description><![CDATA[Compared QImages differ in size.
Actual (opA): 11x20
Expected (opB): 20x20]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="392">
+<Incident type="fail" file="tst_cmptest.cpp" line="403">
<DataTag><![CDATA[different format]]></DataTag>
<Description><![CDATA[Compared QImages differ in format.
Actual (opA): 6
Expected (opB): 3]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="392">
+<Incident type="fail" file="tst_cmptest.cpp" line="403">
<DataTag><![CDATA[different pixels]]></DataTag>
<Description><![CDATA[Compared values are not the same]]></Description>
</Incident>
<Duration msecs="0"/>
</TestFunction>
<TestFunction name="verify">
-<Incident type="fail" file="tst_cmptest.cpp" line="404">
+<Incident type="fail" file="tst_cmptest.cpp" line="415">
<Description><![CDATA['opaqueFunc() < 2' returned FALSE. ()]]></Description>
</Incident>
<Duration msecs="0"/>
</TestFunction>
<TestFunction name="verify2">
-<Incident type="fail" file="tst_cmptest.cpp" line="410">
+<Incident type="fail" file="tst_cmptest.cpp" line="421">
<Description><![CDATA['opaqueFunc() < 2' returned FALSE. (42)]]></Description>
</Incident>
<Duration msecs="0"/>
</TestFunction>
<TestFunction name="tryVerify">
-<Incident type="fail" file="tst_cmptest.cpp" line="416">
+<Incident type="fail" file="tst_cmptest.cpp" line="427">
<Description><![CDATA['opaqueFunc() < 2' returned FALSE. ()]]></Description>
</Incident>
<Duration msecs="0"/>
</TestFunction>
<TestFunction name="tryVerify2">
-<Incident type="fail" file="tst_cmptest.cpp" line="422">
+<Incident type="fail" file="tst_cmptest.cpp" line="433">
<Description><![CDATA['opaqueFunc() < 2' returned FALSE. (42)]]></Description>
</Incident>
<Duration msecs="0"/>
diff --git a/tests/auto/testlib/selftests/expected_cmptest.txt b/tests/auto/testlib/selftests/expected_cmptest.txt
index 70c54704f9..d4e50faaf0 100644
--- a/tests/auto/testlib/selftests/expected_cmptest.txt
+++ b/tests/auto/testlib/selftests/expected_cmptest.txt
@@ -2,104 +2,108 @@
Config: Using QtTest library
PASS : tst_Cmptest::initTestCase()
FAIL! : tst_Cmptest::compare_unregistered_enums() Compared values are not the same
- Loc: [tst_cmptest.cpp(154)]
+ Loc: [tst_cmptest.cpp(159)]
FAIL! : tst_Cmptest::compare_registered_enums() Compared values are not the same
Actual (Qt::ArrowCursor): ArrowCursor
Expected (Qt::BusyCursor) : BusyCursor
- Loc: [tst_cmptest.cpp(160)]
+ Loc: [tst_cmptest.cpp(165)]
+FAIL! : tst_Cmptest::compare_class_enums() Compared values are not the same
+ Actual (MyClassEnum::MyClassEnumValue1): MyClassEnumValue1
+ Expected (MyClassEnum::MyClassEnumValue2): MyClassEnumValue2
+ Loc: [tst_cmptest.cpp(171)]
PASS : tst_Cmptest::compare_boolfuncs()
PASS : tst_Cmptest::compare_pointerfuncs()
FAIL! : tst_Cmptest::compare_tostring(int, string) Compared values are not the same
Actual (actual) : QVariant(int,123)
Expected (expected): QVariant(QString,hi)
- Loc: [tst_cmptest.cpp(231)]
+ Loc: [tst_cmptest.cpp(242)]
PASS : tst_Cmptest::compare_tostring(both invalid)
FAIL! : tst_Cmptest::compare_tostring(null hash, invalid) Compared values are not the same
Actual (actual) : QVariant(QVariantHash)
Expected (expected): QVariant()
- Loc: [tst_cmptest.cpp(231)]
+ Loc: [tst_cmptest.cpp(242)]
FAIL! : tst_Cmptest::compare_tostring(string, null user type) Compared values are not the same
Actual (actual) : QVariant(QString,A simple string)
Expected (expected): QVariant(PhonyClass)
- Loc: [tst_cmptest.cpp(231)]
+ Loc: [tst_cmptest.cpp(242)]
FAIL! : tst_Cmptest::compare_tostring(both non-null user type) Compared values are not the same
Actual (actual) : QVariant(PhonyClass,<value not representable as string>)
Expected (expected): QVariant(PhonyClass,<value not representable as string>)
- Loc: [tst_cmptest.cpp(231)]
+ Loc: [tst_cmptest.cpp(242)]
PASS : tst_Cmptest::compareQStringLists(empty lists)
PASS : tst_Cmptest::compareQStringLists(equal lists)
FAIL! : tst_Cmptest::compareQStringLists(last item different) Compared lists differ at index 2.
Actual (opA): "string3"
Expected (opB): "DIFFERS"
- Loc: [tst_cmptest.cpp(325)]
+ Loc: [tst_cmptest.cpp(336)]
FAIL! : tst_Cmptest::compareQStringLists(second-last item different) Compared lists differ at index 2.
Actual (opA): "string3"
Expected (opB): "DIFFERS"
- Loc: [tst_cmptest.cpp(325)]
+ Loc: [tst_cmptest.cpp(336)]
FAIL! : tst_Cmptest::compareQStringLists(prefix) Compared lists have different sizes.
Actual (opA) size: 2
Expected (opB) size: 1
- Loc: [tst_cmptest.cpp(325)]
+ Loc: [tst_cmptest.cpp(336)]
FAIL! : tst_Cmptest::compareQStringLists(short list second) Compared lists have different sizes.
Actual (opA) size: 12
Expected (opB) size: 1
- Loc: [tst_cmptest.cpp(325)]
+ Loc: [tst_cmptest.cpp(336)]
FAIL! : tst_Cmptest::compareQStringLists(short list first) Compared lists have different sizes.
Actual (opA) size: 1
Expected (opB) size: 12
- Loc: [tst_cmptest.cpp(325)]
+ Loc: [tst_cmptest.cpp(336)]
FAIL! : tst_Cmptest::compareQListInt() Compared lists differ at index 2.
Actual (int1): 3
Expected (int2): 4
- Loc: [tst_cmptest.cpp(332)]
+ Loc: [tst_cmptest.cpp(343)]
FAIL! : tst_Cmptest::compareQListDouble() Compared lists differ at index 0.
Actual (double1): 1.5
Expected (double2): 1
- Loc: [tst_cmptest.cpp(339)]
+ Loc: [tst_cmptest.cpp(350)]
PASS : tst_Cmptest::compareQPixmaps(both null)
FAIL! : tst_Cmptest::compareQPixmaps(one null) Compared QPixmaps differ.
Actual (opA).isNull(): 1
Expected (opB).isNull(): 0
- Loc: [tst_cmptest.cpp(365)]
+ Loc: [tst_cmptest.cpp(376)]
FAIL! : tst_Cmptest::compareQPixmaps(other null) Compared QPixmaps differ.
Actual (opA).isNull(): 0
Expected (opB).isNull(): 1
- Loc: [tst_cmptest.cpp(365)]
+ Loc: [tst_cmptest.cpp(376)]
PASS : tst_Cmptest::compareQPixmaps(equal)
FAIL! : tst_Cmptest::compareQPixmaps(different size) Compared QPixmaps differ in size.
Actual (opA): 11x20
Expected (opB): 20x20
- Loc: [tst_cmptest.cpp(365)]
+ Loc: [tst_cmptest.cpp(376)]
FAIL! : tst_Cmptest::compareQPixmaps(different pixels) Compared values are not the same
- Loc: [tst_cmptest.cpp(365)]
+ Loc: [tst_cmptest.cpp(376)]
PASS : tst_Cmptest::compareQImages(both null)
FAIL! : tst_Cmptest::compareQImages(one null) Compared QImages differ.
Actual (opA).isNull(): 1
Expected (opB).isNull(): 0
- Loc: [tst_cmptest.cpp(392)]
+ Loc: [tst_cmptest.cpp(403)]
FAIL! : tst_Cmptest::compareQImages(other null) Compared QImages differ.
Actual (opA).isNull(): 0
Expected (opB).isNull(): 1
- Loc: [tst_cmptest.cpp(392)]
+ Loc: [tst_cmptest.cpp(403)]
PASS : tst_Cmptest::compareQImages(equal)
FAIL! : tst_Cmptest::compareQImages(different size) Compared QImages differ in size.
Actual (opA): 11x20
Expected (opB): 20x20
- Loc: [tst_cmptest.cpp(392)]
+ Loc: [tst_cmptest.cpp(403)]
FAIL! : tst_Cmptest::compareQImages(different format) Compared QImages differ in format.
Actual (opA): 6
Expected (opB): 3
- Loc: [tst_cmptest.cpp(392)]
+ Loc: [tst_cmptest.cpp(403)]
FAIL! : tst_Cmptest::compareQImages(different pixels) Compared values are not the same
- Loc: [tst_cmptest.cpp(392)]
+ Loc: [tst_cmptest.cpp(403)]
FAIL! : tst_Cmptest::verify() 'opaqueFunc() < 2' returned FALSE. ()
- Loc: [tst_cmptest.cpp(404)]
+ Loc: [tst_cmptest.cpp(415)]
FAIL! : tst_Cmptest::verify2() 'opaqueFunc() < 2' returned FALSE. (42)
- Loc: [tst_cmptest.cpp(410)]
+ Loc: [tst_cmptest.cpp(421)]
FAIL! : tst_Cmptest::tryVerify() 'opaqueFunc() < 2' returned FALSE. ()
- Loc: [tst_cmptest.cpp(416)]
+ Loc: [tst_cmptest.cpp(427)]
FAIL! : tst_Cmptest::tryVerify2() 'opaqueFunc() < 2' returned FALSE. (42)
- Loc: [tst_cmptest.cpp(422)]
+ Loc: [tst_cmptest.cpp(433)]
PASS : tst_Cmptest::cleanupTestCase()
-Totals: 11 passed, 26 failed, 0 skipped, 0 blacklisted
+Totals: 11 passed, 27 failed, 0 skipped, 0 blacklisted
********* Finished testing of tst_Cmptest *********
diff --git a/tests/auto/testlib/selftests/expected_cmptest.xml b/tests/auto/testlib/selftests/expected_cmptest.xml
index 9437e8e4b7..d9a68e0bd1 100644
--- a/tests/auto/testlib/selftests/expected_cmptest.xml
+++ b/tests/auto/testlib/selftests/expected_cmptest.xml
@@ -10,19 +10,27 @@
<Duration msecs="0"/>
</TestFunction>
<TestFunction name="compare_unregistered_enums">
-<Incident type="fail" file="tst_cmptest.cpp" line="154">
+<Incident type="fail" file="tst_cmptest.cpp" line="159">
<Description><![CDATA[Compared values are not the same]]></Description>
</Incident>
<Duration msecs="0"/>
</TestFunction>
<TestFunction name="compare_registered_enums">
-<Incident type="fail" file="tst_cmptest.cpp" line="160">
+<Incident type="fail" file="tst_cmptest.cpp" line="165">
<Description><![CDATA[Compared values are not the same
Actual (Qt::ArrowCursor): ArrowCursor
Expected (Qt::BusyCursor) : BusyCursor]]></Description>
</Incident>
<Duration msecs="0"/>
</TestFunction>
+<TestFunction name="compare_class_enums">
+<Incident type="fail" file="tst_cmptest.cpp" line="171">
+ <Description><![CDATA[Compared values are not the same
+ Actual (MyClassEnum::MyClassEnumValue1): MyClassEnumValue1
+ Expected (MyClassEnum::MyClassEnumValue2): MyClassEnumValue2]]></Description>
+</Incident>
+ <Duration msecs="0"/>
+</TestFunction>
<TestFunction name="compare_boolfuncs">
<Incident type="pass" file="" line="0" />
<Duration msecs="0"/>
@@ -32,7 +40,7 @@
<Duration msecs="0"/>
</TestFunction>
<TestFunction name="compare_tostring">
-<Incident type="fail" file="tst_cmptest.cpp" line="231">
+<Incident type="fail" file="tst_cmptest.cpp" line="242">
<DataTag><![CDATA[int, string]]></DataTag>
<Description><![CDATA[Compared values are not the same
Actual (actual) : QVariant(int,123)
@@ -41,19 +49,19 @@
<Incident type="pass" file="" line="0">
<DataTag><![CDATA[both invalid]]></DataTag>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="231">
+<Incident type="fail" file="tst_cmptest.cpp" line="242">
<DataTag><![CDATA[null hash, invalid]]></DataTag>
<Description><![CDATA[Compared values are not the same
Actual (actual) : QVariant(QVariantHash)
Expected (expected): QVariant()]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="231">
+<Incident type="fail" file="tst_cmptest.cpp" line="242">
<DataTag><![CDATA[string, null user type]]></DataTag>
<Description><![CDATA[Compared values are not the same
Actual (actual) : QVariant(QString,A simple string)
Expected (expected): QVariant(PhonyClass)]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="231">
+<Incident type="fail" file="tst_cmptest.cpp" line="242">
<DataTag><![CDATA[both non-null user type]]></DataTag>
<Description><![CDATA[Compared values are not the same
Actual (actual) : QVariant(PhonyClass,<value not representable as string>)
@@ -68,31 +76,31 @@
<Incident type="pass" file="" line="0">
<DataTag><![CDATA[equal lists]]></DataTag>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="325">
+<Incident type="fail" file="tst_cmptest.cpp" line="336">
<DataTag><![CDATA[last item different]]></DataTag>
<Description><![CDATA[Compared lists differ at index 2.
Actual (opA): "string3"
Expected (opB): "DIFFERS"]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="325">
+<Incident type="fail" file="tst_cmptest.cpp" line="336">
<DataTag><![CDATA[second-last item different]]></DataTag>
<Description><![CDATA[Compared lists differ at index 2.
Actual (opA): "string3"
Expected (opB): "DIFFERS"]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="325">
+<Incident type="fail" file="tst_cmptest.cpp" line="336">
<DataTag><![CDATA[prefix]]></DataTag>
<Description><![CDATA[Compared lists have different sizes.
Actual (opA) size: 2
Expected (opB) size: 1]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="325">
+<Incident type="fail" file="tst_cmptest.cpp" line="336">
<DataTag><![CDATA[short list second]]></DataTag>
<Description><![CDATA[Compared lists have different sizes.
Actual (opA) size: 12
Expected (opB) size: 1]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="325">
+<Incident type="fail" file="tst_cmptest.cpp" line="336">
<DataTag><![CDATA[short list first]]></DataTag>
<Description><![CDATA[Compared lists have different sizes.
Actual (opA) size: 1
@@ -101,7 +109,7 @@
<Duration msecs="0"/>
</TestFunction>
<TestFunction name="compareQListInt">
-<Incident type="fail" file="tst_cmptest.cpp" line="332">
+<Incident type="fail" file="tst_cmptest.cpp" line="343">
<Description><![CDATA[Compared lists differ at index 2.
Actual (int1): 3
Expected (int2): 4]]></Description>
@@ -109,7 +117,7 @@
<Duration msecs="0"/>
</TestFunction>
<TestFunction name="compareQListDouble">
-<Incident type="fail" file="tst_cmptest.cpp" line="339">
+<Incident type="fail" file="tst_cmptest.cpp" line="350">
<Description><![CDATA[Compared lists differ at index 0.
Actual (double1): 1.5
Expected (double2): 1]]></Description>
@@ -120,13 +128,13 @@
<Incident type="pass" file="" line="0">
<DataTag><![CDATA[both null]]></DataTag>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="365">
+<Incident type="fail" file="tst_cmptest.cpp" line="376">
<DataTag><![CDATA[one null]]></DataTag>
<Description><![CDATA[Compared QPixmaps differ.
Actual (opA).isNull(): 1
Expected (opB).isNull(): 0]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="365">
+<Incident type="fail" file="tst_cmptest.cpp" line="376">
<DataTag><![CDATA[other null]]></DataTag>
<Description><![CDATA[Compared QPixmaps differ.
Actual (opA).isNull(): 0
@@ -135,13 +143,13 @@
<Incident type="pass" file="" line="0">
<DataTag><![CDATA[equal]]></DataTag>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="365">
+<Incident type="fail" file="tst_cmptest.cpp" line="376">
<DataTag><![CDATA[different size]]></DataTag>
<Description><![CDATA[Compared QPixmaps differ in size.
Actual (opA): 11x20
Expected (opB): 20x20]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="365">
+<Incident type="fail" file="tst_cmptest.cpp" line="376">
<DataTag><![CDATA[different pixels]]></DataTag>
<Description><![CDATA[Compared values are not the same]]></Description>
</Incident>
@@ -151,13 +159,13 @@
<Incident type="pass" file="" line="0">
<DataTag><![CDATA[both null]]></DataTag>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="392">
+<Incident type="fail" file="tst_cmptest.cpp" line="403">
<DataTag><![CDATA[one null]]></DataTag>
<Description><![CDATA[Compared QImages differ.
Actual (opA).isNull(): 1
Expected (opB).isNull(): 0]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="392">
+<Incident type="fail" file="tst_cmptest.cpp" line="403">
<DataTag><![CDATA[other null]]></DataTag>
<Description><![CDATA[Compared QImages differ.
Actual (opA).isNull(): 0
@@ -166,44 +174,44 @@
<Incident type="pass" file="" line="0">
<DataTag><![CDATA[equal]]></DataTag>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="392">
+<Incident type="fail" file="tst_cmptest.cpp" line="403">
<DataTag><![CDATA[different size]]></DataTag>
<Description><![CDATA[Compared QImages differ in size.
Actual (opA): 11x20
Expected (opB): 20x20]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="392">
+<Incident type="fail" file="tst_cmptest.cpp" line="403">
<DataTag><![CDATA[different format]]></DataTag>
<Description><![CDATA[Compared QImages differ in format.
Actual (opA): 6
Expected (opB): 3]]></Description>
</Incident>
-<Incident type="fail" file="tst_cmptest.cpp" line="392">
+<Incident type="fail" file="tst_cmptest.cpp" line="403">
<DataTag><![CDATA[different pixels]]></DataTag>
<Description><![CDATA[Compared values are not the same]]></Description>
</Incident>
<Duration msecs="0"/>
</TestFunction>
<TestFunction name="verify">
-<Incident type="fail" file="tst_cmptest.cpp" line="404">
+<Incident type="fail" file="tst_cmptest.cpp" line="415">
<Description><![CDATA['opaqueFunc() < 2' returned FALSE. ()]]></Description>
</Incident>
<Duration msecs="0"/>
</TestFunction>
<TestFunction name="verify2">
-<Incident type="fail" file="tst_cmptest.cpp" line="410">
+<Incident type="fail" file="tst_cmptest.cpp" line="421">
<Description><![CDATA['opaqueFunc() < 2' returned FALSE. (42)]]></Description>
</Incident>
<Duration msecs="0"/>
</TestFunction>
<TestFunction name="tryVerify">
-<Incident type="fail" file="tst_cmptest.cpp" line="416">
+<Incident type="fail" file="tst_cmptest.cpp" line="427">
<Description><![CDATA['opaqueFunc() < 2' returned FALSE. ()]]></Description>
</Incident>
<Duration msecs="0"/>
</TestFunction>
<TestFunction name="tryVerify2">
-<Incident type="fail" file="tst_cmptest.cpp" line="422">
+<Incident type="fail" file="tst_cmptest.cpp" line="433">
<Description><![CDATA['opaqueFunc() < 2' returned FALSE. (42)]]></Description>
</Incident>
<Duration msecs="0"/>
diff --git a/tests/auto/testlib/selftests/expected_cmptest.xunitxml b/tests/auto/testlib/selftests/expected_cmptest.xunitxml
index fa970d4172..10918ce921 100644
--- a/tests/auto/testlib/selftests/expected_cmptest.xunitxml
+++ b/tests/auto/testlib/selftests/expected_cmptest.xunitxml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?>
-<testsuite errors="0" failures="26" tests="16" name="tst_Cmptest">
+<testsuite errors="0" failures="27" tests="17" name="tst_Cmptest">
<properties>
<property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
<property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
@@ -14,6 +14,11 @@
Actual (Qt::ArrowCursor): ArrowCursor
Expected (Qt::BusyCursor) : BusyCursor" result="fail"/>
</testcase>
+ <testcase result="fail" name="compare_class_enums">
+ <failure message="Compared values are not the same
+ Actual (MyClassEnum::MyClassEnumValue1): MyClassEnumValue1
+ Expected (MyClassEnum::MyClassEnumValue2): MyClassEnumValue2" result="fail"/>
+ </testcase>
<testcase result="pass" name="compare_boolfuncs"/>
<testcase result="pass" name="compare_pointerfuncs"/>
<testcase result="fail" name="compare_tostring">
diff --git a/tests/auto/testlib/selftests/generate_expected_output.py b/tests/auto/testlib/selftests/generate_expected_output.py
index 83c617fee5..1152f965ef 100755
--- a/tests/auto/testlib/selftests/generate_expected_output.py
+++ b/tests/auto/testlib/selftests/generate_expected_output.py
@@ -99,7 +99,7 @@ def generateTestData(testname):
cmd = [getTestForPath(testname) + ' -' + format + ' ' + extraArgs.get(testname, '')]
result = 'expected_' + testname + '.' + format
data = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True).communicate()[0]
- out = open(result, 'w')
+ out = open(result, 'wb')
out.write(data)
out.close()
replaceInFile(result)
diff --git a/tests/auto/testlib/selftests/selftests.pro b/tests/auto/testlib/selftests/selftests.pro
index 091f0dd5a1..7a61916535 100644
--- a/tests/auto/testlib/selftests/selftests.pro
+++ b/tests/auto/testlib/selftests/selftests.pro
@@ -9,4 +9,3 @@ INSTALLS =
QT = core
-CONFIG += parallel_test
diff --git a/tests/auto/testlib/selftests/test/test.pro b/tests/auto/testlib/selftests/test/test.pro
index d94b45ce89..a2a1dd3f0b 100644
--- a/tests/auto/testlib/selftests/test/test.pro
+++ b/tests/auto/testlib/selftests/test/test.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
SOURCES += ../tst_selftests.cpp
QT = core xml testlib-private
diff --git a/tests/auto/testlib/selftests/tst_selftests.cpp b/tests/auto/testlib/selftests/tst_selftests.cpp
index 63c48fc809..389cb65c0b 100644
--- a/tests/auto/testlib/selftests/tst_selftests.cpp
+++ b/tests/auto/testlib/selftests/tst_selftests.cpp
@@ -775,6 +775,10 @@ void tst_Selftests::doRunSubTest(QString const& subdir, QStringList const& logge
QRegularExpressionMatch match = durationRegExp.match(line);
QVERIFY2(match.hasMatch(), qPrintable(QString::fromLatin1("Invalid Duration tag at line %1 (%2): '%3'")
.arg(i).arg(loggers.at(n), output)));
+ } else if (line.startsWith("Totals:")) {
+ const int lastCommaPos = line.lastIndexOf(',');
+ if (lastCommaPos > 0)
+ line.truncate(lastCommaPos); // Plain text logger: strip time (", 2323dms").
} else {
QVERIFY2(output == expected,
qPrintable(QString::fromLatin1("Mismatch at line %1 (%2, %3):\n'%4'\n !=\n'%5'")
diff --git a/tests/auto/tools/moc/moc.pro b/tests/auto/tools/moc/moc.pro
index 99e226c5f4..688799048f 100644
--- a/tests/auto/tools/moc/moc.pro
+++ b/tests/auto/tools/moc/moc.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_moc
#exists(/usr/include/boost/spirit.hpp) {
@@ -41,7 +40,6 @@ qtHaveModule(dbus) {
DEFINES += WITH_DBUS
QT += dbus
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
# tst_Moc::specifyMetaTagsFromCmdline()
# Ensure that plugin_metadata.h are moc-ed with some extra -M arguments:
diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp
index c113b7cd60..876d15eef0 100644
--- a/tests/auto/tools/moc/tst_moc.cpp
+++ b/tests/auto/tools/moc/tst_moc.cpp
@@ -701,7 +701,7 @@ void tst_Moc::oldStyleCasts()
QStringList args;
args << "-c" << "-x" << "c++" << "-Wold-style-cast" << "-I" << "."
- << "-I" << qtIncludePath << "-o" << "/dev/null" << "-fPIC" << "-";
+ << "-I" << qtIncludePath << "-o" << "/dev/null" << "-fPIC" << "-std=c++11" << "-";
proc.start("gcc", args);
QVERIFY(proc.waitForStarted());
proc.write(mocOut);
@@ -771,7 +771,7 @@ void tst_Moc::inputFileNameWithDotsButNoExtension()
QStringList args;
args << "-c" << "-x" << "c++" << "-I" << ".."
- << "-I" << qtIncludePath << "-o" << "/dev/null" << "-fPIC" << "-";
+ << "-I" << qtIncludePath << "-o" << "/dev/null" << "-fPIC" << "-std=c++11" << "-";
proc.start("gcc", args);
QVERIFY(proc.waitForStarted());
proc.write(mocOut);
@@ -1050,7 +1050,8 @@ void tst_Moc::ignoreOptionClashes()
// If -pthread wasn't ignored, it was parsed as a prefix of "thread/", which breaks compilation.
QStringList gccArgs;
gccArgs << "-c" << "-x" << "c++" << "-I" << ".."
- << "-I" << qtIncludePath << "-I" << includeDir << "-o" << "/dev/null" << "-fPIC" << "-";
+ << "-I" << qtIncludePath << "-I" << includeDir << "-o" << "/dev/null"
+ << "-fPIC" << "-std=c++11" << "-";
proc.start("gcc", gccArgs);
QVERIFY(proc.waitForStarted());
proc.write(mocOut);
diff --git a/tests/auto/tools/qdbuscpp2xml/qdbuscpp2xml.pro b/tests/auto/tools/qdbuscpp2xml/qdbuscpp2xml.pro
index d568e7107d..4bfa89a44e 100644
--- a/tests/auto/tools/qdbuscpp2xml/qdbuscpp2xml.pro
+++ b/tests/auto/tools/qdbuscpp2xml/qdbuscpp2xml.pro
@@ -9,4 +9,3 @@ SOURCES += tst_qdbuscpp2xml.cpp \
RESOURCES += qdbuscpp2xml.qrc
HEADERS += test1.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/tools/qdbusxml2cpp/qdbusxml2cpp.pro b/tests/auto/tools/qdbusxml2cpp/qdbusxml2cpp.pro
index d2e2e19a36..8c29ff47c4 100644
--- a/tests/auto/tools/qdbusxml2cpp/qdbusxml2cpp.pro
+++ b/tests/auto/tools/qdbusxml2cpp/qdbusxml2cpp.pro
@@ -3,4 +3,3 @@ QT = core testlib
TARGET = tst_qdbusxml2cpp
SOURCES += tst_qdbusxml2cpp.cpp
QMAKE_CXXFLAGS += $$QT_CFLAGS_DBUS
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/tools/qmake/qmake.pro b/tests/auto/tools/qmake/qmake.pro
index d0817247db..ac52fb81fa 100644
--- a/tests/auto/tools/qmake/qmake.pro
+++ b/tests/auto/tools/qmake/qmake.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
# Allow more time since examples are compiled, which may take longer on Windows.
win32:testcase.timeout=900
TARGET = tst_qmake
diff --git a/tests/auto/tools/qmake/testcompiler.cpp b/tests/auto/tools/qmake/testcompiler.cpp
index 601d626b5c..23a7012af7 100644
--- a/tests/auto/tools/qmake/testcompiler.cpp
+++ b/tests/auto/tools/qmake/testcompiler.cpp
@@ -296,7 +296,7 @@ bool TestCompiler::make( const QString &workPath, const QString &target, bool ex
bool TestCompiler::exists( const QString &destDir, const QString &exeName, BuildType buildType, const QString &version )
{
- QFileInfo f(destDir + "/" + targetName(buildType, exeName, version));
+ QFileInfo f(destDir + QLatin1Char('/') + targetName(buildType, exeName, version));
return f.exists();
}
diff --git a/tests/auto/tools/qmake/tst_qmake.cpp b/tests/auto/tools/qmake/tst_qmake.cpp
index d216a54575..a891e2c20d 100644
--- a/tests/auto/tools/qmake/tst_qmake.cpp
+++ b/tests/auto/tools/qmake/tst_qmake.cpp
@@ -51,16 +51,9 @@ class tst_qmake : public QObject
{
Q_OBJECT
-public:
- tst_qmake();
- virtual ~tst_qmake();
-
-public slots:
+private slots:
void initTestCase();
- void cleanupTestCase();
void cleanup();
-
-private slots:
void simple_app();
void simple_app_shadowbuild();
void simple_app_shadowbuild2();
@@ -93,15 +86,6 @@ private:
QString base_path;
};
-tst_qmake::tst_qmake()
-{
-}
-
-tst_qmake::~tst_qmake()
-{
-
-}
-
void tst_qmake::initTestCase()
{
QString binpath = QLibraryInfo::location(QLibraryInfo::BinariesPath);
@@ -129,10 +113,6 @@ void tst_qmake::initTestCase()
base_path = QCoreApplication::applicationDirPath();
}
-void tst_qmake::cleanupTestCase()
-{
-}
-
void tst_qmake::cleanup()
{
test_compiler.resetArguments();
diff --git a/tests/auto/tools/qmakelib/qmakelib.pro b/tests/auto/tools/qmakelib/qmakelib.pro
index f1b8dfef3d..140bece708 100644
--- a/tests/auto/tools/qmakelib/qmakelib.pro
+++ b/tests/auto/tools/qmakelib/qmakelib.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qmakelib
QT = core testlib
diff --git a/tests/auto/tools/rcc/rcc.pro b/tests/auto/tools/rcc/rcc.pro
index 160697b06c..264b8ecc66 100644
--- a/tests/auto/tools/rcc/rcc.pro
+++ b/tests/auto/tools/rcc/rcc.pro
@@ -3,4 +3,3 @@ QT = core testlib
TARGET = tst_rcc
SOURCES += tst_rcc.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/widgets/dialogs/qcolordialog/qcolordialog.pro b/tests/auto/widgets/dialogs/qcolordialog/qcolordialog.pro
index c379e67ec5..c8ddedb401 100644
--- a/tests/auto/widgets/dialogs/qcolordialog/qcolordialog.pro
+++ b/tests/auto/widgets/dialogs/qcolordialog/qcolordialog.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qcolordialog
QT += widgets testlib
SOURCES += tst_qcolordialog.cpp
diff --git a/tests/auto/widgets/dialogs/qcolordialog/tst_qcolordialog.cpp b/tests/auto/widgets/dialogs/qcolordialog/tst_qcolordialog.cpp
index c5e31a4bd4..0915bf072e 100644
--- a/tests/auto/widgets/dialogs/qcolordialog/tst_qcolordialog.cpp
+++ b/tests/auto/widgets/dialogs/qcolordialog/tst_qcolordialog.cpp
@@ -50,12 +50,6 @@ public slots:
void testGetRgba();
void testNativeActiveModalWidget();
-public slots:
- void initTestCase();
- void cleanupTestCase();
- void init();
- void cleanup();
-
private slots:
void defaultOkButton();
void native_activeModalWidget();
@@ -108,22 +102,6 @@ void tst_QColorDialog::native_activeModalWidget()
qApp->exec();
}
-void tst_QColorDialog::initTestCase()
-{
-}
-
-void tst_QColorDialog::cleanupTestCase()
-{
-}
-
-void tst_QColorDialog::init()
-{
-}
-
-void tst_QColorDialog::cleanup()
-{
-}
-
void tst_QColorDialog::postKeyReturn() {
QWidgetList list = QApplication::topLevelWidgets();
for (int i=0; i<list.count(); ++i) {
diff --git a/tests/auto/widgets/dialogs/qdialog/qdialog.pro b/tests/auto/widgets/dialogs/qdialog/qdialog.pro
index c7917e8ff6..0a065b1a87 100644
--- a/tests/auto/widgets/dialogs/qdialog/qdialog.pro
+++ b/tests/auto/widgets/dialogs/qdialog/qdialog.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qdialog
QT += widgets testlib gui-private core-private
SOURCES += tst_qdialog.cpp
diff --git a/tests/auto/widgets/dialogs/qerrormessage/qerrormessage.pro b/tests/auto/widgets/dialogs/qerrormessage/qerrormessage.pro
index a88f449494..b4cf05e347 100644
--- a/tests/auto/widgets/dialogs/qerrormessage/qerrormessage.pro
+++ b/tests/auto/widgets/dialogs/qerrormessage/qerrormessage.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TEMPLATE = app
TARGET = tst_qerrormessage
diff --git a/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp b/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp
index 42e2bd09a5..2ab9ca330f 100644
--- a/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp
+++ b/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp
@@ -101,16 +101,10 @@ class tst_QFiledialog : public QObject
{
Q_OBJECT
-public:
- tst_QFiledialog();
- virtual ~tst_QFiledialog();
-
-public slots:
+private slots:
void initTestCase();
void init();
void cleanup();
-
-private slots:
void currentChangedSignal();
#ifdef QT_BUILD_INTERNAL
void directoryEnteredSignal();
@@ -171,14 +165,6 @@ private:
void cleanupSettingsFile();
};
-tst_QFiledialog::tst_QFiledialog()
-{
-}
-
-tst_QFiledialog::~tst_QFiledialog()
-{
-}
-
void tst_QFiledialog::cleanupSettingsFile()
{
// clean up the sidebar between each test
@@ -943,7 +929,7 @@ void tst_QFiledialog::selectFiles()
QString filesPath = fd.directory().absolutePath();
for (int i=0; i < 5; ++i) {
- QFile file(filesPath + QString::fromLatin1("/qfiledialog_auto_test_not_pres_%1").arg(i));
+ QFile file(filesPath + QLatin1String("/qfiledialog_auto_test_not_pres_") + QString::number(i));
file.open(QIODevice::WriteOnly);
file.resize(1024);
file.flush();
@@ -957,7 +943,7 @@ void tst_QFiledialog::selectFiles()
QListView* listView = fd.findChild<QListView*>("listView");
QVERIFY(listView);
for (int i = 0; i < list.count(); ++i) {
- fd.selectFile(fd.directory().path() + "/" + list.at(i));
+ fd.selectFile(fd.directory().path() + QLatin1Char('/') + list.at(i));
QTRY_VERIFY(!listView->selectionModel()->selectedRows().isEmpty());
toSelect.append(listView->selectionModel()->selectedRows().last());
}
diff --git a/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp b/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp
index b457558879..e36c44db17 100644
--- a/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp
+++ b/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp
@@ -93,14 +93,12 @@ Q_OBJECT
public:
tst_QFileDialog2();
- virtual ~tst_QFileDialog2();
-public slots:
+private slots:
void initTestCase();
void init();
void cleanup();
-private slots:
#ifdef QT_BUILD_INTERNAL
void deleteDirAndFiles();
void listRoot();
@@ -160,10 +158,6 @@ tst_QFileDialog2::tst_QFileDialog2()
#endif
}
-tst_QFileDialog2::~tst_QFileDialog2()
-{
-}
-
void tst_QFileDialog2::cleanupSettingsFile()
{
// clean up the sidebar between each test
@@ -521,7 +515,7 @@ protected:
path = parentIndex.child(source_row,0).data(Qt::DisplayRole).toString();
do {
- path = parentIndex.data(Qt::DisplayRole).toString() + "/" + path;
+ path = parentIndex.data(Qt::DisplayRole).toString() + QLatin1Char('/') + path;
parentIndex = parentIndex.parent();
} while(parentIndex.isValid());
@@ -916,7 +910,7 @@ void tst_QFileDialog2::task228844_ensurePreviousSorting()
#else
QTest::qWait(500);
#endif
- QCOMPARE(fd2.selectedFiles().first(), current.absolutePath() + QChar('/') + QLatin1String("g"));
+ QCOMPARE(fd2.selectedFiles().first(), current.absolutePath() + QLatin1String("/g"));
QNonNativeFileDialog fd3(0, "This is a third file dialog", tempFile->fileName());
fd3.restoreState(fd.saveState());
@@ -1162,7 +1156,7 @@ void tst_QFileDialog2::task257579_sideBarWithNonCleanUrls()
QLatin1String dirname("autotest_task257579");
dir.rmdir(dirname); //makes sure it doesn't exist any more
QVERIFY(dir.mkdir(dirname));
- QString url = QString::fromLatin1("%1/%2/..").arg(dir.absolutePath()).arg(dirname);
+ QString url = dir.absolutePath() + QLatin1Char('/') + dirname + QLatin1String("/..");
QNonNativeFileDialog fd;
fd.setSidebarUrls(QList<QUrl>() << QUrl::fromLocalFile(url));
QSidebar *sidebar = fd.findChild<QSidebar*>("sidebar");
diff --git a/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp b/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp
index d370a647b4..b0bf395f6b 100644
--- a/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp
+++ b/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp
@@ -397,8 +397,9 @@ void tst_QFileSystemModel::rowsInserted_data()
QTest::addColumn<int>("count");
QTest::addColumn<int>("ascending");
for (int i = 0; i < 4; ++i) {
- QTest::newRow(QString("Qt::AscendingOrder %1").arg(i).toLocal8Bit().constData()) << i << (int)Qt::AscendingOrder;
- QTest::newRow(QString("Qt::DescendingOrder %1").arg(i).toLocal8Bit().constData()) << i << (int)Qt::DescendingOrder;
+ const QByteArray iB = QByteArray::number(i);
+ QTest::newRow(("Qt::AscendingOrder " + iB).constData()) << i << (int)Qt::AscendingOrder;
+ QTest::newRow(("Qt::DescendingOrder " + iB).constData()) << i << (int)Qt::DescendingOrder;
}
}
@@ -426,7 +427,7 @@ void tst_QFileSystemModel::rowsInserted()
int oldCount = model->rowCount(root);
QStringList files;
for (int i = 0; i < count; ++i)
- files.append(QString("c%1").arg(i));
+ files.append(QLatin1Char('c') + QString::number(i));
QVERIFY(createFiles(tmp, files, 5));
TRY_WAIT(model->rowCount(root) == oldCount + count);
QTRY_COMPARE(model->rowCount(root), oldCount + count);
@@ -949,8 +950,8 @@ void tst_QFileSystemModel::dirsBeforeFiles()
for (int i = 0; i < 3; ++i) {
QLatin1Char c('a' + i);
- dir.mkdir(QString("%1-dir").arg(c));
- QFile file(flatDirTestPath + QString("/%1-file").arg(c));
+ dir.mkdir(c + QLatin1String("-dir"));
+ QFile file(flatDirTestPath + QLatin1Char('/') + c + QLatin1String("-file"));
file.open(QIODevice::ReadWrite);
file.close();
}
@@ -1027,7 +1028,7 @@ void tst_QFileSystemModel::permissions() // checks QTBUG-20503
QFETCH(bool, readOnly);
const QString tmp = flatDirTestPath;
- const QString file = tmp + '/' + "f";
+ const QString file = tmp + QLatin1String("/f");
QVERIFY(createFiles(tmp, QStringList() << "f"));
QVERIFY(QFile::setPermissions(file, QFile::Permissions(permissions)));
diff --git a/tests/auto/widgets/dialogs/qfontdialog/qfontdialog.pro b/tests/auto/widgets/dialogs/qfontdialog/qfontdialog.pro
index dc1702971e..320d6ee3b5 100644
--- a/tests/auto/widgets/dialogs/qfontdialog/qfontdialog.pro
+++ b/tests/auto/widgets/dialogs/qfontdialog/qfontdialog.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qfontdialog
QT += widgets widgets-private testlib
@@ -9,9 +8,9 @@ SOURCES += tst_qfontdialog.cpp
RESOURCES += testfonts.qrc
-mac {
+osx {
# ### fixme
# OBJECTIVE_SOURCES += tst_qfontdialog_mac_helpers.mm
-# LIBS += -framework Cocoa
+# LIBS += -framework AppKit
}
diff --git a/tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp b/tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp
index c3b80304a2..2590f31608 100644
--- a/tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp
+++ b/tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp
@@ -168,10 +168,10 @@ void testGetNumeric(QInputDialog *dialog, SpinBoxType * = 0, ValueType * = 0)
const ValueType origValue = sbox->value();
testInvalidateAndRestore<SpinBoxType, ValueType>(sbox, okButton, ledit);
- testTypingValue<SpinBoxType>(sbox, okButton, QString("%1").arg(sbox->minimum()));
- testTypingValue<SpinBoxType>(sbox, okButton, QString("%1").arg(sbox->maximum()));
- testTypingValue<SpinBoxType>(sbox, okButton, QString("%1").arg(sbox->minimum() - 1));
- testTypingValue<SpinBoxType>(sbox, okButton, QString("%1").arg(sbox->maximum() + 1));
+ testTypingValue<SpinBoxType>(sbox, okButton, QString::number(sbox->minimum()));
+ testTypingValue<SpinBoxType>(sbox, okButton, QString::number(sbox->maximum()));
+ testTypingValue<SpinBoxType>(sbox, okButton, QString::number(sbox->minimum() - 1));
+ testTypingValue<SpinBoxType>(sbox, okButton, QString::number(sbox->maximum() + 1));
testTypingValue<SpinBoxType>(sbox, okButton, "0");
testTypingValue<SpinBoxType>(sbox, okButton, "0.0");
testTypingValue<SpinBoxType>(sbox, okButton, "foobar");
diff --git a/tests/auto/widgets/dialogs/qmessagebox/qmessagebox.pro b/tests/auto/widgets/dialogs/qmessagebox/qmessagebox.pro
index e9f220101b..91848fee24 100644
--- a/tests/auto/widgets/dialogs/qmessagebox/qmessagebox.pro
+++ b/tests/auto/widgets/dialogs/qmessagebox/qmessagebox.pro
@@ -2,6 +2,5 @@ TEMPLATE = app
TARGET = tst_qmessagebox
QT += gui-private core-private widgets testlib
CONFIG += testcase
-CONFIG += parallel_test
SOURCES += tst_qmessagebox.cpp
diff --git a/tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp b/tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp
index 1a4f9077d9..d0d7a95c7e 100644
--- a/tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp
+++ b/tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp
@@ -616,7 +616,7 @@ void tst_QMessageBox::detailsButtonText()
QAbstractButton* btn = NULL;
foreach(btn, list) {
if (btn && (btn->inherits("QPushButton"))) {
- if (btn->text().remove("&") != QMessageBox::tr("OK")
+ if (btn->text().remove(QLatin1Char('&')) != QMessageBox::tr("OK")
&& btn->text() != QMessageBox::tr("Show Details...")) {
QFAIL(qPrintable(QString("Unexpected messagebox button text: %1").arg(btn->text())));
}
diff --git a/tests/auto/widgets/dialogs/qprogressdialog/qprogressdialog.pro b/tests/auto/widgets/dialogs/qprogressdialog/qprogressdialog.pro
index 290374f825..10aeaace71 100644
--- a/tests/auto/widgets/dialogs/qprogressdialog/qprogressdialog.pro
+++ b/tests/auto/widgets/dialogs/qprogressdialog/qprogressdialog.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qprogressdialog
QT += widgets testlib
SOURCES += tst_qprogressdialog.cpp
diff --git a/tests/auto/widgets/dialogs/qsidebar/qsidebar.pro b/tests/auto/widgets/dialogs/qsidebar/qsidebar.pro
index ce485504e2..18e637199a 100644
--- a/tests/auto/widgets/dialogs/qsidebar/qsidebar.pro
+++ b/tests/auto/widgets/dialogs/qsidebar/qsidebar.pro
@@ -1,8 +1,6 @@
CONFIG += testcase
-CONFIG += parallel_test
QT += core-private
QT += widgets widgets-private testlib
SOURCES += tst_qsidebar.cpp
TARGET = tst_qsidebar
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/widgets/dialogs/qsidebar/tst_qsidebar.cpp b/tests/auto/widgets/dialogs/qsidebar/tst_qsidebar.cpp
index 943e86e9dc..c0c2732d23 100644
--- a/tests/auto/widgets/dialogs/qsidebar/tst_qsidebar.cpp
+++ b/tests/auto/widgets/dialogs/qsidebar/tst_qsidebar.cpp
@@ -39,14 +39,6 @@
class tst_QSidebar : public QObject {
Q_OBJECT
-public:
- tst_QSidebar();
- virtual ~tst_QSidebar();
-
-public Q_SLOTS:
- void init();
- void cleanup();
-
private slots:
void setUrls();
void selectUrls();
@@ -55,22 +47,6 @@ private slots:
void goToUrl();
};
-tst_QSidebar::tst_QSidebar()
-{
-}
-
-tst_QSidebar::~tst_QSidebar()
-{
-}
-
-void tst_QSidebar::init()
-{
-}
-
-void tst_QSidebar::cleanup()
-{
-}
-
void tst_QSidebar::setUrls()
{
QList<QUrl> urls;
diff --git a/tests/auto/widgets/dialogs/qwizard/qwizard.pro b/tests/auto/widgets/dialogs/qwizard/qwizard.pro
index a1d72e854a..c6e5bcea7a 100644
--- a/tests/auto/widgets/dialogs/qwizard/qwizard.pro
+++ b/tests/auto/widgets/dialogs/qwizard/qwizard.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qwizard
QT += widgets testlib
SOURCES += tst_qwizard.cpp tst_qwizard_2.cpp
diff --git a/tests/auto/widgets/dialogs/qwizard/tst_qwizard.cpp b/tests/auto/widgets/dialogs/qwizard/tst_qwizard.cpp
index b2bdbac79a..9663d9cf58 100644
--- a/tests/auto/widgets/dialogs/qwizard/tst_qwizard.cpp
+++ b/tests/auto/widgets/dialogs/qwizard/tst_qwizard.cpp
@@ -59,11 +59,8 @@ class tst_QWizard : public QObject
public:
tst_QWizard();
-public slots:
- void init();
- void cleanup();
-
private slots:
+ void cleanup();
void buttonText();
void setButtonLayout();
void setButton();
@@ -138,10 +135,6 @@ private slots:
tst_QWizard::tst_QWizard()
{
-}
-
-void tst_QWizard::init()
-{
#ifdef Q_OS_WINCE //disable magic for WindowsCE
qApp->setAutoMaximizeThreshold(-1);
#endif
@@ -547,8 +540,8 @@ void tst_QWizard::setDefaultProperty()
// make sure the data structure is reasonable
for (int i = 0; i < 200000; ++i) {
- wizard.setDefaultProperty("QLineEdit", QByteArray("x" + QByteArray::number(i)).constData(), 0);
- wizard.setDefaultProperty("QLabel", QByteArray("y" + QByteArray::number(i)).constData(), 0);
+ wizard.setDefaultProperty("QLineEdit", QByteArray('x' + QByteArray::number(i)).constData(), 0);
+ wizard.setDefaultProperty("QLabel", QByteArray('y' + QByteArray::number(i)).constData(), 0);
}
}
@@ -1625,7 +1618,7 @@ class SetPage : public Operation
for (int j = 0; j < page; ++j)
wizard->next();
}
- QString describe() const { return QString("set page %1").arg(page); }
+ QString describe() const { return QLatin1String("set page ") + QString::number(page); }
const int page;
public:
SetPage(int page) : page(page) {}
@@ -1634,7 +1627,7 @@ public:
class SetStyle : public Operation
{
void apply(QWizard *wizard) const { wizard->setWizardStyle(style); }
- QString describe() const { return QString("set style %1").arg(style); }
+ QString describe() const { return QLatin1String("set style ") + QString::number(style); }
const QWizard::WizardStyle style;
public:
SetStyle(QWizard::WizardStyle style) : style(style) {}
@@ -1697,7 +1690,8 @@ public:
QString SetOption::describe() const
{
- return QString("set opt %1 %2").arg(OptionInfo::instance().tag(option)).arg(on);
+ return QLatin1String("set opt ") + OptionInfo::instance().tag(option)
+ + QLatin1Char(on ? '1' : '0');
}
Q_DECLARE_METATYPE(Operation *)
@@ -1726,7 +1720,7 @@ public:
void createTestRows()
{
for (int i = 0; i < combinations.count(); ++i) {
- QTest::newRow((name + QString(", row %1").arg(i)).toLatin1().data())
+ QTest::newRow((name.toLatin1() + ", row " + QByteArray::number(i)).constData())
<< (i == 0) << (type == Equality) << *(combinations.at(i));
++nRows_;
}
@@ -1827,7 +1821,7 @@ public:
foreach (Operation * op, operations) {
if (op) {
op->apply(this);
- opsDescr += QString("(%1) ").arg(op->describe());
+ opsDescr += QLatin1Char('(') + op->describe() + QLatin1String(") ");
}
}
}
@@ -2115,7 +2109,7 @@ void tst_QWizard::combinations()
}
if (minSizeTest)
- qDebug() << "minimum sizes" << reason.latin1() << ";" << wizard.minimumSizeHint()
+ qDebug() << "minimum sizes" << reason.latin1() << ';' << wizard.minimumSizeHint()
<< otor.latin1() << refMinSize;
if (imageTest)
@@ -2612,9 +2606,6 @@ void tst_QWizard::task161658_alignments()
void tst_QWizard::task177022_setFixedSize()
{
-#ifdef Q_OS_BLACKBERRY
- QSKIP("Window is forced fullscreen");
-#endif
int width = 300;
int height = 200;
QWizard wiz;
diff --git a/tests/auto/widgets/effects/qgraphicseffect/qgraphicseffect.pro b/tests/auto/widgets/effects/qgraphicseffect/qgraphicseffect.pro
index 9f6b0455e2..177d1a7c42 100644
--- a/tests/auto/widgets/effects/qgraphicseffect/qgraphicseffect.pro
+++ b/tests/auto/widgets/effects/qgraphicseffect/qgraphicseffect.pro
@@ -5,4 +5,3 @@ QT += widgets widgets-private testlib
QT += core-private gui-private
SOURCES += tst_qgraphicseffect.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/widgets/effects/qgraphicseffect/tst_qgraphicseffect.cpp b/tests/auto/widgets/effects/qgraphicseffect/tst_qgraphicseffect.cpp
index c7d1dd0aa1..ceeea77dc2 100644
--- a/tests/auto/widgets/effects/qgraphicseffect/tst_qgraphicseffect.cpp
+++ b/tests/auto/widgets/effects/qgraphicseffect/tst_qgraphicseffect.cpp
@@ -549,7 +549,7 @@ void tst_QGraphicsEffect::drawPixmapItem()
QVERIFY(QTest::qWaitForWindowExposed(&view));
QTRY_VERIFY(effect->repaints >= 1);
- item->rotate(180);
+ item->setTransform(QTransform().rotate(180), true);
QTRY_VERIFY(effect->repaints >= 2);
}
@@ -593,7 +593,7 @@ void tst_QGraphicsEffect::deviceCoordinateTranslateCaching()
QTRY_VERIFY(item->numRepaints >= 1);
int numRepaints = item->numRepaints;
- item->translate(10, 0);
+ item->setTransform(QTransform::fromTranslate(10, 0), true);
QTRY_COMPARE(item->numRepaints, numRepaints);
}
diff --git a/tests/auto/widgets/effects/qpixmapfilter/qpixmapfilter.pro b/tests/auto/widgets/effects/qpixmapfilter/qpixmapfilter.pro
index b6693eeb5f..bf0f99598b 100644
--- a/tests/auto/widgets/effects/qpixmapfilter/qpixmapfilter.pro
+++ b/tests/auto/widgets/effects/qpixmapfilter/qpixmapfilter.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpixmapfilter
QT += widgets widgets-private testlib
diff --git a/tests/auto/widgets/effects/qpixmapfilter/tst_qpixmapfilter.cpp b/tests/auto/widgets/effects/qpixmapfilter/tst_qpixmapfilter.cpp
index e21cb13a33..1fb8aee1e9 100644
--- a/tests/auto/widgets/effects/qpixmapfilter/tst_qpixmapfilter.cpp
+++ b/tests/auto/widgets/effects/qpixmapfilter/tst_qpixmapfilter.cpp
@@ -41,15 +41,6 @@ class tst_QPixmapFilter : public QObject
{
Q_OBJECT
-public:
- tst_QPixmapFilter();
- virtual ~tst_QPixmapFilter();
-
-
-public slots:
- void init();
- void cleanup();
-
private slots:
void colorizeSetColor();
void colorizeSetStrength();
@@ -78,22 +69,6 @@ public:
}
};
-tst_QPixmapFilter::tst_QPixmapFilter()
-{
-}
-
-tst_QPixmapFilter::~tst_QPixmapFilter()
-{
-}
-
-void tst_QPixmapFilter::init()
-{
-}
-
-void tst_QPixmapFilter::cleanup()
-{
-}
-
void tst_QPixmapFilter::testDefaultImplementations()
{
CustomFilter filter;
diff --git a/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/qgraphicsanchorlayout1.pro b/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/qgraphicsanchorlayout1.pro
index 6e8717c86d..a1064d1c73 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/qgraphicsanchorlayout1.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/qgraphicsanchorlayout1.pro
@@ -3,4 +3,3 @@ TARGET = tst_qgraphicsanchorlayout1
QT += widgets widgets-private testlib
QT += core-private gui-private
SOURCES += tst_qgraphicsanchorlayout1.cpp
-CONFIG += parallel_test
diff --git a/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp b/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp
index a58f295575..15987a094e 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp
@@ -159,7 +159,7 @@ public:
{
setContentsMargins( 0,0,0,0 );
if (name.isEmpty())
- setData(0, QString::fromLatin1("w%1").arg(quintptr(this)));
+ setData(0, QLatin1Char('w') + QString::number(quintptr(this)));
else
setData(0, name);
}
@@ -1702,10 +1702,8 @@ void tst_QGraphicsAnchorLayout1::testBasicLayout()
// Create dummy widgets
QList<QGraphicsWidget *> widgets;
- for (int i = 0; i < widgetCount; ++i) {
- TestWidget *w = new TestWidget(0, QString::fromLatin1("W%1").arg(i));
- widgets << w;
- }
+ for (int i = 0; i < widgetCount; ++i)
+ widgets << new TestWidget(0, QLatin1Char('W') + QString::number(i));
// Setup anchor layout
TheAnchorLayout *layout = new TheAnchorLayout;
diff --git a/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp b/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
index 8c27bebf3a..4a17977207 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
@@ -42,13 +42,8 @@ class tst_QGraphicsGridLayout : public QObject
{
Q_OBJECT
-public slots:
- void initTestCase();
- void cleanupTestCase();
- void init();
- void cleanup();
-
private slots:
+ void initTestCase();
void qgraphicsgridlayout_data();
void qgraphicsgridlayout();
void addItem_data();
@@ -309,27 +304,11 @@ typedef QList<QSizeF> SizeList;
// It is only called once.
void tst_QGraphicsGridLayout::initTestCase()
{
-}
-
-// This will be called after the last test function is executed.
-// It is only called once.
-void tst_QGraphicsGridLayout::cleanupTestCase()
-{
-}
-
-// This will be called before each test function is executed.
-void tst_QGraphicsGridLayout::init()
-{
#ifdef Q_OS_WINCE //disable magic for WindowsCE
qApp->setAutoMaximizeThreshold(-1);
#endif
}
-// This will be called after every test function.
-void tst_QGraphicsGridLayout::cleanup()
-{
-}
-
void tst_QGraphicsGridLayout::qgraphicsgridlayout_data()
{
}
@@ -451,9 +430,10 @@ void tst_QGraphicsGridLayout::addItem_data()
int column = b;
int rowSpan = c;
int columnSpan = d;
- QString name = QString::fromLatin1("(%1,%2,%3,%4").arg(a).arg(b).arg(c).arg(d);
+ const QByteArray name = '(' + QByteArray::number(a) + ',' + QByteArray::number(b)
+ + ',' + QByteArray::number(c) + ',' + QByteArray::number(d);
Qt::Alignment alignment = Qt::AlignLeft;
- QTest::newRow(name.toLatin1()) << row << column << rowSpan << columnSpan << alignment;
+ QTest::newRow(name.constData()) << row << column << rowSpan << columnSpan << alignment;
}}}}
}
@@ -1107,7 +1087,8 @@ void tst_QGraphicsGridLayout::itemAt()
if (i >= 0 && i < layout->count()) {
QVERIFY(layout->itemAt(i));
} else {
- QTest::ignoreMessage(QtWarningMsg, QString::fromLatin1("QGraphicsGridLayout::itemAt: invalid index %1").arg(i).toLatin1().constData());
+ const QByteArray message = "QGraphicsGridLayout::itemAt: invalid index " + QByteArray::number(i);
+ QTest::ignoreMessage(QtWarningMsg, message.constData());
QCOMPARE(layout->itemAt(i), static_cast<QGraphicsLayoutItem*>(0));
}
}
diff --git a/tests/auto/widgets/graphicsview/qgraphicsitem/qgraphicsitem.pro b/tests/auto/widgets/graphicsview/qgraphicsitem/qgraphicsitem.pro
index 66e39869bb..5bfa15db16 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsitem/qgraphicsitem.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicsitem/qgraphicsitem.pro
@@ -6,4 +6,3 @@ SOURCES += tst_qgraphicsitem.cpp
DEFINES += QT_NO_CAST_TO_ASCII
win32:!wince:!winrt: LIBS += -luser32
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
index 835aeaa4df..28ce831889 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
@@ -310,7 +310,7 @@ private slots:
void selected_textItem();
void selected_multi();
void acceptedMouseButtons();
- void acceptsHoverEvents();
+ void acceptHoverEvents();
void childAcceptsHoverEvents();
void hasFocus();
void pos();
@@ -385,7 +385,9 @@ private slots:
void itemContainsChildrenInShape2();
void ancestorFlags();
void untransformable();
+#ifndef QT_NO_CONTEXTMENU
void contextMenuEventPropagation();
+#endif // QT_NO_CONTEXTMENU
void itemIsMovable();
void boundingRegion_data();
void boundingRegion();
@@ -564,9 +566,9 @@ void tst_QGraphicsItem::construction()
QVERIFY(!item->isSelected());
QCOMPARE(item->acceptedMouseButtons(), Qt::MouseButtons(0x1f));
if (item->type() == QGraphicsTextItem::Type)
- QVERIFY(item->acceptsHoverEvents());
+ QVERIFY(item->acceptHoverEvents());
else
- QVERIFY(!item->acceptsHoverEvents());
+ QVERIFY(!item->acceptHoverEvents());
QVERIFY(!item->hasFocus());
QCOMPARE(item->pos(), QPointF());
QCOMPARE(item->matrix(), QMatrix());
@@ -1125,11 +1127,11 @@ void tst_QGraphicsItem::visible()
scene.addItem(item);
QVERIFY(item->isVisible());
- QCOMPARE(scene.itemAt(0, 0), item);
+ QCOMPARE(scene.items(QPointF(0, 0)).value(0, Q_NULLPTR), item);
item->setVisible(false);
- QCOMPARE(scene.itemAt(0, 0), (QGraphicsItem *)0);
+ QVERIFY(scene.items(QPointF(0, 0)).isEmpty());
item->setVisible(true);
- QCOMPARE(scene.itemAt(0, 0), item);
+ QCOMPARE(scene.items(QPointF(0, 0)).value(0, Q_NULLPTR), item);
QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress);
event.setButton(Qt::LeftButton);
@@ -1930,7 +1932,7 @@ protected:
{ ++hoverOutCount; }
};
-void tst_QGraphicsItem::acceptsHoverEvents()
+void tst_QGraphicsItem::acceptHoverEvents()
{
QGraphicsScene scene;
HoverItem *item1 = new HoverItem(QRectF(-10, -10, 20, 20));
@@ -1939,10 +1941,10 @@ void tst_QGraphicsItem::acceptsHoverEvents()
scene.addItem(item2);
item2->setZValue(1);
- QVERIFY(!item1->acceptsHoverEvents());
- QVERIFY(!item2->acceptsHoverEvents());
- item1->setAcceptsHoverEvents(true);
- item2->setAcceptsHoverEvents(true);
+ QVERIFY(!item1->acceptHoverEvents());
+ QVERIFY(!item2->acceptHoverEvents());
+ item1->setAcceptHoverEvents(true);
+ item2->setAcceptHoverEvents(true);
QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMouseMove);
event.setScenePos(QPointF(-100, -100));
@@ -1953,8 +1955,8 @@ void tst_QGraphicsItem::acceptsHoverEvents()
QCOMPARE(item1->hoverInCount, 0);
QCOMPARE(item2->hoverInCount, 1);
- item1->setAcceptsHoverEvents(false);
- item2->setAcceptsHoverEvents(false);
+ item1->setAcceptHoverEvents(false);
+ item2->setAcceptHoverEvents(false);
event.setScenePos(QPointF(-100, -100));
QApplication::sendEvent(&scene, &event);
@@ -1964,8 +1966,8 @@ void tst_QGraphicsItem::acceptsHoverEvents()
QCOMPARE(item1->hoverInCount, 0);
QCOMPARE(item2->hoverInCount, 1);
- item1->setAcceptsHoverEvents(true);
- item2->setAcceptsHoverEvents(false);
+ item1->setAcceptHoverEvents(true);
+ item2->setAcceptHoverEvents(false);
event.setScenePos(QPointF(-100, -100));
QApplication::sendEvent(&scene, &event);
@@ -2168,27 +2170,27 @@ void tst_QGraphicsItem::matrix()
line.resetMatrix();
QCOMPARE(line.matrix(), QMatrix());
- line.rotate(90);
+ line.setTransform(QTransform().rotate(90), true);
QCOMPARE(line.matrix(), QMatrix().rotate(90));
- line.rotate(90);
+ line.setTransform(QTransform().rotate(90), true);
QCOMPARE(line.matrix(), QMatrix().rotate(90).rotate(90));
line.resetMatrix();
- line.scale(2, 4);
+ line.setTransform(QTransform::fromScale(2, 4), true);
QCOMPARE(line.matrix(), QMatrix().scale(2, 4));
- line.scale(2, 4);
+ line.setTransform(QTransform::fromScale(2, 4), true);
QCOMPARE(line.matrix(), QMatrix().scale(2, 4).scale(2, 4));
line.resetMatrix();
- line.shear(2, 4);
+ line.setTransform(QTransform().shear(2, 4), true);
QCOMPARE(line.matrix(), QMatrix().shear(2, 4));
- line.shear(2, 4);
+ line.setTransform(QTransform().shear(2, 4), true);
QCOMPARE(line.matrix(), QMatrix().shear(2, 4).shear(2, 4));
line.resetMatrix();
- line.translate(10, 10);
+ line.setTransform(QTransform::fromTranslate(10, 10), true);
QCOMPARE(line.matrix(), QMatrix().translate(10, 10));
- line.translate(10, 10);
+ line.setTransform(QTransform::fromTranslate(10, 10), true);
QCOMPARE(line.matrix(), QMatrix().translate(10, 10).translate(10, 10));
line.resetMatrix();
}
@@ -2201,15 +2203,15 @@ void tst_QGraphicsItem::sceneMatrix()
QCOMPARE(parent->sceneMatrix(), QMatrix());
QCOMPARE(child->sceneMatrix(), QMatrix());
- parent->translate(10, 10);
+ parent->setTransform(QTransform::fromTranslate(10, 10), true);
QCOMPARE(parent->sceneMatrix(), QMatrix().translate(10, 10));
QCOMPARE(child->sceneMatrix(), QMatrix().translate(10, 10));
- child->translate(10, 10);
+ child->setTransform(QTransform::fromTranslate(10, 10), true);
QCOMPARE(parent->sceneMatrix(), QMatrix().translate(10, 10));
QCOMPARE(child->sceneMatrix(), QMatrix().translate(20, 20));
- parent->rotate(90);
+ parent->setTransform(QTransform().rotate(90), true);
QCOMPARE(parent->sceneMatrix(), QMatrix().translate(10, 10).rotate(90));
QCOMPARE(child->sceneMatrix(), QMatrix().translate(10, 10).rotate(90).translate(10, 10));
@@ -2645,7 +2647,7 @@ void tst_QGraphicsItem::isObscuredBy()
MyItem myitem1, myitem2;
myitem1.setRect(QRectF(50, 50, 40, 200));
- myitem1.rotate(67);
+ myitem1.setTransform(QTransform().rotate(67), true);
myitem2.setRect(QRectF(25, 25, 20, 20));
myitem2.setZValue(-1.0);
@@ -3271,7 +3273,7 @@ void tst_QGraphicsItem::hoverEventsGenerateRepaints()
EventTester *tester = new EventTester;
scene.addItem(tester);
- tester->setAcceptsHoverEvents(true);
+ tester->setAcceptHoverEvents(true);
QTRY_COMPARE(tester->repaints, 1);
@@ -3363,7 +3365,7 @@ void tst_QGraphicsItem::sceneBoundingRect()
QCOMPARE(item->boundingRect(), QRectF(0, 0, 100, 100));
QCOMPARE(item->sceneBoundingRect(), QRectF(100, 100, 100, 100));
- item->rotate(90);
+ item->setTransform(QTransform().rotate(90), true);
QCOMPARE(item->boundingRect(), QRectF(0, 0, 100, 100));
QCOMPARE(item->sceneBoundingRect(), QRectF(0, 100, 100, 100));
@@ -3391,7 +3393,7 @@ void tst_QGraphicsItem::childrenBoundingRect()
QGraphicsRectItem *childChild = scene.addRect(QRectF(0, 0, 100, 100), QPen(Qt::black, 0));
childChild->setParentItem(child);
childChild->setPos(500, 500);
- child->rotate(90);
+ child->setTransform(QTransform().rotate(90), true);
scene.addPolygon(parent->mapToScene(parent->boundingRect() | parent->childrenBoundingRect()))->setPen(QPen(Qt::red));;
@@ -3439,11 +3441,11 @@ void tst_QGraphicsItem::childrenBoundingRectTransformed()
QCOMPARE(subTreeRect.width(), qreal(351.7766952966369));
QCOMPARE(subTreeRect.height(), qreal(251.7766952966369));
- rect->rotate(45);
- rect2->rotate(-45);
- rect3->rotate(45);
- rect4->rotate(-45);
- rect5->rotate(45);
+ rect->setTransform(QTransform().rotate(45), true);
+ rect2->setTransform(QTransform().rotate(-45), true);
+ rect3->setTransform(QTransform().rotate(45), true);
+ rect4->setTransform(QTransform().rotate(-45), true);
+ rect5->setTransform(QTransform().rotate(45), true);
subTreeRect = rect->childrenBoundingRect();
QCOMPARE(rect->childrenBoundingRect(), QRectF(-100, 75, 275, 250));
@@ -3565,7 +3567,7 @@ void tst_QGraphicsItem::group()
QGraphicsRectItem *child = scene.addRect(QRectF(0, 0, 50, 50), QPen(Qt::black, 0), QBrush(Qt::blue));
QGraphicsRectItem *parent2 = scene.addRect(QRectF(0, 0, 50, 50), QPen(Qt::black, 0), QBrush(Qt::red));
parent2->setPos(-50, 50);
- child->rotate(45);
+ child->setTransform(QTransform().rotate(45), true);
child->setParentItem(parent);
parent->setPos(25, 25);
child->setPos(25, 25);
@@ -3614,7 +3616,7 @@ void tst_QGraphicsItem::group()
newItems << item;
item->setPos(-1000 + rand() % 2000,
-1000 + rand() % 2000);
- item->rotate(rand() % 90);
+ item->setTransform(QTransform().rotate(rand() % 90), true);
}
view.fitInView(scene.itemsBoundingRect());
@@ -3657,8 +3659,8 @@ void tst_QGraphicsItem::setGroup2()
rect->setTransformOriginPoint(50,50);
rect->setRotation(45);
rect->setScale(1.5);
- rect->translate(20,20);
- group.translate(-30,-40);
+ rect->setTransform(QTransform::fromTranslate(20,20), true);
+ group.setTransform(QTransform::fromTranslate(-30, -40), true);
group.setRotation(180);
group.setScale(0.5);
@@ -3711,7 +3713,7 @@ void tst_QGraphicsItem::warpChildrenIntoGroup()
QGraphicsScene scene;
QGraphicsRectItem *parentRectItem = scene.addRect(QRectF(0, 0, 100, 100));
QGraphicsRectItem *childRectItem = scene.addRect(QRectF(0, 0, 100, 100));
- parentRectItem->rotate(90);
+ parentRectItem->setTransform(QTransform().rotate(90), true);
childRectItem->setPos(-50, -25);
childRectItem->setParentItem(parentRectItem);
@@ -3720,7 +3722,7 @@ void tst_QGraphicsItem::warpChildrenIntoGroup()
QGraphicsRectItem *parentOfGroup = scene.addRect(QRectF(0, 0, 100, 100));
parentOfGroup->setPos(-200, -200);
- parentOfGroup->scale(2, 2);
+ parentOfGroup->setTransform(QTransform::fromScale(2, 2), true);
QGraphicsItemGroup *group = new QGraphicsItemGroup;
group->setPos(50, 50);
@@ -4128,9 +4130,9 @@ public:
font.setPointSize(4);
painter->setFont(font);
for (int x = -100; x < 100; x += 25) {
- for (int y = -100; y < 100; y += 25) {
- painter->drawText(QRectF(x, y, 25, 25), Qt::AlignCenter, QString("%1x%2").arg(x).arg(y));
- }
+ const QString prefix = QString::number(x) + QLatin1Char('x');
+ for (int y = -100; y < 100; y += 25)
+ painter->drawText(QRectF(x, y, 25, 25), Qt::AlignCenter, prefix + QString::number(y));
}
}
};
@@ -4633,7 +4635,7 @@ void tst_QGraphicsItem::itemChange()
// ItemTransformChange / ItemTransformHasChanged
tester.itemChangeReturnValue.setValue<QTransform>(QTransform().rotate(90));
- tester.translate(50, 0);
+ tester.setTransform(QTransform::fromTranslate(50, 0), true);
++changeCount; // notification sent too
++changeCount;
QCOMPARE(tester.changes.size(), changeCount);
@@ -5193,6 +5195,7 @@ public:
}
protected:
+#ifndef QT_NO_CONTEXTMENU
void contextMenuEvent(QGraphicsSceneContextMenuEvent *)
{
if (harakiri == 3) {
@@ -5200,6 +5203,7 @@ protected:
delete this;
}
}
+#endif // QT_NO_CONTEXTMENU
void dragEnterEvent(QGraphicsSceneDragDropEvent *event)
{
@@ -5362,7 +5366,7 @@ void tst_QGraphicsItem::deleteItemInEventHandlers()
for (int i = 0; i < 17; ++i) {
QGraphicsScene scene;
HarakiriItem *item = new HarakiriItem(i);
- item->setAcceptsHoverEvents(true);
+ item->setAcceptHoverEvents(true);
item->setFlag(QGraphicsItem::ItemIsFocusable);
scene.addItem(item);
@@ -5378,11 +5382,13 @@ void tst_QGraphicsItem::deleteItemInEventHandlers()
if (!item->dead)
scene.advance();
+#ifndef QT_NO_CONTEXTMENU
if (!item->dead) {
QContextMenuEvent event(QContextMenuEvent::Other,
view.mapFromScene(item->scenePos()));
QCoreApplication::sendEvent(view.viewport(), &event);
}
+#endif // QT_NO_CONTEXTMENU
if (!item->dead)
QTest::mouseMove(view.viewport(), view.mapFromScene(item->scenePos()));
if (!item->dead)
@@ -5514,16 +5520,16 @@ void tst_QGraphicsItem::itemClipsChildrenToShape2()
QGraphicsScene scene;
scene.addItem(parent);
- QCOMPARE(scene.itemAt(5, 5), (QGraphicsItem *)parent);
- QCOMPARE(scene.itemAt(15, 5), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(5, 15), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(60, 60), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(140, 60), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(60, 140), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(140, 140), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(75, 75), (QGraphicsItem *)child2);
- QCOMPARE(scene.itemAt(75, 100), (QGraphicsItem *)child1);
- QCOMPARE(scene.itemAt(100, 75), (QGraphicsItem *)child1);
+ QCOMPARE(scene.items(QPointF(5, 5)).value(0, Q_NULLPTR), (QGraphicsItem *)parent);
+ QVERIFY(scene.items(QPointF(15, 5)).isEmpty());
+ QVERIFY(scene.items(QPointF(5, 15)).isEmpty());
+ QVERIFY(scene.items(QPointF(60, 60)).isEmpty());
+ QVERIFY(scene.items(QPointF(140, 60)).isEmpty());
+ QVERIFY(scene.items(QPointF(60, 140)).isEmpty());
+ QVERIFY(scene.items(QPointF(140, 140)).isEmpty());
+ QCOMPARE(scene.items(QPointF(75, 75)).value(0, Q_NULLPTR), (QGraphicsItem *)child2);
+ QCOMPARE(scene.items(QPointF(75, 100)).value(0, Q_NULLPTR), (QGraphicsItem *)child1);
+ QCOMPARE(scene.items(QPointF(100, 75)).value(0, Q_NULLPTR), (QGraphicsItem *)child1);
QImage image(100, 100, QImage::Format_ARGB32_Premultiplied);
image.fill(0);
@@ -5558,20 +5564,20 @@ void tst_QGraphicsItem::itemClipsChildrenToShape3()
grandchild->setPos( 50, 50 );
parent->setFlag(QGraphicsItem::ItemClipsChildrenToShape);
- QCOMPARE(scene.itemAt(25,25), (QGraphicsItem *)parent);
- QCOMPARE(scene.itemAt(75,75), (QGraphicsItem *)child);
- QCOMPARE(scene.itemAt(125,125), (QGraphicsItem *)grandchild);
- QCOMPARE(scene.itemAt(175,175), (QGraphicsItem *)0);
+ QCOMPARE(scene.items(QPointF(25, 25)).value(0, Q_NULLPTR), (QGraphicsItem *)parent);
+ QCOMPARE(scene.items(QPointF(75, 75)).value(0, Q_NULLPTR), (QGraphicsItem *)child);
+ QCOMPARE(scene.items(QPointF(125, 125)).value(0, Q_NULLPTR), (QGraphicsItem *)grandchild);
+ QVERIFY(scene.items(QPointF(175, 175)).isEmpty());
// Move child to fully overlap the parent. The grandchild should
// now occupy two-thirds of the scene
child->prepareGeometryChange();
child->setPos( 0, 0 );
- QCOMPARE(scene.itemAt(25,25), (QGraphicsItem *)child);
- QCOMPARE(scene.itemAt(75,75), (QGraphicsItem *)grandchild);
- QCOMPARE(scene.itemAt(125,125), (QGraphicsItem *)grandchild);
- QCOMPARE(scene.itemAt(175,175), (QGraphicsItem *)0);
+ QCOMPARE(scene.items(QPointF(25, 25)).value(0, Q_NULLPTR), (QGraphicsItem *)child);
+ QCOMPARE(scene.items(QPointF(75, 75)).value(0, Q_NULLPTR), (QGraphicsItem *)grandchild);
+ QCOMPARE(scene.items(QPointF(125, 125)).value(0, Q_NULLPTR), (QGraphicsItem *)grandchild);
+ QVERIFY(scene.items(QPointF(175, 175)).isEmpty());
}
class MyProxyWidget : public QGraphicsProxyWidget
@@ -5843,17 +5849,17 @@ void tst_QGraphicsItem::itemClippingDiscovery()
rightRectItem->setParentItem(clipItem);
// The rects item are both visible at these points.
- QCOMPARE(scene.itemAt(10, 10), (QGraphicsItem *)leftRectItem);
- QCOMPARE(scene.itemAt(90, 90), (QGraphicsItem *)rightRectItem);
+ QCOMPARE(scene.items(QPointF(10, 10)).value(0, Q_NULLPTR), (QGraphicsItem *)leftRectItem);
+ QCOMPARE(scene.items(QPointF(90, 90)).value(0, Q_NULLPTR), (QGraphicsItem *)rightRectItem);
// The ellipse clips the rects now.
clipItem->setFlag(QGraphicsItem::ItemClipsChildrenToShape);
// The rect items are no longer visible at these points.
- QCOMPARE(scene.itemAt(10, 10), (QGraphicsItem *)0);
+ QVERIFY(scene.items(QPointF(10, 10)).isEmpty());
if (sizeof(qreal) != sizeof(double))
QSKIP("This fails due to internal rounding errors");
- QCOMPARE(scene.itemAt(90, 90), (QGraphicsItem *)0);
+ QVERIFY(scene.items(QPointF(90, 90)).isEmpty());
}
class ItemCountsBoundingRectCalls : public QGraphicsRectItem
@@ -5884,7 +5890,7 @@ void tst_QGraphicsItem::itemContainsChildrenInShape()
int oldChildBoundingRectCalls = childOutsideShape->boundingRectCalls;
// First test that both items are searched if no optimization flags are set
- QGraphicsItem* item = scene.itemAt(25,5);
+ QGraphicsItem* item = scene.items(QPointF(25, 5)).value(0, Q_NULLPTR);
QCOMPARE(item, childOutsideShape);
QVERIFY(parent->boundingRectCalls > oldParentBoundingRectCalls);
@@ -5895,7 +5901,7 @@ void tst_QGraphicsItem::itemContainsChildrenInShape()
oldChildBoundingRectCalls = childOutsideShape->boundingRectCalls;
// Repeat the test to make sure that no caching/indexing is in effect
- item = scene.itemAt(25,5);
+ item = scene.items(QPointF(25, 5)).value(0, Q_NULLPTR);
QCOMPARE(item, childOutsideShape);
QVERIFY(parent->boundingRectCalls > oldParentBoundingRectCalls);
@@ -5908,7 +5914,7 @@ void tst_QGraphicsItem::itemContainsChildrenInShape()
// Set the optimization flag and make sure that the child is not returned
// and that the child's boundingRect() method is never called.
parent->setFlag(QGraphicsItem::ItemContainsChildrenInShape);
- item = scene.itemAt(25,5);
+ item = scene.items(QPointF(25, 5)).value(0, Q_NULLPTR);
QVERIFY(!(item));
QVERIFY(parent->boundingRectCalls > oldParentBoundingRectCalls);
@@ -6216,12 +6222,12 @@ void tst_QGraphicsItem::untransformable()
QGraphicsItem *item1 = new QGraphicsEllipseItem(QRectF(-50, -50, 100, 100));
item1->setZValue(1);
item1->setFlag(QGraphicsItem::ItemIgnoresTransformations);
- item1->rotate(45);
+ item1->setTransform(QTransform().rotate(45), true);
((QGraphicsEllipseItem *)item1)->setBrush(Qt::red);
QGraphicsItem *item2 = new QGraphicsEllipseItem(QRectF(-50, -50, 100, 100));
item2->setParentItem(item1);
- item2->rotate(45);
+ item2->setTransform(QTransform().rotate(45), true);
item2->setPos(100, 0);
((QGraphicsEllipseItem *)item2)->setBrush(Qt::green);
@@ -6276,6 +6282,7 @@ void tst_QGraphicsItem::untransformable()
}
}
+#ifndef QT_NO_CONTEXTMENU
class ContextMenuItem : public QGraphicsRectItem
{
public:
@@ -6339,6 +6346,7 @@ void tst_QGraphicsItem::contextMenuEventPropagation()
QCOMPARE(bottomItem->gotEvent, false);
QCOMPARE(topItem->eventWasAccepted, true);
}
+#endif // QT_NO_CONTEXTMENU
void tst_QGraphicsItem::itemIsMovable()
{
@@ -6460,10 +6468,11 @@ void tst_QGraphicsItem::task177918_lineItemUndetected()
QGraphicsLineItem *line = scene.addLine(10, 10, 10, 10);
QCOMPARE(line->boundingRect(), QRectF(10, 10, 0, 0));
- QVERIFY(!scene.items(9, 9, 2, 2, Qt::IntersectsItemShape).isEmpty());
- QVERIFY(!scene.items(9, 9, 2, 2, Qt::ContainsItemShape).isEmpty());
- QVERIFY(!scene.items(9, 9, 2, 2, Qt::IntersectsItemBoundingRect).isEmpty());
- QVERIFY(!scene.items(9, 9, 2, 2, Qt::ContainsItemBoundingRect).isEmpty());
+ const QRectF rect(9, 9, 2, 2);
+ QVERIFY(!scene.items(rect, Qt::IntersectsItemShape).isEmpty());
+ QVERIFY(!scene.items(rect, Qt::ContainsItemShape).isEmpty());
+ QVERIFY(!scene.items(rect, Qt::IntersectsItemBoundingRect).isEmpty());
+ QVERIFY(!scene.items(rect, Qt::ContainsItemBoundingRect).isEmpty());
}
void tst_QGraphicsItem::task240400_clickOnTextItem_data()
@@ -6699,8 +6708,8 @@ void tst_QGraphicsItem::itemTransform_parentChild()
QGraphicsItem *child = scene.addRect(0, 0, 100, 100);
child->setParentItem(parent);
child->setPos(10, 10);
- child->scale(2, 2);
- child->rotate(90);
+ child->setTransform(QTransform::fromScale(2, 2), true);
+ child->setTransform(QTransform().rotate(90), true);
QCOMPARE(child->itemTransform(parent).map(QPointF(10, 10)), QPointF(-10, 30));
QCOMPARE(parent->itemTransform(child).map(QPointF(-10, 30)), QPointF(10, 10));
@@ -6712,19 +6721,19 @@ void tst_QGraphicsItem::itemTransform_siblings()
QGraphicsItem *parent = scene.addRect(0, 0, 100, 100);
QGraphicsItem *brother = scene.addRect(0, 0, 100, 100);
QGraphicsItem *sister = scene.addRect(0, 0, 100, 100);
- parent->scale(10, 5);
- parent->rotate(-180);
- parent->shear(2, 3);
+ parent->setTransform(QTransform::fromScale(10, 5), true);
+ parent->setTransform(QTransform().rotate(-180), true);
+ parent->setTransform(QTransform().shear(2, 3), true);
brother->setParentItem(parent);
sister->setParentItem(parent);
brother->setPos(10, 10);
- brother->scale(2, 2);
- brother->rotate(90);
+ brother->setTransform(QTransform::fromScale(2, 2), true);
+ brother->setTransform(QTransform().rotate(90), true);
sister->setPos(10, 10);
- sister->scale(2, 2);
- sister->rotate(90);
+ sister->setTransform(QTransform::fromScale(2, 2), true);
+ sister->setTransform(QTransform().rotate(90), true);
QCOMPARE(brother->itemTransform(sister).map(QPointF(10, 10)), QPointF(10, 10));
QCOMPARE(sister->itemTransform(brother).map(QPointF(10, 10)), QPointF(10, 10));
@@ -6736,11 +6745,11 @@ void tst_QGraphicsItem::itemTransform_unrelated()
QGraphicsItem *stranger1 = scene.addRect(0, 0, 100, 100);
QGraphicsItem *stranger2 = scene.addRect(0, 0, 100, 100);
stranger1->setPos(10, 10);
- stranger1->scale(2, 2);
- stranger1->rotate(90);
+ stranger1->setTransform(QTransform::fromScale(2, 2), true);
+ stranger1->setTransform(QTransform().rotate(90), true);
stranger2->setPos(10, 10);
- stranger2->scale(2, 2);
- stranger2->rotate(90);
+ stranger2->setTransform(QTransform::fromScale(2, 2), true);
+ stranger2->setTransform(QTransform().rotate(90), true);
QCOMPARE(stranger1->itemTransform(stranger2).map(QPointF(10, 10)), QPointF(10, 10));
QCOMPARE(stranger2->itemTransform(stranger1).map(QPointF(10, 10)), QPointF(10, 10));
@@ -7022,7 +7031,8 @@ void tst_QGraphicsItem::itemStacksBehindParent()
paintedItems.clear();
view.viewport()->update();
QApplication::processEvents();
- QTRY_COMPARE(scene.items(0, 0, 100, 100), (QList<QGraphicsItem *>()
+ QRectF rect(0, 0, 100, 100);
+ QTRY_COMPARE(scene.items(rect), (QList<QGraphicsItem *>()
<< grandChild111 << child11
<< grandChild121 << child12 << parent1
<< grandChild211 << child21
@@ -7038,7 +7048,7 @@ void tst_QGraphicsItem::itemStacksBehindParent()
paintedItems.clear();
QApplication::processEvents();
- QTRY_COMPARE(scene.items(0, 0, 100, 100), (QList<QGraphicsItem *>()
+ QTRY_COMPARE(scene.items(rect), (QList<QGraphicsItem *>()
<< grandChild121 << child12 << parent1
<< grandChild111 << child11
<< grandChild211 << child21
@@ -7054,7 +7064,7 @@ void tst_QGraphicsItem::itemStacksBehindParent()
scene.update();
QApplication::processEvents();
- QTRY_COMPARE(scene.items(0, 0, 100, 100), (QList<QGraphicsItem *>()
+ QTRY_COMPARE(scene.items(rect), (QList<QGraphicsItem *>()
<< parent1 << grandChild111 << child11
<< grandChild121 << child12
<< grandChild211 << child21
@@ -7221,12 +7231,12 @@ void tst_QGraphicsItem::sceneTransformCache()
QGraphicsRectItem *rect2 = scene.addRect(0, 0, 100, 100);
rect2->setPen(QPen(Qt::black, 0));
rect2->setParentItem(rect);
- rect2->rotate(90);
- rect->translate(0, 50);
+ rect2->setTransform(QTransform().rotate(90), true);
+ rect->setTransform(QTransform::fromTranslate(0, 50), true);
QGraphicsView view(&scene);
view.show();
QVERIFY(QTest::qWaitForWindowExposed(&view));
- rect->translate(0, 100);
+ rect->setTransform(QTransform::fromTranslate(0, 100), true);
QTransform x;
x.translate(0, 150);
x.rotate(90);
@@ -7390,14 +7400,14 @@ void tst_QGraphicsItem::cacheMode()
QCOMPARE(testerChild2->repaints, 2);
// Translating does not result in a repaint.
- tester->translate(10, 10);
+ tester->setTransform(QTransform::fromTranslate(10, 10), true);
QTest::qWait(25);
QTRY_COMPARE(tester->repaints, 2);
QCOMPARE(testerChild->repaints, 2);
QCOMPARE(testerChild2->repaints, 2);
// Rotating results in a repaint.
- tester->rotate(45);
+ tester->setTransform(QTransform().rotate(45), true);
QTest::qWait(25);
QTRY_COMPARE(tester->repaints, 3);
QCOMPARE(testerChild->repaints, 3);
@@ -7413,9 +7423,9 @@ void tst_QGraphicsItem::cacheMode()
QCOMPARE(testerChild2->repaints, 3);
// Rotating items with ItemCoordinateCache doesn't cause a repaint.
- tester->rotate(22);
- testerChild->rotate(22);
- testerChild2->rotate(22);
+ tester->setTransform(QTransform().rotate(22), true);
+ testerChild->setTransform(QTransform().rotate(22), true);
+ testerChild2->setTransform(QTransform().rotate(22), true);
QTest::qWait(25);
QTRY_COMPARE(tester->repaints, 4);
QTRY_COMPARE(testerChild->repaints, 4);
@@ -7648,7 +7658,9 @@ public:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0)
{
QGraphicsRectItem::paint(painter, option, widget);
- painter->drawText(boundingRect(), Qt::AlignCenter, QString("%1x%2\n%3x%4").arg(p.x()).arg(p.y()).arg(sp.x()).arg(sp.y()));
+ const QString text = QString::number(p.x()) + QLatin1Char('x') + QString::number(p.y())
+ + QLatin1Char('\n') + QString::number(sp.x()) + QLatin1Char('x') + QString::number(sp.y());
+ painter->drawText(boundingRect(), Qt::AlignCenter, text);
}
protected:
@@ -7728,9 +7740,9 @@ void tst_QGraphicsItem::deviceTransform()
rect1->setPos(100, 100);
rect2->setPos(100, 100);
rect3->setPos(100, 100);
- rect1->rotate(rotation1);
- rect2->rotate(rotation2);
- rect3->rotate(rotation3);
+ rect1->setTransform(QTransform().rotate(rotation1), true);
+ rect2->setTransform(QTransform().rotate(rotation2), true);
+ rect3->setTransform(QTransform().rotate(rotation3), true);
rect1->setFlag(QGraphicsItem::ItemIgnoresTransformations, untransformable1);
rect2->setFlag(QGraphicsItem::ItemIgnoresTransformations, untransformable2);
rect3->setFlag(QGraphicsItem::ItemIgnoresTransformations, untransformable3);
@@ -7863,14 +7875,14 @@ void tst_QGraphicsItem::update()
expectedRegion = itemDeviceBoundingRect.adjusted(-2, -2, 2, 2);
view.reset();
item->repaints = 0;
- parent->translate(-400, 0);
+ parent->setTransform(QTransform::fromTranslate(-400, 0), true);
qApp->processEvents();
QCOMPARE(item->repaints, 0);
QCOMPARE(view.repaints, 1);
QCOMPARE(view.paintedRegion, expectedRegion);
view.reset();
item->repaints = 0;
- parent->translate(400, 0);
+ parent->setTransform(QTransform::fromTranslate(400, 0), true);
qApp->processEvents();
QCOMPARE(item->repaints, 1);
QCOMPARE(view.repaints, 1);
@@ -8170,7 +8182,7 @@ void tst_QGraphicsItem::moveItem()
RESET_COUNTERS
- parent->translate(20, 20);
+ parent->setTransform(QTransform::fromTranslate(20, 20), true);
qApp->processEvents();
QCOMPARE(parent->repaints, 1);
QCOMPARE(child->repaints, 1);
@@ -8236,10 +8248,11 @@ void tst_QGraphicsItem::sorting()
QGraphicsScene scene;
QGraphicsItem *grid[100][100];
for (int x = 0; x < 100; ++x) {
+ const QString prefix = QString::number(x) + QLatin1Char('x');
for (int y = 0; y < 100; ++y) {
PainterItem *item = new PainterItem;
item->setPos(x * 25, y * 25);
- item->setData(0, QString("%1x%2").arg(x).arg(y));
+ item->setData(0, prefix + QString::number(y));
grid[x][y] = item;
scene.addItem(item);
}
@@ -11641,12 +11654,12 @@ void tst_QGraphicsItem::QTBUG_21618_untransformable_sceneTransform()
QGraphicsItem *item1 = scene.addRect(0, 0, 100, 100, QPen(), Qt::red);
item1->setPos(50, 50);
- item1->translate(50, 50);
- item1->rotate(90);
+ item1->setTransform(QTransform::fromTranslate(50, 50), true);
+ item1->setTransform(QTransform().rotate(90), true);
QGraphicsItem *item2 = scene.addRect(0, 0, 100, 100, QPen(), Qt::green);
item2->setPos(50, 50);
- item2->translate(50, 50);
- item2->rotate(90);
+ item2->setTransform(QTransform::fromTranslate(50, 50), true);
+ item2->setTransform(QTransform().rotate(90), true);
item2->setFlags(QGraphicsItem::ItemIgnoresTransformations);
QGraphicsRectItem *item1_topleft = new QGraphicsRectItem(QRectF(-2, -2, 4, 4));
diff --git a/tests/auto/widgets/graphicsview/qgraphicsitemanimation/qgraphicsitemanimation.pro b/tests/auto/widgets/graphicsview/qgraphicsitemanimation/qgraphicsitemanimation.pro
index 484f4ba5f8..3515d259d0 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsitemanimation/qgraphicsitemanimation.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicsitemanimation/qgraphicsitemanimation.pro
@@ -3,5 +3,4 @@ TARGET = tst_qgraphicsitemanimation
QT += widgets testlib
SOURCES += tst_qgraphicsitemanimation.cpp
DEFINES += QT_NO_CAST_TO_ASCII
-CONFIG += parallel_test
diff --git a/tests/auto/widgets/graphicsview/qgraphicslayout/qgraphicslayout.pro b/tests/auto/widgets/graphicsview/qgraphicslayout/qgraphicslayout.pro
index 254a91ef6a..1be43692d5 100644
--- a/tests/auto/widgets/graphicsview/qgraphicslayout/qgraphicslayout.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicslayout/qgraphicslayout.pro
@@ -7,4 +7,3 @@ TARGET = tst_qgraphicslayout
QT += widgets testlib
SOURCES += tst_qgraphicslayout.cpp
DEFINES += QT_USE_USING_NAMESPACE
-CONFIG += parallel_test
diff --git a/tests/auto/widgets/graphicsview/qgraphicslayoutitem/qgraphicslayoutitem.pro b/tests/auto/widgets/graphicsview/qgraphicslayoutitem/qgraphicslayoutitem.pro
index ef5cc36d05..e4a970201a 100644
--- a/tests/auto/widgets/graphicsview/qgraphicslayoutitem/qgraphicslayoutitem.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicslayoutitem/qgraphicslayoutitem.pro
@@ -2,5 +2,4 @@ CONFIG += testcase
TARGET = tst_qgraphicslayoutitem
QT += widgets testlib
SOURCES += tst_qgraphicslayoutitem.cpp
-CONFIG += parallel_test
diff --git a/tests/auto/widgets/graphicsview/qgraphicslayoutitem/tst_qgraphicslayoutitem.cpp b/tests/auto/widgets/graphicsview/qgraphicslayoutitem/tst_qgraphicslayoutitem.cpp
index c291f09def..e28d1af60c 100644
--- a/tests/auto/widgets/graphicsview/qgraphicslayoutitem/tst_qgraphicslayoutitem.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicslayoutitem/tst_qgraphicslayoutitem.cpp
@@ -40,12 +40,6 @@
class tst_QGraphicsLayoutItem : public QObject {
Q_OBJECT
-public slots:
- void initTestCase();
- void cleanupTestCase();
- void init();
- void cleanup();
-
private slots:
void qgraphicslayoutitem();
@@ -96,28 +90,6 @@ public:
};
-// This will be called before the first test function is executed.
-// It is only called once.
-void tst_QGraphicsLayoutItem::initTestCase()
-{
-}
-
-// This will be called after the last test function is executed.
-// It is only called once.
-void tst_QGraphicsLayoutItem::cleanupTestCase()
-{
-}
-
-// This will be called before each test function is executed.
-void tst_QGraphicsLayoutItem::init()
-{
-}
-
-// This will be called after every test function.
-void tst_QGraphicsLayoutItem::cleanup()
-{
-}
-
void tst_QGraphicsLayoutItem::qgraphicslayoutitem()
{
SubQGraphicsLayoutItem layoutItem;
@@ -146,7 +118,7 @@ void tst_QGraphicsLayoutItem::effectiveSizeHint_data()
QTest::addColumn<Qt::SizeHint>("sizeHint");
QTest::addColumn<QSizeF>("constraint");
for (int i = 0; i < 15; ++i) {
- QTestData &data = QTest::newRow(QString("%1").arg(i).toLatin1());
+ QTestData &data = QTest::newRow(QByteArray::number(i).constData());
switch(i % 5) {
case 0: data << Qt::MinimumSize; break;
case 1: data << Qt::PreferredSize; break;
diff --git a/tests/auto/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp b/tests/auto/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
index 8bebd4eddd..1d234c88fb 100644
--- a/tests/auto/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
@@ -46,13 +46,8 @@
class tst_QGraphicsLinearLayout : public QObject {
Q_OBJECT
-public slots:
- void initTestCase();
- void cleanupTestCase();
- void init();
- void cleanup();
-
private slots:
+ void initTestCase();
void qgraphicslinearlayout_data();
void qgraphicslinearlayout();
@@ -151,22 +146,6 @@ void tst_QGraphicsLinearLayout::initTestCase()
QApplication::setStyle("windows");
}
-// This will be called after the last test function is executed.
-// It is only called once.
-void tst_QGraphicsLinearLayout::cleanupTestCase()
-{
-}
-
-// This will be called before each test function is executed.
-void tst_QGraphicsLinearLayout::init()
-{
-}
-
-// This will be called after every test function.
-void tst_QGraphicsLinearLayout::cleanup()
-{
-}
-
class RectWidget : public QGraphicsWidget
{
public:
@@ -425,10 +404,11 @@ void tst_QGraphicsLinearLayout::dump_data()
QTest::addColumn<int>("itemCount");
QTest::addColumn<int>("layoutCount");
for (int i = -1; i < 3; ++i) {
- QTest::newRow(QString("%1, 0, 0").arg(i).toLatin1()) << 0 << 0;
- QTest::newRow(QString("%1, 0, 5").arg(i).toLatin1()) << 5 << 5;
- QTest::newRow(QString("%1, 5, 0").arg(i).toLatin1()) << 5 << 5;
- QTest::newRow(QString("%1, 5, 5").arg(i).toLatin1()) << 5 << 5;
+ const QByteArray iB = QByteArray::number(i);
+ QTest::newRow((iB + ", 0, 0").constData()) << 0 << 0;
+ QTest::newRow((iB + ", 0, 5").constData()) << 5 << 5;
+ QTest::newRow((iB + ", 5, 0").constData()) << 5 << 5;
+ QTest::newRow((iB + ", 5, 5").constData()) << 5 << 5;
}
}
@@ -511,11 +491,13 @@ void tst_QGraphicsLinearLayout::insertItem_data()
QTest::addColumn<int>("insertItemAt");
QTest::addColumn<bool>("isWidget");
for (int i = -1; i < 4; ++i) {
+ const QByteArray iB = QByteArray::number(i);
for (int j = 0; j < 2; ++j) {
- QTest::newRow(QString("0, 0, %1 %2").arg(i).arg(j).toLatin1()) << 0 << 0 << i << (bool)j;
- QTest::newRow(QString("1, 0, %1 %2").arg(i).arg(j).toLatin1()) << 1 << 0 << i << (bool)j;
- QTest::newRow(QString("0, 1, %1 %2").arg(i).arg(j).toLatin1()) << 0 << 1 << i << (bool)j;
- QTest::newRow(QString("2, 2, %1 %2").arg(i).arg(j).toLatin1()) << 2 << 2 << i << (bool)j;
+ const QByteArray postFix = iB + ' ' + QByteArray::number(j);
+ QTest::newRow(("0, 0, " + postFix).constData()) << 0 << 0 << i << (bool)j;
+ QTest::newRow(("1, 0, " + postFix).constData()) << 1 << 0 << i << (bool)j;
+ QTest::newRow(("0, 1, " + postFix).constData()) << 0 << 1 << i << (bool)j;
+ QTest::newRow(("2, 2, " + postFix).constData()) << 2 << 2 << i << (bool)j;
}
}
}
@@ -565,11 +547,13 @@ void tst_QGraphicsLinearLayout::insertStretch_data()
QTest::addColumn<int>("insertItemAt");
QTest::addColumn<int>("stretch");
for (int i = -1; i < 4; ++i) {
+ const QByteArray iB = QByteArray::number(i);
for (int j = 0; j < 2; ++j) {
- QTest::newRow(QString("0, 0, %1 %2").arg(i).arg(j).toLatin1()) << 0 << 0 << i << j;
- QTest::newRow(QString("1, 0, %1 %2").arg(i).arg(j).toLatin1()) << 1 << 0 << i << j;
- QTest::newRow(QString("0, 1, %1 %2").arg(i).arg(j).toLatin1()) << 0 << 1 << i << j;
- QTest::newRow(QString("2, 2, %1 %2").arg(i).arg(j).toLatin1()) << 2 << 2 << i << j;
+ const QByteArray postFix = iB + ' ' + QByteArray::number(j);
+ QTest::newRow(("0, 0, " + postFix).constData()) << 0 << 0 << i << j;
+ QTest::newRow(("1, 0, " + postFix).constData()) << 1 << 0 << i << j;
+ QTest::newRow(("0, 1, " + postFix).constData()) << 0 << 1 << i << j;
+ QTest::newRow(("2, 2, " + postFix).constData()) << 2 << 2 << i << j;
}
}
}
@@ -786,12 +770,13 @@ void tst_QGraphicsLinearLayout::removeAt_data()
QTest::addColumn<int>("removeItemAt");
QTest::addColumn<Qt::Orientation>("orientation");
for (int i = -1; i < 4; ++i) {
+ const QByteArray iB = QByteArray::number(i);
for (int k = 0; k < 2; ++k) {
Qt::Orientation orientation = (k == 0) ? Qt::Vertical : Qt::Horizontal;
- QTest::newRow(QString("0, 0, %1").arg(i).toLatin1()) << 0 << 0 << i << orientation;
- QTest::newRow(QString("1, 0, %1").arg(i).toLatin1()) << 1 << 0 << i << orientation;
- QTest::newRow(QString("0, 1, %1").arg(i).toLatin1()) << 0 << 1 << i << orientation;
- QTest::newRow(QString("2, 2, %1").arg(i).toLatin1()) << 2 << 2 << i << orientation;
+ QTest::newRow(("0, 0, " + iB).constData()) << 0 << 0 << i << orientation;
+ QTest::newRow(("1, 0, " + iB).constData()) << 1 << 0 << i << orientation;
+ QTest::newRow(("0, 1, " + iB).constData()) << 0 << 1 << i << orientation;
+ QTest::newRow(("2, 2, " + iB).constData()) << 2 << 2 << i << orientation;
}
}
}
@@ -840,10 +825,11 @@ void tst_QGraphicsLinearLayout::removeItem_data()
QTest::addColumn<int>("layoutCount");
QTest::addColumn<int>("removeItemAt");
for (int i = -1; i < 4; ++i) {
- QTest::newRow(QString("0, 0, %1").arg(i).toLatin1()) << 0 << 0 << i;
- QTest::newRow(QString("1, 0, %1").arg(i).toLatin1()) << 1 << 0 << i;
- QTest::newRow(QString("0, 1, %1").arg(i).toLatin1()) << 0 << 1 << i;
- QTest::newRow(QString("2, 2, %1").arg(i).toLatin1()) << 2 << 2 << i;
+ const QByteArray iB = QByteArray::number(i);
+ QTest::newRow(("0, 0, " + iB).constData()) << 0 << 0 << i;
+ QTest::newRow(("1, 0, " + iB).constData()) << 1 << 0 << i;
+ QTest::newRow(("0, 1, " + iB).constData()) << 0 << 1 << i;
+ QTest::newRow(("2, 2, " + iB).constData()) << 2 << 2 << i;
}
}
diff --git a/tests/auto/widgets/graphicsview/qgraphicsobject/qgraphicsobject.pro b/tests/auto/widgets/graphicsview/qgraphicsobject/qgraphicsobject.pro
index 60f09c2228..483f123fa7 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsobject/qgraphicsobject.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicsobject/qgraphicsobject.pro
@@ -5,4 +5,3 @@ QT += widgets testlib
QT += core-private
SOURCES += tst_qgraphicsobject.cpp
-CONFIG += parallel_test
diff --git a/tests/auto/widgets/graphicsview/qgraphicsobject/tst_qgraphicsobject.cpp b/tests/auto/widgets/graphicsview/qgraphicsobject/tst_qgraphicsobject.cpp
index 0f9e8c101e..7080b667af 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsobject/tst_qgraphicsobject.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsobject/tst_qgraphicsobject.cpp
@@ -43,12 +43,6 @@
class tst_QGraphicsObject : public QObject {
Q_OBJECT
-public slots:
- void initTestCase();
- void cleanupTestCase();
- void init();
- void cleanup();
-
private slots:
void pos();
void x();
@@ -60,30 +54,6 @@ private slots:
void deleted();
};
-
-// This will be called before the first test function is executed.
-// It is only called once.
-void tst_QGraphicsObject::initTestCase()
-{
-}
-
-// This will be called after the last test function is executed.
-// It is only called once.
-void tst_QGraphicsObject::cleanupTestCase()
-{
-}
-
-// This will be called before each test function is executed.
-void tst_QGraphicsObject::init()
-{
-}
-
-// This will be called after every test function.
-void tst_QGraphicsObject::cleanup()
-{
-}
-
-
class MyGraphicsObject : public QGraphicsObject
{
public:
diff --git a/tests/auto/widgets/graphicsview/qgraphicspixmapitem/qgraphicspixmapitem.pro b/tests/auto/widgets/graphicsview/qgraphicspixmapitem/qgraphicspixmapitem.pro
index 6452e39c56..123f1050ec 100644
--- a/tests/auto/widgets/graphicsview/qgraphicspixmapitem/qgraphicspixmapitem.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicspixmapitem/qgraphicspixmapitem.pro
@@ -2,5 +2,4 @@ CONFIG += testcase
TARGET = tst_qgraphicspixmapitem
QT += widgets testlib
SOURCES += tst_qgraphicspixmapitem.cpp
-CONFIG += parallel_test
diff --git a/tests/auto/widgets/graphicsview/qgraphicspixmapitem/tst_qgraphicspixmapitem.cpp b/tests/auto/widgets/graphicsview/qgraphicspixmapitem/tst_qgraphicspixmapitem.cpp
index 774a41b212..7f900302fe 100644
--- a/tests/auto/widgets/graphicsview/qgraphicspixmapitem/tst_qgraphicspixmapitem.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicspixmapitem/tst_qgraphicspixmapitem.cpp
@@ -40,12 +40,6 @@ class tst_QGraphicsPixmapItem : public QObject
{
Q_OBJECT
-public slots:
- void initTestCase();
- void cleanupTestCase();
- void init();
- void cleanup();
-
private slots:
void qgraphicspixmapitem_data();
void qgraphicspixmapitem();
@@ -102,28 +96,6 @@ public:
{ return SubQGraphicsPixmapItem::supportsExtension((QGraphicsItem::Extension)extension); }
};
-// This will be called before the first test function is executed.
-// It is only called once.
-void tst_QGraphicsPixmapItem::initTestCase()
-{
-}
-
-// This will be called after the last test function is executed.
-// It is only called once.
-void tst_QGraphicsPixmapItem::cleanupTestCase()
-{
-}
-
-// This will be called before each test function is executed.
-void tst_QGraphicsPixmapItem::init()
-{
-}
-
-// This will be called after every test function.
-void tst_QGraphicsPixmapItem::cleanup()
-{
-}
-
void tst_QGraphicsPixmapItem::qgraphicspixmapitem_data()
{
}
diff --git a/tests/auto/widgets/graphicsview/qgraphicspolygonitem/qgraphicspolygonitem.pro b/tests/auto/widgets/graphicsview/qgraphicspolygonitem/qgraphicspolygonitem.pro
index bca0ecc20c..89847e9ed2 100644
--- a/tests/auto/widgets/graphicsview/qgraphicspolygonitem/qgraphicspolygonitem.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicspolygonitem/qgraphicspolygonitem.pro
@@ -2,5 +2,3 @@ CONFIG += testcase
TARGET = tst_qgraphicspolygonitem
QT += widgets testlib
SOURCES += tst_qgraphicspolygonitem.cpp
-CONFIG += parallel_test
-
diff --git a/tests/auto/widgets/graphicsview/qgraphicspolygonitem/tst_qgraphicspolygonitem.cpp b/tests/auto/widgets/graphicsview/qgraphicspolygonitem/tst_qgraphicspolygonitem.cpp
index 376846471b..ab4f2cec08 100644
--- a/tests/auto/widgets/graphicsview/qgraphicspolygonitem/tst_qgraphicspolygonitem.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicspolygonitem/tst_qgraphicspolygonitem.cpp
@@ -41,12 +41,6 @@ class tst_QGraphicsPolygonItem : public QObject
{
Q_OBJECT
-public slots:
- void initTestCase();
- void cleanupTestCase();
- void init();
- void cleanup();
-
private slots:
void qgraphicspolygonitem_data();
void qgraphicspolygonitem();
@@ -98,28 +92,6 @@ public:
{ return SubQGraphicsPolygonItem::supportsExtension((QGraphicsItem::Extension)extension); }
};
-// This will be called before the first test function is executed.
-// It is only called once.
-void tst_QGraphicsPolygonItem::initTestCase()
-{
-}
-
-// This will be called after the last test function is executed.
-// It is only called once.
-void tst_QGraphicsPolygonItem::cleanupTestCase()
-{
-}
-
-// This will be called before each test function is executed.
-void tst_QGraphicsPolygonItem::init()
-{
-}
-
-// This will be called after every test function.
-void tst_QGraphicsPolygonItem::cleanup()
-{
-}
-
void tst_QGraphicsPolygonItem::qgraphicspolygonitem_data()
{
}
diff --git a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/qgraphicsproxywidget.pro b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/qgraphicsproxywidget.pro
index 38fef51394..e7bcccb495 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/qgraphicsproxywidget.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/qgraphicsproxywidget.pro
@@ -6,4 +6,3 @@ QT += core-private gui-private
SOURCES += tst_qgraphicsproxywidget.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp
index 8760dc176c..d8746906e9 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp
@@ -84,13 +84,9 @@ class tst_QGraphicsProxyWidget : public QObject
{
Q_OBJECT
-public slots:
+private slots:
void initTestCase();
- void cleanupTestCase();
- void init();
void cleanup();
-
-private slots:
void qgraphicsproxywidget_data();
void qgraphicsproxywidget();
void paint();
@@ -162,7 +158,9 @@ private slots:
void fontPropagation();
void dontCrashWhenDie();
void createProxyForChildWidget();
+#ifndef QT_NO_CONTEXTMENU
void actionsContextMenu();
+#endif // QT_NO_CONTEXTMENU
void actionsContextMenu_data();
void deleteProxyForChildWidget();
void bypassGraphicsProxyWidget_data();
@@ -289,17 +287,6 @@ void tst_QGraphicsProxyWidget::initTestCase()
QApplication::setEffectEnabled(Qt::UI_AnimateCombo, false);
}
-// This will be called after the last test function is executed.
-// It is only called once.
-void tst_QGraphicsProxyWidget::cleanupTestCase()
-{
-}
-
-// This will be called before each test function is executed.
-void tst_QGraphicsProxyWidget::init()
-{
-}
-
// This will be called after every test function.
void tst_QGraphicsProxyWidget::cleanup()
{
@@ -492,7 +479,7 @@ void tst_QGraphicsProxyWidget::setWidget()
QCOMPARE(proxy->rect().toRect(), widget->rect());
QCOMPARE(proxy->focusPolicy(), Qt::WheelFocus);
QVERIFY(proxy->acceptDrops());
- QCOMPARE(proxy->acceptsHoverEvents(), true); // to get widget enter events
+ QCOMPARE(proxy->acceptHoverEvents(), true); // to get widget enter events
int left, top, right, bottom;
widget->getContentsMargins(&left, &top, &right, &bottom);
qreal rleft, rtop, rright, rbottom;
@@ -541,14 +528,15 @@ void tst_QGraphicsProxyWidget::testEventFilter_data()
QTest::newRow("none") << QEvent::None << false;
for (int i = 0; i < 2; ++i) {
bool fromObject = (i == 0);
- QTest::newRow(QString("resize %1").arg(fromObject).toLatin1()) << QEvent::Resize << fromObject;
- QTest::newRow(QString("move %1").arg(fromObject).toLatin1()) << QEvent::Move << fromObject;
- QTest::newRow(QString("hide %1").arg(fromObject).toLatin1()) << QEvent::Hide << fromObject;
- QTest::newRow(QString("show %1").arg(fromObject).toLatin1()) << QEvent::Show << fromObject;
- QTest::newRow(QString("enabled %1").arg(fromObject).toLatin1()) << QEvent::EnabledChange << fromObject;
- QTest::newRow(QString("focusIn %1").arg(fromObject).toLatin1()) << QEvent::FocusIn << fromObject;
- QTest::newRow(QString("focusOut %1").arg(fromObject).toLatin1()) << QEvent::FocusOut << fromObject;
- QTest::newRow(QString("keyPress %1").arg(fromObject).toLatin1()) << QEvent::KeyPress << fromObject;
+ const char fromObjectC = fromObject ? '1' : '0';
+ QTest::newRow((QByteArrayLiteral("resize ") + fromObjectC).constData()) << QEvent::Resize << fromObject;
+ QTest::newRow((QByteArrayLiteral("move ") + fromObjectC).constData()) << QEvent::Move << fromObject;
+ QTest::newRow((QByteArrayLiteral("hide ") + fromObjectC).constData()) << QEvent::Hide << fromObject;
+ QTest::newRow((QByteArrayLiteral("show ") + fromObjectC).constData()) << QEvent::Show << fromObject;
+ QTest::newRow((QByteArrayLiteral("enabled ") + fromObjectC).constData()) << QEvent::EnabledChange << fromObject;
+ QTest::newRow((QByteArrayLiteral("focusIn ") + fromObjectC).constData()) << QEvent::FocusIn << fromObject;
+ QTest::newRow((QByteArrayLiteral("focusOut ") + fromObjectC).constData()) << QEvent::FocusOut << fromObject;
+ QTest::newRow((QByteArrayLiteral("keyPress ") + fromObjectC).constData()) << QEvent::KeyPress << fromObject;
}
}
@@ -760,8 +748,10 @@ void tst_QGraphicsProxyWidget::focusNextPrevChild_data()
bool hasWidget = (j == 0);
bool hasScene = (k == 0);
bool result = hasScene && hasWidget;
- QString name = QString("Forward: %1, hasWidget: %2, hasScene: %3, result: %4").arg(next).arg(hasWidget).arg(hasScene).arg(result);
- QTest::newRow(name.toLatin1()) << hasWidget << hasScene << next << result;
+ QByteArray name = QByteArrayLiteral("Forward: ") + (next ? '1' : '0')
+ + ", hasWidget: " + (hasWidget ? '1' : '0') + ", hasScene: "
+ + (hasScene ? '1' : '0') + ", result: " + (result ? '1' : '0');
+ QTest::newRow(name.constData()) << hasWidget << hasScene << next << result;
}
}
}
@@ -1026,8 +1016,10 @@ void tst_QGraphicsProxyWidget::hoverMoveEvent_data()
bool hoverEnabled = (j == 0);
bool mouseTracking = (k == 0);
bool mouseDown = (l == 0);
- QString name = QString("hasWidget:%1, hover:%2, mouseTracking:%3, mouseDown: %4").arg(hasWidget).arg(hoverEnabled).arg(mouseTracking).arg(mouseDown);
- QTest::newRow(name.toLatin1()) << hasWidget << hoverEnabled << mouseTracking << mouseDown;
+ QByteArray name = QByteArrayLiteral("hasWidget:") + (hasWidget ? '1' : '0') + ", hover:"
+ + (hoverEnabled ? '1' : '0') + ", mouseTracking:"
+ + (mouseTracking ? '1' : '0') + ", mouseDown: " + (mouseDown ? '1' : '0');
+ QTest::newRow(name.constData()) << hasWidget << hoverEnabled << mouseTracking << mouseDown;
}
}
}
@@ -3072,6 +3064,7 @@ void tst_QGraphicsProxyWidget::createProxyForChildWidget()
delete boxProxy;
}
+#ifndef QT_NO_CONTEXTMENU
class ContextMenuWidget : public QLabel
{
Q_OBJECT
@@ -3120,6 +3113,7 @@ private:
bool m_embeddedPopupSet;
QTimer *m_timer;
};
+#endif // QT_NO_CONTEXTMENU
void tst_QGraphicsProxyWidget::actionsContextMenu_data()
{
@@ -3132,6 +3126,7 @@ void tst_QGraphicsProxyWidget::actionsContextMenu_data()
QTest::newRow("with actionsContextMenu without focus") << true << false;
}
+#ifndef QT_NO_CONTEXTMENU
void tst_QGraphicsProxyWidget::actionsContextMenu()
{
QFETCH(bool, hasFocus);
@@ -3186,7 +3181,7 @@ void tst_QGraphicsProxyWidget::actionsContextMenu()
}
}
-
+#endif // QT_NO_CONTEXTMENU
void tst_QGraphicsProxyWidget::deleteProxyForChildWidget()
{
diff --git a/tests/auto/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro b/tests/auto/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro
index 25a43d6821..1a775d8b16 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro
@@ -17,4 +17,3 @@ wince* {
DEPLOYMENT += rootFiles renderFiles
DEFINES += SRCDIR=\\\".\\\"
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp b/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
index ae71b0412f..f494e4474c 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
@@ -108,7 +108,7 @@ class HoverItem : public QGraphicsRectItem
public:
HoverItem()
: QGraphicsRectItem(QRectF(-10, -10, 20, 20)), isHovered(false)
- { setAcceptsHoverEvents(true); }
+ { setAcceptHoverEvents(true); }
bool isHovered;
@@ -227,8 +227,10 @@ private slots:
void render_data();
void render();
void renderItemsWithNegativeWidthOrHeight();
+#ifndef QT_NO_CONTEXTMENU
void contextMenuEvent();
void contextMenuEvent_ItemIgnoresTransformations();
+#endif
void update();
void update2();
void views();
@@ -301,11 +303,16 @@ void tst_QGraphicsScene::construction()
QVERIFY(scene.items(QPainterPath()).isEmpty());
QTest::ignoreMessage(QtWarningMsg, "QGraphicsScene::collidingItems: cannot find collisions for null item");
QVERIFY(scene.collidingItems(0).isEmpty());
- QVERIFY(!scene.itemAt(QPointF()));
+ QVERIFY(scene.items(QPointF()).isEmpty());
QVERIFY(scene.selectedItems().isEmpty());
QVERIFY(!scene.focusItem());
}
+static inline const QGraphicsItem *itemAt(const QGraphicsScene &scene, qreal x, qreal y)
+{
+ return scene.items(QPointF(x, y)).value(0, Q_NULLPTR);
+}
+
void tst_QGraphicsScene::sceneRect()
{
QGraphicsScene scene;
@@ -318,8 +325,8 @@ void tst_QGraphicsScene::sceneRect()
item->setPos(-5, -5);
QCOMPARE(sceneRectChanged.count(), 0);
- QCOMPARE(scene.itemAt(0, 0), item);
- QCOMPARE(scene.itemAt(10, 10), (QGraphicsItem *)0);
+ QCOMPARE(itemAt(scene, 0, 0), item);
+ QVERIFY(scene.items(QPointF(10, 10)).isEmpty());
QCOMPARE(sceneRectChanged.count(), 0);
QCOMPARE(scene.sceneRect(), QRectF(-5, -5, 10, 10));
QCOMPARE(sceneRectChanged.count(), 1);
@@ -334,8 +341,8 @@ void tst_QGraphicsScene::sceneRect()
QCOMPARE(sceneRectChanged.count(), 3);
QCOMPARE(sceneRectChanged.last().at(0).toRectF(), scene.sceneRect());
- QCOMPARE(scene.itemAt(0, 0), item);
- QCOMPARE(scene.itemAt(10, 10), (QGraphicsItem *)0);
+ QCOMPARE(itemAt(scene, 0, 0), item);
+ QVERIFY(scene.items(QPointF(10, 10)).isEmpty());
QCOMPARE(scene.sceneRect(), QRectF(-100, -100, 10, 10));
item->setPos(10, 10);
QCOMPARE(scene.sceneRect(), QRectF(-100, -100, 10, 10));
@@ -344,8 +351,8 @@ void tst_QGraphicsScene::sceneRect()
scene.setSceneRect(QRectF());
- QCOMPARE(scene.itemAt(10, 10), item);
- QCOMPARE(scene.itemAt(20, 20), (QGraphicsItem *)0);
+ QCOMPARE(itemAt(scene, 10, 10), item);
+ QVERIFY(scene.items(QPointF(20, 20)).isEmpty());
QCOMPARE(sceneRectChanged.count(), 4);
QCOMPARE(scene.sceneRect(), QRectF(-5, -5, 25, 25));
QCOMPARE(sceneRectChanged.count(), 5);
@@ -374,7 +381,7 @@ void tst_QGraphicsScene::itemIndexMethod()
for (int x = minX; x < maxX; x += 100) {
QGraphicsItem *item = scene.addRect(QRectF(0, 0, 10, 10));
item->setPos(x, y);
- QCOMPARE(scene.itemAt(x, y), item);
+ QCOMPARE(itemAt(scene, x, y), item);
items << item;
}
}
@@ -382,7 +389,7 @@ void tst_QGraphicsScene::itemIndexMethod()
int n = 0;
for (int y = minY; y < maxY; y += 100) {
for (int x = minX; x < maxX; x += 100)
- QCOMPARE(scene.itemAt(x, y), items.at(n++));
+ QCOMPARE(itemAt(scene, x, y), items.at(n++));
}
scene.setItemIndexMethod(QGraphicsScene::NoIndex);
@@ -391,7 +398,7 @@ void tst_QGraphicsScene::itemIndexMethod()
n = 0;
for (int y = minY; y < maxY; y += 100) {
for (int x = minX; x < maxX; x += 100)
- QCOMPARE(scene.itemAt(x, y), items.at(n++));
+ QCOMPARE(itemAt(scene, x, y), items.at(n++));
}
scene.setItemIndexMethod(QGraphicsScene::BspTreeIndex);
@@ -400,7 +407,7 @@ void tst_QGraphicsScene::itemIndexMethod()
n = 0;
for (int y = minY; y < maxY; y += 100) {
for (int x = minX; x < maxX; x += 100)
- QCOMPARE(scene.itemAt(x, y), items.at(n++));
+ QCOMPARE(itemAt(scene, x, y), items.at(n++));
}
}
@@ -439,7 +446,7 @@ void tst_QGraphicsScene::items()
items << scene.addRect(QRectF(0, 0, 10, 10));
}
QCOMPARE(scene.items().size(), items.size());
- scene.itemAt(0, 0); // trigger indexing
+ itemAt(scene, 0, 0); // trigger indexing
scene.removeItem(items.at(5));
delete items.at(5);
@@ -458,8 +465,8 @@ void tst_QGraphicsScene::items()
QList<QGraphicsItem *> items;
items<<l1<<l2;
QCOMPARE(scene.items().size(), items.size());
- QVERIFY(scene.items(-1, -1, 2, 2).contains(l1));
- QVERIFY(scene.items(-1, -1, 2, 2).contains(l2));
+ QVERIFY(scene.items(QRectF(-1, -1, 2, 2)).contains(l1));
+ QVERIFY(scene.items(QRectF(-1, -1, 2, 2)).contains(l2));
}
}
@@ -722,7 +729,7 @@ void tst_QGraphicsScene::items_QRectF_2()
QGraphicsItem *item = scene.addEllipse(ellipseRect);
QCOMPARE(!scene.items(sceneRect, selectionMode).isEmpty(), contained);
- item->rotate(45);
+ item->setTransform(QTransform().rotate(45), true);
QCOMPARE(!scene.items(sceneRect, selectionMode).isEmpty(), containedRotated);
}
@@ -1085,19 +1092,19 @@ void tst_QGraphicsScene::addItem()
QTRY_VERIFY(view.repaints > 0);
view.repaints = 0;
- QCOMPARE(scene.itemAt(0, 0), path);
+ QCOMPARE(itemAt(scene, 0, 0), path);
QGraphicsItem *path2 = new QGraphicsEllipseItem(QRectF(-10, -10, 20, 20));
path2->setPos(100, 100);
- QCOMPARE(scene.itemAt(0, 0), path);
- QCOMPARE(scene.itemAt(100, 100), (QGraphicsItem *)0);
+ QCOMPARE(itemAt(scene, 0, 0), path);
+ QVERIFY(scene.items(QPointF(100, 100)).isEmpty());
scene.addItem(path2);
// Adding an item should always issue a repaint.
QTRY_VERIFY(view.repaints > 0);
- QCOMPARE(scene.itemAt(100, 100), path2);
+ QCOMPARE(itemAt(scene, 100, 100), path2);
}
{
// 2) Create scene, then item, then add item
@@ -1109,8 +1116,8 @@ void tst_QGraphicsScene::addItem()
path2->setPos(100, 100);
scene.addItem(path2);
- QCOMPARE(scene.itemAt(0, 0), path);
- QCOMPARE(scene.itemAt(100, 100), path2);
+ QCOMPARE(itemAt(scene, 0, 0), path);
+ QCOMPARE(itemAt(scene, 100, 100), path2);
}
}
@@ -1123,15 +1130,15 @@ void tst_QGraphicsScene::addEllipse()
QCOMPARE(ellipse->pen(), QPen(Qt::red));
QCOMPARE(ellipse->brush(), QBrush(Qt::blue));
QCOMPARE(ellipse->rect(), QRectF(-10, -10, 20, 20));
- QCOMPARE(scene.itemAt(0, 0), (QGraphicsItem *)ellipse);
- QCOMPARE(scene.itemAt(-10, -10), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(-9.9, 0), (QGraphicsItem *)ellipse);
- QCOMPARE(scene.itemAt(-10, 10), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(0, -9.9), (QGraphicsItem *)ellipse);
- QCOMPARE(scene.itemAt(0, 9.9), (QGraphicsItem *)ellipse);
- QCOMPARE(scene.itemAt(10, -10), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(9.9, 0), (QGraphicsItem *)ellipse);
- QCOMPARE(scene.itemAt(10, 10), (QGraphicsItem *)0);
+ QCOMPARE(itemAt(scene, 0, 0), (QGraphicsItem *)ellipse);
+ QVERIFY(scene.items(QPointF(-10, -10)).isEmpty());
+ QCOMPARE(itemAt(scene, -9.9, 0), (QGraphicsItem *)ellipse);
+ QVERIFY(scene.items(QPointF(-10, 10)).isEmpty());
+ QCOMPARE(itemAt(scene, 0, -9.9), (QGraphicsItem *)ellipse);
+ QCOMPARE(itemAt(scene, 0, 9.9), (QGraphicsItem *)ellipse);
+ QVERIFY(scene.items(QPointF(10, -10)).isEmpty());
+ QCOMPARE(itemAt(scene, 9.9, 0), (QGraphicsItem *)ellipse);
+ QVERIFY(scene.items(QPointF(10, 10)).isEmpty());
}
void tst_QGraphicsScene::addLine()
@@ -1144,15 +1151,15 @@ void tst_QGraphicsScene::addLine()
QCOMPARE(line->pos(), QPointF());
QCOMPARE(line->pen(), pen);
QCOMPARE(line->line(), QLineF(-10, -10, 20, 20));
- QCOMPARE(scene.itemAt(0, 0), (QGraphicsItem *)line);
- QCOMPARE(scene.itemAt(-10, -10), (QGraphicsItem *)line);
- QCOMPARE(scene.itemAt(-9.9, 0), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(-10, 10), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(0, -9.9), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(0, 9.9), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(10, -10), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(9.9, 0), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(10, 10), (QGraphicsItem *)line);
+ QCOMPARE(itemAt(scene, 0, 0), (QGraphicsItem *)line);
+ QCOMPARE(itemAt(scene, -10, -10), (QGraphicsItem *)line);
+ QVERIFY(scene.items(QPointF(-9.9, 0)).isEmpty());
+ QVERIFY(scene.items(QPointF(-10, 10)).isEmpty());
+ QVERIFY(scene.items(QPointF(0, -9.9)).isEmpty());
+ QVERIFY(scene.items(QPointF(0, 9.9)).isEmpty());
+ QVERIFY(scene.items(QPointF(10, -10)).isEmpty());
+ QVERIFY(scene.items(QPointF(9.9, 0)).isEmpty());
+ QCOMPARE(itemAt(scene, 10, 10), (QGraphicsItem *)line);
}
void tst_QGraphicsScene::addPath()
@@ -1170,27 +1177,27 @@ void tst_QGraphicsScene::addPath()
path->setPen(QPen(Qt::red, 0));
- QCOMPARE(scene.itemAt(0, 0), (QGraphicsItem *)path);
- QCOMPARE(scene.itemAt(-9.9, 0), (QGraphicsItem *)path);
- QCOMPARE(scene.itemAt(9.9, 0), (QGraphicsItem *)path);
- QCOMPARE(scene.itemAt(0, -9.9), (QGraphicsItem *)path);
- QCOMPARE(scene.itemAt(0, 9.9), (QGraphicsItem *)path);
- QCOMPARE(scene.itemAt(0, 30), (QGraphicsItem *)path);
- QCOMPARE(scene.itemAt(-9.9, 30), (QGraphicsItem *)path);
- QCOMPARE(scene.itemAt(9.9, 30), (QGraphicsItem *)path);
- QCOMPARE(scene.itemAt(0, 20.1), (QGraphicsItem *)path);
- QCOMPARE(scene.itemAt(0, 39.9), (QGraphicsItem *)path);
- QCOMPARE(scene.itemAt(-10, -10), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(10, -10), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(-10, 10), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(10, 10), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(-10, 20), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(10, 20), (QGraphicsItem *)0);
+ QCOMPARE(itemAt(scene, 0, 0), (QGraphicsItem *)path);
+ QCOMPARE(itemAt(scene, -9.9, 0), (QGraphicsItem *)path);
+ QCOMPARE(itemAt(scene, 9.9, 0), (QGraphicsItem *)path);
+ QCOMPARE(itemAt(scene, 0, -9.9), (QGraphicsItem *)path);
+ QCOMPARE(itemAt(scene, 0, 9.9), (QGraphicsItem *)path);
+ QCOMPARE(itemAt(scene, 0, 30), (QGraphicsItem *)path);
+ QCOMPARE(itemAt(scene, -9.9, 30), (QGraphicsItem *)path);
+ QCOMPARE(itemAt(scene, 9.9, 30), (QGraphicsItem *)path);
+ QCOMPARE(itemAt(scene, 0, 20.1), (QGraphicsItem *)path);
+ QCOMPARE(itemAt(scene, 0, 39.9), (QGraphicsItem *)path);
+ QVERIFY(scene.items(QPointF(-10, -10)).isEmpty());
+ QVERIFY(scene.items(QPointF(10, -10)).isEmpty());
+ QVERIFY(scene.items(QPointF(-10, 10)).isEmpty());
+ QVERIFY(scene.items(QPointF(10, 10)).isEmpty());
+ QVERIFY(scene.items(QPointF(-10, 20)).isEmpty());
+ QVERIFY(scene.items(QPointF(10, 20)).isEmpty());
if (sizeof(qreal) != sizeof(double))
QWARN("Skipping test because of rounding errors when qreal != double");
else
- QCOMPARE(scene.itemAt(-10, 30), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(10.1, 30), (QGraphicsItem *)0);
+ QVERIFY(scene.items(QPointF(-10, 30)).isEmpty());
+ QVERIFY(scene.items(QPointF(10.1, 30)).isEmpty());
}
void tst_QGraphicsScene::addPixmap()
@@ -1201,16 +1208,17 @@ void tst_QGraphicsScene::addPixmap()
QCOMPARE(pixmap->pos(), QPointF());
QCOMPARE(pixmap->pixmap(), pix);
- QCOMPARE(scene.itemAt(0, 0), (QGraphicsItem *)pixmap);
- QCOMPARE(scene.itemAt(pix.width() - 1, 0), (QGraphicsItem *)pixmap);
- QCOMPARE(scene.itemAt(0, pix.height() - 1), (QGraphicsItem *)pixmap);
- QCOMPARE(scene.itemAt(pix.width() - 1, pix.height() - 1), (QGraphicsItem *)pixmap);
- QCOMPARE(scene.itemAt(-1, -1), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(pix.width() - 1, -1), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(-1, pix.height() - 1), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(pix.width(), pix.height()), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(0, pix.height()), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(pix.width(), 0), (QGraphicsItem *)0);
+ QCOMPARE(itemAt(scene, 0, 0), (QGraphicsItem *)pixmap);
+ QCOMPARE(itemAt(scene, pix.width() - 1, 0), (QGraphicsItem *)pixmap);
+ QCOMPARE(itemAt(scene, 0, pix.height() - 1), (QGraphicsItem *)pixmap);
+ QCOMPARE(itemAt(scene, pix.width() - 1, pix.height() - 1), (QGraphicsItem *)pixmap);
+
+ QVERIFY(scene.items(QPointF(-1, -1)).isEmpty());
+ QVERIFY(scene.items(QPointF(pix.width() - 1, -1)).isEmpty());
+ QVERIFY(scene.items(QPointF(-1, pix.height() - 1)).isEmpty());
+ QVERIFY(scene.items(QPointF(pix.width(), pix.height())).isEmpty());
+ QVERIFY(scene.items(QPointF(0, pix.height())).isEmpty());
+ QVERIFY(scene.items(QPointF(pix.width(), 0)).isEmpty());
}
void tst_QGraphicsScene::addRect()
@@ -1225,15 +1233,15 @@ void tst_QGraphicsScene::addRect()
rect->setPen(QPen(Qt::red, 0));
- QCOMPARE(scene.itemAt(0, 0), (QGraphicsItem *)rect);
- QCOMPARE(scene.itemAt(-10, -10), (QGraphicsItem *)rect);
- QCOMPARE(scene.itemAt(-9.9, 0), (QGraphicsItem *)rect);
- QCOMPARE(scene.itemAt(-10, 10), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(0, -9.9), (QGraphicsItem *)rect);
- QCOMPARE(scene.itemAt(0, 9.9), (QGraphicsItem *)rect);
- QCOMPARE(scene.itemAt(10, -10), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(9.9, 0), (QGraphicsItem *)rect);
- QCOMPARE(scene.itemAt(10, 10), (QGraphicsItem *)0);
+ QCOMPARE(itemAt(scene, 0, 0), (QGraphicsItem *)rect);
+ QCOMPARE(itemAt(scene, -10, -10), (QGraphicsItem *)rect);
+ QCOMPARE(itemAt(scene, -9.9, 0), (QGraphicsItem *)rect);
+ QVERIFY(scene.items(QPointF(-10, 10)).isEmpty());
+ QCOMPARE(itemAt(scene, 0, -9.9), (QGraphicsItem *)rect);
+ QCOMPARE(itemAt(scene, 0, 9.9), (QGraphicsItem *)rect);
+ QVERIFY(scene.items(QPointF(10, -10)).isEmpty());
+ QCOMPARE(itemAt(scene, 9.9, 0), (QGraphicsItem *)rect);
+ QVERIFY(scene.items(QPointF(10, 10)).isEmpty());
}
void tst_QGraphicsScene::addText()
@@ -1252,14 +1260,14 @@ void tst_QGraphicsScene::removeItem()
#endif
QGraphicsScene scene;
QGraphicsItem *item = scene.addRect(QRectF(0, 0, 10, 10));
- QCOMPARE(scene.itemAt(0, 0), item); // forces indexing
+ QCOMPARE(itemAt(scene, 0, 0), item); // forces indexing
scene.removeItem(item);
- QCOMPARE(scene.itemAt(0, 0), (QGraphicsItem *)0);
+ QVERIFY(scene.items(QPointF(0, 0)).isEmpty());
delete item;
QGraphicsItem *item2 = scene.addRect(QRectF(0, 0, 10, 10));
item2->setFlag(QGraphicsItem::ItemIsSelectable);
- QCOMPARE(scene.itemAt(0, 0), item2);
+ QCOMPARE(itemAt(scene, 0, 0), item2);
// Removing a selected item
QVERIFY(scene.selectedItems().isEmpty());
@@ -1289,7 +1297,7 @@ void tst_QGraphicsScene::removeItem()
QTRY_VERIFY(hoverItem->isHovered);
scene.removeItem(hoverItem);
- hoverItem->setAcceptsHoverEvents(false);
+ hoverItem->setAcceptHoverEvents(false);
scene.addItem(hoverItem);
QTRY_VERIFY(!hoverItem->isHovered);
}
@@ -1801,7 +1809,7 @@ void tst_QGraphicsScene::createItemGroup()
scene.destroyItemGroup(group);
QGraphicsItemGroup *emptyGroup = scene.createItemGroup(QList<QGraphicsItem *>());
- QCOMPARE(emptyGroup->children(), QList<QGraphicsItem *>());
+ QVERIFY(emptyGroup->childItems().isEmpty());
QVERIFY(!emptyGroup->parentItem());
QCOMPARE(emptyGroup->scene(), &scene);
}
@@ -2140,7 +2148,7 @@ void tst_QGraphicsScene::mouseEventPropagation_mouseMove()
{
Scene scene;
scene.addRect(QRectF(5, 0, 12, 12));
- scene.addRect(QRectF(15, 0, 12, 12))->setAcceptsHoverEvents(true);
+ scene.addRect(QRectF(15, 0, 12, 12))->setAcceptHoverEvents(true);
for (int i = 0; i < 30; ++i) {
QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMouseMove);
event.setScenePos(QPointF(i, 5));
@@ -2622,7 +2630,8 @@ void tst_QGraphicsScene::render()
painter.end();
const QString renderPath = QLatin1String(SRCDIR) + "/testData/render";
- QString fileName = renderPath + QString("/%1.png").arg(QTest::currentDataTag());
+ QString fileName = renderPath + QLatin1Char('/') + QLatin1String(QTest::currentDataTag())
+ + QLatin1String(".png");
QImage original(fileName);
QVERIFY(!original.isNull());
@@ -2706,6 +2715,7 @@ void tst_QGraphicsScene::renderItemsWithNegativeWidthOrHeight()
QCOMPARE(actual, expected);
}
+#ifndef QT_NO_CONTEXTMENU
void tst_QGraphicsScene::contextMenuEvent()
{
QGraphicsScene scene;
@@ -2788,6 +2798,7 @@ void tst_QGraphicsScene::contextMenuEvent_ItemIgnoresTransformations()
QVERIFY(!event.isAccepted());
}
}
+#endif // QT_NO_CONTEXTMENU
void tst_QGraphicsScene::update()
{
@@ -2800,7 +2811,7 @@ void tst_QGraphicsScene::update()
rect->setPos(-100, -100);
// This function forces indexing
- scene.itemAt(0, 0);
+ itemAt(scene, 0, 0);
qRegisterMetaType<QList<QRectF> >("QList<QRectF>");
QSignalSpy spy(&scene, SIGNAL(changed(QList<QRectF>)));
@@ -2809,7 +2820,7 @@ void tst_QGraphicsScene::update()
scene.update();
// This function forces a purge, which will post an update signal
- scene.itemAt(0, 0);
+ itemAt(scene, 0, 0);
// This will process the pending update
QApplication::instance()->processEvents();
@@ -3257,10 +3268,11 @@ void tst_QGraphicsScene::tabFocus_sceneWithNestedFocusWidgets()
FocusWidget *widget1_1 = new FocusWidget;
FocusWidget *widget1_2 = new FocusWidget;
widget1_1->setParentItem(widget1);
- widget1_1->scale(0.5, 0.5);
+ const QTransform scale(QTransform::fromScale(0.5, 0.5));
+ widget1_1->setTransform(scale, true);
widget1_1->setPos(0, widget1->boundingRect().height() / 2);
widget1_2->setParentItem(widget1);
- widget1_2->scale(0.5, 0.5);
+ widget1_2->setTransform(scale, true);
widget1_2->setPos(widget1->boundingRect().width() / 2, widget1->boundingRect().height() / 2);
FocusWidget *widget2 = new FocusWidget;
@@ -3520,7 +3532,7 @@ void tst_QGraphicsScene::task250680_childClip()
QVERIFY(QPathCompare::comparePaths(rect->clipPath().simplified(), path));
QCOMPARE(scene.items(QRectF(320, 240, 5, 5)).size(), 2);
- rect->rotate(45);
+ rect->setTransform(QTransform().rotate(45), true);
QCOMPARE(scene.items(QRectF(320, 240, 5, 5)).size(), 2);
}
@@ -3599,20 +3611,20 @@ void tst_QGraphicsScene::sorting()
// view.show();
qDebug() << "items: {";
- foreach (QGraphicsItem *item, scene.items(32, 31, 4, 55))
+ foreach (QGraphicsItem *item, scene.items(QRectF(32, 31, 4, 55)))
qDebug() << "\t" << item->data(0).toString();
qDebug() << "}";
- QCOMPARE(scene.items(32, 31, 4, 55),
+ QCOMPARE(scene.items(QRectF(32, 31, 4, 55)),
QList<QGraphicsItem *>()
<< c_1_2 << c_1_1_1 << c_1 << t_1);
- QCOMPARE(scene.items(-53, 47, 136, 3),
+ QCOMPARE(scene.items(QRectF(-53, 47, 136, 3)),
QList<QGraphicsItem *>()
<< c_2_2 << c_2_1 << c_2 << c_1_2 << c_1_1 << c_1 << t_1);
- QCOMPARE(scene.items(-23, 79, 104, 3),
+ QCOMPARE(scene.items(QRectF(-23, 79, 104, 3)),
QList<QGraphicsItem *>()
<< c_2_1_1 << c_1_1_1);
- QCOMPARE(scene.items(-26, -3, 92, 79),
+ QCOMPARE(scene.items(QRectF(-26, -3, 92, 79)),
QList<QGraphicsItem *>()
<< c_2_2 << c_2_1_1 << c_2_1 << c_2
<< c_1_2 << c_1_1_1 << c_1_1 << c_1
@@ -4376,7 +4388,7 @@ void tst_QGraphicsScene::taskQT657_paintIntoCacheWithTransparentParts()
QGraphicsProxyWidget *proxy = scene->addWidget(w);
proxy->setCacheMode(QGraphicsItem::DeviceCoordinateCache);
- proxy->rotate(15);
+ proxy->setTransform(QTransform().rotate(15), true);
view->show();
QVERIFY(QTest::qWaitForWindowExposed(view));
@@ -4422,7 +4434,7 @@ void tst_QGraphicsScene::taskQTBUG_7863_paintIntoCacheWithTransparentParts()
scene->addItem(backItem);
rectItem->setCacheMode(QGraphicsItem::DeviceCoordinateCache);
- backItem->rotate(15);
+ backItem->setTransform(QTransform().rotate(15), true);
view->show();
QVERIFY(QTest::qWaitForWindowExposed(view));
@@ -4464,7 +4476,7 @@ void tst_QGraphicsScene::taskQTBUG_7863_paintIntoCacheWithTransparentParts()
scene->addItem(rectItem);
rectItem->setCacheMode(QGraphicsItem::ItemCoordinateCache);
- rectItem->rotate(15);
+ rectItem->setTransform(QTransform().rotate(15), true);
view->show();
QVERIFY(QTest::qWaitForWindowExposed(view));
@@ -4505,7 +4517,7 @@ void tst_QGraphicsScene::taskQTBUG_7863_paintIntoCacheWithTransparentParts()
scene->addItem(rectItem);
rectItem->setCacheMode(QGraphicsItem::ItemCoordinateCache);
- rectItem->rotate(15);
+ rectItem->setTransform(QTransform().rotate(15), true);
view->show();
QVERIFY(QTest::qWaitForWindowExposed(view));
@@ -4609,41 +4621,41 @@ void tst_QGraphicsScene::focusItemChangedSignal()
QCOMPARE(spy.count(), 1);
QList<QVariant> arguments = spy.takeFirst();
QCOMPARE(arguments.size(), 3);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)topLevelItem2);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)0);
- QCOMPARE(qVariantValue<Qt::FocusReason>(arguments.at(2)), Qt::OtherFocusReason);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)topLevelItem2);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)0);
+ QCOMPARE(qvariant_cast<Qt::FocusReason>(arguments.at(2)), Qt::OtherFocusReason);
QVERIFY(topLevelItem2->hasFocus());
scene.clearFocus();
QCOMPARE(spy.count(), 1);
arguments = spy.takeFirst();
QCOMPARE(arguments.size(), 3);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)0);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)topLevelItem2);
- QCOMPARE(qVariantValue<Qt::FocusReason>(arguments.at(2)), Qt::OtherFocusReason);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)0);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)topLevelItem2);
+ QCOMPARE(qvariant_cast<Qt::FocusReason>(arguments.at(2)), Qt::OtherFocusReason);
scene.setFocus(Qt::MenuBarFocusReason);
QCOMPARE(spy.count(), 1);
arguments = spy.takeFirst();
QCOMPARE(arguments.size(), 3);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)topLevelItem2);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)0);
- QCOMPARE(qVariantValue<Qt::FocusReason>(arguments.at(2)), Qt::MenuBarFocusReason);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)topLevelItem2);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)0);
+ QCOMPARE(qvariant_cast<Qt::FocusReason>(arguments.at(2)), Qt::MenuBarFocusReason);
for (int i = 0; i < 3; ++i) {
topLevelItem1->setFocus(Qt::TabFocusReason);
arguments = spy.takeFirst();
QCOMPARE(arguments.size(), 3);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)topLevelItem1);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)topLevelItem2);
- QCOMPARE(qVariantValue<Qt::FocusReason>(arguments.at(2)), Qt::TabFocusReason);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)topLevelItem1);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)topLevelItem2);
+ QCOMPARE(qvariant_cast<Qt::FocusReason>(arguments.at(2)), Qt::TabFocusReason);
topLevelItem2->setFocus(Qt::TabFocusReason);
arguments = spy.takeFirst();
QCOMPARE(arguments.size(), 3);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)topLevelItem2);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)topLevelItem1);
- QCOMPARE(qVariantValue<Qt::FocusReason>(arguments.at(2)), Qt::TabFocusReason);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)topLevelItem2);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)topLevelItem1);
+ QCOMPARE(qvariant_cast<Qt::FocusReason>(arguments.at(2)), Qt::TabFocusReason);
}
// The following two are unexpected, but fixing this (i.e., losing and gaining focus
@@ -4664,9 +4676,9 @@ void tst_QGraphicsScene::focusItemChangedSignal()
QCOMPARE(spy.count(), 1);
arguments = spy.takeFirst();
QCOMPARE(arguments.size(), 3);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)panel1);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)topLevelItem2);
- QCOMPARE(qVariantValue<Qt::FocusReason>(arguments.at(2)), Qt::ActiveWindowFocusReason);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)panel1);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)topLevelItem2);
+ QCOMPARE(qvariant_cast<Qt::FocusReason>(arguments.at(2)), Qt::ActiveWindowFocusReason);
QGraphicsRectItem *panel2 = new QGraphicsRectItem;
panel2->setFlags(QGraphicsItem::ItemIsPanel | QGraphicsItem::ItemIsFocusable);
@@ -4678,17 +4690,17 @@ void tst_QGraphicsScene::focusItemChangedSignal()
QCOMPARE(spy.count(), 1);
arguments = spy.takeFirst();
QCOMPARE(arguments.size(), 3);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)panel2);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)panel1);
- QCOMPARE(qVariantValue<Qt::FocusReason>(arguments.at(2)), Qt::ActiveWindowFocusReason);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)panel2);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)panel1);
+ QCOMPARE(qvariant_cast<Qt::FocusReason>(arguments.at(2)), Qt::ActiveWindowFocusReason);
scene.setActivePanel(panel1);
QCOMPARE(spy.count(), 1);
arguments = spy.takeFirst();
QCOMPARE(arguments.size(), 3);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)panel1);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)panel2);
- QCOMPARE(qVariantValue<Qt::FocusReason>(arguments.at(2)), Qt::ActiveWindowFocusReason);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)panel1);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)panel2);
+ QCOMPARE(qvariant_cast<Qt::FocusReason>(arguments.at(2)), Qt::ActiveWindowFocusReason);
}
}
diff --git a/tests/auto/widgets/graphicsview/qgraphicssceneindex/qgraphicssceneindex.pro b/tests/auto/widgets/graphicsview/qgraphicssceneindex/qgraphicssceneindex.pro
index 3d0d73566e..3b74ab0c75 100644
--- a/tests/auto/widgets/graphicsview/qgraphicssceneindex/qgraphicssceneindex.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicssceneindex/qgraphicssceneindex.pro
@@ -4,4 +4,3 @@ requires(contains(QT_CONFIG,private_tests))
QT += widgets widgets-private testlib
QT += core-private gui-private
SOURCES += tst_qgraphicssceneindex.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/widgets/graphicsview/qgraphicssceneindex/tst_qgraphicssceneindex.cpp b/tests/auto/widgets/graphicsview/qgraphicssceneindex/tst_qgraphicssceneindex.cpp
index b2d6eef9b1..88c081bcfb 100644
--- a/tests/auto/widgets/graphicsview/qgraphicssceneindex/tst_qgraphicssceneindex.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicssceneindex/tst_qgraphicssceneindex.cpp
@@ -327,7 +327,7 @@ void tst_QGraphicsSceneIndex::removeItems()
delete widgetChild1;
//We move the parent
- scene.items(295, 295, 50, 50);
+ scene.items(QRectF(295, 295, 50, 50));
//This should not crash
}
diff --git a/tests/auto/widgets/graphicsview/qgraphicstransform/qgraphicstransform.pro b/tests/auto/widgets/graphicsview/qgraphicstransform/qgraphicstransform.pro
index a46c803e41..68ee58d0d7 100644
--- a/tests/auto/widgets/graphicsview/qgraphicstransform/qgraphicstransform.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicstransform/qgraphicstransform.pro
@@ -2,5 +2,3 @@ CONFIG += testcase
TARGET = tst_qgraphicstransform
QT += widgets testlib
SOURCES += tst_qgraphicstransform.cpp
-CONFIG += parallel_test
-
diff --git a/tests/auto/widgets/graphicsview/qgraphicstransform/tst_qgraphicstransform.cpp b/tests/auto/widgets/graphicsview/qgraphicstransform/tst_qgraphicstransform.cpp
index cf1edae9ff..ade69c4685 100644
--- a/tests/auto/widgets/graphicsview/qgraphicstransform/tst_qgraphicstransform.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicstransform/tst_qgraphicstransform.cpp
@@ -39,12 +39,6 @@
class tst_QGraphicsTransform : public QObject {
Q_OBJECT
-public slots:
- void initTestCase();
- void cleanupTestCase();
- void init();
- void cleanup();
-
private slots:
void scale();
void rotation();
@@ -57,29 +51,6 @@ private:
QString toString(QTransform const&);
};
-
-// This will be called before the first test function is executed.
-// It is only called once.
-void tst_QGraphicsTransform::initTestCase()
-{
-}
-
-// This will be called after the last test function is executed.
-// It is only called once.
-void tst_QGraphicsTransform::cleanupTestCase()
-{
-}
-
-// This will be called before each test function is executed.
-void tst_QGraphicsTransform::init()
-{
-}
-
-// This will be called after every test function.
-void tst_QGraphicsTransform::cleanup()
-{
-}
-
static QTransform transform2D(const QGraphicsTransform& t)
{
QMatrix4x4 m;
diff --git a/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro b/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro
index d1f9bede0b..258b5e0e14 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro
@@ -9,4 +9,3 @@ SOURCES += tst_qgraphicsview.cpp tst_qgraphicsview_2.cpp
HEADERS += tst_qgraphicsview.h
DEFINES += QT_NO_CAST_TO_ASCII
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
index 98473fb5cc..9f70736436 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
@@ -275,9 +275,6 @@ public slots:
void dummySlot() {}
private:
-#if defined Q_OS_BLACKBERRY
- QScopedPointer<QWidget> rootWindow;
-#endif
QString platformName;
};
@@ -286,13 +283,6 @@ void tst_QGraphicsView::initTestCase()
#ifdef Q_OS_WINCE_WM
qApp->setAutoMaximizeThreshold(-1);
#endif
-
-#if defined Q_OS_BLACKBERRY
- // On BlackBerry first window is always shown full screen. However, many tests rely on specific
- // window sizes. Create a dummy full screen window, so subsequent windows have correct size.
- rootWindow.reset(new QWidget);
- rootWindow->show();
-#endif
}
void tst_QGraphicsView::cleanup()
@@ -468,10 +458,12 @@ void tst_QGraphicsView::interactive()
QCOMPARE(item->events.size(), i * 5 + 5);
QCOMPARE(item->events.at(item->events.size() - 2), QEvent::GraphicsSceneMouseRelease);
QCOMPARE(item->events.at(item->events.size() - 1), QEvent::UngrabMouse);
+#ifndef QT_NO_CONTEXTMENU
QContextMenuEvent contextEvent(QContextMenuEvent::Mouse, itemPoint, view.mapToGlobal(itemPoint));
QApplication::sendEvent(view.viewport(), &contextEvent);
QCOMPARE(item->events.size(), i * 5 + 6);
QCOMPARE(item->events.last(), QEvent::GraphicsSceneContextMenu);
+#endif // QT_NO_CONTEXTMENU
}
view.setInteractive(false);
@@ -483,10 +475,12 @@ void tst_QGraphicsView::interactive()
sendMouseRelease(view.viewport(), itemPoint);
QCOMPARE(item->events.size(), 501);
QCOMPARE(item->events.last(), QEvent::GraphicsSceneContextMenu);
+#ifndef QT_NO_CONTEXTMENU
QContextMenuEvent contextEvent(QContextMenuEvent::Mouse, itemPoint, view.mapToGlobal(itemPoint));
QApplication::sendEvent(view.viewport(), &contextEvent);
QCOMPARE(item->events.size(), 501);
QCOMPARE(item->events.last(), QEvent::GraphicsSceneContextMenu);
+#endif // QT_NO_CONTEXTMENU
}
}
@@ -583,7 +577,7 @@ void tst_QGraphicsView::sceneRect_growing()
QGraphicsScene scene;
for (int i = 0; i < 100; ++i)
- scene.addText(QString("(0, %1)").arg((i - 50) * 20))->setPos(0, (i - 50) * 20);
+ scene.addText(QLatin1String("(0, ") + QString::number((i - 50) * 20))->setPos(0, (i - 50) * 20);
QGraphicsView view(&scene, &toplevel);
view.setFixedSize(200, 200);
@@ -1391,8 +1385,8 @@ void tst_QGraphicsView::fitInView()
items[2]->setPos(-100, 100);
items[3]->setPos(100, 100);
- items[0]->rotate(30);
- items[1]->rotate(-30);
+ items[0]->setTransform(QTransform().rotate(30), true);
+ items[1]->setTransform(QTransform().rotate(-30), true);
#if defined(Q_OS_WINCE)
//Is the standard scrollbar size
@@ -2888,9 +2882,6 @@ void tst_QGraphicsView::scrollBarRanges()
QFETCH(ExpectedValueDescription, vmax);
QFETCH(bool, useStyledPanel);
- if (style == QLatin1String("GTK+") && useStyledPanel)
- QSKIP("GTK + style test skipped, see QTBUG-29002");
-
if (useStyledPanel && style == QStringLiteral("Macintosh") && platformName == QStringLiteral("cocoa"))
QSKIP("Insignificant on OSX");
QGraphicsScene scene;
@@ -3506,7 +3497,7 @@ void tst_QGraphicsView::embeddedViews()
SpyItem *item = new SpyItem;
v2->scene()->addItem(item);
- proxy->translate(5, 5);
+ proxy->setTransform(QTransform::fromTranslate(5, 5), true);
QImage actual(64, 64, QImage::Format_ARGB32_Premultiplied);
actual.fill(0);
diff --git a/tests/auto/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro b/tests/auto/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro
index 481bc96d96..042c42f63f 100644
--- a/tests/auto/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro
@@ -6,4 +6,3 @@ QT += core-private gui-private
SOURCES += tst_qgraphicswidget.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp b/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp
index ec2203e615..fe7e3bf59e 100644
--- a/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp
@@ -77,12 +77,6 @@ protected:
class tst_QGraphicsWidget : public QObject {
Q_OBJECT
-public slots:
- void initTestCase();
- void cleanupTestCase();
- void init();
- void cleanup();
-
private slots:
void qgraphicswidget();
@@ -262,28 +256,6 @@ protected:
}
};
-// This will be called before the first test function is executed.
-// It is only called once.
-void tst_QGraphicsWidget::initTestCase()
-{
-}
-
-// This will be called after the last test function is executed.
-// It is only called once.
-void tst_QGraphicsWidget::cleanupTestCase()
-{
-}
-
-// This will be called before each test function is executed.
-void tst_QGraphicsWidget::init()
-{
-}
-
-// This will be called after every test function.
-void tst_QGraphicsWidget::cleanup()
-{
-}
-
class SizeHinter : public QGraphicsWidget
{
public:
@@ -588,7 +560,7 @@ void tst_QGraphicsWidget::focusPolicy_data()
QTest::addColumn<Qt::FocusPolicy>("focusPolicy2");
for (int i = 0; i < 25; ++i) {
- QTestData &data = QTest::newRow(QString("%1").arg(i).toLatin1());
+ QTestData &data = QTest::newRow(QByteArray::number(i).constData());
switch(i % 5) {
case 0: data << Qt::TabFocus; break;
case 1: data << Qt::ClickFocus; break;
@@ -1108,7 +1080,7 @@ void tst_QGraphicsWidget::initStyleOption()
view.setAlignment(Qt::AlignTop | Qt::AlignLeft);
SubQGraphicsWidget *widget = new SubQGraphicsWidget;
- widget->setAcceptsHoverEvents(true);
+ widget->setAcceptHoverEvents(true);
QStyleOption option;
scene.addItem(widget);
@@ -1499,7 +1471,7 @@ void tst_QGraphicsWidget::setTabOrderAndReparent()
for (i = 1; i < 4; ++i) {
QGraphicsWidget *wid = new QGraphicsWidget;
wid->setFocusPolicy(Qt::StrongFocus);
- wid->setData(0, QString::fromLatin1("w%1").arg(i));
+ wid->setData(0, QLatin1Char('w') + QString::number(i));
scene.addItem(wid);
if (i == 1)
w1 = wid;
@@ -1539,7 +1511,7 @@ void tst_QGraphicsWidget::setTabOrderAndReparent()
for (i = 1; i < 5; ++i) {
QGraphicsWidget *wid = new QGraphicsWidget;
wid->setFocusPolicy(Qt::StrongFocus);
- wid->setData(0, QString::fromLatin1("w%1").arg(i));
+ wid->setData(0, QLatin1Char('w') + QString::number(i));
scene.addItem(wid);
if (i == 1)
w1 = wid;
@@ -2090,12 +2062,12 @@ void tst_QGraphicsWidget::task236127_bspTreeIndexFails()
view.show();
QVERIFY(QTest::qWaitForWindowExposed(&view));
- QTRY_VERIFY(!scene.itemAt(25, 25));
+ QTRY_VERIFY(scene.items(QPointF(25, 25)).isEmpty());
widget->setGeometry(0, 112, 360, 528);
- QTRY_COMPARE(scene.itemAt(15, 120), (QGraphicsItem *)widget);
+ QTRY_COMPARE(scene.items(QPointF(15, 120)).value(0, Q_NULLPTR), (QGraphicsItem *)widget);
widget2->setGeometry(0, 573, 360, 67);
- QTRY_COMPARE(scene.itemAt(15, 120), (QGraphicsItem *)widget);
- QTRY_COMPARE(scene.itemAt(50, 585), (QGraphicsItem *)widget2);
+ QTRY_COMPARE(scene.items(QPointF(15, 120)).value(0, Q_NULLPTR), (QGraphicsItem *)widget);
+ QTRY_COMPARE(scene.items(QPointF(50, 585)).value(0, Q_NULLPTR), (QGraphicsItem *)widget2);
}
void tst_QGraphicsWidget::defaultSize()
diff --git a/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp b/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp
index 3a17f7c690..fa184b1ba5 100644
--- a/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp
+++ b/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp
@@ -872,7 +872,7 @@ class DnDTestModel : public QStandardItemModel
public:
DnDTestModel() : QStandardItemModel(20, 20), dropAction_result(Qt::IgnoreAction) {
for (int i = 0; i < rowCount(); ++i)
- setData(index(i, 0), QString("%1").arg(i));
+ setData(index(i, 0), QString::number(i));
}
Qt::DropAction dropAction() const { return dropAction_result; }
};
@@ -1277,9 +1277,9 @@ void tst_QAbstractItemView::task250754_fontChange()
QStandardItemModel *m = new QStandardItemModel(this);
for (int i=0; i<20; ++i) {
- QStandardItem *item = new QStandardItem(QString("Item number %1").arg(i));
+ QStandardItem *item = new QStandardItem(QStringLiteral("Item number ") + QString::number(i));
for (int j=0; j<5; ++j) {
- QStandardItem *child = new QStandardItem(QString("Child Item number %1").arg(j));
+ QStandardItem *child = new QStandardItem(QStringLiteral("Child Item number ") + QString::number(j));
item->setChild(j, 0, child);
}
m->setItem(i, 0, item);
@@ -1369,7 +1369,7 @@ void tst_QAbstractItemView::shiftArrowSelectionAfterScrolling()
{
QStandardItemModel model;
for (int i=0; i<10; ++i) {
- QStandardItem *item = new QStandardItem(QString("%1").arg(i));
+ QStandardItem *item = new QStandardItem(QString::number(i));
model.setItem(i, 0, item);
}
@@ -1406,7 +1406,7 @@ void tst_QAbstractItemView::shiftSelectionAfterRubberbandSelection()
{
QStandardItemModel model;
for (int i=0; i<3; ++i) {
- QStandardItem *item = new QStandardItem(QString("%1").arg(i));
+ QStandardItem *item = new QStandardItem(QString::number(i));
model.setItem(i, 0, item);
}
@@ -1483,7 +1483,7 @@ void tst_QAbstractItemView::ctrlRubberbandSelection()
{
QStandardItemModel model;
for (int i=0; i<3; ++i) {
- QStandardItem *item = new QStandardItem(QString("%1").arg(i));
+ QStandardItem *item = new QStandardItem(QString::number(i));
model.setItem(i, 0, item);
}
@@ -1609,11 +1609,6 @@ void tst_QAbstractItemView::testDelegateDestroyEditor()
void tst_QAbstractItemView::testClickedSignal()
{
-#if defined Q_OS_BLACKBERRY
- QWidget rootWindow;
- rootWindow.show();
- QTest::qWaitForWindowExposed(&rootWindow);
-#endif
QTableWidget view(5, 5);
centerOnScreen(&view);
diff --git a/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp b/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp
index 6645da727c..0a80450766 100644
--- a/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp
+++ b/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp
@@ -51,14 +51,10 @@ class tst_QColumnView : public QObject {
public:
tst_QColumnView();
- virtual ~tst_QColumnView();
-public Q_SLOTS:
+private slots:
void initTestCase();
void init();
- void cleanup();
-
-private slots:
void rootIndex();
void grips();
void isIndexHidden();
@@ -112,12 +108,14 @@ public:
for (int j = 0; j < 10; ++j) {
QStandardItem *parentItem = invisibleRootItem();
for (int i = 0; i < 10; ++i) {
- QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
+ const QString iS = QString::number(i);
+ const QString itemText = QLatin1String("item ") + iS;
+ QStandardItem *item = new QStandardItem(itemText);
parentItem->appendRow(item);
- QStandardItem *item2 = new QStandardItem(QString("item %0").arg(i));
+ QStandardItem *item2 = new QStandardItem(itemText);
parentItem->appendRow(item2);
- item2->appendRow(new QStandardItem(QString("item %0").arg(i)));
- parentItem->appendRow(new QStandardItem(QString("file %0").arg(i)));
+ item2->appendRow(new QStandardItem(itemText));
+ parentItem->appendRow(new QStandardItem(QLatin1String("file ") + iS));
parentItem = item;
}
}
@@ -181,10 +179,6 @@ tst_QColumnView::tst_QColumnView()
m_fakeDirHomeIndex = m_fakeDirModel.indexFromItem(homeItem);
}
-tst_QColumnView::~tst_QColumnView()
-{
-}
-
void tst_QColumnView::initTestCase()
{
QVERIFY(m_fakeDirHomeIndex.isValid());
@@ -199,10 +193,6 @@ void tst_QColumnView::init()
#endif
}
-void tst_QColumnView::cleanup()
-{
-}
-
void tst_QColumnView::rootIndex()
{
ColumnView view;
diff --git a/tests/auto/widgets/itemviews/qdatawidgetmapper/qdatawidgetmapper.pro b/tests/auto/widgets/itemviews/qdatawidgetmapper/qdatawidgetmapper.pro
index 3f4cb491f4..53b23b5ef2 100644
--- a/tests/auto/widgets/itemviews/qdatawidgetmapper/qdatawidgetmapper.pro
+++ b/tests/auto/widgets/itemviews/qdatawidgetmapper/qdatawidgetmapper.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qdatawidgetmapper
QT += widgets testlib
SOURCES += tst_qdatawidgetmapper.cpp
diff --git a/tests/auto/widgets/itemviews/qdatawidgetmapper/tst_qdatawidgetmapper.cpp b/tests/auto/widgets/itemviews/qdatawidgetmapper/tst_qdatawidgetmapper.cpp
index 8b80d52a5f..5b7a2a46ad 100644
--- a/tests/auto/widgets/itemviews/qdatawidgetmapper/tst_qdatawidgetmapper.cpp
+++ b/tests/auto/widgets/itemviews/qdatawidgetmapper/tst_qdatawidgetmapper.cpp
@@ -66,8 +66,10 @@ static QStandardItemModel *testModel(QObject *parent = 0)
QStandardItemModel *model = new QStandardItemModel(10, 10, parent);
for (int row = 0; row < 10; ++row) {
+ const QString prefix = QLatin1String("item ") + QString::number(row)
+ + QLatin1Char(' ');
for (int col = 0; col < 10; ++col)
- model->setData(model->index(row, col), QString("item %1 %2").arg(row).arg(col));
+ model->setData(model->index(row, col), prefix + QString::number(col));
}
return model;
diff --git a/tests/auto/widgets/itemviews/qdirmodel/tst_qdirmodel.cpp b/tests/auto/widgets/itemviews/qdirmodel/tst_qdirmodel.cpp
index f12876f745..63cf7b2751 100644
--- a/tests/auto/widgets/itemviews/qdirmodel/tst_qdirmodel.cpp
+++ b/tests/auto/widgets/itemviews/qdirmodel/tst_qdirmodel.cpp
@@ -416,14 +416,14 @@ void tst_QDirModel::rowsAboutToBeRemoved_data()
bool tst_QDirModel::rowsAboutToBeRemoved_init(const QString &test_path, const QStringList &initial_files)
{
- QString path = QDir::currentPath() + "/" + test_path;
+ QString path = QDir::currentPath() + QLatin1Char('/') + test_path;
if (!QDir::current().mkdir(test_path) && false) { // FIXME
qDebug() << "failed to create dir" << path;
return false;
}
for (int i = 0; i < initial_files.count(); ++i) {
- QFile file(path + "/" + initial_files.at(i));
+ QFile file(path + QLatin1Char('/') + initial_files.at(i));
if (!file.open(QIODevice::WriteOnly)) {
qDebug() << "failed to open file" << initial_files.at(i);
return false;
@@ -443,7 +443,7 @@ bool tst_QDirModel::rowsAboutToBeRemoved_init(const QString &test_path, const QS
bool tst_QDirModel::rowsAboutToBeRemoved_cleanup(const QString &test_path)
{
- QString path = QDir::currentPath() + "/" + test_path;
+ QString path = QDir::currentPath() + QLatin1Char('/') + test_path;
QDir dir(path, "*", QDir::SortFlags(QDir::Name|QDir::IgnoreCase), QDir::Files);
QStringList files = dir.entryList();
@@ -584,8 +584,8 @@ void tst_QDirModel::filePath()
QString path = SRCDIR;
#else
QString path = QFileInfo(SRCDIR).absoluteFilePath();
- if (!path.endsWith("/"))
- path += "/";
+ if (!path.endsWith(QLatin1Char('/')))
+ path += QLatin1Char('/');
#endif
QCOMPARE(model.filePath(index), path + QString( "test.lnk"));
model.setResolveSymlinks(true);
diff --git a/tests/auto/widgets/itemviews/qfileiconprovider/qfileiconprovider.pro b/tests/auto/widgets/itemviews/qfileiconprovider/qfileiconprovider.pro
index 0c3a780405..37173a175e 100644
--- a/tests/auto/widgets/itemviews/qfileiconprovider/qfileiconprovider.pro
+++ b/tests/auto/widgets/itemviews/qfileiconprovider/qfileiconprovider.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qfileiconprovider
QT += widgets testlib
SOURCES += tst_qfileiconprovider.cpp
diff --git a/tests/auto/widgets/itemviews/qfileiconprovider/tst_qfileiconprovider.cpp b/tests/auto/widgets/itemviews/qfileiconprovider/tst_qfileiconprovider.cpp
index fba83a24c7..11463dd79d 100644
--- a/tests/auto/widgets/itemviews/qfileiconprovider/tst_qfileiconprovider.cpp
+++ b/tests/auto/widgets/itemviews/qfileiconprovider/tst_qfileiconprovider.cpp
@@ -40,12 +40,6 @@ class tst_QFileIconProvider : public QObject
{
Q_OBJECT
-public slots:
- void initTestCase();
- void cleanupTestCase();
- void init();
- void cleanup();
-
private slots:
void qfileiconprovider_data();
void qfileiconprovider();
@@ -69,29 +63,6 @@ public:
};
-// This will be called before the first test function is executed.
-// It is only called once.
-void tst_QFileIconProvider::initTestCase()
-{
-}
-
-// This will be called after the last test function is executed.
-// It is only called once.
-void tst_QFileIconProvider::cleanupTestCase()
-{
-}
-
-// This will be called before each test function is executed.
-void tst_QFileIconProvider::init()
-{
-}
-
-// This will be called after every test function.
-void tst_QFileIconProvider::cleanup()
-{
-}
-
-
void tst_QFileIconProvider::qfileiconprovider_data()
{
}
diff --git a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp
index 55fcf04846..bdb12c52f0 100644
--- a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp
+++ b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp
@@ -106,15 +106,12 @@ class tst_QHeaderView : public QObject
public:
tst_QHeaderView();
- virtual ~tst_QHeaderView();
-public slots:
+private slots:
void initTestCase();
void cleanupTestCase();
void init();
void cleanup();
-
-private slots:
void getSetCheck();
void visualIndex();
@@ -272,7 +269,8 @@ public:
wrongIndex = true;
qWarning("Invalid modelIndex [%d,%d,%p]", idx.row(), idx.column(), idx.internalPointer());
}
- return QString("[%1,%2,%3]").arg(idx.row()).arg(idx.column()).arg(0);//idx.data());
+ return QLatin1Char('[') + QString::number(idx.row()) + QLatin1Char(',')
+ + QString::number(idx.column()) + QLatin1String(",0]");
}
void insertOneColumn(int col)
@@ -382,10 +380,6 @@ tst_QHeaderView::tst_QHeaderView()
qRegisterMetaType<int>("Qt::SortOrder");
}
-tst_QHeaderView::~tst_QHeaderView()
-{
-}
-
void tst_QHeaderView::initTestCase()
{
#ifdef Q_OS_WINCE //disable magic for WindowsCE
@@ -1569,7 +1563,7 @@ public:
return QVariant();
}
if (role == Qt::DisplayRole) {
- return QString::fromLatin1("%1,%2").arg(index.row()).arg(index.column());
+ return QString::number(index.row()) + QLatin1Char(',') + QString::number(index.column());
}
return QVariant();
}
@@ -2242,13 +2236,21 @@ void tst_QHeaderView::QTBUG8650_crashOnInsertSections()
model.insertColumn(0, items);
}
+static void setModelTexts(QStandardItemModel *model)
+{
+ const int columnCount = model->columnCount();
+ for (int i = 0, rowCount = model->rowCount(); i < rowCount; ++i) {
+ const QString prefix = QLatin1String("item [") + QString::number(i) + QLatin1Char(',');
+ for (int j = 0; j < columnCount; ++j)
+ model->setData(model->index(i, j), prefix + QString::number(j) + QLatin1Char(']'));
+ }
+}
+
void tst_QHeaderView::QTBUG12268_hiddenMovedSectionSorting()
{
QTableView view; // ### this test fails on QTableView &view = *m_tableview; !? + shadowing view member
QStandardItemModel *model = new QStandardItemModel(4,3, &view);
- for (int i = 0; i< model->rowCount(); ++i)
- for (int j = 0; j< model->columnCount(); ++j)
- model->setData(model->index(i,j), QString("item [%1,%2]").arg(i).arg(j));
+ setModelTexts(model);
view.setModel(model);
view.horizontalHeader()->setSectionsMovable(true);
view.setSortingEnabled(true);
@@ -2324,9 +2326,7 @@ void tst_QHeaderView::initialSortOrderRole()
{
QTableView view; // ### Shadowing member view (of type QHeaderView)
QStandardItemModel *model = new QStandardItemModel(4, 3, &view);
- for (int i = 0; i< model->rowCount(); ++i)
- for (int j = 0; j< model->columnCount(); ++j)
- model->setData(model->index(i,j), QString("item [%1,%2]").arg(i).arg(j));
+ setModelTexts(model);
QStandardItem *ascendingItem = new QStandardItem();
QStandardItem *descendingItem = new QStandardItem();
ascendingItem->setData(Qt::AscendingOrder, Qt::InitialSortOrderRole);
@@ -2494,7 +2494,7 @@ void tst_QHeaderView::calculateAndCheck(int cppline, const int precalced_compare
QString msg = "semantic problem at " + QString(__FILE__) + " (" + sline + ")";
msg += "\nThe *expected* result was : {" + istr(x[0]) + istr(x[1]) + istr(x[2]) + istr(x[3])
- + istr(x[4]) + istr(x[5]) + istr(x[6], false) + "}";
+ + istr(x[4]) + istr(x[5]) + istr(x[6], false) + QLatin1Char('}');
msg += "\nThe calculated result was : {";
msg += istr(chk_visual) + istr(chk_logical) + istr(chk_sizes) + istr(chk_hidden_size)
+ istr(chk_lookup_visual) + istr(chk_lookup_logical) + istr(header_lenght, false) + "};";
@@ -2572,7 +2572,7 @@ void tst_QHeaderView::additionalInit()
for (int i = 0; i < model->rowCount(); ++i) {
model->setData(model->index(i, 0), QVariant(i));
s.setNum(i);
- s += ".";
+ s += QLatin1Char('.');
s += 'a' + (i % 25);
model->setData(model->index(i, 1), QVariant(s));
}
diff --git a/tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp b/tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp
index 25f27cb0c7..91f72cbe85 100644
--- a/tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp
+++ b/tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp
@@ -189,15 +189,7 @@ class tst_QItemDelegate : public QObject
{
Q_OBJECT
-public:
- tst_QItemDelegate();
- virtual ~tst_QItemDelegate();
-
private slots:
- void initTestCase();
- void cleanupTestCase();
- void init();
- void cleanup();
void getSetCheck();
void textRectangle_data();
void textRectangle();
@@ -255,30 +247,6 @@ void tst_QItemDelegate::getSetCheck()
QCOMPARE(obj1.hasClipping(), true);
}
-tst_QItemDelegate::tst_QItemDelegate()
-{
-}
-
-tst_QItemDelegate::~tst_QItemDelegate()
-{
-}
-
-void tst_QItemDelegate::initTestCase()
-{
-}
-
-void tst_QItemDelegate::cleanupTestCase()
-{
-}
-
-void tst_QItemDelegate::init()
-{
-}
-
-void tst_QItemDelegate::cleanup()
-{
-}
-
void tst_QItemDelegate::textRectangle_data()
{
QFont font;
diff --git a/tests/auto/widgets/itemviews/qitemeditorfactory/qitemeditorfactory.pro b/tests/auto/widgets/itemviews/qitemeditorfactory/qitemeditorfactory.pro
index 55df1d83f1..5ff7771585 100644
--- a/tests/auto/widgets/itemviews/qitemeditorfactory/qitemeditorfactory.pro
+++ b/tests/auto/widgets/itemviews/qitemeditorfactory/qitemeditorfactory.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qitemeditorfactory
QT += widgets testlib
SOURCES += tst_qitemeditorfactory.cpp
diff --git a/tests/auto/widgets/itemviews/qitemview/qitemview.pro b/tests/auto/widgets/itemviews/qitemview/qitemview.pro
index 6e1697f790..079953d60d 100644
--- a/tests/auto/widgets/itemviews/qitemview/qitemview.pro
+++ b/tests/auto/widgets/itemviews/qitemview/qitemview.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qitemview
QT += widgets testlib
SOURCES += tst_qitemview.cpp
diff --git a/tests/auto/widgets/itemviews/qitemview/tst_qitemview.cpp b/tests/auto/widgets/itemviews/qitemview/tst_qitemview.cpp
index 8fd86ea467..401ad1346e 100644
--- a/tests/auto/widgets/itemviews/qitemview/tst_qitemview.cpp
+++ b/tests/auto/widgets/itemviews/qitemview/tst_qitemview.cpp
@@ -90,15 +90,10 @@ class tst_QItemView : public QObject
{
Q_OBJECT
-public:
- tst_QItemView() {};
- virtual ~tst_QItemView() {};
-
-public slots:
+private slots:
void init();
void cleanup();
-private slots:
void nonDestructiveBasicTest_data();
void nonDestructiveBasicTest();
@@ -288,14 +283,16 @@ void tst_QItemView::populate()
const int baseInsert = 26;
#endif
for (int i = 0; i < 40; ++i) {
+ const QString iS = QString::number(i);
parent = treeModel->index(0, 0, parent);
treeModel->insertRows(0, baseInsert + i, parent);
treeModel->insertColumns(0, baseInsert + i, parent);
// Fill in some values to make it easier to debug
for (int x = 0; x < treeModel->rowCount(); ++x) {
+ const QString xS = QString::number(x);
for (int y = 0; y < treeModel->columnCount(); ++y) {
QModelIndex index = treeModel->index(x, y, parent);
- treeModel->setData(index, QString("%1_%2_%3").arg(x).arg(y).arg(i));
+ treeModel->setData(index, xS + QLatin1Char('_') + QString::number(y) + QLatin1Char('_') + iS);
treeModel->setData(index, QVariant(QColor(Qt::blue)), Qt::TextColorRole);
}
}
diff --git a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
index 5b206af357..eb4dc94a05 100644
--- a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
+++ b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
@@ -74,21 +74,22 @@ static inline void setFrameless(QWidget *w)
w->setWindowFlags(flags);
}
+static QStringList generateList(const QString &prefix, int size)
+{
+ QStringList result;
+ result.reserve(size);
+ for (int i = 0; i < size; ++i)
+ result.append(prefix + QString::number(i));
+ return result;
+}
+
class tst_QListView : public QObject
{
Q_OBJECT
-public:
- tst_QListView();
- virtual ~tst_QListView();
-
-
-public slots:
+private slots:
void initTestCase();
- void cleanupTestCase();
- void init();
void cleanup();
-private slots:
void getSetCheck();
void noDelegate();
void noModel();
@@ -152,6 +153,7 @@ private slots:
void taskQTBUG_39902_mutualScrollBars_data();
void taskQTBUG_39902_mutualScrollBars();
void horizontalScrollingByVerticalWheelEvents();
+ void taskQTBUG_7232_AllowUserToControlSingleStep();
};
// Testing get/set functions
@@ -255,7 +257,7 @@ public:
wrongIndex = true;
qWarning("got invalid modelIndex %d/%d", idx.row(), idx.column());
}
- return QString("%1/%2").arg(idx.row()).arg(idx.column());
+ return QString::number(idx.row()) + QLatin1Char('/') + QString::number(idx.column());
}
void removeLastRow()
@@ -282,24 +284,8 @@ public:
mutable bool wrongIndex;
};
-tst_QListView::tst_QListView()
-{
-}
-
-tst_QListView::~tst_QListView()
-{
-}
-
void tst_QListView::initTestCase()
{
-}
-
-void tst_QListView::cleanupTestCase()
-{
-}
-
-void tst_QListView::init()
-{
#ifdef Q_OS_WINCE //disable magic for WindowsCE
qApp->setAutoMaximizeThreshold(-1);
#endif
@@ -310,7 +296,6 @@ void tst_QListView::cleanup()
QVERIFY(QApplication::topLevelWidgets().isEmpty());
}
-
void tst_QListView::noDelegate()
{
QtTestModel model(0);
@@ -364,10 +349,11 @@ void tst_QListView::cursorMove()
view.setModel(&model);
for (int j = 0; j < columns; ++j) {
+ const QString postfix = QLatin1Char(',') + QString::number(j) + QLatin1Char(']');
view.setModelColumn(j);
for (int i = 0; i < rows; ++i) {
QModelIndex index = model.index(i, j);
- model.setData(index, QString("[%1,%2]").arg(i).arg(j));
+ model.setData(index, QLatin1Char('[') + QString::number(i) + postfix);
view.setCurrentIndex(index);
QApplication::processEvents();
QCOMPARE(view.currentIndex(), index);
@@ -468,7 +454,7 @@ void tst_QListView::hideRows()
QStandardItemModel sim(0);
QStandardItem *root = new QStandardItem("Root row");
for (int i=0;i<5;i++)
- root->appendRow(new QStandardItem(QString("Row %1").arg(i)));
+ root->appendRow(new QStandardItem(QLatin1String("Row ") + QString::number(i)));
sim.appendRow(root);
view.setModel(&sim);
view.setRootIndex(root->index());
@@ -702,9 +688,11 @@ void tst_QListView::singleSelectionRemoveColumn()
int numCols = 3;
int numRows = 3;
QStandardItemModel model(numCols, numRows);
- for (int r = 0; r < numRows; ++r)
+ for (int r = 0; r < numRows; ++r) {
+ const QString prefix = QString::number(r) + QLatin1Char(',');
for (int c = 0; c < numCols; ++c)
- model.setData(model.index(r, c), QString("%1,%2").arg(r).arg(c));
+ model.setData(model.index(r, c), prefix + QString::number(c));
+ }
QListView view;
view.setModel(&model);
@@ -729,10 +717,11 @@ void tst_QListView::modelColumn()
int numCols = 3;
int numRows = 3;
QStandardItemModel model(numCols, numRows);
- for (int r = 0; r < numRows; ++r)
+ for (int r = 0; r < numRows; ++r) {
+ const QString prefix = QString::number(r) + QLatin1Char(',');
for (int c = 0; c < numCols; ++c)
- model.setData(model.index(r, c), QString("%1,%2").arg(r).arg(c));
-
+ model.setData(model.index(r, c), prefix + QString::number(c));
+ }
QListView view;
view.setModel(&model);
@@ -811,10 +800,7 @@ void tst_QListView::batchedMode()
{
const int rowCount = 3;
- QStringList items;
- for (int i = 0; i < rowCount; ++i)
- items << QLatin1String("item ") + QString::number(i);
- QStringListModel model(items);
+ QStringListModel model(generateList(QLatin1String("item "), rowCount));
QListView view;
view.setWindowTitle(QTest::currentTestFunction());
@@ -840,11 +826,7 @@ void tst_QListView::batchedMode()
void tst_QListView::setCurrentIndex()
{
- QStringList items;
- int i;
- for (i=0; i <20; ++i)
- items << QString("item %1").arg(i);
- QStringListModel model(items);
+ QStringListModel model(generateList(QLatin1String("item "), 20));
QListView view;
view.setModel(&model);
@@ -866,7 +848,7 @@ void tst_QListView::setCurrentIndex()
int offset = sb->value();
// first "scroll" down, verify that we scroll one step at a time
- i = 0;
+ int i = 0;
for (i = 0; i < 20; ++i) {
QModelIndex idx = model.index(i,0);
view.setCurrentIndex(idx);
@@ -1289,7 +1271,7 @@ void tst_QListView::scrollBarRanges()
QStringListModel model(&lv);
QStringList list;
for (int i = 0; i < rowCount; ++i)
- list << QString::fromLatin1("Item %1").arg(i);
+ list << QLatin1String("Item ") + QString::number(i);
model.setStringList(list);
lv.setModel(&model);
@@ -1387,17 +1369,13 @@ void tst_QListView::scrollBarAsNeeded()
QStringList list;
int i;
for (i = 0; i < rowCounts[r]; ++i)
- list << QString::fromLatin1("Item %1").arg(i);
+ list << QLatin1String("Item ") + QString::number(i);
model.setStringList(list);
QApplication::processEvents();
QTest::qWait(50);
- QStringList replacement;
- for (i = 0; i < itemCount; ++i) {
- replacement << QString::fromLatin1("Item %1").arg(i);
- }
- model.setStringList(replacement);
+ model.setStringList(generateList(QLatin1String("Item "), itemCount));
QApplication::processEvents();
@@ -1410,10 +1388,9 @@ void tst_QListView::moveItems()
{
QStandardItemModel model;
for (int r = 0; r < 4; ++r) {
- for (int c = 0; c < 4; ++c) {
- QStandardItem* item = new QStandardItem(QString("standard item (%1,%2)").arg(r).arg(c));
- model.setItem(r, c, item);
- }
+ const QString prefix = QLatin1String("standard item (") + QString::number(r) + QLatin1Char(',');
+ for (int c = 0; c < 4; ++c)
+ model.setItem(r, c, new QStandardItem(prefix + QString::number(c) + QLatin1Char(')')));
}
PublicListView view;
@@ -1455,15 +1432,6 @@ void tst_QListView::wordWrap()
lv.setModel(&model);
lv.setWordWrap(true);
lv.setFixedSize(400, 150);
-
-#if defined Q_OS_BLACKBERRY
- QFont font = lv.font();
- // On BB10 the root window is stretched over the whole screen
- // This makes sure that the text will be long enough to produce
- // a vertical scrollbar
- font.setPixelSize(50);
- lv.setFont(font);
-#endif
lv.showNormal();
QApplication::processEvents();
@@ -1525,9 +1493,10 @@ void tst_QListView::emptyItemSize()
{
QStandardItemModel model;
for (int r = 0; r < 4; ++r) {
- QStandardItem* item = new QStandardItem(QString("standard item (%1)").arg(r));
- model.setItem(r, 0, item);
+ const QString text = QLatin1String("standard item (") + QString::number(r) + QLatin1Char(')');
+ model.setItem(r, new QStandardItem(text));
}
+
model.setItem(4, 0, new QStandardItem());
PublicListView view;
@@ -1994,12 +1963,7 @@ public:
void tst_QListView::taskQTBUG_9455_wrongScrollbarRanges()
{
- QStringList list;
- const int nrItems = 8;
- for (int i = 0; i < nrItems; i++)
- list << QString::asprintf("item %d", i);
-
- QStringListModel model(list);
+ QStringListModel model(generateList("item ", 8));
ListView_9455 w;
setFrameless(&w);
w.setModel(&model);
@@ -2083,7 +2047,7 @@ void tst_QListView::taskQTBUG_12308_wrongFlowLayout()
QListWidgetItem *item = new QListWidgetItem();
item->setText(QString("Item %L1").arg(i));
lw.addItem(item);
- if (!item->text().contains(QString::fromLatin1("1")))
+ if (!item->text().contains(QLatin1Char('1')))
item->setHidden(true);
}
lw.show();
@@ -2099,12 +2063,6 @@ void tst_QListView::taskQTBUG_21115_scrollToAndHiddenItems_data()
void tst_QListView::taskQTBUG_21115_scrollToAndHiddenItems()
{
-#if defined Q_OS_BLACKBERRY
- // On BB10 we need to create a root window which is automatically stretched
- // over the whole screen
- QWindow rootWindow;
- rootWindow.show();
-#endif
QFETCH(int, flow);
QListView lv;
@@ -2173,9 +2131,9 @@ void tst_QListView::draggablePaintPairs()
view.scrollTo(expectedIndex);
QItemViewPaintPairs pairs = privateClass->draggablePaintPairs(indexList, &rect);
QCOMPARE(indexList.size(), pairs.size());
- foreach (const QItemViewPaintPair pair, pairs) {
- QCOMPARE(rect, pair.first);
- QCOMPARE(expectedIndex, pair.second);
+ foreach (const QItemViewPaintPair &pair, pairs) {
+ QCOMPARE(rect, pair.rect);
+ QCOMPARE(expectedIndex, pair.index);
}
}
@@ -2297,12 +2255,6 @@ void tst_QListView::spacing()
void tst_QListView::testScrollToWithHidden()
{
-#if defined Q_OS_BLACKBERRY
- // On BB10 we need to create a root window which is automatically stretched
- // over the whole screen
- QWindow rootWindow;
- rootWindow.show();
-#endif
QListView lv;
QStringListModel model;
@@ -2493,5 +2445,43 @@ void tst_QListView::horizontalScrollingByVerticalWheelEvents()
QVERIFY(lv.verticalScrollBar()->value() > vValue);
}
+void tst_QListView::taskQTBUG_7232_AllowUserToControlSingleStep()
+{
+ // When we set the scrollMode to ScrollPerPixel it will adjust the scrollbars singleStep automatically
+ // Setting a singlestep on a scrollbar should however imply that the user takes control.
+ // Setting a singlestep to -1 return to an automatic control of the singleStep.
+ QListView lv;
+ lv.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
+ lv.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
+
+ QStandardItemModel model(1000, 100);
+ QString str = QString::fromLatin1("This is a long string made to ensure that we get some horizontal scroll (and we want scroll)");
+ model.setData(model.index(0, 0), str);
+ lv.setModel(&model);
+ lv.setGeometry(150, 150, 150, 150);
+ lv.show();
+ lv.setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
+ lv.setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
+ QVERIFY(QTest::qWaitForWindowExposed(&lv));
+
+ int vStep1 = lv.verticalScrollBar()->singleStep();
+ int hStep1 = lv.horizontalScrollBar()->singleStep();
+ QVERIFY(lv.verticalScrollBar()->singleStep() > 1);
+ QVERIFY(lv.horizontalScrollBar()->singleStep() > 1);
+
+ lv.verticalScrollBar()->setSingleStep(1);
+ lv.setGeometry(200, 200, 200, 200);
+ QCOMPARE(lv.verticalScrollBar()->singleStep(), 1);
+
+ lv.horizontalScrollBar()->setSingleStep(1);
+ lv.setGeometry(150, 150, 150, 150);
+ QCOMPARE(lv.horizontalScrollBar()->singleStep(), 1);
+
+ lv.verticalScrollBar()->setSingleStep(-1);
+ lv.horizontalScrollBar()->setSingleStep(-1);
+ QCOMPARE(vStep1, lv.verticalScrollBar()->singleStep());
+ QCOMPARE(hStep1, lv.horizontalScrollBar()->singleStep());
+}
+
QTEST_MAIN(tst_QListView)
#include "tst_qlistview.moc"
diff --git a/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp b/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp
index ecf72613da..443fa34659 100644
--- a/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp
+++ b/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp
@@ -46,7 +46,6 @@ class tst_QListWidget : public QObject
public:
tst_QListWidget();
- ~tst_QListWidget();
enum ModelChanged {
RowsAboutToBeInserted,
@@ -59,13 +58,10 @@ public:
ColumnsRemoved
};
-public slots:
+private slots:
void initTestCase();
void cleanupTestCase();
void init();
- void cleanup();
-
-private slots:
void addItem();
void addItem2();
void addItems();
@@ -162,10 +158,6 @@ tst_QListWidget::tst_QListWidget(): testWidget(0), rcParent(8), rcFirst(8,0), rc
{
}
-tst_QListWidget::~tst_QListWidget()
-{
-}
-
void tst_QListWidget::initTestCase()
{
testWidget = new QListWidget();
@@ -210,10 +202,6 @@ void tst_QListWidget::checkDefaultValues()
QCOMPARE(testWidget->count(), 0);
}
-void tst_QListWidget::cleanup()
-{
-}
-
void tst_QListWidget::populate()
{
addItem();
@@ -230,7 +218,7 @@ void tst_QListWidget::populate()
void tst_QListWidget::addItem()
{
int count = testWidget->count();
- QString label = QString("%1").arg(count);
+ const QString label = QString::number(count);
testWidget->addItem(label);
QCOMPARE(testWidget->count(), ++count);
QCOMPARE(testWidget->item(testWidget->count()-1)->text(), label);
@@ -244,7 +232,7 @@ void tst_QListWidget::addItem2()
testWidget->addItem(0);
QCOMPARE(testWidget->count(), count);
- QListWidgetItem *item = new QListWidgetItem(QString("%1").arg(count));
+ QListWidgetItem *item = new QListWidgetItem(QString::number(count));
item->setFlags(item->flags() | Qt::ItemIsEditable);
testWidget->addItem(item);
QCOMPARE(testWidget->count(), ++count);
@@ -261,10 +249,10 @@ void tst_QListWidget::addItems()
QCOMPARE(testWidget->count(), count);
QStringList stringList;
- QString label = QString("%1").arg(count);
- stringList << QString("%1").arg(testWidget->count() + 1)
- << QString("%1").arg(testWidget->count() + 2)
- << QString("%1").arg(testWidget->count() + 3)
+ QString label = QString::number(count);
+ stringList << QString::number(testWidget->count() + 1)
+ << QString::number(testWidget->count() + 2)
+ << QString::number(testWidget->count() + 3)
<< label;
testWidget->addItems(stringList);
QCOMPARE(testWidget->count(), count + stringList.count());
@@ -276,7 +264,7 @@ void tst_QListWidget::openPersistentEditor()
{
// Boundary checking
testWidget->openPersistentEditor(0);
- QListWidgetItem *item = new QListWidgetItem(QString("%1").arg(testWidget->count()));
+ QListWidgetItem *item = new QListWidgetItem(QString::number(testWidget->count()));
testWidget->openPersistentEditor(item);
int childCount = testWidget->viewport()->children().count();
@@ -290,7 +278,7 @@ void tst_QListWidget::closePersistentEditor()
// Boundary checking
int childCount = testWidget->viewport()->children().count();
testWidget->closePersistentEditor(0);
- QListWidgetItem *item = new QListWidgetItem(QString("%1").arg(testWidget->count()));
+ QListWidgetItem *item = new QListWidgetItem(QString::number(testWidget->count()));
testWidget->closePersistentEditor(item);
QCOMPARE(childCount, testWidget->viewport()->children().count());
@@ -316,7 +304,7 @@ void tst_QListWidget::setItemHidden()
if (testWidget->isItemHidden(testWidget->item(i)))
totalHidden++;
- QListWidgetItem *item = new QListWidgetItem(QString("%1").arg(testWidget->count()));
+ QListWidgetItem *item = new QListWidgetItem(QString::number(testWidget->count()));
testWidget->addItem(item);
// Check that nothing else changed
@@ -362,7 +350,7 @@ void tst_QListWidget::setCurrentItem()
{
QFETCH(int, fill);
for (int i = 0; i < fill; ++i)
- testWidget->addItem(QString("%1").arg(i));
+ testWidget->addItem(QString::number(i));
// Boundary checking
testWidget->setCurrentItem((QListWidgetItem *)0);
@@ -394,7 +382,7 @@ void tst_QListWidget::setCurrentRow()
{
QFETCH(int, fill);
for (int i = 0; i < fill; ++i)
- testWidget->addItem(QString("%1").arg(i));
+ testWidget->addItem(QString::number(i));
// Boundary checking
testWidget->setCurrentRow(-1);
@@ -455,7 +443,7 @@ void tst_QListWidget::editItem()
{
// Boundary checking
testWidget->editItem(0);
- QListWidgetItem *item = new QListWidgetItem(QString("%1").arg(testWidget->count()));
+ QListWidgetItem *item = new QListWidgetItem(QString::number(testWidget->count()));
testWidget->editItem(item);
QFETCH(bool, editable);
@@ -650,7 +638,7 @@ void tst_QListWidget::item()
QCOMPARE(item, static_cast<QListWidgetItem*>(0));
QCOMPARE(testWidget->count(), 3);
} else {
- QCOMPARE(item->text(), QString("item%1").arg(row));
+ QCOMPARE(item->text(), QStringLiteral("item") + QString::number(row));
QCOMPARE(testWidget->count(), 3);
}
}
@@ -683,7 +671,7 @@ void tst_QListWidget::takeItem()
QCOMPARE(item, static_cast<QListWidgetItem*>(0));
QCOMPARE(testWidget->count(), 3);
} else {
- QCOMPARE(item->text(), QString("item%1").arg(row));
+ QCOMPARE(item->text(), QStringLiteral("item") + QString::number(row));
QCOMPARE(testWidget->count(), 2);
}
@@ -746,7 +734,7 @@ void tst_QListWidget::selectedItems()
//insert items
for (int i=0; i<itemCount; ++i)
- new QListWidgetItem(QString("Item%1").arg(i), testWidget);
+ new QListWidgetItem(QStringLiteral("Item") + QString::number(i), testWidget);
//test the selection
testWidget->setSelectionMode(QListWidget::SingleSelection);
@@ -1245,8 +1233,8 @@ void tst_QListWidget::insertItemsWithSorting_data()
QStringList ascendingItems;
QStringList reverseItems;
for (int i = 'a'; i <= 'z'; ++i) {
- ascendingItems << QString("%0").arg(QLatin1Char(i));
- reverseItems << QString("%0").arg(QLatin1Char('z' - i + 'a'));
+ ascendingItems << QString(1, QLatin1Char(i));
+ reverseItems << QString(1, QLatin1Char('z' - i + 'a'));
ascendingRows << i - 'a';
reverseRows << 'z' - i + 'a';
}
@@ -1490,7 +1478,7 @@ void tst_QListWidget::fastScroll()
QWidget topLevel;
MyListWidget widget(&topLevel);
for (int i = 0; i < 50; ++i)
- widget.addItem(QString("Item %1").arg(i));
+ widget.addItem(QStringLiteral("Item ") + QString::number(i));
topLevel.resize(300, 300); // toplevel needs to be wide enough for the item
topLevel.show();
diff --git a/tests/auto/widgets/itemviews/qtableview/qtableview.pro b/tests/auto/widgets/itemviews/qtableview/qtableview.pro
index 0814af77fb..e02da95ab9 100644
--- a/tests/auto/widgets/itemviews/qtableview/qtableview.pro
+++ b/tests/auto/widgets/itemviews/qtableview/qtableview.pro
@@ -3,6 +3,4 @@ TARGET = tst_qtableview
QT += widgets widgets-private testlib
QT += core-private gui-private
-TARGET.EPOCHEAPSIZE = 0x200000 0x800000
SOURCES += tst_qtableview.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp b/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp
index e5abd6bc46..a4ff7e1c60 100644
--- a/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp
+++ b/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp
@@ -65,17 +65,9 @@ class tst_QTableView : public QObject
{
Q_OBJECT
-public:
- tst_QTableView();
- virtual ~tst_QTableView();
-
-public slots:
+private slots:
void initTestCase();
- void cleanupTestCase();
- void init();
- void cleanup();
-private slots:
void getSetCheck();
void noDelegate();
@@ -214,6 +206,8 @@ private slots:
void changeHeaderData();
void viewOptions();
+
+ void taskQTBUG_7232_AllowUserToControlSingleStep();
};
// Testing get/set functions
@@ -325,8 +319,10 @@ public:
return QVariant();
}
- if (role == Qt::DisplayRole || role == Qt::EditRole)
- return QString("[%1,%2,%3]").arg(idx.row()).arg(idx.column()).arg(0);
+ if (role == Qt::DisplayRole || role == Qt::EditRole) {
+ return QLatin1Char('[') + QString::number(idx.row()) + QLatin1Char(',')
+ + QString::number(idx.column()) + QLatin1String(",0]");
+ }
return QVariant();
}
@@ -415,7 +411,8 @@ public:
void reset()
{
- QAbstractTableModel::reset();
+ beginResetModel();
+ endResetModel();
}
int row_count;
@@ -527,14 +524,6 @@ public:
QSize hint;
};
-tst_QTableView::tst_QTableView()
-{
-}
-
-tst_QTableView::~tst_QTableView()
-{
-}
-
void tst_QTableView::initTestCase()
{
#ifdef Q_OS_WINCE //disable magic for WindowsCE
@@ -542,18 +531,6 @@ void tst_QTableView::initTestCase()
#endif
}
-void tst_QTableView::cleanupTestCase()
-{
-}
-
-void tst_QTableView::init()
-{
-}
-
-void tst_QTableView::cleanup()
-{
-}
-
void tst_QTableView::noDelegate()
{
QtTestTableModel model(3, 3);
@@ -3606,7 +3583,11 @@ public:
{
return QVariant();
}
- void res() { reset(); }
+ void res()
+ {
+ beginResetModel();
+ endResetModel();
+ }
int rows;
int columns;
@@ -3797,7 +3778,7 @@ public:
int role = Qt::DisplayRole) const
{
if (role == Qt::DisplayRole)
- return QString("%1 - %2").arg(index.column()).arg(index.row());
+ return QString::number(index.column()) + QLatin1String(" - ") + QString::number(index.row());
return QVariant();
}
@@ -3919,12 +3900,12 @@ void tst_QTableView::task227953_setRootIndex()
//setup the first table as a child of the first item
for ( int row = 0; row < 40; ++row ) {
- item1.appendRow(QList<QStandardItem*>() << new QStandardItem(QString("row %0").arg(row)));
+ item1.appendRow(QList<QStandardItem*>() << new QStandardItem(QLatin1String("row ") + QString::number(row)));
}
//setup the second table as a child of the second item
for ( int row = 0; row < 10; ++row ) {
- item2.appendRow(QList<QStandardItem*>() << new QStandardItem(QString("row %0").arg(row)));
+ item2.appendRow(QList<QStandardItem*>() << new QStandardItem(QLatin1String("row ") + QString::number(row)));
}
tableView.setModel(&model);
@@ -4476,5 +4457,41 @@ void tst_QTableView::taskQTBUG_30653_doItemsLayout()
QCOMPARE(scrollToBottomOffset, doItemsLayoutOffset);
}
+void tst_QTableView::taskQTBUG_7232_AllowUserToControlSingleStep()
+{
+ // When we set the scrollMode to ScrollPerPixel it will adjust the scrollbars singleStep automatically
+ // Setting a singlestep on a scrollbar should however imply that the user takes control (and it is not changed by geometry updates).
+ // Setting a singlestep to -1 return to an automatic control of the singleStep.
+ QTableView t;
+ t.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
+ t.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
+ QStandardItemModel model(200, 200);
+ t.setModel(&model);
+ t.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&t));
+ t.setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
+ t.setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
+
+ t.setGeometry(200, 200, 200, 200);
+ int vStep1 = t.verticalScrollBar()->singleStep();
+ int hStep1 = t.horizontalScrollBar()->singleStep();
+ QVERIFY(vStep1 > 1);
+ QVERIFY(hStep1 > 1);
+
+ t.verticalScrollBar()->setSingleStep(1);
+ t.setGeometry(300, 300, 300, 300);
+ QCOMPARE(t.verticalScrollBar()->singleStep(), 1);
+
+ t.horizontalScrollBar()->setSingleStep(1);
+ t.setGeometry(400, 400, 400, 400);
+ QCOMPARE(t.horizontalScrollBar()->singleStep(), 1);
+
+ t.setGeometry(200, 200, 200, 200);
+ t.verticalScrollBar()->setSingleStep(-1);
+ t.horizontalScrollBar()->setSingleStep(-1);
+ QCOMPARE(vStep1, t.verticalScrollBar()->singleStep());
+ QCOMPARE(hStep1, t.horizontalScrollBar()->singleStep());
+}
+
QTEST_MAIN(tst_QTableView)
#include "tst_qtableview.moc"
diff --git a/tests/auto/widgets/itemviews/qtablewidget/qtablewidget.pro b/tests/auto/widgets/itemviews/qtablewidget/qtablewidget.pro
index d2c962b4de..114ce115eb 100644
--- a/tests/auto/widgets/itemviews/qtablewidget/qtablewidget.pro
+++ b/tests/auto/widgets/itemviews/qtablewidget/qtablewidget.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtablewidget
QT += widgets testlib
SOURCES += tst_qtablewidget.cpp
diff --git a/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp b/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp
index ea31fd19dd..a19dbd15d4 100644
--- a/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp
+++ b/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp
@@ -51,14 +51,11 @@ class tst_QTableWidget : public QObject
public:
tst_QTableWidget();
- ~tst_QTableWidget();
-public slots:
+private slots:
void initTestCase();
void cleanupTestCase();
void init();
- void cleanup();
-private slots:
void getSetCheck();
void clear();
void clearContents();
@@ -161,10 +158,6 @@ tst_QTableWidget::tst_QTableWidget(): testWidget(0)
{
}
-tst_QTableWidget::~tst_QTableWidget()
-{
-}
-
void tst_QTableWidget::initTestCase()
{
testWidget = new QTableWidget();
@@ -188,11 +181,6 @@ void tst_QTableWidget::init()
testWidget->showColumn(column);
}
-void tst_QTableWidget::cleanup()
-{
-
-}
-
void tst_QTableWidget::clearContents()
{
QTableWidgetItem *item = new QTableWidgetItem("test");
@@ -1473,7 +1461,7 @@ void tst_QTableWidget::task262056_sortDuplicate()
for (int i = 0; i<8; i++ ) {
QTableWidgetItem *twi = new QTableWidgetItem(items.at(i));
testWidget->setItem(i,0,twi);
- testWidget->setItem(i,1,new QTableWidgetItem(QString("item %1").arg(i)));
+ testWidget->setItem(i,1,new QTableWidgetItem(QLatin1String("item ") + QString::number(i)));
}
testWidget->sortItems(0, Qt::AscendingOrder);
QSignalSpy layoutChangedSpy(testWidget->model(), SIGNAL(layoutChanged()));
diff --git a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
index 033464c9db..7ebfda11b7 100644
--- a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
+++ b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
@@ -119,20 +119,12 @@ class tst_QTreeView : public QObject
{
Q_OBJECT
-public:
- tst_QTreeView();
- virtual ~tst_QTreeView();
-
-
public slots:
- void initTestCase();
- void cleanupTestCase();
- void init();
- void cleanup();
-
void selectionOrderTest();
private slots:
+ void initTestCase();
+
void getSetCheck();
// one test per QTreeView property
@@ -255,6 +247,7 @@ private slots:
void taskQTBUG_8176_emitOnExpandAll();
void taskQTBUG_37813_crash();
void taskQTBUG_45697_crash();
+ void taskQTBUG_7232_AllowUserToControlSingleStep();
void testInitialFocus();
};
@@ -338,9 +331,12 @@ public:
qWarning("Invalid modelIndex [%d,%d,%p]", idx.row(), idx.column(),
idx.internalPointer());
}
+ QString result = QLatin1Char('[') + QString::number(idx.row()) + QLatin1Char(',')
+ + QString::number(idx.column()) + QLatin1Char(',') + QString::number(level(idx))
+ + QLatin1Char(']');
if (idx.row() & 1)
- return QString("[%1,%2,%3] - this item is extra wide").arg(idx.row()).arg(idx.column()).arg(level(idx));
- return QString("[%1,%2,%3]").arg(idx.row()).arg(idx.column()).arg(level(idx));
+ result += QLatin1String(" - this item is extra wide");
+ return result;
}
if (decorationsEnabled && role == Qt::DecorationRole) {
QPixmap pm(16,16);
@@ -398,14 +394,6 @@ public:
mutable QMap<QModelIndex,QModelIndex> parentHash;
};
-tst_QTreeView::tst_QTreeView()
-{
-}
-
-tst_QTreeView::~tst_QTreeView()
-{
-}
-
void tst_QTreeView::initTestCase()
{
#ifdef Q_OS_WINCE //disable magic for WindowsCE
@@ -413,18 +401,6 @@ void tst_QTreeView::initTestCase()
#endif
}
-void tst_QTreeView::cleanupTestCase()
-{
-}
-
-void tst_QTreeView::init()
-{
-}
-
-void tst_QTreeView::cleanup()
-{
-}
-
// Testing get/set functions
void tst_QTreeView::getSetCheck()
{
@@ -2084,13 +2060,14 @@ void tst_QTreeView::rowsAboutToBeRemoved()
{
QStandardItemModel model(3, 1);
for (int i = 0; i < model.rowCount(); i++) {
+ const QString iS = QString::number(i);
QModelIndex index = model.index(i, 0, QModelIndex());
- model.setData(index, QString("%1").arg(i));
+ model.setData(index, iS);
model.insertRows(0, 4, index);
model.insertColumns(0,1,index);
for (int i1 = 0; i1 < model.rowCount(index); i1++) {
QModelIndex index2 = model.index(i1, 0, index);
- model.setData(index2, QString("%1%2").arg(i).arg(i1));
+ model.setData(index2, iS + QString::number(i1));
}
}
@@ -2228,14 +2205,16 @@ void tst_QTreeView::resizeColumnToContents()
{
QStandardItemModel model(50,2);
for (int r = 0; r < model.rowCount(); ++r) {
+ const QString rS = QString::number(r);
for (int c = 0; c < model.columnCount(); ++c) {
QModelIndex idx = model.index(r, c);
- model.setData(idx, QString::fromLatin1("%1,%2").arg(r).arg(c) );
+ model.setData(idx, rS + QLatin1Char(',') + QString::number(c));
model.insertColumns(0, 2, idx);
model.insertRows(0, 6, idx);
for (int i = 0; i < 6; ++i) {
+ const QString iS = QString::number(i);
for (int j = 0; j < 2 ; ++j) {
- model.setData(model.index(i, j, idx), QString::fromLatin1("child%1%2").arg(i).arg(j));
+ model.setData(model.index(i, j, idx), QLatin1String("child") + iS + QString::number(j));
}
}
}
@@ -2390,7 +2369,7 @@ void tst_QTreeView::selectionWithHiddenItems()
{
QStandardItemModel model;
for (int i = 0; i < model.rowCount(); ++i)
- model.setData(model.index(i,0), QString("row %1").arg(i));
+ model.setData(model.index(i,0), QLatin1String("row ") + QString::number(i));
QStandardItem item0("row 0");
QStandardItem item1("row 1");
@@ -2464,7 +2443,7 @@ void tst_QTreeView::selectAll()
QCOMPARE(view2.selectedIndexes().count(), model.rowCount() * model.columnCount());
for (int i = 0; i < model.rowCount(); ++i)
- model.setData(model.index(i,0), QString("row %1").arg(i));
+ model.setData(model.index(i,0), QLatin1String("row ") + QString::number(i));
PublicView view;
view.setModel(&model);
int selectedCount = view.selectedIndexes().count();
@@ -2818,8 +2797,9 @@ public:
if (parentNode->isDead)
qFatal("%s: grandparentNode is dead!", Q_FUNC_INFO);
}
- return QString("[%1,%2,%3]").arg(idx.row()).arg(idx.column())
- .arg(parentNode->isDead ? "dead" : "alive");
+ return QLatin1Char('[') + QString::number(idx.row()) + QLatin1Char(',')
+ + QString::number(idx.column()) + QLatin1Char(',')
+ + QLatin1String(parentNode->isDead ? "dead" : "alive") + QLatin1Char(']');
}
return QVariant();
}
@@ -3022,7 +3002,7 @@ void tst_QTreeView::filterProxyModelCrash()
QStandardItemModel model;
QList<QStandardItem *> items;
for (int i = 0; i < 100; i++)
- items << new QStandardItem(QString::fromLatin1("item %1").arg(i));
+ items << new QStandardItem(QLatin1String("item ") + QString::number(i));
model.appendColumn(items);
QSortFilterProxyModel proxy;
@@ -3388,11 +3368,11 @@ void tst_QTreeView::task203696_hidingColumnsAndRowsn()
{
QTreeView view;
QStandardItemModel *model = new QStandardItemModel(0, 3, &view);
- for (int i = 0; i < 3; ++i)
- {
+ for (int i = 0; i < 3; ++i) {
+ const QString prefix = QLatin1String("row ") + QString::number(i) + QLatin1String(" col ");
model->insertRow(model->rowCount());
for (int j = 0; j < model->columnCount(); ++j)
- model->setData(model->index(i, j), QString("row %1 col %2").arg(i).arg(j));
+ model->setData(model->index(i, j), prefix + QString::number(j));
}
view.setModel(model);
view.show();
@@ -3414,8 +3394,9 @@ void tst_QTreeView::addRowsWhileSectionsAreHidden()
for (i = 0; i < 3; ++i)
{
model->insertRow(model->rowCount());
+ const QString prefix = QLatin1String("row ") + QString::number(i) + QLatin1String(" col ");
for (int j = 0; j < model->columnCount(); ++j) {
- model->setData(model->index(i, j), QString("row %1 col %2").arg(i).arg(j));
+ model->setData(model->index(i, j), prefix + QString::number(j));
}
}
int col;
@@ -3424,8 +3405,9 @@ void tst_QTreeView::addRowsWhileSectionsAreHidden()
for (i = 3; i < 6; ++i)
{
model->insertRow(model->rowCount());
+ const QString prefix = QLatin1String("row ") + QString::number(i) + QLatin1String(" col ");
for (int j = 0; j < model->columnCount(); ++j) {
- model->setData(model->index(i, j), QString("row %1 col %2").arg(i).arg(j));
+ model->setData(model->index(i, j), prefix + QString::number(j));
}
}
for (col = 0; col < pass; ++col)
@@ -3479,8 +3461,10 @@ void tst_QTreeView::task220298_selectColumns()
virtual QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const
{
- if(role == Qt::DisplayRole)
- return QVariant(QString("%1-%2").arg(index.column()).arg(index.row()));
+ if (role == Qt::DisplayRole) {
+ return QVariant(QString::number(index.column()) + QLatin1Char('-')
+ + QString::number(index.row()));
+ }
return QVariant();
}
@@ -3518,7 +3502,7 @@ void tst_QTreeView::task224091_appendColumns()
QList<QStandardItem *> projlist;
for (int k = 0; k < 10; ++k)
- projlist.append(new QStandardItem(QString("Top Level %0").arg(k)));
+ projlist.append(new QStandardItem(QLatin1String("Top Level ") + QString::number(k)));
model->appendColumn(projlist);
model->invisibleRootItem()->appendRow(new QStandardItem("end"));
@@ -3745,7 +3729,7 @@ void tst_QTreeView::task246536_scrollbarsNotWorking()
QVERIFY(QTest::qWaitForWindowExposed(&tree));
QList<QStandardItem *> items;
for(int i=0; i<100; ++i){
- items << new QStandardItem(QString::fromLatin1("item %1").arg(i));
+ items << new QStandardItem(QLatin1String("item ") + QString::number(i));
}
model.invisibleRootItem()->appendColumn(items);
QTest::qWait(100);
@@ -3933,7 +3917,8 @@ void tst_QTreeView::taskQTBUG_6450_selectAllWith1stColumnHidden()
QList<QTreeWidgetItem *> items;
const int nrRows = 10;
for (int i = 0; i < nrRows; ++i) {
- items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("item: %1").arg(i))));
+ const QString text = QLatin1String("item: ") + QString::number(i);
+ items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(text)));
items.last()->setText(1, QString("is an item"));
}
tree.insertTopLevelItems(0, items);
@@ -3964,9 +3949,11 @@ public:
void tst_QTreeView::taskQTBUG_9216_setSizeAndUniformRowHeightsWrongRepaint()
{
QStandardItemModel model(10, 10, this);
- for (int row = 0; row < 10; row++)
+ for (int row = 0; row < 10; row++) {
+ const QString prefix = QLatin1String("row ") + QString::number(row) + QLatin1String(", col ");
for (int col = 0; col < 10; col++)
- model.setItem(row, col, new QStandardItem(QString("row %0, col %1").arg(row).arg(col)));
+ model.setItem(row, col, new QStandardItem(prefix + QString::number(col)));
+ }
TreeViewQTBUG_9216 view;
view.setUniformRowHeights(true);
view.setModel(&model);
@@ -4285,7 +4272,7 @@ void tst_QTreeView::testInitialFocus()
{
QTreeWidget treeWidget;
treeWidget.setColumnCount(5);
- new QTreeWidgetItem(&treeWidget, QStringList(QString("1;2;3;4;5").split(";")));
+ new QTreeWidgetItem(&treeWidget, QStringList(QString("1;2;3;4;5").split(QLatin1Char(';'))));
treeWidget.setTreePosition(2);
treeWidget.header()->hideSection(0); // make sure we skip hidden section(s)
treeWidget.header()->swapSections(1, 2); // make sure that we look for first visual index (and not first logical)
@@ -4339,9 +4326,10 @@ void tst_QTreeView::taskQTBUG_37813_crash()
treeWidget.setColumnCount(2);
QList<QTreeWidgetItem *> items;
for (int r = 0; r < 2; ++r) {
+ const QString prefix = QLatin1String("Row ") + QString::number(r) + QLatin1String(" Column ");
QTreeWidgetItem *item = new QTreeWidgetItem();
for (int c = 0; c < treeWidget.columnCount(); ++c)
- item->setText(c, QString::fromLatin1("Row %1 Column %2").arg(r).arg(c));
+ item->setText(c, prefix + QString::number(c));
items.append(item);
}
treeWidget.addTopLevelItems(items);
@@ -4432,5 +4420,47 @@ void tst_QTreeView::taskQTBUG_45697_crash()
QTRY_VERIFY(testWidget.timerTick() >= 2);
}
+void tst_QTreeView::taskQTBUG_7232_AllowUserToControlSingleStep()
+{
+ // When we set the scrollMode to ScrollPerPixel it will adjust the scrollbars singleStep automatically
+ // Setting a singlestep on a scrollbar should however imply that the user takes control.
+ // Setting a singlestep to -1 return to an automatic control of the singleStep.
+ QTreeWidget t;
+ t.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
+ t.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
+ t.setColumnCount(2);
+ QTreeWidgetItem *mainItem = new QTreeWidgetItem(&t, QStringList() << "Root");
+ for (int i = 0; i < 200; ++i) {
+ QTreeWidgetItem *item = new QTreeWidgetItem(mainItem, QStringList(QString("Item")));
+ new QTreeWidgetItem(item, QStringList() << "Child" << "1");
+ new QTreeWidgetItem(item, QStringList() << "Child" << "2");
+ new QTreeWidgetItem(item, QStringList() << "Child" << "3");
+ }
+ t.expandAll();
+
+ t.setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
+ t.setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
+
+ t.setGeometry(200, 200, 200, 200);
+ int vStep1 = t.verticalScrollBar()->singleStep();
+ int hStep1 = t.horizontalScrollBar()->singleStep();
+ QVERIFY(vStep1 > 1);
+ QVERIFY(hStep1 > 1);
+
+ t.verticalScrollBar()->setSingleStep(1);
+ t.setGeometry(300, 300, 300, 300);
+ QCOMPARE(t.verticalScrollBar()->singleStep(), 1);
+
+ t.horizontalScrollBar()->setSingleStep(1);
+ t.setGeometry(400, 400, 400, 400);
+ QCOMPARE(t.horizontalScrollBar()->singleStep(), 1);
+
+ t.setGeometry(200, 200, 200, 200);
+ t.verticalScrollBar()->setSingleStep(-1);
+ t.horizontalScrollBar()->setSingleStep(-1);
+ QCOMPARE(vStep1, t.verticalScrollBar()->singleStep());
+ QCOMPARE(hStep1, t.horizontalScrollBar()->singleStep());
+}
+
QTEST_MAIN(tst_QTreeView)
#include "tst_qtreeview.moc"
diff --git a/tests/auto/widgets/itemviews/qtreewidget/tst_qtreewidget.cpp b/tests/auto/widgets/itemviews/qtreewidget/tst_qtreewidget.cpp
index 117c53a2bb..1acdc103bd 100644
--- a/tests/auto/widgets/itemviews/qtreewidget/tst_qtreewidget.cpp
+++ b/tests/auto/widgets/itemviews/qtreewidget/tst_qtreewidget.cpp
@@ -320,7 +320,7 @@ void tst_QTreeWidget::addTopLevelItem()
for (int i = 0; i < 100; i += count) {
tops.clear();
for (int j = 0; j < count; ++j)
- tops << new TreeItem(QStringList() << QString("%0").arg(j));
+ tops << new TreeItem(QStringList(QString::number(j)));
tree.addTopLevelItems(tops);
QCOMPARE(tree.topLevelItemCount(), count + i);
for (int j = 0; j < count; ++j)
@@ -511,10 +511,10 @@ void tst_QTreeWidget::takeItem()
for (int i=0; i<3; ++i) {
QTreeWidgetItem *top = new QTreeWidgetItem(testWidget);
- top->setText(0, QString("top%1").arg(i));
+ top->setText(0, QStringLiteral("top") + QString::number(i));
for (int j=0; j<3; ++j) {
QTreeWidgetItem *child = new QTreeWidgetItem(top);
- child->setText(0, QString("child%1").arg(j));
+ child->setText(0, QStringLiteral("child") + QString::number(j));
}
}
@@ -528,7 +528,7 @@ void tst_QTreeWidget::takeItem()
QCOMPARE(item, (QTreeWidgetItem *)0);
QCOMPARE(count, testWidget->topLevelItemCount());
} else {
- QCOMPARE(item->text(0), QString("top%1").arg(index));
+ QCOMPARE(item->text(0), QStringLiteral("top") + QString::number(index));
QCOMPARE(count-1, testWidget->topLevelItemCount());
delete item;
}
@@ -539,7 +539,7 @@ void tst_QTreeWidget::takeItem()
QCOMPARE(item, (QTreeWidgetItem *)0);
QCOMPARE(count, testWidget->topLevelItem(0)->childCount());
} else {
- QCOMPARE(item->text(0), QString("child%1").arg(index));
+ QCOMPARE(item->text(0), QStringLiteral("child") + QString::number(index));
QCOMPARE(count-1, testWidget->topLevelItem(0)->childCount());
delete item;
}
@@ -794,10 +794,11 @@ void tst_QTreeWidget::selectedItems()
// create items
for (int t=0; t<topLevel; ++t) {
QTreeWidgetItem *top = new QTreeWidgetItem(testWidget);
- top->setText(0, QString("top%1").arg(t));
+ const QString topS = QLatin1String("top") + QString::number(t);
+ top->setText(0, topS);
for (int c=0; c<children; ++c) {
QTreeWidgetItem *child = new QTreeWidgetItem(top);
- child->setText(0, QString("top%1child%2").arg(t).arg(c));
+ child->setText(0, topS + QLatin1String("child") + QString::number(c));
}
}
@@ -1442,11 +1443,10 @@ static void fillTreeWidget(QTreeWidgetItem *parent, int rows)
{
const int columns = parent->treeWidget()->columnCount();
for (int r = 0; r < rows; ++r) {
+ const QString prefix = QLatin1String("[r:") + QString::number(r) + QLatin1String(",c:");
QTreeWidgetItem *w = new QTreeWidgetItem(parent);
- for ( int c = 0; c < columns; ++c ) {
- QString s = QString("[r:%1,c:%2]").arg(r).arg(c);
- w->setText(c, s);
- }
+ for (int c = 0; c < columns; ++c)
+ w->setText(c, prefix + QString::number(c) + QLatin1Char(']'));
fillTreeWidget(w, rows - r - 1);
}
}
@@ -1455,10 +1455,9 @@ static void fillTreeWidget(QTreeWidget *tree, int rows)
{
for (int r = 0; r < rows; ++r) {
QTreeWidgetItem *w = new QTreeWidgetItem();
- for ( int c = 0; c < tree->columnCount(); ++c ) {
- QString s = QString("[r:%1,c:%2]").arg(r).arg(c);
- w->setText(c, s);
- }
+ const QString prefix = QLatin1String("[r:") + QString::number(r) + QLatin1String(",c:");
+ for (int c = 0; c < tree->columnCount(); ++c)
+ w->setText(c, prefix + QString::number(c) + QLatin1Char(']'));
tree->insertTopLevelItem(r, w);
fillTreeWidget(w, rows - r - 1);
}
@@ -1555,7 +1554,7 @@ void tst_QTreeWidget::keyboardNavigation()
}
QTreeWidgetItem *current = testWidget->currentItem();
- QCOMPARE(current->text(0), QString("[r:%1,c:0]").arg(row));
+ QCOMPARE(current->text(0), QLatin1String("[r:") + QString::number(row) + QLatin1String(",c:0]"));
if (current->parent())
QCOMPARE(current->parent()->indexOfChild(current), row);
else
@@ -1696,7 +1695,7 @@ void tst_QTreeWidget::addChild()
for (int i = 0; i < 100; i += count) {
QList<QTreeWidgetItem*> list;
for (int j = 0; j < count; ++j)
- list << new QTreeWidgetItem(QStringList() << QString("%0").arg(j));
+ list << new QTreeWidgetItem(QStringList(QString::number(j)));
item->addChildren(list);
QCOMPARE(item->childCount(), count + i);
for (int j = 0; j < count; ++j) {
@@ -1743,7 +1742,8 @@ void tst_QTreeWidget::setData()
for (int i = 1; i <= 2; ++i) {
for (int j = 0; j < 5; ++j) {
QVariantList args;
- QString text = QString("text %0").arg(i);
+ const QString iS = QString::number(i);
+ const QString text = QLatin1String("text ") + iS;
item->setText(j, text);
QCOMPARE(item->text(j), text);
QCOMPARE(itemChangedSpy.count(), 1);
@@ -1765,7 +1765,7 @@ void tst_QTreeWidget::setData()
item->setIcon(j, icon);
QCOMPARE(itemChangedSpy.count(), 0);
- QString toolTip = QString("toolTip %0").arg(i);
+ const QString toolTip = QLatin1String("toolTip ") + iS;
item->setToolTip(j, toolTip);
QCOMPARE(item->toolTip(j), toolTip);
QCOMPARE(itemChangedSpy.count(), 1);
@@ -1775,7 +1775,7 @@ void tst_QTreeWidget::setData()
item->setToolTip(j, toolTip);
QCOMPARE(itemChangedSpy.count(), 0);
- QString statusTip = QString("statusTip %0").arg(i);
+ const QString statusTip = QLatin1String("statusTip ") + iS;
item->setStatusTip(j, statusTip);
QCOMPARE(item->statusTip(j), statusTip);
QCOMPARE(itemChangedSpy.count(), 1);
@@ -1785,7 +1785,7 @@ void tst_QTreeWidget::setData()
item->setStatusTip(j, statusTip);
QCOMPARE(itemChangedSpy.count(), 0);
- QString whatsThis = QString("whatsThis %0").arg(i);
+ const QString whatsThis = QLatin1String("whatsThis ") + iS;
item->setWhatsThis(j, whatsThis);
QCOMPARE(item->whatsThis(j), whatsThis);
QCOMPARE(itemChangedSpy.count(), 1);
@@ -2007,7 +2007,7 @@ void tst_QTreeWidget::columnCount()
void tst_QTreeWidget::setHeaderLabels()
{
- QStringList list = QString("a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z").split(",");
+ QStringList list = QString("a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z").split(QLatin1Char(','));
testWidget->setHeaderLabels(list);
QCOMPARE(testWidget->header()->count(), list.count());
}
@@ -2147,8 +2147,8 @@ void tst_QTreeWidget::insertItemsWithSorting_data()
QStringList ascendingItems;
QStringList reverseItems;
for (int i = 'a'; i <= 'z'; ++i) {
- ascendingItems << QString("%0").arg(QLatin1Char(i));
- reverseItems << QString("%0").arg(QLatin1Char('z' - i + 'a'));
+ ascendingItems << QString(1, QLatin1Char(i));
+ reverseItems << QString(1, QLatin1Char('z' - i + 'a'));
ascendingRows << i - 'a';
reverseRows << 'z' - i + 'a';
}
@@ -2671,9 +2671,9 @@ void tst_QTreeWidget::expandAndCallapse()
QTreeWidgetItem *top = new QTreeWidgetItem(&tw, QStringList() << "top");
QTreeWidgetItem *p;
for (int i = 0; i < 10; ++i) {
- p = new QTreeWidgetItem(top, QStringList() << QString("%1").arg(i));
+ p = new QTreeWidgetItem(top, QStringList(QString::number(i)));
for (int j = 0; j < 10; ++j)
- new QTreeWidgetItem(p, QStringList() << QString("%1").arg(j));
+ new QTreeWidgetItem(p, QStringList(QString::number(j)));
}
QSignalSpy spy0(&tw, SIGNAL(itemExpanded(QTreeWidgetItem*)));
QSignalSpy spy1(&tw, SIGNAL(itemCollapsed(QTreeWidgetItem*)));
@@ -3133,7 +3133,7 @@ void tst_QTreeWidget::selectionOrder()
testWidget->setColumnCount(1);
QList<QTreeWidgetItem *> items;
for (int i = 0; i < 10; ++i)
- items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("item: %1").arg(i))));
+ items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QLatin1String("item: ") + QString::number(i))));
testWidget->insertTopLevelItems(0, items);
QModelIndex idx = testWidget->indexFromItem(items[0]);
diff --git a/tests/auto/widgets/itemviews/qtreewidgetitemiterator/qtreewidgetitemiterator.pro b/tests/auto/widgets/itemviews/qtreewidgetitemiterator/qtreewidgetitemiterator.pro
index 5fa6762617..42a00618a2 100644
--- a/tests/auto/widgets/itemviews/qtreewidgetitemiterator/qtreewidgetitemiterator.pro
+++ b/tests/auto/widgets/itemviews/qtreewidgetitemiterator/qtreewidgetitemiterator.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtreewidgetitemiterator
QT += widgets testlib
SOURCES += tst_qtreewidgetitemiterator.cpp
diff --git a/tests/auto/widgets/itemviews/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp b/tests/auto/widgets/itemviews/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp
index c52198fa2c..c3308e96c6 100644
--- a/tests/auto/widgets/itemviews/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp
+++ b/tests/auto/widgets/itemviews/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp
@@ -46,15 +46,11 @@ class tst_QTreeWidgetItemIterator : public QObject
public:
tst_QTreeWidgetItemIterator();
- ~tst_QTreeWidgetItemIterator();
-public slots:
+private slots:
void initTestCase();
void cleanupTestCase();
- void init();
- void cleanup();
-private slots:
void postincrement();
void preincrement();
void postdecrement();
@@ -81,10 +77,6 @@ tst_QTreeWidgetItemIterator::tst_QTreeWidgetItemIterator(): testWidget(0)
{
}
-tst_QTreeWidgetItemIterator::~tst_QTreeWidgetItemIterator()
-{
-}
-
void tst_QTreeWidgetItemIterator::initTestCase()
{
testWidget = new QTreeWidget();
@@ -105,7 +97,8 @@ void tst_QTreeWidgetItemIterator::initTestCase()
*/
for (int i=0; i <= 16; ++i) {
QTreeWidgetItem *top = new QTreeWidgetItem(testWidget);
- top->setText(0, QString("top%1").arg(i));
+ const QString topS = QLatin1String("top") + QString::number(i);
+ top->setText(0, topS);
switch (i) {
case 0: testWidget->setItemHidden(top, true);break;
case 1: testWidget->setItemHidden(top, false);break;
@@ -136,7 +129,7 @@ void tst_QTreeWidgetItemIterator::initTestCase()
}
for (int j=0; j <= 16; ++j) {
QTreeWidgetItem *child = new QTreeWidgetItem(top);
- child->setText(0, QString("top%1,child%2").arg(i).arg(j));
+ child->setText(0, topS + QLatin1String(",child") + QString::number(j));
switch (j) {
case 0: testWidget->setItemHidden(child, true);break;
case 1: testWidget->setItemHidden(child, false);break;
@@ -174,14 +167,6 @@ void tst_QTreeWidgetItemIterator::cleanupTestCase()
delete testWidget;
}
-void tst_QTreeWidgetItemIterator::init()
-{
-}
-
-void tst_QTreeWidgetItemIterator::cleanup()
-{
-}
-
void tst_QTreeWidgetItemIterator::iteratorflags_data()
{
/*
@@ -1074,6 +1059,24 @@ void tst_QTreeWidgetItemIterator::updateIfModifiedFromWidget_data()
<< 3 << 3 << 3 << (int)QTreeWidgetItemIterator::All << 1 << 3 << QString("top0,child1") << QString("top0,child1") << 0;
}
+static void populate3Levels(QTreeWidget &tw, int topLevelItems, int childItems, int grandChildItems)
+{
+ for (int i1 = 0; i1 < topLevelItems; ++i1) {
+ QTreeWidgetItem *top = new QTreeWidgetItem(&tw);
+ const QString top1S = QLatin1String("top") + QString::number(i1);
+ top->setText(0, top1S);
+ for (int i2 = 0; i2 < childItems; ++i2) {
+ QTreeWidgetItem *child = new QTreeWidgetItem(top);
+ const QString childS = top1S + QLatin1String(",child") + QString::number(i2);
+ child->setText(0, childS);
+ for (int i3 = 0; i3 < grandChildItems; ++i3) {
+ QTreeWidgetItem *grandChild = new QTreeWidgetItem(child);
+ grandChild->setText(0, childS + QLatin1String(",grandchild") + QString::number(i3));
+ }
+ }
+ }
+}
+
void tst_QTreeWidgetItemIterator::updateIfModifiedFromWidget()
{
QFETCH(int, topLevelItems);
@@ -1089,18 +1092,7 @@ void tst_QTreeWidgetItemIterator::updateIfModifiedFromWidget()
QTreeWidget tw;
tw.clear();
tw.setColumnCount(2);
- for (int i1=0; i1 < topLevelItems; ++i1) {
- QTreeWidgetItem *top = new QTreeWidgetItem(&tw);
- top->setText(0, QString("top%1").arg(i1));
- for (int i2=0; i2 < childItems; ++i2) {
- QTreeWidgetItem *child = new QTreeWidgetItem(top);
- child->setText(0, QString("top%1,child%2").arg(i1).arg(i2));
- for (int i3=0; i3 < grandChildItems; ++i3) {
- QTreeWidgetItem *grandChild = new QTreeWidgetItem(child);
- grandChild->setText(0, QString("top%1,child%2,grandchild%3").arg(i1).arg(i2).arg(i3));
- }
- }
- }
+ populate3Levels(tw, topLevelItems, childItems, grandChildItems);
QTreeWidgetItemIterator it(&tw, QTreeWidgetItemIterator::IteratorFlags(iteratorflags));
it+=expecteditemindex;
@@ -1161,18 +1153,7 @@ void tst_QTreeWidgetItemIterator::updateIteratorAfterDeletedItem_and_ContinueIte
QTreeWidget tw;
tw.clear();
tw.setColumnCount(2);
- for (int i1=0; i1 < topLevelItems; ++i1) {
- QTreeWidgetItem *top = new QTreeWidgetItem(&tw);
- top->setText(0, QString("top%1").arg(i1));
- for (int i2=0; i2 < childItems; ++i2) {
- QTreeWidgetItem *child = new QTreeWidgetItem(top);
- child->setText(0, QString("top%1,child%2").arg(i1).arg(i2));
- for (int i3=0; i3 < grandChildItems; ++i3) {
- QTreeWidgetItem *grandChild = new QTreeWidgetItem(child);
- grandChild->setText(0, QString("top%1,child%2,grandchild%3").arg(i1).arg(i2).arg(i3));
- }
- }
- }
+ populate3Levels(tw, topLevelItems, childItems, grandChildItems);
QTreeWidgetItemIterator it(&tw, QTreeWidgetItemIterator::All);
it += iterator_initial_index;
diff --git a/tests/auto/widgets/kernel/qaction/tst_qaction.cpp b/tests/auto/widgets/kernel/qaction/tst_qaction.cpp
index 71b55d71ea..02276e7651 100644
--- a/tests/auto/widgets/kernel/qaction/tst_qaction.cpp
+++ b/tests/auto/widgets/kernel/qaction/tst_qaction.cpp
@@ -334,9 +334,9 @@ void tst_QAction::task200823_tooltip()
action->setShortcut(shortcut);
// we want a non-standard tooltip that shows the shortcut
- action->setToolTip(QString("%1 (%2)").arg(action->text()).arg(action->shortcut().toString()));
+ action->setToolTip(action->text() + QLatin1String(" (") + action->shortcut().toString() + QLatin1Char(')'));
- QString ref = QString("foo (%1)").arg(QKeySequence(shortcut).toString());
+ QString ref = QLatin1String("foo (") + QKeySequence(shortcut).toString() + QLatin1Char(')');
QCOMPARE(action->toolTip(), ref);
}
diff --git a/tests/auto/widgets/kernel/qactiongroup/qactiongroup.pro b/tests/auto/widgets/kernel/qactiongroup/qactiongroup.pro
index 82c0204aa8..87521edfe9 100644
--- a/tests/auto/widgets/kernel/qactiongroup/qactiongroup.pro
+++ b/tests/auto/widgets/kernel/qactiongroup/qactiongroup.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qactiongroup
QT += widgets testlib
SOURCES += tst_qactiongroup.cpp
diff --git a/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp b/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp
index 878136b4a0..dfa2280a6b 100644
--- a/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp
+++ b/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp
@@ -103,13 +103,10 @@ Q_OBJECT
public:
tst_QApplication();
- virtual ~tst_QApplication();
-public slots:
+private slots:
void initTestCase();
- void init();
void cleanup();
-private slots:
void sendEventsOnProcessEvents(); // this must be the first test
void staticSetup();
@@ -133,9 +130,11 @@ private slots:
void testDeleteLater();
void testDeleteLaterProcessEvents();
+#ifndef QT_NO_LIBRARY
void libraryPaths();
void libraryPaths_qt_plugin_path();
void libraryPaths_qt_plugin_path_2();
+#endif
void sendPostedEvents();
@@ -247,17 +246,6 @@ tst_QApplication::tst_QApplication()
#endif
}
-tst_QApplication::~tst_QApplication()
-{
-
-}
-
-void tst_QApplication::init()
-{
-// TODO: Add initialization code here.
-// This will be executed immediately before each test is run.
-}
-
void tst_QApplication::cleanup()
{
// TODO: Add cleanup code here.
@@ -398,11 +386,12 @@ void tst_QApplication::setFont_data()
if (!sizes.size())
sizes = fdb.standardSizes();
if (sizes.size() > 0) {
- QTest::newRow(QString("data%1a").arg(cnt).toLatin1().constData())
+ const QByteArray cntB = QByteArray::number(cnt);
+ QTest::newRow(("data" + cntB + "a").constData())
<< family
<< sizes.first()
<< false;
- QTest::newRow(QString("data%1b").arg(cnt).toLatin1().constData())
+ QTest::newRow(("data" + cntB + "b").constData())
<< family
<< sizes.first()
<< true;
@@ -500,7 +489,7 @@ static QString cstrings2QString( char **args )
while ( args[i] ) {
string += args[i];
if ( args[i+1] )
- string += " ";
+ string += QLatin1Char(' ');
++i;
}
return string;
@@ -909,6 +898,7 @@ bool isPathListIncluded(const QStringList &l, const QStringList &r)
return j == r.count();
}
+#ifndef QT_NO_LIBRARY
#define QT_TST_QAPP_DEBUG
void tst_QApplication::libraryPaths()
{
@@ -1057,16 +1047,16 @@ void tst_QApplication::libraryPaths_qt_plugin_path_2()
#ifdef Q_OS_UNIX
QByteArray validPath = QDir("/tmp").canonicalPath().toLatin1();
QByteArray nonExistentPath = "/nonexistent";
- QByteArray pluginPath = validPath + ":" + nonExistentPath;
+ QByteArray pluginPath = validPath + ':' + nonExistentPath;
#elif defined(Q_OS_WIN)
# ifdef Q_OS_WINCE
QByteArray validPath = "/Temp";
QByteArray nonExistentPath = "/nonexistent";
- QByteArray pluginPath = validPath + ";" + nonExistentPath;
+ QByteArray pluginPath = validPath + ';' + nonExistentPath;
# else
QByteArray validPath = "C:\\windows";
QByteArray nonExistentPath = "Z:\\nonexistent";
- QByteArray pluginPath = validPath + ";" + nonExistentPath;
+ QByteArray pluginPath = validPath + ';' + nonExistentPath;
# endif
#endif
@@ -1114,6 +1104,7 @@ void tst_QApplication::libraryPaths_qt_plugin_path_2()
qputenv("QT_PLUGIN_PATH", QByteArray());
}
}
+#endif
class SendPostedEventsTester : public QObject
{
diff --git a/tests/auto/widgets/kernel/qboxlayout/qboxlayout.pro b/tests/auto/widgets/kernel/qboxlayout/qboxlayout.pro
index e30a4b57b1..90e83f5285 100644
--- a/tests/auto/widgets/kernel/qboxlayout/qboxlayout.pro
+++ b/tests/auto/widgets/kernel/qboxlayout/qboxlayout.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qboxlayout
QT += widgets testlib
SOURCES += tst_qboxlayout.cpp
diff --git a/tests/auto/widgets/kernel/qdesktopwidget/qdesktopwidget.pro b/tests/auto/widgets/kernel/qdesktopwidget/qdesktopwidget.pro
index 77709df5da..1ab155f22e 100644
--- a/tests/auto/widgets/kernel/qdesktopwidget/qdesktopwidget.pro
+++ b/tests/auto/widgets/kernel/qdesktopwidget/qdesktopwidget.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qdesktopwidget
QT += widgets testlib
SOURCES += tst_qdesktopwidget.cpp
diff --git a/tests/auto/widgets/kernel/qdesktopwidget/tst_qdesktopwidget.cpp b/tests/auto/widgets/kernel/qdesktopwidget/tst_qdesktopwidget.cpp
index e94dfa5754..df7f14add3 100644
--- a/tests/auto/widgets/kernel/qdesktopwidget/tst_qdesktopwidget.cpp
+++ b/tests/auto/widgets/kernel/qdesktopwidget/tst_qdesktopwidget.cpp
@@ -41,15 +41,9 @@ class tst_QDesktopWidget : public QObject
{
Q_OBJECT
-public:
- tst_QDesktopWidget();
- virtual ~tst_QDesktopWidget();
-
-public slots:
- void init();
+private slots:
void cleanup();
-private slots:
void numScreens();
void primaryScreen();
void screenNumberForQWidget();
@@ -59,18 +53,6 @@ private slots:
void topLevels();
};
-tst_QDesktopWidget::tst_QDesktopWidget()
-{
-}
-
-tst_QDesktopWidget::~tst_QDesktopWidget()
-{
-}
-
-void tst_QDesktopWidget::init()
-{
-}
-
void tst_QDesktopWidget::cleanup()
{
QVERIFY(QApplication::topLevelWidgets().isEmpty());
diff --git a/tests/auto/widgets/kernel/qformlayout/qformlayout.pro b/tests/auto/widgets/kernel/qformlayout/qformlayout.pro
index 668b890c97..be944605a3 100644
--- a/tests/auto/widgets/kernel/qformlayout/qformlayout.pro
+++ b/tests/auto/widgets/kernel/qformlayout/qformlayout.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qformlayout
QT += widgets testlib
SOURCES += tst_qformlayout.cpp
diff --git a/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp b/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp
index e1b494c9f1..dc3be524f8 100644
--- a/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp
+++ b/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp
@@ -184,7 +184,7 @@ void tst_QFormLayout::getItemPosition()
QList<QLabel*> labels;
QList<QLineEdit*> fields;
for (int i = 0; i < 5; ++i) {
- labels.append(new QLabel(QString("Label %1").arg(i+1)));
+ labels.append(new QLabel(QLatin1String("Label " ) + QString::number(i + 1)));
fields.append(new QLineEdit);
fl->addRow(labels[i], fields[i]);
}
@@ -493,8 +493,8 @@ void tst_QFormLayout::addRow()
QVERIFY(layout->itemAt(0, QFormLayout::LabelRole)->widget() == lbl1);
QVERIFY(layout->itemAt(1, QFormLayout::LabelRole)->widget() == lbl2);
- QVERIFY(layout->itemAt(2, QFormLayout::LabelRole)->widget()->property("text") == "Foo:");
- QVERIFY(layout->itemAt(3, QFormLayout::LabelRole)->widget()->property("text") == "Bar:");
+ QCOMPARE(layout->itemAt(2, QFormLayout::LabelRole)->widget()->property("text").toString(), QLatin1String("Foo:"));
+ QCOMPARE(layout->itemAt(3, QFormLayout::LabelRole)->widget()->property("text").toString(), QLatin1String("Bar:"));
QVERIFY(layout->itemAt(4, QFormLayout::LabelRole) == 0);
QVERIFY(layout->itemAt(5, QFormLayout::LabelRole) == 0);
diff --git a/tests/auto/widgets/kernel/qgridlayout/qgridlayout.pro b/tests/auto/widgets/kernel/qgridlayout/qgridlayout.pro
index febcee6c55..ee64f8538f 100644
--- a/tests/auto/widgets/kernel/qgridlayout/qgridlayout.pro
+++ b/tests/auto/widgets/kernel/qgridlayout/qgridlayout.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qgridlayout
QT += widgets widgets-private testlib
diff --git a/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp b/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp
index 1e67c675ef..0ad8e30351 100644
--- a/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp
+++ b/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp
@@ -538,7 +538,8 @@ public:
}
private:
void init(int numPixels = -1){
- setText(QString::fromLatin1("(%1,%2)").arg(sh.width()).arg(sh.height()));
+ setText(QLatin1Char('(') + QString::number(sh.width())
+ + QLatin1Char(',') + QString::number(sh.height()) + QLatin1Char(')'));
setFrameStyle(QFrame::Box | QFrame::Plain);
setNumberOfPixels(numPixels);
}
@@ -1432,8 +1433,9 @@ void tst_QGridLayout::layoutSpacing_data()
w->setLayout(layout);
int pw = up->sizeHint().width();
int ph = up->sizeHint().height();
- QByteArray testName = QString::fromLatin1("arrowpad with %1 empty rows, %2 empty columns").arg(yoff).arg(xoff).toLatin1();
- QTest::newRow(testName.data())
+ QByteArray testName = "arrowpad with " + QByteArray::number(yoff)
+ + " empty rows, " + QByteArray::number(xoff) + " empty columns";
+ QTest::newRow(testName.constData())
<< w << (PointList()
<< QPoint(0 + pw + 5, 3)
<< QPoint(0, 3 + ph + 10)
@@ -1686,7 +1688,7 @@ void tst_QGridLayout::replaceWidget()
for (int n = 0; n < itemCount; ++n) {
int x = n % 3;
int y = n / 3;
- labels[n] = new QLabel(QString("label %1").arg(n));
+ labels[n] = new QLabel(QLatin1String("label ") + QString::number(n));
Qt::Alignment align = (n % 3 ? Qt::AlignLeft : Qt::AlignRight);
l->addWidget(labels[n], x * 3, y * 3, (n % 2) + 1, (n + 1) % 2 + 1, align);
}
diff --git a/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp b/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp
index 4d15ac9a93..5413b274d4 100644
--- a/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp
+++ b/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp
@@ -195,7 +195,7 @@ void tst_QLayout::smartMaxSize()
int width = sz.width();
int expectedWidth = expectedWidths[expectedIndex];
if (width != expectedWidth) {
- qDebug() << "error at index" << expectedIndex << ":" << sizePolicy.horizontalPolicy() << align << minSize << sizeHint << maxSize << width;
+ qDebug() << "error at index" << expectedIndex << ':' << sizePolicy.horizontalPolicy() << align << minSize << sizeHint << maxSize << width;
++regressionCount;
}
++expectedIndex;
diff --git a/tests/auto/widgets/kernel/qshortcut/tst_qshortcut.cpp b/tests/auto/widgets/kernel/qshortcut/tst_qshortcut.cpp
index f206a5fe9a..5641e60078 100644
--- a/tests/auto/widgets/kernel/qshortcut/tst_qshortcut.cpp
+++ b/tests/auto/widgets/kernel/qshortcut/tst_qshortcut.cpp
@@ -180,12 +180,13 @@ protected:
QKeyEvent *ke = static_cast<QKeyEvent*>(e);
if (ke->modifiers() && ke->key() > Qt::Key_Any
&& ke->key() < Qt::Key_ydiaeresis) {
+ const QChar c = QLatin1Char(char(ke->key()));
if (ke->modifiers() == Qt::ControlModifier)
- insertPlainText(QString("<Ctrl+%1>").arg(char(ke->key())));
+ insertPlainText(QLatin1String("<Ctrl+") + c + QLatin1Char('>'));
else if (ke->modifiers() == Qt::AltModifier)
- insertPlainText(QString("<Alt+%1>").arg(char(ke->key())));
+ insertPlainText(QLatin1String("<Alt+") + c + QLatin1Char('>'));
else if (ke->modifiers() == Qt::ShiftModifier)
- insertPlainText(QString("<Shift+%1>").arg(char(ke->key())));
+ insertPlainText(QLatin1String("<Shift+") + c + QLatin1Char('>'));
return true;
}
}
diff --git a/tests/auto/widgets/kernel/qstackedlayout/qstackedlayout.pro b/tests/auto/widgets/kernel/qstackedlayout/qstackedlayout.pro
index cd80253e12..1f94c1b386 100644
--- a/tests/auto/widgets/kernel/qstackedlayout/qstackedlayout.pro
+++ b/tests/auto/widgets/kernel/qstackedlayout/qstackedlayout.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qstackedlayout
QT += widgets testlib
SOURCES += tst_qstackedlayout.cpp
diff --git a/tests/auto/widgets/kernel/qstackedlayout/tst_qstackedlayout.cpp b/tests/auto/widgets/kernel/qstackedlayout/tst_qstackedlayout.cpp
index eec572c3c4..e65e2e0899 100644
--- a/tests/auto/widgets/kernel/qstackedlayout/tst_qstackedlayout.cpp
+++ b/tests/auto/widgets/kernel/qstackedlayout/tst_qstackedlayout.cpp
@@ -46,16 +46,11 @@ class tst_QStackedLayout : public QObject
public:
tst_QStackedLayout();
- virtual ~tst_QStackedLayout();
-
-public slots:
- void initTestCase();
- void cleanupTestCase();
+private slots:
void init();
void cleanup();
-private slots:
void getSetCheck();
void testCase();
void deleteCurrent();
@@ -100,18 +95,6 @@ tst_QStackedLayout::tst_QStackedLayout()
{
}
-tst_QStackedLayout::~tst_QStackedLayout()
-{
-}
-
-void tst_QStackedLayout::initTestCase()
-{
-}
-
-void tst_QStackedLayout::cleanupTestCase()
-{
-}
-
void tst_QStackedLayout::init()
{
if (testWidget) {
@@ -134,7 +117,6 @@ void tst_QStackedLayout::cleanup()
testWidget = 0;
}
-
void tst_QStackedLayout::testCase()
{
QStackedLayout onStack(testWidget);
diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
index ddbb4e6d75..95e4d92cd2 100644
--- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
+++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
@@ -1513,7 +1513,7 @@ void tst_QWidget::mapFromAndTo()
subWindow2->setGeometry(75, 75, 100, 100);
subSubWindow->setGeometry(10, 10, 10, 10);
-#if !defined(Q_OS_WINCE) && !defined(Q_OS_QNX) || defined(Q_OS_BLACKBERRY)
+#if !defined(Q_OS_WINCE) && !defined(Q_OS_QNX)
//update visibility
if (windowMinimized) {
if (!windowHidden) {
@@ -5655,7 +5655,7 @@ void tst_QWidget::setToolTip()
for (int pass = 0; pass < 2; ++pass) {
QCursor::setPos(0, 0);
QScopedPointer<QWidget> popup(new QWidget(0, Qt::Popup));
- popup->setObjectName(QString::fromLatin1("tst_qwidget setToolTip #%1").arg(pass));
+ popup->setObjectName(QLatin1String("tst_qwidget setToolTip #") + QString::number(pass));
popup->setWindowTitle(popup->objectName());
popup->setGeometry(50, 50, 150, 50);
QFrame *frame = new QFrame(popup.data());
@@ -7361,7 +7361,7 @@ void tst_QWidget::updateWhileMinimized()
{
if (m_platform == QStringLiteral("wayland"))
QSKIP("Wayland: This fails. Figure out why.");
-#if defined(Q_OS_QNX) && !defined(Q_OS_BLACKBERRY)
+#if defined(Q_OS_QNX)
QSKIP("Platform does not support showMinimized()");
#endif
UpdateWidget widget;
@@ -7913,7 +7913,7 @@ void tst_QWidget::doubleRepaint()
// Minmize: Should not trigger a repaint.
widget.showMinimized();
QTest::qWait(10);
-#if defined(Q_OS_QNX) && !defined(Q_OS_BLACKBERRY)
+#if defined(Q_OS_QNX)
QEXPECT_FAIL("", "Platform does not support showMinimized()", Continue);
#endif
QCOMPARE(widget.numPaintEvents, 0);
diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget_mac_helpers.mm b/tests/auto/widgets/kernel/qwidget/tst_qwidget_mac_helpers.mm
index c67682fd85..293b3387ee 100644
--- a/tests/auto/widgets/kernel/qwidget/tst_qwidget_mac_helpers.mm
+++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget_mac_helpers.mm
@@ -39,7 +39,7 @@
#include <qpa/qplatformnativeinterface.h>
#include <private/qcore_mac_p.h>
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
QString nativeWindowTitle(QWidget *window, Qt::WindowState state)
{
diff --git a/tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro b/tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro
index d61681d5cb..8672c363a2 100644
--- a/tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro
+++ b/tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qwidget_window
QT += widgets testlib core-private gui-private
SOURCES += tst_qwidget_window.cpp
diff --git a/tests/auto/widgets/kernel/qwidgetaction/qwidgetaction.pro b/tests/auto/widgets/kernel/qwidgetaction/qwidgetaction.pro
index 0029ebd51e..e4158559a9 100644
--- a/tests/auto/widgets/kernel/qwidgetaction/qwidgetaction.pro
+++ b/tests/auto/widgets/kernel/qwidgetaction/qwidgetaction.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qwidgetaction
QT += widgets testlib
SOURCES += tst_qwidgetaction.cpp
diff --git a/tests/auto/widgets/kernel/qwidgetsvariant/qwidgetsvariant.pro b/tests/auto/widgets/kernel/qwidgetsvariant/qwidgetsvariant.pro
index e3f2da96bd..7979e92087 100644
--- a/tests/auto/widgets/kernel/qwidgetsvariant/qwidgetsvariant.pro
+++ b/tests/auto/widgets/kernel/qwidgetsvariant/qwidgetsvariant.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qwidgetsvariant
INCLUDEPATH += $$PWD/../../../other/qvariant_common
SOURCES += tst_qwidgetsvariant.cpp
diff --git a/tests/auto/widgets/kernel/qwindowcontainer/qwindowcontainer.pro b/tests/auto/widgets/kernel/qwindowcontainer/qwindowcontainer.pro
index 4ff05eb04a..17fc1d28b5 100644
--- a/tests/auto/widgets/kernel/qwindowcontainer/qwindowcontainer.pro
+++ b/tests/auto/widgets/kernel/qwindowcontainer/qwindowcontainer.pro
@@ -1,6 +1,5 @@
CONFIG += testcase
mac:CONFIG -= app_bundle
-# CONFIG += parallel_test // Cannot be parallel due to the activation test
TARGET = tst_qwindowcontainer
QT += widgets testlib
SOURCES += tst_qwindowcontainer.cpp
diff --git a/tests/auto/widgets/styles/qstyle/qstyle.pro b/tests/auto/widgets/styles/qstyle/qstyle.pro
index b4546aa760..4d7473f068 100644
--- a/tests/auto/widgets/styles/qstyle/qstyle.pro
+++ b/tests/auto/widgets/styles/qstyle/qstyle.pro
@@ -1,7 +1,5 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qstyle
-TARGET.EPOCHEAPSIZE = 0x200000 0x800000
QT += widgets testlib
SOURCES += tst_qstyle.cpp
diff --git a/tests/auto/widgets/styles/qstyle/tst_qstyle.cpp b/tests/auto/widgets/styles/qstyle/tst_qstyle.cpp
index 21369d4520..cf1341b376 100644
--- a/tests/auto/widgets/styles/qstyle/tst_qstyle.cpp
+++ b/tests/auto/widgets/styles/qstyle/tst_qstyle.cpp
@@ -92,17 +92,15 @@ class tst_QStyle : public QObject
Q_OBJECT
public:
tst_QStyle();
- virtual ~tst_QStyle();
+
private:
bool testAllFunctions(QStyle *);
bool testScrollBarSubControls(QStyle *);
void testPainting(QStyle *style, const QString &platform);
private slots:
void drawItemPixmap();
- void initTestCase();
- void cleanup();
- void cleanupTestCase();
void init();
+ void cleanup();
#ifndef QT_NO_STYLE_FUSION
void testFusionStyle();
#endif
@@ -142,10 +140,6 @@ tst_QStyle::tst_QStyle()
testWidget = 0;
}
-tst_QStyle::~tst_QStyle()
-{
-}
-
class MyWidget : public QWidget
{
public:
@@ -165,14 +159,6 @@ void tst_QStyle::cleanup()
testWidget = 0;
}
-void tst_QStyle::initTestCase()
-{
-}
-
-void tst_QStyle::cleanupTestCase()
-{
-}
-
void tst_QStyle::testStyleFactory()
{
QStringList keys = QStyleFactory::keys();
diff --git a/tests/auto/widgets/styles/qstyleoption/qstyleoption.pro b/tests/auto/widgets/styles/qstyleoption/qstyleoption.pro
index 2ca24c4f43..bf12a6b30f 100644
--- a/tests/auto/widgets/styles/qstyleoption/qstyleoption.pro
+++ b/tests/auto/widgets/styles/qstyleoption/qstyleoption.pro
@@ -2,7 +2,6 @@ TEMPLATE = app
TARGET = tst_qstyleoption
CONFIG += testcase
-CONFIG += parallel_test
QT += widgets testlib
SOURCES += tst_qstyleoption.cpp
diff --git a/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp b/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp
index a360803c50..3d42ee98a8 100644
--- a/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp
+++ b/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp
@@ -55,6 +55,7 @@ public:
~tst_QStyleSheetStyle();
private slots:
+ void init();
void repolish();
void numinstances();
void widgetsBeforeAppStyleSheet();
@@ -71,8 +72,12 @@ private slots:
void layoutSpacing();
#endif
void qproperty();
+ void palettePropagation_data();
void palettePropagation();
+ void fontPropagation_data();
void fontPropagation();
+ void widgetStylePropagation_data();
+ void widgetStylePropagation();
void onWidgetDestroyed();
void fontPrecedence();
void focusColors();
@@ -137,6 +142,12 @@ tst_QStyleSheetStyle::~tst_QStyleSheetStyle()
{
}
+void tst_QStyleSheetStyle::init()
+{
+ qApp->setStyleSheet(QString());
+ QCoreApplication::setAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles, false);
+}
+
void tst_QStyleSheetStyle::numinstances()
{
QWidget w;
@@ -627,31 +638,80 @@ void tst_QStyleSheetStyle::namespaces()
QCOMPARE(BACKGROUND(pb2), red);
}
+void tst_QStyleSheetStyle::palettePropagation_data()
+{
+ QTest::addColumn<QString>("applicationStyleSheet");
+ QTest::addColumn<bool>("widgetStylePropagation");
+ QTest::newRow("Widget style propagation") << " " << true;
+ QTest::newRow("Widget style propagation, no application style sheet") << QString() << true;
+ QTest::newRow("Default propagation") << " " << false;
+ QTest::newRow("Default propagation, no application style sheet") << QString() << false;
+}
+
void tst_QStyleSheetStyle::palettePropagation()
{
- qApp->setStyleSheet("");
+ QFETCH(QString, applicationStyleSheet);
+ QFETCH(bool, widgetStylePropagation);
+
+ qApp->setStyleSheet(applicationStyleSheet);
+ QCoreApplication::setAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles, widgetStylePropagation);
+
QGroupBox gb;
- QPushButton *push = new QPushButton(&gb);
- QPushButton &pb = *push;
- push->setText("AsdF");
+ QLabel *label = new QLabel(&gb);
+ QLabel &lb = *label;
+ label->setText("AsdF");
gb.setStyleSheet("QGroupBox { color: red }");
- QVERIFY(COLOR(gb) == Qt::red);
- QVERIFY(COLOR(pb) == APPCOLOR(pb)); // palette shouldn't propagate
- gb.setStyleSheet("QGroupBox * { color: red }");
+ QCOMPARE(COLOR(gb), QColor(Qt::red));
- QVERIFY(COLOR(pb) == Qt::red);
- QVERIFY(COLOR(gb) == APPCOLOR(gb));
+ if (widgetStylePropagation) {
+ QCOMPARE(COLOR(lb), QColor(Qt::red)); // palette should propagate in standard mode
+ } else {
+ QCOMPARE(COLOR(lb), APPCOLOR(lb)); // palette shouldn't propagate
+ }
QWidget window;
+ lb.setParent(&window);
+ if (widgetStylePropagation) {
+ // In standard propagation mode, widgets that are not explicitly
+ // targeted do not have their propagated palette unset when they are
+ // unpolished by changing parents. This is consistent with regular Qt
+ // widgets, who also maintain their propagated palette when changing
+ // parents
+ QCOMPARE(COLOR(lb), QColor(Qt::red));
+ } else {
+ QCOMPARE(COLOR(lb), APPCOLOR(lb));
+ }
+ lb.setParent(&gb);
+
+ gb.setStyleSheet("QGroupBox * { color: red }");
+
+ QCOMPARE(COLOR(lb), QColor(Qt::red));
+ QCOMPARE(COLOR(gb), APPCOLOR(gb));
+
window.setStyleSheet("* { color: white; }");
- pb.setParent(&window);
- QVERIFY(COLOR(pb) == Qt::white);
+ lb.setParent(&window);
+ QCOMPARE(COLOR(lb), QColor(Qt::white));
+}
+
+void tst_QStyleSheetStyle::fontPropagation_data()
+{
+ QTest::addColumn<QString>("applicationStyleSheet");
+ QTest::addColumn<bool>("widgetStylePropagation");
+ QTest::newRow("Widget style propagation") << " " << true;
+ QTest::newRow("Widget style propagation, no application style sheet") << QString() << true;
+ QTest::newRow("Default propagation") << " " << false;
+ QTest::newRow("Default propagation, no application style sheet") << QString() << false;
}
void tst_QStyleSheetStyle::fontPropagation()
{
- qApp->setStyleSheet("");
+ QFETCH(QString, applicationStyleSheet);
+ QFETCH(bool, widgetStylePropagation);
+
+ qApp->setStyleSheet(applicationStyleSheet);
+ QCoreApplication::setAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles, widgetStylePropagation);
+
QComboBox cb;
cb.addItem("item1");
cb.addItem("item2");
@@ -661,7 +721,11 @@ void tst_QStyleSheetStyle::fontPropagation()
cb.setStyleSheet("QComboBox { font-size: 20pt; }");
QCOMPARE(FONTSIZE(cb), 20);
- QCOMPARE(FONTSIZE(*popup), viewFontSize);
+ if (widgetStylePropagation) {
+ QCOMPARE(FONTSIZE(*popup), 20);
+ } else {
+ QCOMPARE(FONTSIZE(*popup), viewFontSize);
+ }
QGroupBox gb;
QPushButton *push = new QPushButton(&gb);
QPushButton &pb = *push;
@@ -670,7 +734,11 @@ void tst_QStyleSheetStyle::fontPropagation()
gb.setStyleSheet("QGroupBox { font-size: 20pt }");
QCOMPARE(FONTSIZE(gb), 20);
- QVERIFY(FONTSIZE(pb) == buttonFontSize); // font does not propagate
+ if (widgetStylePropagation) {
+ QCOMPARE(FONTSIZE(pb), 20);
+ } else {
+ QCOMPARE(FONTSIZE(pb), buttonFontSize); // font does not propagate
+ }
gb.setStyleSheet("QGroupBox * { font-size: 20pt; }");
QCOMPARE(FONTSIZE(gb), gbFontSize);
QCOMPARE(FONTSIZE(pb), 20);
@@ -1471,12 +1539,14 @@ void tst_QStyleSheetStyle::embeddedFonts()
QCOMPARE(spin.font().pixelSize(), 32);
QCOMPARE(embedded->font().pixelSize(), 32);
+#ifndef QT_NO_CONTEXTMENU
QMenu *menu = embedded->createStandardContextMenu();
menu->show();
QTest::qWait(20);
QVERIFY(menu);
QVERIFY(menu->font().pixelSize() != 32);
QCOMPARE(menu->font().pixelSize(), qApp->font(menu).pixelSize());
+#endif // QT_NO_CONTEXTMENU
//task 242556
QComboBox box;
@@ -1744,8 +1814,11 @@ void tst_QStyleSheetStyle::QTBUG36933_brokenPseudoClassLookup()
QTableWidget widget(rowCount, columnCount);
for (int row = 0; row < rowCount; ++row) {
- for (int column = 0; column < columnCount; ++column)
- widget.setItem(row, column, new QTableWidgetItem(QStringLiteral("row %1 column %2").arg(row + 1).arg(column + 1)));
+ for (int column = 0; column < columnCount; ++column) {
+ const QString t = QLatin1String("row ") + QString::number(row + 1)
+ + QLatin1String(" column ") + QString::number(column + 1);
+ widget.setItem(row, column, new QTableWidgetItem(t));
+ }
// put no visible text for the vertical headers, but still put some text or they will collapse
widget.setVerticalHeaderItem(row, new QTableWidgetItem(QStringLiteral(" ")));
@@ -1794,6 +1867,138 @@ void tst_QStyleSheetStyle::styleSheetChangeBeforePolish()
QVERIFY(testForColors(image2, QColor(0x00, 0xFF, 0x00)));
}
+void tst_QStyleSheetStyle::widgetStylePropagation_data()
+{
+ QTest::addColumn<QString>("applicationStyleSheet");
+ QTest::addColumn<QString>("parentStyleSheet");
+ QTest::addColumn<QString>("childStyleSheet");
+ QTest::addColumn<QFont>("parentFont");
+ QTest::addColumn<QFont>("childFont");
+ QTest::addColumn<QPalette>("parentPalette");
+ QTest::addColumn<QPalette>("childPalette");
+ QTest::addColumn<int>("parentExpectedSize");
+ QTest::addColumn<int>("childExpectedSize");
+ QTest::addColumn<QColor>("parentExpectedColor");
+ QTest::addColumn<QColor>("childExpectedColor");
+
+ QFont noFont;
+ QFont font45; font45.setPointSize(45);
+ QFont font32; font32.setPointSize(32);
+
+ QPalette noPalette;
+ QPalette redPalette; redPalette.setColor(QPalette::WindowText, QColor("red"));
+ QPalette greenPalette; greenPalette.setColor(QPalette::WindowText, QColor("green"));
+
+ QLabel defaultLabel;
+
+ int defaultSize = defaultLabel.font().pointSize();
+ QColor defaultColor = defaultLabel.palette().color(defaultLabel.foregroundRole());
+ QColor redColor("red");
+ QColor greenColor("green");
+
+ // Check regular Qt propagation works as expected, with and without a
+ // non-interfering application stylesheet
+ QTest::newRow("defaults")
+ << QString() << QString() << QString()
+ << noFont << noFont << noPalette << noPalette
+ << defaultSize << defaultSize << defaultColor << defaultColor;
+ QTest::newRow("parent font propagation, no application style sheet")
+ << QString() << QString() << QString()
+ << font45 << noFont << noPalette << noPalette
+ << 45 << 45 << defaultColor << defaultColor;
+ QTest::newRow("parent font propagation, dummy application style sheet")
+ << "QGroupBox { font-size: 64pt }" << QString() << QString()
+ << font45 << noFont << noPalette << noPalette
+ << 45 << 45 << defaultColor << defaultColor;
+ QTest::newRow("parent color propagation, no application style sheet")
+ << QString() << QString() << QString()
+ << noFont << noFont << redPalette << noPalette
+ << defaultSize << defaultSize << redColor << redColor;
+ QTest::newRow("parent color propagation, dummy application style sheet")
+ << "QGroupBox { color: blue }" << QString() << QString()
+ << noFont << noFont << redPalette << noPalette
+ << defaultSize << defaultSize << redColor << redColor;
+
+ // Parent style sheet propagates to child if child has not explicitly
+ // set a value
+ QTest::newRow("parent style sheet color propagation")
+ << "#parentLabel { color: red }" << QString() << QString()
+ << noFont << noFont << noPalette << noPalette
+ << defaultSize << defaultSize << redColor << redColor;
+ QTest::newRow("parent style sheet font propagation")
+ << "#parentLabel { font-size: 45pt }" << QString() << QString()
+ << noFont << noFont << noPalette << noPalette
+ << 45 << 45 << defaultColor << defaultColor;
+
+ // Parent style sheet does not propagate to child if child has explicitly
+ // set a value
+ QTest::newRow("parent style sheet color propagation, child explicitly set")
+ << "#parentLabel { color: red }" << QString() << QString()
+ << noFont << noFont << noPalette << greenPalette
+ << defaultSize << defaultSize << redColor << greenColor;
+ QTest::newRow("parent style sheet font propagation, child explicitly set")
+ << "#parentLabel { font-size: 45pt }" << QString() << QString()
+ << noFont << font32 << noPalette << noPalette
+ << 45 << 32 << defaultColor << defaultColor;
+
+ // Parent does not propagate to child when child is target of style sheet
+ QTest::newRow("parent style sheet font propagation, child application style sheet")
+ << "#childLabel { font-size: 32pt }" << QString() << QString()
+ << font45 << noFont << noPalette << noPalette
+ << 45 << 32 << defaultColor << defaultColor;
+ QTest::newRow("parent style sheet color propagation, child application style sheet")
+ << "#childLabel { color: green }" << QString() << QString()
+ << noFont << noFont << redPalette << noPalette
+ << defaultSize << defaultSize << redColor << greenColor;
+}
+
+void tst_QStyleSheetStyle::widgetStylePropagation()
+{
+ QFETCH(QString, applicationStyleSheet);
+ QFETCH(QString, parentStyleSheet);
+ QFETCH(QString, childStyleSheet);
+
+ QFETCH(QFont, parentFont);
+ QFETCH(QFont, childFont);
+ QFETCH(QPalette, parentPalette);
+ QFETCH(QPalette, childPalette);
+
+ QFETCH(int, parentExpectedSize);
+ QFETCH(int, childExpectedSize);
+ QFETCH(QColor, parentExpectedColor);
+ QFETCH(QColor, childExpectedColor);
+
+ QCoreApplication::setAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles, true);
+
+ qApp->setStyleSheet(applicationStyleSheet);
+
+ QLabel parentLabel;
+ parentLabel.setObjectName("parentLabel");
+ QLabel childLabel(&parentLabel);
+ childLabel.setObjectName("childLabel");
+
+ if (parentFont.resolve())
+ parentLabel.setFont(parentFont);
+ if (childFont.resolve())
+ childLabel.setFont(childFont);
+ if (parentPalette.resolve())
+ parentLabel.setPalette(parentPalette);
+ if (childPalette.resolve())
+ childLabel.setPalette(childPalette);
+ if (!parentStyleSheet.isEmpty())
+ parentLabel.setStyleSheet(parentStyleSheet);
+ if (!childStyleSheet.isEmpty())
+ childLabel.setStyleSheet(childStyleSheet);
+
+ parentLabel.ensurePolished();
+ childLabel.ensurePolished();
+
+ QCOMPARE(FONTSIZE(parentLabel), parentExpectedSize);
+ QCOMPARE(FONTSIZE(childLabel), childExpectedSize);
+ QCOMPARE(COLOR(parentLabel), parentExpectedColor);
+ QCOMPARE(COLOR(childLabel), childExpectedColor);
+}
+
QTEST_MAIN(tst_QStyleSheetStyle)
#include "tst_qstylesheetstyle.moc"
diff --git a/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp b/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp
index e8ac9aa5d2..fdeb6d100d 100644
--- a/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp
+++ b/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp
@@ -61,7 +61,7 @@ public:
protected:
QStringList splitPath(const QString &path) const {
- return csv ? path.split(",") : QCompleter::splitPath(path);
+ return csv ? path.split(QLatin1Char(',')) : QCompleter::splitPath(path);
}
private:
@@ -367,7 +367,7 @@ void tst_QCompleter::csMatchingOnCsSortedModel_data()
QTest::addColumn<QString>("completion");
QTest::addColumn<QString>("completionText");
-#define ROWNAME(name) (qPrintable(QString("%1 %2").arg(name).arg(i)))
+#define ROWNAME(name) ((QByteArray(name) + ' ' + QByteArray::number(i)).constData())
for (int i = 0; i < 2; i++) {
if (i == 1)
@@ -1164,7 +1164,7 @@ void tst_QCompleter::dynamicSortOrder()
completer.setModelSorting(QCompleter::CaseSensitivelySortedModel);
QStandardItem *root = model.invisibleRootItem();
for (int i = 0; i < 20; i++) {
- root->appendRow(new QStandardItem(QString("%1").arg(i)));
+ root->appendRow(new QStandardItem(QString::number(i)));
}
root->appendRow(new QStandardItem("13"));
root->sortChildren(0, Qt::AscendingOrder);
@@ -1256,7 +1256,7 @@ void tst_QCompleter::task189564_omitNonSelectableItems()
QStringList strings;
for (int i = 0; i < n; ++i)
- strings << QString("%1%2").arg(prefix).arg(i);
+ strings << prefix + QString::number(i);
const QString omitString(strings.at(n / 2));
task189564_StringListModel model(omitString);
model.setStringList(strings);
@@ -1553,9 +1553,9 @@ void tst_QCompleter::task247560_keyboardNavigation()
QStandardItemModel model;
for (int i = 0; i < 5; i++) {
- for (int j = 0; j < 5; j++) {
- model.setItem(i, j, new QStandardItem(QString("row %1 column %2").arg(i).arg(j)));
- }
+ const QString prefix = QLatin1String("row ") + QString::number(i) + QLatin1String(" column ");
+ for (int j = 0; j < 5; j++)
+ model.setItem(i, j, new QStandardItem(prefix + QString::number(j)));
}
diff --git a/tests/auto/widgets/util/qscroller/qscroller.pro b/tests/auto/widgets/util/qscroller/qscroller.pro
index 55f57f5ed1..29e8378f2b 100644
--- a/tests/auto/widgets/util/qscroller/qscroller.pro
+++ b/tests/auto/widgets/util/qscroller/qscroller.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qscroller
QT += widgets testlib gui-private
diff --git a/tests/auto/widgets/util/qsystemtrayicon/qsystemtrayicon.pro b/tests/auto/widgets/util/qsystemtrayicon/qsystemtrayicon.pro
index d409d23650..e9310fc234 100644
--- a/tests/auto/widgets/util/qsystemtrayicon/qsystemtrayicon.pro
+++ b/tests/auto/widgets/util/qsystemtrayicon/qsystemtrayicon.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsystemtrayicon
QT += widgets testlib
SOURCES += tst_qsystemtrayicon.cpp
diff --git a/tests/auto/widgets/widgets/qabstractbutton/tst_qabstractbutton.cpp b/tests/auto/widgets/widgets/qabstractbutton/tst_qabstractbutton.cpp
index 43d6912c6e..bfd99ad121 100644
--- a/tests/auto/widgets/widgets/qabstractbutton/tst_qabstractbutton.cpp
+++ b/tests/auto/widgets/widgets/qabstractbutton/tst_qabstractbutton.cpp
@@ -48,17 +48,11 @@ class tst_QAbstractButton : public QObject
{
Q_OBJECT
-public:
- tst_QAbstractButton();
- virtual ~tst_QAbstractButton();
-
-
-public slots:
+private slots:
void initTestCase();
void cleanupTestCase();
void init();
- void cleanup();
-private slots:
+
void setAutoRepeat_data();
void setAutoRepeat();
@@ -147,14 +141,6 @@ private:
}
};
-tst_QAbstractButton::tst_QAbstractButton()
-{
-}
-
-tst_QAbstractButton::~tst_QAbstractButton()
-{
-}
-
void tst_QAbstractButton::initTestCase()
{
testWidget = new MyButton(0);
@@ -188,10 +174,6 @@ void tst_QAbstractButton::init()
click_count = 0;
}
-void tst_QAbstractButton::cleanup()
-{
-}
-
void tst_QAbstractButton::resetValues()
{
toggle_count = 0;
diff --git a/tests/auto/widgets/widgets/qabstractscrollarea/qabstractscrollarea.pro b/tests/auto/widgets/widgets/qabstractscrollarea/qabstractscrollarea.pro
index 911898407b..2d9aa52e3a 100644
--- a/tests/auto/widgets/widgets/qabstractscrollarea/qabstractscrollarea.pro
+++ b/tests/auto/widgets/widgets/qabstractscrollarea/qabstractscrollarea.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qabstractscrollarea
QT += widgets testlib
SOURCES += tst_qabstractscrollarea.cpp
diff --git a/tests/auto/widgets/widgets/qabstractslider/qabstractslider.pro b/tests/auto/widgets/widgets/qabstractslider/qabstractslider.pro
index 020be08867..6453999786 100644
--- a/tests/auto/widgets/widgets/qabstractslider/qabstractslider.pro
+++ b/tests/auto/widgets/widgets/qabstractslider/qabstractslider.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qabstractslider
QT += widgets testlib
SOURCES += tst_qabstractslider.cpp
diff --git a/tests/auto/widgets/widgets/qabstractspinbox/qabstractspinbox.pro b/tests/auto/widgets/widgets/qabstractspinbox/qabstractspinbox.pro
index 8fa1c0fcac..f9b601228e 100644
--- a/tests/auto/widgets/widgets/qabstractspinbox/qabstractspinbox.pro
+++ b/tests/auto/widgets/widgets/qabstractspinbox/qabstractspinbox.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qabstractspinbox
QT += widgets testlib
SOURCES += tst_qabstractspinbox.cpp
diff --git a/tests/auto/widgets/widgets/qbuttongroup/tst_qbuttongroup.cpp b/tests/auto/widgets/widgets/qbuttongroup/tst_qbuttongroup.cpp
index 5dec6224ca..90e7d5f3ea 100644
--- a/tests/auto/widgets/widgets/qbuttongroup/tst_qbuttongroup.cpp
+++ b/tests/auto/widgets/widgets/qbuttongroup/tst_qbuttongroup.cpp
@@ -68,14 +68,7 @@ protected:
class tst_QButtonGroup : public QObject
{
Q_OBJECT
-public:
- tst_QButtonGroup();
-public slots:
- void initTestCase();
- void cleanupTestCase();
- void init();
- void cleanup();
private slots:
void arrowKeyNavigation();
void exclusive();
@@ -91,27 +84,6 @@ private slots:
void task209485_removeFromGroupInEventHandler();
};
-tst_QButtonGroup::tst_QButtonGroup()
-{
-}
-
-
-void tst_QButtonGroup::initTestCase()
-{
-}
-
-void tst_QButtonGroup::cleanupTestCase()
-{
-}
-
-void tst_QButtonGroup::init()
-{
-}
-
-void tst_QButtonGroup::cleanup()
-{
-}
-
QT_BEGIN_NAMESPACE
extern bool Q_GUI_EXPORT qt_tab_all_widgets();
QT_END_NAMESPACE
diff --git a/tests/auto/widgets/widgets/qcalendarwidget/tst_qcalendarwidget.cpp b/tests/auto/widgets/widgets/qcalendarwidget/tst_qcalendarwidget.cpp
index 9b8ab110cd..b3ade17c49 100644
--- a/tests/auto/widgets/widgets/qcalendarwidget/tst_qcalendarwidget.cpp
+++ b/tests/auto/widgets/widgets/qcalendarwidget/tst_qcalendarwidget.cpp
@@ -46,15 +46,6 @@ class tst_QCalendarWidget : public QObject
{
Q_OBJECT
-public:
- tst_QCalendarWidget();
- virtual ~tst_QCalendarWidget();
-public slots:
- void initTestCase();
- void cleanupTestCase();
- void init();
- void cleanup();
-
private slots:
void getSetCheck();
void buttonClickCheck();
@@ -265,31 +256,6 @@ void tst_QCalendarWidget::setWeekdayFormat()
}
}
-tst_QCalendarWidget::tst_QCalendarWidget()
-{
-}
-
-tst_QCalendarWidget::~tst_QCalendarWidget()
-{
-}
-
-void tst_QCalendarWidget::initTestCase()
-{
-}
-
-void tst_QCalendarWidget::cleanupTestCase()
-{
-}
-
-void tst_QCalendarWidget::init()
-{
-}
-
-void tst_QCalendarWidget::cleanup()
-{
-}
-
-
typedef void (QCalendarWidget::*ShowFunc)();
Q_DECLARE_METATYPE(ShowFunc)
diff --git a/tests/auto/widgets/widgets/qcheckbox/tst_qcheckbox.cpp b/tests/auto/widgets/widgets/qcheckbox/tst_qcheckbox.cpp
index 5696382fab..3583a135be 100644
--- a/tests/auto/widgets/widgets/qcheckbox/tst_qcheckbox.cpp
+++ b/tests/auto/widgets/widgets/qcheckbox/tst_qcheckbox.cpp
@@ -45,17 +45,12 @@ class tst_QCheckBox : public QObject
{
Q_OBJECT
-public:
- tst_QCheckBox();
- virtual ~tst_QCheckBox();
-
-public slots:
+private slots:
void initTestCase();
void cleanupTestCase();
void init();
void cleanup();
-private slots:
void setChecked();
void setTriState();
void setText_data();
@@ -86,14 +81,6 @@ private:
QCheckBox *testWidget;
};
-tst_QCheckBox::tst_QCheckBox()
-{
-}
-
-tst_QCheckBox::~tst_QCheckBox()
-{
-}
-
void tst_QCheckBox::initTestCase()
{
// Create the test class
diff --git a/tests/auto/widgets/widgets/qcombobox/qcombobox.pro b/tests/auto/widgets/widgets/qcombobox/qcombobox.pro
index 03e8ed75ed..88b9d08557 100644
--- a/tests/auto/widgets/widgets/qcombobox/qcombobox.pro
+++ b/tests/auto/widgets/widgets/qcombobox/qcombobox.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qcombobox
QT += widgets widgets-private gui-private core-private testlib
SOURCES += tst_qcombobox.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp
index 0b22dc7893..25fc37487d 100644
--- a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp
+++ b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp
@@ -2314,9 +2314,10 @@ void tst_QComboBox::task191329_size()
QStandardItemModel model(rows, 2);
for (int row = 0; row < model.rowCount(); ++row) {
+ const QString rowS = QLatin1String("row ") + QString::number(row);
for (int column = 0; column < model.columnCount(); ++column) {
- QStandardItem *item = new QStandardItem(QString("row %0, column %1").arg(row).arg(column));
- model.setItem(row, column, item);
+ const QString text = rowS + QLatin1String(", column ") + QString::number(column);
+ model.setItem(row, column, new QStandardItem(text));
}
}
QTableView *table = new QTableView();
@@ -2399,7 +2400,7 @@ void tst_QComboBox::task248169_popupWithMinimalSize()
QTest::qWaitForWindowExposed(comboBox.view());
QTRY_VERIFY(comboBox.view()->isVisible());
-#if defined QT_BUILD_INTERNAL && !defined Q_OS_BLACKBERRY
+#if defined QT_BUILD_INTERNAL
QFrame *container = comboBox.findChild<QComboBoxPrivateContainer *>();
QVERIFY(container);
QTRY_VERIFY(desktop.screenGeometry(container).contains(container->geometry()));
@@ -2693,7 +2694,8 @@ void tst_QComboBox::resetModel()
void reset()
{
- QStringListModel::reset();
+ QStringListModel::beginResetModel();
+ QStringListModel::endResetModel();
}
};
QComboBox cb;
@@ -2865,10 +2867,11 @@ void tst_QComboBox::task_QTBUG_10491_currentIndexAndModelColumn()
QStandardItemModel model(4, 4, &comboBox);
for (int i = 0; i < 4; i++){
- model.setItem(i, 0, new QStandardItem(QString("Employee Nr %1").arg(i)));
- model.setItem(i, 1, new QStandardItem(QString("Street Nr %1").arg(i)));
- model.setItem(i, 2, new QStandardItem(QString("Town Nr %1").arg(i)));
- model.setItem(i, 3, new QStandardItem(QString("Phone Nr %1").arg(i)));
+ const QString iS = QString::number(i);
+ model.setItem(i, 0, new QStandardItem(QLatin1String("Employee Nr ") + iS));
+ model.setItem(i, 1, new QStandardItem(QLatin1String("Street Nr ") + iS));
+ model.setItem(i, 2, new QStandardItem(QLatin1String("Town Nr ") + iS));
+ model.setItem(i, 3, new QStandardItem(QLatin1String("Phone Nr ") + iS));
}
comboBox.setModel(&model);
comboBox.setModelColumn(0);
@@ -2914,12 +2917,12 @@ void tst_QComboBox::itemData()
// ensure that the currentText(), the DisplayRole and the EditRole
// stay in sync when using QComboBox's default model
for (int i = 0; i < itemCount; ++i) {
- QString itemText = QString("item text %1").arg(i);
+ QString itemText = QLatin1String("item text ") + QString::number(i);
comboBox.addItem(itemText);
}
for (int i = 0; i < itemCount; ++i) {
- QString itemText = QString("item text %1").arg(i);
+ QString itemText = QLatin1String("item text ") + QString::number(i);
QCOMPARE(comboBox.itemText(i), itemText);
QCOMPARE(comboBox.itemData(i, Qt::DisplayRole).toString(), itemText);
QCOMPARE(comboBox.itemData(i, Qt::EditRole).toString(), itemText);
@@ -2931,14 +2934,11 @@ void tst_QComboBox::itemData()
QCOMPARE(comboBox.currentData(Qt::EditRole).toString(), itemText);
}
- for (int i = 0; i < itemCount; ++i) {
- // now change by using setItemText
- QString itemText = QString("setItemText %1").arg(i);
- comboBox.setItemText(i, itemText);
- }
+ for (int i = 0; i < itemCount; ++i) // now change by using setItemText
+ comboBox.setItemText(i, QLatin1String("setItemText ") + QString::number(i));
for (int i = 0; i < itemCount; ++i) {
- QString itemText = QString("setItemText %1").arg(i);
+ QString itemText = QLatin1String("setItemText ") + QString::number(i);
QCOMPARE(comboBox.itemText(i), itemText);
QCOMPARE(comboBox.itemData(i, Qt::DisplayRole).toString(), itemText);
QCOMPARE(comboBox.itemData(i, Qt::EditRole).toString(), itemText);
@@ -2952,12 +2952,12 @@ void tst_QComboBox::itemData()
for (int i = 0; i < itemCount; ++i) {
// now change by changing the DisplayRole's data
- QString itemText = QString("setItemData(DisplayRole) %1").arg(i);
+ QString itemText = QLatin1String("setItemData(DisplayRole) ") + QString::number(i);
comboBox.setItemData(i, QVariant(itemText), Qt::DisplayRole);
}
for (int i = 0; i < itemCount; ++i) {
- QString itemText = QString("setItemData(DisplayRole) %1").arg(i);
+ QString itemText = QLatin1String("setItemData(DisplayRole) ") + QString::number(i);
QCOMPARE(comboBox.itemText(i), itemText);
QCOMPARE(comboBox.itemData(i, Qt::DisplayRole).toString(), itemText);
QCOMPARE(comboBox.itemData(i, Qt::EditRole).toString(), itemText);
@@ -2971,12 +2971,12 @@ void tst_QComboBox::itemData()
for (int i = 0; i < itemCount; ++i) {
// now change by changing the EditRole's data
- QString itemText = QString("setItemData(EditRole) %1").arg(i);
+ QString itemText = QLatin1String("setItemData(EditRole) ") + QString::number(i);
comboBox.setItemData(i, QVariant(itemText), Qt::EditRole);
}
for (int i = 0; i < itemCount; ++i) {
- QString itemText = QString("setItemData(EditRole) %1").arg(i);
+ QString itemText = QLatin1String("setItemData(EditRole) ") + QString::number(i);
QCOMPARE(comboBox.itemText(i), itemText);
QCOMPARE(comboBox.itemData(i, Qt::DisplayRole).toString(), itemText);
QCOMPARE(comboBox.itemData(i, Qt::EditRole).toString(), itemText);
@@ -2993,14 +2993,14 @@ void tst_QComboBox::itemData()
// set additional user data in the addItem call
for (int i = 0; i < itemCount; ++i) {
- QString itemText = QString("item text %1").arg(i);
- QString itemDataText = QString("item data %1").arg(i);
- comboBox.addItem(itemText, QVariant(itemDataText));
+ const QString iS = QString::number(i);
+ comboBox.addItem(QLatin1String("item text ") + iS, QVariant(QLatin1String("item data ") + iS));
}
for (int i = 0; i < itemCount; ++i) {
- QString itemText = QString("item text %1").arg(i);
- QString itemDataText = QString("item data %1").arg(i);
+ const QString iS = QString::number(i);
+ QString itemText = QLatin1String("item text ") + iS;
+ QString itemDataText = QLatin1String("item data ") + iS;
QCOMPARE(comboBox.itemData(i, Qt::DisplayRole).toString(), itemText);
QCOMPARE(comboBox.itemData(i, Qt::EditRole).toString(), itemText);
QCOMPARE(comboBox.itemData(i).toString(), itemDataText);
@@ -3023,8 +3023,9 @@ void tst_QComboBox::itemData()
QString qtlogoPath = QFINDTESTDATA("qtlogo.png");
QIcon icon = QIcon(QPixmap(qtlogoPath));
for (int i = 0; i < itemCount; ++i) {
- QString itemText = QString("item text %1").arg(i);
- QString itemDataText = QString("item data %1").arg(i);
+ const QString iS = QString::number(i);
+ QString itemText = QLatin1String("item text ") + iS;
+ QString itemDataText = QLatin1String("item data ") + iS;
double d = i;
comboBox.addItem(itemText);
comboBox.setItemData(i, QVariant(itemDataText), Qt::UserRole);
@@ -3033,8 +3034,9 @@ void tst_QComboBox::itemData()
}
for (int i = 0; i < itemCount; ++i) {
- QString itemText = QString("item text %1").arg(i);
- QString itemDataText = QString("item data %1").arg(i);
+ const QString iS = QString::number(i);
+ QString itemText = QLatin1String("item text ") + iS;
+ QString itemDataText = QLatin1String("item data ") + iS;
double d = i;
QCOMPARE(comboBox.itemData(i, Qt::DisplayRole).toString(), itemText);
QCOMPARE(comboBox.itemData(i, Qt::EditRole).toString(), itemText);
diff --git a/tests/auto/widgets/widgets/qcommandlinkbutton/tst_qcommandlinkbutton.cpp b/tests/auto/widgets/widgets/qcommandlinkbutton/tst_qcommandlinkbutton.cpp
index a57553097a..2f761d3864 100644
--- a/tests/auto/widgets/widgets/qcommandlinkbutton/tst_qcommandlinkbutton.cpp
+++ b/tests/auto/widgets/widgets/qcommandlinkbutton/tst_qcommandlinkbutton.cpp
@@ -48,16 +48,12 @@
class tst_QCommandLinkButton : public QObject
{
Q_OBJECT
-public:
- tst_QCommandLinkButton();
- virtual ~tst_QCommandLinkButton();
-public slots:
+private slots:
void initTestCase();
void cleanupTestCase();
void init();
- void cleanup();
-private slots:
+
void getSetCheck();
void pressed();
void setAccel();
@@ -112,14 +108,6 @@ void tst_QCommandLinkButton::getSetCheck()
delete var1;
}
-tst_QCommandLinkButton::tst_QCommandLinkButton()
-{
-}
-
-tst_QCommandLinkButton::~tst_QCommandLinkButton()
-{
-}
-
void tst_QCommandLinkButton::initTestCase()
{
// Create the test class
@@ -153,10 +141,6 @@ void tst_QCommandLinkButton::init()
resetCounters();
}
-void tst_QCommandLinkButton::cleanup()
-{
-}
-
void tst_QCommandLinkButton::resetCounters()
{
toggle_count = 0;
diff --git a/tests/auto/widgets/widgets/qdatetimeedit/qdatetimeedit.pro b/tests/auto/widgets/widgets/qdatetimeedit/qdatetimeedit.pro
index 690edd5c9e..411185ae2a 100644
--- a/tests/auto/widgets/widgets/qdatetimeedit/qdatetimeedit.pro
+++ b/tests/auto/widgets/widgets/qdatetimeedit/qdatetimeedit.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qdatetimeedit
QT += widgets testlib core-private widgets-private
SOURCES += tst_qdatetimeedit.cpp
diff --git a/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp b/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp
index d41398046f..42353a6ea5 100644
--- a/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp
+++ b/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp
@@ -125,15 +125,13 @@ public:
class tst_QDateTimeEdit : public QObject
{
Q_OBJECT
-public:
- tst_QDateTimeEdit();
- virtual ~tst_QDateTimeEdit();
-public slots:
+
+private slots:
void initTestCase();
void init();
void cleanup();
void cleanupTestCase();
-private slots:
+
void cachedDayTest();
void getSetCheck();
void constructor_qwidget();
@@ -314,14 +312,6 @@ void tst_QDateTimeEdit::getSetCheck()
QCOMPARE(timeEdit.inputMethodQuery(Qt::ImHints), QVariant(int(Qt::ImhPreferNumbers)));
}
-tst_QDateTimeEdit::tst_QDateTimeEdit()
-{
-}
-
-tst_QDateTimeEdit::~tst_QDateTimeEdit()
-{
-}
-
void tst_QDateTimeEdit::initTestCase()
{
QLocale system = QLocale::system();
@@ -3436,7 +3426,7 @@ void tst_QDateTimeEdit::deleteCalendarWidget()
// it should create a new widget
QVERIFY(edit.calendarWidget());
- QVERIFY(edit.calendarWidget()->objectName() != "cw1");
+ QVERIFY(edit.calendarWidget()->objectName() != QLatin1String("cw1"));
}
}
diff --git a/tests/auto/widgets/widgets/qdial/qdial.pro b/tests/auto/widgets/widgets/qdial/qdial.pro
index 0af9633236..9bdd61f9d5 100644
--- a/tests/auto/widgets/widgets/qdial/qdial.pro
+++ b/tests/auto/widgets/widgets/qdial/qdial.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qdial
QT += widgets testlib
SOURCES += tst_qdial.cpp
diff --git a/tests/auto/widgets/widgets/qdialogbuttonbox/qdialogbuttonbox.pro b/tests/auto/widgets/widgets/qdialogbuttonbox/qdialogbuttonbox.pro
index 9892c48e0c..7f2ad59581 100644
--- a/tests/auto/widgets/widgets/qdialogbuttonbox/qdialogbuttonbox.pro
+++ b/tests/auto/widgets/widgets/qdialogbuttonbox/qdialogbuttonbox.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
QT += widgets testlib
SOURCES += tst_qdialogbuttonbox.cpp
diff --git a/tests/auto/widgets/widgets/qdockwidget/qdockwidget.pro b/tests/auto/widgets/widgets/qdockwidget/qdockwidget.pro
index eca396f1a8..5c1ef52036 100644
--- a/tests/auto/widgets/widgets/qdockwidget/qdockwidget.pro
+++ b/tests/auto/widgets/widgets/qdockwidget/qdockwidget.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qdockwidget
QT += widgets widgets-private testlib
QT += core-private gui-private
diff --git a/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp b/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp
index 713dc6b9b8..7d84f43131 100644
--- a/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp
+++ b/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp
@@ -908,9 +908,6 @@ void tst_QDockWidget::task237438_setFloatingCrash()
void tst_QDockWidget::task248604_infiniteResize()
{
-#if defined Q_OS_BLACKBERRY
- QSKIP("Top level window is stretched to fullscreen");
-#endif
QDockWidget d;
QTabWidget *t = new QTabWidget;
t->addTab(new QWidget, "Foo");
diff --git a/tests/auto/widgets/widgets/qdoublespinbox/tst_qdoublespinbox.cpp b/tests/auto/widgets/widgets/qdoublespinbox/tst_qdoublespinbox.cpp
index 6a1ce17aab..378bedbe84 100644
--- a/tests/auto/widgets/widgets/qdoublespinbox/tst_qdoublespinbox.cpp
+++ b/tests/auto/widgets/widgets/qdoublespinbox/tst_qdoublespinbox.cpp
@@ -214,12 +214,15 @@ void tst_QDoubleSpinBox::setPrefixSuffix_data()
QTest::newRow("data0") << QString() << QString() << 10.5 << 1 << "10.5" << "10.5" << false;
QTest::newRow("data1") << QString() << "cm" << 10.5 << 2 << "10.50cm" << "10.50" << false;
- QTest::newRow("data2") << "cm: " << QString() << 10.5 << 0 << "cm: 10" << "10" << false;
+
+ // 10.5 is rounded correctly to 11 when using libdouble-conversion, or incorrectly to 10 when
+ // using snprintf. This is not the point of this test, though.
+ QTest::newRow("data2") << "cm: " << QString() << 10.4 << 0 << "cm: 10" << "10" << false;
QTest::newRow("data3") << "length: " << "cm" << 10.5 << 3 << "length: 10.500cm" << "10.500" << false;
QTest::newRow("data4") << QString() << QString() << 10.5 << 1 << "10.5" << "10.5" << true;
QTest::newRow("data5") << QString() << "cm" << 10.5 << 2 << "10.50cm" << "10.50" << true;
- QTest::newRow("data6") << "cm: " << QString() << 10.5 << 0 << "cm: 10" << "10" << true;
+ QTest::newRow("data6") << "cm: " << QString() << 10.4 << 0 << "cm: 10" << "10" << true;
QTest::newRow("data7") << "length: " << "cm" << 10.5 << 3 << "length: 10.500cm" << "10.500" << true;
}
@@ -817,8 +820,10 @@ void tst_QDoubleSpinBox::editingFinished()
QCOMPARE(editingFinishedSpy1.count(), 4);
QCOMPARE(editingFinishedSpy2.count(), 4);
- testFocusWidget->show(); // On BlackBerry this is our root window we need to show it again
- // otherwise subsequent tests will fail
+ // On some platforms this is our root window
+ // we need to show it again otherwise subsequent
+ // tests will fail
+ testFocusWidget->show();
}
void tst_QDoubleSpinBox::removeAll()
diff --git a/tests/auto/widgets/widgets/qfocusframe/qfocusframe.pro b/tests/auto/widgets/widgets/qfocusframe/qfocusframe.pro
index 6fa0589f95..404edcd075 100644
--- a/tests/auto/widgets/widgets/qfocusframe/qfocusframe.pro
+++ b/tests/auto/widgets/widgets/qfocusframe/qfocusframe.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qfocusframe
QT += widgets testlib
SOURCES += tst_qfocusframe.cpp
diff --git a/tests/auto/widgets/widgets/qfontcombobox/qfontcombobox.pro b/tests/auto/widgets/widgets/qfontcombobox/qfontcombobox.pro
index b21729bb9b..418789ac0f 100644
--- a/tests/auto/widgets/widgets/qfontcombobox/qfontcombobox.pro
+++ b/tests/auto/widgets/widgets/qfontcombobox/qfontcombobox.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qfontcombobox
QT += widgets testlib
SOURCES += tst_qfontcombobox.cpp
diff --git a/tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp b/tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp
index 5d6fdf2851..3b4d817b58 100644
--- a/tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp
+++ b/tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp
@@ -39,12 +39,6 @@ class tst_QFontComboBox : public QObject
{
Q_OBJECT
-public slots:
- void initTestCase();
- void cleanupTestCase();
- void init();
- void cleanup();
-
private slots:
void qfontcombobox_data();
void qfontcombobox();
@@ -69,28 +63,6 @@ public:
{ return SubQFontComboBox::event(e); }
};
-// This will be called before the first test function is executed.
-// It is only called once.
-void tst_QFontComboBox::initTestCase()
-{
-}
-
-// This will be called after the last test function is executed.
-// It is only called once.
-void tst_QFontComboBox::cleanupTestCase()
-{
-}
-
-// This will be called before each test function is executed.
-void tst_QFontComboBox::init()
-{
-}
-
-// This will be called after every test function.
-void tst_QFontComboBox::cleanup()
-{
-}
-
void tst_QFontComboBox::qfontcombobox_data()
{
}
@@ -248,7 +220,7 @@ void tst_QFontComboBox::writingSystem_data()
QTest::newRow("Runic") << QFontDatabase::Runic;
for (int i = 0; i < 31; ++i)
- QTest::newRow(qPrintable(QString("enum %1").arg(i))) << (QFontDatabase::WritingSystem)i;
+ QTest::newRow(("enum " + QByteArray::number(i)).constData()) << (QFontDatabase::WritingSystem)i;
}
// public QFontDatabase::WritingSystem writingSystem() const
diff --git a/tests/auto/widgets/widgets/qframe/tst_qframe.cpp b/tests/auto/widgets/widgets/qframe/tst_qframe.cpp
index 81a6ba2ee3..03bd79683f 100644
--- a/tests/auto/widgets/widgets/qframe/tst_qframe.cpp
+++ b/tests/auto/widgets/widgets/qframe/tst_qframe.cpp
@@ -73,22 +73,24 @@ static void provideFrameData()
for (int lineWidth = 0; lineWidth < 3; ++lineWidth) {
for (int midLineWidth = 0; midLineWidth < 3; ++midLineWidth) {
- QTest::newRow(qPrintable(QStringLiteral("box_noshadow_%1_%2").arg(lineWidth).arg(midLineWidth)))
- << "box_noshadow" << lineWidth << midLineWidth << QFrame::Box << (QFrame::Shadow)0;
- QTest::newRow(qPrintable(QStringLiteral("box_plain_%1_%2").arg(lineWidth).arg(midLineWidth)))
+ const QByteArray postFix = '_' + QByteArray::number(lineWidth) + '_'
+ + QByteArray::number(midLineWidth);
+ QTest::newRow(("box_noshadow" + postFix).constData())
+ << "box_noshadow" << lineWidth << midLineWidth << QFrame::Box << (QFrame::Shadow)0;
+ QTest::newRow(("box_plain" + postFix).constData())
<< "box_plain" << lineWidth << midLineWidth << QFrame::Box << QFrame::Plain;
- QTest::newRow(qPrintable(QStringLiteral("box_raised_%1_%2").arg(lineWidth).arg(midLineWidth)))
+ QTest::newRow(("box_raised" + postFix).constData())
<< "box_raised" << lineWidth << midLineWidth << QFrame::Box << QFrame::Raised;
- QTest::newRow(qPrintable(QStringLiteral("box_sunken_%1_%2").arg(lineWidth).arg(midLineWidth)))
+ QTest::newRow(("box_sunken" + postFix).constData())
<< "box_sunken" << lineWidth << midLineWidth << QFrame::Box << QFrame::Sunken;
- QTest::newRow(qPrintable(QStringLiteral("winpanel_noshadow_%1_%2").arg(lineWidth).arg(midLineWidth)))
+ QTest::newRow(("winpanel_noshadow" + postFix).constData())
<< "winpanel_noshadow" << lineWidth << midLineWidth << QFrame::WinPanel << (QFrame::Shadow)0;
- QTest::newRow(qPrintable(QStringLiteral("winpanel_plain_%1_%2").arg(lineWidth).arg(midLineWidth)))
+ QTest::newRow(("winpanel_plain" + postFix).constData())
<< "winpanel_plain" << lineWidth << midLineWidth << QFrame::WinPanel << QFrame::Plain;
- QTest::newRow(qPrintable(QStringLiteral("winpanel_raised_%1_%2").arg(lineWidth).arg(midLineWidth)))
+ QTest::newRow(("winpanel_raised" + postFix).constData())
<< "winpanel_raised" << lineWidth << midLineWidth << QFrame::WinPanel << QFrame::Raised;
- QTest::newRow(qPrintable(QStringLiteral("winpanel_sunken_%1_%2").arg(lineWidth).arg(midLineWidth)))
+ QTest::newRow(("winpanel_sunken" + postFix).constData())
<< "winpanel_sunken" << lineWidth << midLineWidth << QFrame::WinPanel << QFrame::Sunken;
}
}
@@ -174,7 +176,10 @@ void tst_QFrame::testPainting()
const QPixmap pixmap = frame.grab();
- const QString referenceFilePath = QFINDTESTDATA(QStringLiteral("images/%1_%2_%3.png").arg(basename).arg(lineWidth).arg(midLineWidth));
+ const QString fileName = QLatin1String("images/") + basename + QLatin1Char('_')
+ + QString::number(lineWidth) + QLatin1Char('_') + QString::number(midLineWidth)
+ + QLatin1String(".png");
+ const QString referenceFilePath = QFINDTESTDATA(fileName);
const QPixmap referencePixmap(referenceFilePath);
QVERIFY2(!referencePixmap.isNull(), qPrintable(QStringLiteral("Could not load reference pixmap %1").arg(referenceFilePath)));
QCOMPARE(pixmap, referencePixmap);
diff --git a/tests/auto/widgets/widgets/qgroupbox/tst_qgroupbox.cpp b/tests/auto/widgets/widgets/qgroupbox/tst_qgroupbox.cpp
index 53eec99258..d7a03deb45 100644
--- a/tests/auto/widgets/widgets/qgroupbox/tst_qgroupbox.cpp
+++ b/tests/auto/widgets/widgets/qgroupbox/tst_qgroupbox.cpp
@@ -73,6 +73,7 @@ private slots:
void childrenAreDisabled();
void propagateFocus();
void task_QTBUG_19170_ignoreMouseReleseEvent();
+ void task_QTBUG_15519_propagateMouseEvents();
private:
bool checked;
@@ -80,6 +81,7 @@ private:
qint64 clickTimeStamp;
qint64 toggleTimeStamp;
+ static void sendMouseMoveEvent(QWidget *widget, const QPoint &localPos);
};
tst_QGroupBox::tst_QGroupBox()
@@ -502,5 +504,114 @@ void tst_QGroupBox::task_QTBUG_19170_ignoreMouseReleseEvent()
QCOMPARE(box.isChecked(), false);
}
+class MouseEventTestWidget : public QWidget
+{
+public:
+ bool mousePressed;
+ bool mouseReleased;
+ bool mouseMoved;
+
+ void reset()
+ {
+ mousePressed = false;
+ mouseReleased = false;
+ mouseMoved = false;
+ }
+
+protected:
+ void mousePressEvent(QMouseEvent*)
+ {
+ mousePressed = true;
+ }
+
+ void mouseReleaseEvent(QMouseEvent*)
+ {
+ mouseReleased = true;
+ }
+
+ void mouseMoveEvent(QMouseEvent*)
+ {
+ mouseMoved = true;
+ }
+};
+
+void tst_QGroupBox::task_QTBUG_15519_propagateMouseEvents()
+{
+ MouseEventTestWidget parent;
+ QGroupBox box(&parent);
+ parent.setMouseTracking(true);
+ box.setMouseTracking(true);
+ box.resize(100, 100);
+ box.setTitle("This is a test for QTBUG-15519");
+ box.show();
+
+ QStyleOptionGroupBox option;
+ option.initFrom(&box);
+ option.subControls = QStyle::SubControls(QStyle::SC_All);
+ QRect checkBoxRect = box.style()->subControlRect(QStyle::CC_GroupBox, &option,
+ QStyle::SC_GroupBoxCheckBox, &box);
+
+ // Without a checkbox, all mouse events should propagate
+
+ parent.reset();
+ QTest::mousePress(&box, Qt::LeftButton, 0, checkBoxRect.center());
+ QCOMPARE(parent.mousePressed, true);
+
+ parent.reset();
+ QTest::mousePress(&box, Qt::LeftButton, 0, box.rect().center());
+ QCOMPARE(parent.mousePressed, true);
+
+ parent.reset();
+ QTest::mouseRelease(&box, Qt::LeftButton, 0, checkBoxRect.center());
+ QCOMPARE(parent.mouseReleased, true);
+
+ parent.reset();
+ QTest::mouseRelease(&box, Qt::LeftButton, 0, box.rect().center());
+ QCOMPARE(parent.mouseReleased, true);
+
+ parent.reset();
+ sendMouseMoveEvent(&box, checkBoxRect.center());
+ QCOMPARE(parent.mouseMoved, true);
+
+ parent.reset();
+ sendMouseMoveEvent(&box, box.rect().center());
+ QCOMPARE(parent.mouseMoved, true);
+
+ // With a checkbox, presses and releases to the checkbox should not propagate
+
+ box.setCheckable(true);
+
+ parent.reset();
+ QTest::mousePress(&box, Qt::LeftButton, 0, checkBoxRect.center());
+ QCOMPARE(parent.mousePressed, false);
+
+ parent.reset();
+ QTest::mousePress(&box, Qt::LeftButton, 0, box.rect().center());
+ QCOMPARE(parent.mousePressed, true);
+
+ parent.reset();
+ QTest::mouseRelease(&box, Qt::LeftButton, 0, checkBoxRect.center());
+ QCOMPARE(parent.mouseReleased, false);
+
+ parent.reset();
+ QTest::mouseRelease(&box, Qt::LeftButton, 0, box.rect().center());
+ QCOMPARE(parent.mouseReleased, true);
+
+ parent.reset();
+ sendMouseMoveEvent(&box, checkBoxRect.center());
+ QCOMPARE(parent.mouseMoved, true);
+
+ parent.reset();
+ sendMouseMoveEvent(&box, box.rect().center());
+ QCOMPARE(parent.mouseMoved, true);
+}
+
+void tst_QGroupBox::sendMouseMoveEvent(QWidget *widget, const QPoint &localPos)
+{
+ // Send a MouseMove event without actually moving the pointer
+ QMouseEvent event(QEvent::MouseMove, localPos, Qt::NoButton, Qt::NoButton, Qt::NoModifier);
+ QApplication::sendEvent(widget, &event);
+}
+
QTEST_MAIN(tst_QGroupBox)
#include "tst_qgroupbox.moc"
diff --git a/tests/auto/widgets/widgets/qkeysequenceedit/qkeysequenceedit.pro b/tests/auto/widgets/widgets/qkeysequenceedit/qkeysequenceedit.pro
index 097cb00d11..c660b398ce 100644
--- a/tests/auto/widgets/widgets/qkeysequenceedit/qkeysequenceedit.pro
+++ b/tests/auto/widgets/widgets/qkeysequenceedit/qkeysequenceedit.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qkeysequenceedit
QT += widgets testlib
SOURCES += tst_qkeysequenceedit.cpp
diff --git a/tests/auto/widgets/widgets/qlabel/qlabel.pro b/tests/auto/widgets/widgets/qlabel/qlabel.pro
index 6c259bc5a3..6a5757fb5c 100644
--- a/tests/auto/widgets/widgets/qlabel/qlabel.pro
+++ b/tests/auto/widgets/widgets/qlabel/qlabel.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qlabel
QT += widgets widgets-private testlib
diff --git a/tests/auto/widgets/widgets/qlcdnumber/qlcdnumber.pro b/tests/auto/widgets/widgets/qlcdnumber/qlcdnumber.pro
index 220380b1d5..1508806fb0 100644
--- a/tests/auto/widgets/widgets/qlcdnumber/qlcdnumber.pro
+++ b/tests/auto/widgets/widgets/qlcdnumber/qlcdnumber.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qlcdnumber
QT += widgets testlib
SOURCES += tst_qlcdnumber.cpp
diff --git a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp
index b46609c371..db42ed3119 100644
--- a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp
+++ b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp
@@ -64,6 +64,7 @@
#include <qsortfilterproxymodel.h>
#include <qdebug.h>
#include <qscreen.h>
+#include <qshortcut.h>
#include "qcommonstyle.h"
#include "qstyleoption.h"
@@ -131,14 +132,13 @@ public:
enum EventStates { Press, Release, Click };
tst_QLineEdit();
- virtual ~tst_QLineEdit();
-public slots:
+private slots:
void initTestCase();
void cleanupTestCase();
void init();
void cleanup();
-private slots:
+
void getSetCheck();
void experimental();
@@ -313,6 +313,9 @@ private slots:
void shouldShowPlaceholderText();
void QTBUG1266_setInputMaskEmittingTextEdited();
+ void shortcutOverrideOnReadonlyLineEdit_data();
+ void shortcutOverrideOnReadonlyLineEdit();
+
protected slots:
void editingFinished();
@@ -377,10 +380,6 @@ tst_QLineEdit::tst_QLineEdit() : validInput(false), m_testWidget(0), m_keyboardS
}
}
-tst_QLineEdit::~tst_QLineEdit()
-{
-}
-
QLineEdit *tst_QLineEdit::ensureTestWidget()
{
if (!m_testWidget) {
@@ -2245,6 +2244,7 @@ void tst_QLineEdit::deleteSelectedText()
edit.setText(text);
edit.selectAll();
+#ifndef QT_NO_CONTEXTMENU
QMenu *menu = edit.createStandardContextMenu();
for (int i = 0; i < menu->actions().count(); ++i) {
QAction *current = menu->actions().at(i);
@@ -2253,6 +2253,7 @@ void tst_QLineEdit::deleteSelectedText()
QVERIFY(edit.text().isEmpty());
}
}
+#endif // QT_NO_CONTEXTMENU
}
@@ -2888,6 +2889,11 @@ void tst_QLineEdit::insert()
QCOMPARE(testWidget->text(), QString("No Crash! This is a nice test"));
}
+static inline QByteArray selectionTestName(int start, int length)
+{
+ return "selection start: " + QByteArray::number(start) + " length: " + QByteArray::number(length);
+}
+
void tst_QLineEdit::setSelection_data()
{
QTest::addColumn<QString>("text");
@@ -2901,39 +2907,39 @@ void tst_QLineEdit::setSelection_data()
int start, length, pos;
start = 0; length = 1; pos = 1;
- QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
+ QTest::newRow(selectionTestName(start, length).constData())
<< text << start << length << pos << QString("A") << true;
start = 0; length = 2; pos = 2;
- QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
+ QTest::newRow(selectionTestName(start, length).constData())
<< text << start << length << pos << QString("Ab") << true;
start = 0; length = 4; pos = 4;
- QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
+ QTest::newRow(selectionTestName(start, length).constData())
<< text << start << length << pos << QString("Abc ") << true;
start = -1; length = 0; pos = text.length();
- QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
+ QTest::newRow(selectionTestName(start, length).constData())
<< text << start << length << pos << QString() << false;
start = 34; length = 1; pos = 35;
- QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
+ QTest::newRow(selectionTestName(start, length).constData())
<< text << start << length << pos << QString("z") << true;
start = 34; length = 2; pos = 35;
- QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
+ QTest::newRow(selectionTestName(start, length).constData())
<< text << start << length << pos << QString("z") << true;
start = 34; length = -1; pos = 33;
- QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
+ QTest::newRow(selectionTestName(start, length).constData())
<< text << start << length << pos << QString("y") << true;
start = 1; length = -2; pos = 0;
- QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
+ QTest::newRow(selectionTestName(start, length).constData())
<< text << start << length << pos << QString("A") << true;
start = -1; length = -1; pos = text.length();
- QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
+ QTest::newRow(selectionTestName(start, length).constData())
<< text << start << length << pos << QString() << false;
}
@@ -3314,7 +3320,7 @@ void tst_QLineEdit::inlineCompletion()
QStandardItem *root = model->invisibleRootItem();
QStandardItem *items[5];
for (int i = 0; i < 5; i++) {
- items[i] = new QStandardItem(QString("item%1").arg(i));
+ items[i] = new QStandardItem(QLatin1String("item") + QString::number(i));
if ((i+2)%2 == 0) { // disable 0,2,4
items[i]->setFlags(items[i]->flags() & ~Qt::ItemIsEnabled);
}
@@ -4504,5 +4510,61 @@ void tst_QLineEdit::QTBUG1266_setInputMaskEmittingTextEdited()
QCOMPARE(spy.count(), 0);
}
+void tst_QLineEdit::shortcutOverrideOnReadonlyLineEdit_data()
+{
+ QTest::addColumn<QKeySequence>("keySequence");
+ QTest::addColumn<bool>("shouldBeHandledByQLineEdit");
+
+ QTest::newRow("Copy") << QKeySequence(QKeySequence::Copy) << true;
+ QTest::newRow("MoveToNextChar") << QKeySequence(QKeySequence::MoveToNextChar) << true;
+ QTest::newRow("SelectAll") << QKeySequence(QKeySequence::SelectAll) << true;
+ QTest::newRow("Right press") << QKeySequence(Qt::Key_Right) << true;
+ QTest::newRow("Left press") << QKeySequence(Qt::Key_Left) << true;
+
+ QTest::newRow("Paste") << QKeySequence(QKeySequence::Paste) << false;
+ QTest::newRow("Paste") << QKeySequence(QKeySequence::Cut) << false;
+ QTest::newRow("Undo") << QKeySequence(QKeySequence::Undo) << false;
+ QTest::newRow("Redo") << QKeySequence(QKeySequence::Redo) << false;
+
+ QTest::newRow("a") << QKeySequence(Qt::Key_A) << false;
+ QTest::newRow("b") << QKeySequence(Qt::Key_B) << false;
+ QTest::newRow("c") << QKeySequence(Qt::Key_C) << false;
+ QTest::newRow("x") << QKeySequence(Qt::Key_X) << false;
+ QTest::newRow("X") << QKeySequence(Qt::ShiftModifier + Qt::Key_X) << false;
+
+ QTest::newRow("Alt+Home") << QKeySequence(Qt::AltModifier + Qt::Key_Home) << false;
+}
+
+void tst_QLineEdit::shortcutOverrideOnReadonlyLineEdit()
+{
+ QFETCH(QKeySequence, keySequence);
+ QFETCH(bool, shouldBeHandledByQLineEdit);
+
+ QWidget widget;
+
+ QShortcut *shortcut = new QShortcut(keySequence, &widget);
+ QSignalSpy spy(shortcut, &QShortcut::activated);
+ QVERIFY(spy.isValid());
+
+ QLineEdit *lineEdit = new QLineEdit(QStringLiteral("Test"), &widget);
+ lineEdit->setReadOnly(true);
+ lineEdit->setFocus();
+
+ widget.show();
+
+ QVERIFY(QTest::qWaitForWindowActive(&widget));
+
+ const int keySequenceCount = keySequence.count();
+ for (int i = 0; i < keySequenceCount; ++i) {
+ const uint key = keySequence[i];
+ QTest::keyClick(lineEdit,
+ Qt::Key(key & ~Qt::KeyboardModifierMask),
+ Qt::KeyboardModifier(key & Qt::KeyboardModifierMask));
+ }
+
+ const int activationCount = shouldBeHandledByQLineEdit ? 0 : 1;
+ QCOMPARE(spy.count(), activationCount);
+}
+
QTEST_MAIN(tst_QLineEdit)
#include "tst_qlineedit.moc"
diff --git a/tests/auto/widgets/widgets/qmainwindow/qmainwindow.pro b/tests/auto/widgets/widgets/qmainwindow/qmainwindow.pro
index bd4fc6ba97..7e0a5320b0 100644
--- a/tests/auto/widgets/widgets/qmainwindow/qmainwindow.pro
+++ b/tests/auto/widgets/widgets/qmainwindow/qmainwindow.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qmainwindow
QT += widgets widgets-private testlib
SOURCES += tst_qmainwindow.cpp
diff --git a/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp b/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp
index 6282028746..ebf05ca300 100644
--- a/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp
+++ b/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp
@@ -1369,7 +1369,7 @@ void tst_QMainWindow::restoreStateFromPreviousVersion()
QVector<QDockWidget*> docks;
for(int i = 0; i < 16; ++i) {
- const QString name = QString::fromLatin1("dock %1").arg(i);
+ const QString name = QStringLiteral("dock ") + QString::number(i);
QDockWidget *dock = new QDockWidget(name);
docks += dock;
dock->setObjectName(name);
diff --git a/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp b/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp
index e23634c515..83a4e3bb59 100644
--- a/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp
+++ b/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp
@@ -621,6 +621,11 @@ void tst_QMdiArea::showWindows()
//#define USE_SHOW
+static inline QString windowTitle(const QString &t, const QString &f)
+{
+ return t + QLatin1String(" - [") + f + QLatin1Char(']');
+}
+
void tst_QMdiArea::changeWindowTitle()
{
const QString mwc = QString::fromLatin1("MainWindow's Caption");
@@ -648,7 +653,7 @@ void tst_QMdiArea::changeWindowTitle()
widget->setWindowState(Qt::WindowMaximized);
#endif
#if !defined(Q_OS_MAC) && !defined(Q_OS_WINCE)
- QTRY_COMPARE( mw->windowTitle(), QString::fromLatin1("%1 - [%2]").arg(mwc).arg(wc) );
+ QTRY_COMPARE( mw->windowTitle(), windowTitle(mwc, wc) );
#endif
mw->hide();
@@ -657,7 +662,7 @@ void tst_QMdiArea::changeWindowTitle()
QVERIFY(QTest::qWaitForWindowExposed(mw));
#if !defined(Q_OS_MAC) && !defined(Q_OS_WINCE)
- QTRY_COMPARE( mw->windowTitle(), QString::fromLatin1("%1 - [%2]").arg(mwc).arg(wc) );
+ QTRY_COMPARE( mw->windowTitle(), windowTitle(mwc, wc) );
#endif
#ifdef USE_SHOW
@@ -675,11 +680,11 @@ void tst_QMdiArea::changeWindowTitle()
#endif
qApp->processEvents();
#if !defined(Q_OS_MAC) && !defined(Q_OS_WINCE)
- QTRY_COMPARE( mw->windowTitle(), QString::fromLatin1("%1 - [%2]").arg(mwc).arg(wc) );
+ QTRY_COMPARE( mw->windowTitle(), windowTitle(mwc, wc) );
widget->setWindowTitle( wc2 );
- QCOMPARE( mw->windowTitle(), QString::fromLatin1("%1 - [%2]").arg(mwc).arg(wc2) );
+ QCOMPARE( mw->windowTitle(), windowTitle(mwc, wc2) );
mw->setWindowTitle( mwc2 );
- QCOMPARE( mw->windowTitle(), QString::fromLatin1("%1 - [%2]").arg(mwc2).arg(wc2) );
+ QCOMPARE( mw->windowTitle(), windowTitle(mwc2, wc2) );
#endif
mw->show();
@@ -693,7 +698,7 @@ void tst_QMdiArea::changeWindowTitle()
qApp->processEvents();
#if !defined(Q_OS_MAC) && !defined(Q_OS_WINCE)
- QCOMPARE( mw->windowTitle(), QString::fromLatin1("%1 - [%2]").arg(mwc2).arg(wc2) );
+ QCOMPARE( mw->windowTitle(), windowTitle(mwc2, wc2) );
#endif
#ifdef USE_SHOW
widget->showNormal();
@@ -714,7 +719,7 @@ void tst_QMdiArea::changeWindowTitle()
#endif
qApp->processEvents();
#if !defined(Q_OS_MAC) && !defined(Q_OS_WINCE)
- QCOMPARE( mw->windowTitle(), QString::fromLatin1("%1 - [%2]").arg(mwc2).arg(wc2) );
+ QCOMPARE( mw->windowTitle(), windowTitle(mwc2, wc2) );
#endif
#ifdef USE_SHOW
@@ -2321,7 +2326,7 @@ void tst_QMdiArea::setViewMode()
iconPixmap.fill(Qt::red);
for (int i = 0; i < 5; ++i) {
QMdiSubWindow *subWindow = mdiArea.addSubWindow(new QWidget);
- subWindow->setWindowTitle(QString(QLatin1String("Title %1")).arg(i));
+ subWindow->setWindowTitle(QLatin1String("Title ") + QString::number(i));
subWindow->setWindowIcon(iconPixmap);
}
diff --git a/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp b/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp
index db252347ac..51176d8195 100644
--- a/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp
+++ b/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp
@@ -202,6 +202,7 @@ private slots:
void task_226929();
void styleChange();
void testFullScreenState();
+ void testRemoveBaseWidget();
};
void tst_QMdiSubWindow::initTestCase()
@@ -396,7 +397,7 @@ void tst_QMdiSubWindow::mainWindowSupport()
QMdiArea *nestedWorkspace = new QMdiArea; // :-)
window->setWidget(nestedWorkspace);
- window->widget()->setWindowTitle(QString::fromLatin1("Window %1").arg(i));
+ window->widget()->setWindowTitle(QLatin1String("Window ") + QString::number(i));
workspace->addSubWindow(window);
QVERIFY(!window->maximizedButtonsWidget());
@@ -423,8 +424,9 @@ void tst_QMdiSubWindow::mainWindowSupport()
QVERIFY(window->maximizedSystemMenuIconWidget());
QCOMPARE(window->maximizedSystemMenuIconWidget(), qobject_cast<QWidget *>(mainWindow.menuBar()
->cornerWidget(Qt::TopLeftCorner)));
- QCOMPARE(mainWindow.windowTitle(), QString::fromLatin1("%1 - [%2]")
- .arg(originalWindowTitle, window->widget()->windowTitle()));
+ const QString expectedTitle = originalWindowTitle + QLatin1String(" - [")
+ + window->widget()->windowTitle() + QLatin1Char(']');
+ QCOMPARE(mainWindow.windowTitle(), expectedTitle);
#endif
// Check that nested child windows don't set window title
@@ -432,7 +434,7 @@ void tst_QMdiSubWindow::mainWindowSupport()
QMdiSubWindow *nestedWindow = new QMdiSubWindow;
nestedWindow->setWidget(new QWidget);
nestedWorkspace->addSubWindow(nestedWindow);
- nestedWindow->widget()->setWindowTitle(QString::fromLatin1("NestedWindow %1").arg(i));
+ nestedWindow->widget()->setWindowTitle(QLatin1String("NestedWindow ") + QString::number(i));
nestedWindow->showMaximized();
qApp->processEvents();
QVERIFY(nestedWindow->isMaximized());
@@ -2080,6 +2082,27 @@ void tst_QMdiSubWindow::testFullScreenState()
QCOMPARE(subWindow->size(), QSize(300, 300));
}
+void tst_QMdiSubWindow::testRemoveBaseWidget()
+{
+ QMdiArea mdiArea;
+ mdiArea.show();
+
+ QWidget *widget1 = new QWidget;
+ mdiArea.addSubWindow(widget1);
+
+ QWidget *widget2 = new QWidget;
+ mdiArea.addSubWindow(widget2);
+
+ mdiArea.removeSubWindow(widget1);
+ QVERIFY(!widget1->parent());
+
+ widget2->setParent(widget1);
+ mdiArea.removeSubWindow(widget2);
+ QCOMPARE(widget2->parent(), widget1);
+
+ delete widget1;
+}
+
QTEST_MAIN(tst_QMdiSubWindow)
#include "tst_qmdisubwindow.moc"
diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
index b3f9c54f24..ec46d7e625 100644
--- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
+++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
@@ -555,7 +555,7 @@ void tst_QMenu::widgetActionFocus()
QMenu m;
QListWidget *l = new QListWidget(&m);
for (int i = 1; i<3 ; i++)
- l->addItem(QString("item%1").arg(i));
+ l->addItem(QStringLiteral("item" ) + QString::number(i));
QWidgetAction *wa = new QWidgetAction(&m);
wa->setDefaultWidget(l);
m.addAction(wa);
@@ -803,7 +803,7 @@ void tst_QMenu::task250673_activeMultiColumnSubMenuPosition()
uint i = 2;
while (main.columnCount() < 2) {
- main.addAction(QString("Item %1").arg(i));
+ main.addAction(QLatin1String("Item ") + QString::number(i));
++i;
QVERIFY(i<1000);
}
@@ -1077,7 +1077,7 @@ public:
MyMenu() : m_currentIndex(0)
{
for (int i = 0; i < 2; ++i)
- dialogActions[i] = addAction( QString("dialog %1").arg(i), dialogs + i, SLOT(exec()));
+ dialogActions[i] = addAction(QLatin1String("dialog ") + QString::number(i), dialogs + i, SLOT(exec()));
}
void activateAction(int index)
diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu_mac.mm b/tests/auto/widgets/widgets/qmenu/tst_qmenu_mac.mm
index b1708d8669..7130e79276 100644
--- a/tests/auto/widgets/widgets/qmenu/tst_qmenu_mac.mm
+++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu_mac.mm
@@ -31,7 +31,7 @@
**
****************************************************************************/
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#include <QMenu>
#include <QTest>
diff --git a/tests/auto/widgets/widgets/qopenglwidget/BLACKLIST b/tests/auto/widgets/widgets/qopenglwidget/BLACKLIST
index 725b8e93b4..86c7141268 100644
--- a/tests/auto/widgets/widgets/qopenglwidget/BLACKLIST
+++ b/tests/auto/widgets/widgets/qopenglwidget/BLACKLIST
@@ -1,2 +1,14 @@
[clearAndGrab]
opensuse-13.1
+
+#QTBUG-31611
+[painter]
+windows msvc-2010 32bit developer-build
+
+#QTBUG-31611
+[reparentToAlreadyCreated]
+windows msvc-2010 32bit developer-build
+
+#QTBUG-31611
+[reparentToNotYetCreated]
+windows msvc-2010 32bit developer-build
diff --git a/tests/auto/widgets/widgets/qopenglwidget/qopenglwidget.pro b/tests/auto/widgets/widgets/qopenglwidget/qopenglwidget.pro
index bbc6e987af..2d4cff9e10 100644
--- a/tests/auto/widgets/widgets/qopenglwidget/qopenglwidget.pro
+++ b/tests/auto/widgets/widgets/qopenglwidget/qopenglwidget.pro
@@ -1,8 +1,5 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qopenglwidget
QT += gui-private core-private testlib widgets
SOURCES += tst_qopenglwidget.cpp
-
-win32-msvc2010:contains(QT_CONFIG, angle):CONFIG += insignificant_test # QTBUG-31611
diff --git a/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp b/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp
index 44a554ad82..42a24ba908 100644
--- a/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp
+++ b/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp
@@ -49,17 +49,12 @@
class tst_QPushButton : public QObject
{
Q_OBJECT
-public:
- tst_QPushButton();
- virtual ~tst_QPushButton();
-
-public slots:
+private slots:
void initTestCase();
void cleanupTestCase();
void init();
- void cleanup();
-private slots:
+
void getSetCheck();
void autoRepeat();
void pressed();
@@ -109,14 +104,6 @@ void tst_QPushButton::getSetCheck()
delete var1;
}
-tst_QPushButton::tst_QPushButton()
-{
-}
-
-tst_QPushButton::~tst_QPushButton()
-{
-}
-
void tst_QPushButton::initTestCase()
{
// Create the test class
@@ -149,11 +136,6 @@ void tst_QPushButton::init()
resetCounters();
}
-void tst_QPushButton::cleanup()
-{
-}
-
-
void tst_QPushButton::resetCounters()
{
toggle_count = 0;
@@ -537,9 +519,6 @@ void tst_QPushButton::sizeHint_data()
#if !defined(QT_NO_STYLE_WINDOWS)
QTest::newRow("windows") << QString::fromLatin1("windows");
#endif
-#if !defined(QT_NO_STYLE_GTK)
- QTest::newRow("gtk") << QString::fromLatin1("gtk");
-#endif
#if defined(Q_OS_MAC) && !defined(QT_NO_STYLE_MAC)
QTest::newRow("macintosh") << QString::fromLatin1("macintosh");
#endif
diff --git a/tests/auto/widgets/widgets/qscrollarea/qscrollarea.pro b/tests/auto/widgets/widgets/qscrollarea/qscrollarea.pro
index 0cd706420e..bdf18a0252 100644
--- a/tests/auto/widgets/widgets/qscrollarea/qscrollarea.pro
+++ b/tests/auto/widgets/widgets/qscrollarea/qscrollarea.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qscrollarea
QT += widgets testlib
SOURCES += tst_qscrollarea.cpp
diff --git a/tests/auto/widgets/widgets/qscrollbar/qscrollbar.pro b/tests/auto/widgets/widgets/qscrollbar/qscrollbar.pro
index 8c6ea6e1d4..2863dd2034 100644
--- a/tests/auto/widgets/widgets/qscrollbar/qscrollbar.pro
+++ b/tests/auto/widgets/widgets/qscrollbar/qscrollbar.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qscrollbar
QT += widgets testlib
SOURCES += tst_qscrollbar.cpp
diff --git a/tests/auto/widgets/widgets/qsizegrip/qsizegrip.pro b/tests/auto/widgets/widgets/qsizegrip/qsizegrip.pro
index ceb897c612..1149b50feb 100644
--- a/tests/auto/widgets/widgets/qsizegrip/qsizegrip.pro
+++ b/tests/auto/widgets/widgets/qsizegrip/qsizegrip.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsizegrip
INCLUDEPATH += .
QT += widgets testlib
diff --git a/tests/auto/widgets/widgets/qslider/qslider.pro b/tests/auto/widgets/widgets/qslider/qslider.pro
index d0a61e5a95..4c8b061459 100644
--- a/tests/auto/widgets/widgets/qslider/qslider.pro
+++ b/tests/auto/widgets/widgets/qslider/qslider.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qslider
QT += widgets testlib
SOURCES += tst_qslider.cpp
diff --git a/tests/auto/widgets/widgets/qsplitter/qsplitter.pro b/tests/auto/widgets/widgets/qsplitter/qsplitter.pro
index c43847b11f..8ae745ea9d 100644
--- a/tests/auto/widgets/widgets/qsplitter/qsplitter.pro
+++ b/tests/auto/widgets/widgets/qsplitter/qsplitter.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsplitter
QT += widgets testlib
SOURCES += tst_qsplitter.cpp
diff --git a/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp b/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp
index a54ad6ecd0..9e854ff3ea 100644
--- a/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp
+++ b/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp
@@ -678,9 +678,9 @@ void tst_QSplitter::task187373_addAbstractScrollAreas_data()
classNames << QLatin1String("QTreeView");
foreach (QString className, classNames) {
- QTest::newRow(qPrintable(QString("%1 1").arg(className))) << className << false << true;
- QTest::newRow(qPrintable(QString("%1 2").arg(className))) << className << true << false;
- QTest::newRow(qPrintable(QString("%1 3").arg(className))) << className << true << true;
+ QTest::newRow(qPrintable(className + QLatin1String(" 1"))) << className << false << true;
+ QTest::newRow(qPrintable(className + QLatin1String(" 2"))) << className << true << false;
+ QTest::newRow(qPrintable(className + QLatin1String(" 3"))) << className << true << true;
}
}
diff --git a/tests/auto/widgets/widgets/qstackedwidget/tst_qstackedwidget.cpp b/tests/auto/widgets/widgets/qstackedwidget/tst_qstackedwidget.cpp
index d060c4ceae..2a2bc1edf8 100644
--- a/tests/auto/widgets/widgets/qstackedwidget/tst_qstackedwidget.cpp
+++ b/tests/auto/widgets/widgets/qstackedwidget/tst_qstackedwidget.cpp
@@ -149,7 +149,7 @@ private:
void createWidgets() {
for (int i = 0; i < m_n; ++i) {
QLineEdit *le = new QLineEdit(this);
- le->setObjectName(QString::fromLatin1("lineEdit%1").arg(i));
+ le->setObjectName(QLatin1String("lineEdit") + QString::number(i));
layout ()->addWidget(le);
m_les << le;
}
diff --git a/tests/auto/widgets/widgets/qstatusbar/tst_qstatusbar.cpp b/tests/auto/widgets/widgets/qstatusbar/tst_qstatusbar.cpp
index 991e72acd0..7b03368139 100644
--- a/tests/auto/widgets/widgets/qstatusbar/tst_qstatusbar.cpp
+++ b/tests/auto/widgets/widgets/qstatusbar/tst_qstatusbar.cpp
@@ -44,21 +44,13 @@ class tst_QStatusBar: public QObject
{
Q_OBJECT
-public:
- tst_QStatusBar();
- virtual ~tst_QStatusBar();
-
-
protected slots:
void messageChanged(const QString&);
-public slots:
- void initTestCase();
- void cleanupTestCase();
+private slots:
void init();
void cleanup();
-private slots:
void tempMessage();
void insertWidget();
void insertPermanentWidget();
@@ -73,14 +65,6 @@ private:
QString currentMessage;
};
-tst_QStatusBar::tst_QStatusBar()
-{
-}
-
-tst_QStatusBar::~tst_QStatusBar()
-{
-}
-
void tst_QStatusBar::init()
{
testWidget = new QStatusBar;
@@ -97,14 +81,6 @@ void tst_QStatusBar::cleanup()
delete testWidget;
}
-void tst_QStatusBar::initTestCase()
-{
-}
-
-void tst_QStatusBar::cleanupTestCase()
-{
-}
-
void tst_QStatusBar::messageChanged(const QString &m)
{
currentMessage = m;
diff --git a/tests/auto/widgets/widgets/qtabbar/qtabbar.pro b/tests/auto/widgets/widgets/qtabbar/qtabbar.pro
index 8772005bef..01b3c4a404 100644
--- a/tests/auto/widgets/widgets/qtabbar/qtabbar.pro
+++ b/tests/auto/widgets/widgets/qtabbar/qtabbar.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtabbar
QT += widgets testlib
SOURCES += tst_qtabbar.cpp
diff --git a/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp b/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp
index ced2253a74..b983e6954a 100644
--- a/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp
+++ b/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp
@@ -606,7 +606,7 @@ public slots:
void updateTabText()
{
count++;
- setTabText(0, QString("%1").arg(count));
+ setTabText(0, QString::number(count));
}
};
diff --git a/tests/auto/widgets/widgets/qtabwidget/tst_qtabwidget.cpp b/tests/auto/widgets/widgets/qtabwidget/tst_qtabwidget.cpp
index a991f18110..e5e0e5fe10 100644
--- a/tests/auto/widgets/widgets/qtabwidget/tst_qtabwidget.cpp
+++ b/tests/auto/widgets/widgets/qtabwidget/tst_qtabwidget.cpp
@@ -76,13 +76,11 @@ class QTabWidgetChild:public QTabWidget {
class tst_QTabWidget:public QObject {
Q_OBJECT
- public:
- tst_QTabWidget();
- public slots:
+private slots:
void init();
void cleanup();
- private slots:
+
void getSetCheck();
void testChild();
void addRemoveTab();
@@ -156,10 +154,6 @@ void tst_QTabWidget::getSetCheck()
QCOMPARE(w5, obj1.currentWidget()); // current not changed
}
-tst_QTabWidget::tst_QTabWidget()
-{
-}
-
void tst_QTabWidget::init()
{
tw = new QTabWidget(0);
diff --git a/tests/auto/widgets/widgets/qtextbrowser/tst_qtextbrowser.cpp b/tests/auto/widgets/widgets/qtextbrowser/tst_qtextbrowser.cpp
index adc768f828..4a8d1888d8 100644
--- a/tests/auto/widgets/widgets/qtextbrowser/tst_qtextbrowser.cpp
+++ b/tests/auto/widgets/widgets/qtextbrowser/tst_qtextbrowser.cpp
@@ -72,15 +72,11 @@ QVariant TestBrowser::loadResource(int type, const QUrl &name)
class tst_QTextBrowser : public QObject
{
Q_OBJECT
-public:
- tst_QTextBrowser();
- virtual ~tst_QTextBrowser();
-public slots:
+private slots:
void init();
void cleanup();
-private slots:
void noReloadOnAnchorJump();
void bgColorOnSourceChange();
void forwardButton();
@@ -104,14 +100,6 @@ private:
TestBrowser *browser;
};
-tst_QTextBrowser::tst_QTextBrowser()
-{
-}
-
-tst_QTextBrowser::~tst_QTextBrowser()
-{
-}
-
void tst_QTextBrowser::init()
{
QString prefix = QFileInfo(QFINDTESTDATA("subdir")).absolutePath();
diff --git a/tests/auto/widgets/widgets/qtoolbox/qtoolbox.pro b/tests/auto/widgets/widgets/qtoolbox/qtoolbox.pro
index a8c62ec54a..19b3a03443 100644
--- a/tests/auto/widgets/widgets/qtoolbox/qtoolbox.pro
+++ b/tests/auto/widgets/widgets/qtoolbox/qtoolbox.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtoolbox
QT += widgets testlib
SOURCES += tst_qtoolbox.cpp
diff --git a/tests/auto/widgets/widgets/qtoolbox/tst_qtoolbox.cpp b/tests/auto/widgets/widgets/qtoolbox/tst_qtoolbox.cpp
index b016811eeb..096ce28690 100644
--- a/tests/auto/widgets/widgets/qtoolbox/tst_qtoolbox.cpp
+++ b/tests/auto/widgets/widgets/qtoolbox/tst_qtoolbox.cpp
@@ -44,19 +44,13 @@ class tst_QToolBox : public QObject
{
Q_OBJECT
-public:
- tst_QToolBox();
- virtual ~tst_QToolBox();
-
protected slots:
void currentChanged(int);
-public slots:
- void initTestCase();
- void cleanupTestCase();
+private slots:
void init();
void cleanup();
-private slots:
+
void getSetCheck();
void populate();
void change();
@@ -106,14 +100,6 @@ void tst_QToolBox::getSetCheck()
QCOMPARE(w3, obj1.currentWidget());
}
-tst_QToolBox::tst_QToolBox()
-{
-}
-
-tst_QToolBox::~tst_QToolBox()
-{
-}
-
class tst_QToolBoxPrivate
{
public:
@@ -183,14 +169,6 @@ void tst_QToolBox::cleanup()
delete d;
}
-void tst_QToolBox::initTestCase()
-{
-}
-
-void tst_QToolBox::cleanupTestCase()
-{
-}
-
void tst_QToolBox::currentChanged(int index)
{
currentIndex = index;
diff --git a/tests/auto/xml/sax/qxml/qxml.pro b/tests/auto/xml/sax/qxml/qxml.pro
index e5fd4eafe3..e0b48ad9f5 100644
--- a/tests/auto/xml/sax/qxml/qxml.pro
+++ b/tests/auto/xml/sax/qxml/qxml.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qxml
SOURCES += tst_qxml.cpp
diff --git a/tests/baselineserver/src/baselineserver.cpp b/tests/baselineserver/src/baselineserver.cpp
index 4a36c022eb..b82ef6aed1 100644
--- a/tests/baselineserver/src/baselineserver.cpp
+++ b/tests/baselineserver/src/baselineserver.cpp
@@ -259,7 +259,7 @@ bool BaselineHandler::establishConnection()
logMsg += key + QLS(": '") + clientInfo.value(key) + QLS("', ");
}
qDebug() << runId << logtime() << "Connection established with" << clientInfo.value(PI_HostName)
- << "[" << qPrintable(clientInfo.value(PI_HostAddress)) << "]" << logMsg
+ << '[' << qPrintable(clientInfo.value(PI_HostAddress)) << ']' << logMsg
<< "Overrides:" << clientInfo.overrides() << "AdHoc-Run:" << clientInfo.isAdHocRun();
// ### Hardcoded backwards compatibility: add project field for certain existing clients that lack it
diff --git a/tests/baselineserver/src/report.cpp b/tests/baselineserver/src/report.cpp
index 2f04b0509e..527c1c065c 100644
--- a/tests/baselineserver/src/report.cpp
+++ b/tests/baselineserver/src/report.cpp
@@ -309,7 +309,7 @@ void Report::writeFunctionResults(const ImageItemList &list)
out << "<span style=\"color:green\"><small>No mismatch reported</small></span>";
break;
default:
- out << "?";
+ out << '?';
break;
}
out << "</td>\n";
@@ -401,14 +401,14 @@ QString Report::writeResultsXmlFiles()
if (!cwd.exists(dir))
cwd.mkpath(dir);
foreach (const QString &func, itemLists.keys()) {
- QFile f(dir + "/" + func + "-results.xml");
+ QFile f(dir + QLatin1Char('/') + func + "-results.xml");
if (!f.open(QIODevice::WriteOnly))
continue;
QXmlStreamWriter s(&f);
s.setAutoFormatting(true);
s.writeStartDocument();
foreach (QString key, plat.keys()) {
- QString cmt = " " + key + "=\"" + plat.value(key) +"\" ";
+ QString cmt = QLatin1Char(' ') + key + "=\"" + plat.value(key) +"\" ";
s.writeComment(cmt.replace("--", "[-]"));
}
s.writeStartElement("testsuite");
diff --git a/tests/benchmarks/corelib/codecs/qtextcodec/main.cpp b/tests/benchmarks/corelib/codecs/qtextcodec/main.cpp
index aa42c11fc7..ef6e41f4f3 100644
--- a/tests/benchmarks/corelib/codecs/qtextcodec/main.cpp
+++ b/tests/benchmarks/corelib/codecs/qtextcodec/main.cpp
@@ -56,11 +56,11 @@ void tst_QTextCodec::codecForName() const
QBENCHMARK {
foreach(const QByteArray& c, codecs) {
QVERIFY(QTextCodec::codecForName(c));
- QVERIFY(QTextCodec::codecForName(c + "-"));
+ QVERIFY(QTextCodec::codecForName(c + '-'));
}
foreach(const QByteArray& c, codecs) {
- QVERIFY(QTextCodec::codecForName(c + "+"));
- QVERIFY(QTextCodec::codecForName(c + "*"));
+ QVERIFY(QTextCodec::codecForName(c + '+'));
+ QVERIFY(QTextCodec::codecForName(c + '*'));
}
}
}
diff --git a/tests/benchmarks/corelib/codecs/qtextcodec/qtextcodec.pro b/tests/benchmarks/corelib/codecs/qtextcodec/qtextcodec.pro
index 5563004ca8..5ee577c256 100644
--- a/tests/benchmarks/corelib/codecs/qtextcodec/qtextcodec.pro
+++ b/tests/benchmarks/corelib/codecs/qtextcodec/qtextcodec.pro
@@ -4,4 +4,3 @@ SOURCES += main.cpp
TESTDATA = utf-8.txt
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/io/qdir/10000/10000.pro b/tests/benchmarks/corelib/io/qdir/10000/10000.pro
index 88654b3575..2e83dad071 100644
--- a/tests/benchmarks/corelib/io/qdir/10000/10000.pro
+++ b/tests/benchmarks/corelib/io/qdir/10000/10000.pro
@@ -4,4 +4,3 @@ TARGET = tst_bench_qdir_10000
SOURCES += bench_qdir_10000.cpp
QT = core testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/io/qdir/tree/tree.pro b/tests/benchmarks/corelib/io/qdir/tree/tree.pro
index fbc575c585..2998a13b57 100644
--- a/tests/benchmarks/corelib/io/qdir/tree/tree.pro
+++ b/tests/benchmarks/corelib/io/qdir/tree/tree.pro
@@ -5,4 +5,3 @@ SOURCES += bench_qdir_tree.cpp
RESOURCES += bench_qdir_tree.qrc
QT = core testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro b/tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro
index e61c50cd5d..3cfb0b44de 100644
--- a/tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro
+++ b/tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro
@@ -13,4 +13,3 @@ wince* {
DEPLOYMENT += corelibdir
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/io/qfile/main.cpp b/tests/benchmarks/corelib/io/qfile/main.cpp
index 8e836ebdff..13e1cb9e2f 100644
--- a/tests/benchmarks/corelib/io/qfile/main.cpp
+++ b/tests/benchmarks/corelib/io/qfile/main.cpp
@@ -602,7 +602,7 @@ void tst_qfile::createSmallFiles()
for (int i = 0; i < 1000; ++i)
#endif
{
- QFile f(tmpDirName+"/"+QString::number(i));
+ QFile f(tmpDirName + QLatin1Char('/') + QString::number(i));
f.open(QIODevice::WriteOnly);
f.seek(511);
f.putChar('\n');
@@ -641,7 +641,7 @@ void tst_qfile::readSmallFiles()
case(QFileBenchmark): {
QList<QFile*> fileList;
Q_FOREACH(QString file, files) {
- QFile *f = new QFile(tmpDirName+ "/" + file);
+ QFile *f = new QFile(tmpDirName + QLatin1Char('/') + file);
f->open(QIODevice::ReadOnly|textMode|bufferedMode);
fileList.append(f);
}
@@ -664,7 +664,7 @@ void tst_qfile::readSmallFiles()
case(QFSFileEngineBenchmark): {
QList<QFSFileEngine*> fileList;
Q_FOREACH(QString file, files) {
- QFSFileEngine *fse = new QFSFileEngine(tmpDirName+ "/" + file);
+ QFSFileEngine *fse = new QFSFileEngine(tmpDirName + QLatin1Char('/') + file);
fse->open(QIODevice::ReadOnly|textMode|bufferedMode);
fileList.append(fse);
}
@@ -685,7 +685,7 @@ void tst_qfile::readSmallFiles()
case(PosixBenchmark): {
QList<FILE*> fileList;
Q_FOREACH(QString file, files) {
- fileList.append(::fopen(QFile::encodeName(tmpDirName+ "/" + file).constData(), "rb"));
+ fileList.append(::fopen(QFile::encodeName(tmpDirName + QLatin1Char('/') + file).constData(), "rb"));
}
QBENCHMARK {
diff --git a/tests/benchmarks/corelib/io/qfile/qfile.pro b/tests/benchmarks/corelib/io/qfile/qfile.pro
index 6716dd549d..5f7b9af73f 100644
--- a/tests/benchmarks/corelib/io/qfile/qfile.pro
+++ b/tests/benchmarks/corelib/io/qfile/qfile.pro
@@ -4,4 +4,3 @@ QT = core core-private testlib
win32: DEFINES+= _CRT_SECURE_NO_WARNINGS
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/io/qfileinfo/qfileinfo.pro b/tests/benchmarks/corelib/io/qfileinfo/qfileinfo.pro
index b8cb50abf3..42e8708b02 100644
--- a/tests/benchmarks/corelib/io/qfileinfo/qfileinfo.pro
+++ b/tests/benchmarks/corelib/io/qfileinfo/qfileinfo.pro
@@ -7,4 +7,3 @@ QT += core-private testlib
CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/io/qiodevice/qiodevice.pro b/tests/benchmarks/corelib/io/qiodevice/qiodevice.pro
index 3b06fcbce6..7937436e13 100644
--- a/tests/benchmarks/corelib/io/qiodevice/qiodevice.pro
+++ b/tests/benchmarks/corelib/io/qiodevice/qiodevice.pro
@@ -1,10 +1,8 @@
TEMPLATE = app
TARGET = tst_bench_qiodevice
-TARGET.EPOCHEAPSIZE = 0x100000 0x2000000
QT = core testlib
CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/io/qprocess/test/test.pro b/tests/benchmarks/corelib/io/qprocess/test/test.pro
index eaae0c8254..b665525b17 100644
--- a/tests/benchmarks/corelib/io/qprocess/test/test.pro
+++ b/tests/benchmarks/corelib/io/qprocess/test/test.pro
@@ -2,4 +2,3 @@ TARGET = ../tst_bench_qprocess
SOURCES += ../tst_bench_qprocess.cpp
QT = core core-private testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/testProcessLoopback.pro b/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/testProcessLoopback.pro
index 8fd4db6b4b..cb8dfdcdcb 100644
--- a/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/testProcessLoopback.pro
+++ b/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/testProcessLoopback.pro
@@ -3,4 +3,3 @@ CONFIG -= qt app_bundle
CONFIG += console
winrt: QMAKE_LFLAGS += /ENTRY:mainCRTStartup
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/io/qtemporaryfile/qtemporaryfile.pro b/tests/benchmarks/corelib/io/qtemporaryfile/qtemporaryfile.pro
index 3dcba655f2..758930c139 100644
--- a/tests/benchmarks/corelib/io/qtemporaryfile/qtemporaryfile.pro
+++ b/tests/benchmarks/corelib/io/qtemporaryfile/qtemporaryfile.pro
@@ -6,4 +6,3 @@ QT = core testlib
CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/io/qtextstream/qtextstream.pro b/tests/benchmarks/corelib/io/qtextstream/qtextstream.pro
index 3dcba655f2..758930c139 100644
--- a/tests/benchmarks/corelib/io/qtextstream/qtextstream.pro
+++ b/tests/benchmarks/corelib/io/qtextstream/qtextstream.pro
@@ -6,4 +6,3 @@ QT = core testlib
CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/io/qurl/qurl.pro b/tests/benchmarks/corelib/io/qurl/qurl.pro
index e3beedc472..52f7bdc8b6 100644
--- a/tests/benchmarks/corelib/io/qurl/qurl.pro
+++ b/tests/benchmarks/corelib/io/qurl/qurl.pro
@@ -4,4 +4,3 @@ QT = core testlib
win32: DEFINES+= _CRT_SECURE_NO_WARNINGS
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/json/json.pro b/tests/benchmarks/corelib/json/json.pro
index 77c9ca3ffe..004f4b123e 100644
--- a/tests/benchmarks/corelib/json/json.pro
+++ b/tests/benchmarks/corelib/json/json.pro
@@ -5,4 +5,3 @@ CONFIG -= app_bundle
SOURCES += tst_bench_qtbinaryjson.cpp
TESTDATA = numbers.json test.json
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/kernel/events/events.pro b/tests/benchmarks/corelib/kernel/events/events.pro
index 01cba51329..798a880e5b 100644
--- a/tests/benchmarks/corelib/kernel/events/events.pro
+++ b/tests/benchmarks/corelib/kernel/events/events.pro
@@ -4,4 +4,3 @@ TARGET = tst_bench_events
QT = core testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/kernel/qcoreapplication/qcoreapplication.pro b/tests/benchmarks/corelib/kernel/qcoreapplication/qcoreapplication.pro
index df5450f88d..6896b3ff55 100644
--- a/tests/benchmarks/corelib/kernel/qcoreapplication/qcoreapplication.pro
+++ b/tests/benchmarks/corelib/kernel/qcoreapplication/qcoreapplication.pro
@@ -4,4 +4,3 @@ TEMPLATE = app
TARGET = tst_bench_qcoreapplication
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/kernel/qmetaobject/qmetaobject.pro b/tests/benchmarks/corelib/kernel/qmetaobject/qmetaobject.pro
index 39410e90fd..47d2acb9b1 100644
--- a/tests/benchmarks/corelib/kernel/qmetaobject/qmetaobject.pro
+++ b/tests/benchmarks/corelib/kernel/qmetaobject/qmetaobject.pro
@@ -3,4 +3,3 @@ QT += widgets testlib
TARGET = tst_bench_qmetaobject
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/kernel/qmetatype/qmetatype.pro b/tests/benchmarks/corelib/kernel/qmetatype/qmetatype.pro
index a97e0ffab8..83d0708b60 100644
--- a/tests/benchmarks/corelib/kernel/qmetatype/qmetatype.pro
+++ b/tests/benchmarks/corelib/kernel/qmetatype/qmetatype.pro
@@ -4,4 +4,3 @@ TARGET = tst_bench_qmetatype
SOURCES += tst_qmetatype.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/kernel/qobject/qobject.pro b/tests/benchmarks/corelib/kernel/qobject/qobject.pro
index 57243405e1..e611eff0a2 100644
--- a/tests/benchmarks/corelib/kernel/qobject/qobject.pro
+++ b/tests/benchmarks/corelib/kernel/qobject/qobject.pro
@@ -5,4 +5,3 @@ TARGET = tst_bench_qobject
HEADERS += object.h
SOURCES += main.cpp object.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/qtimer_vs_qmetaobject.pro b/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/qtimer_vs_qmetaobject.pro
index 16539c0198..e127ba1934 100644
--- a/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/qtimer_vs_qmetaobject.pro
+++ b/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/qtimer_vs_qmetaobject.pro
@@ -8,4 +8,3 @@ CONFIG += release
SOURCES += tst_qtimer_vs_qmetaobject.cpp
QT = core testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/kernel/qvariant/qvariant.pro b/tests/benchmarks/corelib/kernel/qvariant/qvariant.pro
index afacbd2c2b..8ea7200d53 100644
--- a/tests/benchmarks/corelib/kernel/qvariant/qvariant.pro
+++ b/tests/benchmarks/corelib/kernel/qvariant/qvariant.pro
@@ -6,4 +6,3 @@ CONFIG += release
SOURCES += tst_qvariant.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/mimetypes/qmimedatabase/qmimedatabase.pro b/tests/benchmarks/corelib/mimetypes/qmimedatabase/qmimedatabase.pro
index 0a0d9b1193..fe55b98e54 100644
--- a/tests/benchmarks/corelib/mimetypes/qmimedatabase/qmimedatabase.pro
+++ b/tests/benchmarks/corelib/mimetypes/qmimedatabase/qmimedatabase.pro
@@ -3,4 +3,3 @@ QT = core testlib
TARGET = tst_bench_qmimedatabase
SOURCES = main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/plugin/quuid/quuid.pro b/tests/benchmarks/corelib/plugin/quuid/quuid.pro
index 3f77ff7821..8f88bb85b4 100644
--- a/tests/benchmarks/corelib/plugin/quuid/quuid.pro
+++ b/tests/benchmarks/corelib/plugin/quuid/quuid.pro
@@ -3,4 +3,3 @@ TARGET = tst_bench_quuid
SOURCES += tst_quuid.cpp
QT = core testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/thread/qmutex/qmutex.pro b/tests/benchmarks/corelib/thread/qmutex/qmutex.pro
index 9f906b433f..ec87f60919 100644
--- a/tests/benchmarks/corelib/thread/qmutex/qmutex.pro
+++ b/tests/benchmarks/corelib/thread/qmutex/qmutex.pro
@@ -3,4 +3,3 @@ TARGET = tst_bench_qmutex
QT = core testlib
SOURCES += tst_qmutex.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/thread/qthreadstorage/qthreadstorage.pro b/tests/benchmarks/corelib/thread/qthreadstorage/qthreadstorage.pro
index f44763c39c..95afc951bc 100644
--- a/tests/benchmarks/corelib/thread/qthreadstorage/qthreadstorage.pro
+++ b/tests/benchmarks/corelib/thread/qthreadstorage/qthreadstorage.pro
@@ -3,4 +3,3 @@ TARGET = tst_bench_qthreadstorage
SOURCES += tst_qthreadstorage.cpp
QT = core testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/thread/qwaitcondition/qwaitcondition.pro b/tests/benchmarks/corelib/thread/qwaitcondition/qwaitcondition.pro
index 8adf8a732f..43c7921a93 100644
--- a/tests/benchmarks/corelib/thread/qwaitcondition/qwaitcondition.pro
+++ b/tests/benchmarks/corelib/thread/qwaitcondition/qwaitcondition.pro
@@ -2,4 +2,3 @@ TEMPLATE = app
TARGET = tst_bench_qwaitcondition
QT = core testlib
SOURCES += tst_qwaitcondition.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/containers-associative/containers-associative.pro b/tests/benchmarks/corelib/tools/containers-associative/containers-associative.pro
index 0d0f8405d8..49edcbee70 100644
--- a/tests/benchmarks/corelib/tools/containers-associative/containers-associative.pro
+++ b/tests/benchmarks/corelib/tools/containers-associative/containers-associative.pro
@@ -4,4 +4,3 @@ TARGET = tst_bench_containers-associative
QT = core testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/containers-sequential/containers-sequential.pro b/tests/benchmarks/corelib/tools/containers-sequential/containers-sequential.pro
index 0b5b070864..6f731cb6d8 100644
--- a/tests/benchmarks/corelib/tools/containers-sequential/containers-sequential.pro
+++ b/tests/benchmarks/corelib/tools/containers-sequential/containers-sequential.pro
@@ -4,4 +4,3 @@ TARGET = tst_bench_containers-sequential
QT = core testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qalgorithms/qalgorithms.pro b/tests/benchmarks/corelib/tools/qalgorithms/qalgorithms.pro
index 69c2add07b..f54f8320d4 100644
--- a/tests/benchmarks/corelib/tools/qalgorithms/qalgorithms.pro
+++ b/tests/benchmarks/corelib/tools/qalgorithms/qalgorithms.pro
@@ -1,4 +1,3 @@
TARGET = tst_bench_qalgorithms
QT = core testlib
SOURCES = tst_qalgorithms.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qbytearray/qbytearray.pro b/tests/benchmarks/corelib/tools/qbytearray/qbytearray.pro
index 0d5e7646ad..cf28b0247f 100644
--- a/tests/benchmarks/corelib/tools/qbytearray/qbytearray.pro
+++ b/tests/benchmarks/corelib/tools/qbytearray/qbytearray.pro
@@ -3,5 +3,5 @@ TARGET = tst_bench_qbytearray
QT = core testlib
+TESTDATA += main.cpp
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qchar/qchar.pro b/tests/benchmarks/corelib/tools/qchar/qchar.pro
index 1137e91cab..80a9861f48 100644
--- a/tests/benchmarks/corelib/tools/qchar/qchar.pro
+++ b/tests/benchmarks/corelib/tools/qchar/qchar.pro
@@ -1,4 +1,3 @@
TARGET = tst_bench_qchar
QT = core testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qcontiguouscache/qcontiguouscache.pro b/tests/benchmarks/corelib/tools/qcontiguouscache/qcontiguouscache.pro
index 0739d3dea6..fe74dafef4 100644
--- a/tests/benchmarks/corelib/tools/qcontiguouscache/qcontiguouscache.pro
+++ b/tests/benchmarks/corelib/tools/qcontiguouscache/qcontiguouscache.pro
@@ -5,4 +5,3 @@ SOURCES += main.cpp
CONFIG += parallel_test
QT = core testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qdatetime/qdatetime.pro b/tests/benchmarks/corelib/tools/qdatetime/qdatetime.pro
index ac71b77683..a85e7346c6 100644
--- a/tests/benchmarks/corelib/tools/qdatetime/qdatetime.pro
+++ b/tests/benchmarks/corelib/tools/qdatetime/qdatetime.pro
@@ -2,4 +2,3 @@ TARGET = tst_bench_qdatetime
QT = core testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qhash/qhash.pro b/tests/benchmarks/corelib/tools/qhash/qhash.pro
index bdef2c74aa..40f661c116 100644
--- a/tests/benchmarks/corelib/tools/qhash/qhash.pro
+++ b/tests/benchmarks/corelib/tools/qhash/qhash.pro
@@ -3,4 +3,3 @@ QT = core testlib
INCLUDEPATH += .
SOURCES += main.cpp outofline.cpp
CONFIG += release
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qlist/qlist.pro b/tests/benchmarks/corelib/tools/qlist/qlist.pro
index eba4066cf5..c83bc455d2 100644
--- a/tests/benchmarks/corelib/tools/qlist/qlist.pro
+++ b/tests/benchmarks/corelib/tools/qlist/qlist.pro
@@ -2,4 +2,3 @@ TARGET = tst_bench_qlist
QT = core testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qlocale/qlocale.pro b/tests/benchmarks/corelib/tools/qlocale/qlocale.pro
index 9e8f2721c9..e56bbe0341 100644
--- a/tests/benchmarks/corelib/tools/qlocale/qlocale.pro
+++ b/tests/benchmarks/corelib/tools/qlocale/qlocale.pro
@@ -2,4 +2,3 @@ TARGET = tst_bench_qlocale
QT = core testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qmap/qmap.pro b/tests/benchmarks/corelib/tools/qmap/qmap.pro
index bb3d33a3a1..6a0c8d62bd 100644
--- a/tests/benchmarks/corelib/tools/qmap/qmap.pro
+++ b/tests/benchmarks/corelib/tools/qmap/qmap.pro
@@ -3,4 +3,3 @@ QT = core testlib
INCLUDEPATH += .
SOURCES += main.cpp
CONFIG += release
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qrect/qrect.pro b/tests/benchmarks/corelib/tools/qrect/qrect.pro
index 361e734a36..42cfcd8924 100644
--- a/tests/benchmarks/corelib/tools/qrect/qrect.pro
+++ b/tests/benchmarks/corelib/tools/qrect/qrect.pro
@@ -5,4 +5,3 @@ QT = core testlib
CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qregexp/qregexp.pro b/tests/benchmarks/corelib/tools/qregexp/qregexp.pro
index 8b35ecffed..f64ae781a2 100644
--- a/tests/benchmarks/corelib/tools/qregexp/qregexp.pro
+++ b/tests/benchmarks/corelib/tools/qregexp/qregexp.pro
@@ -18,4 +18,3 @@ qtHaveModule(script):!pcre {
}
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qstring/qstring.pro b/tests/benchmarks/corelib/tools/qstring/qstring.pro
index 80410bc39e..9f5e34b915 100644
--- a/tests/benchmarks/corelib/tools/qstring/qstring.pro
+++ b/tests/benchmarks/corelib/tools/qstring/qstring.pro
@@ -3,4 +3,3 @@ QT -= gui
QT += core testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qstringbuilder/qstringbuilder.pro b/tests/benchmarks/corelib/tools/qstringbuilder/qstringbuilder.pro
index 128deab8f2..fa4cbe3c13 100644
--- a/tests/benchmarks/corelib/tools/qstringbuilder/qstringbuilder.pro
+++ b/tests/benchmarks/corelib/tools/qstringbuilder/qstringbuilder.pro
@@ -9,4 +9,3 @@ QT = core testlib
CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qstringlist/qstringlist.pro b/tests/benchmarks/corelib/tools/qstringlist/qstringlist.pro
index 823b3d4d46..5803e7da0e 100644
--- a/tests/benchmarks/corelib/tools/qstringlist/qstringlist.pro
+++ b/tests/benchmarks/corelib/tools/qstringlist/qstringlist.pro
@@ -3,4 +3,3 @@ CONFIG -= debug
CONFIG += release
QT = core testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qvector/qvector.pro b/tests/benchmarks/corelib/tools/qvector/qvector.pro
index 8c118e64e8..24a65d8ee8 100644
--- a/tests/benchmarks/corelib/tools/qvector/qvector.pro
+++ b/tests/benchmarks/corelib/tools/qvector/qvector.pro
@@ -3,4 +3,3 @@ QT = core testlib core-private
INCLUDEPATH += .
SOURCES += main.cpp outofline.cpp
CONFIG += release
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/dbus/qdbusperformance/server/server.pro b/tests/benchmarks/dbus/qdbusperformance/server/server.pro
index c913e90afb..a2270ad2c1 100644
--- a/tests/benchmarks/dbus/qdbusperformance/server/server.pro
+++ b/tests/benchmarks/dbus/qdbusperformance/server/server.pro
@@ -4,4 +4,3 @@ TARGET = server
DESTDIR = .
QT += dbus
QT -= gui
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/dbus/qdbusperformance/test/test.pro b/tests/benchmarks/dbus/qdbusperformance/test/test.pro
index 83f708f4fe..ddc5410759 100644
--- a/tests/benchmarks/dbus/qdbusperformance/test/test.pro
+++ b/tests/benchmarks/dbus/qdbusperformance/test/test.pro
@@ -3,4 +3,3 @@ HEADERS += ../serverobject.h
TARGET = ../tst_qdbusperformance
QT = core dbus testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/dbus/qdbustype/qdbustype.pro b/tests/benchmarks/dbus/qdbustype/qdbustype.pro
index 1437e4d9eb..d30bad8ce7 100644
--- a/tests/benchmarks/dbus/qdbustype/qdbustype.pro
+++ b/tests/benchmarks/dbus/qdbustype/qdbustype.pro
@@ -10,4 +10,3 @@ contains(QT_CONFIG, dbus-linked) {
}
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/animation/qanimation/qanimation.pro b/tests/benchmarks/gui/animation/qanimation/qanimation.pro
index b26e4bb7f7..a5859468f7 100644
--- a/tests/benchmarks/gui/animation/qanimation/qanimation.pro
+++ b/tests/benchmarks/gui/animation/qanimation/qanimation.pro
@@ -14,4 +14,3 @@ SOURCES += main.cpp \
HEADERS += dummyobject.h \
dummyanimation.h \
rectanimation.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.pro b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.pro
index a6ed4b84fb..ded6a06795 100644
--- a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.pro
+++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.pro
@@ -68,4 +68,3 @@ SOURCES += main.cpp \
TARGET = tst_GraphicsViewBenchmark
RESOURCES += GraphicsViewBenchmark.qrc
INCLUDEPATH += widgets
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.cpp
index 7e82b1ca53..7c4dc97591 100644
--- a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.cpp
+++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.cpp
@@ -100,7 +100,7 @@ bool readSettingsFromCommandLine(int argc, char *argv[],
return false;
}
else {
- QStringList res = QString(argv[i+1]).split("x");
+ QStringList res = QString(argv[i+1]).split(QLatin1Char('x'));
if (res.count() != 2) {
printf("-resolution parameter UI resolution should be set in format WxH where width and height are positive values\n");
usage(argv[0]);
diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.cpp
index 4dbb24211c..64c91da5f2 100644
--- a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.cpp
+++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.cpp
@@ -81,7 +81,8 @@ QString DummyDataGenerator::randomPhoneNumber(QString indexNumber)
QString beginNumber = QString::number(555-index*2);
QString endNumber = QString("0").repeated(4-indexNumber.length()) + indexNumber;
- return countryCode +" " + areaCode +" " + beginNumber +" " + endNumber;
+ return countryCode + QLatin1Char(' ') + areaCode +QLatin1Char(' ') + beginNumber
+ + QLatin1Char(' ') + endNumber;
}
QString DummyDataGenerator::randomFirstName()
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsanchorlayout/qgraphicsanchorlayout.pro b/tests/benchmarks/gui/graphicsview/qgraphicsanchorlayout/qgraphicsanchorlayout.pro
index 03f5d4b418..01c0dbd653 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsanchorlayout/qgraphicsanchorlayout.pro
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsanchorlayout/qgraphicsanchorlayout.pro
@@ -5,4 +5,3 @@ TARGET = tst_bench_qgraphicsanchorlayout
SOURCES += tst_qgraphicsanchorlayout.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsitem/qgraphicsitem.pro b/tests/benchmarks/gui/graphicsview/qgraphicsitem/qgraphicsitem.pro
index 1d02be4918..461ec13263 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsitem/qgraphicsitem.pro
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsitem/qgraphicsitem.pro
@@ -4,4 +4,3 @@ TEMPLATE = app
TARGET = tst_bench_qgraphicsitem
SOURCES += tst_qgraphicsitem.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/benchmarks/gui/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
index ac6cafe09b..7e58c2dc83 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
@@ -114,7 +114,7 @@ void tst_QGraphicsItem::setParentItem_deep()
childRect->setParentItem(lastRect);
lastRect = childRect;
}
- QGraphicsItem *first = rect.children().first();
+ QGraphicsItem *first = rect.childItems().first();
first->setParentItem(0);
}
}
@@ -194,8 +194,9 @@ void tst_QGraphicsItem::rotate()
QGraphicsItem *item = scene.addRect(QRectF(0, 0, 100, 100));
processEvents();
+ const QTransform rotate(QTransform().rotate(45));
QBENCHMARK {
- item->rotate(45);
+ item->setTransform(rotate, true);
}
}
@@ -205,8 +206,9 @@ void tst_QGraphicsItem::scale()
QGraphicsItem *item = scene.addRect(QRectF(0, 0, 100, 100));
processEvents();
+ const QTransform scale(QTransform::fromScale(2, 2));
QBENCHMARK {
- item->scale(2, 2);
+ item->setTransform(scale, true);
}
}
@@ -216,8 +218,9 @@ void tst_QGraphicsItem::shear()
QGraphicsItem *item = scene.addRect(QRectF(0, 0, 100, 100));
processEvents();
+ const QTransform shear = QTransform().shear(1.5, 1.5);
QBENCHMARK {
- item->shear(1.5, 1.5);
+ item->setTransform(shear, true);
}
}
@@ -227,8 +230,9 @@ void tst_QGraphicsItem::translate()
QGraphicsItem *item = scene.addRect(QRectF(0, 0, 100, 100));
processEvents();
+ const QTransform translate = QTransform::fromTranslate(100, 100);
QBENCHMARK {
- item->translate(100, 100);
+ item->setTransform(translate, true);
}
}
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicslayout/qgraphicslayout.pro b/tests/benchmarks/gui/graphicsview/qgraphicslayout/qgraphicslayout.pro
index 942af7257b..9026fb37d8 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicslayout/qgraphicslayout.pro
+++ b/tests/benchmarks/gui/graphicsview/qgraphicslayout/qgraphicslayout.pro
@@ -3,4 +3,3 @@ TARGET = tst_bench_qgraphicslayout
QT += testlib
SOURCES += tst_qgraphicslayout.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro b/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro
index d48e68e4d9..7126c8ecd6 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro
+++ b/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro
@@ -3,4 +3,3 @@ TARGET = tst_bench_qgraphicslinearlayout
QT += testlib
SOURCES += tst_qgraphicslinearlayout.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsscene/qgraphicsscene.pro b/tests/benchmarks/gui/graphicsview/qgraphicsscene/qgraphicsscene.pro
index 6d8b037df7..769f84423e 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsscene/qgraphicsscene.pro
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsscene/qgraphicsscene.pro
@@ -5,4 +5,3 @@ TARGET = tst_bench_qgraphicsscene
SOURCES += tst_qgraphicsscene.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp b/tests/benchmarks/gui/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
index 6215ab4e34..345948a4d0 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
@@ -165,7 +165,7 @@ void tst_QGraphicsScene::addItem()
scene.addItem(item);
}
}
- scene.itemAt(0, 0);
+ scene.items(QPointF(0, 0));
}
//let QGraphicsScene::_q_polishItems be called so ~QGraphicsItem doesn't spend all his time cleaning the unpolished list
qApp->processEvents();
@@ -217,12 +217,12 @@ void tst_QGraphicsScene::itemAt()
}
}
- scene.itemAt(0, 0); // triggers indexing
+ scene.items(QPointF(0, 0)); // triggers indexing
processEvents();
QGraphicsItem *item = 0;
QBENCHMARK {
- item = scene.itemAt(0, 0);
+ item = scene.items(QPointF(0, 0)).value(0, Q_NULLPTR);
}
//let QGraphicsScene::_q_polishItems be called so ~QGraphicsItem doesn't spend all his time cleaning the unpolished list
@@ -239,7 +239,7 @@ void tst_QGraphicsScene::initialShow()
item->setPos((y/2) * item->rect().width(), (y/2) * item->rect().height());
scene.addItem(item);
}
- scene.itemAt(0, 0); // triggers indexing
+ scene.items(QPointF(0, 0)); // triggers indexing
//This call polish the items so we bench their processing too.
qApp->processEvents();
}
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/chipTest/chip.pro b/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/chipTest/chip.pro
index 4047bad1ca..8ef79cef23 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/chipTest/chip.pro
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/chipTest/chip.pro
@@ -17,4 +17,3 @@ sources.files = $$SOURCES $$HEADERS $$RESOURCES *.png *.pro *.html *.doc images
sources.path = $$[QT_INSTALL_EXAMPLES]/graphicsview/chip
INSTALLS += target sources
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/moveItems/moveItems.pro b/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/moveItems/moveItems.pro
index 55e50d275b..28dcadcbfa 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/moveItems/moveItems.pro
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/moveItems/moveItems.pro
@@ -1,2 +1 @@
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/scrolltest/scrolltest.pro b/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/scrolltest/scrolltest.pro
index 55e50d275b..28dcadcbfa 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/scrolltest/scrolltest.pro
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/scrolltest/scrolltest.pro
@@ -1,2 +1 @@
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsview/chiptester/chip.cpp b/tests/benchmarks/gui/graphicsview/qgraphicsview/chiptester/chip.cpp
index 42c4b88eda..24daf90b68 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsview/chiptester/chip.cpp
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsview/chiptester/chip.cpp
@@ -43,7 +43,7 @@ Chip::Chip(const QColor &color, int x, int y)
setZValue((x + y) % 2);
setFlags(ItemIsSelectable | ItemIsMovable);
- setAcceptsHoverEvents(true);
+ setAcceptHoverEvents(true);
}
QRectF Chip::boundingRect() const
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsview/qgraphicsview.pro b/tests/benchmarks/gui/graphicsview/qgraphicsview/qgraphicsview.pro
index e68b90cbc5..3d48959f3c 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsview/qgraphicsview.pro
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsview/qgraphicsview.pro
@@ -7,4 +7,3 @@ SOURCES += tst_qgraphicsview.cpp
RESOURCES += qgraphicsview.qrc
include(chiptester/chiptester.pri)
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsview/tst_qgraphicsview.cpp b/tests/benchmarks/gui/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
index f8645d2507..3d6b38252f 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
@@ -166,7 +166,7 @@ void tst_QGraphicsView::initTestCase()
mView.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
mView.tryResize(100, 100);
mView.show();
- QTest::qWaitForWindowShown(&mView);
+ QTest::qWaitForWindowExposed(&mView);
QTest::qWait(300);
processEvents();
}
@@ -418,7 +418,7 @@ void tst_QGraphicsView::chipTester()
tester.setOpenGL(opengl);
tester.setOperation(ChipTester::Operation(operation));
tester.show();
- QTest::qWaitForWindowShown(&tester);
+ QTest::qWaitForWindowExposed(&tester);
QTest::qWait(250);
processEvents();
@@ -434,7 +434,7 @@ static void addChildHelper(QGraphicsItem *parent, int n, bool rotate)
QGraphicsRectItem *item = new QGraphicsRectItem(QRectF(0, 0, 50, 50), parent);
item->setPos(10, 10);
if (rotate)
- item->rotate(10);
+ item->setTransform(QTransform().rotate(10), true);
addChildHelper(item, n - 1, rotate);
}
@@ -464,7 +464,8 @@ void tst_QGraphicsView::deepNesting()
for (int y = 0; y < 15; ++y) {
for (int x = 0; x < 15; ++x) {
QGraphicsItem *item1 = scene.addRect(QRectF(0, 0, 50, 50));
- if (rotate) item1->rotate(10);
+ if (rotate)
+ item1->setTransform(QTransform().rotate(10), true);
item1->setPos(x * 25, y * 25);
addChildHelper(item1, 30, rotate);
}
@@ -476,7 +477,7 @@ void tst_QGraphicsView::deepNesting()
mView.setRenderHint(QPainter::Antialiasing);
mView.setScene(&scene);
mView.tryResize(600, 600);
- (void)scene.itemAt(0, 0);
+ (void)scene.items(QPointF(0, 0));
processEvents();
QBENCHMARK {
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicswidget/qgraphicswidget.pro b/tests/benchmarks/gui/graphicsview/qgraphicswidget/qgraphicswidget.pro
index a4e06368ca..00becec216 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicswidget/qgraphicswidget.pro
+++ b/tests/benchmarks/gui/graphicsview/qgraphicswidget/qgraphicswidget.pro
@@ -4,4 +4,3 @@ TEMPLATE = app
TARGET = tst_bench_qgraphicswidget
SOURCES += tst_qgraphicswidget.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/image/blendbench/blendbench.pro b/tests/benchmarks/gui/image/blendbench/blendbench.pro
index 8fd8682e09..17c18301bb 100644
--- a/tests/benchmarks/gui/image/blendbench/blendbench.pro
+++ b/tests/benchmarks/gui/image/blendbench/blendbench.pro
@@ -3,4 +3,3 @@ TARGET = tst_bench_blendbench
QT += testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/image/qimageconversion/qimageconversion.pro b/tests/benchmarks/gui/image/qimageconversion/qimageconversion.pro
index c3b6e36e63..9e47f979e1 100644
--- a/tests/benchmarks/gui/image/qimageconversion/qimageconversion.pro
+++ b/tests/benchmarks/gui/image/qimageconversion/qimageconversion.pro
@@ -5,5 +5,4 @@ SOURCES += tst_qimageconversion.cpp
!contains(QT_CONFIG, no-gif):DEFINES += QTEST_HAVE_GIF
!contains(QT_CONFIG, no-jpeg):DEFINES += QTEST_HAVE_JPEG
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
contains(QT_CONFIG, c++11): CONFIG += c++11
diff --git a/tests/benchmarks/gui/image/qimagereader/qimagereader.pro b/tests/benchmarks/gui/image/qimagereader/qimagereader.pro
index 5f1c72153d..e54e2ffce5 100644
--- a/tests/benchmarks/gui/image/qimagereader/qimagereader.pro
+++ b/tests/benchmarks/gui/image/qimagereader/qimagereader.pro
@@ -24,4 +24,3 @@ wince {
DEPLOYMENT += addFiles imageFormatsPlugins
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/image/qpixmap/qpixmap.pro b/tests/benchmarks/gui/image/qpixmap/qpixmap.pro
index 3a8526b56c..7ba53857cb 100644
--- a/tests/benchmarks/gui/image/qpixmap/qpixmap.pro
+++ b/tests/benchmarks/gui/image/qpixmap/qpixmap.pro
@@ -4,4 +4,3 @@ TEMPLATE = app
TARGET = tst_bench_qpixmap
SOURCES += tst_qpixmap.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/image/qpixmapcache/qpixmapcache.pro b/tests/benchmarks/gui/image/qpixmapcache/qpixmapcache.pro
index 436288ebf2..074c764e50 100644
--- a/tests/benchmarks/gui/image/qpixmapcache/qpixmapcache.pro
+++ b/tests/benchmarks/gui/image/qpixmapcache/qpixmapcache.pro
@@ -3,4 +3,3 @@ TEMPLATE = app
QT += testlib
SOURCES += tst_qpixmapcache.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/itemviews/qheaderview/qheaderview.pro b/tests/benchmarks/gui/itemviews/qheaderview/qheaderview.pro
index 31a0a77cec..7e8415e495 100644
--- a/tests/benchmarks/gui/itemviews/qheaderview/qheaderview.pro
+++ b/tests/benchmarks/gui/itemviews/qheaderview/qheaderview.pro
@@ -5,4 +5,3 @@ TARGET = tst_bench_qheaderview
SOURCES += qheaderviewbench.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/itemviews/qheaderview/qheaderviewbench.cpp b/tests/benchmarks/gui/itemviews/qheaderview/qheaderviewbench.cpp
index 9cc8f1e6bb..5b75d1ecd6 100644
--- a/tests/benchmarks/gui/itemviews/qheaderview/qheaderviewbench.cpp
+++ b/tests/benchmarks/gui/itemviews/qheaderview/qheaderviewbench.cpp
@@ -130,7 +130,7 @@ void BenchQHeaderView::init()
for (int i = 0; i < m_model->rowCount(); ++i) {
m_model->setData(m_model->index(i, 0), QVariant(i));
s.setNum(i);
- s += ".";
+ s += QLatin1Char('.');
s += 'a' + (i % 25);
m_model->setData(m_model->index(i, 1), QVariant(s));
}
diff --git a/tests/benchmarks/gui/itemviews/qtableview/qtableview.pro b/tests/benchmarks/gui/itemviews/qtableview/qtableview.pro
index 45ef4a3133..bd2306d646 100644
--- a/tests/benchmarks/gui/itemviews/qtableview/qtableview.pro
+++ b/tests/benchmarks/gui/itemviews/qtableview/qtableview.pro
@@ -5,4 +5,3 @@ TARGET = tst_bench_qtableview
SOURCES += tst_qtableview.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/kernel/qapplication/qapplication.pro b/tests/benchmarks/gui/kernel/qapplication/qapplication.pro
index 73e6a0a92f..86a016d42e 100644
--- a/tests/benchmarks/gui/kernel/qapplication/qapplication.pro
+++ b/tests/benchmarks/gui/kernel/qapplication/qapplication.pro
@@ -6,4 +6,3 @@ TARGET = tst_bench_qapplication
CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/kernel/qguimetatype/qguimetatype.pro b/tests/benchmarks/gui/kernel/qguimetatype/qguimetatype.pro
index 8f9080a09f..be9cf4b38b 100644
--- a/tests/benchmarks/gui/kernel/qguimetatype/qguimetatype.pro
+++ b/tests/benchmarks/gui/kernel/qguimetatype/qguimetatype.pro
@@ -3,4 +3,3 @@ TARGET = tst_bench_qguimetatype
QT += testlib
SOURCES += tst_qguimetatype.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/kernel/qguivariant/qguivariant.pro b/tests/benchmarks/gui/kernel/qguivariant/qguivariant.pro
index 68a93109f6..63886c21d4 100644
--- a/tests/benchmarks/gui/kernel/qguivariant/qguivariant.pro
+++ b/tests/benchmarks/gui/kernel/qguivariant/qguivariant.pro
@@ -3,4 +3,3 @@ TARGET = tst_bench_qguivariant
QT += testlib
SOURCES += tst_qguivariant.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/kernel/qwidget/qwidget.pro b/tests/benchmarks/gui/kernel/qwidget/qwidget.pro
index 6db601d70a..758c9c5b98 100644
--- a/tests/benchmarks/gui/kernel/qwidget/qwidget.pro
+++ b/tests/benchmarks/gui/kernel/qwidget/qwidget.pro
@@ -2,4 +2,3 @@ QT += widgets testlib
TARGET = tst_bench_qwidget
SOURCES += tst_qwidget.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/kernel/qwidget/tst_qwidget.cpp b/tests/benchmarks/gui/kernel/qwidget/tst_qwidget.cpp
index 839d4535cb..289ed3bf06 100644
--- a/tests/benchmarks/gui/kernel/qwidget/tst_qwidget.cpp
+++ b/tests/benchmarks/gui/kernel/qwidget/tst_qwidget.cpp
@@ -128,7 +128,7 @@ private:
void tst_QWidget::initTestCase()
{
widget.show();
- QTest::qWaitForWindowShown(&widget);
+ QTest::qWaitForWindowExposed(&widget);
QTest::qWait(300);
processEvents();
}
diff --git a/tests/benchmarks/gui/math3d/qmatrix4x4/qmatrix4x4.pro b/tests/benchmarks/gui/math3d/qmatrix4x4/qmatrix4x4.pro
index 713eb95e2d..fe5c23840f 100644
--- a/tests/benchmarks/gui/math3d/qmatrix4x4/qmatrix4x4.pro
+++ b/tests/benchmarks/gui/math3d/qmatrix4x4/qmatrix4x4.pro
@@ -3,4 +3,3 @@ TARGET = tst_bench_qmatrix4x4
QT += testlib
SOURCES += tst_qmatrix4x4.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/math3d/qquaternion/qquaternion.pro b/tests/benchmarks/gui/math3d/qquaternion/qquaternion.pro
index a363fb4183..e57a3e6a38 100644
--- a/tests/benchmarks/gui/math3d/qquaternion/qquaternion.pro
+++ b/tests/benchmarks/gui/math3d/qquaternion/qquaternion.pro
@@ -3,4 +3,3 @@ TARGET = tst_bench_qquaternion
QT += testlib
SOURCES += tst_qquaternion.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/painting/qpainter/qpainter.pro b/tests/benchmarks/gui/painting/qpainter/qpainter.pro
index b114dde68d..1a1f218033 100644
--- a/tests/benchmarks/gui/painting/qpainter/qpainter.pro
+++ b/tests/benchmarks/gui/painting/qpainter/qpainter.pro
@@ -5,4 +5,3 @@ TEMPLATE = app
TARGET = tst_bench_qpainter
SOURCES += tst_qpainter.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/painting/qregion/qregion.pro b/tests/benchmarks/gui/painting/qregion/qregion.pro
index ef3dbefa55..1ff55080c5 100644
--- a/tests/benchmarks/gui/painting/qregion/qregion.pro
+++ b/tests/benchmarks/gui/painting/qregion/qregion.pro
@@ -4,4 +4,3 @@ QT += testlib
CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/painting/qtbench/qtbench.pro b/tests/benchmarks/gui/painting/qtbench/qtbench.pro
index 46c2f06984..a4c7273b47 100644
--- a/tests/benchmarks/gui/painting/qtbench/qtbench.pro
+++ b/tests/benchmarks/gui/painting/qtbench/qtbench.pro
@@ -4,5 +4,3 @@ TEMPLATE = app
TARGET = tst_bench_qtbench
SOURCES += tst_qtbench.cpp
-
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/painting/qtbench/tst_qtbench.cpp b/tests/benchmarks/gui/painting/qtbench/tst_qtbench.cpp
index c7ba7b82f6..cc9fe7e32e 100644
--- a/tests/benchmarks/gui/painting/qtbench/tst_qtbench.cpp
+++ b/tests/benchmarks/gui/painting/qtbench/tst_qtbench.cpp
@@ -229,7 +229,7 @@ void tst_QtBench::qtBench()
BenchWidget widget(reinterpret_cast<Benchmark *>(benchmark));
widget.show();
- QTest::qWaitForWindowShown(&widget);
+ QTest::qWaitForWindowExposed(&widget);
while (!widget.done()) {
widget.update();
diff --git a/tests/benchmarks/gui/painting/qtransform/qtransform.pro b/tests/benchmarks/gui/painting/qtransform/qtransform.pro
index 76ed1325fd..e8de3fcbd4 100644
--- a/tests/benchmarks/gui/painting/qtransform/qtransform.pro
+++ b/tests/benchmarks/gui/painting/qtransform/qtransform.pro
@@ -3,4 +3,3 @@ TARGET = tst_bench_qtransform
QT += testlib
SOURCES += tst_qtransform.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/styles/qstylesheetstyle/main.cpp b/tests/benchmarks/gui/styles/qstylesheetstyle/main.cpp
index e4d5999c62..bb5399707c 100644
--- a/tests/benchmarks/gui/styles/qstylesheetstyle/main.cpp
+++ b/tests/benchmarks/gui/styles/qstylesheetstyle/main.cpp
@@ -173,7 +173,7 @@ void tst_qstylesheetstyle::grid()
w->setStyleSheet("/* */");
if(show) {
w->show();
- QTest::qWaitForWindowShown(w);
+ QTest::qWaitForWindowExposed(w);
QApplication::flush();
QApplication::processEvents();
QTest::qWait(30);
diff --git a/tests/benchmarks/gui/styles/qstylesheetstyle/qstylesheetstyle.pro b/tests/benchmarks/gui/styles/qstylesheetstyle/qstylesheetstyle.pro
index 707731f4d1..5aef3520c0 100644
--- a/tests/benchmarks/gui/styles/qstylesheetstyle/qstylesheetstyle.pro
+++ b/tests/benchmarks/gui/styles/qstylesheetstyle/qstylesheetstyle.pro
@@ -5,4 +5,3 @@ TARGET = tst_bench_qstylesheetstyle
CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/text/qfontmetrics/qfontmetrics.pro b/tests/benchmarks/gui/text/qfontmetrics/qfontmetrics.pro
index 3ebb9ed778..bcaff3de1e 100644
--- a/tests/benchmarks/gui/text/qfontmetrics/qfontmetrics.pro
+++ b/tests/benchmarks/gui/text/qfontmetrics/qfontmetrics.pro
@@ -2,4 +2,3 @@ TEMPLATE = app
TARGET = tst_bench_QFontMetrics
QT += testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/text/qtext/qtext.pro b/tests/benchmarks/gui/text/qtext/qtext.pro
index 86b9006f62..d5597fb097 100644
--- a/tests/benchmarks/gui/text/qtext/qtext.pro
+++ b/tests/benchmarks/gui/text/qtext/qtext.pro
@@ -7,4 +7,3 @@ TARGET = tst_bench_QText
SOURCES += main.cpp
TESTDATA = bidi.txt
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/network/access/qfile_vs_qnetworkaccessmanager/qfile_vs_qnetworkaccessmanager.pro b/tests/benchmarks/network/access/qfile_vs_qnetworkaccessmanager/qfile_vs_qnetworkaccessmanager.pro
index 82c49e40b8..eccabd5d89 100644
--- a/tests/benchmarks/network/access/qfile_vs_qnetworkaccessmanager/qfile_vs_qnetworkaccessmanager.pro
+++ b/tests/benchmarks/network/access/qfile_vs_qnetworkaccessmanager/qfile_vs_qnetworkaccessmanager.pro
@@ -7,4 +7,3 @@ QT += network testlib
CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/network/access/qnetworkdiskcache/qnetworkdiskcache.pro b/tests/benchmarks/network/access/qnetworkdiskcache/qnetworkdiskcache.pro
index 226c123a72..9de05b5e65 100644
--- a/tests/benchmarks/network/access/qnetworkdiskcache/qnetworkdiskcache.pro
+++ b/tests/benchmarks/network/access/qnetworkdiskcache/qnetworkdiskcache.pro
@@ -7,4 +7,3 @@ QT += network testlib
CONFIG += release
SOURCES += tst_qnetworkdiskcache.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/network/access/qnetworkreply/qnetworkreply.pro b/tests/benchmarks/network/access/qnetworkreply/qnetworkreply.pro
index 92d20f50d0..2378cd4862 100644
--- a/tests/benchmarks/network/access/qnetworkreply/qnetworkreply.pro
+++ b/tests/benchmarks/network/access/qnetworkreply/qnetworkreply.pro
@@ -7,4 +7,3 @@ QT += core-private network network-private testlib
CONFIG += release
SOURCES += tst_qnetworkreply.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/network/kernel/qhostinfo/qhostinfo.pro b/tests/benchmarks/network/kernel/qhostinfo/qhostinfo.pro
index e335d95aad..41dae0051b 100644
--- a/tests/benchmarks/network/kernel/qhostinfo/qhostinfo.pro
+++ b/tests/benchmarks/network/kernel/qhostinfo/qhostinfo.pro
@@ -7,4 +7,3 @@ QT += core-private network network-private testlib
CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/network/socket/qtcpserver/qtcpserver.pro b/tests/benchmarks/network/socket/qtcpserver/qtcpserver.pro
index abc7676afa..ebf1891433 100644
--- a/tests/benchmarks/network/socket/qtcpserver/qtcpserver.pro
+++ b/tests/benchmarks/network/socket/qtcpserver/qtcpserver.pro
@@ -7,4 +7,3 @@ QT += network testlib
CONFIG += release
SOURCES += tst_qtcpserver.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/network/ssl/qsslsocket/qsslsocket.pro b/tests/benchmarks/network/ssl/qsslsocket/qsslsocket.pro
index d22fdd326a..a67c0d66df 100644
--- a/tests/benchmarks/network/ssl/qsslsocket/qsslsocket.pro
+++ b/tests/benchmarks/network/ssl/qsslsocket/qsslsocket.pro
@@ -7,4 +7,3 @@ QT += network testlib
CONFIG += release
SOURCES += tst_qsslsocket.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/plugins/imageformats/jpeg/jpeg.pro b/tests/benchmarks/plugins/imageformats/jpeg/jpeg.pro
index a5cd697900..281e79f585 100644
--- a/tests/benchmarks/plugins/imageformats/jpeg/jpeg.pro
+++ b/tests/benchmarks/plugins/imageformats/jpeg/jpeg.pro
@@ -6,4 +6,3 @@ CONFIG += release
SOURCES += jpeg.cpp
TESTDATA = n900.jpeg
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/sql/kernel/qsqlquery/main.cpp b/tests/benchmarks/sql/kernel/qsqlquery/main.cpp
index b5937b76b0..942266313f 100644
--- a/tests/benchmarks/sql/kernel/qsqlquery/main.cpp
+++ b/tests/benchmarks/sql/kernel/qsqlquery/main.cpp
@@ -285,7 +285,7 @@ void tst_QSqlQuery::benchmarkSelectPrepared()
int expectedSum = 0;
QString fillQuery = "INSERT INTO " + tableName + " VALUES (0)";
for (int i = 1; i < NUM_ROWS; ++i) {
- fillQuery += ", (" + QString::number(i) + ")";
+ fillQuery += ", (" + QString::number(i) + QLatin1Char(')');
expectedSum += i;
}
QVERIFY_SQL(q, exec(fillQuery));
diff --git a/tests/benchmarks/sql/kernel/qsqlquery/qsqlquery.pro b/tests/benchmarks/sql/kernel/qsqlquery/qsqlquery.pro
index abfebad2aa..18425f4a25 100644
--- a/tests/benchmarks/sql/kernel/qsqlquery/qsqlquery.pro
+++ b/tests/benchmarks/sql/kernel/qsqlquery/qsqlquery.pro
@@ -4,4 +4,3 @@ SOURCES += main.cpp
QT = core sql testlib core-private sql-private
LIBS += $$QMAKE_LIBS_NETWORK
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/bearerex/bearerex.cpp b/tests/manual/bearerex/bearerex.cpp
index fe96c55636..2b04bd8bda 100644
--- a/tests/manual/bearerex/bearerex.cpp
+++ b/tests/manual/bearerex/bearerex.cpp
@@ -147,7 +147,7 @@ void BearerEx::on_createSessionButton_clicked()
QNetworkConfiguration networkConfiguration = qvariant_cast<QNetworkConfiguration>(item->data(Qt::UserRole));
int newTabIndex = mainTabWidget->count();
SessionTab* newTab = new SessionTab(&networkConfiguration,&m_NetworkConfigurationManager,eventListWidget,newTabIndex-1);
- QString label = QString("S")+QString::number(newTabIndex-1);
+ QString label = QLatin1Char('S') + QString::number(newTabIndex-1);
mainTabWidget->insertTab(newTabIndex,newTab,label);
mainTabWidget->setCurrentIndex(newTabIndex);
}
@@ -271,9 +271,11 @@ SessionTab::SessionTab(QNetworkConfiguration* apNetworkConfiguration,
snapLabel->hide();
snapLineEdit->hide();
alrButton->hide();
- iapLineEdit->setText(apNetworkConfiguration->name()+" ("+apNetworkConfiguration->identifier()+")");
+ iapLineEdit->setText(apNetworkConfiguration->name()+ " (" + apNetworkConfiguration->identifier()
+ + QLatin1Char(')'));
} else if (apNetworkConfiguration->type() == QNetworkConfiguration::ServiceNetwork) {
- snapLineEdit->setText(apNetworkConfiguration->name()+" ("+apNetworkConfiguration->identifier()+")");
+ snapLineEdit->setText(apNetworkConfiguration->name()+ " (" + apNetworkConfiguration->identifier()
+ + QLatin1Char(')'));
}
bearerLineEdit->setText(apNetworkConfiguration->bearerTypeName());
sentRecDataLineEdit->setText(QString::number(m_NetworkSession->bytesWritten())+
@@ -380,7 +382,7 @@ void SessionTab::newConfigurationActivated()
msgBox.setDefaultButton(QMessageBox::Yes);
if (msgBox.exec() == QMessageBox::Yes) {
m_NetworkSession->accept();
- iapLineEdit->setText(m_config.name()+" ("+m_config.identifier()+")");
+ iapLineEdit->setText(m_config.name() + " (" + m_config.identifier() + QLatin1Char(')'));
} else {
m_NetworkSession->reject();
}
@@ -391,7 +393,7 @@ void SessionTab::preferredConfigurationChanged(const QNetworkConfiguration& conf
m_config = config;
QMessageBox msgBox;
msgBox.setText("Roaming to new configuration.");
- msgBox.setInformativeText("Do you want to migrate to "+config.name()+"?");
+ msgBox.setInformativeText("Do you want to migrate to " + config.name() + QLatin1Char('?'));
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
msgBox.setDefaultButton(QMessageBox::Yes);
if (msgBox.exec() == QMessageBox::Yes) {
@@ -407,7 +409,7 @@ void SessionTab::opened()
QFont font = listItem->font();
font.setBold(true);
listItem->setFont(font);
- listItem->setText(QString("S")+QString::number(m_index)+QString(" - ")+QString("Opened"));
+ listItem->setText(QLatin1Char('S') + QString::number(m_index) + QLatin1String(" - Opened"));
m_eventListWidget->addItem(listItem);
QVariant identifier = m_NetworkSession->sessionProperty("ActiveConfiguration");
@@ -415,7 +417,7 @@ void SessionTab::opened()
QString configId = identifier.toString();
QNetworkConfiguration config = m_ConfigManager->configurationFromIdentifier(configId);
if (config.isValid()) {
- iapLineEdit->setText(config.name()+" ("+config.identifier()+")");
+ iapLineEdit->setText(config.name() + " (" + config.identifier() + QLatin1Char(')'));
}
}
newState(m_NetworkSession->state()); // Update the "(open)"
@@ -438,7 +440,7 @@ void SessionTab::closed()
QFont font = listItem->font();
font.setBold(true);
listItem->setFont(font);
- listItem->setText(QString("S")+QString::number(m_index)+QString(" - ")+QString("Closed"));
+ listItem->setText(QLatin1Char('S') + QString::number(m_index) + QLatin1String(" - Closed"));
m_eventListWidget->addItem(listItem);
}
@@ -489,7 +491,7 @@ void SessionTab::stateChanged(QNetworkSession::State state)
newState(state);
QListWidgetItem* listItem = new QListWidgetItem();
- listItem->setText(QString("S")+QString::number(m_index)+QString(" - ")+stateString(state));
+ listItem->setText(QLatin1Char('S') + QString::number(m_index) + QLatin1String(" - ") + stateString(state));
m_eventListWidget->addItem(listItem);
}
@@ -500,7 +502,7 @@ void SessionTab::newState(QNetworkSession::State state)
QString configId = identifier.toString();
QNetworkConfiguration config = m_ConfigManager->configurationFromIdentifier(configId);
if (config.isValid()) {
- iapLineEdit->setText(config.name()+" ("+config.identifier()+")");
+ iapLineEdit->setText(config.name() + " (" + config.identifier() + QLatin1Char(')'));
bearerLineEdit->setText(config.bearerTypeName());
}
} else {
@@ -539,7 +541,7 @@ void SessionTab::error(QNetworkSession::SessionError error)
errorString = "InvalidConfigurationError";
break;
}
- listItem->setText(QString("S")+QString::number(m_index)+QString(" - ")+errorString);
+ listItem->setText(QLatin1Char('S') + QString::number(m_index) + QString(" - ") + errorString);
m_eventListWidget->addItem(listItem);
msgBox.setText(errorString);
diff --git a/tests/manual/bearerex/bearerex.pro b/tests/manual/bearerex/bearerex.pro
index 8f0af52b40..e643657660 100644
--- a/tests/manual/bearerex/bearerex.pro
+++ b/tests/manual/bearerex/bearerex.pro
@@ -19,4 +19,3 @@ SOURCES += bearerex.cpp \
main.cpp \
xqlistwidget.cpp \
datatransferer.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/cocoa/menus/menus.pro b/tests/manual/cocoa/menus/menus.pro
index 855a77455f..0ccb25feb9 100644
--- a/tests/manual/cocoa/menus/menus.pro
+++ b/tests/manual/cocoa/menus/menus.pro
@@ -3,4 +3,3 @@ TEMPLATE = app
SOURCES += main.cpp
QT += gui widgets
CONFIG -=app_bundle
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/cocoa/nativewidgets/nativewigets.pro b/tests/manual/cocoa/nativewidgets/nativewigets.pro
index f1b1260688..d81b567276 100644
--- a/tests/manual/cocoa/nativewidgets/nativewigets.pro
+++ b/tests/manual/cocoa/nativewidgets/nativewigets.pro
@@ -4,4 +4,3 @@ HEADERS +=
SOURCES += main.cpp
QT += core widgets
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/cocoa/qmaccocoaviewcontainer/TestMouseMovedNSView.h b/tests/manual/cocoa/qmaccocoaviewcontainer/TestMouseMovedNSView.h
index 95601906e7..5aaffc7048 100644
--- a/tests/manual/cocoa/qmaccocoaviewcontainer/TestMouseMovedNSView.h
+++ b/tests/manual/cocoa/qmaccocoaviewcontainer/TestMouseMovedNSView.h
@@ -31,7 +31,7 @@
**
****************************************************************************/
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
@interface TestMouseMovedNSView : NSView {
NSPoint mouseMovedPoint_;
diff --git a/tests/manual/cocoa/qmaccocoaviewcontainer/qmaccocoaviewcontainer.pro b/tests/manual/cocoa/qmaccocoaviewcontainer/qmaccocoaviewcontainer.pro
index 9546adea1c..1d1eb08253 100644
--- a/tests/manual/cocoa/qmaccocoaviewcontainer/qmaccocoaviewcontainer.pro
+++ b/tests/manual/cocoa/qmaccocoaviewcontainer/qmaccocoaviewcontainer.pro
@@ -2,7 +2,7 @@ TEMPLATE = app
TARGET = qmaccocoaviewcontainer
INCLUDEPATH += .
QT += widgets
-LIBS += -framework Cocoa
+LIBS += -framework AppKit
# Input
OBJECTIVE_SOURCES += main.mm TestMouseMovedNSView.m
HEADERS += TestMouseMovedNSView.h
diff --git a/tests/manual/cocoa/qt_on_cocoa/main.mm b/tests/manual/cocoa/qt_on_cocoa/main.mm
index 23370b0305..219bb56416 100644
--- a/tests/manual/cocoa/qt_on_cocoa/main.mm
+++ b/tests/manual/cocoa/qt_on_cocoa/main.mm
@@ -36,7 +36,7 @@
#include <QtGui>
#include <QtWidgets/QtWidgets>
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
@interface AppDelegate : NSObject <NSApplicationDelegate> {
QGuiApplication *m_app;
diff --git a/tests/manual/cocoa/qt_on_cocoa/qt_on_cocoa.pro b/tests/manual/cocoa/qt_on_cocoa/qt_on_cocoa.pro
index 97e4473e15..91c4d2c875 100644
--- a/tests/manual/cocoa/qt_on_cocoa/qt_on_cocoa.pro
+++ b/tests/manual/cocoa/qt_on_cocoa/qt_on_cocoa.pro
@@ -3,7 +3,7 @@ TEMPLATE = app
OBJECTIVE_SOURCES += main.mm
HEADERS += rasterwindow.h
SOURCES += rasterwindow.cpp
-LIBS += -framework Cocoa
+LIBS += -framework AppKit
QT += gui widgets quick
diff --git a/tests/manual/cocoa/wheelevent/wheelevent.pro b/tests/manual/cocoa/wheelevent/wheelevent.pro
index f90302da95..3a30aef3fb 100644
--- a/tests/manual/cocoa/wheelevent/wheelevent.pro
+++ b/tests/manual/cocoa/wheelevent/wheelevent.pro
@@ -4,4 +4,3 @@ HEADERS += window.h
SOURCES += window.cpp main.cpp
QT += core core-private gui gui-private widgets
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/diaglib/README.txt b/tests/manual/diaglib/README.txt
index 0fb226c750..fd199d09cb 100644
--- a/tests/manual/diaglib/README.txt
+++ b/tests/manual/diaglib/README.txt
@@ -27,6 +27,11 @@ class EventFilter (eventfilter.h):
An event filter that logs Qt events to qDebug() depending on
configured categories (for example mouse, keyboard, etc).
+class DebugProxyStyle (debugproxystyle.h)
+ A proxy style that wraps around an existing style and outputs
+ the parameters and return values of its function calls, useful
+ for debugging QStyle.
+
function glInfo() (glinfo.h):
Returns a string describing the Open GL configuration (obtained
by querying GL_VENDOR and GL_RENDERER). Available only
diff --git a/tests/manual/diaglib/debugproxystyle.cpp b/tests/manual/diaglib/debugproxystyle.cpp
new file mode 100644
index 0000000000..51f15a4fee
--- /dev/null
+++ b/tests/manual/diaglib/debugproxystyle.cpp
@@ -0,0 +1,161 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "debugproxystyle.h"
+
+#include <QDebug>
+#include <QWidget>
+#include <QStyleOption>
+#include <QApplication>
+
+#if QT_VERSION < 0x050000
+QDebug operator<<(QDebug d, const QPixmap &p)
+{
+ d << "QPixmap(" << p.size() << ')';
+ return d;
+}
+#endif // QT_VERSION < 0x050000
+
+QDebug operator<<(QDebug debug, const QStyleOption *option)
+{
+#if QT_VERSION >= 0x050000
+ QDebugStateSaver saver(debug);
+ debug.nospace();
+#endif
+ debug << "QStyleOption(";
+ if (option)
+ debug << "rec=" << option->rect;
+ else
+ debug << '0';
+ debug << ')';
+ return debug;
+}
+
+namespace QtDiag {
+
+DebugProxyStyle::DebugProxyStyle(QStyle *style) : QProxyStyle(style)
+{
+#if QT_VERSION >= 0x050000
+ const qreal devicePixelRatio = qApp->devicePixelRatio();
+#else
+ const qreal devicePixelRatio = 1;
+#endif
+ qDebug() << __FUNCTION__ << QT_VERSION_STR
+#if QT_VERSION >= 0x050000
+ << QGuiApplication::platformName()
+#endif
+ << style->objectName() << "devicePixelRatio=" << devicePixelRatio;
+}
+
+void DebugProxyStyle::drawPrimitive(QStyle::PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const
+{
+ qDebug() << __FUNCTION__ << "element=" << element << option << widget;
+ QProxyStyle::drawPrimitive( element, option, painter, widget);
+}
+
+void DebugProxyStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const
+{
+ qDebug() << __FUNCTION__ << "element=" << element << option << widget;
+ QProxyStyle::drawControl(element, option, painter, widget);
+}
+
+void DebugProxyStyle::drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const
+{
+ qDebug() << __FUNCTION__ << "control=" << control << option << widget;
+ QProxyStyle::drawComplexControl(control, option, painter, widget);
+}
+
+void DebugProxyStyle::drawItemPixmap(QPainter *painter, const QRect &rect, int alignment, const QPixmap &pixmap) const
+{
+ qDebug() << __FUNCTION__ << rect << "alignment=" << alignment << pixmap;
+ QProxyStyle::drawItemPixmap(painter, rect, alignment, pixmap);
+}
+
+QSize DebugProxyStyle::sizeFromContents(QStyle::ContentsType type, const QStyleOption *option, const QSize &size, const QWidget *widget) const
+{
+ const QSize result = QProxyStyle::sizeFromContents(type, option, size, widget);
+ qDebug() << __FUNCTION__ << size << "type=" << type << option << widget << "returns" << result;
+ return result;
+}
+
+QRect DebugProxyStyle::subElementRect(QStyle::SubElement element, const QStyleOption *option, const QWidget *widget) const
+{
+ const QRect result = QProxyStyle::subElementRect(element, option, widget);
+ qDebug() << __FUNCTION__ << "element=" << element << option << widget << "returns" << result;
+ return result;
+}
+
+QRect DebugProxyStyle::subControlRect(QStyle::ComplexControl cc, const QStyleOptionComplex *opt, QStyle::SubControl sc, const QWidget *widget) const
+{
+ const QRect result = QProxyStyle::subControlRect(cc, opt, sc, widget);
+ qDebug() << __FUNCTION__ << "cc=" << cc << "sc=" << sc << opt << widget << "returns" << result;
+ return result;
+}
+
+QRect DebugProxyStyle::itemTextRect(const QFontMetrics &fm, const QRect &r, int flags, bool enabled, const QString &text) const
+{
+ const QRect result = QProxyStyle::itemTextRect(fm, r, flags, enabled, text);
+ qDebug() << __FUNCTION__ << r << "flags=" << flags << "enabled=" << enabled
+ << text << "returns" << result;
+ return result;
+}
+
+QRect DebugProxyStyle::itemPixmapRect(const QRect &r, int flags, const QPixmap &pixmap) const
+{
+ const QRect result = QProxyStyle::itemPixmapRect(r, flags, pixmap);
+ qDebug() << __FUNCTION__ << r << "flags=" << flags << pixmap << "returns" << result;
+ return result;
+}
+
+int DebugProxyStyle::pixelMetric(QStyle::PixelMetric metric, const QStyleOption *option, const QWidget *widget) const
+{
+ const int result = QProxyStyle::pixelMetric(metric, option, widget);
+ qDebug() << __FUNCTION__ << "metric=" << metric << option << widget << "returns" << result;
+ return result;
+}
+
+QPixmap DebugProxyStyle::standardPixmap(QStyle::StandardPixmap standardPixmap, const QStyleOption *opt, const QWidget *widget) const
+{
+ const QPixmap result = QProxyStyle::standardPixmap(standardPixmap, opt, widget);
+ qDebug() << __FUNCTION__ << "standardPixmap=" << standardPixmap << opt << "returns" << result;
+ return result;
+}
+
+QPixmap DebugProxyStyle::generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap, const QStyleOption *opt) const
+{
+ const QPixmap result = QProxyStyle::generatedIconPixmap(iconMode, pixmap, opt);
+ qDebug() << __FUNCTION__ << "iconMode=" << iconMode << pixmap << opt << "returns" << result;
+ return result;
+}
+
+} // namespace QtDiag
diff --git a/src/plugins/styles/bb10style/qbb10brightstyle.h b/tests/manual/diaglib/debugproxystyle.h
index 5b88b0ef95..d7a15ec2c0 100644
--- a/src/plugins/styles/bb10style/qbb10brightstyle.h
+++ b/tests/manual/diaglib/debugproxystyle.h
@@ -1,9 +1,9 @@
-/***************************************************************************
+/****************************************************************************
**
-** Copyright (C) 2014 BlackBerry Limited. All rights reserved.
+** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
-** This file is part of the plugins of the Qt Toolkit.
+** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL21$
** Commercial License Usage
@@ -31,32 +31,33 @@
**
****************************************************************************/
-#ifndef QBB10BRIGHTSTYLE_H
-#define QBB10BRIGHTSTYLE_H
+#ifndef DEBUGPROXYSTYLE_H
+#define DEBUGPROXYSTYLE_H
-#include "qpixmapstyle.h"
+#include <QProxyStyle>
-QT_BEGIN_NAMESPACE
+namespace QtDiag {
-class QBB10BrightStyle : public QPixmapStyle
-{
+class DebugProxyStyle : public QProxyStyle {
Q_OBJECT
public:
- QBB10BrightStyle();
- ~QBB10BrightStyle();
-
- void polish(QApplication *application);
- void polish(QWidget *widget);
-
- QPalette standardPalette() const;
-
- void drawControl(ControlElement element, const QStyleOption *option,
- QPainter *painter, const QWidget *widget = 0) const;
- void drawPrimitive(PrimitiveElement element, const QStyleOption *option,
- QPainter *painter, const QWidget *widget) const;
+ explicit DebugProxyStyle(QStyle *style);
+
+ void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = 0) const;
+ void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = 0) const;
+ void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = 0) const;
+ void drawItemPixmap(QPainter *painter, const QRect &rect, int alignment, const QPixmap &pixmap) const;
+ QSize sizeFromContents(ContentsType type, const QStyleOption *option, const QSize &size, const QWidget *widget) const;
+ QRect subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget) const;
+ QRect subControlRect(ComplexControl cc, const QStyleOptionComplex *opt, SubControl sc, const QWidget *widget) const;
+ QRect itemTextRect(const QFontMetrics &fm, const QRect &r, int flags, bool enabled, const QString &text) const;
+ QRect itemPixmapRect(const QRect &r, int flags, const QPixmap &pixmap) const;
+ int pixelMetric(PixelMetric metric, const QStyleOption *option = 0, const QWidget *widget = 0) const;
+ QPixmap standardPixmap(StandardPixmap standardPixmap, const QStyleOption *opt, const QWidget *widget = 0) const;
+ QPixmap generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap, const QStyleOption *opt) const;
};
-QT_END_NAMESPACE
+} // namespace QtDiag
-#endif // QBB10BRIGHTSTYLE_H
+#endif // DEBUGPROXYSTYLE_H
diff --git a/tests/manual/diaglib/diaglib.pri b/tests/manual/diaglib/diaglib.pri
index a1f1893f52..a51d2f1201 100644
--- a/tests/manual/diaglib/diaglib.pri
+++ b/tests/manual/diaglib/diaglib.pri
@@ -3,12 +3,14 @@ SOURCES += \
$$PWD/textdump.cpp \
$$PWD/eventfilter.cpp \
$$PWD/qwindowdump.cpp \
+ $$PWD/debugproxystyle.cpp
HEADERS += \
$$PWD/textdump.h \
$$PWD/eventfilter.h \
$$PWD/qwindowdump.h \
- $$PWD/nativewindowdump.h
+ $$PWD/nativewindowdump.h \
+ $$PWD/debugproxystyle.h
win32 {
SOURCES += $$PWD/nativewindowdump_win.cpp
diff --git a/tests/manual/gestures/graphicsview/graphicsview.pro b/tests/manual/gestures/graphicsview/graphicsview.pro
index 4cc989efd2..9ecd0b372f 100644
--- a/tests/manual/gestures/graphicsview/graphicsview.pro
+++ b/tests/manual/gestures/graphicsview/graphicsview.pro
@@ -8,4 +8,3 @@ SOURCES += main.cpp \
HEADERS += imageitem.h \
gestures.h \
mousepangesturerecognizer.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/gestures/graphicsview/main.cpp b/tests/manual/gestures/graphicsview/main.cpp
index 062a1643df..30fd79ec8f 100644
--- a/tests/manual/gestures/graphicsview/main.cpp
+++ b/tests/manual/gestures/graphicsview/main.cpp
@@ -175,7 +175,7 @@ void MainWindow::setDirectory(const QString &path)
QDir dir(path);
QStringList files = dir.entryList(QDir::Files | QDir::Readable | QDir::NoDotAndDotDot);
foreach(const QString &file, files) {
- QImageReader img(path + QLatin1String("/")+file);
+ QImageReader img(path + QLatin1Char('/') +file);
QImage image = img.read();
if (!image.isNull()) {
{
diff --git a/tests/manual/gestures/scrollarea/scrollarea.pro b/tests/manual/gestures/scrollarea/scrollarea.pro
index a4854e2599..84e2af3f49 100644
--- a/tests/manual/gestures/scrollarea/scrollarea.pro
+++ b/tests/manual/gestures/scrollarea/scrollarea.pro
@@ -3,4 +3,3 @@ QT += widgets
SOURCES = main.cpp \
mousepangesturerecognizer.cpp
HEADERS += mousepangesturerecognizer.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/highdpi/dragwidget.cpp b/tests/manual/highdpi/dragwidget.cpp
index b203566696..dacafef203 100644
--- a/tests/manual/highdpi/dragwidget.cpp
+++ b/tests/manual/highdpi/dragwidget.cpp
@@ -166,7 +166,7 @@ void DragWidget::mousePressEvent(QMouseEvent *event)
QMimeData *mimeData = new QMimeData;
mimeData->setText(child->text());
mimeData->setData("application/x-hotspot",
- QByteArray::number(hotSpot.x()) + " " + QByteArray::number(hotSpot.y()));
+ QByteArray::number(hotSpot.x()) + ' ' + QByteArray::number(hotSpot.y()));
QPixmap pixmap(child->size());
child->render(&pixmap);
diff --git a/tests/manual/highdpi/main.cpp b/tests/manual/highdpi/main.cpp
index 692a60d511..3e0073dd52 100644
--- a/tests/manual/highdpi/main.cpp
+++ b/tests/manual/highdpi/main.cpp
@@ -139,7 +139,7 @@ private slots:
// update label, add ".0" if needed.
QString number = QString::number(scalefactorF);
- if (!number.contains("."))
+ if (!number.contains(QLatin1Char('.')))
number.append(".0");
m_label->setText(number);
}
@@ -203,8 +203,8 @@ DemoController::DemoController(DemoContainerList *demos, QCommandLineParser *par
foreach (QScreen *screen, screens) {
// create scale control line
QSize screenSize = screen->geometry().size();
- QString screenId = screen->name() + " " + QString::number(screenSize.width())
- + " " + QString::number(screenSize.height());
+ QString screenId = screen->name() + QLatin1Char(' ') + QString::number(screenSize.width())
+ + QLatin1Char(' ') + QString::number(screenSize.height());
LabelSlider *slider = new LabelSlider(this, screenId, layout, layoutRow++);
slider->setValue(getScreenFactorWithoutPixelDensity(screen) * 10);
diff --git a/tests/manual/inputmethodhints/inputmethodhints.pro b/tests/manual/inputmethodhints/inputmethodhints.pro
index 2f6608b602..f253f72332 100644
--- a/tests/manual/inputmethodhints/inputmethodhints.pro
+++ b/tests/manual/inputmethodhints/inputmethodhints.pro
@@ -8,4 +8,3 @@ SOURCES += main.cpp \
inputmethodhints.cpp
FORMS += inputmethodhints.ui
RESOURCES +=
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/keypadnavigation/keypadnavigation.pro b/tests/manual/keypadnavigation/keypadnavigation.pro
index 3ec3241998..a45d38af21 100644
--- a/tests/manual/keypadnavigation/keypadnavigation.pro
+++ b/tests/manual/keypadnavigation/keypadnavigation.pro
@@ -1,4 +1,3 @@
QT += widgets
SOURCES += main.cpp
FORMS += keypadnavigation.ui
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/lance/lance.pro b/tests/manual/lance/lance.pro
index 430c9196e6..312106c2f0 100644
--- a/tests/manual/lance/lance.pro
+++ b/tests/manual/lance/lance.pro
@@ -16,4 +16,3 @@ RESOURCES += icons.qrc \
qtHaveModule(opengl): QT += opengl
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/lance/main.cpp b/tests/manual/lance/main.cpp
index 6c0a651ce6..79e72cb5b3 100644
--- a/tests/manual/lance/main.cpp
+++ b/tests/manual/lance/main.cpp
@@ -602,7 +602,7 @@ int main(int argc, char **argv)
pcmd.setType(type);
pcmd.setCheckersBackground(checkers_background);
pcmd.setContents(content);
- QString file = QString(files.at(j)).replace(".", "_") + ".ps";
+ QString file = QString(files.at(j)).replace(QLatin1Char('.'), QLatin1Char('_')) + ".ps";
QPrinter p(highres ? QPrinter::HighResolution : QPrinter::ScreenResolution);
if (printdlg) {
diff --git a/tests/manual/network_remote_stresstest/network_remote_stresstest.pro b/tests/manual/network_remote_stresstest/network_remote_stresstest.pro
index 736747e486..754776f7e9 100644
--- a/tests/manual/network_remote_stresstest/network_remote_stresstest.pro
+++ b/tests/manual/network_remote_stresstest/network_remote_stresstest.pro
@@ -7,4 +7,3 @@ SOURCES += tst_network_remote_stresstest.cpp
RESOURCES += url-list.qrc
LIBS += $$QMAKE_LIBS_NETWORK
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/network_remote_stresstest/tst_network_remote_stresstest.cpp b/tests/manual/network_remote_stresstest/tst_network_remote_stresstest.cpp
index 486c5179b7..df61325439 100644
--- a/tests/manual/network_remote_stresstest/tst_network_remote_stresstest.cpp
+++ b/tests/manual/network_remote_stresstest/tst_network_remote_stresstest.cpp
@@ -246,30 +246,31 @@ void tst_NetworkRemoteStressTest::blockingSequentialRemoteHosts()
socket = QSharedPointer<QTcpSocket>(new QTcpSocket);
socket->connectToHost(url.host(), url.port(isHttps ? 443 : 80));
- QVERIFY2(socket->waitForConnected(10000), "Timeout connecting to " + url.encodedHost());
+ const QByteArray encodedHost = url.host(QUrl::FullyEncoded).toLatin1();
+ QVERIFY2(socket->waitForConnected(10000), "Timeout connecting to " + encodedHost);
#ifndef QT_NO_SSL
if (isHttps) {
static_cast<QSslSocket *>(socket.data())->setProtocol(QSsl::TlsV1_0);
static_cast<QSslSocket *>(socket.data())->startClientEncryption();
static_cast<QSslSocket *>(socket.data())->ignoreSslErrors();
- QVERIFY2(static_cast<QSslSocket *>(socket.data())->waitForEncrypted(10000), "Timeout starting TLS with " + url.encodedHost());
+ QVERIFY2(static_cast<QSslSocket *>(socket.data())->waitForEncrypted(10000), "Timeout starting TLS with " + encodedHost);
}
#endif // QT_NO_SSL
socket->write("GET " + url.toEncoded(QUrl::RemoveScheme | QUrl::RemoveAuthority | QUrl::RemoveFragment) + " HTTP/1.0\r\n"
"Connection: close\r\n"
"User-Agent: tst_QTcpSocket_stresstest/1.0\r\n"
- "Host: " + url.encodedHost() + "\r\n"
+ "Host: " + encodedHost + "\r\n"
"\r\n");
while (socket->bytesToWrite())
- QVERIFY2(socket->waitForBytesWritten(10000), "Timeout writing to " + url.encodedHost());
+ QVERIFY2(socket->waitForBytesWritten(10000), "Timeout writing to " + encodedHost);
while (socket->state() == QAbstractSocket::ConnectedState && !timeout.hasExpired(10000)) {
socket->waitForReadyRead(10000);
byteCounter += socket->readAll().size(); // discard
}
- QVERIFY2(!timeout.hasExpired(10000), "Timeout reading from " + url.encodedHost());
+ QVERIFY2(!timeout.hasExpired(10000), "Timeout reading from " + encodedHost);
totalBytes += byteCounter;
if (intermediateDebug) {
@@ -318,16 +319,17 @@ void tst_NetworkRemoteStressTest::sequentialRemoteHosts()
socket->connectToHost(url.host(), url.port(80));
}
+ const QByteArray encodedHost = url.host(QUrl::FullyEncoded).toLatin1();
socket->write("GET " + url.toEncoded(QUrl::RemoveScheme | QUrl::RemoveAuthority | QUrl::RemoveFragment) + " HTTP/1.0\r\n"
"Connection: close\r\n"
"User-Agent: tst_QTcpSocket_stresstest/1.0\r\n"
- "Host: " + url.encodedHost() + "\r\n"
+ "Host: " + encodedHost + "\r\n"
"\r\n");
connect(socket.data(), SIGNAL(readyRead()), SLOT(slotReadAll()));
QTestEventLoop::instance().connect(socket.data(), SIGNAL(disconnected()), SLOT(exitLoop()));
QTestEventLoop::instance().enterLoop(30);
- QVERIFY2(!QTestEventLoop::instance().timeout(), "Timeout with " + url.encodedHost() + "; "
+ QVERIFY2(!QTestEventLoop::instance().timeout(), "Timeout with " + encodedHost + "; "
+ QByteArray::number(socket->bytesToWrite()) + " bytes to write");
totalBytes += byteCounter;
@@ -397,10 +399,11 @@ void tst_NetworkRemoteStressTest::parallelRemoteHosts()
socket->connectToHost(url.host(), url.port(isHttps ? 443 : 80));
}
+ const QByteArray encodedHost = url.host(QUrl::FullyEncoded).toLatin1();
socket->write("GET " + url.toEncoded(QUrl::RemoveScheme | QUrl::RemoveAuthority | QUrl::RemoveFragment) + " HTTP/1.0\r\n"
"Connection: close\r\n"
"User-Agent: tst_QTcpSocket_stresstest/1.0\r\n"
- "Host: " + url.encodedHost() + "\r\n"
+ "Host: " + encodedHost + "\r\n"
"\r\n");
connect(socket, SIGNAL(readyRead()), SLOT(slotReadAll()));
QTestEventLoop::instance().connect(socket, SIGNAL(disconnected()), SLOT(exitLoop()));
diff --git a/tests/manual/network_stresstest/minihttpserver.cpp b/tests/manual/network_stresstest/minihttpserver.cpp
index d97fd7ec96..1a5fefcce7 100644
--- a/tests/manual/network_stresstest/minihttpserver.cpp
+++ b/tests/manual/network_stresstest/minihttpserver.cpp
@@ -141,7 +141,7 @@ void MiniHttpServerConnection::handlePendingRequest()
}
QUrl uri = QUrl::fromEncoded(request.mid(4, eol - int(strlen(http11)) - 4));
- source.setFileName(":" + uri.path());
+ source.setFileName(QLatin1Char(':') + uri.path());
// connection-close?
request = request.toLower();
diff --git a/tests/manual/qcursor/allcursors/allcursors.pro b/tests/manual/qcursor/allcursors/allcursors.pro
index c85ef861c2..b9f6a0c98d 100644
--- a/tests/manual/qcursor/allcursors/allcursors.pro
+++ b/tests/manual/qcursor/allcursors/allcursors.pro
@@ -14,4 +14,3 @@ SOURCES += main.cpp\
HEADERS += mainwindow.h
FORMS += mainwindow.ui
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qcursor/grab_override/grab_override.pro b/tests/manual/qcursor/grab_override/grab_override.pro
index d163a726c3..d84e2ee2b8 100644
--- a/tests/manual/qcursor/grab_override/grab_override.pro
+++ b/tests/manual/qcursor/grab_override/grab_override.pro
@@ -16,4 +16,3 @@ HEADERS += mainwindow.h
FORMS += mainwindow.ui
RESOURCES += images.qrc
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qdesktopwidget/qdesktopwidget.pro b/tests/manual/qdesktopwidget/qdesktopwidget.pro
index 8d10589476..8979e7ef35 100644
--- a/tests/manual/qdesktopwidget/qdesktopwidget.pro
+++ b/tests/manual/qdesktopwidget/qdesktopwidget.pro
@@ -1,4 +1,3 @@
TEMPLATE = app
QT += widgets
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qgraphicsitemgroup/qgraphicsitemgroup.pro b/tests/manual/qgraphicsitemgroup/qgraphicsitemgroup.pro
index a45ad29a5b..6135f74b8b 100644
--- a/tests/manual/qgraphicsitemgroup/qgraphicsitemgroup.pro
+++ b/tests/manual/qgraphicsitemgroup/qgraphicsitemgroup.pro
@@ -7,4 +7,3 @@ SOURCES += main.cpp \
HEADERS += widget.h \
customitem.h
FORMS += widget.ui
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qgraphicslayout/flicker/flicker.pro b/tests/manual/qgraphicslayout/flicker/flicker.pro
index 12506c5571..d800418f85 100644
--- a/tests/manual/qgraphicslayout/flicker/flicker.pro
+++ b/tests/manual/qgraphicslayout/flicker/flicker.pro
@@ -1,4 +1,3 @@
QT += widgets
HEADERS += window.h
SOURCES += main.cpp window.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qhttpnetworkconnection/qhttpnetworkconnection.pro b/tests/manual/qhttpnetworkconnection/qhttpnetworkconnection.pro
index 8440453cb7..62838785d6 100644
--- a/tests/manual/qhttpnetworkconnection/qhttpnetworkconnection.pro
+++ b/tests/manual/qhttpnetworkconnection/qhttpnetworkconnection.pro
@@ -5,4 +5,3 @@ QT -= gui
QT += network testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qimagereader/qimagereader.pro b/tests/manual/qimagereader/qimagereader.pro
index 99e96537dc..3523257f3e 100644
--- a/tests/manual/qimagereader/qimagereader.pro
+++ b/tests/manual/qimagereader/qimagereader.pro
@@ -1,3 +1,2 @@
QT += widgets
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qlocale/qlocale.pro b/tests/manual/qlocale/qlocale.pro
index 98079c7690..a5a2766e65 100644
--- a/tests/manual/qlocale/qlocale.pro
+++ b/tests/manual/qlocale/qlocale.pro
@@ -1,4 +1,3 @@
QT += widgets
HEADERS += currency.h calendar.h dateformats.h numberformats.h languages.h window.h miscellaneous.h info.h
SOURCES += currency.cpp main.cpp calendar.cpp dateformats.cpp numberformats.cpp languages.cpp window.cpp miscellaneous.cpp info.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qnetworkaccessmanager/qget/qget.cpp b/tests/manual/qnetworkaccessmanager/qget/qget.cpp
index 000e268c6e..cb435a792c 100644
--- a/tests/manual/qnetworkaccessmanager/qget/qget.cpp
+++ b/tests/manual/qnetworkaccessmanager/qget/qget.cpp
@@ -159,7 +159,7 @@ int main(int argc, char *argv[])
headersFile=str.mid(10);
else if (str == "--serial")
dl.setQueueMode(DownloadManager::Serial);
- else if (str.startsWith("-"))
+ else if (str.startsWith(QLatin1Char('-')))
qDebug() << "unsupported option" << str;
else {
QUrl url(QUrl::fromUserInput(str));
diff --git a/tests/manual/qnetworkaccessmanager/qget/qget.pro b/tests/manual/qnetworkaccessmanager/qget/qget.pro
index 082ffa7ac8..8a632f8d4e 100644
--- a/tests/manual/qnetworkaccessmanager/qget/qget.pro
+++ b/tests/manual/qnetworkaccessmanager/qget/qget.pro
@@ -6,4 +6,3 @@ SOURCES += qget.cpp
SOURCES += transferitem.cpp
SOURCES += downloadmanager.cpp
HEADERS += qget.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qnetworkaccessmanager/qget/transferitem.cpp b/tests/manual/qnetworkaccessmanager/qget/transferitem.cpp
index 13fba9f2e5..2e975cdfb2 100644
--- a/tests/manual/qnetworkaccessmanager/qget/transferitem.cpp
+++ b/tests/manual/qnetworkaccessmanager/qget/transferitem.cpp
@@ -42,9 +42,9 @@ TransferItem::TransferItem(const QNetworkRequest &r, const QString &u, const QSt
void TransferItem::progress(qint64 sent, qint64 total)
{
if (total > 0)
- qDebug() << (sent*100/total) << "%";
+ qDebug() << (sent*100/total) << '%';
else
- qDebug() << sent << "B";
+ qDebug() << sent << 'B';
}
void TransferItem::start()
diff --git a/tests/manual/qnetworkconfigurationmanager/qnetworkconfigurationmanager.pro b/tests/manual/qnetworkconfigurationmanager/qnetworkconfigurationmanager.pro
index 79de15933e..8f9314cc96 100644
--- a/tests/manual/qnetworkconfigurationmanager/qnetworkconfigurationmanager.pro
+++ b/tests/manual/qnetworkconfigurationmanager/qnetworkconfigurationmanager.pro
@@ -5,4 +5,3 @@ QT -= gui
QT += network testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qnetworkreply/main.cpp b/tests/manual/qnetworkreply/main.cpp
index 98825f02ba..7630cff0bc 100644
--- a/tests/manual/qnetworkreply/main.cpp
+++ b/tests/manual/qnetworkreply/main.cpp
@@ -177,7 +177,7 @@ void tst_qnetworkreply::setSslConfiguration()
#ifdef QT_BUILD_INTERNAL
QFETCH(bool, works);
bool rootCertLoadingAllowed = QSslSocketPrivate::rootCertOnDemandLoadingSupported();
-#if defined(Q_OS_LINUX) || defined (Q_OS_BLACKBERRY)
+#if defined(Q_OS_LINUX)
QCOMPARE(rootCertLoadingAllowed, true);
#elif defined(Q_OS_MAC)
QCOMPARE(rootCertLoadingAllowed, false);
diff --git a/tests/manual/qnetworkreply/qnetworkreply.pro b/tests/manual/qnetworkreply/qnetworkreply.pro
index 64666103a0..eddcbdff1d 100644
--- a/tests/manual/qnetworkreply/qnetworkreply.pro
+++ b/tests/manual/qnetworkreply/qnetworkreply.pro
@@ -5,4 +5,3 @@ QT -= gui
QT += core-private network network-private testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qscreen/propertyfield.cpp b/tests/manual/qscreen/propertyfield.cpp
index 01f38624d4..a8cf90c9bb 100644
--- a/tests/manual/qscreen/propertyfield.cpp
+++ b/tests/manual/qscreen/propertyfield.cpp
@@ -87,7 +87,7 @@ void PropertyField::propertyChanged()
m_lastChangeTime = QTime::currentTime().addSecs(-5);
}
- qDebug() << " " << QString::fromUtf8(m_prop.name()) << ":" << val;
+ qDebug() << " " << QString::fromUtf8(m_prop.name()) << ':' << val;
// If the value has recently changed, show the change
if (text != m_lastText || m_lastChangeTime.elapsed() < 1000) {
setText(m_lastTextShowing + " -> " + text);
diff --git a/tests/manual/qssloptions/qssloptions.pro b/tests/manual/qssloptions/qssloptions.pro
index d4325b0fd1..a98fd61f51 100644
--- a/tests/manual/qssloptions/qssloptions.pro
+++ b/tests/manual/qssloptions/qssloptions.pro
@@ -6,4 +6,3 @@ QT += network testlib
#CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qt_poll/qt_poll.pro b/tests/manual/qt_poll/qt_poll.pro
new file mode 100644
index 0000000000..beea4d1316
--- /dev/null
+++ b/tests/manual/qt_poll/qt_poll.pro
@@ -0,0 +1,7 @@
+CONFIG += testcase
+TARGET = tst_qt_poll
+QT = core-private network testlib
+INCLUDEPATH += ../../../src/corelib/kernel
+SOURCES += \
+ tst_qt_poll.cpp \
+ ../../../src/corelib/kernel/qpoll.cpp
diff --git a/tests/manual/qt_poll/tst_qt_poll.cpp b/tests/manual/qt_poll/tst_qt_poll.cpp
new file mode 100644
index 0000000000..56e41e4093
--- /dev/null
+++ b/tests/manual/qt_poll/tst_qt_poll.cpp
@@ -0,0 +1,155 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT_NO_NATIVE_POLL
+#define QT_NO_NATIVE_POLL
+#endif
+
+#include <QtTest/QtTest>
+#include <QtNetwork>
+
+#include <private/qcore_unix_p.h>
+
+QT_BEGIN_NAMESPACE
+// defined in qpoll.cpp
+int qt_poll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout_ts);
+QT_END_NAMESPACE
+
+class tst_qt_poll : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void pollout();
+ void pollin();
+ void pollnval();
+ void pollprihup();
+};
+
+void tst_qt_poll::pollout()
+{
+ int fds[2];
+ QCOMPARE(pipe(fds), 0);
+
+ struct pollfd pfd = { fds[1], POLLOUT, 0 };
+ const int nready = qt_poll(&pfd, 1, NULL);
+
+ QCOMPARE(nready, 1);
+ QCOMPARE(pfd.revents, short(POLLOUT));
+
+ qt_safe_close(fds[0]);
+ qt_safe_close(fds[1]);
+}
+
+void tst_qt_poll::pollin()
+{
+ int fds[2];
+ QCOMPARE(pipe(fds), 0);
+
+ const char data = 'Q';
+ QCOMPARE(qt_safe_write(fds[1], &data, 1), 1);
+
+ struct pollfd pfd = { fds[0], POLLIN, 0 };
+ const int nready = qt_poll(&pfd, 1, NULL);
+
+ QCOMPARE(nready, 1);
+ QCOMPARE(pfd.revents, short(POLLIN));
+
+ qt_safe_close(fds[0]);
+ qt_safe_close(fds[1]);
+}
+
+void tst_qt_poll::pollnval()
+{
+ struct pollfd pfd = { 42, POLLOUT, 0 };
+
+ int nready = qt_poll(&pfd, 1, NULL);
+ QCOMPARE(nready, 1);
+ QCOMPARE(pfd.revents, short(POLLNVAL));
+
+ pfd.events = 0;
+ pfd.revents = 0;
+
+ nready = qt_poll(&pfd, 1, NULL);
+ QCOMPARE(nready, 1);
+ QCOMPARE(pfd.revents, short(POLLNVAL));
+}
+
+void tst_qt_poll::pollprihup()
+{
+ QTcpServer server;
+ QTcpSocket client_socket;
+
+ QVERIFY(server.listen(QHostAddress::LocalHost));
+
+ const quint16 server_port = server.serverPort();
+ client_socket.connectToHost(server.serverAddress(), server_port);
+
+ QVERIFY(client_socket.waitForConnected());
+ QVERIFY(server.waitForNewConnection());
+
+ QTcpSocket *server_socket = server.nextPendingConnection();
+ server.close();
+
+ // TCP supports only a single byte of urgent data
+ static const char oob_out = 'Q';
+ QCOMPARE(::send(server_socket->socketDescriptor(), &oob_out, 1, MSG_OOB),
+ ssize_t(1));
+
+ struct pollfd pfd = {
+ int(client_socket.socketDescriptor()),
+ POLLPRI | POLLIN,
+ 0
+ };
+ int res = qt_poll(&pfd, 1, NULL);
+
+ QCOMPARE(res, 1);
+ QCOMPARE(pfd.revents, short(POLLPRI | POLLIN));
+
+ char oob_in = 0;
+ // We do not specify MSG_OOB here as SO_OOBINLINE is turned on by default
+ // in the native socket engine
+ QCOMPARE(::recv(client_socket.socketDescriptor(), &oob_in, 1, 0),
+ ssize_t(1));
+ QCOMPARE(oob_in, oob_out);
+
+ server_socket->close();
+ pfd.events = POLLIN;
+ res = qt_poll(&pfd, 1, NULL);
+
+ QCOMPARE(res, 1);
+ QCOMPARE(pfd.revents, short(POLLHUP));
+}
+
+QTEST_APPLESS_MAIN(tst_qt_poll)
+#include "tst_qt_poll.moc"
diff --git a/tests/manual/qtabletevent/device_information/device_information.pro b/tests/manual/qtabletevent/device_information/device_information.pro
index 59669843ba..727ad34bc1 100644
--- a/tests/manual/qtabletevent/device_information/device_information.pro
+++ b/tests/manual/qtabletevent/device_information/device_information.pro
@@ -4,4 +4,3 @@ SOURCES += \
tabletwidget.cpp
HEADERS += \
tabletwidget.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qtabletevent/device_information/tabletwidget.cpp b/tests/manual/qtabletevent/device_information/tabletwidget.cpp
index f1d838f01d..f868d5a910 100644
--- a/tests/manual/qtabletevent/device_information/tabletwidget.cpp
+++ b/tests/manual/qtabletevent/device_information/tabletwidget.cpp
@@ -61,7 +61,7 @@ bool TabletWidget::eventFilter(QObject *, QEvent *ev)
mType = event->type();
mPos = event->pos();
mGPos = event->globalPos();
- mHiResGlobalPos = event->hiResGlobalPos();
+ mHiResGlobalPos = event->posF();
mDev = event->device();
mPointerType = event->pointerType();
mUnique = event->uniqueId();
@@ -201,7 +201,7 @@ QString TabletWidget::buttonsToString(Qt::MouseButtons bs)
if (bs.testFlag(b))
ret << buttonToString(b);
}
- return ret.join("|");
+ return ret.join(QLatin1Char('|'));
}
void TabletWidget::tabletEvent(QTabletEvent *event)
diff --git a/tests/manual/qtabletevent/event_compression/event_compression.pro b/tests/manual/qtabletevent/event_compression/event_compression.pro
index 8300c33c87..15650d6190 100644
--- a/tests/manual/qtabletevent/event_compression/event_compression.pro
+++ b/tests/manual/qtabletevent/event_compression/event_compression.pro
@@ -3,4 +3,3 @@ QT += widgets testlib
SOURCES += main.cpp \
mousestatwidget.cpp
HEADERS += mousestatwidget.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qtabletevent/regular_widgets/regular_widgets.pro b/tests/manual/qtabletevent/regular_widgets/regular_widgets.pro
index fa41d09d1b..8f1f4342ee 100644
--- a/tests/manual/qtabletevent/regular_widgets/regular_widgets.pro
+++ b/tests/manual/qtabletevent/regular_widgets/regular_widgets.pro
@@ -2,4 +2,3 @@ TEMPLATE = app
QT += widgets
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qtbug-8933/qtbug-8933.pro b/tests/manual/qtbug-8933/qtbug-8933.pro
index 0d8bfcc797..4600d47cac 100644
--- a/tests/manual/qtbug-8933/qtbug-8933.pro
+++ b/tests/manual/qtbug-8933/qtbug-8933.pro
@@ -14,4 +14,3 @@ SOURCES += main.cpp\
HEADERS += widget.h
FORMS += widget.ui
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qtouchevent/qtouchevent.pro b/tests/manual/qtouchevent/qtouchevent.pro
index 6a1ca85335..81384eaf24 100644
--- a/tests/manual/qtouchevent/qtouchevent.pro
+++ b/tests/manual/qtouchevent/qtouchevent.pro
@@ -4,4 +4,3 @@ SOURCES = main.cpp \
touchwidget.cpp
FORMS += form.ui
HEADERS += touchwidget.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qwidget_zorder/qwidget_zorder.pro b/tests/manual/qwidget_zorder/qwidget_zorder.pro
index 99e96537dc..3523257f3e 100644
--- a/tests/manual/qwidget_zorder/qwidget_zorder.pro
+++ b/tests/manual/qwidget_zorder/qwidget_zorder.pro
@@ -1,3 +1,2 @@
QT += widgets
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/repaint/mainwindow/mainwindow.pro b/tests/manual/repaint/mainwindow/mainwindow.pro
index 1fc3773864..f20e5fe402 100644
--- a/tests/manual/repaint/mainwindow/mainwindow.pro
+++ b/tests/manual/repaint/mainwindow/mainwindow.pro
@@ -1,4 +1,3 @@
QT += widgets
HEADERS += ../shared/shared.h
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/repaint/scrollarea/scrollarea.pro b/tests/manual/repaint/scrollarea/scrollarea.pro
index 1fc3773864..f20e5fe402 100644
--- a/tests/manual/repaint/scrollarea/scrollarea.pro
+++ b/tests/manual/repaint/scrollarea/scrollarea.pro
@@ -1,4 +1,3 @@
QT += widgets
HEADERS += ../shared/shared.h
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/repaint/splitter/splitter.pro b/tests/manual/repaint/splitter/splitter.pro
index 1fc3773864..f20e5fe402 100644
--- a/tests/manual/repaint/splitter/splitter.pro
+++ b/tests/manual/repaint/splitter/splitter.pro
@@ -1,4 +1,3 @@
QT += widgets
HEADERS += ../shared/shared.h
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/repaint/tableview/tableview.pro b/tests/manual/repaint/tableview/tableview.pro
index ae27c84109..6a5aaad251 100644
--- a/tests/manual/repaint/tableview/tableview.pro
+++ b/tests/manual/repaint/tableview/tableview.pro
@@ -1,4 +1,3 @@
QT += widgets
HEADERS +=../shared/shared.h
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/repaint/task141091/task141091.pro b/tests/manual/repaint/task141091/task141091.pro
index a7db71ba3e..b54299e540 100644
--- a/tests/manual/repaint/task141091/task141091.pro
+++ b/tests/manual/repaint/task141091/task141091.pro
@@ -1,4 +1,3 @@
CONFIG += console
QT += widgets
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/repaint/toplevel/toplevel.pro b/tests/manual/repaint/toplevel/toplevel.pro
index 827a7e2dac..a881c24f56 100644
--- a/tests/manual/repaint/toplevel/toplevel.pro
+++ b/tests/manual/repaint/toplevel/toplevel.pro
@@ -3,4 +3,3 @@ QT += widgets
HEADERS += ../shared/shared.h
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/repaint/widget/widget.pro b/tests/manual/repaint/widget/widget.pro
index 1fc3773864..f20e5fe402 100644
--- a/tests/manual/repaint/widget/widget.pro
+++ b/tests/manual/repaint/widget/widget.pro
@@ -1,4 +1,3 @@
QT += widgets
HEADERS += ../shared/shared.h
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/socketengine/socketengine.pro b/tests/manual/socketengine/socketengine.pro
index 3da17c2d49..d379628669 100644
--- a/tests/manual/socketengine/socketengine.pro
+++ b/tests/manual/socketengine/socketengine.pro
@@ -5,4 +5,3 @@ QT -= gui
QT += network-private core-private testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/textrendering/glyphshaping/glyphshaping.pro b/tests/manual/textrendering/glyphshaping/glyphshaping.pro
index 5dc8542e86..6500814423 100644
--- a/tests/manual/textrendering/glyphshaping/glyphshaping.pro
+++ b/tests/manual/textrendering/glyphshaping/glyphshaping.pro
@@ -4,4 +4,3 @@ OTHER_FILES = glyphshaping_data.xml
glyphshaping_data.path = .
glyphshaping_data.files = $$PWD/glyphshaping_data.xml
DEPLOYMENT += glyphshaping_data
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/textrendering/textperformance/textperformance.pro b/tests/manual/textrendering/textperformance/textperformance.pro
index acfd7b1906..f07a4f0294 100644
--- a/tests/manual/textrendering/textperformance/textperformance.pro
+++ b/tests/manual/textrendering/textperformance/textperformance.pro
@@ -1,3 +1,2 @@
QT += widgets
SOURCES = main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/unc/main.cpp b/tests/manual/unc/main.cpp
index d507bb2ba4..b5893eda20 100644
--- a/tests/manual/unc/main.cpp
+++ b/tests/manual/unc/main.cpp
@@ -63,7 +63,7 @@ protected:
label->setTextInteractionFlags(Qt::TextBrowserInteraction);
label->setOpenExternalLinks(true);
- QString link("<a href=" + path + ">" + path + "</a>");
+ QString link("<a href=" + path + QLatin1Char('>') + path + "</a>");
label->setText(link);
return label;
diff --git a/tests/manual/widgetgrab/widgetgrab.pro b/tests/manual/widgetgrab/widgetgrab.pro
index f1d2b0e65f..d206fb1df1 100644
--- a/tests/manual/widgetgrab/widgetgrab.pro
+++ b/tests/manual/widgetgrab/widgetgrab.pro
@@ -6,5 +6,4 @@ SOURCES += main.cpp
greaterThan(QT_MAJOR_VERSION, 4) {
QT += widgets
- DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
}
diff --git a/tests/manual/widgets/itemviews/delegate/delegate.pro b/tests/manual/widgets/itemviews/delegate/delegate.pro
index 1ce6d141ab..e5c90f18ec 100644
--- a/tests/manual/widgets/itemviews/delegate/delegate.pro
+++ b/tests/manual/widgets/itemviews/delegate/delegate.pro
@@ -1,4 +1,3 @@
TEMPLATE = app
QT += widgets
SOURCES=example.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/widgets/itemviews/qheaderview/qheaderview.pro b/tests/manual/widgets/itemviews/qheaderview/qheaderview.pro
index f83136266d..ac40c6e9e1 100644
--- a/tests/manual/widgets/itemviews/qheaderview/qheaderview.pro
+++ b/tests/manual/widgets/itemviews/qheaderview/qheaderview.pro
@@ -1,4 +1,3 @@
TEMPLATE = app
SOURCES = qheaderviewtest1.cpp
QT += widgets
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/widgets/itemviews/qtreeview/qtreeview.pro b/tests/manual/widgets/itemviews/qtreeview/qtreeview.pro
index c241ee1045..f06006ea3a 100644
--- a/tests/manual/widgets/itemviews/qtreeview/qtreeview.pro
+++ b/tests/manual/widgets/itemviews/qtreeview/qtreeview.pro
@@ -1,4 +1,3 @@
TEMPLATE = app
SOURCES = main.cpp
QT += widgets
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/widgets/itemviews/qtreewidget/qtreewidget.pro b/tests/manual/widgets/itemviews/qtreewidget/qtreewidget.pro
index 4b1da9be38..1969392ab3 100644
--- a/tests/manual/widgets/itemviews/qtreewidget/qtreewidget.pro
+++ b/tests/manual/widgets/itemviews/qtreewidget/qtreewidget.pro
@@ -1,4 +1,3 @@
TEMPLATE = app
SOURCES = main.cpp
QT += widgets core-private
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/widgets/qgraphicsview/rubberband/rubberband.pro b/tests/manual/widgets/qgraphicsview/rubberband/rubberband.pro
index 805b0cc119..731756cff3 100644
--- a/tests/manual/widgets/qgraphicsview/rubberband/rubberband.pro
+++ b/tests/manual/widgets/qgraphicsview/rubberband/rubberband.pro
@@ -1,4 +1,3 @@
TEMPLATE = app
SOURCES = rubberbandtest.cpp
QT += gui widgets # core-private
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/windowflags/windowflags.pro b/tests/manual/windowflags/windowflags.pro
index 546264cafc..ba0f75b65c 100644
--- a/tests/manual/windowflags/windowflags.pro
+++ b/tests/manual/windowflags/windowflags.pro
@@ -8,4 +8,3 @@ SOURCES = controllerwindow.cpp \
controls.cpp
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/windowgeometry/windowgeometry.pro b/tests/manual/windowgeometry/windowgeometry.pro
index c0c7ef0217..e717799649 100644
--- a/tests/manual/windowgeometry/windowgeometry.pro
+++ b/tests/manual/windowgeometry/windowgeometry.pro
@@ -7,4 +7,3 @@ INCLUDEPATH += ../windowflags
SOURCES += $$PWD/main.cpp controllerwidget.cpp ../windowflags/controls.cpp
HEADERS += controllerwidget.h ../windowflags/controls.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/windowmodality/windowmodality.pro b/tests/manual/windowmodality/windowmodality.pro
index 12071fa7ee..b29e939d27 100644
--- a/tests/manual/windowmodality/windowmodality.pro
+++ b/tests/manual/windowmodality/windowmodality.pro
@@ -1,4 +1,3 @@
SOURCES = main.cpp
FORMS = widget.ui dialog.ui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tools/configure/Makefile.mingw b/tools/configure/Makefile.mingw
index 5bdfc3f32c..75061c0a15 100644
--- a/tools/configure/Makefile.mingw
+++ b/tools/configure/Makefile.mingw
@@ -6,7 +6,7 @@ RAW_PCH = configure_pch.h
PCH = $(RAW_PCH).gch/c++
DEFINES = -DUNICODE -DQT_NO_DATASTREAM -DQT_NO_CODECS -DQT_NO_TEXTCODEC -DQT_NO_UNICODETABLES -DQT_LITE_COMPONENT -DQT_NO_COMPRESS -DQT_NO_THREAD -DQT_NO_QOBJECT -DQT_NO_GEOM_VARIANT -D_CRT_SECURE_NO_DEPRECATE -DQT_BOOTSTRAPPED -DQT_BUILD_CONFIGURE -DQT_VERSION_STR=\"$(QTVERSION)\" -DQT_VERSION_MAJOR=$(QT_VERSION_MAJOR) -DQT_VERSION_MINOR=$(QT_VERSION_MINOR) -DQT_VERSION_PATCH=$(QT_VERSION_PATCH)
INCPATH = -I"../../include" -I"../../include/QtCore" -I"../../include/QtCore/$(QTVERSION)" -I"../../include/QtCore/$(QTVERSION)/QtCore" -I"$(TOOLSRC)/shared" -I"$(QTSRC)mkspecs/win32-g++"
-CXXFLAGS_BARE = -fno-rtti -fno-exceptions -mthreads -Wall -Wextra $(DEFINES) $(INCPATH)
+CXXFLAGS_BARE = -std=c++11 -fno-rtti -fno-exceptions -mthreads -Wall -Wextra $(DEFINES) $(INCPATH)
CXXFLAGS = -include $(RAW_PCH) $(CXXFLAGS_BARE)
LINK = g++
LFLAGS = -Wl,-subsystem,console -mthreads
diff --git a/tools/configure/Makefile.win32 b/tools/configure/Makefile.win32
index 8d6fe8bf72..c83ecaaeea 100644
--- a/tools/configure/Makefile.win32
+++ b/tools/configure/Makefile.win32
@@ -4,7 +4,7 @@ CONFSRC = $(TOOLSRC)\configure
PCH = configure_pch.pch
DEFINES = -DUNICODE -DQT_NO_CODECS -DQT_NO_TEXTCODEC -DQT_NO_UNICODETABLES -DQT_LITE_COMPONENT -DQT_NO_COMPRESS -DQT_NO_THREAD -DQT_NO_QOBJECT -DQT_NO_GEOM_VARIANT -D_CRT_SECURE_NO_DEPRECATE -DQT_BOOTSTRAPPED -DQT_BUILD_CONFIGURE -DQT_VERSION_STR=\"$(QTVERSION)\" -DQT_VERSION_MAJOR=$(QT_VERSION_MAJOR) -DQT_VERSION_MINOR=$(QT_VERSION_MINOR) -DQT_VERSION_PATCH=$(QT_VERSION_PATCH)
-INCPATH = -I"..\..\include" -I"..\..\include\QtCore" -I"..\..\include\QtCore\$(QTVERSION)" -I"..\..\include\QtCore\$(QTVERSION)\QtCore" -I"$(TOOLSRC)\shared" -I"$(QTSRC)mkspecs\win32-msvc2008"
+INCPATH = -I"..\..\include" -I"..\..\include\QtCore" -I"..\..\include\QtCore\$(QTVERSION)" -I"..\..\include\QtCore\$(QTVERSION)\QtCore" -I"$(TOOLSRC)\shared" -I"$(QTSRC)mkspecs\win32-msvc2012"
CXXFLAGS_BARE = -nologo -Zc:wchar_t -W3 -GR -EHsc -w34100 -w34189 -wd4577 $(CFLAGS_CRT) $(EXTRA_CXXFLAGS) $(DEFINES) $(INCPATH)
CXXFLAGS = -FIconfigure_pch.h -Yuconfigure_pch.h -Fp$(PCH) -MP $(CXXFLAGS_BARE)
LINK = link
diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp
index 160ccf5778..3bd95498e1 100644
--- a/tools/configure/configureapp.cpp
+++ b/tools/configure/configureapp.cpp
@@ -60,7 +60,6 @@ enum Platforms {
WINDOWS_CE,
WINDOWS_RT,
QNX,
- BLACKBERRY,
ANDROID,
OTHER
};
@@ -160,6 +159,7 @@ Configure::Configure(int& argc, char** argv) : verbose(0)
dictionary[ "SSE4_2" ] = "auto";
dictionary[ "AVX" ] = "auto";
dictionary[ "AVX2" ] = "auto";
+ dictionary[ "AVX512" ] = "auto";
dictionary[ "SYNCQT" ] = "auto";
dictionary[ "CE_CRT" ] = "no";
dictionary[ "CETEST" ] = "auto";
@@ -262,6 +262,7 @@ Configure::Configure(int& argc, char** argv) : verbose(0)
dictionary[ "PNG" ] = "auto";
dictionary[ "LIBJPEG" ] = "auto";
dictionary[ "LIBPNG" ] = "auto";
+ dictionary[ "DOUBLECONVERSION" ] = "auto";
dictionary[ "FREETYPE" ] = "yes";
dictionary[ "HARFBUZZ" ] = "qt";
@@ -280,7 +281,6 @@ Configure::Configure(int& argc, char** argv) : verbose(0)
dictionary[ "STYLE_FUSION" ] = "yes";
dictionary[ "STYLE_WINDOWSCE" ] = "no";
dictionary[ "STYLE_WINDOWSMOBILE" ] = "no";
- dictionary[ "STYLE_GTK" ] = "no";
dictionary[ "SQL_MYSQL" ] = "no";
dictionary[ "SQL_ODBC" ] = "no";
@@ -306,7 +306,7 @@ Configure::Configure(int& argc, char** argv) : verbose(0)
dictionary[ "NATIVE_GESTURES" ] = "yes";
dictionary[ "MSVC_MP" ] = "no";
- if (dictionary["QMAKESPEC"] == QString("win32-g++")) {
+ if (dictionary["QMAKESPEC"].startsWith("win32-g++")) {
const QString zero = QStringLiteral("0");
const QStringList parts = Environment::gccVersion().split(QLatin1Char('.'));
dictionary["QT_GCC_MAJOR_VERSION"] = parts.value(0, zero);
@@ -472,25 +472,21 @@ void Configure::parseCmdLine()
dictionary[ "COMPILE_EXAMPLES" ] = "no";
}
- else if (configCmdLine.at(i) == "-c++11")
- dictionary[ "C++STD" ] = "c++11";
- else if (configCmdLine.at(i) == "-no-c++11")
- dictionary[ "C++STD" ] = "c++98";
else if (configCmdLine.at(i) == "-c++std") {
++i;
if (i == argCount)
break;
QString level = configCmdLine.at(i);
- if (level == "c++98" || level == "c++11" || level == "c++14" || level == "c++1z"
+ if (level == "c++11" || level == "c++14" || level == "c++1z"
|| level == "auto") {
dictionary[ "C++STD" ] = level;
- } else if (level == "98" || level == "11" || level == "14" || level == "1z") {
+ } else if (level == "11" || level == "14" || level == "1z") {
dictionary[ "C++STD" ] = "c++" + level;
} else {
dictionary[ "DONE" ] = "error";
cout << "ERROR: invalid C++ standard " << level
- << "; valid options are: c++98 c++11 c++14 c++1z auto" << endl;
+ << "; valid options are: c++11 c++14 c++1z auto" << endl;
return;
}
}
@@ -632,6 +628,14 @@ void Configure::parseCmdLine()
dictionary[ "LIBPNG" ] = "system";
}
+ // Double Conversion -----------------------------------------
+ else if (configCmdLine.at(i) == "-no-doubleconversion")
+ dictionary[ "DOUBLECONVERSION" ] = "no";
+ else if (configCmdLine.at(i) == "-qt-doubleconversion")
+ dictionary[ "DOUBLECONVERSION" ] = "qt";
+ else if (configCmdLine.at(i) == "-system-doubleconversion")
+ dictionary[ "DOUBLECONVERSION" ] = "system";
+
// Text Rendering --------------------------------------------
else if (configCmdLine.at(i) == "-no-freetype")
dictionary[ "FREETYPE" ] = "no";
@@ -894,6 +898,10 @@ void Configure::parseCmdLine()
dictionary[ "AVX2" ] = "no";
else if (configCmdLine.at(i) == "-avx2")
dictionary[ "AVX2" ] = "yes";
+ else if (configCmdLine.at(i) == "-no-avx512")
+ dictionary[ "AVX512" ] = "";
+ else if (configCmdLine.at(i) == "-avx512")
+ dictionary[ "AVX512" ] = "auto";
else if (configCmdLine.at(i) == "-no-ssl") {
dictionary[ "SSL"] = "no";
@@ -903,8 +911,10 @@ void Configure::parseCmdLine()
dictionary[ "OPENSSL"] = "no";
} else if (configCmdLine.at(i) == "-openssl") {
dictionary[ "OPENSSL" ] = "yes";
+ dictionary[ "SSL" ] = "yes";
} else if (configCmdLine.at(i) == "-openssl-linked") {
dictionary[ "OPENSSL" ] = "linked";
+ dictionary[ "SSL" ] = "yes";
} else if (configCmdLine.at(i) == "-no-libproxy") {
dictionary[ "LIBPROXY"] = "no";
} else if (configCmdLine.at(i) == "-libproxy") {
@@ -1422,19 +1432,12 @@ void Configure::parseCmdLine()
cout << "See the README file for a list of supported operating systems and compilers." << endl;
} else {
if (dictionary[ "QMAKESPEC" ].endsWith("-icc") ||
- dictionary[ "QMAKESPEC" ].endsWith("-msvc") ||
- dictionary[ "QMAKESPEC" ].endsWith("-msvc.net") ||
- dictionary[ "QMAKESPEC" ].endsWith("-msvc2002") ||
- dictionary[ "QMAKESPEC" ].endsWith("-msvc2003") ||
- dictionary[ "QMAKESPEC" ].endsWith("-msvc2005") ||
- dictionary[ "QMAKESPEC" ].endsWith("-msvc2008") ||
- dictionary[ "QMAKESPEC" ].endsWith("-msvc2010") ||
dictionary[ "QMAKESPEC" ].endsWith("-msvc2012") ||
dictionary[ "QMAKESPEC" ].endsWith("-msvc2013") ||
dictionary[ "QMAKESPEC" ].endsWith("-msvc2015")) {
if (dictionary[ "MAKE" ].isEmpty()) dictionary[ "MAKE" ] = "nmake";
dictionary[ "QMAKEMAKEFILE" ] = "Makefile.win32";
- } else if (dictionary[ "QMAKESPEC" ] == QString("win32-g++")) {
+ } else if (dictionary[ "QMAKESPEC" ].startsWith(QLatin1String("win32-g++"))) {
if (dictionary[ "MAKE" ].isEmpty()) dictionary[ "MAKE" ] = "mingw32-make";
dictionary[ "QMAKEMAKEFILE" ] = "Makefile.unix";
} else {
@@ -1700,8 +1703,6 @@ void Configure::applySpecSpecifics()
dictionary[ "STYLE_WINDOWSCE" ] = "yes";
dictionary[ "STYLE_WINDOWSMOBILE" ] = "yes";
dictionary[ "OPENGL" ] = "no";
- dictionary[ "SSL" ] = "no";
- dictionary[ "OPENSSL" ] = "no";
dictionary[ "RTTI" ] = "no";
dictionary[ "SSE2" ] = "no";
dictionary[ "SSE3" ] = "no";
@@ -1710,6 +1711,7 @@ void Configure::applySpecSpecifics()
dictionary[ "SSE4_2" ] = "no";
dictionary[ "AVX" ] = "no";
dictionary[ "AVX2" ] = "no";
+ dictionary[ "AVX512" ] = "no";
dictionary[ "CE_CRT" ] = "yes";
dictionary[ "LARGE_FILE" ] = "no";
dictionary[ "ANGLE" ] = "no";
@@ -1736,7 +1738,7 @@ void Configure::applySpecSpecifics()
dictionary[ "ANGLE" ] = "no";
dictionary["DECORATIONS"] = "default windows styled";
- } else if ((platform() == QNX) || (platform() == BLACKBERRY)) {
+ } else if (platform() == QNX) {
dictionary["STACK_PROTECTOR_STRONG"] = "auto";
dictionary["SLOG2"] = "auto";
dictionary["QNX_IMF"] = "auto";
@@ -1746,6 +1748,7 @@ void Configure::applySpecSpecifics()
dictionary[ "ANGLE" ] = "no";
dictionary[ "DYNAMICGL" ] = "no";
dictionary[ "FONT_CONFIG" ] = "auto";
+ dictionary[ "POLL" ] = "poll";
} else if (platform() == ANDROID) {
dictionary[ "REDUCE_EXPORTS" ] = "yes";
dictionary[ "BUILD" ] = "release";
@@ -1758,6 +1761,7 @@ void Configure::applySpecSpecifics()
dictionary[ "QT_XKBCOMMON" ] = "no";
dictionary["ANDROID_STYLE_ASSETS"] = "yes";
dictionary[ "STYLE_ANDROID" ] = "yes";
+ dictionary[ "POLL" ] = "poll";
}
}
@@ -1825,7 +1829,7 @@ bool Configure::displayHelp()
desc("OPENSOURCE", "opensource", "-opensource", "Compile and link the Open-Source Edition of Qt.");
desc("COMMERCIAL", "commercial", "-commercial", "Compile and link the Commercial Edition of Qt.\n");
- desc( "-c++std <edition>", "Compile Qt with C++ standard edition (c++98, c++11, c++14, c++1z)\n"
+ desc( "-c++std <edition>", "Compile Qt with C++ standard edition (c++11, c++14, c++1z)\n"
"Default: highest supported. This option is not supported for MSVC.\n");
desc("USE_GOLD_LINKER", "yes", "-use-gold-linker", "Link using the GNU gold linker (gcc only).");
@@ -1966,6 +1970,10 @@ bool Configure::displayHelp()
desc("LIBJPEG", "qt", "-qt-libjpeg", "Use the libjpeg bundled with Qt.");
desc("LIBJPEG", "system","-system-libjpeg", "Use libjpeg from the operating system.\nSee http://www.ijg.org\n");
+ desc("DOUBLECONVERSION", "no", "-no-doubleconversion", "Use sscanf_l and snprintf_l for (imprecise) double conversion.");
+ desc("DOUBLECONVERSION", "qt", "-qt-doubleconversion", "Use the libdouble-conversion bundled with Qt.");
+ desc("DOUBLECONVERSION", "system", "-system-doubleconversion", "Use the libdouble-conversion provided by the system.");
+
desc("FREETYPE", "no", "-no-freetype", "Do not compile in Freetype2 support.");
desc("FREETYPE", "yes", "-qt-freetype", "Use the libfreetype bundled with Qt.");
desc("FREETYPE", "system","-system-freetype", "Use the libfreetype provided by the system.\n");
@@ -1982,7 +1990,7 @@ bool Configure::displayHelp()
"by setting the QT_HARFBUZZ environment variable to \"old\".\n"
"See http://www.harfbuzz.org\n");
- if ((platform() == QNX) || (platform() == BLACKBERRY)) {
+ if (platform() == QNX) {
desc("SLOG2", "yes", "-slog2", "Compile with slog2 support.");
desc("SLOG2", "no", "-no-slog2", "Do not compile with slog2 support.");
desc("QNX_IMF", "yes", "-imf", "Compile with imf support.");
@@ -2028,6 +2036,8 @@ bool Configure::displayHelp()
desc("AVX", "yes", "-avx", "Compile with use of AVX instructions.");
desc("AVX2", "no", "-no-avx2", "Do not compile with use of AVX2 instructions.");
desc("AVX2", "yes", "-avx2", "Compile with use of AVX2 instructions.\n");
+ desc("AVX512", "no", "-no-avx512", "Do not compile with use of AVX512 instructions.");
+ desc("AVX512", "yes", "-avx512", "Compile with use of AVX512 instructions.\n");
desc("SSL", "no", "-no-ssl", "Do not compile support for SSL.");
desc("SSL", "yes", "-ssl", "Enable run-time SSL support.");
desc("OPENSSL", "no", "-no-openssl", "Do not compile support for OpenSSL.");
@@ -2172,11 +2182,6 @@ bool Configure::checkAngleAvailability(QString *errorMessage /* = 0 */) const
// it is also present in MinGW.
const QString directXSdk = Environment::detectDirectXSdk();
const Compiler compiler = Environment::compilerFromQMakeSpec(dictionary[QStringLiteral("QMAKESPEC")]);
- if (compiler >= CC_MSVC2005 && compiler <= CC_MSVC2008) {
- if (errorMessage)
- *errorMessage = QStringLiteral("ANGLE is no longer supported for this compiler.");
- return false;
- }
if (compiler < CC_MSVC2012 && directXSdk.isEmpty()) {
if (errorMessage)
*errorMessage = QStringLiteral("There is no Direct X SDK installed or the environment variable \"DXSDK_DIR\" is not set.");
@@ -2216,6 +2221,24 @@ bool Configure::checkAngleAvailability(QString *errorMessage /* = 0 */) const
return true;
}
+QString Configure::checkAvx512Availability()
+{
+ static const char avx512features[][5] = { "cd", "er", "pf", "bw", "dq", "vl", "ifma", "vbmi" };
+
+ // try AVX512 Foundation. No Foundation, nothing else works.
+ if (!tryCompileProject("common/avx512", "AVX512=F"))
+ return QString();
+
+ QString available = "avx512f";
+ for (int i = 0; i < sizeof(avx512features)/sizeof(avx512features[0]); ++i) {
+ if (tryCompileProject("common/avx512", QStringLiteral("AVX512=%0").arg(avx512features[i]).toUpper())) {
+ available += " avx512";
+ available += avx512features[i];
+ }
+ }
+ return available;
+}
+
/*!
Checks the system for the availability of a feature.
Returns true if the feature is available, else false.
@@ -2272,7 +2295,7 @@ bool Configure::checkAvailability(const QString &part)
available = true; // Built in, we have a fork
else if (part == "SQL_SQLITE_LIB") {
if (dictionary[ "SQL_SQLITE_LIB" ] == "system") {
- if ((platform() == QNX) || (platform() == BLACKBERRY)) {
+ if (platform() == QNX) {
available = true;
dictionary[ "QT_LFLAGS_SQLITE" ] += "-lsqlite3 -lz";
} else {
@@ -2350,20 +2373,21 @@ bool Configure::checkAvailability(const QString &part)
} else if (part == "CUPS") {
available = (platform() != WINDOWS) && (platform() != WINDOWS_CE) && (platform() != WINDOWS_RT) && tryCompileProject("unix/cups");
} else if (part == "STACK_PROTECTOR_STRONG") {
- available = (platform() == QNX || platform() == BLACKBERRY) && compilerSupportsFlag("qcc -fstack-protector-strong");
+ available = (platform() == QNX) && compilerSupportsFlag("qcc -fstack-protector-strong");
} else if (part == "SLOG2") {
available = tryCompileProject("unix/slog2");
} else if (part == "QNX_IMF") {
available = tryCompileProject("unix/qqnx_imf");
} else if (part == "PPS") {
- available = (platform() == QNX || platform() == BLACKBERRY) && tryCompileProject("unix/pps");
+ available = (platform() == QNX) && tryCompileProject("unix/pps");
} else if (part == "LGMON") {
- available = (platform() == QNX || platform() == BLACKBERRY)
- && tryCompileProject("unix/lgmon");
+ available = (platform() == QNX) && tryCompileProject("unix/lgmon");
} else if (part == "NEON") {
available = dictionary["QT_CPU_FEATURES"].contains("neon");
} else if (part == "FONT_CONFIG") {
available = tryCompileProject("unix/fontconfig");
+ } else if (part == "DOUBLECONVERSION") {
+ available = tryCompileProject("unix/doubleconversion");
}
return available;
@@ -2381,7 +2405,10 @@ void Configure::autoDetection()
if (dictionary["C++STD"] == "auto" && !dictionary["QMAKESPEC"].contains("msvc")) {
if (!tryCompileProject("common/c++11")) {
- dictionary["C++STD"] = "c++98";
+ dictionary["DONE"] = "error";
+ cout << "ERROR: Qt requires a C++11 compiler and yours does not seem to be that." << endl
+ << "Please upgrade." << endl;
+ return;
} else if (!tryCompileProject("common/c++14")) {
dictionary["C++STD"] = "c++11";
} else if (!tryCompileProject("common/c++1z")) {
@@ -2491,6 +2518,8 @@ void Configure::autoDetection()
dictionary["AVX"] = checkAvailability("AVX") ? "yes" : "no";
if (dictionary["AVX2"] == "auto")
dictionary["AVX2"] = checkAvailability("AVX2") ? "yes" : "no";
+ if (dictionary["AVX512"] == "auto")
+ dictionary["AVX512"] = checkAvx512Availability();
if (dictionary["NEON"] == "auto")
dictionary["NEON"] = checkAvailability("NEON") ? "yes" : "no";
if (dictionary["SSL"] == "auto") {
@@ -2556,11 +2585,11 @@ void Configure::autoDetection()
if (dictionary["STACK_PROTECTOR_STRONG"] == "auto")
dictionary["STACK_PROTECTOR_STRONG"] = checkAvailability("STACK_PROTECTOR_STRONG") ? "yes" : "no";
- if ((platform() == QNX || platform() == BLACKBERRY) && dictionary["SLOG2"] == "auto") {
+ if (platform() == QNX && dictionary["SLOG2"] == "auto") {
dictionary["SLOG2"] = checkAvailability("SLOG2") ? "yes" : "no";
}
- if ((platform() == QNX || platform() == BLACKBERRY) && dictionary["QNX_IMF"] == "auto") {
+ if (platform() == QNX && dictionary["QNX_IMF"] == "auto") {
dictionary["QNX_IMF"] = checkAvailability("QNX_IMF") ? "yes" : "no";
}
@@ -2568,7 +2597,7 @@ void Configure::autoDetection()
dictionary["PPS"] = checkAvailability("PPS") ? "yes" : "no";
}
- if ((platform() == QNX || platform() == BLACKBERRY) && dictionary["LGMON"] == "auto") {
+ if (platform() == QNX && dictionary["LGMON"] == "auto") {
dictionary["LGMON"] = checkAvailability("LGMON") ? "yes" : "no";
}
@@ -2578,6 +2607,9 @@ void Configure::autoDetection()
if (dictionary["FONT_CONFIG"] == "auto")
dictionary["FONT_CONFIG"] = checkAvailability("FONT_CONFIG") ? "yes" : "no";
+ if (dictionary["DOUBLECONVERSION"] == "auto")
+ dictionary["DOUBLECONVERSION"] = checkAvailability("DOUBLECONVERSION") ? "system" : "qt";
+
if (dictionary["DIRECTWRITE"] == "auto")
dictionary["DIRECTWRITE"] = checkAvailability("DIRECTWRITE") ? "yes" : "no";
@@ -2633,9 +2665,8 @@ bool Configure::verifyConfiguration()
<< "Oracle driver, as the current build will most likely fail." << endl;
prompt = true;
}
- if (dictionary["QMAKESPEC"].endsWith("win32-msvc.net")) {
- cout << "WARNING: The makespec win32-msvc.net is deprecated. Consider using" << endl
- << "win32-msvc2002 or win32-msvc2003 instead." << endl;
+ if (dictionary["QMAKESPEC"].endsWith("win32-msvc2008") || dictionary["QMAKESPEC"].endsWith("win32-msvc2010")) {
+ cout << "ERROR: Qt cannot be compiled with Visual Studio 2008 or 2010." << endl;
prompt = true;
}
if (0 != dictionary["ARM_FPU_TYPE"].size()) {
@@ -2824,6 +2855,14 @@ void Configure::generateOutputVars()
if (dictionary[ "LIBPNG" ] == "system")
qtConfig += "system-png";
+ // Double conversion -----------------------------------------------
+ if (dictionary[ "DOUBLECONVERSION" ] == "qt")
+ qtConfig += "doubleconversion";
+ else if (dictionary[ "DOUBLECONVERSION" ] == "system")
+ qtConfig += "system-doubleconversion";
+ else if (dictionary[ "DOUBLECONVERSION" ] == "no")
+ qtConfig += "no-doubleconversion";
+
// Text rendering --------------------------------------------------
if (dictionary[ "FREETYPE" ] == "yes")
qtConfig += "freetype";
@@ -3049,6 +3088,9 @@ void Configure::generateOutputVars()
if (dictionary["REDUCE_EXPORTS"] == "yes")
qtConfig += "reduce_exports";
+ if (!dictionary["POLL"].isEmpty())
+ qtConfig += "poll_" + dictionary["POLL"];
+
// We currently have no switch for QtConcurrent, so add it unconditionally.
qtConfig += "concurrent";
@@ -3208,6 +3250,8 @@ void Configure::generateCachefile()
moduleStream << " avx";
if (dictionary[ "AVX2" ] == "yes")
moduleStream << " avx2";
+ if (!dictionary[ "AVX512" ].isEmpty())
+ moduleStream << ' ' << dictionary[ "AVX512" ];
if (dictionary[ "NEON" ] == "yes")
moduleStream << " neon";
if (dictionary[ "LARGE_FILE" ] == "yes")
@@ -3687,6 +3731,8 @@ void Configure::generateConfigfiles()
tmpStream << "#define QT_COMPILER_SUPPORTS_AVX 1" << endl;
if (dictionary[ "AVX2" ] == "yes")
tmpStream << "#define QT_COMPILER_SUPPORTS_AVX2 1" << endl;
+ foreach (const QString &avx512feature, dictionary[ "AVX512" ].split(' ', QString::SkipEmptyParts))
+ tmpStream << "#define QT_COMPILER_SUPPRTS_" << avx512feature.toUpper() << " 1" << endl;
if (dictionary["QREAL"] != "double") {
tmpStream << "#define QT_COORD_TYPE " << dictionary["QREAL"] << endl;
@@ -3703,7 +3749,6 @@ void Configure::generateConfigfiles()
if (dictionary["STYLE_WINDOWSVISTA"] != "yes") qconfigList += "QT_NO_STYLE_WINDOWSVISTA";
if (dictionary["STYLE_WINDOWSCE"] != "yes") qconfigList += "QT_NO_STYLE_WINDOWSCE";
if (dictionary["STYLE_WINDOWSMOBILE"] != "yes") qconfigList += "QT_NO_STYLE_WINDOWSMOBILE";
- if (dictionary["STYLE_GTK"] != "yes") qconfigList += "QT_NO_STYLE_GTK";
if (dictionary["GIF"] == "yes") qconfigList += "QT_BUILTIN_GIF_READER=1";
if (dictionary["PNG"] != "yes") qconfigList += "QT_NO_IMAGEFORMAT_PNG";
@@ -3853,13 +3898,19 @@ void Configure::displayConfig()
sout << "Link Time Code Generation..." << dictionary[ "LTCG" ] << endl;
sout << "Accessibility support......." << dictionary[ "ACCESSIBILITY" ] << endl;
sout << "RTTI support................" << dictionary[ "RTTI" ] << endl;
- sout << "SSE2 support................" << dictionary[ "SSE2" ] << endl;
- sout << "SSE3 support................" << dictionary[ "SSE3" ] << endl;
- sout << "SSSE3 support..............." << dictionary[ "SSSE3" ] << endl;
- sout << "SSE4.1 support.............." << dictionary[ "SSE4_1" ] << endl;
- sout << "SSE4.2 support.............." << dictionary[ "SSE4_2" ] << endl;
- sout << "AVX support................." << dictionary[ "AVX" ] << endl;
- sout << "AVX2 support................" << dictionary[ "AVX2" ] << endl;
+ sout << "SSE support................."
+ << (dictionary[ "SSE2" ] == "no" ? "<none>" : "SSE2")
+ << (dictionary[ "SSE3" ] == "no" ? "" : " SSE3")
+ << (dictionary[ "SSSE3" ] == "no" ? "" : " SSSE3")
+ << (dictionary[ "SSE4_1" ] == "no" ? "" : " SSE4.1")
+ << (dictionary[ "SSE4_2" ] == "no" ? "" : " SSE4.2")
+ << endl;
+ sout << "AVX support................."
+ << (dictionary[ "AVX" ] == "no" ? "<none>" : "AVX")
+ << (dictionary[ "AVX2" ] == "no" ? "" : " AVX2")
+ << endl;
+ sout << "AVX512 support.............."
+ << (dictionary[ "AVX512" ].isEmpty() ? QString("<none>") : dictionary[ "AVX512" ].toUpper()) << endl;
sout << "NEON support................" << dictionary[ "NEON" ] << endl;
sout << "OpenGL support.............." << dictionary[ "OPENGL" ] << endl;
sout << "Large File support.........." << dictionary[ "LARGE_FILE" ] << endl;
@@ -3893,12 +3944,13 @@ void Configure::displayConfig()
sout << " GIF support............." << dictionary[ "GIF" ] << endl;
sout << " JPEG support............" << dictionary[ "JPEG" ] << endl;
sout << " PNG support............." << dictionary[ "PNG" ] << endl;
+ sout << " DoubleConversion........" << dictionary[ "DOUBLECONVERSION" ] << endl;
sout << " FreeType support........" << dictionary[ "FREETYPE" ] << endl;
sout << " Fontconfig support......" << dictionary[ "FONT_CONFIG" ] << endl;
sout << " HarfBuzz support........" << dictionary[ "HARFBUZZ" ] << endl;
sout << " PCRE support............" << dictionary[ "PCRE" ] << endl;
sout << " ICU support............." << dictionary[ "ICU" ] << endl;
- if ((platform() == QNX) || (platform() == BLACKBERRY)) {
+ if (platform() == QNX) {
sout << " SLOG2 support..........." << dictionary[ "SLOG2" ] << endl;
sout << " IMF support............." << dictionary[ "QNX_IMF" ] << endl;
sout << " PPS support............." << dictionary[ "PPS" ] << endl;
@@ -4014,14 +4066,6 @@ void Configure::displayConfig()
<< "will be the same unless you are cross-compiling)." << endl
<< endl;
}
- if (dictionary["C++STD"] == "c++98") {
- sout << endl
- << "NOTE: The -no-c++11 / -c++-level c++98 option is deprecated." << endl
- << endl
- << "Qt 5.7 will require C++11 support. The options are in effect for this" << endl
- << "Qt 5.6 build, but you should update your build scripts to remove the" << endl
- << "option and, if necessary, upgrade your compiler." << endl;
- }
if (dictionary["RELEASE_TOOLS"] == "yes" && dictionary["BUILD"] != "debug" ) {
sout << endl
<< "NOTE: -optimized-tools is not useful in -release mode." << endl;
@@ -4319,10 +4363,10 @@ void Configure::buildQmake()
<< "QT_MAJOR_VERSION = " << dictionary["VERSION_MAJOR"] << endl
<< "QT_MINOR_VERSION = " << dictionary["VERSION_MINOR"] << endl
<< "QT_PATCH_VERSION = " << dictionary["VERSION_PATCH"] << endl;
- if (dictionary[ "QMAKESPEC" ] == QString("win32-g++")) {
- stream << "QMAKESPEC = $(SOURCE_PATH)\\mkspecs\\win32-g++" << endl
+ if (dictionary[ "QMAKESPEC" ].startsWith("win32-g++")) {
+ stream << "QMAKESPEC = $(SOURCE_PATH)\\mkspecs\\" << dictionary[ "QMAKESPEC" ] << endl
<< "EXTRA_CFLAGS = -DUNICODE -ffunction-sections" << endl
- << "EXTRA_CXXFLAGS = -DUNICODE -ffunction-sections" << endl
+ << "EXTRA_CXXFLAGS = -std=c++11 -DUNICODE -ffunction-sections" << endl
<< "EXTRA_LFLAGS = -Wl,--gc-sections" << endl
<< "QTOBJS = qfilesystemengine_win.o \\" << endl
<< " qfilesystemiterator_win.o \\" << endl
@@ -4678,8 +4722,6 @@ QString Configure::platformName() const
return QStringLiteral("Qt for Windows Runtime");
case QNX:
return QStringLiteral("Qt for QNX");
- case BLACKBERRY:
- return QStringLiteral("Qt for Blackberry");
case ANDROID:
return QStringLiteral("Qt for Android");
case OTHER:
@@ -4698,8 +4740,6 @@ QString Configure::qpaPlatformName() const
return QStringLiteral("winrt");
case QNX:
return QStringLiteral("qnx");
- case BLACKBERRY:
- return QStringLiteral("blackberry");
case ANDROID:
return QStringLiteral("android");
case OTHER:
@@ -4721,9 +4761,6 @@ int Configure::platform() const
if (xQMakeSpec.contains("qnx"))
return QNX;
- if (xQMakeSpec.contains("blackberry"))
- return BLACKBERRY;
-
if (xQMakeSpec.contains("android"))
return ANDROID;
diff --git a/tools/configure/configureapp.h b/tools/configure/configureapp.h
index 78cc118a9d..5361cc2b1d 100644
--- a/tools/configure/configureapp.h
+++ b/tools/configure/configureapp.h
@@ -92,6 +92,7 @@ public:
private:
bool checkAngleAvailability(QString *errorMessage = 0) const;
+ QString checkAvx512Availability();
int verbose;
diff --git a/tools/configure/environment.cpp b/tools/configure/environment.cpp
index 5e28fda11d..a01f792f74 100644
--- a/tools/configure/environment.cpp
+++ b/tools/configure/environment.cpp
@@ -68,9 +68,6 @@ struct CompilerInfo{
{CC_BORLAND, "Borland C++", 0, "bcc32.exe"},
{CC_MINGW, "MinGW (Minimalist GNU for Windows)", 0, "g++.exe"},
{CC_INTEL, "Intel(R) C++ Compiler for 32-bit applications", 0, "icl.exe"}, // xilink.exe, xilink5.exe, xilink6.exe, xilib.exe
- {CC_MSVC2005, "Microsoft (R) Visual Studio 2005 C/C++ Compiler (8.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\8.0", "cl.exe"}, // link.exe, lib.exe
- {CC_MSVC2008, "Microsoft (R) Visual Studio 2008 C/C++ Compiler (9.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\9.0", "cl.exe"}, // link.exe, lib.exe
- {CC_MSVC2010, "Microsoft (R) Visual Studio 2010 C/C++ Compiler (10.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\10.0", "cl.exe"}, // link.exe, lib.exe
{CC_MSVC2012, "Microsoft (R) Visual Studio 2012 C/C++ Compiler (11.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\11.0", "cl.exe"}, // link.exe, lib.exe
{CC_MSVC2013, "Microsoft (R) Visual Studio 2013 C/C++ Compiler (12.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\12.0", "cl.exe"}, // link.exe, lib.exe
// Microsoft skipped version 13
@@ -109,15 +106,6 @@ QString Environment::detectQMakeSpec()
case CC_MSVC2012:
spec = "win32-msvc2012";
break;
- case CC_MSVC2010:
- spec = "win32-msvc2010";
- break;
- case CC_MSVC2008:
- spec = "win32-msvc2008";
- break;
- case CC_MSVC2005:
- spec = "win32-msvc2005";
- break;
case CC_INTEL:
spec = "win32-icc";
break;
@@ -142,12 +130,6 @@ Compiler Environment::compilerFromQMakeSpec(const QString &qmakeSpec)
return CC_MSVC2013;
if (qmakeSpec == QLatin1String("win32-msvc2012"))
return CC_MSVC2012;
- if (qmakeSpec == QLatin1String("win32-msvc2010"))
- return CC_MSVC2010;
- if (qmakeSpec == QLatin1String("win32-msvc2008"))
- return CC_MSVC2008;
- if (qmakeSpec == QLatin1String("win32-msvc2005"))
- return CC_MSVC2005;
if (qmakeSpec == QLatin1String("win32-icc"))
return CC_INTEL;
if (qmakeSpec == QLatin1String("win32-g++"))