From ba2f8a1f7da6b40a095cad43e4b737dc1306b0cc Mon Sep 17 00:00:00 2001
From: aavit <qt-info@nokia.com>
Date: Thu, 16 Dec 2010 10:57:06 +0100
Subject: Need not keep client waiting until server has saved

---
 tests/arthur/baselineserver/src/baselineserver.cpp | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/tests/arthur/baselineserver/src/baselineserver.cpp b/tests/arthur/baselineserver/src/baselineserver.cpp
index 6351dff..f59600f 100644
--- a/tests/arthur/baselineserver/src/baselineserver.cpp
+++ b/tests/arthur/baselineserver/src/baselineserver.cpp
@@ -267,6 +267,13 @@ void BaselineHandler::storeImage(const QByteArray &itemBlock, bool isBaseline)
     QString prefix = pathForItem(item, isBaseline);
     qDebug() << runId << logtime() << "Received" << (isBaseline ? "baseline" : "mismatched") << "image for:" << item.itemName << "Storing in" << prefix;
 
+    QString msg;
+    if (isBaseline)
+        msg = QLS("New baseline image stored: ") + pathForItem(item, true, true) + QLS(FileFormat);
+    else
+        msg = BaselineServer::baseUrl() + report.filePath();
+    proto.sendBlock(BaselineProtocol::Ack, msg.toLatin1());
+
     QString dir = prefix.section(QLC('/'), 0, -2);
     QDir cwd;
     if (!cwd.exists(dir))
@@ -282,14 +289,6 @@ void BaselineHandler::storeImage(const QByteArray &itemBlock, bool isBaseline)
 
     if (!isBaseline)
         report.addMismatch(item);
-
-    QString msg;
-    if (isBaseline)
-        msg = QLS("New baseline image stored: ") + pathForItem(item, true, true) + QLS(FileFormat);
-    else
-        msg = BaselineServer::baseUrl() + report.filePath();
-
-    proto.sendBlock(BaselineProtocol::Ack, msg.toLatin1());
 }
 
 
-- 
cgit v0.12


From 0189fc2335c891373ce595a4a01e4a9d73cc5fe4 Mon Sep 17 00:00:00 2001
From: Jiang Jiang <jiang.jiang@nokia.com>
Date: Sun, 12 Dec 2010 17:33:12 +0100
Subject: Move advances for control character in Indic syllable shaping

When handling control characters (ZWJ, ZWNJ) in Indic syllables,
we only moved glyphs and attributes of the item, advances should
also be moved forward, otherwise we will use the advance of ZWJ/
ZWNJ for the part of syllable, which is normally zero, it results
some positioning problems.

Task-number: QTBUG-14204
Reviewed-by: Lars Knoll
---
 src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp           |  1 +
 tests/auto/qtextscriptengine/tst_qtextscriptengine.cpp | 17 +++++++++++++++++
 2 files changed, 18 insertions(+)

diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp b/src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp
index 4a618da..bbf479e 100644
--- a/src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp
+++ b/src/3rdparty/harfbuzz/src/harfbuzz-indic.cpp
@@ -1683,6 +1683,7 @@ static bool indic_shape_syllable(HB_Bool openType, HB_ShaperItem *item, bool inv
                 }
                 item->glyphs[j] = item->glyphs[i];
                 item->attributes[j] = item->attributes[i];
+                item->advances[j] = item->advances[i];
                 ++i;
                 ++j;
             }
diff --git a/tests/auto/qtextscriptengine/tst_qtextscriptengine.cpp b/tests/auto/qtextscriptengine/tst_qtextscriptengine.cpp
index 0a7458f..b0b6b1e 100644
--- a/tests/auto/qtextscriptengine/tst_qtextscriptengine.cpp
+++ b/tests/auto/qtextscriptengine/tst_qtextscriptengine.cpp
@@ -103,6 +103,7 @@ private slots:
 
     void khmer();
     void linearB();
+    void controlInSyllable_qtbug14204();
 };
 
 tst_QTextScriptEngine::tst_QTextScriptEngine()
@@ -1111,6 +1112,22 @@ void tst_QTextScriptEngine::greek()
 #endif
 }
 
+void tst_QTextScriptEngine::controlInSyllable_qtbug14204()
+{
+    QString s;
+    s.append(QChar(0x0915));
+    s.append(QChar(0x094d));
+    s.append(QChar(0x200d));
+    s.append(QChar(0x0915));
+
+    QTextLayout layout(s);
+    QTextEngine *e = layout.d;
+    e->itemize();
+    e->shape(0);
+
+    QVERIFY(e->layoutData->items[0].num_glyphs == 2);
+    QVERIFY(e->layoutData->glyphLayout.advances_x[1] != 0);
+}
 
 QTEST_MAIN(tst_QTextScriptEngine)
 #include "tst_qtextscriptengine.moc"
-- 
cgit v0.12


From ad0841dfd89d08140b719098ecfec82881df63e6 Mon Sep 17 00:00:00 2001
From: Jiang Jiang <jiang.jiang@nokia.com>
Date: Tue, 14 Dec 2010 18:18:35 +0100
Subject: Disable certain GPOS features by default

According to OpenType Layout tag registry, these features should be
turned off by default. Leaving them on will cause some text layout
problems in common UI widgets -- they are usually designed for better
positioning in print publishing or full featured text layout programs,
not for general usage.

There is no way to turn them on in HarfBuzz now, it should be
addressed later. Features like 'valt' are intended for vertical
writing mode are also turned off, since HarfBuzz doesn't support it
properly yet.

Task-number: QTBUG-15754
Reviewed-by: Lars Knoll
---
 src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp | 41 +++++++++++++++++++++++----
 1 file changed, 35 insertions(+), 6 deletions(-)

diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp b/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp
index ce4d4ac..ef86144 100644
--- a/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp
+++ b/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp
@@ -538,8 +538,20 @@ void HB_HeuristicSetGlyphAttributes(HB_ShaperItem *item)
 #ifndef NO_OPENTYPE
 static const HB_OpenTypeFeature basic_features[] = {
     { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty },
-    { HB_MAKE_TAG('l', 'i', 'g', 'a'), CcmpProperty },
-    { HB_MAKE_TAG('c', 'l', 'i', 'g'), CcmpProperty },
+    { HB_MAKE_TAG('l', 'i', 'g', 'a'), LigaProperty },
+    { HB_MAKE_TAG('c', 'l', 'i', 'g'), CligProperty },
+    {0, 0}
+};
+
+static const HB_OpenTypeFeature disabled_features[] = {
+    { HB_MAKE_TAG('c', 'p', 'c', 't'), PositioningProperties },
+    { HB_MAKE_TAG('h', 'a', 'l', 't'), PositioningProperties },
+    // TODO: we need to add certain HB_ShaperFlag for vertical
+    // writing mode to enable these vertical writing features:
+    { HB_MAKE_TAG('v', 'a', 'l', 't'), PositioningProperties },
+    { HB_MAKE_TAG('v', 'h', 'a', 'l'), PositioningProperties },
+    { HB_MAKE_TAG('v', 'k', 'r', 'n'), PositioningProperties },
+    { HB_MAKE_TAG('v', 'p', 'a', 'l'), PositioningProperties },
     {0, 0}
 };
 #endif
@@ -1110,12 +1122,29 @@ HB_Bool HB_SelectScript(HB_ShaperItem *shaper_item, const HB_OpenTypeFeature *fe
                 HB_UInt *feature_tag_list = feature_tag_list_buffer;
                 while (*feature_tag_list) {
                     HB_UShort feature_index;
+                    bool skip = false;
                     if (*feature_tag_list == HB_MAKE_TAG('k', 'e', 'r', 'n')) {
-                        if (face->current_flags & HB_ShaperFlag_NoKerning) {
-                            ++feature_tag_list;
-                            continue;
+                        if (face->current_flags & HB_ShaperFlag_NoKerning)
+                            skip = true;
+                        else
+                            face->has_opentype_kerning = true;
+                    }
+                    features = disabled_features;
+                    while (features->tag) {
+                        if (*feature_tag_list == features->tag) {
+                            skip = true;
+                            break;
                         }
-                        face->has_opentype_kerning = true;
+                        ++features;
+                    }
+                    // 'palt' should be turned off by default unless 'kern' is on
+                    if (!face->has_opentype_kerning &&
+                        *feature_tag_list == HB_MAKE_TAG('p', 'a', 'l', 't'))
+                        skip = true;
+
+                    if (skip) {
+                        ++feature_tag_list;
+                        continue;
                     }
                     error = HB_GPOS_Select_Feature(face->gpos, *feature_tag_list, script_index, 0xffff, &feature_index);
                     if (!error)
-- 
cgit v0.12


From 5d68753927ac6ba1445ceb6831da7e2346d91bf9 Mon Sep 17 00:00:00 2001
From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>
Date: Tue, 21 Dec 2010 13:26:54 +0100
Subject: Optimize texture glyph cache

To avoid calling the bounding box function for the same non-printable
characters in every call, we cache them as empty in the coords table
and bail out before painting them. This patch also fixes some possible
reads of uninitialized memory (reference to return value) and reference
to a default constructed object consisting of uninitialized pods.

Reviewed-by: Samuel
---
 src/gui/painting/qpaintengine_raster.cpp             |  4 +++-
 src/gui/painting/qtextureglyphcache.cpp              | 11 ++++++++---
 src/gui/painting/qtextureglyphcache_p.h              |  5 +++++
 .../gl2paintengineex/qpaintengineex_opengl2.cpp      | 20 ++++++++++++--------
 4 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp
index 97dfddf..ec5cef0 100644
--- a/src/gui/painting/qpaintengine_raster.cpp
+++ b/src/gui/painting/qpaintengine_raster.cpp
@@ -3111,7 +3111,9 @@ void QRasterPaintEngine::drawCachedGlyphs(int numGlyphs, const glyph_t *glyphs,
         if (supportsSubPixelPositions)
             subPixelPosition = cache->subPixelPositionForX(positions[i].x);
         QTextureGlyphCache::GlyphAndSubPixelPosition glyph(glyphs[i], subPixelPosition);
-        const QTextureGlyphCache::Coord &c = cache->coords.value(glyph);
+        const QTextureGlyphCache::Coord &c = cache->coords[glyph];
+        if (c.isNull())
+            continue;
 
         int x = qFloor(positions[i].x) + c.baseLineX - margin;
         int y = qFloor(positions[i].y) - c.baseLineY - margin;
diff --git a/src/gui/painting/qtextureglyphcache.cpp b/src/gui/painting/qtextureglyphcache.cpp
index 60300c3..670ca95 100644
--- a/src/gui/painting/qtextureglyphcache.cpp
+++ b/src/gui/painting/qtextureglyphcache.cpp
@@ -175,11 +175,16 @@ bool QTextureGlyphCache::populate(QFontEngine *fontEngine, int numGlyphs, const
                metrics.yoff.toReal(),
                metrics.x.toReal(),
                metrics.y.toReal());
-#endif
+#endif        
+        GlyphAndSubPixelPosition key(glyph, subPixelPosition);
         int glyph_width = metrics.width.ceil().toInt();
         int glyph_height = metrics.height.ceil().toInt();
-        if (glyph_height == 0 || glyph_width == 0)
+        if (glyph_height == 0 || glyph_width == 0) {
+            // Avoid multiple calls to boundingBox() for non-printable characters
+            Coord c = { 0, 0, 0, 0, 0, 0 };
+            coords.insert(key, c);
             continue;
+        }
         glyph_width += margin * 2 + 4;
         glyph_height += margin * 2 + 4;
         // align to 8-bit boundary
@@ -192,7 +197,7 @@ bool QTextureGlyphCache::populate(QFontEngine *fontEngine, int numGlyphs, const
                     metrics.x.round().truncate(),
                     -metrics.y.truncate() }; // baseline for horizontal scripts
 
-        listItemCoordinates.insert(GlyphAndSubPixelPosition(glyph, subPixelPosition), c);
+        listItemCoordinates.insert(key, c);
         rowHeight = qMax(rowHeight, glyph_height);
     }
     if (listItemCoordinates.isEmpty())
diff --git a/src/gui/painting/qtextureglyphcache_p.h b/src/gui/painting/qtextureglyphcache_p.h
index 4227e9a..7a0bdfd 100644
--- a/src/gui/painting/qtextureglyphcache_p.h
+++ b/src/gui/painting/qtextureglyphcache_p.h
@@ -107,6 +107,11 @@ public:
 
         int baseLineX;
         int baseLineY;
+
+        bool isNull() const
+        {
+            return w == 0 || h == 0;
+        }
     };
 
     bool populate(QFontEngine *fontEngine, int numGlyphs, const glyph_t *glyphs,
diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
index cdd785a..771d33f 100644
--- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
+++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
@@ -1556,7 +1556,6 @@ void QGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type glyp
         }
     }
 
-
     if (recreateVertexArrays) {
         vertexCoordinates->clear();
         textureCoordinates->clear();
@@ -1569,7 +1568,10 @@ void QGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type glyp
 
             QTextureGlyphCache::GlyphAndSubPixelPosition glyph(staticTextItem->glyphs[i], subPixelPosition);
 
-            const QTextureGlyphCache::Coord &c = cache->coords.value(glyph);
+            const QTextureGlyphCache::Coord &c = cache->coords[glyph];
+            if (c.isNull())
+                continue;
+
             int x = staticTextItem->glyphPositions[i].x.toInt() + c.baseLineX - margin;
             int y = staticTextItem->glyphPositions[i].y.toInt() - c.baseLineY - margin;
 
@@ -1580,10 +1582,12 @@ void QGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type glyp
         staticTextItem->userDataNeedsUpdate = false;
     }
 
-    if (elementIndices.size() < staticTextItem->numGlyphs*6) {
+    int numGlyphs = vertexCoordinates->vertexCount() / 4;
+
+    if (elementIndices.size() < numGlyphs*6) {
         Q_ASSERT(elementIndices.size() % 6 == 0);
         int j = elementIndices.size() / 6 * 4;
-        while (j < staticTextItem->numGlyphs*4) {
+        while (j < numGlyphs*4) {
             elementIndices.append(j + 0);
             elementIndices.append(j + 0);
             elementIndices.append(j + 1);
@@ -1672,9 +1676,9 @@ void QGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type glyp
             updateTextureFilter(GL_TEXTURE_2D, GL_REPEAT, false);
 
 #if defined(QT_OPENGL_DRAWCACHEDGLYPHS_INDEX_ARRAY_VBO)
-            glDrawElements(GL_TRIANGLE_STRIP, 6 * staticTextItem->numGlyphs, GL_UNSIGNED_SHORT, 0);
+            glDrawElements(GL_TRIANGLE_STRIP, 6 * numGlyphs, GL_UNSIGNED_SHORT, 0);
 #else
-            glDrawElements(GL_TRIANGLE_STRIP, 6 * staticTextItem->numGlyphs, GL_UNSIGNED_SHORT, elementIndices.data());
+            glDrawElements(GL_TRIANGLE_STRIP, 6 * numGlyphs, GL_UNSIGNED_SHORT, elementIndices.data());
 #endif
 
             shaderManager->setMaskType(QGLEngineShaderManager::SubPixelMaskPass2);
@@ -1722,10 +1726,10 @@ void QGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type glyp
     }
 
 #if defined(QT_OPENGL_DRAWCACHEDGLYPHS_INDEX_ARRAY_VBO)
-    glDrawElements(GL_TRIANGLE_STRIP, 6 * staticTextItem->numGlyphs, GL_UNSIGNED_SHORT, 0);
+    glDrawElements(GL_TRIANGLE_STRIP, 6 * numGlyphs, GL_UNSIGNED_SHORT, 0);
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
 #else
-    glDrawElements(GL_TRIANGLE_STRIP, 6 * staticTextItem->numGlyphs, GL_UNSIGNED_SHORT, elementIndices.data());
+    glDrawElements(GL_TRIANGLE_STRIP, 6 * numGlyphs, GL_UNSIGNED_SHORT, elementIndices.data());
 #endif
 }
 
-- 
cgit v0.12


From 1f24941131a7ab62969265f1e29ef990dbc60ff5 Mon Sep 17 00:00:00 2001
From: Miikka Heikkinen <miikka.heikkinen@digia.com>
Date: Mon, 3 Jan 2011 12:35:16 +0200
Subject: Ignore static_and_shared in Symbian builds.

The function addExclusiveBuilds doesn't work on Symbian and is unlikely
to ever work due to build system mandated target directories, so ignore
static_and_shared in Symbian builds that rely on Symbian toolchains.

Task-number: QTBUG-16298
Reviewed-by: axis
---
 mkspecs/features/static_and_shared.prf | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mkspecs/features/static_and_shared.prf b/mkspecs/features/static_and_shared.prf
index f586bdd..39a9a1f 100644
--- a/mkspecs/features/static_and_shared.prf
+++ b/mkspecs/features/static_and_shared.prf
@@ -1,3 +1,3 @@
-!contains(TEMPLATE, subdirs):!macx-xcode {
+!contains(TEMPLATE, subdirs):!macx-xcode:!symbian-abld:!symbian-sbsv2 {
     addExclusiveBuilds(static, Static, shared, Shared)
 }
-- 
cgit v0.12


From e21f066df7017e8cb8e50a387b3bf952cf497602 Mon Sep 17 00:00:00 2001
From: Alan Alpert <alan.alpert@nokia.com>
Date: Tue, 4 Jan 2011 11:12:30 +1000
Subject: Update visual tests

Minor changes in flickable and rectangle radius behaviours have led to
some altered pixels here and there.

Task-number: QTBUG-14792
---
 .../qmlvisual/ListView/data/listview.5.png         |  Bin 1661 -> 1663 bytes
 .../qmlvisual/ListView/data/listview.6.png         |  Bin 1674 -> 1666 bytes
 .../qmlvisual/ListView/data/listview.qml           |  234 ++---
 .../data/flickable-horizontal.0.png                |  Bin 1439 -> 1436 bytes
 .../data/flickable-horizontal.1.png                |  Bin 1424 -> 1426 bytes
 .../data/flickable-horizontal.2.png                |  Bin 1428 -> 1429 bytes
 .../data/flickable-horizontal.3.png                |  Bin 1397 -> 1395 bytes
 .../data/flickable-horizontal.4.png                |  Bin 1454 -> 1450 bytes
 .../data/flickable-horizontal.qml                  |  578 +++++------
 .../data/flickable-vertical.0.png                  |  Bin 1073 -> 1070 bytes
 .../data/flickable-vertical.1.png                  |  Bin 1063 -> 1064 bytes
 .../data/flickable-vertical.2.png                  |  Bin 1080 -> 1079 bytes
 .../data/flickable-vertical.3.png                  |  Bin 1080 -> 1079 bytes
 .../data/flickable-vertical.4.png                  |  Bin 1056 -> 1057 bytes
 .../data/flickable-vertical.5.png                  |  Bin 1075 -> 1080 bytes
 .../data/flickable-vertical.6.png                  |  Bin 1029 -> 1030 bytes
 .../data/flickable-vertical.7.png                  |  Bin 1073 -> 1070 bytes
 .../data/flickable-vertical.8.png                  |  Bin 1053 -> 1055 bytes
 .../data/flickable-vertical.qml                    | 1034 ++++++++++----------
 .../qmlvisual/rect/data/rect-painting.0.png        |  Bin 15272 -> 15366 bytes
 20 files changed, 923 insertions(+), 923 deletions(-)

diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.5.png b/tests/auto/declarative/qmlvisual/ListView/data/listview.5.png
index 63a594e..d1f06fa 100644
Binary files a/tests/auto/declarative/qmlvisual/ListView/data/listview.5.png and b/tests/auto/declarative/qmlvisual/ListView/data/listview.5.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.6.png b/tests/auto/declarative/qmlvisual/ListView/data/listview.6.png
index 05e24c6..9e6e29c 100644
Binary files a/tests/auto/declarative/qmlvisual/ListView/data/listview.6.png and b/tests/auto/declarative/qmlvisual/ListView/data/listview.6.png differ
diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.qml b/tests/auto/declarative/qmlvisual/ListView/data/listview.qml
index 059128d..b1ffe8f 100644
--- a/tests/auto/declarative/qmlvisual/ListView/data/listview.qml
+++ b/tests/auto/declarative/qmlvisual/ListView/data/listview.qml
@@ -1550,7 +1550,7 @@ VisualTest {
     }
     Frame {
         msec: 4240
-        hash: "84b477b46c313d6dcb0a77628182905b"
+        hash: "ad913e53e63c030ffdf4560766722760"
     }
     Mouse {
         type: 5
@@ -1570,7 +1570,7 @@ VisualTest {
     }
     Frame {
         msec: 4256
-        hash: "281c0499db31ca78175ca7af6292b853"
+        hash: "ef31f8a4d5bde5a2e308d19ee6d5e759"
     }
     Mouse {
         type: 5
@@ -1582,7 +1582,7 @@ VisualTest {
     }
     Frame {
         msec: 4272
-        hash: "5c29d61f037e4636988fdc99ee2ed8a4"
+        hash: "3ba07527f66e8bea5a8fb7647b0b4f3f"
     }
     Mouse {
         type: 5
@@ -1594,7 +1594,7 @@ VisualTest {
     }
     Frame {
         msec: 4288
-        hash: "a18f5e9f7be932dcd1bcb4c7fe0797e8"
+        hash: "70e5fe656f5fd843383964825690b678"
     }
     Mouse {
         type: 5
@@ -1614,7 +1614,7 @@ VisualTest {
     }
     Frame {
         msec: 4304
-        hash: "85a4130b4a57ef79e90d350cf4816801"
+        hash: "b7d8738be4cd6caa63dbecdb0f810a2f"
     }
     Mouse {
         type: 5
@@ -1626,7 +1626,7 @@ VisualTest {
     }
     Frame {
         msec: 4320
-        hash: "364dd89fd6f96e1c77723436c7078a7b"
+        hash: "d6312191f9d7bbddc07f9253d8a93469"
     }
     Mouse {
         type: 5
@@ -1638,7 +1638,7 @@ VisualTest {
     }
     Frame {
         msec: 4336
-        hash: "3e37312c45aa92de34d9661f9b482c48"
+        hash: "b182da64886cf4f444296e5fde26701e"
     }
     Mouse {
         type: 5
@@ -1650,7 +1650,7 @@ VisualTest {
     }
     Frame {
         msec: 4352
-        hash: "dc2d63ad430ea6214f962629793925f3"
+        hash: "ebefef14b6fb990e0c6900884528bbd3"
     }
     Mouse {
         type: 5
@@ -1662,7 +1662,7 @@ VisualTest {
     }
     Frame {
         msec: 4368
-        hash: "188fe1e6af9d02b2680426127ef1d39e"
+        hash: "9a3451ed091b1bb6b975a9c5506b1ea4"
     }
     Mouse {
         type: 5
@@ -1674,7 +1674,7 @@ VisualTest {
     }
     Frame {
         msec: 4384
-        hash: "bdb784f5ccf428f8b8a9d29310069808"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Mouse {
         type: 5
@@ -1686,7 +1686,7 @@ VisualTest {
     }
     Frame {
         msec: 4400
-        hash: "bb74813667f49b15978aa78843436205"
+        hash: "eaaf9ea1d7fcf4a2a9dd58b1b5bb3cae"
     }
     Mouse {
         type: 5
@@ -1698,7 +1698,7 @@ VisualTest {
     }
     Frame {
         msec: 4416
-        hash: "8e88500470517ed1d7c3ca10edd4e230"
+        hash: "7ca8e3d76cf913d85f84f0b96acde829"
     }
     Mouse {
         type: 5
@@ -1710,7 +1710,7 @@ VisualTest {
     }
     Frame {
         msec: 4432
-        hash: "614dc45593db51f467adeda87d84f9a4"
+        hash: "7cfef56b24a552c6d4ecb3d0b88a1d08"
     }
     Mouse {
         type: 5
@@ -1730,7 +1730,7 @@ VisualTest {
     }
     Frame {
         msec: 4448
-        hash: "b170583b9b284debdd04af643752aa6b"
+        hash: "d032b257259810b4fe514c63ca5c9e4b"
     }
     Mouse {
         type: 5
@@ -1742,7 +1742,7 @@ VisualTest {
     }
     Frame {
         msec: 4464
-        hash: "dba0394b92f3ee166bc397439a86e6dc"
+        hash: "568f6a57e6f1644b0dc245d03a1d7b85"
     }
     Mouse {
         type: 5
@@ -1754,87 +1754,87 @@ VisualTest {
     }
     Frame {
         msec: 4480
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4496
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4512
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4528
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4544
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4560
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4576
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4592
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4608
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4624
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4640
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4656
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4672
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4688
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4704
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4720
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4736
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4752
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4768
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4784
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4800
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4816
@@ -1842,11 +1842,11 @@ VisualTest {
     }
     Frame {
         msec: 4832
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Frame {
         msec: 4848
-        hash: "74b499d5d764bf53efbee8932bab3cc3"
+        hash: "5cb4cf2c527d821db2a5072dd3702653"
     }
     Mouse {
         type: 5
@@ -1866,7 +1866,7 @@ VisualTest {
     }
     Frame {
         msec: 4864
-        hash: "95ab953fc04389396da9a38d97262d98"
+        hash: "d48ecbd0661e08b2117fe2fd96ffeb2c"
     }
     Mouse {
         type: 5
@@ -1878,7 +1878,7 @@ VisualTest {
     }
     Frame {
         msec: 4880
-        hash: "614dc45593db51f467adeda87d84f9a4"
+        hash: "7cfef56b24a552c6d4ecb3d0b88a1d08"
     }
     Mouse {
         type: 5
@@ -1890,7 +1890,7 @@ VisualTest {
     }
     Frame {
         msec: 4896
-        hash: "0d884cdb22e3668203d07c72055bcb85"
+        hash: "5b12e9d17d9d464b055601db9cf0da44"
     }
     Mouse {
         type: 5
@@ -1902,7 +1902,7 @@ VisualTest {
     }
     Frame {
         msec: 4912
-        hash: "23bd71236829253fb3ef18ebc9dd3136"
+        hash: "25333e1f0cc9cfc664fd7369af544c06"
     }
     Mouse {
         type: 5
@@ -1914,39 +1914,39 @@ VisualTest {
     }
     Frame {
         msec: 4928
-        hash: "bdb784f5ccf428f8b8a9d29310069808"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 4944
-        hash: "bdb784f5ccf428f8b8a9d29310069808"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 4960
-        hash: "bdb784f5ccf428f8b8a9d29310069808"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 4976
-        hash: "bdb784f5ccf428f8b8a9d29310069808"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 4992
-        hash: "bdb784f5ccf428f8b8a9d29310069808"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5008
-        hash: "bdb784f5ccf428f8b8a9d29310069808"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5024
-        hash: "bdb784f5ccf428f8b8a9d29310069808"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5040
-        hash: "bdb784f5ccf428f8b8a9d29310069808"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5056
-        hash: "bdb784f5ccf428f8b8a9d29310069808"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Mouse {
         type: 3
@@ -1958,179 +1958,179 @@ VisualTest {
     }
     Frame {
         msec: 5072
-        hash: "bdb784f5ccf428f8b8a9d29310069808"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5088
-        hash: "bdb784f5ccf428f8b8a9d29310069808"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5104
-        hash: "bdb784f5ccf428f8b8a9d29310069808"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5120
-        hash: "bdb784f5ccf428f8b8a9d29310069808"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5136
-        hash: "bdb784f5ccf428f8b8a9d29310069808"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5152
-        hash: "bdb784f5ccf428f8b8a9d29310069808"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5168
-        hash: "bdb784f5ccf428f8b8a9d29310069808"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5184
-        hash: "bdb784f5ccf428f8b8a9d29310069808"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5200
-        hash: "bdb784f5ccf428f8b8a9d29310069808"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5216
-        hash: "bdb784f5ccf428f8b8a9d29310069808"
+        hash: "04290d8d62436c8a812f886e0a56ec1b"
     }
     Frame {
         msec: 5232
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5248
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5264
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5280
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5296
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5312
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5328
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5344
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5360
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5376
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5392
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5408
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5424
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5440
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5456
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5472
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5488
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5504
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5520
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5536
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5552
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5568
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5584
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5600
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5616
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5632
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5648
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5664
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5680
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5696
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5712
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5728
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5744
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5760
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5776
@@ -2138,90 +2138,90 @@ VisualTest {
     }
     Frame {
         msec: 5792
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5808
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5824
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5840
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5856
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5872
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5888
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5904
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5920
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5936
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5952
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5968
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 5984
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 6000
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 6016
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 6032
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 6048
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 6064
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 6080
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 6096
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 6112
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
     Frame {
         msec: 6128
-        hash: "9ba43cbdd92c077f64e4a59c6c1c42ac"
+        hash: "dbd87bf02d698b7f053d307ef0c98452"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.0.png
index e1b0967..968a78f 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.1.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.1.png
index c7d4e1d..55ab3b7 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.1.png and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.2.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.2.png
index 9373fae..a6ec6d1 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.2.png and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.3.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.3.png
index 7a30196..e6755ac 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.3.png and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.4.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.4.png
index 4c4d17c..bc65634 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.4.png and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.4.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.qml
index a94aca8..106d108 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.qml
@@ -10,179 +10,179 @@ VisualTest {
     }
     Frame {
         msec: 32
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 48
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 64
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 80
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 96
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 112
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 128
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 144
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 160
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 176
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 192
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 208
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 224
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 240
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 256
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 272
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 288
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 304
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 320
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 336
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 352
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 368
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 384
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 400
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 416
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 432
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 448
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 464
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 480
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 496
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 512
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 528
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 544
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 560
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 576
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 592
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 608
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 624
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 640
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 656
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 672
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 688
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 704
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 720
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Mouse {
         type: 2
@@ -194,15 +194,15 @@ VisualTest {
     }
     Frame {
         msec: 736
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 752
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 768
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Mouse {
         type: 5
@@ -214,7 +214,7 @@ VisualTest {
     }
     Frame {
         msec: 784
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Mouse {
         type: 5
@@ -226,7 +226,7 @@ VisualTest {
     }
     Frame {
         msec: 800
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Mouse {
         type: 5
@@ -246,7 +246,7 @@ VisualTest {
     }
     Frame {
         msec: 816
-        hash: "c92e345e4ffdb30c28d9d5aa5400bd30"
+        hash: "49372aa66b86904d587b72c6c2cfd467"
     }
     Mouse {
         type: 5
@@ -258,7 +258,7 @@ VisualTest {
     }
     Frame {
         msec: 832
-        hash: "90f94986ab44ab59618e9a5da17b8cc9"
+        hash: "06519aabcc86c5fd961c80a65d2cf67c"
     }
     Mouse {
         type: 5
@@ -270,7 +270,7 @@ VisualTest {
     }
     Frame {
         msec: 848
-        hash: "0154a65f8693b98576101ac1c2fc8761"
+        hash: "c3b182c37393ea0468c06474e84f127f"
     }
     Mouse {
         type: 5
@@ -290,31 +290,31 @@ VisualTest {
     }
     Frame {
         msec: 864
-        hash: "792c1b5267f14c891dae2348a8188a92"
+        hash: "dce4bcca20e89c40a603394515f679b1"
     }
     Frame {
         msec: 880
-        hash: "15ce9e88d4ad2e698bf167d1432c0b8a"
+        hash: "dabf2b63bedd0073f761a858f048df5a"
     }
     Frame {
         msec: 896
-        hash: "8f4109ef4c24d286d73f689565a0d056"
+        hash: "c51ca7786b7346b3e62b774c01a67f98"
     }
     Frame {
         msec: 912
-        hash: "f5728190bf5c94742686f063b4a4b09b"
+        hash: "d1628aa2fd1ec92021fa37f9960fb06a"
     }
     Frame {
         msec: 928
-        hash: "a38c7527a9a818b7bc25466b0e4939f9"
+        hash: "4e571776c8a01d1ab79ff1c3affc0474"
     }
     Frame {
         msec: 944
-        hash: "ed3902455fc31a4e3232308b815a4daa"
+        hash: "85a3c22ecaed87c119202b76e22f2b2e"
     }
     Frame {
         msec: 960
-        hash: "a2093589363ac2d50491412e99e0193a"
+        hash: "42d345e97b0a8e5cbcfdf4243ccafcdc"
     }
     Frame {
         msec: 976
@@ -322,227 +322,227 @@ VisualTest {
     }
     Frame {
         msec: 992
-        hash: "c32349580e3a9586cc1133c935607cf0"
+        hash: "1a651405076d8980b03cc8279a379fff"
     }
     Frame {
         msec: 1008
-        hash: "cd2068492e346eb20d50aee69e3a3559"
+        hash: "8c4f3c6a4c67c76fe92ff401114892e7"
     }
     Frame {
         msec: 1024
-        hash: "f43a1a38894b8ffad009ba995d84b0ee"
+        hash: "447a817e33cd8213e362192ffe663272"
     }
     Frame {
         msec: 1040
-        hash: "2d5c4a73df2a054801571f1ce119e31f"
+        hash: "eed6ba9be5f7869101068afd1d46cb69"
     }
     Frame {
         msec: 1056
-        hash: "b8825cc6bdca8102a655d797ea41b5b1"
+        hash: "15ae5acff4211f97802c6c50649ad487"
     }
     Frame {
         msec: 1072
-        hash: "3f0be15b85220743d004f2d54b6e137c"
+        hash: "e30b0a23e215c0b9b71b083381a8523e"
     }
     Frame {
         msec: 1088
-        hash: "4b0952d33149b44ffa0a06723a4116c7"
+        hash: "6fad48a7d3a2480468aca07e6760de94"
     }
     Frame {
         msec: 1104
-        hash: "9056bda43259e92cfe56fdf394e2ca54"
+        hash: "998bd191ac5bac1f300e247514a112d7"
     }
     Frame {
         msec: 1120
-        hash: "82ec9f09d2303e5b0b9c05b9a10a84db"
+        hash: "9245e8bf2fb38f491aa7f0da4400e190"
     }
     Frame {
         msec: 1136
-        hash: "751a9b3054c09d900364d7c9cac8bc2b"
+        hash: "7565ea1f01cd9ad5d92e2a0ee7fc947d"
     }
     Frame {
         msec: 1152
-        hash: "17dfdfef20f9da7e8b6f16df974baea9"
+        hash: "898c6e226787391340099910ee128ed6"
     }
     Frame {
         msec: 1168
-        hash: "108e6d9a5a81df32823bfd7a90a000a7"
+        hash: "bafd74d70e99cf4053d3c00d18915762"
     }
     Frame {
         msec: 1184
-        hash: "71dd0d55a3e837d3a8e4b4e318579ade"
+        hash: "6456a5ca9bb90b2d0fb99bae63a8db35"
     }
     Frame {
         msec: 1200
-        hash: "8013cdb2615bca89134ea040409af509"
+        hash: "2b34216c9f7c76133ef4889b74df7ad9"
     }
     Frame {
         msec: 1216
-        hash: "4b2826ad4c755690bd837994133f5fac"
+        hash: "cbc75068017b378f277c2692f2cb1709"
     }
     Frame {
         msec: 1232
-        hash: "52d0da7f138bd37ac587a448d6402aca"
+        hash: "8c72d80a5a2776ee2d805c089f5c534d"
     }
     Frame {
         msec: 1248
-        hash: "e634724c5bb294d338210845bf64d2cf"
+        hash: "d5a248b9177e078cad40af72b3cbceb5"
     }
     Frame {
         msec: 1264
-        hash: "59bc5f0d057ee431f289806377f19213"
+        hash: "1a9b246f8223bbcf6421a22e8a1fb50e"
     }
     Frame {
         msec: 1280
-        hash: "6ef2c5f7766c2cc77b30d636bfaa4422"
+        hash: "ea9b292eb000a9e4c5b46a8d94b8e80e"
     }
     Frame {
         msec: 1296
-        hash: "578d056c3db094420dbaa51bd08ced20"
+        hash: "ac059cd45cd1936a7ff3fd0fc9fa688b"
     }
     Frame {
         msec: 1312
-        hash: "14c6f7a04a52caffefa07af556ccb262"
+        hash: "fda383d47ffb1e2fd633793594831cfb"
     }
     Frame {
         msec: 1328
-        hash: "7cb63d56fec144d0509ce219fc6fe459"
+        hash: "a4c7709f3642088e4be48ec607d0a0fe"
     }
     Frame {
         msec: 1344
-        hash: "462dafa7f6427aecf6c28a5dcf5a10cc"
+        hash: "08d0268402d4a410f5f8c9bb8ba7b306"
     }
     Frame {
         msec: 1360
-        hash: "45360814f985ed780a443568a91fc170"
+        hash: "ecc8f3c4faf86362e45b465b0f4d6dc2"
     }
     Frame {
         msec: 1376
-        hash: "0d18ceb2436e4f7eb56a3443fab706e6"
+        hash: "3107a4b522744a643dd107da5e5e13c2"
     }
     Frame {
         msec: 1392
-        hash: "1d83f367ba9f7f1d4496208271e925ed"
+        hash: "44c1731d0433aac53edc2e88a38c66b0"
     }
     Frame {
         msec: 1408
-        hash: "fdbd00ee4c122aef779df42ea53f403a"
+        hash: "d86e9dfb38be51b2fa9cf44271eddc3e"
     }
     Frame {
         msec: 1424
-        hash: "bedd1cb304efd4851813b39a746198a4"
+        hash: "0c33ce00df6fbb848d300aa510ad80d9"
     }
     Frame {
         msec: 1440
-        hash: "9aa7bed86efa9634466736f20ee0ab5b"
+        hash: "48ff92aaa0c797c10ca8dbc5b2240736"
     }
     Frame {
         msec: 1456
-        hash: "00fc8186a7ae44e10195a7b13defa0d2"
+        hash: "8582fd8c3643d9a5c1993e1607c6fae8"
     }
     Frame {
         msec: 1472
-        hash: "42d6e8e0bbed879ed63644c83e61e7bd"
+        hash: "2390e374160ec5bc99613a463aa98fb2"
     }
     Frame {
         msec: 1488
-        hash: "df074f8c210249e5ef652349479b6325"
+        hash: "369a11c32596b668a4f275232c45ac68"
     }
     Frame {
         msec: 1504
-        hash: "4f94020437e35cf44dd3576997990ab7"
+        hash: "0b0d82d523a77a925ee00cf457326034"
     }
     Frame {
         msec: 1520
-        hash: "8ca6c3b4fa3be73ac35073356b680a35"
+        hash: "48e7a92905761d7f0b8b9ac95bb5ff45"
     }
     Frame {
         msec: 1536
-        hash: "c25eee1c5791383ebc59974e7754eacb"
+        hash: "2cdccfd2cdf56728fa07a49de34142d9"
     }
     Frame {
         msec: 1552
-        hash: "f4917ada78942428cc6b9aa5e56c013d"
+        hash: "83a8166805523ee8426d88ef80c8f3a9"
     }
     Frame {
         msec: 1568
-        hash: "23e1e607101fc7260a4ac841344f5fe0"
+        hash: "20ac2e68a5c733dc6128921c34f033e5"
     }
     Frame {
         msec: 1584
-        hash: "2dcc7d187d8e0493e5766efbf09ef37c"
+        hash: "836963a1ed3084606b80b7f82fee09ef"
     }
     Frame {
         msec: 1600
-        hash: "c1e5602753e80cf44d7b330140c6912e"
+        hash: "ee49c684d788558e20a10899ebe0b6c2"
     }
     Frame {
         msec: 1616
-        hash: "febaf72d01a3763461b4b7d2ddd7a23e"
+        hash: "e00c0b340165d335cb49730890eca301"
     }
     Frame {
         msec: 1632
-        hash: "071262b911b61576f451be25691a57cf"
+        hash: "fba2c2adeef04e6c1a764c4d8a1a97bc"
     }
     Frame {
         msec: 1648
-        hash: "44705db9289fd8753b9d63e8bc963b38"
+        hash: "8160bd2a6daa2757b948d038fa754c77"
     }
     Frame {
         msec: 1664
-        hash: "0c41d7b7d36bd083abfc0b83b862cad9"
+        hash: "10130d0b75ce420f5c9af6f181500783"
     }
     Frame {
         msec: 1680
-        hash: "0c41d7b7d36bd083abfc0b83b862cad9"
+        hash: "10130d0b75ce420f5c9af6f181500783"
     }
     Frame {
         msec: 1696
-        hash: "071262b911b61576f451be25691a57cf"
+        hash: "fba2c2adeef04e6c1a764c4d8a1a97bc"
     }
     Frame {
         msec: 1712
-        hash: "a00aa90e894b48203b0446ca287ee712"
+        hash: "fec5477699ba60da129866e1c3727e08"
     }
     Frame {
         msec: 1728
-        hash: "26c9ca53ee4b084c6595ad65bf4880df"
+        hash: "12076b96a177bd24be8ad4a3dc179d79"
     }
     Frame {
         msec: 1744
-        hash: "f4917ada78942428cc6b9aa5e56c013d"
+        hash: "83a8166805523ee8426d88ef80c8f3a9"
     }
     Frame {
         msec: 1760
-        hash: "ffedee7bf2d8099e361b8b1706b03f88"
+        hash: "e9016d43624060ef4efbad2b7bc53b1b"
     }
     Frame {
         msec: 1776
-        hash: "1778ef1629ce977015b641448b46634f"
+        hash: "483700c4ba07a9f01d2a226a3efde15f"
     }
     Frame {
         msec: 1792
-        hash: "42d6e8e0bbed879ed63644c83e61e7bd"
+        hash: "2390e374160ec5bc99613a463aa98fb2"
     }
     Frame {
         msec: 1808
-        hash: "99e843ec69b79b79b0792e0a2f28cd1b"
+        hash: "094df49593f0cd1d6de4a0b91c459d15"
     }
     Frame {
         msec: 1824
-        hash: "8b3ebca70b50a6a93823e015ea80f0f9"
+        hash: "0a60ed609c7fcb2d485f393ea309527a"
     }
     Frame {
         msec: 1840
-        hash: "8eaa7f076064ce55051237b04861e408"
+        hash: "d4e0f07c2f298626ae800d5d7b5f098b"
     }
     Frame {
         msec: 1856
-        hash: "6acc0ca5e5808d911287edfa78c8ac02"
+        hash: "ff249c1301704da0b82b023558512c6a"
     }
     Frame {
         msec: 1872
-        hash: "e9f05899e0b53c21f6efe834095a3ea4"
+        hash: "42883458efeb17ff1e52296ae7228fb2"
     }
     Mouse {
         type: 2
@@ -562,7 +562,7 @@ VisualTest {
     }
     Frame {
         msec: 1888
-        hash: "e9f05899e0b53c21f6efe834095a3ea4"
+        hash: "42883458efeb17ff1e52296ae7228fb2"
     }
     Mouse {
         type: 5
@@ -582,7 +582,7 @@ VisualTest {
     }
     Frame {
         msec: 1904
-        hash: "d2dece405f5f6ed1de2acb6615a931de"
+        hash: "36a4b0d745ee8fa53e906b7a23b7ab88"
     }
     Mouse {
         type: 5
@@ -594,7 +594,7 @@ VisualTest {
     }
     Frame {
         msec: 1920
-        hash: "21e0f21edc77424e8327c9a3350ecc1d"
+        hash: "826187b1a24fd09e1abcb6a01c59c059"
     }
     Mouse {
         type: 5
@@ -626,7 +626,7 @@ VisualTest {
     }
     Frame {
         msec: 1952
-        hash: "c10c8b0c94f899414d8b3ef0b7c97646"
+        hash: "426f9459ac16c2903f85d618b366a475"
     }
     Mouse {
         type: 5
@@ -646,235 +646,235 @@ VisualTest {
     }
     Frame {
         msec: 1968
-        hash: "807aff4e6c96a9d0de7fa55e233446b1"
+        hash: "d43dc1cfeaac1da281f2cdbffda93d17"
     }
     Frame {
         msec: 1984
-        hash: "dbd02848cefacbb26f4bcb7d8f073d6c"
+        hash: "766dd54cdb6253ead664b6ab852e934b"
     }
     Frame {
         msec: 2000
-        hash: "9a60608d8ea1b39fa2d3851873f2f08e"
+        hash: "1db59868779a357917a5d4859130108e"
     }
     Frame {
         msec: 2016
-        hash: "e7b3e3a40281f63889808211d6746374"
+        hash: "1da33a5f6a001915464f34799a651f7a"
     }
     Frame {
         msec: 2032
-        hash: "188c225c46ec00105df230bfeea09974"
+        hash: "868a6e445623378b6590789156e4b7e0"
     }
     Frame {
         msec: 2048
-        hash: "e2e977b42e91d8c5dee57fd8245692eb"
+        hash: "46ae42a4b7f00e24a10ffdfd7a076b68"
     }
     Frame {
         msec: 2064
-        hash: "ca2f12fb173c405f95e608858ab982ad"
+        hash: "2a91ffdfec461f573784cfaed2150e33"
     }
     Frame {
         msec: 2080
-        hash: "fa86ee5f25fa425cf2569c8ef570b9d8"
+        hash: "2cbaa11e8589c806e65e52ce59ad1c42"
     }
     Frame {
         msec: 2096
-        hash: "9b74656866fb8c7394bbbecec6414aca"
+        hash: "3b93b1e1fa7963d5a75103814f93a0a2"
     }
     Frame {
         msec: 2112
-        hash: "87147326d1baab174c0f9a5ccdc2cb84"
+        hash: "a2e59dc9459a7afb6916638d08330dff"
     }
     Frame {
         msec: 2128
-        hash: "c0d00f98c71bf3f8e5954b45fbab95a8"
+        hash: "cb3e8334babe3abffa202c2ba2d3b21f"
     }
     Frame {
         msec: 2144
-        hash: "c087d1d62e56e573b55c1d8599bba8a6"
+        hash: "07882f5f098e59c479f089dbc74612bf"
     }
     Frame {
         msec: 2160
-        hash: "dd5a94c6febdee58e8f115cb75131aaa"
+        hash: "e9ad84bf0c7f83bfe1bff3afed591bfd"
     }
     Frame {
         msec: 2176
-        hash: "a7465d6137f865f512ce65ceb29533b4"
+        hash: "1839c26fda8710dc3fa7f5abd8136eee"
     }
     Frame {
         msec: 2192
-        hash: "409086f6bb661aab8b548fea56d7e6b1"
+        hash: "15e3bdd811c390ad3a9cf22949568ed7"
     }
     Frame {
         msec: 2208
-        hash: "6a22911e0fb58df31271baa463ff599d"
+        hash: "61ede9a7ef29997627bb08070fea65a4"
     }
     Frame {
         msec: 2224
-        hash: "c4f6dd30d5fdfcf91a8b29cf5c622423"
+        hash: "fac89040e757522117e3792625ca6a19"
     }
     Frame {
         msec: 2240
-        hash: "5a95b83f237c7243a198a43e9a587179"
+        hash: "1dc01a1118681f8606768fcf246397f7"
     }
     Frame {
         msec: 2256
-        hash: "d79ed290efc6dbd976d574bf0b14a6a3"
+        hash: "2b243094b7f25368a8fb4a9014968cad"
     }
     Frame {
         msec: 2272
-        hash: "a7bcb436e96d7c981852239462573495"
+        hash: "c6677acf9b9d632bc99caa8626448c49"
     }
     Frame {
         msec: 2288
-        hash: "f63cc82e351daab503e316f8b516990f"
+        hash: "9035988b0dc0b7065fe4f1d1a4737801"
     }
     Frame {
         msec: 2304
-        hash: "4ea63cd25a1424042ffc60549a78563c"
+        hash: "cd34e7118d43968cfcf52ed9ce58fc0a"
     }
     Frame {
         msec: 2320
-        hash: "ef0fb776012575b3b0dbf6e5f4dee571"
+        hash: "7142aeaed61722424e184c55bb8d047c"
     }
     Frame {
         msec: 2336
-        hash: "e2508faec7737be2666d87ad715b5f74"
+        hash: "9113c68cf5689e1f4690e58bbf824ae6"
     }
     Frame {
         msec: 2352
-        hash: "9fe4e897c6b853f774d11817a0eb53bf"
+        hash: "2f9ec963d6f06f8252a69760965df2ee"
     }
     Frame {
         msec: 2368
-        hash: "c122ce2e73cbfedcc99d649c21d91f9d"
+        hash: "07373282f0337437944dc8fff1e32343"
     }
     Frame {
         msec: 2384
-        hash: "883b8b180853f1f432ae98ddfe1b6ce3"
+        hash: "4769fa4ba0c08baefa431b94b47a7ffc"
     }
     Frame {
         msec: 2400
-        hash: "d0808284e431da60f61d571c257a3011"
+        hash: "390cd7786aa1989b590033682472f604"
     }
     Frame {
         msec: 2416
-        hash: "df90f19450bf4d9496aab987a89e3a02"
+        hash: "482e2969bc1a877ba63c3df65ec04b7e"
     }
     Frame {
         msec: 2432
-        hash: "5640c1e64556b90e7fbd4448fa9db462"
+        hash: "e3dc252a3a0b35398bf3d91c37d6b5e9"
     }
     Frame {
         msec: 2448
-        hash: "6d9b5c2f7d0dedbbc444e69bb39fed08"
+        hash: "5bce3aac5cc049d81a74e7f71e2cf522"
     }
     Frame {
         msec: 2464
-        hash: "485c4a8049068cf73bf22db5fd3618be"
+        hash: "390edc00756c4e92e94a7a75f3d65c45"
     }
     Frame {
         msec: 2480
-        hash: "9e25da59c9e7e4cf7796902e8e2ff92a"
+        hash: "285397b2ff5a64d2a112c458d6ec5aba"
     }
     Frame {
         msec: 2496
-        hash: "bd45e8f2442d7c1a1b16a762bc29e7cf"
+        hash: "ed0889dc439d66e6b5a81059956ef564"
     }
     Frame {
         msec: 2512
-        hash: "ec1013d23e581dbb39b1549d2e1b3b32"
+        hash: "cb804da0db92d879a5cb8f138c546f88"
     }
     Frame {
         msec: 2528
-        hash: "1ea3c2fde8ee3a14406e027f2124d793"
+        hash: "523fe4d3d9c11631f41d96bcc604103b"
     }
     Frame {
         msec: 2544
-        hash: "3c3f31a05fb2f32538872c9fa158aaab"
+        hash: "cc4717c4233f9a2f2380bfad6dc89075"
     }
     Frame {
         msec: 2560
-        hash: "05a84d9c55e634ec01edd2a63e13613b"
+        hash: "65c4171ff3e98aa04667606d9f6bd9b3"
     }
     Frame {
         msec: 2576
-        hash: "0f7ccd2da58e2e73b0ab18bb681dafd5"
+        hash: "b2994136a603206c8013158fd67ca6bd"
     }
     Frame {
         msec: 2592
-        hash: "e481ff78029f8bc4bf7c697db6824f6a"
+        hash: "44ad0d4645a01243b9d9be0faaf6d6ee"
     }
     Frame {
         msec: 2608
-        hash: "efb92b8b7a90acabeb4a8d5cae52fe3c"
+        hash: "3b7b06f5f3f028fbae21dfedf821e696"
     }
     Frame {
         msec: 2624
-        hash: "4728dd0fac4edf40cfd5ef5a422b4ed9"
+        hash: "b86466e530c3bd51353074cbb9da9ec3"
     }
     Frame {
         msec: 2640
-        hash: "27641dcd772c979ae22d12bfbadbb67f"
+        hash: "2528deb04bae8b89a85dc6fcea05dbbd"
     }
     Frame {
         msec: 2656
-        hash: "26268714105bc4832d336a38a859fc50"
+        hash: "e0ff5e36bff2b9e08244fc7f79cecee6"
     }
     Frame {
         msec: 2672
-        hash: "caf0d351d3b6914ca52853a30643ea48"
+        hash: "34ca311d2e3462da3779324419c027e7"
     }
     Frame {
         msec: 2688
-        hash: "319824b1143925162f04aaddcfaa65d9"
+        hash: "75aae68f21f68364a897c504f26ee655"
     }
     Frame {
         msec: 2704
-        hash: "73aa36815f34bf5e005000e7da38555e"
+        hash: "8039e52e7f1977433596c1a34a41cc9f"
     }
     Frame {
         msec: 2720
-        hash: "73aa36815f34bf5e005000e7da38555e"
+        hash: "8039e52e7f1977433596c1a34a41cc9f"
     }
     Frame {
         msec: 2736
-        hash: "319824b1143925162f04aaddcfaa65d9"
+        hash: "75aae68f21f68364a897c504f26ee655"
     }
     Frame {
         msec: 2752
-        hash: "caf0d351d3b6914ca52853a30643ea48"
+        hash: "34ca311d2e3462da3779324419c027e7"
     }
     Frame {
         msec: 2768
-        hash: "c87ba4dda0a5c931d0c7ae74a0fb2896"
+        hash: "d3649eb8f8232b0e64b0cb476313b63c"
     }
     Frame {
         msec: 2784
-        hash: "ab551561ad8a3937558afc080b3e6130"
+        hash: "cdb30549933d3778e74dbd419b474a5f"
     }
     Frame {
         msec: 2800
-        hash: "474d8b566b9e4ef7dc125a8df30ccbb1"
+        hash: "3a43d652bb85d3f562bd5eaec386107f"
     }
     Frame {
         msec: 2816
-        hash: "cc7dfbcfafa12d40210a4d5fa7f60862"
+        hash: "df6771eb2afa24b6e3250b05b180fa4d"
     }
     Frame {
         msec: 2832
-        hash: "3c3f31a05fb2f32538872c9fa158aaab"
+        hash: "cc4717c4233f9a2f2380bfad6dc89075"
     }
     Frame {
         msec: 2848
-        hash: "9705c0dd30c3f381084ec29242bebb2f"
+        hash: "76e04278dab430d5860306830b73ab6f"
     }
     Frame {
         msec: 2864
-        hash: "917579854722d6e6711811e10cbe229f"
+        hash: "8f70f69731fe8b8f4aa397a667f4c5c0"
     }
     Frame {
         msec: 2880
-        hash: "43fa578250e214ed9ad6894329a27c54"
+        hash: "25b72be5ca16c246bfc6adc4bf19871c"
     }
     Frame {
         msec: 2896
@@ -882,79 +882,79 @@ VisualTest {
     }
     Frame {
         msec: 2912
-        hash: "5640c1e64556b90e7fbd4448fa9db462"
+        hash: "e3dc252a3a0b35398bf3d91c37d6b5e9"
     }
     Frame {
         msec: 2928
-        hash: "88cef15940302e2b8b43e73234fd7b9c"
+        hash: "ce0d8b3f0f0b235eaedc932f4514ea00"
     }
     Frame {
         msec: 2944
-        hash: "041aecec2b0b0d59a56e1dd26b45cab1"
+        hash: "f6b030effcca891ab20073f106b22d73"
     }
     Frame {
         msec: 2960
-        hash: "0d519463c713f3da46ecacd155e1a0f3"
+        hash: "2cfafd1f686f5794d5bf99ec4aaa1d08"
     }
     Frame {
         msec: 2976
-        hash: "5dd0c855b97d298244fb599c9f781651"
+        hash: "502a23fd9a3bcccb29c496e7edeb5d66"
     }
     Frame {
         msec: 2992
-        hash: "bfc51621e9bc95d2d46cec632a3fae12"
+        hash: "82ac348a63a4e358a877a2e45d48e2b1"
     }
     Frame {
         msec: 3008
-        hash: "b05fb6e798ab3fed940b5ac4d88ca378"
+        hash: "0d321f4ca15f09d849c4a28f032cc1cc"
     }
     Frame {
         msec: 3024
-        hash: "6bc9cc0d3b11ea91856296b0ec934a8b"
+        hash: "5c995f84415ea7a260647f946b8963ee"
     }
     Frame {
         msec: 3040
-        hash: "f4e63f3af69dacbf2d1d719d4d03a266"
+        hash: "ee4ecac449c4a2ad4e11ad1d560b3ec3"
     }
     Frame {
         msec: 3056
-        hash: "31ab08997eb86fab062a3128aecbccb5"
+        hash: "0bc3d5b91d781bcf10041eb1557f0d6a"
     }
     Frame {
         msec: 3072
-        hash: "90736b240ba1e634bd0ea86423908e16"
+        hash: "321297177b354e0cc435b3eae49331a3"
     }
     Frame {
         msec: 3088
-        hash: "90736b240ba1e634bd0ea86423908e16"
+        hash: "321297177b354e0cc435b3eae49331a3"
     }
     Frame {
         msec: 3104
-        hash: "e74982557dc06aac572078840c7e889a"
+        hash: "de00148fe89be44237af32d929432655"
     }
     Frame {
         msec: 3120
-        hash: "e74982557dc06aac572078840c7e889a"
+        hash: "de00148fe89be44237af32d929432655"
     }
     Frame {
         msec: 3136
-        hash: "ca30c14c7344d1711a35c707f8804f6e"
+        hash: "756c8068009e9780428bd3ae35df19fe"
     }
     Frame {
         msec: 3152
-        hash: "e616110d39009f0d636b816828cc0ccb"
+        hash: "afec5604967bc19a2bb8fc7e899c1e11"
     }
     Frame {
         msec: 3168
-        hash: "e616110d39009f0d636b816828cc0ccb"
+        hash: "afec5604967bc19a2bb8fc7e899c1e11"
     }
     Frame {
         msec: 3184
-        hash: "e616110d39009f0d636b816828cc0ccb"
+        hash: "afec5604967bc19a2bb8fc7e899c1e11"
     }
     Frame {
         msec: 3200
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Mouse {
         type: 2
@@ -966,15 +966,15 @@ VisualTest {
     }
     Frame {
         msec: 3216
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 3232
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 3248
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Mouse {
         type: 5
@@ -994,7 +994,7 @@ VisualTest {
     }
     Frame {
         msec: 3264
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "96a78749a57bdb87cf28a3804b63793f"
     }
     Mouse {
         type: 5
@@ -1006,7 +1006,7 @@ VisualTest {
     }
     Frame {
         msec: 3280
-        hash: "1991cbb0fb053937f922731d5716032c"
+        hash: "b8f158a8694f2b922faf818d469230e4"
     }
     Mouse {
         type: 5
@@ -1018,7 +1018,7 @@ VisualTest {
     }
     Frame {
         msec: 3296
-        hash: "df447575a4734bb5bd9badc6e27d98e4"
+        hash: "257a298bec9589037e3022cc2fe7a775"
     }
     Mouse {
         type: 5
@@ -1030,7 +1030,7 @@ VisualTest {
     }
     Frame {
         msec: 3312
-        hash: "0fbfe1e0d7fb54450188398aa40690cd"
+        hash: "391d17c09dd33b3dcfc9a619fbb500dc"
     }
     Mouse {
         type: 5
@@ -1042,7 +1042,7 @@ VisualTest {
     }
     Frame {
         msec: 3328
-        hash: "cb62e60296046c73d301d7186e14faed"
+        hash: "b645a1808de7a5d2ce7944ab66a7c233"
     }
     Mouse {
         type: 5
@@ -1054,7 +1054,7 @@ VisualTest {
     }
     Frame {
         msec: 3344
-        hash: "909cbd1292476584554e22232cb43639"
+        hash: "54ddfe85ca8923bcf7f3b6ccab0560de"
     }
     Mouse {
         type: 5
@@ -1066,7 +1066,7 @@ VisualTest {
     }
     Frame {
         msec: 3360
-        hash: "e63b7e502dfb2834c06a969b683b9bd3"
+        hash: "5c1169e17ee96b817e66b4a6097f790c"
     }
     Mouse {
         type: 5
@@ -1078,7 +1078,7 @@ VisualTest {
     }
     Frame {
         msec: 3376
-        hash: "4ea63cd25a1424042ffc60549a78563c"
+        hash: "cd34e7118d43968cfcf52ed9ce58fc0a"
     }
     Mouse {
         type: 5
@@ -1090,7 +1090,7 @@ VisualTest {
     }
     Frame {
         msec: 3392
-        hash: "77e39d2d4bfcacecdae4f014e4506d71"
+        hash: "f3d9d5cd228914b2e1323f19c22aa6f9"
     }
     Mouse {
         type: 5
@@ -1102,7 +1102,7 @@ VisualTest {
     }
     Frame {
         msec: 3408
-        hash: "db576eca8bad67cb8b994f12fc448969"
+        hash: "10e63c46f4b970a9c997126906c01cf9"
     }
     Mouse {
         type: 5
@@ -1114,7 +1114,7 @@ VisualTest {
     }
     Frame {
         msec: 3424
-        hash: "efeb3f616da9d78505c3c82fc34ee31c"
+        hash: "c9b412087f7b744096bf995c6a9ddf15"
     }
     Mouse {
         type: 5
@@ -1126,7 +1126,7 @@ VisualTest {
     }
     Frame {
         msec: 3440
-        hash: "e4f8bb02f8ac6bc40e1801cc8f360078"
+        hash: "70cdc34e22c7a031c2e28898f7edea72"
     }
     Mouse {
         type: 5
@@ -1138,7 +1138,7 @@ VisualTest {
     }
     Frame {
         msec: 3456
-        hash: "82118ef71809e3867717232c4d9c5518"
+        hash: "d0ea5c1f9050499d944ba7e61d354e40"
     }
     Mouse {
         type: 5
@@ -1150,7 +1150,7 @@ VisualTest {
     }
     Frame {
         msec: 3472
-        hash: "5363451c696f6c6eb792b23d086243d7"
+        hash: "d9fc23e14a170b68264721dc18be4fb1"
     }
     Mouse {
         type: 5
@@ -1162,7 +1162,7 @@ VisualTest {
     }
     Frame {
         msec: 3488
-        hash: "fe6afe8ae8a7c216a1cffc5515f273d5"
+        hash: "d59ccdfdb179f2c8c2636a64aecf2a6a"
     }
     Mouse {
         type: 5
@@ -1174,7 +1174,7 @@ VisualTest {
     }
     Frame {
         msec: 3504
-        hash: "9b165741d86c70380c15e15cff3fabb6"
+        hash: "6d21752283210371faf2f757c7a972b3"
     }
     Mouse {
         type: 5
@@ -1186,7 +1186,7 @@ VisualTest {
     }
     Frame {
         msec: 3520
-        hash: "f5e176355468f4fa224d4dfcdd7525a3"
+        hash: "1338a54d3b980a6868ba7d167cfdbdf7"
     }
     Mouse {
         type: 5
@@ -1198,27 +1198,27 @@ VisualTest {
     }
     Frame {
         msec: 3536
-        hash: "8c5a14a76e052cc6503a3e78245d1da3"
+        hash: "0be430c9e6058be2aee599d4182bc0d0"
     }
     Frame {
         msec: 3552
-        hash: "8c5a14a76e052cc6503a3e78245d1da3"
+        hash: "0be430c9e6058be2aee599d4182bc0d0"
     }
     Frame {
         msec: 3568
-        hash: "8c5a14a76e052cc6503a3e78245d1da3"
+        hash: "0be430c9e6058be2aee599d4182bc0d0"
     }
     Frame {
         msec: 3584
-        hash: "8c5a14a76e052cc6503a3e78245d1da3"
+        hash: "0be430c9e6058be2aee599d4182bc0d0"
     }
     Frame {
         msec: 3600
-        hash: "8c5a14a76e052cc6503a3e78245d1da3"
+        hash: "0be430c9e6058be2aee599d4182bc0d0"
     }
     Frame {
         msec: 3616
-        hash: "8c5a14a76e052cc6503a3e78245d1da3"
+        hash: "0be430c9e6058be2aee599d4182bc0d0"
     }
     Mouse {
         type: 5
@@ -1230,7 +1230,7 @@ VisualTest {
     }
     Frame {
         msec: 3632
-        hash: "f5e176355468f4fa224d4dfcdd7525a3"
+        hash: "1338a54d3b980a6868ba7d167cfdbdf7"
     }
     Mouse {
         type: 5
@@ -1242,7 +1242,7 @@ VisualTest {
     }
     Frame {
         msec: 3648
-        hash: "acf538fce5f1b90b83474d9898b7cdd7"
+        hash: "b58a71e761abe238de0e90c1c756cd37"
     }
     Mouse {
         type: 5
@@ -1254,7 +1254,7 @@ VisualTest {
     }
     Frame {
         msec: 3664
-        hash: "5a0ee016b8732fbc36064e8a35d91215"
+        hash: "3383dc4a9b1f8267d145d22f9d825dc0"
     }
     Mouse {
         type: 5
@@ -1266,7 +1266,7 @@ VisualTest {
     }
     Frame {
         msec: 3680
-        hash: "8fd06a14c1de175813845ce8f07db6ec"
+        hash: "95df7fbe18630d9b8ffa83850bc5bec5"
     }
     Mouse {
         type: 5
@@ -1278,7 +1278,7 @@ VisualTest {
     }
     Frame {
         msec: 3696
-        hash: "26b0ff6ffda0725e0800f7ea3af510ef"
+        hash: "96c625b6854a862c83ead3fbb32df3b0"
     }
     Mouse {
         type: 5
@@ -1290,7 +1290,7 @@ VisualTest {
     }
     Frame {
         msec: 3712
-        hash: "80443f134511be0356a687c9b542b3e7"
+        hash: "f48f12540c60bc7b60279db8e67ff91b"
     }
     Mouse {
         type: 5
@@ -1302,7 +1302,7 @@ VisualTest {
     }
     Frame {
         msec: 3728
-        hash: "3eeb98a829d29b3dc52f3d145ac49d58"
+        hash: "98353745244809a583c93c1fd87b9a56"
     }
     Mouse {
         type: 5
@@ -1314,7 +1314,7 @@ VisualTest {
     }
     Frame {
         msec: 3744
-        hash: "f4d43069b16f41a30e5549aae911d4cd"
+        hash: "09a1bb3238282c80cc40fccb6e45ba28"
     }
     Mouse {
         type: 5
@@ -1326,7 +1326,7 @@ VisualTest {
     }
     Frame {
         msec: 3760
-        hash: "661c89fa832f0abdcf4ae0c9e8e2d18f"
+        hash: "9e50b6fc980c66698a35178e2520e13c"
     }
     Mouse {
         type: 3
@@ -1338,23 +1338,23 @@ VisualTest {
     }
     Frame {
         msec: 3776
-        hash: "661c89fa832f0abdcf4ae0c9e8e2d18f"
+        hash: "9e50b6fc980c66698a35178e2520e13c"
     }
     Frame {
         msec: 3792
-        hash: "1520f54b6c8606b9e8372c5c06180453"
+        hash: "006c37d9d6b5a8470d74909b9646d5f1"
     }
     Frame {
         msec: 3808
-        hash: "0fcf5e2ce47348cbb5bb485f101fe5ac"
+        hash: "24cf52f7c3cf095be20393757dfaaa6b"
     }
     Frame {
         msec: 3824
-        hash: "2eb070e69de07c89830543e0475fc110"
+        hash: "2189799d060770928f1feaaa44728ec8"
     }
     Frame {
         msec: 3840
-        hash: "d73c1059219c0655968af268d22e2c18"
+        hash: "b8a6375f0303ec8b66cf14f59888c273"
     }
     Frame {
         msec: 3856
@@ -1362,214 +1362,214 @@ VisualTest {
     }
     Frame {
         msec: 3872
-        hash: "cc969b2c64839ca6d3b5069c0ed938d0"
+        hash: "1fd391b060c84ac99c6e94d2d3647c31"
     }
     Frame {
         msec: 3888
-        hash: "1f819e18d1297a1c7eeebb7b040bdef8"
+        hash: "8b594f115e8158b931a9da42fa6829a5"
     }
     Frame {
         msec: 3904
-        hash: "3643b99afbd8af0953cb39b2c8c04b9f"
+        hash: "8f93fdffed4bfd31f9f5977b09074f6a"
     }
     Frame {
         msec: 3920
-        hash: "713fd2e2fa38ab27604cb9cae59f1777"
+        hash: "d0f3eae785732bf24c363fd189672eb2"
     }
     Frame {
         msec: 3936
-        hash: "e2508faec7737be2666d87ad715b5f74"
+        hash: "9113c68cf5689e1f4690e58bbf824ae6"
     }
     Frame {
         msec: 3952
-        hash: "fc33b1c7479caeff676ffd885a18d618"
+        hash: "44dd376f3d5f61ec71b7c488c3a6ee58"
     }
     Frame {
         msec: 3968
-        hash: "aca01143db4f870a56bb7546e84cbc5e"
+        hash: "4555e295bd6de22abcbaecf797ec8902"
     }
     Frame {
         msec: 3984
-        hash: "442b58c39fd3745c61a1eb5043fcbb53"
+        hash: "eb343f3e69f205a240c0425873ea6db1"
     }
     Frame {
         msec: 4000
-        hash: "7983d7183cc11d6819fa0a006c2d67b4"
+        hash: "37a5b81894c16cacd13312f7113a5445"
     }
     Frame {
         msec: 4016
-        hash: "9fe4e897c6b853f774d11817a0eb53bf"
+        hash: "2f9ec963d6f06f8252a69760965df2ee"
     }
     Frame {
         msec: 4032
-        hash: "43f528c81ccfa5b9921dfa3564a24c68"
+        hash: "dec984b2a5cdd85f2dfb8983da5cdee4"
     }
     Frame {
         msec: 4048
-        hash: "dfe04ff0b3ccf205bb38beeab58a4411"
+        hash: "a95f51c3e172ee76b5b74e94532cdfaf"
     }
     Frame {
         msec: 4064
-        hash: "32ff30b50b500e9feb51e8eef205783c"
+        hash: "62d73e875875329c886d2eb540a9c2d9"
     }
     Frame {
         msec: 4080
-        hash: "7d83ab4c336b05bcf2cde4e7d8031f6c"
+        hash: "63c70a0ea1f43d92c717ff23dcfebe81"
     }
     Frame {
         msec: 4096
-        hash: "c92e345e4ffdb30c28d9d5aa5400bd30"
+        hash: "49372aa66b86904d587b72c6c2cfd467"
     }
     Frame {
         msec: 4112
-        hash: "02eec604d0c00965aae4ac61b91bdc22"
+        hash: "523c18f3c7bbaaf9c625835ddf0d8435"
     }
     Frame {
         msec: 4128
-        hash: "df447575a4734bb5bd9badc6e27d98e4"
+        hash: "257a298bec9589037e3022cc2fe7a775"
     }
     Frame {
         msec: 4144
-        hash: "bac10d8f94a39573313b3b8b2f871c49"
+        hash: "d777e4b06791bda82cf1e8e84b1cff5c"
     }
     Frame {
         msec: 4160
-        hash: "e5944c5dc6dec8f0c28b7ec3cd58723d"
+        hash: "c31de5bfff431b13dcbf2b8b4c503bc3"
     }
     Frame {
         msec: 4176
-        hash: "1991cbb0fb053937f922731d5716032c"
+        hash: "b8f158a8694f2b922faf818d469230e4"
     }
     Frame {
         msec: 4192
-        hash: "50d6538bcaffc343f6626635a3e5899c"
+        hash: "5fd4cd0c335cecc7468d44d188e1669d"
     }
     Frame {
         msec: 4208
-        hash: "f3613f57cdb9ed38d8e3fa636962aa99"
+        hash: "77b003c8f72498ed295678158adf417c"
     }
     Frame {
         msec: 4224
-        hash: "10a89da9887cb4bbd812c090a8a56797"
+        hash: "96a78749a57bdb87cf28a3804b63793f"
     }
     Frame {
         msec: 4240
-        hash: "89ba74d46970ad2edff701475c059ec8"
+        hash: "f497ed7bc98daea35a9ae4838427207e"
     }
     Frame {
         msec: 4256
-        hash: "6e8b84c70e81578a2216e9e975b35434"
+        hash: "35a7221f2888ab3afec443b2c1060c80"
     }
     Frame {
         msec: 4272
-        hash: "6e8b84c70e81578a2216e9e975b35434"
+        hash: "35a7221f2888ab3afec443b2c1060c80"
     }
     Frame {
         msec: 4288
-        hash: "883b8b180853f1f432ae98ddfe1b6ce3"
+        hash: "4769fa4ba0c08baefa431b94b47a7ffc"
     }
     Frame {
         msec: 4304
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 4320
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 4336
-        hash: "e616110d39009f0d636b816828cc0ccb"
+        hash: "afec5604967bc19a2bb8fc7e899c1e11"
     }
     Frame {
         msec: 4352
-        hash: "e616110d39009f0d636b816828cc0ccb"
+        hash: "afec5604967bc19a2bb8fc7e899c1e11"
     }
     Frame {
         msec: 4368
-        hash: "e616110d39009f0d636b816828cc0ccb"
+        hash: "afec5604967bc19a2bb8fc7e899c1e11"
     }
     Frame {
         msec: 4384
-        hash: "e616110d39009f0d636b816828cc0ccb"
+        hash: "afec5604967bc19a2bb8fc7e899c1e11"
     }
     Frame {
         msec: 4400
-        hash: "e616110d39009f0d636b816828cc0ccb"
+        hash: "afec5604967bc19a2bb8fc7e899c1e11"
     }
     Frame {
         msec: 4416
-        hash: "e616110d39009f0d636b816828cc0ccb"
+        hash: "afec5604967bc19a2bb8fc7e899c1e11"
     }
     Frame {
         msec: 4432
-        hash: "e616110d39009f0d636b816828cc0ccb"
+        hash: "afec5604967bc19a2bb8fc7e899c1e11"
     }
     Frame {
         msec: 4448
-        hash: "e616110d39009f0d636b816828cc0ccb"
+        hash: "afec5604967bc19a2bb8fc7e899c1e11"
     }
     Frame {
         msec: 4464
-        hash: "e616110d39009f0d636b816828cc0ccb"
+        hash: "afec5604967bc19a2bb8fc7e899c1e11"
     }
     Frame {
         msec: 4480
-        hash: "e616110d39009f0d636b816828cc0ccb"
+        hash: "afec5604967bc19a2bb8fc7e899c1e11"
     }
     Frame {
         msec: 4496
-        hash: "e616110d39009f0d636b816828cc0ccb"
+        hash: "afec5604967bc19a2bb8fc7e899c1e11"
     }
     Frame {
         msec: 4512
-        hash: "e616110d39009f0d636b816828cc0ccb"
+        hash: "afec5604967bc19a2bb8fc7e899c1e11"
     }
     Frame {
         msec: 4528
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 4544
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 4560
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 4576
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 4592
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 4608
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 4624
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 4640
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 4656
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 4672
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 4688
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
     Frame {
         msec: 4704
-        hash: "244c12e82ee0b2528a0dbb02a8b8134a"
+        hash: "66d988259c52db9bd85f60ed598469f7"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.0.png
index 2af1a3e..5af9306 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.0.png and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.1.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.1.png
index 8334a3f..61acc87 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.1.png and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.2.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.2.png
index c705849..bc6ac34 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.2.png and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.3.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.3.png
index c705849..bc6ac34 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.3.png and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.4.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.4.png
index 349dca2..c970488 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.4.png and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.4.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.5.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.5.png
index a0e84e3..0af1424 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.5.png and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.5.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.6.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.6.png
index e5c1583..c826907 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.6.png and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.6.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.7.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.7.png
index 2af1a3e..5af9306 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.7.png and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.7.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.8.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.8.png
index 06468e4..f714fa5 100644
Binary files a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.8.png and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.8.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.qml
index 920a48f..8ad3029 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.qml
@@ -10,71 +10,71 @@ VisualTest {
     }
     Frame {
         msec: 32
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 48
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 64
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 80
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 96
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 112
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 128
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 144
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 160
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 176
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 192
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 208
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 224
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 240
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 256
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 272
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 288
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Mouse {
         type: 2
@@ -86,7 +86,7 @@ VisualTest {
     }
     Frame {
         msec: 304
-        hash: "3d1b648229210ae5b57a0be51cc02f67"
+        hash: "71a0273e7582419e07937fe701d8e027"
     }
     Mouse {
         type: 5
@@ -98,7 +98,7 @@ VisualTest {
     }
     Frame {
         msec: 320
-        hash: "3d1b648229210ae5b57a0be51cc02f67"
+        hash: "71a0273e7582419e07937fe701d8e027"
     }
     Mouse {
         type: 5
@@ -118,7 +118,7 @@ VisualTest {
     }
     Frame {
         msec: 336
-        hash: "3d1b648229210ae5b57a0be51cc02f67"
+        hash: "71a0273e7582419e07937fe701d8e027"
     }
     Mouse {
         type: 5
@@ -138,7 +138,7 @@ VisualTest {
     }
     Frame {
         msec: 352
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Mouse {
         type: 5
@@ -158,7 +158,7 @@ VisualTest {
     }
     Frame {
         msec: 368
-        hash: "57fa1d842d37df12004b493c1c5761f3"
+        hash: "a8d53f622836800e43157685ce21fad4"
     }
     Mouse {
         type: 5
@@ -178,7 +178,7 @@ VisualTest {
     }
     Frame {
         msec: 384
-        hash: "521a8188877551a97cd3ea82d209e8ae"
+        hash: "99c8215fbd87e45836908a85748dccc7"
     }
     Mouse {
         type: 5
@@ -198,7 +198,7 @@ VisualTest {
     }
     Frame {
         msec: 400
-        hash: "ce126aaade1532e22a35416fd7203dde"
+        hash: "d56ff1a2994f1acb5ad06b0468672a29"
     }
     Mouse {
         type: 5
@@ -218,119 +218,119 @@ VisualTest {
     }
     Frame {
         msec: 416
-        hash: "aa9c4301332240ccc00ec99a05b7f9c9"
+        hash: "85ba01e36cc978459451887facbc3260"
     }
     Frame {
         msec: 432
-        hash: "db0a670d61133a3420a3581ecb532773"
+        hash: "958d223a6b27ecc87febd860168d5aa5"
     }
     Frame {
         msec: 448
-        hash: "b34de164d5ec0294ca27281e1e5e3cd6"
+        hash: "851ef5f56b7b05d3feb0a1a357f96007"
     }
     Frame {
         msec: 464
-        hash: "8636af4591c61c4b4a548f3a38749413"
+        hash: "4d90460d3b6c46075ffda426bc6ceaa6"
     }
     Frame {
         msec: 480
-        hash: "eee4fa336149528dfb16565b856ca692"
+        hash: "bb67acd602414cf59e27b5ff19f69169"
     }
     Frame {
         msec: 496
-        hash: "85eeaeaf359ed87417be68dc18c06d0c"
+        hash: "acce28653f8bf46c09067254774fb126"
     }
     Frame {
         msec: 512
-        hash: "d5db4af6cf35c61146bd24646d82ab83"
+        hash: "91ea2538dfe0f9af7b4732cb4474215b"
     }
     Frame {
         msec: 528
-        hash: "2189fc03c337fe41f3d9f51929c9860f"
+        hash: "e7fd52f25a4a9c31a2f2fabd59c31160"
     }
     Frame {
         msec: 544
-        hash: "4e3e283fb402dc4ec79f65878a513747"
+        hash: "6acdb4852ef9091382030998e28d02a5"
     }
     Frame {
         msec: 560
-        hash: "62f4281d8e049bc12b636b7ebe3862df"
+        hash: "10c7eaab96a538a7111b054a403132a3"
     }
     Frame {
         msec: 576
-        hash: "cf9a0a968459a1283fff91102eb29ba3"
+        hash: "4ebb31f7945bb5542f9e5146888b1065"
     }
     Frame {
         msec: 592
-        hash: "c432221928096cff3b76c8034db26b43"
+        hash: "b98d594580ad701afb4d2ef186853bc4"
     }
     Frame {
         msec: 608
-        hash: "3df59808e56955c3c161609b72d93c7f"
+        hash: "2700eb44f9b7400f3c1bd11d878e078d"
     }
     Frame {
         msec: 624
-        hash: "c497bcbe500905b8a69fd310fd7c7e1a"
+        hash: "b8a8c4db8325b3e0292e6473084347d9"
     }
     Frame {
         msec: 640
-        hash: "7dceef52fab6dc38d140e3097e39a271"
+        hash: "88ff05697e82e78847794b153be12c46"
     }
     Frame {
         msec: 656
-        hash: "c7bbd81b452db98fb8fd892762a23df6"
+        hash: "06970943c3cd12f07b1d661de0ab730f"
     }
     Frame {
         msec: 672
-        hash: "17efc9793ef2966722544d561312b17a"
+        hash: "5804b412094ab17424de4ba12b2e2e32"
     }
     Frame {
         msec: 688
-        hash: "1bf05b272ad6b8e5d134c94d9ba62030"
+        hash: "8ff038b364f065e67430b2a312a10101"
     }
     Frame {
         msec: 704
-        hash: "cad61ba68fdfb26cfb136f22a2f8cc0c"
+        hash: "8a9a1c725b80af8fd3ffb9d8bc7328ac"
     }
     Frame {
         msec: 720
-        hash: "0ce5ff1a1d9a6193ef763affa39cb790"
+        hash: "83c3481ec7a1dddcbc36d6fb9b7d6149"
     }
     Frame {
         msec: 736
-        hash: "880bce9130454aaf1261842b8f9b9a57"
+        hash: "abf102e5d88bef8ed429c222284907da"
     }
     Frame {
         msec: 752
-        hash: "ab78cadac88156d9755d8b70d26384e8"
+        hash: "e9bcb3268f705e708ffbcf707c78c889"
     }
     Frame {
         msec: 768
-        hash: "4a22e502c105a7df0845ca75cbdfb0ec"
+        hash: "918c60c1ed90f5803d24ea515f21f8fa"
     }
     Frame {
         msec: 784
-        hash: "d6209a0b9b9e0f2072179a4623c70fbd"
+        hash: "f3064485083025aba09224faafcede14"
     }
     Frame {
         msec: 800
-        hash: "85e85567831cf57df1f013f5bf3beb86"
+        hash: "9f36e5b91e6abc9f991625cc52afdd4e"
     }
     Frame {
         msec: 816
-        hash: "602d2e02029178faeb99748e2f70827e"
+        hash: "70a50039fbd67d4b56c0c7ec3d7aecd1"
     }
     Frame {
         msec: 832
-        hash: "fd4dbb6f47f6681af98eb6781ae7de58"
+        hash: "90bbef58e2e59021f68b878db477f74b"
     }
     Frame {
         msec: 848
-        hash: "faf3be40e402768724703f5d0051249f"
+        hash: "21480d7b949acba033f4686c666d3f85"
     }
     Frame {
         msec: 864
-        hash: "bc650ca5b7a3bdc1f0f051b9481faf29"
+        hash: "b622d2cea2428fb92a8e37715a60f195"
     }
     Mouse {
         type: 2
@@ -342,7 +342,7 @@ VisualTest {
     }
     Frame {
         msec: 880
-        hash: "bc650ca5b7a3bdc1f0f051b9481faf29"
+        hash: "b622d2cea2428fb92a8e37715a60f195"
     }
     Mouse {
         type: 5
@@ -362,7 +362,7 @@ VisualTest {
     }
     Frame {
         msec: 896
-        hash: "bc650ca5b7a3bdc1f0f051b9481faf29"
+        hash: "b622d2cea2428fb92a8e37715a60f195"
     }
     Mouse {
         type: 5
@@ -382,7 +382,7 @@ VisualTest {
     }
     Frame {
         msec: 912
-        hash: "f2a679f2b7585245d4f1896fed4e0d1e"
+        hash: "8b537cd0481c1a9bf84f4855ae5697ad"
     }
     Mouse {
         type: 5
@@ -402,7 +402,7 @@ VisualTest {
     }
     Frame {
         msec: 928
-        hash: "721b5fa42f583c1e1e1a751fc8aad270"
+        hash: "f5aba503b2c155401d26be068724e28a"
     }
     Mouse {
         type: 5
@@ -422,7 +422,7 @@ VisualTest {
     }
     Frame {
         msec: 944
-        hash: "7e3ddefca9a99d6b9103ffd4524bc593"
+        hash: "1aca5a9415dd669a0ff76ef4da9c9a56"
     }
     Mouse {
         type: 5
@@ -442,7 +442,7 @@ VisualTest {
     }
     Frame {
         msec: 960
-        hash: "7858d23cb4c206676eca51c1c09802b5"
+        hash: "b046e18396cd3d2da6505fa783bd2b89"
     }
     Mouse {
         type: 5
@@ -474,171 +474,171 @@ VisualTest {
     }
     Frame {
         msec: 992
-        hash: "e723da5ecaffe31f03b1d5ca6765229b"
+        hash: "c4506098417f905871a43d183cd5904d"
     }
     Frame {
         msec: 1008
-        hash: "73d169bf6bdfce801b824b7b560c3fad"
+        hash: "fe8014819e6fe41fa109f5b0ff2e9764"
     }
     Frame {
         msec: 1024
-        hash: "4e3e283fb402dc4ec79f65878a513747"
+        hash: "6acdb4852ef9091382030998e28d02a5"
     }
     Frame {
         msec: 1040
-        hash: "38c2e2835c20dbee55c69d0211a0be2d"
+        hash: "d5a9739669a9a641c0c1f44b777cb9b8"
     }
     Frame {
         msec: 1056
-        hash: "84e668ba374ff0004dd7222933a635cf"
+        hash: "a4006cb90c69313b9b04a6b7b8734855"
     }
     Frame {
         msec: 1072
-        hash: "349c7a84ff8f9b52d39dba1282353167"
+        hash: "23b447e486a6354354505171cf3c45ec"
     }
     Frame {
         msec: 1088
-        hash: "b63218110c65b6d7b4bc2d63155204cd"
+        hash: "ad172b89d9764bd568d9127c91547c0b"
     }
     Frame {
         msec: 1104
-        hash: "aad65a7070aa668dd8ce4a3cc0f0f117"
+        hash: "0003fb6329e0bf293d56af63265bf0ca"
     }
     Frame {
         msec: 1120
-        hash: "c4ae97e1d1f2efbc998f9b57c2373201"
+        hash: "dd62960e62800219c179fcd481e4504d"
     }
     Frame {
         msec: 1136
-        hash: "94701ffaa4f45924ad89f92a30157c7d"
+        hash: "7fe6c7bd1bc9e46d3e520178a2309e87"
     }
     Frame {
         msec: 1152
-        hash: "eee4fa336149528dfb16565b856ca692"
+        hash: "bb67acd602414cf59e27b5ff19f69169"
     }
     Frame {
         msec: 1168
-        hash: "ff1a053c0af99c51353503002515843d"
+        hash: "3170c18b8dd74429b0f366ec07f4870b"
     }
     Frame {
         msec: 1184
-        hash: "118494c60034b0e265e28b34e3128d00"
+        hash: "249e4e489236e3f0748ba63c7a105b33"
     }
     Frame {
         msec: 1200
-        hash: "bf693bffb37d7554a437eca21bdec7c1"
+        hash: "bd2fb97c583e6fe653a32fa610d6ac83"
     }
     Frame {
         msec: 1216
-        hash: "880f60263cd79fb6a1bff7252d2373bb"
+        hash: "95ca2f988370075070c6a98e5e680206"
     }
     Frame {
         msec: 1232
-        hash: "b34de164d5ec0294ca27281e1e5e3cd6"
+        hash: "851ef5f56b7b05d3feb0a1a357f96007"
     }
     Frame {
         msec: 1248
-        hash: "e1609c4e40fb9e043a9fff683b94c6c4"
+        hash: "80f599f50af9e601536f62ea93f4e429"
     }
     Frame {
         msec: 1264
-        hash: "2450b61b84c24727232c779114e6a474"
+        hash: "485d719d81429e63be4de1ba81d53996"
     }
     Frame {
         msec: 1280
-        hash: "cf5ac4a5e3d42b3d4e171ed3227cfa85"
+        hash: "745f3c2e0baede59a52805eddac5b01f"
     }
     Frame {
         msec: 1296
-        hash: "5cb5576ab347647ca881d4d450732df3"
+        hash: "fea3fa6e26eb150ab37fe96a34d3be3b"
     }
     Frame {
         msec: 1312
-        hash: "34dc672ebfd75ec017d0c2f0bd435cd8"
+        hash: "29c8004517294539adf3243533381436"
     }
     Frame {
         msec: 1328
-        hash: "aa9c4301332240ccc00ec99a05b7f9c9"
+        hash: "85ba01e36cc978459451887facbc3260"
     }
     Frame {
         msec: 1344
-        hash: "3f98121997a1613bd49d22003d1a1887"
+        hash: "deedb9ddcc2f5354a2356178db54d971"
     }
     Frame {
         msec: 1360
-        hash: "86732d3e900877ae7a8615b7448afaaa"
+        hash: "9e1fb461c13b4affa39e5909d3ade168"
     }
     Frame {
         msec: 1376
-        hash: "7e2f2786d3c0540a0b6559fffe06ad3c"
+        hash: "684a543d7afc5a5cac2bb823bbb94893"
     }
     Frame {
         msec: 1392
-        hash: "79e00bbe77f0a178e8db30023a881c3f"
+        hash: "636f04661a0418c1fdcaaaba28092671"
     }
     Frame {
         msec: 1408
-        hash: "5f611226b3aa38f9aa3cd6a2dbd01f12"
+        hash: "89cac82b6751208654d1e4ef4df8ef28"
     }
     Frame {
         msec: 1424
-        hash: "4f4cd776b76272cfe79b86a108bd6b6e"
+        hash: "a974415dcf31bee79874c4a6e84cf796"
     }
     Frame {
         msec: 1440
-        hash: "a746404a1a26e2a25b8d364dbef46eef"
+        hash: "f74c075e8cf2aef501b7115427b3b221"
     }
     Frame {
         msec: 1456
-        hash: "9124d97d120de1806d86c8f437ec4ed2"
+        hash: "7efcd27e34db1d3adc3d31e0b9ebe432"
     }
     Frame {
         msec: 1472
-        hash: "4fda328eafe6ec2d02d939517d6d82e3"
+        hash: "c8747327ae3370b04a996aa6b5e373c6"
     }
     Frame {
         msec: 1488
-        hash: "6afb6abe291c9e9628fd0b8c3da5d9db"
+        hash: "b7b32b5e782f8f5b1cbd6f581f90004a"
     }
     Frame {
         msec: 1504
-        hash: "cb5962fe94c5d3ef754ff45f905a5c88"
+        hash: "5fda56f77948e183557ff54690030746"
     }
     Frame {
         msec: 1520
-        hash: "57b5fc47ed700831b3dc3f2afbb1c3ed"
+        hash: "6e43987a8db7a6231887cf5883d381bf"
     }
     Frame {
         msec: 1536
-        hash: "38793fb8a19c9566c8dd9d23c9a15b5d"
+        hash: "901e1f9851d05ff300fa2d52a38829ec"
     }
     Frame {
         msec: 1552
-        hash: "2e311a5dc484e9f4bc7bd85d32a693b1"
+        hash: "abda2edf3c9f1aa28f41bf28083d081f"
     }
     Frame {
         msec: 1568
-        hash: "69d1eed68fba918e831899c8b84374a1"
+        hash: "5e324e90e4056f59730db9fbc941609a"
     }
     Frame {
         msec: 1584
-        hash: "c872391012e6ab2a6d1eb98c7f47f9e8"
+        hash: "d98ec6ad7e6f2df6796f975cdf06ea2c"
     }
     Frame {
         msec: 1600
-        hash: "cf12f90835d823550cd83d472b4f022f"
+        hash: "fa62c8154b5aba9fa6daa0a50229e752"
     }
     Frame {
         msec: 1616
-        hash: "fbb2f03ddbd87ed419386eb2942bccac"
+        hash: "c03b7e52c7da4f1cb6a4a2cab119a1a1"
     }
     Frame {
         msec: 1632
-        hash: "0788a0fdb51cedba0f8b597a4cc38ebe"
+        hash: "57c1149d35ed84de63bac7accdb30c77"
     }
     Frame {
         msec: 1648
-        hash: "b6595edf06fba22f3258c9b433af6ab8"
+        hash: "48823d7e5b72ff6e11bbe877962c9884"
     }
     Mouse {
         type: 2
@@ -650,19 +650,19 @@ VisualTest {
     }
     Frame {
         msec: 1664
-        hash: "521a8188877551a97cd3ea82d209e8ae"
+        hash: "99c8215fbd87e45836908a85748dccc7"
     }
     Frame {
         msec: 1680
-        hash: "4d923cd520c00f5cd985283d62cf17ec"
+        hash: "45e2cf43322f038d2b322dea82e829f1"
     }
     Frame {
         msec: 1696
-        hash: "7ccff14d344c7090fa634f6defd6511e"
+        hash: "6473a0dc426bf118674d09b281fb6c38"
     }
     Frame {
         msec: 1712
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Mouse {
         type: 3
@@ -674,55 +674,55 @@ VisualTest {
     }
     Frame {
         msec: 1728
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 1744
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 1760
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 1776
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 1792
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 1808
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 1824
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 1840
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 1856
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 1872
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 1888
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 1904
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 1920
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 1936
@@ -730,39 +730,39 @@ VisualTest {
     }
     Frame {
         msec: 1952
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 1968
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 1984
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2000
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2016
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2032
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2048
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2064
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2080
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Mouse {
         type: 2
@@ -782,7 +782,7 @@ VisualTest {
     }
     Frame {
         msec: 2096
-        hash: "888c68103c4eef2f65ef32a93be8286a"
+        hash: "5f6ed58401fddd692503810f22b23e93"
     }
     Mouse {
         type: 5
@@ -802,7 +802,7 @@ VisualTest {
     }
     Frame {
         msec: 2112
-        hash: "888c68103c4eef2f65ef32a93be8286a"
+        hash: "5f6ed58401fddd692503810f22b23e93"
     }
     Mouse {
         type: 5
@@ -822,7 +822,7 @@ VisualTest {
     }
     Frame {
         msec: 2128
-        hash: "888c68103c4eef2f65ef32a93be8286a"
+        hash: "5f6ed58401fddd692503810f22b23e93"
     }
     Mouse {
         type: 5
@@ -842,7 +842,7 @@ VisualTest {
     }
     Frame {
         msec: 2144
-        hash: "888c68103c4eef2f65ef32a93be8286a"
+        hash: "5f6ed58401fddd692503810f22b23e93"
     }
     Mouse {
         type: 5
@@ -862,7 +862,7 @@ VisualTest {
     }
     Frame {
         msec: 2160
-        hash: "888c68103c4eef2f65ef32a93be8286a"
+        hash: "5f6ed58401fddd692503810f22b23e93"
     }
     Mouse {
         type: 5
@@ -882,7 +882,7 @@ VisualTest {
     }
     Frame {
         msec: 2176
-        hash: "888c68103c4eef2f65ef32a93be8286a"
+        hash: "5f6ed58401fddd692503810f22b23e93"
     }
     Mouse {
         type: 5
@@ -902,7 +902,7 @@ VisualTest {
     }
     Frame {
         msec: 2192
-        hash: "888c68103c4eef2f65ef32a93be8286a"
+        hash: "5f6ed58401fddd692503810f22b23e93"
     }
     Mouse {
         type: 5
@@ -922,7 +922,7 @@ VisualTest {
     }
     Frame {
         msec: 2208
-        hash: "888c68103c4eef2f65ef32a93be8286a"
+        hash: "5f6ed58401fddd692503810f22b23e93"
     }
     Mouse {
         type: 5
@@ -942,7 +942,7 @@ VisualTest {
     }
     Frame {
         msec: 2224
-        hash: "888c68103c4eef2f65ef32a93be8286a"
+        hash: "5f6ed58401fddd692503810f22b23e93"
     }
     Mouse {
         type: 5
@@ -970,79 +970,79 @@ VisualTest {
     }
     Frame {
         msec: 2240
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2256
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2272
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2288
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2304
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2320
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2336
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2352
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2368
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2384
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2400
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2416
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2432
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2448
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2464
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2480
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2496
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2512
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2528
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Mouse {
         type: 2
@@ -1054,7 +1054,7 @@ VisualTest {
     }
     Frame {
         msec: 2544
-        hash: "0d3bac7463b5fe7f585997e35f179122"
+        hash: "defd2e26ba579dffd2273bcc86c54a94"
     }
     Mouse {
         type: 5
@@ -1066,7 +1066,7 @@ VisualTest {
     }
     Frame {
         msec: 2560
-        hash: "0d3bac7463b5fe7f585997e35f179122"
+        hash: "defd2e26ba579dffd2273bcc86c54a94"
     }
     Mouse {
         type: 5
@@ -1086,7 +1086,7 @@ VisualTest {
     }
     Frame {
         msec: 2576
-        hash: "0d3bac7463b5fe7f585997e35f179122"
+        hash: "defd2e26ba579dffd2273bcc86c54a94"
     }
     Mouse {
         type: 5
@@ -1106,7 +1106,7 @@ VisualTest {
     }
     Frame {
         msec: 2592
-        hash: "0d3bac7463b5fe7f585997e35f179122"
+        hash: "defd2e26ba579dffd2273bcc86c54a94"
     }
     Mouse {
         type: 5
@@ -1126,7 +1126,7 @@ VisualTest {
     }
     Frame {
         msec: 2608
-        hash: "0d3bac7463b5fe7f585997e35f179122"
+        hash: "defd2e26ba579dffd2273bcc86c54a94"
     }
     Mouse {
         type: 5
@@ -1146,7 +1146,7 @@ VisualTest {
     }
     Frame {
         msec: 2624
-        hash: "0d3bac7463b5fe7f585997e35f179122"
+        hash: "defd2e26ba579dffd2273bcc86c54a94"
     }
     Mouse {
         type: 5
@@ -1166,7 +1166,7 @@ VisualTest {
     }
     Frame {
         msec: 2640
-        hash: "0d3bac7463b5fe7f585997e35f179122"
+        hash: "defd2e26ba579dffd2273bcc86c54a94"
     }
     Mouse {
         type: 5
@@ -1186,7 +1186,7 @@ VisualTest {
     }
     Frame {
         msec: 2656
-        hash: "0d3bac7463b5fe7f585997e35f179122"
+        hash: "defd2e26ba579dffd2273bcc86c54a94"
     }
     Mouse {
         type: 5
@@ -1206,7 +1206,7 @@ VisualTest {
     }
     Frame {
         msec: 2672
-        hash: "0d3bac7463b5fe7f585997e35f179122"
+        hash: "defd2e26ba579dffd2273bcc86c54a94"
     }
     Mouse {
         type: 5
@@ -1226,7 +1226,7 @@ VisualTest {
     }
     Frame {
         msec: 2688
-        hash: "0d3bac7463b5fe7f585997e35f179122"
+        hash: "defd2e26ba579dffd2273bcc86c54a94"
     }
     Mouse {
         type: 5
@@ -1246,7 +1246,7 @@ VisualTest {
     }
     Frame {
         msec: 2704
-        hash: "0d3bac7463b5fe7f585997e35f179122"
+        hash: "defd2e26ba579dffd2273bcc86c54a94"
     }
     Mouse {
         type: 5
@@ -1266,7 +1266,7 @@ VisualTest {
     }
     Frame {
         msec: 2720
-        hash: "0d3bac7463b5fe7f585997e35f179122"
+        hash: "defd2e26ba579dffd2273bcc86c54a94"
     }
     Mouse {
         type: 5
@@ -1286,43 +1286,43 @@ VisualTest {
     }
     Frame {
         msec: 2736
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2752
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2768
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2784
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2800
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2816
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2832
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2848
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2864
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2880
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2896
@@ -1330,63 +1330,63 @@ VisualTest {
     }
     Frame {
         msec: 2912
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2928
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2944
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2960
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2976
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 2992
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3008
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3024
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3040
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3056
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3072
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3088
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3104
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3120
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3136
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Mouse {
         type: 2
@@ -1398,23 +1398,23 @@ VisualTest {
     }
     Frame {
         msec: 3152
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3168
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3184
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3200
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3216
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Mouse {
         type: 3
@@ -1426,67 +1426,67 @@ VisualTest {
     }
     Frame {
         msec: 3232
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3248
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3264
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3280
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3296
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3312
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3328
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3344
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3360
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3376
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3392
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3408
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3424
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3440
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3456
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3472
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Mouse {
         type: 2
@@ -1498,19 +1498,19 @@ VisualTest {
     }
     Frame {
         msec: 3488
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3504
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3520
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3536
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Mouse {
         type: 3
@@ -1522,55 +1522,55 @@ VisualTest {
     }
     Frame {
         msec: 3552
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3568
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3584
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3600
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3616
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3632
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3648
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3664
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3680
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3696
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3712
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3728
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Frame {
         msec: 3744
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Mouse {
         type: 2
@@ -1582,7 +1582,7 @@ VisualTest {
     }
     Frame {
         msec: 3760
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Mouse {
         type: 5
@@ -1602,7 +1602,7 @@ VisualTest {
     }
     Frame {
         msec: 3776
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Mouse {
         type: 5
@@ -1622,7 +1622,7 @@ VisualTest {
     }
     Frame {
         msec: 3792
-        hash: "998cb23307a61afefb59c8b9e361a89f"
+        hash: "8caa38000edef97a8276022b5da19ecc"
     }
     Mouse {
         type: 5
@@ -1642,7 +1642,7 @@ VisualTest {
     }
     Frame {
         msec: 3808
-        hash: "2e311a5dc484e9f4bc7bd85d32a693b1"
+        hash: "abda2edf3c9f1aa28f41bf28083d081f"
     }
     Mouse {
         type: 5
@@ -1662,7 +1662,7 @@ VisualTest {
     }
     Frame {
         msec: 3824
-        hash: "cbfcb7b986b0c51828473d98ca9fee03"
+        hash: "1a0305de0a8156f3f059d74891b71846"
     }
     Mouse {
         type: 5
@@ -1682,7 +1682,7 @@ VisualTest {
     }
     Frame {
         msec: 3840
-        hash: "389b514c4cd4a4d65388608643d08c04"
+        hash: "04c2fbbb1df6ca9d03c105fcfa5c0770"
     }
     Mouse {
         type: 5
@@ -1722,7 +1722,7 @@ VisualTest {
     }
     Frame {
         msec: 3872
-        hash: "cf9a0a968459a1283fff91102eb29ba3"
+        hash: "4ebb31f7945bb5542f9e5146888b1065"
     }
     Mouse {
         type: 5
@@ -1742,139 +1742,139 @@ VisualTest {
     }
     Frame {
         msec: 3888
-        hash: "77c86fb26126825cfd5b6ba21b903808"
+        hash: "2a731429c6d5c4ee1f1fa8f3ca07f0c2"
     }
     Frame {
         msec: 3904
-        hash: "c497bcbe500905b8a69fd310fd7c7e1a"
+        hash: "b8a8c4db8325b3e0292e6473084347d9"
     }
     Frame {
         msec: 3920
-        hash: "95bffb4d4aff1603e96af55cbc2dc3f2"
+        hash: "fae53bd8bc9d05f343968c7006723207"
     }
     Frame {
         msec: 3936
-        hash: "6fa87a7136528b688069fe1c4bd94043"
+        hash: "fe2fc28a79609af32ea1043f3c988b08"
     }
     Frame {
         msec: 3952
-        hash: "602c16e1382d810f853d647e531b4e8a"
+        hash: "18f77a48b14347b2ab41eb39c9de3be4"
     }
     Frame {
         msec: 3968
-        hash: "01d1227e4f5b95f8b0c6a57a4b2314c4"
+        hash: "93e83c35d34715ee703a0d79d51bc145"
     }
     Frame {
         msec: 3984
-        hash: "1db6401af45574b7453ad57766e60e6f"
+        hash: "4ae9d80d6079b92be66fcc099209d779"
     }
     Frame {
         msec: 4000
-        hash: "067a1bef3df5d1c40842f28885d60250"
+        hash: "bd8c0a924552cb4dfc5ddc1451931b01"
     }
     Frame {
         msec: 4016
-        hash: "5fba31051e05ec00c0d68b8e8af94132"
+        hash: "6a1874cdac6f754b36f022c583834d32"
     }
     Frame {
         msec: 4032
-        hash: "d6209a0b9b9e0f2072179a4623c70fbd"
+        hash: "f3064485083025aba09224faafcede14"
     }
     Frame {
         msec: 4048
-        hash: "ec30f07ab0056a45954c07ecdfa1401a"
+        hash: "8e82568ac62969dfedbf1c2082101661"
     }
     Frame {
         msec: 4064
-        hash: "fef6c7767970a283bb3b13826f71bdac"
+        hash: "4e447efea0dd139787c7aa9018327206"
     }
     Frame {
         msec: 4080
-        hash: "29621938e96be0d11c95fd1e4ca37631"
+        hash: "ed23778ce6843053cd4af6df7262bdd0"
     }
     Frame {
         msec: 4096
-        hash: "8103c96ac90ddf52056d7e8b32e4ae9e"
+        hash: "fe1118cc51b4cd25d775b5d1c1d66540"
     }
     Frame {
         msec: 4112
-        hash: "d72bf8b88efe603050ad038380173969"
+        hash: "02a59ccc15df26abe5612f13ce926286"
     }
     Frame {
         msec: 4128
-        hash: "4438b56eb6aa800602634db6016caa50"
+        hash: "71c43a208e3dfbce6cb461f8ff0d2f17"
     }
     Frame {
         msec: 4144
-        hash: "44674f7a874023c3932d698344ccda0e"
+        hash: "404b8155f17dff084c2da1407d6915a9"
     }
     Frame {
         msec: 4160
-        hash: "155a834ddaa7128b6f5a2a406b340315"
+        hash: "ab0dba54c469dea461cd1619161edd82"
     }
     Frame {
         msec: 4176
-        hash: "3886efa510581ee5b6c4a2ed76aeb42d"
+        hash: "e6f158712a7afe1844acc1a1cd9385ec"
     }
     Frame {
         msec: 4192
-        hash: "094954e8d10b85d3941626dec4fb36af"
+        hash: "b9d8fcc3d68ebc6d4d4f60e4652befe3"
     }
     Frame {
         msec: 4208
-        hash: "b597aeb20a8630e4b1dfd0a7be383e4d"
+        hash: "9005a49b3ac2ef2344d78ef68595ea26"
     }
     Frame {
         msec: 4224
-        hash: "abc58e74ab197a2d7c243ddd67442e53"
+        hash: "aad3dd90f766320ad68b62b97559ec02"
     }
     Frame {
         msec: 4240
-        hash: "b6ec106d39af13492c3d43bf006b7b15"
+        hash: "a39008d78d188e8bd3571f80f679a915"
     }
     Frame {
         msec: 4256
-        hash: "d80211f898473a01e0c0641b96bc92f4"
+        hash: "cedc580acc63d6a069442bb83f17b6f8"
     }
     Frame {
         msec: 4272
-        hash: "5010579fcd925e65c778c2e9cf0317de"
+        hash: "f63f5d20e3b5a4b6247339d0ec518449"
     }
     Frame {
         msec: 4288
-        hash: "5010579fcd925e65c778c2e9cf0317de"
+        hash: "f63f5d20e3b5a4b6247339d0ec518449"
     }
     Frame {
         msec: 4304
-        hash: "d80211f898473a01e0c0641b96bc92f4"
+        hash: "cedc580acc63d6a069442bb83f17b6f8"
     }
     Frame {
         msec: 4320
-        hash: "27cfc811f62029df48ea7f371ff5654b"
+        hash: "bccf94c11e92af36f418dbee1b797a86"
     }
     Frame {
         msec: 4336
-        hash: "b6ec106d39af13492c3d43bf006b7b15"
+        hash: "a39008d78d188e8bd3571f80f679a915"
     }
     Frame {
         msec: 4352
-        hash: "28c8e3f08f46bf13cc52a7d6a31a7cf1"
+        hash: "02d38396737a262fa983511a40514b38"
     }
     Frame {
         msec: 4368
-        hash: "b597aeb20a8630e4b1dfd0a7be383e4d"
+        hash: "9005a49b3ac2ef2344d78ef68595ea26"
     }
     Frame {
         msec: 4384
-        hash: "a3a3682ce0d2a2d57457458b13645afa"
+        hash: "c05dad606a9b5b501a201bfead974f03"
     }
     Frame {
         msec: 4400
-        hash: "98bf25cbb8202fe1576ac15bac7b9e65"
+        hash: "27846f086c13e1b06e89a8a395802678"
     }
     Frame {
         msec: 4416
-        hash: "16b99c9cf5297a5251869a3935084cf7"
+        hash: "f919b09b6f7f4f09b5d9b123b686a442"
     }
     Mouse {
         type: 2
@@ -1886,11 +1886,11 @@ VisualTest {
     }
     Frame {
         msec: 4432
-        hash: "16b99c9cf5297a5251869a3935084cf7"
+        hash: "f919b09b6f7f4f09b5d9b123b686a442"
     }
     Frame {
         msec: 4448
-        hash: "16b99c9cf5297a5251869a3935084cf7"
+        hash: "f919b09b6f7f4f09b5d9b123b686a442"
     }
     Mouse {
         type: 5
@@ -1902,7 +1902,7 @@ VisualTest {
     }
     Frame {
         msec: 4464
-        hash: "16b99c9cf5297a5251869a3935084cf7"
+        hash: "f919b09b6f7f4f09b5d9b123b686a442"
     }
     Mouse {
         type: 5
@@ -1922,7 +1922,7 @@ VisualTest {
     }
     Frame {
         msec: 4480
-        hash: "16b99c9cf5297a5251869a3935084cf7"
+        hash: "ab0dba54c469dea461cd1619161edd82"
     }
     Mouse {
         type: 5
@@ -1942,7 +1942,7 @@ VisualTest {
     }
     Frame {
         msec: 4496
-        hash: "abc58e74ab197a2d7c243ddd67442e53"
+        hash: "aad3dd90f766320ad68b62b97559ec02"
     }
     Mouse {
         type: 5
@@ -1962,7 +1962,7 @@ VisualTest {
     }
     Frame {
         msec: 4512
-        hash: "e5c5b741da7c028ec77f52016675c1ca"
+        hash: "09e110197afc9350dbbaf3e19e24dbe8"
     }
     Mouse {
         type: 5
@@ -1982,7 +1982,7 @@ VisualTest {
     }
     Frame {
         msec: 4528
-        hash: "12481bcccb524a478851a57d4db6cf8d"
+        hash: "c50fa7aa75b947d065109c97a0db4c02"
     }
     Mouse {
         type: 5
@@ -2002,7 +2002,7 @@ VisualTest {
     }
     Frame {
         msec: 4544
-        hash: "a49985bd332cd3376986d379c474a3de"
+        hash: "e701f8ef23f576f10c286191ea4caaf1"
     }
     Mouse {
         type: 5
@@ -2030,51 +2030,51 @@ VisualTest {
     }
     Frame {
         msec: 4560
-        hash: "cd4e55b15e9df7fee1862180fddec0ca"
+        hash: "c24daebe9c5ba9bd46ef674c49edd160"
     }
     Frame {
         msec: 4576
-        hash: "64ff54775d198b616597f4539de90bd8"
+        hash: "fc762235395c772666d2529a5e9bff98"
     }
     Frame {
         msec: 4592
-        hash: "2b188745bfff51f9d3af90b7ad9c8d77"
+        hash: "7f4f4420fde62e6126f0c3bf604425dc"
     }
     Frame {
         msec: 4608
-        hash: "2dde7d565f92f22c6524448f97107e35"
+        hash: "0e9978b0f60cba7bf599571b97f2f751"
     }
     Frame {
         msec: 4624
-        hash: "897a454ac464008d6dd7864eb608ae65"
+        hash: "ff19d1b0a0d7d0cc5dd8919606c17fc8"
     }
     Frame {
         msec: 4640
-        hash: "269df4f1aca4f0cdbd5c86c2e115bd3c"
+        hash: "7c61e0a6c354b4f30db6c861b9250be2"
     }
     Frame {
         msec: 4656
-        hash: "ec0ebdbd3f4665fba7f6a523a82a5071"
+        hash: "bd1196ce51f5abd53f6052f17d926a81"
     }
     Frame {
         msec: 4672
-        hash: "c1ac6a385f580f23b3486c643d276e33"
+        hash: "ab2b1c33a5f60690fe2724a0ddd3bb67"
     }
     Frame {
         msec: 4688
-        hash: "3de0d147a6a3c1382ec64a80996bb4f4"
+        hash: "0a0709d2649d649ab52eaddbe60c1dc9"
     }
     Frame {
         msec: 4704
-        hash: "8db942b5909f63d4369ad5b29938ef49"
+        hash: "ef3b3099811cc2e26d823d94c5b66f1d"
     }
     Frame {
         msec: 4720
-        hash: "f7840636f2d01c25be8e9c77230cca53"
+        hash: "522683305b2706b6e22d0e1770f285d6"
     }
     Frame {
         msec: 4736
-        hash: "d315f82e175361fed83193ce550cb6e9"
+        hash: "c08d933b3dbda5fc476ed673cd7a2e4a"
     }
     Mouse {
         type: 2
@@ -2086,7 +2086,7 @@ VisualTest {
     }
     Frame {
         msec: 4752
-        hash: "d315f82e175361fed83193ce550cb6e9"
+        hash: "c08d933b3dbda5fc476ed673cd7a2e4a"
     }
     Mouse {
         type: 5
@@ -2106,7 +2106,7 @@ VisualTest {
     }
     Frame {
         msec: 4768
-        hash: "d315f82e175361fed83193ce550cb6e9"
+        hash: "ab0dba54c469dea461cd1619161edd82"
     }
     Mouse {
         type: 5
@@ -2126,7 +2126,7 @@ VisualTest {
     }
     Frame {
         msec: 4784
-        hash: "00b072a0adbfcd520d495ef6540f5680"
+        hash: "d23653a4e1651babdbb3561fb7029df2"
     }
     Mouse {
         type: 5
@@ -2146,7 +2146,7 @@ VisualTest {
     }
     Frame {
         msec: 4800
-        hash: "fb605e95988a6110384671e7f3f18ad8"
+        hash: "702d94cbca1ba235a5a2cc30c552d8b7"
     }
     Mouse {
         type: 5
@@ -2186,7 +2186,7 @@ VisualTest {
     }
     Frame {
         msec: 4832
-        hash: "4d1eb644b592a693b13fe14377aeed97"
+        hash: "f53134176897d55299ab723ab20ba3fc"
     }
     Mouse {
         type: 5
@@ -2206,7 +2206,7 @@ VisualTest {
     }
     Frame {
         msec: 4848
-        hash: "00eb1d3b016eb0220461074ce81b1aef"
+        hash: "84146c913b41215c4bab1f36471f2b7b"
     }
     Mouse {
         type: 5
@@ -2234,231 +2234,231 @@ VisualTest {
     }
     Frame {
         msec: 4864
-        hash: "77c86fb26126825cfd5b6ba21b903808"
+        hash: "2a731429c6d5c4ee1f1fa8f3ca07f0c2"
     }
     Frame {
         msec: 4880
-        hash: "e80f024bbdce0ceeae137e347abc95a4"
+        hash: "a1e960ffef391daecb52d31698c7b06c"
     }
     Frame {
         msec: 4896
-        hash: "bb189f39a836b9a2aa68f4535ed1d6fb"
+        hash: "adca54c132f170c517f1ef17c45006c8"
     }
     Frame {
         msec: 4912
-        hash: "cf9a0a968459a1283fff91102eb29ba3"
+        hash: "4ebb31f7945bb5542f9e5146888b1065"
     }
     Frame {
         msec: 4928
-        hash: "27130e7f6b853a287a7bdd8608628a4f"
+        hash: "c43ebd04137e379216c94b4c57cab3d9"
     }
     Frame {
         msec: 4944
-        hash: "231c7b7078af00a36cfee3d5e43a4021"
+        hash: "c0218c548f5e3eb74ef33cb2921dbc96"
     }
     Frame {
         msec: 4960
-        hash: "d8ffc8cc9cecc25cb9b4e7990fb7b8e7"
+        hash: "e6a15947574c7ac8e5a2454a5f8b043d"
     }
     Frame {
         msec: 4976
-        hash: "fb5db5dafdb375132f1f1a461193bc60"
+        hash: "ec9aca63b61a8c3beb4ad476d4e38568"
     }
     Frame {
         msec: 4992
-        hash: "64100f9f102ffc9415e306c087547709"
+        hash: "28f0447e8107d7fac9ec29b83808d2cb"
     }
     Frame {
         msec: 5008
-        hash: "6960e5c4feb55043ff91934fc934734e"
+        hash: "74e28cddf8dd7bd7593c7185e09ea752"
     }
     Frame {
         msec: 5024
-        hash: "349c7a84ff8f9b52d39dba1282353167"
+        hash: "23b447e486a6354354505171cf3c45ec"
     }
     Frame {
         msec: 5040
-        hash: "bb41010df844312fc15bb5b42712619a"
+        hash: "3e3948addc7236ff8638863786dfe045"
     }
     Frame {
         msec: 5056
-        hash: "63a3e18670bb2a5e7edfe3b752c0a1b5"
+        hash: "49885ec2f3242fc3ba9c9b808b3bb491"
     }
     Frame {
         msec: 5072
-        hash: "92b1d0fbadbefe9f122b14903a5e0ee9"
+        hash: "0c12fc65a0298af1a1ec3bccfcdb20ab"
     }
     Frame {
         msec: 5088
-        hash: "6b979e1a4bc7226a89ffb97be2f08147"
+        hash: "49c71089343b963fd8b3587eb1d5d457"
     }
     Frame {
         msec: 5104
-        hash: "7b783908e0b10d329a7d3172f2302a85"
+        hash: "f083682e9bce74022baeafcb26870adb"
     }
     Frame {
         msec: 5120
-        hash: "41d5ef3390cfc0d806825fc0cd033be6"
+        hash: "5bd49eab3fd8b246659b51d4602ea391"
     }
     Frame {
         msec: 5136
-        hash: "ff1a053c0af99c51353503002515843d"
+        hash: "3170c18b8dd74429b0f366ec07f4870b"
     }
     Frame {
         msec: 5152
-        hash: "63b26ecde2a2a9ce36884191304352ed"
+        hash: "d82de8b7c5a144b20085f447cf041350"
     }
     Frame {
         msec: 5168
-        hash: "bdcff2f9f2c376974211ea6ad5c4961f"
+        hash: "60e520c52c5b87c686294a23d96dbd11"
     }
     Frame {
         msec: 5184
-        hash: "00ffef1a1d4341ac1c7f43d493a9e826"
+        hash: "bb5b6cb5862e28a7f309ef5c7cf2b5dd"
     }
     Frame {
         msec: 5200
-        hash: "65dcbb543656f65267c7d32dcd644e56"
+        hash: "b9e255376ad0b74b2c9be6e694f84d90"
     }
     Frame {
         msec: 5216
-        hash: "38b49419b7103d76da2b6d7101d63d88"
+        hash: "e7527c7c8cb2f8c9e5ce32be98612837"
     }
     Frame {
         msec: 5232
-        hash: "de39f6bf64745054cbee30ddf306f641"
+        hash: "8f8547a6508b156d514c6d4a61d18424"
     }
     Frame {
         msec: 5248
-        hash: "d6b5ceca4aa48a7d4fd901d44c151b53"
+        hash: "99b4220101d400b49346ca023799c8fe"
     }
     Frame {
         msec: 5264
-        hash: "876e6eee8a35c34e2dd5269f86a9ab3a"
+        hash: "2d83cf7c5f93aad4f9dcadcfdbb08fa3"
     }
     Frame {
         msec: 5280
-        hash: "f94219306eac2e678881d0b607d15a1e"
+        hash: "c9ea64aa7000008ad9032cddd898767c"
     }
     Frame {
         msec: 5296
-        hash: "c9184196ef45c985f08f80435492641d"
+        hash: "4c37b188261e927f72725484d08ac9e1"
     }
     Frame {
         msec: 5312
-        hash: "34dc672ebfd75ec017d0c2f0bd435cd8"
+        hash: "29c8004517294539adf3243533381436"
     }
     Frame {
         msec: 5328
-        hash: "4daf1c730fdf13e0a87b28208f2b6dd1"
+        hash: "b5126298ebb61d6ab5ae58822c9380ca"
     }
     Frame {
         msec: 5344
-        hash: "c28d5d7d9d3a86e5bbf6ad48331f9c61"
+        hash: "7b546c089dca57353b4867af724ea370"
     }
     Frame {
         msec: 5360
-        hash: "3f98121997a1613bd49d22003d1a1887"
+        hash: "deedb9ddcc2f5354a2356178db54d971"
     }
     Frame {
         msec: 5376
-        hash: "86732d3e900877ae7a8615b7448afaaa"
+        hash: "9e1fb461c13b4affa39e5909d3ade168"
     }
     Frame {
         msec: 5392
-        hash: "9f3da7ebaeb319c9fec0abdd6bd76ee2"
+        hash: "dbb54d7d203c99d466b1a173fb90c148"
     }
     Frame {
         msec: 5408
-        hash: "326563c2c812a74c7f1fa5e9da0c2369"
+        hash: "0a67ef028264551c1122f4d8a0b07c20"
     }
     Frame {
         msec: 5424
-        hash: "79e00bbe77f0a178e8db30023a881c3f"
+        hash: "636f04661a0418c1fdcaaaba28092671"
     }
     Frame {
         msec: 5440
-        hash: "e624204566550e928ab2a2c54113d217"
+        hash: "de8946eb6317277b580cbf6a38a85a29"
     }
     Frame {
         msec: 5456
-        hash: "b95bf705b81544b05f560c54dec56ff1"
+        hash: "45dd5e856c10ef2e5a9b968044802096"
     }
     Frame {
         msec: 5472
-        hash: "4f4cd776b76272cfe79b86a108bd6b6e"
+        hash: "a974415dcf31bee79874c4a6e84cf796"
     }
     Frame {
         msec: 5488
-        hash: "ec2eb1b39a252bd9b37d12ede3d231ce"
+        hash: "58dab05300d4c83ba084c8bef6a04958"
     }
     Frame {
         msec: 5504
-        hash: "a746404a1a26e2a25b8d364dbef46eef"
+        hash: "f74c075e8cf2aef501b7115427b3b221"
     }
     Frame {
         msec: 5520
-        hash: "17d190465ee0d348d9b67a748626d99e"
+        hash: "7fd3e958115134b2f15cc6d3e01cbcfe"
     }
     Frame {
         msec: 5536
-        hash: "9124d97d120de1806d86c8f437ec4ed2"
+        hash: "7efcd27e34db1d3adc3d31e0b9ebe432"
     }
     Frame {
         msec: 5552
-        hash: "ea746de2380835d299c56bb01f0aa83c"
+        hash: "2229621b9ad55dddce371061584a4dfd"
     }
     Frame {
         msec: 5568
-        hash: "4fda328eafe6ec2d02d939517d6d82e3"
+        hash: "c8747327ae3370b04a996aa6b5e373c6"
     }
     Frame {
         msec: 5584
-        hash: "9c6f671def0b1f5d780024a9dad439e6"
+        hash: "677f52c273dda1f878bfea43b6353aaa"
     }
     Frame {
         msec: 5600
-        hash: "b7d441d0bb27ed6d1984f324b6e02548"
+        hash: "d29de2f0505bdaca1e3443812a588fb1"
     }
     Frame {
         msec: 5616
-        hash: "3042a62a1125171d9530b696f4b36e19"
+        hash: "71f3088ea8794a232ee08c6b0ad72e98"
     }
     Frame {
         msec: 5632
-        hash: "4534f40cf6bb7f402d7252c474629664"
+        hash: "3733ba52e740ea8438967cb03c619368"
     }
     Frame {
         msec: 5648
-        hash: "cb5962fe94c5d3ef754ff45f905a5c88"
+        hash: "5fda56f77948e183557ff54690030746"
     }
     Frame {
         msec: 5664
-        hash: "b5a5f9f3aa0948f0bd8d9b4a3fceae50"
+        hash: "5996c2fc31ff3a13e1f3a23a230aad9a"
     }
     Frame {
         msec: 5680
-        hash: "2e0605899abb5725cf22561ec9293879"
+        hash: "90b9b19f9f6aef7279b1199ca7b34b07"
     }
     Frame {
         msec: 5696
-        hash: "1f260f1d931326be7e398f7c87e44735"
+        hash: "05b4559167ff77d07bb3063b87c4e621"
     }
     Frame {
         msec: 5712
-        hash: "57b5fc47ed700831b3dc3f2afbb1c3ed"
+        hash: "6e43987a8db7a6231887cf5883d381bf"
     }
     Frame {
         msec: 5728
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 5744
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 5760
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 5776
@@ -2474,19 +2474,19 @@ VisualTest {
     }
     Frame {
         msec: 5792
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 5808
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 5824
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 5840
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Mouse {
         type: 3
@@ -2498,59 +2498,59 @@ VisualTest {
     }
     Frame {
         msec: 5856
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 5872
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 5888
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 5904
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 5920
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 5936
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 5952
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 5968
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 5984
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6000
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6016
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6032
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6048
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6064
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Mouse {
         type: 2
@@ -2562,23 +2562,23 @@ VisualTest {
     }
     Frame {
         msec: 6080
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6096
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6112
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6128
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6144
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Mouse {
         type: 3
@@ -2590,63 +2590,63 @@ VisualTest {
     }
     Frame {
         msec: 6160
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6176
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6192
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6208
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6224
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6240
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6256
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6272
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6288
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6304
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6320
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6336
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6352
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6368
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Frame {
         msec: 6384
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Mouse {
         type: 2
@@ -2658,11 +2658,11 @@ VisualTest {
     }
     Frame {
         msec: 6400
-        hash: "c18aeb6fb3914a0be2d34ff76249ed8e"
+        hash: "9b748b3b85f63d7f62cd916b0bf4357c"
     }
     Frame {
         msec: 6416
-        hash: "c18aeb6fb3914a0be2d34ff76249ed8e"
+        hash: "9b748b3b85f63d7f62cd916b0bf4357c"
     }
     Mouse {
         type: 5
@@ -2682,7 +2682,7 @@ VisualTest {
     }
     Frame {
         msec: 6432
-        hash: "c18aeb6fb3914a0be2d34ff76249ed8e"
+        hash: "9b748b3b85f63d7f62cd916b0bf4357c"
     }
     Mouse {
         type: 5
@@ -2702,7 +2702,7 @@ VisualTest {
     }
     Frame {
         msec: 6448
-        hash: "8b9167c04a8acc7f8ade258a3e58893b"
+        hash: "351d95ba7bc01ea8d4991883885ca537"
     }
     Mouse {
         type: 5
@@ -2722,7 +2722,7 @@ VisualTest {
     }
     Frame {
         msec: 6464
-        hash: "a5daa2f6c932fa38038639bdc8231c5d"
+        hash: "2c84bdd7066c8fd8c66b022783c6fcfe"
     }
     Mouse {
         type: 5
@@ -2742,7 +2742,7 @@ VisualTest {
     }
     Frame {
         msec: 6480
-        hash: "f342612efcd5e0820b44bd788ec52d7a"
+        hash: "ffe18300d9ce72e2d4e191c473a6973c"
     }
     Mouse {
         type: 5
@@ -2762,7 +2762,7 @@ VisualTest {
     }
     Frame {
         msec: 6496
-        hash: "9a66e65c69ec833a36cce5cbd7d8257f"
+        hash: "427720fdd38ff4310c8040b1a5a5f84f"
     }
     Mouse {
         type: 5
@@ -2782,7 +2782,7 @@ VisualTest {
     }
     Frame {
         msec: 6512
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Mouse {
         type: 5
@@ -2802,7 +2802,7 @@ VisualTest {
     }
     Frame {
         msec: 6528
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Mouse {
         type: 5
@@ -2822,7 +2822,7 @@ VisualTest {
     }
     Frame {
         msec: 6544
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Mouse {
         type: 5
@@ -2842,7 +2842,7 @@ VisualTest {
     }
     Frame {
         msec: 6560
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Mouse {
         type: 5
@@ -2862,7 +2862,7 @@ VisualTest {
     }
     Frame {
         msec: 6576
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Mouse {
         type: 5
@@ -2882,7 +2882,7 @@ VisualTest {
     }
     Frame {
         msec: 6592
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Mouse {
         type: 5
@@ -2910,35 +2910,35 @@ VisualTest {
     }
     Frame {
         msec: 6608
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6624
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6640
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6656
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6672
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6688
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6704
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6720
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6736
@@ -2946,67 +2946,67 @@ VisualTest {
     }
     Frame {
         msec: 6752
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6768
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6784
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6800
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6816
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6832
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6848
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6864
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6880
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6896
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6912
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6928
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6944
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6960
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6976
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Frame {
         msec: 6992
-        hash: "bca482a77823f03e8fb4170ee329fc0e"
+        hash: "08a827d109c78ff0d82ed7b6ef8d55b9"
     }
     Mouse {
         type: 2
@@ -3018,7 +3018,7 @@ VisualTest {
     }
     Frame {
         msec: 7008
-        hash: "9ed65a21e4aaedf9c48a38324b3f5480"
+        hash: "ff198f6b27379e64b901b37e0cf1e98b"
     }
     Mouse {
         type: 5
@@ -3038,7 +3038,7 @@ VisualTest {
     }
     Frame {
         msec: 7024
-        hash: "9ed65a21e4aaedf9c48a38324b3f5480"
+        hash: "ff198f6b27379e64b901b37e0cf1e98b"
     }
     Mouse {
         type: 5
@@ -3058,7 +3058,7 @@ VisualTest {
     }
     Frame {
         msec: 7040
-        hash: "9ed65a21e4aaedf9c48a38324b3f5480"
+        hash: "ff198f6b27379e64b901b37e0cf1e98b"
     }
     Mouse {
         type: 5
@@ -3078,7 +3078,7 @@ VisualTest {
     }
     Frame {
         msec: 7056
-        hash: "c4925926f64b852ff6c8d07e1c70ead5"
+        hash: "61d410fdbe0ee8a41e9c7b25eb2901a7"
     }
     Mouse {
         type: 5
@@ -3098,7 +3098,7 @@ VisualTest {
     }
     Frame {
         msec: 7072
-        hash: "da771cedad067b8f25c100613b6a14f2"
+        hash: "8e27d1db841047a115561861a1c20e67"
     }
     Mouse {
         type: 5
@@ -3118,7 +3118,7 @@ VisualTest {
     }
     Frame {
         msec: 7088
-        hash: "c8862bf76a431edc1cf04f4114fa859f"
+        hash: "7599e2f206da8b46dcaf35a4a7858747"
     }
     Mouse {
         type: 5
@@ -3138,7 +3138,7 @@ VisualTest {
     }
     Frame {
         msec: 7104
-        hash: "4d923cd520c00f5cd985283d62cf17ec"
+        hash: "45e2cf43322f038d2b322dea82e829f1"
     }
     Mouse {
         type: 5
@@ -3158,7 +3158,7 @@ VisualTest {
     }
     Frame {
         msec: 7120
-        hash: "76b0d1c77ba29bad836673b1b79de911"
+        hash: "0170b6aff2eab67213fc4f2883be1db9"
     }
     Mouse {
         type: 5
@@ -3178,7 +3178,7 @@ VisualTest {
     }
     Frame {
         msec: 7136
-        hash: "3f9c5686f0a9ef5ecf2b8338ef2e7933"
+        hash: "23ef985de50ae4600d8f62ed4c91edc9"
     }
     Mouse {
         type: 5
@@ -3198,7 +3198,7 @@ VisualTest {
     }
     Frame {
         msec: 7152
-        hash: "799d83eedefa0a56f37a83404c59ad4f"
+        hash: "a69e534df84e406e06ca94e2221c97f1"
     }
     Mouse {
         type: 5
@@ -3226,79 +3226,79 @@ VisualTest {
     }
     Frame {
         msec: 7168
-        hash: "d6b5ceca4aa48a7d4fd901d44c151b53"
+        hash: "99b4220101d400b49346ca023799c8fe"
     }
     Frame {
         msec: 7184
-        hash: "e1609c4e40fb9e043a9fff683b94c6c4"
+        hash: "80f599f50af9e601536f62ea93f4e429"
     }
     Frame {
         msec: 7200
-        hash: "ea457fc4d4065d2ed0e9f6efc47a06ee"
+        hash: "e211b4a9e0059eaf7a3654121ed6b7a4"
     }
     Frame {
         msec: 7216
-        hash: "b7f4319aa9c21640a697ee89f162bb49"
+        hash: "ef0997291fb3323c877b65847905f7c3"
     }
     Frame {
         msec: 7232
-        hash: "880f60263cd79fb6a1bff7252d2373bb"
+        hash: "95ca2f988370075070c6a98e5e680206"
     }
     Frame {
         msec: 7248
-        hash: "00ffef1a1d4341ac1c7f43d493a9e826"
+        hash: "bb5b6cb5862e28a7f309ef5c7cf2b5dd"
     }
     Frame {
         msec: 7264
-        hash: "c949fe87ba91e08f26a1c4d90028513f"
+        hash: "958e9074dfa2392db05fb3f532573519"
     }
     Frame {
         msec: 7280
-        hash: "8636af4591c61c4b4a548f3a38749413"
+        hash: "4d90460d3b6c46075ffda426bc6ceaa6"
     }
     Frame {
         msec: 7296
-        hash: "63b26ecde2a2a9ce36884191304352ed"
+        hash: "d82de8b7c5a144b20085f447cf041350"
     }
     Frame {
         msec: 7312
-        hash: "843f7263f63442f0041bf2c1a6fae400"
+        hash: "4d5d1c8470df16097c51517e750ef6be"
     }
     Frame {
         msec: 7328
-        hash: "ff1a053c0af99c51353503002515843d"
+        hash: "3170c18b8dd74429b0f366ec07f4870b"
     }
     Frame {
         msec: 7344
-        hash: "47aea3ac4ea935d43f731a258287c2e8"
+        hash: "35b4e282089b4f7e8cc60aaf6635a0f7"
     }
     Frame {
         msec: 7360
-        hash: "eee4fa336149528dfb16565b856ca692"
+        hash: "bb67acd602414cf59e27b5ff19f69169"
     }
     Frame {
         msec: 7376
-        hash: "bb94493c25c56c41e81ef1e390adf63d"
+        hash: "0135220633c5aebe964b596f3c1bae27"
     }
     Frame {
         msec: 7392
-        hash: "2915f455a5e1e8c6b8cc78309c5e84d9"
+        hash: "b4a996bdc1ccae96f84e285b212a19a3"
     }
     Frame {
         msec: 7408
-        hash: "94701ffaa4f45924ad89f92a30157c7d"
+        hash: "7fe6c7bd1bc9e46d3e520178a2309e87"
     }
     Frame {
         msec: 7424
-        hash: "92fae8cf4b8d8404b26a31f995860b95"
+        hash: "b803764915a58bd59aed1223bd7c67d7"
     }
     Frame {
         msec: 7440
-        hash: "6b979e1a4bc7226a89ffb97be2f08147"
+        hash: "49c71089343b963fd8b3587eb1d5d457"
     }
     Frame {
         msec: 7456
-        hash: "dd94beeb0b4933a9ac2236a9abe630ff"
+        hash: "d2e577eecdf6fc9ecadf500896e0ff46"
     }
     Mouse {
         type: 2
@@ -3310,11 +3310,11 @@ VisualTest {
     }
     Frame {
         msec: 7472
-        hash: "dd94beeb0b4933a9ac2236a9abe630ff"
+        hash: "d2e577eecdf6fc9ecadf500896e0ff46"
     }
     Frame {
         msec: 7488
-        hash: "dd94beeb0b4933a9ac2236a9abe630ff"
+        hash: "d2e577eecdf6fc9ecadf500896e0ff46"
     }
     Mouse {
         type: 5
@@ -3334,7 +3334,7 @@ VisualTest {
     }
     Frame {
         msec: 7504
-        hash: "dd94beeb0b4933a9ac2236a9abe630ff"
+        hash: "d2e577eecdf6fc9ecadf500896e0ff46"
     }
     Mouse {
         type: 5
@@ -3354,7 +3354,7 @@ VisualTest {
     }
     Frame {
         msec: 7520
-        hash: "34c7ed1c072d84626a8a64f7db02f71d"
+        hash: "21bf0affeaf1033e59a99bed9efeb80d"
     }
     Mouse {
         type: 5
@@ -3374,7 +3374,7 @@ VisualTest {
     }
     Frame {
         msec: 7536
-        hash: "e723da5ecaffe31f03b1d5ca6765229b"
+        hash: "c4506098417f905871a43d183cd5904d"
     }
     Mouse {
         type: 5
@@ -3394,7 +3394,7 @@ VisualTest {
     }
     Frame {
         msec: 7552
-        hash: "a85128cae494abeb5d45ab8df0d127a6"
+        hash: "fdf8dfa53431f930b01e667b3b86c7a1"
     }
     Mouse {
         type: 5
@@ -3414,7 +3414,7 @@ VisualTest {
     }
     Frame {
         msec: 7568
-        hash: "3599a92966c27321e9f702f3428b9b00"
+        hash: "a94e05f80f0f8d3af13678318fd91416"
     }
     Mouse {
         type: 5
@@ -3434,31 +3434,31 @@ VisualTest {
     }
     Frame {
         msec: 7584
-        hash: "067a1bef3df5d1c40842f28885d60250"
+        hash: "bd8c0a924552cb4dfc5ddc1451931b01"
     }
     Frame {
         msec: 7600
-        hash: "82f818ed44a191fb51e637b8068786dc"
+        hash: "ed5bab2126fb459989b7ea0e44da6776"
     }
     Frame {
         msec: 7616
-        hash: "f408f59707195549ba61f030a3f020cd"
+        hash: "756fc80a88e6f5d28f9c6bba771355c5"
     }
     Frame {
         msec: 7632
-        hash: "66e79c8b2f8e3a57c3bc14935c5df7d1"
+        hash: "640c092db0d2a523ce0cdc961e64124a"
     }
     Frame {
         msec: 7648
-        hash: "4341c6b7b0d2e8021b51cb1abab85e10"
+        hash: "097582f1b42c16d41f4413755ac15c3e"
     }
     Frame {
         msec: 7664
-        hash: "5ec8ee5ccecac1787b2f5e99268e810d"
+        hash: "67ef5e3297fe5605bd41a72681899f48"
     }
     Frame {
         msec: 7680
-        hash: "1fae7b735ff6e88abfb1423f8960da4f"
+        hash: "91452c52c309b7d90c7ccca3fc9ae8b2"
     }
     Frame {
         msec: 7696
@@ -3466,182 +3466,182 @@ VisualTest {
     }
     Frame {
         msec: 7712
-        hash: "dce74ff07eb37c82a38b3e515f9a43f2"
+        hash: "ebef3c7095abadf45855fe75cbf3d358"
     }
     Frame {
         msec: 7728
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 7744
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 7760
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 7776
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 7792
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 7808
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 7824
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 7840
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 7856
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 7872
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 7888
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 7904
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 7920
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 7936
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 7952
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 7968
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 7984
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8000
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8016
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8032
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8048
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8064
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8080
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8096
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8112
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8128
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8144
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8160
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8176
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8192
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8208
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8224
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8240
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8256
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8272
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8288
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8304
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8320
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8336
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8352
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8368
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8384
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8400
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
     Frame {
         msec: 8416
-        hash: "ba2c06129f17fde474427859d66ecd23"
+        hash: "97b167a5a76d6b71713d25508ed360f0"
     }
 }
diff --git a/tests/auto/declarative/qmlvisual/rect/data/rect-painting.0.png b/tests/auto/declarative/qmlvisual/rect/data/rect-painting.0.png
index 1dc9372..3556dce 100644
Binary files a/tests/auto/declarative/qmlvisual/rect/data/rect-painting.0.png and b/tests/auto/declarative/qmlvisual/rect/data/rect-painting.0.png differ
-- 
cgit v0.12


From cb470a33bf85cf15b9df57e3ade27c6a0720d138 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Tue, 4 Jan 2011 08:39:22 +0100
Subject: Fixed first element being a LineToElement in
 QPainterPath::connectPath()

This would produce an invalid path, causing potential crashes in various
parts of Qt.

Task-number: QTBUG-16377
Reviewed-by: Gunnar Sletta
---
 src/gui/painting/qpainterpath.cpp            |  3 ++-
 tests/auto/qpainterpath/tst_qpainterpath.cpp | 26 ++++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/src/gui/painting/qpainterpath.cpp b/src/gui/painting/qpainterpath.cpp
index ffd0d5c..94e2cd4 100644
--- a/src/gui/painting/qpainterpath.cpp
+++ b/src/gui/painting/qpainterpath.cpp
@@ -1196,7 +1196,8 @@ void QPainterPath::connectPath(const QPainterPath &other)
     int first = d->elements.size();
     d->elements += other.d_func()->elements;
 
-    d->elements[first].type = LineToElement;
+    if (first != 0)
+        d->elements[first].type = LineToElement;
 
     // avoid duplicate points
     if (first > 0 && QPointF(d->elements[first]) == QPointF(d->elements[first - 1])) {
diff --git a/tests/auto/qpainterpath/tst_qpainterpath.cpp b/tests/auto/qpainterpath/tst_qpainterpath.cpp
index d0cddda..66e6d10 100644
--- a/tests/auto/qpainterpath/tst_qpainterpath.cpp
+++ b/tests/auto/qpainterpath/tst_qpainterpath.cpp
@@ -107,6 +107,7 @@ private slots:
     void operators();
 
     void connectPathDuplicatePoint();
+    void connectPathMoveTo();
 
     void translate();
 };
@@ -1169,6 +1170,31 @@ void tst_QPainterPath::connectPathDuplicatePoint()
     QCOMPARE(c, a);
 }
 
+void tst_QPainterPath::connectPathMoveTo()
+{
+    QPainterPath path1;
+    QPainterPath path2;
+    QPainterPath path3;
+    QPainterPath path4;
+
+    path1.moveTo(1,1);
+
+    path2.moveTo(4,4);
+    path2.lineTo(5,6);
+    path2.lineTo(6,7);
+
+    path3.connectPath(path2);
+
+    path4.lineTo(5,5);
+
+    path1.connectPath(path2);
+
+    QVERIFY(path1.elementAt(0).type == QPainterPath::MoveToElement);
+    QVERIFY(path2.elementAt(0).type == QPainterPath::MoveToElement);
+    QVERIFY(path3.elementAt(0).type == QPainterPath::MoveToElement);
+    QVERIFY(path4.elementAt(0).type == QPainterPath::MoveToElement);
+}
+
 void tst_QPainterPath::translate()
 {
     QPainterPath path;
-- 
cgit v0.12


From 7fec0ddfae9e7c79d904c87e7726991a306f5ab3 Mon Sep 17 00:00:00 2001
From: Michael Dominic K <mdk@codethink.co.uk>
Date: Tue, 4 Jan 2011 09:29:06 +0100
Subject: QMeeGoSwitchEvent exported and static.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Merge-request: 1009
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
---
 tools/qmeegographicssystemhelper/qmeegoswitchevent.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tools/qmeegographicssystemhelper/qmeegoswitchevent.h b/tools/qmeegographicssystemhelper/qmeegoswitchevent.h
index 0ddbd3d..462182f 100644
--- a/tools/qmeegographicssystemhelper/qmeegoswitchevent.h
+++ b/tools/qmeegographicssystemhelper/qmeegoswitchevent.h
@@ -52,7 +52,7 @@
  when going to software mode.
 */
 
-class QMeeGoSwitchEvent : public QEvent
+class Q_DECL_EXPORT QMeeGoSwitchEvent : public QEvent
 {
 public:
 
@@ -83,7 +83,7 @@ public:
      The type is registered on first access. Use this to detect incoming
      QMeeGoSwitchEvents.
     */
-    QEvent::Type eventNumber();
+    static QEvent::Type eventNumber();
 
 private:
     QString name;
-- 
cgit v0.12


From 3ad35ffdbfcbd2db5e8aac95fa0cc9f80e372128 Mon Sep 17 00:00:00 2001
From: Michael Dominic K <mdk@codethink.co.uk>
Date: Tue, 4 Jan 2011 10:28:20 +0100
Subject: Pre-create the GL share widget before window surface creation.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Not pixmap creation.

Merge-request: 988
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
---
 src/plugins/graphicssystems/meego/qmeegographicssystem.cpp | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp b/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
index 4a86082..b1a8f5f7 100644
--- a/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
+++ b/src/plugins/graphicssystems/meego/qmeegographicssystem.cpp
@@ -75,6 +75,8 @@ QMeeGoGraphicsSystem::~QMeeGoGraphicsSystem()
 
 QWindowSurface* QMeeGoGraphicsSystem::createWindowSurface(QWidget *widget) const
 {
+    QGLShareContextScope ctx(qt_gl_share_widget()->context());
+
     QMeeGoGraphicsSystem::surfaceWasCreated = true;
     QWindowSurface *surface = new QGLWindowSurface(widget);
     return surface;
@@ -82,12 +84,6 @@ QWindowSurface* QMeeGoGraphicsSystem::createWindowSurface(QWidget *widget) const
 
 QPixmapData *QMeeGoGraphicsSystem::createPixmapData(QPixmapData::PixelType type) const
 {
-    // Long story short: without this it's possible to hit an
-    // uninitialized paintDevice due to a Qt bug too complex to even
-    // explain here... not to mention fix without going crazy.
-    // MDK
-    QGLShareContextScope ctx(qt_gl_share_widget()->context());
-
     return new QRasterPixmapData(type);
 }
 
-- 
cgit v0.12


From b5acfc61f3989ab8b72f784431fc5ab168ffb975 Mon Sep 17 00:00:00 2001
From: Michael Dominic K <mdk@codethink.co.uk>
Date: Tue, 4 Jan 2011 10:53:57 +0100
Subject: Support for swap modes in QGLWindowSurface.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

AlwaysFull and AlwaysPartial implemented in ES only for now.
By default do automatic.

Merge-request: 993
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
---
 src/opengl/qwindowsurface_gl.cpp | 13 ++++++++++++-
 src/opengl/qwindowsurface_gl_p.h |  3 +++
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/src/opengl/qwindowsurface_gl.cpp b/src/opengl/qwindowsurface_gl.cpp
index 7dc7dc7..b8716ce 100644
--- a/src/opengl/qwindowsurface_gl.cpp
+++ b/src/opengl/qwindowsurface_gl.cpp
@@ -284,6 +284,7 @@ struct QGLWindowSurfacePrivate
 };
 
 QGLFormat QGLWindowSurface::surfaceFormat;
+QGLWindowSurface::SwapMode QGLWindowSurface::swapBehavior = QGLWindowSurface::AutomaticSwap;
 
 void QGLWindowSurfaceGLPaintDevice::endPaint()
 {
@@ -541,6 +542,9 @@ void QGLWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoint &
     const GLenum target = GL_TEXTURE_2D;
     Q_UNUSED(target);
 
+    if (QGLWindowSurface::swapBehavior == QGLWindowSurface::KillSwap)
+        return;
+
     if (context()) {
         context()->makeCurrent();
 
@@ -588,7 +592,14 @@ void QGLWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoint &
                 }
             }
 #endif
-            bool doingPartialUpdate = hasPartialUpdateSupport() && br.width() * br.height() < parent->geometry().width() * parent->geometry().height() * 0.2;
+            bool doingPartialUpdate = false;
+            if (QGLWindowSurface::swapBehavior == QGLWindowSurface::AutomaticSwap)
+                doingPartialUpdate = hasPartialUpdateSupport() && br.width() * br.height() < parent->geometry().width() * parent->geometry().height() * 0.2;
+            else if (QGLWindowSurface::swapBehavior == QGLWindowSurface::AlwaysFullSwap)
+                doingPartialUpdate = false;
+            else if (QGLWindowSurface::swapBehavior == QGLWindowSurface::AlwaysPartialSwap)
+                doingPartialUpdate = hasPartialUpdateSupport();
+
             QGLContext *ctx = reinterpret_cast<QGLContext *>(parent->d_func()->extraData()->glContext);
             if (widget != window()) {
                 if (initializeOffscreenTexture(window()->size()))
diff --git a/src/opengl/qwindowsurface_gl_p.h b/src/opengl/qwindowsurface_gl_p.h
index 6906f35..9b0bee3 100644
--- a/src/opengl/qwindowsurface_gl_p.h
+++ b/src/opengl/qwindowsurface_gl_p.h
@@ -102,6 +102,9 @@ public:
 
     static QGLFormat surfaceFormat;
 
+    enum SwapMode { AutomaticSwap, AlwaysFullSwap, AlwaysPartialSwap, KillSwap };
+    static SwapMode swapBehavior;
+
 private slots:
     void deleted(QObject *object);
 
-- 
cgit v0.12


From 177f2a2f17251c22f57944e9dd100ec8515b891a Mon Sep 17 00:00:00 2001
From: Michael Dominic K <mdk@codethink.co.uk>
Date: Tue, 4 Jan 2011 10:53:58 +0100
Subject: QMeeGoGraphicsSystemHelper::setSwapBehavior implementation.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Merge-request: 993
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
---
 .../qmeegographicssystemhelper.cpp                     | 15 +++++++++++++++
 .../qmeegographicssystemhelper.h                       | 18 ++++++++++++++++++
 .../qmeegographicssystemhelper.pro                     |  2 +-
 3 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/tools/qmeegographicssystemhelper/qmeegographicssystemhelper.cpp b/tools/qmeegographicssystemhelper/qmeegographicssystemhelper.cpp
index b660eb3..37cc417 100644
--- a/tools/qmeegographicssystemhelper/qmeegographicssystemhelper.cpp
+++ b/tools/qmeegographicssystemhelper/qmeegographicssystemhelper.cpp
@@ -45,6 +45,7 @@
 #include <private/qapplication_p.h>
 #include <private/qgraphicssystem_runtime_p.h>
 #include <private/qpixmap_raster_p.h>
+#include <private/qwindowsurface_gl_p.h>
 #include "qmeegoruntime.h"
 #include "qmeegoswitchevent.h"
 
@@ -153,3 +154,17 @@ void QMeeGoGraphicsSystemHelper::setTranslucent(bool translucent)
     ENSURE_RUNNING_MEEGO;
     QMeeGoRuntime::setTranslucent(translucent);
 }
+
+void QMeeGoGraphicsSystemHelper::setSwapBehavior(SwapMode mode)
+{
+    ENSURE_RUNNING_MEEGO;
+
+    if (mode == AutomaticSwap)
+        QGLWindowSurface::swapBehavior = QGLWindowSurface::AutomaticSwap;
+    else if (mode == AlwaysFullSwap)
+        QGLWindowSurface::swapBehavior = QGLWindowSurface::AlwaysFullSwap;
+    else if (mode == AlwaysPartialSwap)
+        QGLWindowSurface::swapBehavior = QGLWindowSurface::AlwaysPartialSwap;
+    else if (mode == KillSwap)
+        QGLWindowSurface::swapBehavior = QGLWindowSurface::KillSwap;
+}
diff --git a/tools/qmeegographicssystemhelper/qmeegographicssystemhelper.h b/tools/qmeegographicssystemhelper/qmeegographicssystemhelper.h
index 6df3c22..c8dccc2 100644
--- a/tools/qmeegographicssystemhelper/qmeegographicssystemhelper.h
+++ b/tools/qmeegographicssystemhelper/qmeegographicssystemhelper.h
@@ -186,6 +186,24 @@ public:
      on the top-level widget *before* you show it instead.
     */
     static void setTranslucent(bool translucent);
+
+    //! Used to specify the mode for swapping buffers in double-buffered GL rendering.
+    enum SwapMode {
+        AutomaticSwap,      /**< Automatically choose netween full and partial updates (25% threshold) */
+        AlwaysFullSwap,     /**< Always do a full swap even if partial updates support present */
+        AlwaysPartialSwap,  /**< Always do a partial swap (if support present) no matter what threshold */
+        KillSwap            /**< Do not perform buffer swapping at all (no picture) */
+    };
+
+    //! Sets the buffer swapping mode.
+    /*!
+     This can be only called when running with the meego graphics system.
+     The KillSwap mode can be specififed to effectively block painting.
+
+     This functionality should be used only by applications counting on a specific behavior.
+     Most applications should use the default automatic behavior.
+    */
+    static void setSwapBehavior(SwapMode mode);
 };
 
 #endif
diff --git a/tools/qmeegographicssystemhelper/qmeegographicssystemhelper.pro b/tools/qmeegographicssystemhelper/qmeegographicssystemhelper.pro
index 360847e..7639ad7 100644
--- a/tools/qmeegographicssystemhelper/qmeegographicssystemhelper.pro
+++ b/tools/qmeegographicssystemhelper/qmeegographicssystemhelper.pro
@@ -3,7 +3,7 @@ TARGET = QtMeeGoGraphicsSystemHelper
 
 include(../../src/qbase.pri)
 
-QT += gui
+QT += gui opengl
 INCLUDEPATH += '../../src/plugins/graphicssystems/meego'
 
 HEADERS = qmeegographicssystemhelper.h qmeegooverlaywidget.h qmeegolivepixmap.h qmeegoruntime.h qmeegolivepixmap_p.h qmeegofencesync.h qmeegofencesync_p.h qmeegoswitchevent.h
-- 
cgit v0.12


From 254281dae38b932998eb8014a55177948842b78d Mon Sep 17 00:00:00 2001
From: Joshua Grauman <jnfo@grauman.com>
Date: Tue, 4 Jan 2011 11:03:32 +0100
Subject: Add line spacing to QTextBlockFormat, get/set functions, CSS support

The patch adds line spacing options to Qt, as in all modern word
processors. I primarily checked OpenOffice as a reference for how to
position the lines based on the various types of line spacing as well
as where to do the page breaks. The following functions were added:

void QTextBlockFormat::setLineHeight(qreal height, int heightType)
qreal QTextBlockFormat::lineHeight()
int QTextBlockFormat::lineHeightType()
qreal QTextBlockFormat::lineHeight(qreal scriptLineHeight, qreal scaling)

Here are the HeightTypes available:
QTextBlockFormat::SingleHeight
QTextBlockFormat::ProportionalHeight
QTextBlockFormat::FixedHeight
QTextBlockFormat::AtLeastHeight
QTextBlockFormat::LineDistanceHeight

The following CSS syntax was added:
line-height:150%
line-height:40px
line-height:normal
line-height:40al
line-height:40ld

Merge-request: 2305
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>
---
 src/gui/text/qcssparser.cpp          |  1 +
 src/gui/text/qcssparser_p.h          |  1 +
 src/gui/text/qtextdocumentlayout.cpp | 38 ++++++++++++++++----
 src/gui/text/qtextformat.cpp         | 67 ++++++++++++++++++++++++++++++++++++
 src/gui/text/qtextformat.h           | 35 +++++++++++++++++++
 src/gui/text/qtexthtmlparser.cpp     | 18 ++++++++++
 6 files changed, 154 insertions(+), 6 deletions(-)

diff --git a/src/gui/text/qcssparser.cpp b/src/gui/text/qcssparser.cpp
index dafc8e7..edb08ae 100644
--- a/src/gui/text/qcssparser.cpp
+++ b/src/gui/text/qcssparser.cpp
@@ -122,6 +122,7 @@ static const QCssKnownValue properties[NumProperties - 1] = {
     { "image", QtImage },
     { "image-position", QtImageAlignment },
     { "left", Left },
+    { "line-height", LineHeight },
     { "list-style", ListStyle },
     { "list-style-type", ListStyleType },
     { "margin" , Margin },
diff --git a/src/gui/text/qcssparser_p.h b/src/gui/text/qcssparser_p.h
index ca9688e..6bcbdab 100644
--- a/src/gui/text/qcssparser_p.h
+++ b/src/gui/text/qcssparser_p.h
@@ -180,6 +180,7 @@ enum Property {
     TextTransform,
     QtListNumberPrefix,
     QtListNumberSuffix,
+    LineHeight,
     NumProperties
 };
 
diff --git a/src/gui/text/qtextdocumentlayout.cpp b/src/gui/text/qtextdocumentlayout.cpp
index ff14490..5334ae8 100644
--- a/src/gui/text/qtextdocumentlayout.cpp
+++ b/src/gui/text/qtextdocumentlayout.cpp
@@ -2506,6 +2506,23 @@ void QTextDocumentLayoutPrivate::layoutFlow(QTextFrame::Iterator it, QTextLayout
     fd->currentLayoutStruct = 0;
 }
 
+static inline void getLineHeightParams(const QTextBlockFormat &blockFormat, const QTextLine &line, qreal scaling,
+                                       QFixed *lineAdjustment, QFixed *lineBreakHeight, QFixed *lineHeight)
+{
+    *lineHeight = QFixed::fromReal(blockFormat.lineHeight(line.height(), scaling));
+    if (blockFormat.lineHeightType() == QTextBlockFormat::FixedHeight || blockFormat.lineHeightType() == QTextBlockFormat::AtLeastHeight) {
+        *lineBreakHeight = *lineHeight;
+        if (blockFormat.lineHeightType() == QTextBlockFormat::FixedHeight)
+            *lineAdjustment = QFixed::fromReal(line.ascent() + qMax(line.leading(), 0.0)) - ((*lineHeight * 4) / 5);
+        else
+            *lineAdjustment = QFixed::fromReal(line.height()) - *lineHeight;
+    }
+    else {
+        *lineBreakHeight = QFixed::fromReal(line.height());
+        *lineAdjustment = 0;
+    }
+}
+
 void QTextDocumentLayoutPrivate::layoutBlock(const QTextBlock &bl, int blockPosition, const QTextBlockFormat &blockFormat,
                                              QTextLayoutStruct *layoutStruct, int layoutFrom, int layoutTo, const QTextBlockFormat *previousBlockFormat)
 {
@@ -2639,8 +2656,12 @@ void QTextDocumentLayoutPrivate::layoutBlock(const QTextBlock &bl, int blockPosi
 
             }
 
-            QFixed lineHeight = QFixed::fromReal(line.height());
-            if (layoutStruct->pageHeight > 0 && layoutStruct->absoluteY() + lineHeight > layoutStruct->pageBottom) {
+            QFixed lineBreakHeight, lineHeight, lineAdjustment;
+            qreal scaling = (q->paintDevice() && q->paintDevice()->logicalDpiY() != qt_defaultDpi()) ?
+                            qreal(q->paintDevice()->logicalDpiY()) / qreal(qt_defaultDpi()) : 1;
+            getLineHeightParams(blockFormat, line, scaling, &lineAdjustment, &lineBreakHeight, &lineHeight);
+
+            if (layoutStruct->pageHeight > 0 && layoutStruct->absoluteY() + lineBreakHeight > layoutStruct->pageBottom) {
                 layoutStruct->newPage();
 
                 floatMargins(layoutStruct->y, layoutStruct, &left, &right);
@@ -2652,7 +2673,7 @@ void QTextDocumentLayoutPrivate::layoutBlock(const QTextBlock &bl, int blockPosi
                     right -= text_indent;
             }
 
-            line.setPosition(QPointF((left - layoutStruct->x_left).toReal(), (layoutStruct->y - cy).toReal()));
+            line.setPosition(QPointF((left - layoutStruct->x_left).toReal(), (layoutStruct->y - cy - lineAdjustment).toReal()));
             layoutStruct->y += lineHeight;
             layoutStruct->contentsWidth
                 = qMax<QFixed>(layoutStruct->contentsWidth, QFixed::fromReal(line.x() + line.naturalTextWidth()) + totalRightMargin);
@@ -2672,11 +2693,16 @@ void QTextDocumentLayoutPrivate::layoutBlock(const QTextBlock &bl, int blockPosi
             QTextLine line = tl->lineAt(i);
             layoutStruct->contentsWidth
                 = qMax(layoutStruct->contentsWidth, QFixed::fromReal(line.x() + tl->lineAt(i).naturalTextWidth()) + totalRightMargin);
-            const QFixed lineHeight = QFixed::fromReal(line.height());
+
+            QFixed lineBreakHeight, lineHeight, lineAdjustment;
+            qreal scaling = (q->paintDevice() && q->paintDevice()->logicalDpiY() != qt_defaultDpi()) ?
+                            qreal(q->paintDevice()->logicalDpiY()) / qreal(qt_defaultDpi()) : 1;
+            getLineHeightParams(blockFormat, line, scaling, &lineAdjustment, &lineBreakHeight, &lineHeight);
+
             if (layoutStruct->pageHeight != QFIXED_MAX) {
-                if (layoutStruct->absoluteY() + lineHeight > layoutStruct->pageBottom)
+                if (layoutStruct->absoluteY() + lineBreakHeight > layoutStruct->pageBottom)
                     layoutStruct->newPage();
-                line.setPosition(QPointF(line.position().x(), layoutStruct->y.toReal() - tl->position().y()));
+                line.setPosition(QPointF(line.position().x(), (layoutStruct->y - lineAdjustment).toReal() - tl->position().y()));
             }
             layoutStruct->y += lineHeight;
         }
diff --git a/src/gui/text/qtextformat.cpp b/src/gui/text/qtextformat.cpp
index 945b012..719db7a 100644
--- a/src/gui/text/qtextformat.cpp
+++ b/src/gui/text/qtextformat.cpp
@@ -541,6 +541,8 @@ Q_GUI_EXPORT QDataStream &operator>>(QDataStream &stream, QTextFormat &fmt)
     \value TabPositions     Specifies the tab positions.  The tab positions are structs of QTextOption::Tab which are stored in
                             a QList (internally, in a QList<QVariant>).
     \value BlockIndent
+    \value LineHeight
+    \value LineHeightType
     \value BlockNonBreakableLines
     \value BlockTrailingHorizontalRulerWidth The width of a horizontal ruler element.
 
@@ -1856,6 +1858,10 @@ QFont QTextCharFormat::font() const
     indentation is set with setIndent(), the indentation of the first
     line with setTextIndent().
 
+    Line spacing is set with setLineHeight() and retreived via lineHeight()
+    and lineHeightType(). The types of line spacing available are in the
+    LineHeightTypes enum.
+
     Line breaking can be enabled and disabled with setNonBreakableLines().
 
     The brush used to paint the paragraph's background
@@ -1872,6 +1878,22 @@ QFont QTextCharFormat::font() const
 */
 
 /*!
+    \since 4.7
+    \enum QTextBlockFormat::LineHeightTypes
+
+    This enum describes the various types of line spacing support paragraphs can have.
+
+    \value SingleHeight This is the default line height: single spacing.
+    \value ProportionalHeight This sets the spacing proportional to the line (in percentage).
+                              For example, set to 200 for double spacing.
+    \value FixedHeight This sets the line height to a fixed line height (in pixels).
+    \value AtLeastHeight This sets the minimum line height (in pixels).
+    \value LineDistanceHeight This adds the specified height between lines (in pixels).
+
+    \sa lineHeight(), lineHeightType(), setLineHeight()
+*/
+
+/*!
     \fn QTextBlockFormat::QTextBlockFormat()
 
     Constructs a new QTextBlockFormat.
@@ -2089,6 +2111,51 @@ QList<QTextOption::Tab> QTextBlockFormat::tabPositions() const
 
 
 /*!
+    \fn void QTextBlockFormat::setLineHeight(qreal height, int heightType)
+    \since 4.7
+
+    This sets the line height for the paragraph to the value in height
+    which is dependant on heightType, described by the LineHeightTypes enum.
+
+    \sa LineHeightTypes, lineHeight(), lineHeightType()
+*/
+
+
+/*!
+    \fn qreal QTextBlockFormat::lineHeight(qreal scriptLineHeight, qreal scaling) const
+    \since 4.7
+
+    This returns what the height of the lines in the paragraph will be depending
+    on the given height of the script line and the scaling. The value that is returned
+    is also dependant on the given LineHeightType of the paragraph as well as the LineHeight
+    setting that has been set for the paragraph. The scaling is needed for the heights
+    that include a fixed number of pixels, to scale them appropriately for printing.
+
+    \sa LineHeightTypes, setLineHeight(), lineHeightType()
+*/
+
+
+/*!
+    \fn qreal QTextBlockFormat::lineHeight() const
+    \since 4.7
+
+    This returns the LineHeight property for the paragraph.
+
+    \sa LineHeightTypes, setLineHeight(), lineHeightType()
+*/
+
+
+/*!
+    \fn qreal QTextBlockFormat::lineHeightType() const
+    \since 4.7
+
+    This returns the LineHeightType property of the paragraph.
+
+    \sa LineHeightTypes, setLineHeight(), lineHeight()
+*/
+
+
+/*!
     \fn void QTextBlockFormat::setNonBreakableLines(bool b)
 
     If \a b is true, the lines in the paragraph are treated as
diff --git a/src/gui/text/qtextformat.h b/src/gui/text/qtextformat.h
index bb6e71d..41cc1d9 100644
--- a/src/gui/text/qtextformat.h
+++ b/src/gui/text/qtextformat.h
@@ -164,6 +164,8 @@ public:
         TextIndent = 0x1034,
         TabPositions = 0x1035,
         BlockIndent = 0x1040,
+        LineHeight = 0x1048,
+        LineHeightType = 0x1049,
         BlockNonBreakableLines = 0x1050,
         BlockTrailingHorizontalRulerWidth = 0x1060,
 
@@ -531,6 +533,14 @@ inline void QTextCharFormat::setTableCellColumnSpan(int _tableCellColumnSpan)
 class Q_GUI_EXPORT QTextBlockFormat : public QTextFormat
 {
 public:
+    enum LineHeightTypes {
+        SingleHeight = 0,
+        ProportionalHeight = 1,
+        FixedHeight = 2,
+        AtLeastHeight = 3,
+        LineDistanceHeight = 4
+    };
+
     QTextBlockFormat();
 
     bool isValid() const { return isBlockFormat(); }
@@ -568,6 +578,14 @@ public:
     inline int indent() const
     { return intProperty(BlockIndent); }
 
+    inline void setLineHeight(qreal height, int heightType)
+    { setProperty(LineHeight, height); setProperty(LineHeightType, heightType); }
+    inline qreal lineHeight(qreal scriptLineHeight, qreal scaling) const;
+    inline qreal lineHeight() const
+    { return doubleProperty(LineHeight); }
+    inline int lineHeightType() const
+    { return intProperty(LineHeightType); }
+
     inline void setNonBreakableLines(bool b)
     { setProperty(BlockNonBreakableLines, b); }
     inline bool nonBreakableLines() const
@@ -592,6 +610,23 @@ inline void QTextBlockFormat::setAlignment(Qt::Alignment aalignment)
 inline void QTextBlockFormat::setIndent(int aindent)
 { setProperty(BlockIndent, aindent); }
 
+inline qreal QTextBlockFormat::lineHeight(qreal scriptLineHeight, qreal scaling = 1.0) const
+{
+  switch(intProperty(LineHeightType)) {
+    case SingleHeight:
+      return(scriptLineHeight);
+    case ProportionalHeight:
+      return(scriptLineHeight * doubleProperty(LineHeight) / 100.0);
+    case FixedHeight:
+      return(doubleProperty(LineHeight) * scaling);
+    case AtLeastHeight:
+      return(qMax(scriptLineHeight, doubleProperty(LineHeight) * scaling));
+    case LineDistanceHeight:
+      return(scriptLineHeight + doubleProperty(LineHeight) * scaling);
+  }
+  return(0);
+}
+
 class Q_GUI_EXPORT QTextListFormat : public QTextFormat
 {
 public:
diff --git a/src/gui/text/qtexthtmlparser.cpp b/src/gui/text/qtexthtmlparser.cpp
index 5b9ab90..769a509 100644
--- a/src/gui/text/qtexthtmlparser.cpp
+++ b/src/gui/text/qtexthtmlparser.cpp
@@ -1250,6 +1250,24 @@ void QTextHtmlParserNode::applyCssDeclarations(const QVector<QCss::Declaration>
         case QCss::QtBlockIndent:
             blockFormat.setIndent(decl.d->values.first().variant.toInt());
             break;
+       case QCss::LineHeight: {
+            qreal lineHeight;
+            if (decl.realValue(&lineHeight, "px"))
+                blockFormat.setLineHeight(lineHeight, QTextBlockFormat::FixedHeight);
+            else if (decl.realValue(&lineHeight, "al"))
+                blockFormat.setLineHeight(lineHeight, QTextBlockFormat::AtLeastHeight);
+            else if (decl.realValue(&lineHeight, "ld"))
+                blockFormat.setLineHeight(lineHeight, QTextBlockFormat::LineDistanceHeight);
+            else {
+                bool ok;
+                QString value = decl.d->values.first().toString();
+                lineHeight = value.toDouble(&ok);
+                if (ok)
+                    blockFormat.setLineHeight(lineHeight, QTextBlockFormat::ProportionalHeight);
+                else
+                    blockFormat.setLineHeight(0, QTextBlockFormat::SingleHeight);
+            }
+            break; }
         case QCss::TextIndent: {
             qreal indent = 0;
             if (decl.realValue(&indent, "px"))
-- 
cgit v0.12


From 09b06552f98f8ee8be4d156049a6a37a4abed6bd Mon Sep 17 00:00:00 2001
From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>
Date: Tue, 4 Jan 2011 11:09:38 +0100
Subject: Rename QTextBlockFormat::AtLeastHeight -> MinimumHeight

Make some alterations to merge request 2305:
1. Rename enum for consistency with other APIs in Qt.
2. Correct documentation with actual version number of features.
3. Remove unstandard css syntax in line-height specification.

Reviewed-by: Jiang Jiang
---
 src/gui/text/qtextdocumentlayout.cpp |  2 +-
 src/gui/text/qtextformat.cpp         | 12 ++++++------
 src/gui/text/qtextformat.h           |  4 ++--
 src/gui/text/qtexthtmlparser.cpp     |  8 ++------
 4 files changed, 11 insertions(+), 15 deletions(-)

diff --git a/src/gui/text/qtextdocumentlayout.cpp b/src/gui/text/qtextdocumentlayout.cpp
index 5334ae8..22c6b8c 100644
--- a/src/gui/text/qtextdocumentlayout.cpp
+++ b/src/gui/text/qtextdocumentlayout.cpp
@@ -2510,7 +2510,7 @@ static inline void getLineHeightParams(const QTextBlockFormat &blockFormat, cons
                                        QFixed *lineAdjustment, QFixed *lineBreakHeight, QFixed *lineHeight)
 {
     *lineHeight = QFixed::fromReal(blockFormat.lineHeight(line.height(), scaling));
-    if (blockFormat.lineHeightType() == QTextBlockFormat::FixedHeight || blockFormat.lineHeightType() == QTextBlockFormat::AtLeastHeight) {
+    if (blockFormat.lineHeightType() == QTextBlockFormat::FixedHeight || blockFormat.lineHeightType() == QTextBlockFormat::MinimumHeight) {
         *lineBreakHeight = *lineHeight;
         if (blockFormat.lineHeightType() == QTextBlockFormat::FixedHeight)
             *lineAdjustment = QFixed::fromReal(line.ascent() + qMax(line.leading(), 0.0)) - ((*lineHeight * 4) / 5);
diff --git a/src/gui/text/qtextformat.cpp b/src/gui/text/qtextformat.cpp
index 719db7a..b05a830 100644
--- a/src/gui/text/qtextformat.cpp
+++ b/src/gui/text/qtextformat.cpp
@@ -1878,7 +1878,7 @@ QFont QTextCharFormat::font() const
 */
 
 /*!
-    \since 4.7
+    \since 4.8
     \enum QTextBlockFormat::LineHeightTypes
 
     This enum describes the various types of line spacing support paragraphs can have.
@@ -1887,7 +1887,7 @@ QFont QTextCharFormat::font() const
     \value ProportionalHeight This sets the spacing proportional to the line (in percentage).
                               For example, set to 200 for double spacing.
     \value FixedHeight This sets the line height to a fixed line height (in pixels).
-    \value AtLeastHeight This sets the minimum line height (in pixels).
+    \value MinimumHeight This sets the minimum line height (in pixels).
     \value LineDistanceHeight This adds the specified height between lines (in pixels).
 
     \sa lineHeight(), lineHeightType(), setLineHeight()
@@ -2112,7 +2112,7 @@ QList<QTextOption::Tab> QTextBlockFormat::tabPositions() const
 
 /*!
     \fn void QTextBlockFormat::setLineHeight(qreal height, int heightType)
-    \since 4.7
+    \since 4.8
 
     This sets the line height for the paragraph to the value in height
     which is dependant on heightType, described by the LineHeightTypes enum.
@@ -2123,7 +2123,7 @@ QList<QTextOption::Tab> QTextBlockFormat::tabPositions() const
 
 /*!
     \fn qreal QTextBlockFormat::lineHeight(qreal scriptLineHeight, qreal scaling) const
-    \since 4.7
+    \since 4.8
 
     This returns what the height of the lines in the paragraph will be depending
     on the given height of the script line and the scaling. The value that is returned
@@ -2137,7 +2137,7 @@ QList<QTextOption::Tab> QTextBlockFormat::tabPositions() const
 
 /*!
     \fn qreal QTextBlockFormat::lineHeight() const
-    \since 4.7
+    \since 4.8
 
     This returns the LineHeight property for the paragraph.
 
@@ -2147,7 +2147,7 @@ QList<QTextOption::Tab> QTextBlockFormat::tabPositions() const
 
 /*!
     \fn qreal QTextBlockFormat::lineHeightType() const
-    \since 4.7
+    \since 4.8
 
     This returns the LineHeightType property of the paragraph.
 
diff --git a/src/gui/text/qtextformat.h b/src/gui/text/qtextformat.h
index 41cc1d9..81b053b 100644
--- a/src/gui/text/qtextformat.h
+++ b/src/gui/text/qtextformat.h
@@ -537,7 +537,7 @@ public:
         SingleHeight = 0,
         ProportionalHeight = 1,
         FixedHeight = 2,
-        AtLeastHeight = 3,
+        MinimumHeight = 3,
         LineDistanceHeight = 4
     };
 
@@ -619,7 +619,7 @@ inline qreal QTextBlockFormat::lineHeight(qreal scriptLineHeight, qreal scaling
       return(scriptLineHeight * doubleProperty(LineHeight) / 100.0);
     case FixedHeight:
       return(doubleProperty(LineHeight) * scaling);
-    case AtLeastHeight:
+    case MinimumHeight:
       return(qMax(scriptLineHeight, doubleProperty(LineHeight) * scaling));
     case LineDistanceHeight:
       return(scriptLineHeight + doubleProperty(LineHeight) * scaling);
diff --git a/src/gui/text/qtexthtmlparser.cpp b/src/gui/text/qtexthtmlparser.cpp
index 769a509..5d5e2b6 100644
--- a/src/gui/text/qtexthtmlparser.cpp
+++ b/src/gui/text/qtexthtmlparser.cpp
@@ -1252,13 +1252,9 @@ void QTextHtmlParserNode::applyCssDeclarations(const QVector<QCss::Declaration>
             break;
        case QCss::LineHeight: {
             qreal lineHeight;
-            if (decl.realValue(&lineHeight, "px"))
+            if (decl.realValue(&lineHeight, "px")) {
                 blockFormat.setLineHeight(lineHeight, QTextBlockFormat::FixedHeight);
-            else if (decl.realValue(&lineHeight, "al"))
-                blockFormat.setLineHeight(lineHeight, QTextBlockFormat::AtLeastHeight);
-            else if (decl.realValue(&lineHeight, "ld"))
-                blockFormat.setLineHeight(lineHeight, QTextBlockFormat::LineDistanceHeight);
-            else {
+            } else {
                 bool ok;
                 QString value = decl.d->values.first().toString();
                 lineHeight = value.toDouble(&ok);
-- 
cgit v0.12


From 91e127444f1b217525263b26f44fb566b9067d75 Mon Sep 17 00:00:00 2001
From: Miikka Heikkinen <miikka.heikkinen@digia.com>
Date: Tue, 4 Jan 2011 16:20:55 +0200
Subject: Generate freeze targets in Symbian

Make it possible to freeze def files via makefile targets.

Task-number: QTBUG-13769
Reviewed-by: Janne Koskinen
---
 qmake/generators/symbian/symmake_abld.cpp  | 21 +++++++++++++++++++++
 qmake/generators/symbian/symmake_sbsv2.cpp | 29 +++++++++++++++++++++++++++++
 2 files changed, 50 insertions(+)

diff --git a/qmake/generators/symbian/symmake_abld.cpp b/qmake/generators/symbian/symmake_abld.cpp
index eb39d36..94cb22e 100644
--- a/qmake/generators/symbian/symmake_abld.cpp
+++ b/qmake/generators/symbian/symmake_abld.cpp
@@ -406,6 +406,27 @@ void SymbianAbldMakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, bool
         t << "\t$(ABLD)" << testClause << " reallyclean " << item << " urel" << endl;
     }
     t << endl;
+
+    t << "freeze: $(ABLD)" << endl;
+    t << "\t$(ABLD)" << testClause << " freeze" << endl;
+    t << endl;
+
+    // Abld toolchain doesn't differentiate between freezing release or debug
+    t << "freeze-debug: freeze" << endl << endl;
+    t << "freeze-release: freeze" << endl << endl;
+
+    // For more specific builds, targets are in this form: freeze-build-platform, e.g. freeze-release-armv5,
+    // though note that debug and release targets of each platform are identical in symbian-abld.
+    foreach(QString item, debugPlatforms) {
+        t << "freeze-debug-" << item << ": $(ABLD)" << endl;
+        t << "\t$(ABLD)" << testClause << " freeze " << item << endl;
+    }
+    foreach(QString item, releasePlatforms) {
+        t << "freeze-release-" << item << ": $(ABLD)" << endl;
+        t << "\t$(ABLD)" << testClause << " freeze " << item << endl;
+    }
+
+    t << endl;
 }
 
 void SymbianAbldMakefileGenerator::writeBldInfExtensionRulesPart(QTextStream& t, const QString &iconTargetFile)
diff --git a/qmake/generators/symbian/symmake_sbsv2.cpp b/qmake/generators/symbian/symmake_sbsv2.cpp
index c219f1d..c6dec6d 100644
--- a/qmake/generators/symbian/symmake_sbsv2.cpp
+++ b/qmake/generators/symbian/symmake_sbsv2.cpp
@@ -391,6 +391,14 @@ void SymbianSbsv2MakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, boo
             t << clause;
         }
         t << endl;
+
+        t << "freeze-debug: " << BLD_INF_FILENAME << endl;
+        t << "\t$(SBS) freeze";
+        foreach(QString clause, debugClauses) {
+            t << clause;
+        }
+        t << endl;
+
         t << "release: " << locFileDep << BLD_INF_FILENAME << endl;
         t << "\t$(SBS)";
         foreach(QString clause, releaseClauses) {
@@ -402,6 +410,13 @@ void SymbianSbsv2MakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, boo
         foreach(QString clause, releaseClauses) {
             t << clause;
         }
+        t << endl;
+
+        t << "freeze-release: " << BLD_INF_FILENAME << endl;
+        t << "\t$(SBS) freeze";
+        foreach(QString clause, releaseClauses) {
+            t << clause;
+        }
         t << endl << endl;
 
         QString defaultGcceArmVersion;
@@ -427,6 +442,8 @@ void SymbianSbsv2MakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, boo
             t << "\t$(SBS)" << clause << endl;
             t << "clean-debug-" << item << ": " << BLD_INF_FILENAME << endl;
             t << "\t$(SBS) reallyclean" << clause << endl;
+            t << "freeze-debug-" << item << ": " << BLD_INF_FILENAME << endl;
+            t << "\t$(SBS) freeze" << clause << endl;
         }
 
         foreach(QString item, releasePlatforms) {
@@ -440,6 +457,8 @@ void SymbianSbsv2MakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, boo
             t << "\t$(SBS)" << clause << endl;
             t << "clean-release-" << item << ": " << BLD_INF_FILENAME << endl;
             t << "\t$(SBS) reallyclean" << clause << endl;
+            t << "freeze-release-" << item << ": " << BLD_INF_FILENAME << endl;
+            t << "\t$(SBS) freeze" << clause << endl;
         }
 
         foreach(QString item, armPlatforms) {
@@ -450,10 +469,14 @@ void SymbianSbsv2MakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, boo
                 t << "\t$(SBS)" << debugClause << endl;
                 t << "clean-debug-" << item << "-" << compilerVersion << ": " << BLD_INF_FILENAME << endl;
                 t << "\t$(SBS) reallyclean" << debugClause << endl;
+                t << "freeze-debug-" << item << "-" << compilerVersion << ": " << BLD_INF_FILENAME << endl;
+                t << "\t$(SBS) freeze" << debugClause << endl;
                 t << "release-" << item << "-" << compilerVersion << ": " << locFileDep << BLD_INF_FILENAME << endl;
                 t << "\t$(SBS)" << releaseClause << endl;
                 t << "clean-release-" << item << "-" << compilerVersion << ": " << BLD_INF_FILENAME << endl;
                 t << "\t$(SBS) reallyclean" << releaseClause << endl;
+                t << "freeze-release-" << item << "-" << compilerVersion << ": " << BLD_INF_FILENAME << endl;
+                t << "\t$(SBS) freeze" << releaseClause << endl;
             }
         }
 
@@ -471,6 +494,12 @@ void SymbianSbsv2MakefileGenerator::writeWrapperMakefile(QFile& wrapperFile, boo
             t << clause;
         }
         t << endl << endl;
+
+        // Typically one wants to freeze release binaries, so make plain freeze target equal to
+        // freeze-release. If freezing of debug binaries is needed for some reason, then
+        // freeze-debug target should be used. There is no point to try freezing both with one
+        // target as both produce the same def file.
+        t << "freeze: freeze-release" << endl << endl;
     }
 
     // Add all extra targets including extra compiler targets also to wrapper makefile,
-- 
cgit v0.12


From c981098ea0353aead43c93ac81835451515b63d0 Mon Sep 17 00:00:00 2001
From: Miikka Heikkinen <miikka.heikkinen@digia.com>
Date: Tue, 4 Jan 2011 17:16:03 +0200
Subject: Fix def file names for libinfixed testlib

Reviewed-by: Janne Koskinen
---
 mkspecs/features/symbian/def_files.prf | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mkspecs/features/symbian/def_files.prf b/mkspecs/features/symbian/def_files.prf
index f243878..4a59116 100644
--- a/mkspecs/features/symbian/def_files.prf
+++ b/mkspecs/features/symbian/def_files.prf
@@ -4,7 +4,7 @@
 CONFIG -= def_files_disabled
 
 # We need a target name without the INFIX'ed part, since DEF files are not infixed.
-equals(QMAKE_TARGET_PRODUCT, Qt4):clean_TARGET = $$replace(TARGET, "$${QT_LIBINFIX}$", "")
+equals(QMAKE_TARGET_PRODUCT, Qt4)|equals(QMAKE_TARGET_PRODUCT, QTestLib):clean_TARGET = $$replace(TARGET, "$${QT_LIBINFIX}$", "")
 else:clean_TARGET = $$TARGET
 
 symbian-abld|symbian-sbsv2 {
-- 
cgit v0.12


From 572598884de78c5026694843473122487269a244 Mon Sep 17 00:00:00 2001
From: Alan Alpert <alan.alpert@nokia.com>
Date: Wed, 5 Jan 2011 15:41:56 +1000
Subject: Fix outdated tests

selftest_noimages and qdeclarativespringanimation were correct, updating
test scripts to match.

Task-number: QTBUG-14792
---
 .../data-X11/follow.0.png                          |  Bin 0 -> 950 bytes
 .../data-X11/follow.1.png                          |  Bin 0 -> 983 bytes
 .../data-X11/follow.2.png                          |  Bin 0 -> 1243 bytes
 .../data-X11/follow.3.png                          |  Bin 0 -> 1235 bytes
 .../data-X11/follow.4.png                          |  Bin 0 -> 1253 bytes
 .../data-X11/follow.5.png                          |  Bin 0 -> 1249 bytes
 .../data-X11/follow.6.png                          |  Bin 0 -> 1241 bytes
 .../data-X11/follow.7.png                          |  Bin 0 -> 1251 bytes
 .../data-X11/follow.qml                            | 1763 ++++++++++++++++++++
 .../selftest_noimages/data/selftest_noimages.qml   |  146 +-
 10 files changed, 1779 insertions(+), 130 deletions(-)
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.0.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.1.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.2.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.3.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.4.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.5.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.6.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.7.png
 create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.qml

diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.0.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.0.png
new file mode 100644
index 0000000..6525dbb
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.0.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.1.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.1.png
new file mode 100644
index 0000000..5b8d209
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.1.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.2.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.2.png
new file mode 100644
index 0000000..cf012ba
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.2.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.3.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.3.png
new file mode 100644
index 0000000..57e77a4
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.3.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.4.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.4.png
new file mode 100644
index 0000000..24d26bd
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.4.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.5.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.5.png
new file mode 100644
index 0000000..a540734
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.5.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.6.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.6.png
new file mode 100644
index 0000000..17da643
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.6.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.7.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.7.png
new file mode 100644
index 0000000..e03cfe4
Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.7.png differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.qml b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.qml
new file mode 100644
index 0000000..98cd12c
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.qml
@@ -0,0 +1,1763 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+    Frame {
+        msec: 0
+    }
+    Frame {
+        msec: 16
+        image: "follow.0.png"
+    }
+    Frame {
+        msec: 32
+        hash: "2ddcb50f5d285eb80a8136f0cf4cf85a"
+    }
+    Frame {
+        msec: 48
+        hash: "519d93a844e05f8215139d91c9aef58b"
+    }
+    Frame {
+        msec: 64
+        hash: "9f075a5547e4dc67cbe2ace2766395bb"
+    }
+    Frame {
+        msec: 80
+        hash: "8fc48f74a51d45b4ea1fb7bd1d48002f"
+    }
+    Frame {
+        msec: 96
+        hash: "a28fc4be5a5bb9ff36f796d9b071f02c"
+    }
+    Frame {
+        msec: 112
+        hash: "ebc14c2905f3596ec451dd96409e6001"
+    }
+    Frame {
+        msec: 128
+        hash: "4f270bdcff44006a56055edb1cda522a"
+    }
+    Frame {
+        msec: 144
+        hash: "571f347e764bf38985768c85c2a13ba1"
+    }
+    Frame {
+        msec: 160
+        hash: "b1aa23268167b7e2a1190288926f52c0"
+    }
+    Frame {
+        msec: 176
+        hash: "06d548aef9a678edbf3ab4d3ce62a647"
+    }
+    Frame {
+        msec: 192
+        hash: "daf6af0ae78f39566913c656450a66e5"
+    }
+    Frame {
+        msec: 208
+        hash: "f101cd0c026ee0ed6ccef7a4aed302a0"
+    }
+    Frame {
+        msec: 224
+        hash: "b3caa673f072c53d31d71109c9b33357"
+    }
+    Frame {
+        msec: 240
+        hash: "8596f1d305d6b8f97b9feda9e69bdefe"
+    }
+    Frame {
+        msec: 256
+        hash: "23c23df2c130aafb2092fe47a958a4cd"
+    }
+    Frame {
+        msec: 272
+        hash: "66a4f2d8213264437a5f4d6cf10cd442"
+    }
+    Frame {
+        msec: 288
+        hash: "6392490111813bad0a9467cc0c1746ed"
+    }
+    Frame {
+        msec: 304
+        hash: "c115a47e0ecab63b881e2ec492d24e68"
+    }
+    Frame {
+        msec: 320
+        hash: "c2a2b57e6f9ea2975c0846124d2dbc66"
+    }
+    Frame {
+        msec: 336
+        hash: "8286c315dfda4241607b2de1154f869d"
+    }
+    Frame {
+        msec: 352
+        hash: "3f0f7cae80357176892ff7628ec3153a"
+    }
+    Frame {
+        msec: 368
+        hash: "d13bde4a5b5ed8202f92ae33913166c9"
+    }
+    Frame {
+        msec: 384
+        hash: "b70cc32134b1b0d31a5e7f145af09495"
+    }
+    Frame {
+        msec: 400
+        hash: "03ebc2ff317ac840f4508e8701d66955"
+    }
+    Frame {
+        msec: 416
+        hash: "8dff08e72365e8e2fee8088c386dedca"
+    }
+    Frame {
+        msec: 432
+        hash: "720f3bbaf3fa3e3a064747d5689e47a0"
+    }
+    Frame {
+        msec: 448
+        hash: "350e3ebfcfef96969ef5b8d5944f7e62"
+    }
+    Frame {
+        msec: 464
+        hash: "1e4e6e68b3a8eac0c5cd039164eec166"
+    }
+    Frame {
+        msec: 480
+        hash: "62a10c4250ad025139a3f9e72109e8e1"
+    }
+    Frame {
+        msec: 496
+        hash: "23cfd643adfc98f6a06c7e7b15dac954"
+    }
+    Frame {
+        msec: 512
+        hash: "3a78930d5b86b886723fad85e77dd075"
+    }
+    Frame {
+        msec: 528
+        hash: "64dc878e2f527e80403c766e61fe14a6"
+    }
+    Frame {
+        msec: 544
+        hash: "d79160989d2584044042271e79a88e69"
+    }
+    Frame {
+        msec: 560
+        hash: "22cbaea4affc88433834c7d0dc1f1644"
+    }
+    Frame {
+        msec: 576
+        hash: "77cb616902257e1f239a0e6bfaabb33c"
+    }
+    Frame {
+        msec: 592
+        hash: "a2fe73dced03b23c4acb9aae9b774b41"
+    }
+    Frame {
+        msec: 608
+        hash: "230e21d3a9ed0e185593677233af1275"
+    }
+    Frame {
+        msec: 624
+        hash: "4e10ecffac4e06d624855d3f8917f76c"
+    }
+    Frame {
+        msec: 640
+        hash: "84f49d56baace4a02e50d3eafaea04ec"
+    }
+    Frame {
+        msec: 656
+        hash: "e3cd0b334551a9f91723eb2c876d335a"
+    }
+    Frame {
+        msec: 672
+        hash: "259330f3ec390c9926d9c2ddc2d77319"
+    }
+    Frame {
+        msec: 688
+        hash: "cc659623bfa385d282d608684d7cdc2b"
+    }
+    Frame {
+        msec: 704
+        hash: "47ed75d077143a6bfa0e10158550c542"
+    }
+    Frame {
+        msec: 720
+        hash: "0de93bbd9f9ee63e97968089321003e1"
+    }
+    Frame {
+        msec: 736
+        hash: "b33d867d4399879256a01344ce0b81f2"
+    }
+    Frame {
+        msec: 752
+        hash: "97c31fce937d11f62bebc6169b464a42"
+    }
+    Frame {
+        msec: 768
+        hash: "ea4166b8a4001bca3f27af30f251267f"
+    }
+    Frame {
+        msec: 784
+        hash: "b56d270b7893565f8d7ed2a0bfe10d60"
+    }
+    Frame {
+        msec: 800
+        hash: "88a42559fe22b45cff379258dd40ced9"
+    }
+    Frame {
+        msec: 816
+        hash: "4ee1a711cb8d26087e1b75a3166ca5f0"
+    }
+    Frame {
+        msec: 832
+        hash: "9b88a00d041092e79b4a08bccbaca0e1"
+    }
+    Frame {
+        msec: 848
+        hash: "afea397b3d740dc42f0313624fc10efd"
+    }
+    Frame {
+        msec: 864
+        hash: "39fd8e4cefbd9fed283d62a7aecded22"
+    }
+    Frame {
+        msec: 880
+        hash: "916b783d2379ac054c749e7b6eae7ddf"
+    }
+    Frame {
+        msec: 896
+        hash: "fccd44740ff7ffb0f2adccf00a7588bd"
+    }
+    Frame {
+        msec: 912
+        hash: "c064f20703a13543e8273d251fd645fe"
+    }
+    Frame {
+        msec: 928
+        hash: "1b9b0755101841e3d1cbe208d81575d5"
+    }
+    Frame {
+        msec: 944
+        hash: "1eb5e4a301b565012bc8f6af8e879eb9"
+    }
+    Frame {
+        msec: 960
+        hash: "032db65eb5c405e433f88df3975c322b"
+    }
+    Frame {
+        msec: 976
+        image: "follow.1.png"
+    }
+    Frame {
+        msec: 992
+        hash: "fdb67e11d7cc767b2389a8bbef752c7e"
+    }
+    Frame {
+        msec: 1008
+        hash: "ed89cb161336c61b13e3514fdf816023"
+    }
+    Frame {
+        msec: 1024
+        hash: "331b873c5367e0aaa62af85cb54a6a96"
+    }
+    Frame {
+        msec: 1040
+        hash: "cde4503f02f0c3732e310a7d0418cd1e"
+    }
+    Frame {
+        msec: 1056
+        hash: "f8c028c591fc1495d5bec8763da6f011"
+    }
+    Frame {
+        msec: 1072
+        hash: "9dc68483218335afe41aa3cd052a98b5"
+    }
+    Frame {
+        msec: 1088
+        hash: "31105c455418a3284700cf9c88571507"
+    }
+    Frame {
+        msec: 1104
+        hash: "72724947167a1ac600aaa1d7f331f7ec"
+    }
+    Frame {
+        msec: 1120
+        hash: "a4a1243326de6b9e93948fcb22fecac4"
+    }
+    Frame {
+        msec: 1136
+        hash: "c3e26e62f12dd658f21a0330fefb0533"
+    }
+    Frame {
+        msec: 1152
+        hash: "15d85b4a9ad761a911bbaa3e0c4b2b61"
+    }
+    Frame {
+        msec: 1168
+        hash: "bce1400b437cc43b8ff57b1a5fbc9551"
+    }
+    Frame {
+        msec: 1184
+        hash: "5d05848afcd8f697c1b3762f00a759f6"
+    }
+    Frame {
+        msec: 1200
+        hash: "6c83f68ea72cd54793149f4c9e759d44"
+    }
+    Frame {
+        msec: 1216
+        hash: "5206b93666e51cee3e25a7a85e27b5b8"
+    }
+    Frame {
+        msec: 1232
+        hash: "a3ef5c76efece4455e5ad12bcc8bd8f5"
+    }
+    Frame {
+        msec: 1248
+        hash: "c36c6ee7b6c8074f5dc1af7446fad1ad"
+    }
+    Frame {
+        msec: 1264
+        hash: "bb0887f1f10548bb53f0dc1ffeec25ee"
+    }
+    Frame {
+        msec: 1280
+        hash: "ebffe547a7c3528e5deddc590510506d"
+    }
+    Frame {
+        msec: 1296
+        hash: "18962faef1a1a1207a3c6783116154a2"
+    }
+    Frame {
+        msec: 1312
+        hash: "8aaa876e4a6c4de04e557f35ddd4fb61"
+    }
+    Frame {
+        msec: 1328
+        hash: "c66123bb4e01ce267629f5b50d147db1"
+    }
+    Frame {
+        msec: 1344
+        hash: "334e5acf84d90e70ca3085b9d5e057a7"
+    }
+    Frame {
+        msec: 1360
+        hash: "9bb49ddcc775307c3c1159908323e010"
+    }
+    Frame {
+        msec: 1376
+        hash: "1b3cfb8b6b6c39a34ea86a66ea1cc6b1"
+    }
+    Frame {
+        msec: 1392
+        hash: "d2a68c6eb2b05390ab1049137f96f227"
+    }
+    Frame {
+        msec: 1408
+        hash: "91e254fd2376ba35a283b18b947ca1a8"
+    }
+    Frame {
+        msec: 1424
+        hash: "fe94e2e8b4978390e9e8cbfe77dfc241"
+    }
+    Frame {
+        msec: 1440
+        hash: "e3d32b73c5c50e7aa59f4e4725de170e"
+    }
+    Frame {
+        msec: 1456
+        hash: "a73b90254d7da5557cc3941db0017a65"
+    }
+    Frame {
+        msec: 1472
+        hash: "9aa49cce5d63f8dd6409995ac6d91d63"
+    }
+    Frame {
+        msec: 1488
+        hash: "0ba674df46accec28a3c1b81e656adc7"
+    }
+    Frame {
+        msec: 1504
+        hash: "025a45417b8c75d47b5dac6c5ef913e9"
+    }
+    Frame {
+        msec: 1520
+        hash: "742527b97c7f580b0b7ff9d6aa105d31"
+    }
+    Frame {
+        msec: 1536
+        hash: "965ec8315d45894e704fcc5a3efc8c55"
+    }
+    Frame {
+        msec: 1552
+        hash: "6abdd59e6bd2c31124eab254418a5322"
+    }
+    Frame {
+        msec: 1568
+        hash: "9f6d06b176c55fa292e7f0ef4b5cd1cb"
+    }
+    Frame {
+        msec: 1584
+        hash: "05eba8c6e02c0d4af49e59b3346c9e68"
+    }
+    Frame {
+        msec: 1600
+        hash: "3c4215f6253aba836516cd51368bc471"
+    }
+    Frame {
+        msec: 1616
+        hash: "c6339a290007c0106cb18ecef5b7392b"
+    }
+    Frame {
+        msec: 1632
+        hash: "39a4bcd2ce84035f9db70f196ca00971"
+    }
+    Frame {
+        msec: 1648
+        hash: "b75a4be472583c3b893fc894ebe7d4d8"
+    }
+    Frame {
+        msec: 1664
+        hash: "d1efebbe748c43b3c1241753612e100d"
+    }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 195; y: 95
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 1680
+        hash: "f6f3ad64fb71ffb68a5ea0375cc94bae"
+    }
+    Frame {
+        msec: 1696
+        hash: "778ecbafb5d235edde1683cabe3c3cfe"
+    }
+    Frame {
+        msec: 1712
+        hash: "5a41b9196fe4a97e6ba2400806299bd8"
+    }
+    Frame {
+        msec: 1728
+        hash: "1c8ddbc5910e35be389a1cb34fab9dec"
+    }
+    Frame {
+        msec: 1744
+        hash: "5e8b236c00087a067d366afde67184f3"
+    }
+    Frame {
+        msec: 1760
+        hash: "b7308837c5d7950dc81abec1340b4582"
+    }
+    Frame {
+        msec: 1776
+        hash: "bbe9f0b030efa716f34a05f0af929c66"
+    }
+    Frame {
+        msec: 1792
+        hash: "cd393fc19a30d896bfe62aa0000308f8"
+    }
+    Frame {
+        msec: 1808
+        hash: "c390f5b1bcff54de203490d8f2616fcd"
+    }
+    Frame {
+        msec: 1824
+        hash: "b5da2ea467c334dd13c75b811b94efb1"
+    }
+    Frame {
+        msec: 1840
+        hash: "49887c9312c3a4dfc2d9719f47c83a15"
+    }
+    Frame {
+        msec: 1856
+        hash: "7f077703e49f154d01c12a44f53469c5"
+    }
+    Frame {
+        msec: 1872
+        hash: "7be4130ed767f0e0bf41c3bebf050cac"
+    }
+    Frame {
+        msec: 1888
+        hash: "cc1590486c172000557b76c6eadb51e0"
+    }
+    Frame {
+        msec: 1904
+        hash: "7ccd05236d9c1f8af0e9645404326122"
+    }
+    Frame {
+        msec: 1920
+        hash: "2da165bf7e868b53b85bb630649ddc3e"
+    }
+    Frame {
+        msec: 1936
+        image: "follow.2.png"
+    }
+    Frame {
+        msec: 1952
+        hash: "2b6a24b6ceeaa956527c872af70fb5f9"
+    }
+    Frame {
+        msec: 1968
+        hash: "8c882de21f4ed0fb68433c19b114c3f8"
+    }
+    Frame {
+        msec: 1984
+        hash: "f75226c58726a687079d0d24e865ee6f"
+    }
+    Frame {
+        msec: 2000
+        hash: "2fa9b69fe85b4e1361ba260545c10e06"
+    }
+    Frame {
+        msec: 2016
+        hash: "6d513bc03f2798fbce1a0790969da6b5"
+    }
+    Frame {
+        msec: 2032
+        hash: "7e359e605483493e9a865f6eb912c394"
+    }
+    Frame {
+        msec: 2048
+        hash: "497c7c82c24408dcaff5ec981d3d4f35"
+    }
+    Frame {
+        msec: 2064
+        hash: "8738b024cf75ef970ffe20166e85141c"
+    }
+    Frame {
+        msec: 2080
+        hash: "014b805eb1ecf2ea1cd61727bfd1ca08"
+    }
+    Frame {
+        msec: 2096
+        hash: "a81cde60979300f397054ea017382114"
+    }
+    Frame {
+        msec: 2112
+        hash: "c46183b5224e762335eea98d9da65465"
+    }
+    Frame {
+        msec: 2128
+        hash: "11afbb88994f298a1fed6575fae3d7fd"
+    }
+    Frame {
+        msec: 2144
+        hash: "0195fa503143561d9ae3ffe68739ca3f"
+    }
+    Frame {
+        msec: 2160
+        hash: "6d298df37d2116eb9a62b58853cb3344"
+    }
+    Frame {
+        msec: 2176
+        hash: "1660865f00ea9adf94c8e56c7a8a73b2"
+    }
+    Frame {
+        msec: 2192
+        hash: "9835b5527b84e8e8a8fea2bdf9653a99"
+    }
+    Frame {
+        msec: 2208
+        hash: "ec1158b83daa9e98437abc9ce90b70f0"
+    }
+    Frame {
+        msec: 2224
+        hash: "11ce5e37747e05ff5f5071b13324ce9e"
+    }
+    Frame {
+        msec: 2240
+        hash: "6d7d427d5a15a31fd395f26c94ea455e"
+    }
+    Frame {
+        msec: 2256
+        hash: "828949e0fbdb7c79719fb533febb5b35"
+    }
+    Frame {
+        msec: 2272
+        hash: "7ef7f73ef6a59c9210cfa37df3894cb1"
+    }
+    Frame {
+        msec: 2288
+        hash: "e74bec397b32ba2934ffdde23a3d60c6"
+    }
+    Frame {
+        msec: 2304
+        hash: "09c2ca9c22e9b77bc166b4567b29bca7"
+    }
+    Frame {
+        msec: 2320
+        hash: "44d87983f33c4e03f4be70b406bb9bd9"
+    }
+    Frame {
+        msec: 2336
+        hash: "92844b36c2f30e618f04bfbc5cfbcad6"
+    }
+    Frame {
+        msec: 2352
+        hash: "0245f39a8966c4addb3f8dbcee93cd3f"
+    }
+    Frame {
+        msec: 2368
+        hash: "eb1e81cfa29295d4b1522c69d4501f51"
+    }
+    Frame {
+        msec: 2384
+        hash: "2af9c3bea11b25c0f6c2b780d533a968"
+    }
+    Frame {
+        msec: 2400
+        hash: "5062e9ab29c4a7a9657a4d29249ca822"
+    }
+    Frame {
+        msec: 2416
+        hash: "d7652ddc85d3be3bb3a2fc268ae9bc29"
+    }
+    Frame {
+        msec: 2432
+        hash: "7c924bf2ad6167db439723679b373a3a"
+    }
+    Frame {
+        msec: 2448
+        hash: "a93b61dd26a2ca72100b747ac3ed81b6"
+    }
+    Frame {
+        msec: 2464
+        hash: "5fedc849d3d21e0acf0ab4a4815a1285"
+    }
+    Frame {
+        msec: 2480
+        hash: "4313d2458f4bede8d3b02ac60135e728"
+    }
+    Frame {
+        msec: 2496
+        hash: "0f09e81d89262b569c56a9c876f3898d"
+    }
+    Frame {
+        msec: 2512
+        hash: "ea932789ded14fc5c8bae565b67d004c"
+    }
+    Frame {
+        msec: 2528
+        hash: "fd1f7b9b51f1284fee4d777ef83bba3f"
+    }
+    Frame {
+        msec: 2544
+        hash: "e98b884a1ec8ce4b4dc20749b85b571e"
+    }
+    Frame {
+        msec: 2560
+        hash: "d144072bb87bb88750b9df9cd92f7a4b"
+    }
+    Frame {
+        msec: 2576
+        hash: "9d8ad80d3367292d7e89d67cf49862b8"
+    }
+    Frame {
+        msec: 2592
+        hash: "c09b89e71e862da15d2b9edb0e00aa7b"
+    }
+    Frame {
+        msec: 2608
+        hash: "551277add3f8f09951d9c8f55ccd40f7"
+    }
+    Frame {
+        msec: 2624
+        hash: "1d0be0e7108516869374a9b985fd7543"
+    }
+    Frame {
+        msec: 2640
+        hash: "12e7cfb6c4a26af54c4b35182294a7b7"
+    }
+    Frame {
+        msec: 2656
+        hash: "a666a5a59d5854973668798eb8d508ba"
+    }
+    Frame {
+        msec: 2672
+        hash: "420d2e21461dc45f134b7dfa11d04d25"
+    }
+    Frame {
+        msec: 2688
+        hash: "95f848874899fb58a81c62b5921cf857"
+    }
+    Frame {
+        msec: 2704
+        hash: "fa3ea7a0f90ca549cc9a857f0647b061"
+    }
+    Frame {
+        msec: 2720
+        hash: "cbc5338de6157cd5dad511b246f5093b"
+    }
+    Frame {
+        msec: 2736
+        hash: "e26b43c83197abab3746830bbfacc0f4"
+    }
+    Frame {
+        msec: 2752
+        hash: "5225e854ff2763e562dee2810331d560"
+    }
+    Frame {
+        msec: 2768
+        hash: "a1d114ea67233ac4c6351e18e3afa64e"
+    }
+    Frame {
+        msec: 2784
+        hash: "bc9f12af2d0816bb84fd5040ed29bdad"
+    }
+    Frame {
+        msec: 2800
+        hash: "d9337da38caa4ad3385249602a830df3"
+    }
+    Frame {
+        msec: 2816
+        hash: "6ce20e0c89181b0f11e609b248da71d7"
+    }
+    Frame {
+        msec: 2832
+        hash: "bbc8337950a78c7bfa48aab2635120a8"
+    }
+    Frame {
+        msec: 2848
+        hash: "0e28ade7f52f3c27e1dbdd6e98be8c7d"
+    }
+    Frame {
+        msec: 2864
+        hash: "0e28ade7f52f3c27e1dbdd6e98be8c7d"
+    }
+    Frame {
+        msec: 2880
+        hash: "b496af17513d60d4028bd7402fbfba93"
+    }
+    Frame {
+        msec: 2896
+        image: "follow.3.png"
+    }
+    Frame {
+        msec: 2912
+        hash: "29aa7ce0fb1aa350753d3ec6da05bdf9"
+    }
+    Frame {
+        msec: 2928
+        hash: "fde474797d8105d9d004a7020e010fa4"
+    }
+    Frame {
+        msec: 2944
+        hash: "5a553d9a4bd2ef5d86f5eb37a863d28f"
+    }
+    Frame {
+        msec: 2960
+        hash: "2dcbf6c84abd49529f0b5d85bfb74808"
+    }
+    Frame {
+        msec: 2976
+        hash: "e96ec3b7d37bbf4c9ca297ad5afde31c"
+    }
+    Frame {
+        msec: 2992
+        hash: "9d824068affe32c143226b0b530206fc"
+    }
+    Frame {
+        msec: 3008
+        hash: "3e85f0ace68cffed47f4c9b00145f0f0"
+    }
+    Frame {
+        msec: 3024
+        hash: "540b8e1e2bee7d2ba5e29fd3b1086cd1"
+    }
+    Frame {
+        msec: 3040
+        hash: "0786585d11934c5e4a7e965eaac9a152"
+    }
+    Frame {
+        msec: 3056
+        hash: "8271705df2ca697f4343007a7810d4ac"
+    }
+    Frame {
+        msec: 3072
+        hash: "b98e1cd20ab2e4239f35d04df5e5175a"
+    }
+    Frame {
+        msec: 3088
+        hash: "ab1a7eaa5c5d919ee76cba405d0dd4cd"
+    }
+    Frame {
+        msec: 3104
+        hash: "52682386448379a395dc6c541224b7d4"
+    }
+    Frame {
+        msec: 3120
+        hash: "31dffcb9da94dfc085ab8c561404c248"
+    }
+    Frame {
+        msec: 3136
+        hash: "f3703eed8ebf9ece776ebe51e4c60ae6"
+    }
+    Frame {
+        msec: 3152
+        hash: "1126b90345bb42691cd17f37ecec6bdb"
+    }
+    Frame {
+        msec: 3168
+        hash: "7a63ab96d1c8d4992c03a6f59bba4e7e"
+    }
+    Frame {
+        msec: 3184
+        hash: "91f4a00c9a7ea6164b334aa4b90da862"
+    }
+    Frame {
+        msec: 3200
+        hash: "485471140f6a5336837377612e7a85bf"
+    }
+    Frame {
+        msec: 3216
+        hash: "96881b4021aff05020e0a9342fbae75d"
+    }
+    Frame {
+        msec: 3232
+        hash: "9891326646c3da4ff250aab69c862f96"
+    }
+    Frame {
+        msec: 3248
+        hash: "f00f36bbb5a828824c596ee6f85bec2f"
+    }
+    Frame {
+        msec: 3264
+        hash: "f00f36bbb5a828824c596ee6f85bec2f"
+    }
+    Frame {
+        msec: 3280
+        hash: "f00f36bbb5a828824c596ee6f85bec2f"
+    }
+    Frame {
+        msec: 3296
+        hash: "f00f36bbb5a828824c596ee6f85bec2f"
+    }
+    Frame {
+        msec: 3312
+        hash: "9891326646c3da4ff250aab69c862f96"
+    }
+    Frame {
+        msec: 3328
+        hash: "c766238db55f4704c2f29a6be6ee6907"
+    }
+    Frame {
+        msec: 3344
+        hash: "0254665427dcbd1c155bc954cc7aa7cd"
+    }
+    Frame {
+        msec: 3360
+        hash: "33ae1012816b997ef5c61c03ccfcc590"
+    }
+    Frame {
+        msec: 3376
+        hash: "4c7857bbbcb9aa812fc2503af2b395cf"
+    }
+    Frame {
+        msec: 3392
+        hash: "3a570e4af992d35e55923cea23c3c11b"
+    }
+    Frame {
+        msec: 3408
+        hash: "533ef554538005512ce37c73c6def722"
+    }
+    Frame {
+        msec: 3424
+        hash: "f863fa215d0642708bfa82780c766dc4"
+    }
+    Frame {
+        msec: 3440
+        hash: "fcca3ec34521c4b9087a102ba1e47293"
+    }
+    Frame {
+        msec: 3456
+        hash: "47d67cd74cb96b12801842b288a8b9ff"
+    }
+    Frame {
+        msec: 3472
+        hash: "34c5ea76f297ec68cba70521caa468e4"
+    }
+    Frame {
+        msec: 3488
+        hash: "7be247cc7a4032ff0478fca1a2aace8a"
+    }
+    Frame {
+        msec: 3504
+        hash: "3ade2a1a48edef15f522b9fc016e137e"
+    }
+    Frame {
+        msec: 3520
+        hash: "8b37b9d123504931d82bb06f6981bade"
+    }
+    Frame {
+        msec: 3536
+        hash: "5eb39825003f405f353f629e236b3395"
+    }
+    Frame {
+        msec: 3552
+        hash: "c4550722260c4a30ab1176c7e5cb62bf"
+    }
+    Frame {
+        msec: 3568
+        hash: "bd33e3ecd4b59cd659588c0298b61095"
+    }
+    Frame {
+        msec: 3584
+        hash: "4b3a62bff0019df7412aa2e1c07c0a23"
+    }
+    Frame {
+        msec: 3600
+        hash: "a9b98adcc3350febbb89dbf725b81436"
+    }
+    Frame {
+        msec: 3616
+        hash: "66eb8c84e75141d1575caf7d3cbc1ceb"
+    }
+    Frame {
+        msec: 3632
+        hash: "238f2b1dc5bf5b65e827c860f9ee76b5"
+    }
+    Frame {
+        msec: 3648
+        hash: "6d1fed0697370b2a2163c369fe559739"
+    }
+    Frame {
+        msec: 3664
+        hash: "04ea478c785586d900bbe3472371bbc7"
+    }
+    Frame {
+        msec: 3680
+        hash: "ba429e711c9363eebfb20e641fa44c84"
+    }
+    Frame {
+        msec: 3696
+        hash: "0129dfba166ffcbaa15087467c864068"
+    }
+    Frame {
+        msec: 3712
+        hash: "3fb340c874eee94e8baa1453b37c3fb5"
+    }
+    Frame {
+        msec: 3728
+        hash: "068c51d99c458f3edefe3371f46de260"
+    }
+    Frame {
+        msec: 3744
+        hash: "dd1e04ed3d610c2712158d73ee2c5b9d"
+    }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 195; y: 95
+        modifiers: 0
+        sendToViewport: true
+    }
+    Frame {
+        msec: 3760
+        hash: "840154afb9e7e0c859c66667bb6944b6"
+    }
+    Frame {
+        msec: 3776
+        hash: "239c2e33800e386b468a95341d0e23f4"
+    }
+    Frame {
+        msec: 3792
+        hash: "0a00515f2d297362862c1a5cf6519845"
+    }
+    Frame {
+        msec: 3808
+        hash: "f855df3495e44291aed8f085163c804b"
+    }
+    Frame {
+        msec: 3824
+        hash: "b4eb31e48c65550bb78d175b48e0e9fb"
+    }
+    Frame {
+        msec: 3840
+        hash: "70243664f9db83614e5972fc18ee81a1"
+    }
+    Frame {
+        msec: 3856
+        image: "follow.4.png"
+    }
+    Frame {
+        msec: 3872
+        hash: "c48ce2a4cf28ab706b9c097bddc74c27"
+    }
+    Frame {
+        msec: 3888
+        hash: "754a957e0df02839dd2fe33fefb7a721"
+    }
+    Frame {
+        msec: 3904
+        hash: "ec3ebe7b941af9bf2163634d7f15e8aa"
+    }
+    Frame {
+        msec: 3920
+        hash: "a76423ff2184cd9dac47abf7ae52ce5a"
+    }
+    Frame {
+        msec: 3936
+        hash: "559bec54f51c36c6e90004ca5e77c23c"
+    }
+    Frame {
+        msec: 3952
+        hash: "dc6fdd6a867a675afcb58f7052605614"
+    }
+    Frame {
+        msec: 3968
+        hash: "b2fb0dbbec01490243f37fe5f80ab6c7"
+    }
+    Frame {
+        msec: 3984
+        hash: "2bc1df7a913b1948ee7bb77eeaa55aa2"
+    }
+    Frame {
+        msec: 4000
+        hash: "82c6430d85c6a94c4b55a9529d2bc78f"
+    }
+    Frame {
+        msec: 4016
+        hash: "463e70dc9a9bdabdc158199bdcd7d2fa"
+    }
+    Frame {
+        msec: 4032
+        hash: "c1e9553327f060b70caa713bf3015342"
+    }
+    Frame {
+        msec: 4048
+        hash: "42f7f505d4e5ef316240e4f287a039bf"
+    }
+    Frame {
+        msec: 4064
+        hash: "200500f600ffe43c5ad4d057bcfc0831"
+    }
+    Frame {
+        msec: 4080
+        hash: "22e78edb813f7830776b2603b0aaae5c"
+    }
+    Frame {
+        msec: 4096
+        hash: "32ebf3490832fd0693b1b922b4501251"
+    }
+    Frame {
+        msec: 4112
+        hash: "1be622caa5ef94f87e2ec8297b6e1caa"
+    }
+    Frame {
+        msec: 4128
+        hash: "d1480529e0cb94c51c412109663e5fab"
+    }
+    Frame {
+        msec: 4144
+        hash: "e55e627d6d13b647f35233f18f0cbe89"
+    }
+    Frame {
+        msec: 4160
+        hash: "87d7b349cd2898de7686e5f1a14f6338"
+    }
+    Frame {
+        msec: 4176
+        hash: "2ac974836ee5e6092b55fcda20d7c35d"
+    }
+    Frame {
+        msec: 4192
+        hash: "53867256c1dac4de2f02af1ae000b49f"
+    }
+    Frame {
+        msec: 4208
+        hash: "08623509e9e5089fdaa1af2bf9a77eb1"
+    }
+    Frame {
+        msec: 4224
+        hash: "e4692f42c12593ee865048aef00cbeb2"
+    }
+    Frame {
+        msec: 4240
+        hash: "981ad6459e3e7483bb323ab4bc514630"
+    }
+    Frame {
+        msec: 4256
+        hash: "79e8adfcdc9d6dae0d2b6a69e8e322fa"
+    }
+    Frame {
+        msec: 4272
+        hash: "58f967a607972faa9daa13402eeb9912"
+    }
+    Frame {
+        msec: 4288
+        hash: "1fd5b002b049132565b6a963fb7b3bb6"
+    }
+    Frame {
+        msec: 4304
+        hash: "a16c96598f47404ec5f4ef55e87a1e70"
+    }
+    Frame {
+        msec: 4320
+        hash: "3c632899804812c93c7edd3e3f3d2bac"
+    }
+    Frame {
+        msec: 4336
+        hash: "af0eb810e0273f9bacb082d9f90612df"
+    }
+    Frame {
+        msec: 4352
+        hash: "728d7ac4a5410482c7d86d03c2d8a996"
+    }
+    Frame {
+        msec: 4368
+        hash: "416e76064f2be71a03eddddf61a33cb0"
+    }
+    Frame {
+        msec: 4384
+        hash: "c41f20b4ac9a7b34eefd066f77ea351a"
+    }
+    Frame {
+        msec: 4400
+        hash: "821d51db415a210b09ebdf8d861aadf2"
+    }
+    Frame {
+        msec: 4416
+        hash: "9394266815a52f1779858bb088d557dc"
+    }
+    Frame {
+        msec: 4432
+        hash: "cc475d1589665414e5aef051ec237ef4"
+    }
+    Frame {
+        msec: 4448
+        hash: "a95f3b8128faa7820f36391fa9bd579f"
+    }
+    Frame {
+        msec: 4464
+        hash: "d52687293a11891c364de52525039203"
+    }
+    Frame {
+        msec: 4480
+        hash: "5333dc4f65b2f1e066edcd23f7621bd7"
+    }
+    Frame {
+        msec: 4496
+        hash: "797bb5e27b2fe2b733a54402433901b4"
+    }
+    Frame {
+        msec: 4512
+        hash: "84c610cdff7f8b04a34977216e37847d"
+    }
+    Frame {
+        msec: 4528
+        hash: "0317f0406a566b2851c8bda62900e40c"
+    }
+    Frame {
+        msec: 4544
+        hash: "6538ecd7abd35234c5cc5c2a17249fc1"
+    }
+    Frame {
+        msec: 4560
+        hash: "f9019150a132eb5f5cfafcd5337aff7a"
+    }
+    Frame {
+        msec: 4576
+        hash: "0f0136fffbc65c02cee249ece4c8c0ef"
+    }
+    Frame {
+        msec: 4592
+        hash: "0027e0d236b8b33a451a0cc35e81b4ce"
+    }
+    Frame {
+        msec: 4608
+        hash: "ac2f86b2d4f29f223fb78440d67ccd31"
+    }
+    Frame {
+        msec: 4624
+        hash: "a6eb112a10c849e337f816ee408f22a6"
+    }
+    Frame {
+        msec: 4640
+        hash: "dafbb01f2615a2513310478ebe484a05"
+    }
+    Frame {
+        msec: 4656
+        hash: "17c400c4c29652dc278980ab578b75b3"
+    }
+    Frame {
+        msec: 4672
+        hash: "48696c02a2a4839b893a4c0b431b78a3"
+    }
+    Frame {
+        msec: 4688
+        hash: "04e05c7e722e53299d24cd0f1b7d17ee"
+    }
+    Frame {
+        msec: 4704
+        hash: "55d158f13ffc7ccde5ee368656d2830b"
+    }
+    Frame {
+        msec: 4720
+        hash: "fa478e1575acedae023322a520171a5b"
+    }
+    Frame {
+        msec: 4736
+        hash: "e2147ddd6e19fde80bb76da24011400c"
+    }
+    Frame {
+        msec: 4752
+        hash: "44ee0144db4c55aa90d2a931d83a895e"
+    }
+    Frame {
+        msec: 4768
+        hash: "552e87bbce4ad48006c899052a2c8cad"
+    }
+    Frame {
+        msec: 4784
+        hash: "3b6efe225303566f751c3f884ac8c069"
+    }
+    Frame {
+        msec: 4800
+        hash: "3a7175916d1dc103506061607b910550"
+    }
+    Frame {
+        msec: 4816
+        image: "follow.5.png"
+    }
+    Frame {
+        msec: 4832
+        hash: "b2e5d5c14b02a13bca62673f87e85627"
+    }
+    Frame {
+        msec: 4848
+        hash: "bd89a911d6fb13e4e841f8ee5b8b42af"
+    }
+    Frame {
+        msec: 4864
+        hash: "89795784185e83d0299e656f2eec73c8"
+    }
+    Frame {
+        msec: 4880
+        hash: "5b6d6fe78f341bdf0eb4bedfe3d975d0"
+    }
+    Frame {
+        msec: 4896
+        hash: "e246bc451ee48e16ef6dee20d6256e9c"
+    }
+    Frame {
+        msec: 4912
+        hash: "8c1bc37b1b268743aa314247ea949ef5"
+    }
+    Frame {
+        msec: 4928
+        hash: "04f34203c34dc87efc708bfb232663df"
+    }
+    Frame {
+        msec: 4944
+        hash: "d37a48545e81970d16951e3388f0ff8c"
+    }
+    Frame {
+        msec: 4960
+        hash: "9411e846c9f59cc915288efb59d4c9de"
+    }
+    Frame {
+        msec: 4976
+        hash: "6ee179741ac74837708afb55943f15bd"
+    }
+    Frame {
+        msec: 4992
+        hash: "f626fc3166bd5b01171271ae9bfa9b22"
+    }
+    Frame {
+        msec: 5008
+        hash: "e22898b2c0c566bbf531223234f98327"
+    }
+    Frame {
+        msec: 5024
+        hash: "1343d90c5eae70713cd49110fe61237b"
+    }
+    Frame {
+        msec: 5040
+        hash: "493d9322da6d01979a3f1a120c265f8c"
+    }
+    Frame {
+        msec: 5056
+        hash: "defccc76caf3a7c7c67e8abf5ccc2def"
+    }
+    Frame {
+        msec: 5072
+        hash: "fe3cad9227fcfa7ba2238465078f2ac7"
+    }
+    Frame {
+        msec: 5088
+        hash: "66ebfeee3a63323c7d8b949db9aafd7e"
+    }
+    Frame {
+        msec: 5104
+        hash: "805820b382d005894f9a615004b97b0d"
+    }
+    Frame {
+        msec: 5120
+        hash: "eee1620f47bb071de8a9c788d1fd258e"
+    }
+    Frame {
+        msec: 5136
+        hash: "f5a7d9a81fcfc8cfb9e7cc8ead0f1ff8"
+    }
+    Frame {
+        msec: 5152
+        hash: "249903ee123090b27019350f120c8b79"
+    }
+    Frame {
+        msec: 5168
+        hash: "019793a363c905809af32bf34ef52ec0"
+    }
+    Frame {
+        msec: 5184
+        hash: "4f5ad5a3ebb6eca73dd7567199d07b08"
+    }
+    Frame {
+        msec: 5200
+        hash: "fdc1b42d50c7a5c45458498788ff0abd"
+    }
+    Frame {
+        msec: 5216
+        hash: "cc091469598cad28d0a00690f1acb412"
+    }
+    Frame {
+        msec: 5232
+        hash: "5c8757e1f8f34a31d8b3717b64b84c07"
+    }
+    Frame {
+        msec: 5248
+        hash: "5da75559f60eac1b9f518ed55a174e5b"
+    }
+    Frame {
+        msec: 5264
+        hash: "1214c08daec4dcfb27690fdc18f2ac28"
+    }
+    Frame {
+        msec: 5280
+        hash: "87d92c1ba694d0cf187d8616b0f622f0"
+    }
+    Frame {
+        msec: 5296
+        hash: "d4af63638fe69b6c4f087a935351057e"
+    }
+    Frame {
+        msec: 5312
+        hash: "0573c41f34c2c117cada987e4ee813a5"
+    }
+    Frame {
+        msec: 5328
+        hash: "f179ef4b7bf0f915e25ffd8168a9126f"
+    }
+    Frame {
+        msec: 5344
+        hash: "1618bf7c94e7898392eb5ffbf44b8aff"
+    }
+    Frame {
+        msec: 5360
+        hash: "5af24b902e3729d544f70c77e189b8a7"
+    }
+    Frame {
+        msec: 5376
+        hash: "4e5789404e58113cc2d8aa737a03ab58"
+    }
+    Frame {
+        msec: 5392
+        hash: "e4bf91a249e47597e959bbaf25f0724d"
+    }
+    Frame {
+        msec: 5408
+        hash: "39a3e3d6269522ed57a0e37319ab94d5"
+    }
+    Frame {
+        msec: 5424
+        hash: "f2e2e47922e7e058e14537a0455cd77f"
+    }
+    Frame {
+        msec: 5440
+        hash: "64abb3f2c9e05fd1dd7490d11c74f06a"
+    }
+    Frame {
+        msec: 5456
+        hash: "a9bf45c29536ca34c42aa916747b485b"
+    }
+    Frame {
+        msec: 5472
+        hash: "da21839b6635e5c4e0a589d163e62752"
+    }
+    Frame {
+        msec: 5488
+        hash: "f31e49258bcbb2a144daa320e4567df1"
+    }
+    Frame {
+        msec: 5504
+        hash: "f96c5b39f94bf2ac1e3f4de96767d720"
+    }
+    Frame {
+        msec: 5520
+        hash: "281b90d1056803093cc37f30465f0e73"
+    }
+    Frame {
+        msec: 5536
+        hash: "d63a2424e1947328957ad8f5f0bec043"
+    }
+    Frame {
+        msec: 5552
+        hash: "bd510a0de7df02b1b5741824b6f90944"
+    }
+    Frame {
+        msec: 5568
+        hash: "47dc4e5ff91cb84c89dd0fc0459f75f2"
+    }
+    Frame {
+        msec: 5584
+        hash: "4bc46b5e116dd30e1db4d4bb650ed6ed"
+    }
+    Frame {
+        msec: 5600
+        hash: "c6964b89f1962f120028057d1c588694"
+    }
+    Frame {
+        msec: 5616
+        hash: "39a77544a1c88b68cb63da9a8910a35e"
+    }
+    Frame {
+        msec: 5632
+        hash: "bd8ac21d7a507a8e195437ccac254ecc"
+    }
+    Frame {
+        msec: 5648
+        hash: "7b39b2667a8f8efae20ec8696e35dbc4"
+    }
+    Frame {
+        msec: 5664
+        hash: "7b39b2667a8f8efae20ec8696e35dbc4"
+    }
+    Frame {
+        msec: 5680
+        hash: "8628f4f24670d17965fec40a02e0196f"
+    }
+    Frame {
+        msec: 5696
+        hash: "515903d9896a853cb18cc7b7c45c1cce"
+    }
+    Frame {
+        msec: 5712
+        hash: "b7a3f70bedcb3f90a2e294b447e05f70"
+    }
+    Frame {
+        msec: 5728
+        hash: "8e8b104ef82b1e219021aa38276f8b45"
+    }
+    Frame {
+        msec: 5744
+        hash: "70abe79da860bebd2d17a8c7abb20b4e"
+    }
+    Frame {
+        msec: 5760
+        hash: "d99af176fb6cf9d9cbcf7cf4286a165c"
+    }
+    Frame {
+        msec: 5776
+        image: "follow.6.png"
+    }
+    Frame {
+        msec: 5792
+        hash: "67809c7daad6716d0a664c52de9906ce"
+    }
+    Frame {
+        msec: 5808
+        hash: "29a27fd59b7316ce305803482686ea58"
+    }
+    Frame {
+        msec: 5824
+        hash: "25b9ca40d1d6208d026e5c965923f8fb"
+    }
+    Frame {
+        msec: 5840
+        hash: "126b1542415aea11dbb35492be4f66aa"
+    }
+    Frame {
+        msec: 5856
+        hash: "26ca7034536e0e690236797df740f19a"
+    }
+    Frame {
+        msec: 5872
+        hash: "fec9db60af63a4712b0da037cf1d89cd"
+    }
+    Frame {
+        msec: 5888
+        hash: "d9b7e2729c75ca0c0f33b542525c4880"
+    }
+    Frame {
+        msec: 5904
+        hash: "89149d16b893ea432b6d0fb05ead48cb"
+    }
+    Frame {
+        msec: 5920
+        hash: "8e389d2ca706277ce06e1da557e2e6c1"
+    }
+    Frame {
+        msec: 5936
+        hash: "fc5c74473410da1ddd451c5901572172"
+    }
+    Frame {
+        msec: 5952
+        hash: "54514970eadff9362d31499a737e4c95"
+    }
+    Frame {
+        msec: 5968
+        hash: "d5953bc29532ec49c20ee552c8756ba1"
+    }
+    Frame {
+        msec: 5984
+        hash: "5f03be3ed5824e6a6f8f371ce6a47997"
+    }
+    Frame {
+        msec: 6000
+        hash: "0431e2ec4765167d0099c59df400f3fd"
+    }
+    Frame {
+        msec: 6016
+        hash: "0431e2ec4765167d0099c59df400f3fd"
+    }
+    Frame {
+        msec: 6032
+        hash: "403e1f235770f2b7c8b1b2e86aea69a5"
+    }
+    Frame {
+        msec: 6048
+        hash: "403e1f235770f2b7c8b1b2e86aea69a5"
+    }
+    Frame {
+        msec: 6064
+        hash: "32ff9f959598972f5a264418587dca1f"
+    }
+    Frame {
+        msec: 6080
+        hash: "b4c7c07e52a684f7ce21e47a4d66356a"
+    }
+    Frame {
+        msec: 6096
+        hash: "e0f214bed2c3a31f473952929b8f3ea9"
+    }
+    Frame {
+        msec: 6112
+        hash: "15328b8a205965f3f29fc63a6a8ac8ed"
+    }
+    Frame {
+        msec: 6128
+        hash: "72c46ed63633e6879373f4783df25d8b"
+    }
+    Frame {
+        msec: 6144
+        hash: "3f2570289df823446f85bbd8d620db4d"
+    }
+    Frame {
+        msec: 6160
+        hash: "df9451c6634d72e6f794e962b3591086"
+    }
+    Frame {
+        msec: 6176
+        hash: "773e10bbd133e64457e7ddbc73a10fc2"
+    }
+    Frame {
+        msec: 6192
+        hash: "c79abb97eb86761b69053d77156dffd4"
+    }
+    Frame {
+        msec: 6208
+        hash: "d927934b19ffd55ea7cea1916983351a"
+    }
+    Frame {
+        msec: 6224
+        hash: "ae5058d935c1e44d103be66921b19e77"
+    }
+    Frame {
+        msec: 6240
+        hash: "b6a1446b6be054d5785ba52ac23f8aa8"
+    }
+    Frame {
+        msec: 6256
+        hash: "3dffbffded44249fdbe58aecd24ab97f"
+    }
+    Frame {
+        msec: 6272
+        hash: "56445ab8554a23a786b70e4fd9f40451"
+    }
+    Frame {
+        msec: 6288
+        hash: "56445ab8554a23a786b70e4fd9f40451"
+    }
+    Frame {
+        msec: 6304
+        hash: "257ce16f529b99f28beb2e57625f52ee"
+    }
+    Frame {
+        msec: 6320
+        hash: "257ce16f529b99f28beb2e57625f52ee"
+    }
+    Frame {
+        msec: 6336
+        hash: "257ce16f529b99f28beb2e57625f52ee"
+    }
+    Frame {
+        msec: 6352
+        hash: "257ce16f529b99f28beb2e57625f52ee"
+    }
+    Frame {
+        msec: 6368
+        hash: "257ce16f529b99f28beb2e57625f52ee"
+    }
+    Frame {
+        msec: 6384
+        hash: "cb2b0ddbc7b8485fbf32a537e5a98d0e"
+    }
+    Frame {
+        msec: 6400
+        hash: "cb2b0ddbc7b8485fbf32a537e5a98d0e"
+    }
+    Frame {
+        msec: 6416
+        hash: "cb2b0ddbc7b8485fbf32a537e5a98d0e"
+    }
+    Frame {
+        msec: 6432
+        hash: "cb2b0ddbc7b8485fbf32a537e5a98d0e"
+    }
+    Frame {
+        msec: 6448
+        hash: "cb2b0ddbc7b8485fbf32a537e5a98d0e"
+    }
+    Frame {
+        msec: 6464
+        hash: "fa87436d5e51122022a005d815f97c32"
+    }
+    Frame {
+        msec: 6480
+        hash: "fa87436d5e51122022a005d815f97c32"
+    }
+    Frame {
+        msec: 6496
+        hash: "fa87436d5e51122022a005d815f97c32"
+    }
+    Frame {
+        msec: 6512
+        hash: "fa87436d5e51122022a005d815f97c32"
+    }
+    Frame {
+        msec: 6528
+        hash: "fa87436d5e51122022a005d815f97c32"
+    }
+    Frame {
+        msec: 6544
+        hash: "fa87436d5e51122022a005d815f97c32"
+    }
+    Frame {
+        msec: 6560
+        hash: "fa87436d5e51122022a005d815f97c32"
+    }
+    Frame {
+        msec: 6576
+        hash: "fa87436d5e51122022a005d815f97c32"
+    }
+    Frame {
+        msec: 6592
+        hash: "fa87436d5e51122022a005d815f97c32"
+    }
+    Frame {
+        msec: 6608
+        hash: "fa87436d5e51122022a005d815f97c32"
+    }
+    Frame {
+        msec: 6624
+        hash: "fa87436d5e51122022a005d815f97c32"
+    }
+    Frame {
+        msec: 6640
+        hash: "fa87436d5e51122022a005d815f97c32"
+    }
+    Frame {
+        msec: 6656
+        hash: "fa87436d5e51122022a005d815f97c32"
+    }
+    Frame {
+        msec: 6672
+        hash: "fa87436d5e51122022a005d815f97c32"
+    }
+    Frame {
+        msec: 6688
+        hash: "fa87436d5e51122022a005d815f97c32"
+    }
+    Frame {
+        msec: 6704
+        hash: "da52e87ccd157c0330c07e480b8b0c06"
+    }
+    Frame {
+        msec: 6720
+        hash: "da52e87ccd157c0330c07e480b8b0c06"
+    }
+    Frame {
+        msec: 6736
+        image: "follow.7.png"
+    }
+    Frame {
+        msec: 6752
+        hash: "da52e87ccd157c0330c07e480b8b0c06"
+    }
+    Frame {
+        msec: 6768
+        hash: "da52e87ccd157c0330c07e480b8b0c06"
+    }
+    Frame {
+        msec: 6784
+        hash: "da52e87ccd157c0330c07e480b8b0c06"
+    }
+    Frame {
+        msec: 6800
+        hash: "da52e87ccd157c0330c07e480b8b0c06"
+    }
+    Frame {
+        msec: 6816
+        hash: "da52e87ccd157c0330c07e480b8b0c06"
+    }
+    Frame {
+        msec: 6832
+        hash: "257ce16f529b99f28beb2e57625f52ee"
+    }
+    Key {
+        type: 6
+        key: 16777249
+        modifiers: 67108864
+        text: ""
+        autorep: false
+        count: 1
+    }
+    Frame {
+        msec: 6848
+        hash: "56445ab8554a23a786b70e4fd9f40451"
+    }
+    Frame {
+        msec: 6864
+        hash: "56445ab8554a23a786b70e4fd9f40451"
+    }
+    Frame {
+        msec: 6880
+        hash: "56445ab8554a23a786b70e4fd9f40451"
+    }
+    Frame {
+        msec: 6896
+        hash: "56445ab8554a23a786b70e4fd9f40451"
+    }
+    Frame {
+        msec: 6912
+        hash: "56445ab8554a23a786b70e4fd9f40451"
+    }
+    Frame {
+        msec: 6928
+        hash: "56445ab8554a23a786b70e4fd9f40451"
+    }
+}
diff --git a/tests/auto/declarative/qmlvisual/selftest_noimages/data/selftest_noimages.qml b/tests/auto/declarative/qmlvisual/selftest_noimages/data/selftest_noimages.qml
index 70ee988..ccadea0 100644
--- a/tests/auto/declarative/qmlvisual/selftest_noimages/data/selftest_noimages.qml
+++ b/tests/auto/declarative/qmlvisual/selftest_noimages/data/selftest_noimages.qml
@@ -196,6 +196,14 @@ VisualTest {
     Frame {
         msec: 1024
     }
+    Mouse {
+        type: 2
+        button: 1
+        buttons: 1
+        x: 53; y: 47
+        modifiers: 0
+        sendToViewport: true
+    }
     Frame {
         msec: 1040
     }
@@ -214,6 +222,14 @@ VisualTest {
     Frame {
         msec: 1120
     }
+    Mouse {
+        type: 3
+        button: 1
+        buttons: 0
+        x: 53; y: 47
+        modifiers: 0
+        sendToViewport: true
+    }
     Frame {
         msec: 1136
     }
@@ -259,14 +275,6 @@ VisualTest {
     Frame {
         msec: 1360
     }
-    Mouse {
-        type: 2
-        button: 1
-        buttons: 1
-        x: 77; y: 7
-        modifiers: 0
-        sendToViewport: true
-    }
     Frame {
         msec: 1376
     }
@@ -282,14 +290,6 @@ VisualTest {
     Frame {
         msec: 1440
     }
-    Mouse {
-        type: 3
-        button: 1
-        buttons: 0
-        x: 77; y: 7
-        modifiers: 0
-        sendToViewport: true
-    }
     Frame {
         msec: 1456
     }
@@ -353,118 +353,4 @@ VisualTest {
     Frame {
         msec: 1776
     }
-    Frame {
-        msec: 1792
-    }
-    Frame {
-        msec: 1808
-    }
-    Frame {
-        msec: 1824
-    }
-    Frame {
-        msec: 1840
-    }
-    Frame {
-        msec: 1856
-    }
-    Frame {
-        msec: 1872
-    }
-    Frame {
-        msec: 1888
-    }
-    Frame {
-        msec: 1904
-    }
-    Frame {
-        msec: 1920
-    }
-    Frame {
-        msec: 1936
-    }
-    Frame {
-        msec: 1952
-    }
-    Frame {
-        msec: 1968
-    }
-    Frame {
-        msec: 1984
-    }
-    Frame {
-        msec: 2000
-    }
-    Frame {
-        msec: 2016
-    }
-    Frame {
-        msec: 2032
-    }
-    Frame {
-        msec: 2048
-    }
-    Frame {
-        msec: 2064
-    }
-    Frame {
-        msec: 2080
-    }
-    Frame {
-        msec: 2096
-    }
-    Frame {
-        msec: 2112
-    }
-    Frame {
-        msec: 2128
-    }
-    Frame {
-        msec: 2144
-    }
-    Frame {
-        msec: 2160
-    }
-    Frame {
-        msec: 2176
-    }
-    Frame {
-        msec: 2192
-    }
-    Frame {
-        msec: 2208
-    }
-    Frame {
-        msec: 2224
-    }
-    Frame {
-        msec: 2240
-    }
-    Frame {
-        msec: 2256
-    }
-    Frame {
-        msec: 2272
-    }
-    Frame {
-        msec: 2288
-    }
-    Frame {
-        msec: 2304
-    }
-    Frame {
-        msec: 2320
-    }
-    Frame {
-        msec: 2336
-    }
-    Frame {
-        msec: 2352
-    }
-    Frame {
-        msec: 2368
-    }
-    Frame {
-        msec: 2384
-    }
 }
-- 
cgit v0.12


From 17e6529f7ff18c6f47f1fcc35379addd78d7156e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 5 Jan 2011 12:14:38 +0100
Subject: Added warning if <QGLFunctions> is included when GLEW is present.

GLEW can not be used in combination with <QGLFunctions>.

Reviewed-by: Eskil Abrahamsen Blomfeldt
---
 dist/changes-4.8.0        | 2 ++
 src/opengl/qglfunctions.h | 5 +++++
 2 files changed, 7 insertions(+)

diff --git a/dist/changes-4.8.0 b/dist/changes-4.8.0
index c55faf6..fa50f24 100644
--- a/dist/changes-4.8.0
+++ b/dist/changes-4.8.0
@@ -51,6 +51,8 @@ QtGui
  - Removed dependency of OpenGL Utility Library (GLU)
  - Added QGLFunctions, which provides cross-platform access to the
    OpenGL/ES 2.0 API.
+ - Including <QtOpenGL> will not work in combination with GLEW, as
+   QGLFunctions will undefine GLEW's defines.
 
 
 ****************************************************************************
diff --git a/src/opengl/qglfunctions.h b/src/opengl/qglfunctions.h
index e06de7f..88f43c0 100644
--- a/src/opengl/qglfunctions.h
+++ b/src/opengl/qglfunctions.h
@@ -42,6 +42,11 @@
 #ifndef QGLFUNCTIONS_H
 #define QGLFUNCTIONS_H
 
+#ifdef __GLEW_H__
+#warning qglfunctions.h is not compatible with GLEW, GLEW defines will be undefined
+#warning To use GLEW with Qt, do not include <QtOpenGL> or <QGLFunctions> after glew.h
+#endif
+
 #include <QtOpenGL/qgl.h>
 
 QT_BEGIN_HEADER
-- 
cgit v0.12


From 57a3d4250ea438b2607d7f62ef26b8b83eb0f66c Mon Sep 17 00:00:00 2001
From: Bea Lam <bea.lam@nokia.com>
Date: Thu, 6 Jan 2011 11:16:49 +1000
Subject: Doc fixes for introduction page and Item docs

Moved 'Identity' and 'Property Change Signals' sections from Item
docs to the intro page, which previously had a section on ids but
this has been moved out of the 'Properties' section since an id isn't
an ordinary property.
---
 doc/src/declarative/qdeclarativeintro.qdoc         | 213 +++++++++++++--------
 src/declarative/graphicsitems/qdeclarativeitem.cpp |  28 ---
 2 files changed, 130 insertions(+), 111 deletions(-)

diff --git a/doc/src/declarative/qdeclarativeintro.qdoc b/doc/src/declarative/qdeclarativeintro.qdoc
index 4e41fda..20db248 100644
--- a/doc/src/declarative/qdeclarativeintro.qdoc
+++ b/doc/src/declarative/qdeclarativeintro.qdoc
@@ -37,7 +37,7 @@ interface is specified as a tree of objects with properties.
 
 This introduction is meant for those with little or no programming
 experience. JavaScript is used as a scripting language in QML, so you may want
-to learn a bit more about it (\l{Javascript Guide}) before diving
+to learn a bit more about it (see the \l{Javascript Guide}) before diving
 deeper into QML. It's also helpful to have a basic understanding of other web
 technologies like HTML and CSS, but it's not required.
 
@@ -60,13 +60,13 @@ Rectangle {
 }
 \endcode
 
-Objects are specified by their type, followed by a pair of braces. Object
-types always begin with a capital letter. In the above example, there are
-two objects, a \l Rectangle, and an \l Image. Between the braces, we can specify
-information about the object, such as its properties.
+Here we create two objects, a \l Rectangle object and its child
+\l Image object. Objects are specified by their type, followed by a pair of
+braces in between which additional data can be defined for the object, such as
+its property values and any child objects.
 
-Properties are specified as \c {property: value}. In the above example, we
-can see the Image has a property named \c source, which has been assigned the
+Properties are specified with a \c {property: value} syntax. In the above example, we
+can see the \l Image object has a property named \c source, which has been assigned the
 value \c "pics/logo.png". The property and its value are separated by a colon.
 
 Properties can be specified one-per-line:
@@ -87,45 +87,13 @@ Rectangle { width: 100; height: 100 }
 When multiple property/value pairs are specified on a single line, they
 must be separated by a semicolon.
 
-The \c import statement imports the \c Qt \l{QML Modules}{module}, which contains all of the
+The \c import statement imports the \c QtQuick \l{QML Modules}{module}, which contains all of the
 standard \l {QML Elements}. Without this import statement, the \l Rectangle
 and \l Image elements would not be available.
 
-\section1 Expressions
-
-In addition to assigning values to properties, you can also assign
-expressions written in JavaScript.
-
-\code
-Rotation {
-    angle: 360 * 3
-}
-\endcode
-
-These expressions can include references to other objects and properties, in which case
-a \e binding is established: when the value of the expression changes, the property the
-expression has been assigned to is automatically updated to that value.
-
-\code
-Item {
-    Text {
-        id: text1
-        text: "Hello World"
-    }
-    Text {
-        id: text2
-        text: text1.text
-    }
-}
-\endcode
-
-In the example above, the \c text2 object will display the same text as \c text1. If \c text1 is changed,
-\c text2 is automatically changed to the same value.
 
-Note that to refer to other objects, we use their \e id values. (See below for more
-information on the \e id property.)
 
-\section1 QML Comments
+\section1 Comments
 
 Commenting in QML is similar to JavaScript.
 \list
@@ -149,27 +117,95 @@ Text {
 }
 \endcode
 
-In the above example, the Text object will have normal opacity, since the
+In the above example, the \l Text object will have normal opacity, since the
 line opacity: 0.5 has been turned into a comment.
 
-\section1 Properties
-\target intro-properties
 
-\section2 Property naming
 
-Properties begin with a lowercase letter (with the exception of \l{Attached Properties}).
+\section1 Object identifiers
+
+Each object can be given a special \e id value that allows the object to be identified
+and referred to by other objects.
+
+For example, below we have two \l Text objects. The first \l Text object
+has an \c id value of "text1". The second \l Text object can now set its own
+\c text property value to be the same as that of the first object, by referring to
+\c text1.text:
+
+\qml
+import QtQuick 1.0
+
+Row {
+    Text {
+        id: text1
+        text: "Hello World"
+    }
+
+    Text { text: text1.text }
+}
+\endqml
+
+An object can be referred to by its \c id from anywhere within the \l {QML Documents}{component}
+in which it is declared. Therefore, an \c id value must always be unique within a single component.
+
+The \c id value is a special value for a QML object and should not be thought of as an
+ordinary object property; for example, it is not possible to access \c text1.id in the
+above example. Once an object is created, its \c id cannot be changed.
+
+Note that an \c id must begin with a lower-case letter or an underscore, and cannot contain
+characters other than letters, numbers and underscores.
+
+
+
+\section1 Expressions
+
+JavaScript expressions can be used to assign property values. For example:
+
+\code
+Item {
+    width: 100 * 3
+    height: 50 + 22
+}
+\endcode
+
+These expressions can include references to other objects and properties, in which case
+a \l{Property Binding}{binding} is established: when the value of the expression changes,
+the property to which the expression is assigned is automatically updated to the
+new value. For example:
+
+\code
+Item {
+    width: 300
+    height: 300
+
+    Rectangle {
+        width: parent.width - 50
+        height: 100
+        color: "yellow"
+    }
+}
+\endcode
+
+Here, the \l Rectangle object's \c width property is set relative to the width
+of its parent. Whenever the parent's width changes, the width of the \l Rectangle is
+automatically updated.
 
-\section2 Property types
 
-QML supports properties of many types (see \l{QML Basic Types}). The basic types include int,
-real, bool, string, color, and lists.
+
+\section1 Properties
+\target intro-properties
+
+\section2 Basic property types
+
+QML supports properties of many types (see \l{QML Basic Types}). The basic types include \c int,
+\c real, \c bool, \c string and \c color.
 
 \code
 Item {
     x: 10.5             // a 'real' property
-    ...
     state: "details"    // a 'string' property
     focus: true         // a 'bool' property
+    ...
 }
 \endcode
 
@@ -183,31 +219,30 @@ Item {
 }
 \endcode
 
-\section3 The \c id property
+Note that with the exception of \l {Attached Properties}, properties always begin with a lowercase
+letter.
 
-Each object can be given a special unique property called an \e id. No other object within the
-same QML component (see \l{QML Documents}) can have the same \c id value. Assigning an id enables the object
-to be referred to by other objects and scripts.
 
-The first Rectangle element below has an \e id, "myRect". The second Rectangle element defines its
-own width by referring to \tt myRect.width, which means it will have the same \tt width
-value as the first Rectangle element.
+\section2 Property change notifications
 
-\code
-Item {
-    Rectangle {
-        id: myRect
-        width: 100
-        height: 100
-    }
-    Rectangle {
-        width: myRect.width
-        height: 200
-    }
+When a property changes value, it can send a signal to notify others of this change.
+
+To receive these signals, simply create a \e {signal handler} named with an \c on<Property>Changed
+syntax. For example, the \l Rectangle element has \l {Item::}{width} and \l {Rectangle::}{color}
+properties.  Below, we have a \l Rectangle object that has defined two signal handlers,
+\c onWidthChanged and \c onColorChanged, which will automaticallly be called whenever these
+properties are modified:
+
+\qml
+Rectangle {
+    width: 100; height: 100
+
+    onWidthChanged: console.log("Width has changed to:", width)
+    onColorChanged: console.log("Color has changed to:", color)
 }
-\endcode
+\endqml
 
-Note that an \e id must begin with a lower-case letter or an underscore, and cannot contain characters other than letters, numbers and underscores.
+Signal handlers are explained further \l {Signal Handlers}{below}.
 
 
 \section2 List properties
@@ -293,7 +328,9 @@ Some objects attach properties to another object.  Attached Properties
 are of the form \e {Type.property} where \e Type is the type of the
 element that attaches \e property.
 
-For example:
+For example, the \l ListView element attaches the \e ListView.isCurrentItem property
+to each delegate it creates:
+
 \code
 Component {
     id: myDelegate
@@ -307,9 +344,6 @@ ListView {
 }
 \endcode
 
-The \l ListView element attaches the \e ListView.isCurrentItem property
-to each delegate it creates.
-
 Another example of attached properties is the \l Keys element which
 attaches properties for handling key presses to
 any visual Item, for example:
@@ -321,27 +355,40 @@ Item {
 }
 \endcode
 
-\section2 Signal Handlers
+\section1 Signal Handlers
 
-Signal handlers allow actions to be taken in response to an event.  For instance,
-the \l MouseArea element has signal handlers to handle mouse press, release
-and click:
+Signal handlers allow JavaScript code to be executed in response to an event. For
+example, the \l MouseArea element has an \l {MouseArea::}{onClicked} handler that can
+be used to respond to a mouse click. Below, we use this handler to print a
+message whenever the mouse is clicked:
 
 \code
-MouseArea {
-    onPressed: console.log("mouse button pressed")
+Item {
+    width: 100; height: 100
+
+    MouseArea {
+        anchors.fill: parent
+        onClicked: {
+            console.log("mouse button clicked")
+        }
+    }
 }
 \endcode
 
 All signal handlers begin with \e "on".
 
-Some signal handlers include an optional parameter, for example
-the MouseArea onPressed signal handler has a \e mouse parameter:
+Some signal handlers include an optional parameter. For example
+the MouseArea \l{MouseArea::}{onPressed} signal handler has a \c mouse parameter
+that contains information about the mouse press. This parameter can be referred to in
+the JavaScript code, as below:
 
 \code
 MouseArea {
     acceptedButtons: Qt.LeftButton | Qt.RightButton
-    onPressed: if (mouse.button == Qt.RightButton) console.log("Right mouse button pressed")
+    onPressed: {
+        if (mouse.button == Qt.RightButton)
+            console.log("Right mouse button pressed")
+    }
 }
 \endcode
 
diff --git a/src/declarative/graphicsitems/qdeclarativeitem.cpp b/src/declarative/graphicsitems/qdeclarativeitem.cpp
index 24d9b03..922fa8f 100644
--- a/src/declarative/graphicsitems/qdeclarativeitem.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeitem.cpp
@@ -1333,23 +1333,6 @@ QDeclarativeKeysAttached *QDeclarativeKeysAttached::qmlAttachedProperties(QObjec
     }
     \endqml
 
-    \section1 Identity
-
-    Each item has an "id" - the identifier of the Item.
-
-    The identifier can be used in bindings and other expressions to
-    refer to the item. For example:
-
-    \qml
-    Text { id: myText; ... }
-    Text { text: myText.text }
-    \endqml
-
-    The identifier is available throughout to the \l {components}{component}
-    where it is declared.  The identifier must be unique in the component.
-
-    The id should not be thought of as a "property" - it makes no sense
-    to write \c myText.id, for example.
 
     \section1 Key Handling
 
@@ -1376,17 +1359,6 @@ QDeclarativeKeysAttached *QDeclarativeKeysAttached::qmlAttachedProperties(QObjec
     \endqml
 
     See the \l {Keys}{Keys} attached property for detailed documentation.
-
-    \section1 Property Change Signals
-
-    Most properties on Item and Item derivatives have a signal
-    emitted when they change. By convention, the signals are
-    named <propertyName>Changed, e.g. xChanged will be emitted when an item's
-    x property changes. Note that these also have signal handers e.g.
-    the onXChanged signal handler will be called when an item's x property
-    changes. For many properties in Item or Item derivatives this can be used
-    to add a touch of imperative logic to your application (when absolutely
-    necessary).
 */
 
 /*!
-- 
cgit v0.12


From 1d7b672fd46abab51a0124ad19aad18e5d14f1a8 Mon Sep 17 00:00:00 2001
From: Bea Lam <bea.lam@nokia.com>
Date: Thu, 6 Jan 2011 14:10:35 +1000
Subject: Update docs - calling overloaded functions from QML is now supported

---
 doc/src/declarative/qtbinding.qdoc | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/doc/src/declarative/qtbinding.qdoc b/doc/src/declarative/qtbinding.qdoc
index 04b8ca6..8ee7247 100644
--- a/doc/src/declarative/qtbinding.qdoc
+++ b/doc/src/declarative/qtbinding.qdoc
@@ -96,7 +96,7 @@ There are a number of ways to extend your QML application through C++. For examp
 \list
 \o Load a QML component and manipulate it (or its children) from C++
 \o Embed a C++ object and its properties directly into a QML component (for example, to make a
-particular C++ object callable from QML, or to replace a dummy list model data with a real data set)
+particular C++ object callable from QML, or to replace a dummy list model with a real data set)
 \o Define new QML elements (through QObject-based C++ classes) and create them directly from your
 QML code
 \endlist
@@ -297,17 +297,20 @@ methods on the \c myObject object, which has been set using QDeclarativeContext:
 \snippet doc/src/snippets/declarative/qtbinding/functions-cpp/main.cpp 0
 \endtable
 
-Note that QML does not support overloaded functions. If a C++ has more than one function with the
-same name, there is no guarantee which overloaded function will be called from QML.
+QML supports the calling of overloaded C++ functions. If there are multiple C++ functions with the
+same name but different arguments, the correct function will be called according to the number and
+the types of arguments that are provided.
 
 
 \section2 Receiving signals
 
 All QML signals are automatically available to C++, and can be connected to using QObject::connect()
-like any ordinary Qt C++ signal.
+like any ordinary Qt C++ signal. In return, any C++ signal can be received by a QML object using
+\l {Signal Handlers}{signal handlers}.
 
 Here is a QML component with a signal named \c qmlSignal. This signal is connected to a C++ object's
-slot using QObject::connect():
+slot using QObject::connect(), so that the \c cppSlot() method is called whenever the \c qmlSignal
+is emitted:
 
 \table
 \row
-- 
cgit v0.12


From 1ba3e41f09ea719249286fede5d3fe96621ccb61 Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Thu, 6 Jan 2011 15:48:52 +1000
Subject: PathView: update modelCount before attempting to regenerate
 delegates.

If the model is a VisualDataModel, the count will initally be zero
and modelCount is not updated due to itemsInserted() before the
component is completed.

Task-number: QTBUG-16357
Reviewed-by: Bea Lam
---
 .../graphicsitems/qdeclarativepathview.cpp         |  4 +++-
 .../declarative/qdeclarativepathview/data/vdm.qml  | 28 ++++++++++++++++++++++
 .../tst_qdeclarativepathview.cpp                   | 14 +++++++++++
 3 files changed, 45 insertions(+), 1 deletion(-)
 create mode 100644 tests/auto/declarative/qdeclarativepathview/data/vdm.qml

diff --git a/src/declarative/graphicsitems/qdeclarativepathview.cpp b/src/declarative/graphicsitems/qdeclarativepathview.cpp
index e3987d0..74d3418 100644
--- a/src/declarative/graphicsitems/qdeclarativepathview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativepathview.cpp
@@ -1318,8 +1318,10 @@ void QDeclarativePathView::componentComplete()
     // It is possible that a refill has already happended to to Path
     // bindings being handled in the componentComplete().  If so
     // don't do it again.
-    if (d->items.count() == 0)
+    if (d->items.count() == 0 && d->model) {
+        d->modelCount = d->model->count();
         d->regenerate();
+    }
     d->updateHighlight();
 }
 
diff --git a/tests/auto/declarative/qdeclarativepathview/data/vdm.qml b/tests/auto/declarative/qdeclarativepathview/data/vdm.qml
new file mode 100644
index 0000000..012db3f
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativepathview/data/vdm.qml
@@ -0,0 +1,28 @@
+import QtQuick 1.0
+
+PathView {
+    id: pathView
+    width: 240; height: 320
+
+    pathItemCount: 4
+    preferredHighlightBegin : 0.5
+    preferredHighlightEnd : 0.5
+
+    path: Path {
+        startX: 120; startY: 20;
+        PathLine { x: 120; y: 300 }
+    }
+
+    ListModel {
+        id: mo
+        ListElement { value: "one" }
+        ListElement { value: "two" }
+        ListElement { value: "three" }
+    }
+
+    model: VisualDataModel {
+        delegate: Text { text: model.value }
+        model : mo
+    }
+}
+
diff --git a/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp b/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp
index 9193707..90b1056 100644
--- a/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp
+++ b/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp
@@ -87,6 +87,7 @@ private slots:
     void emptyModel();
     void closed();
     void pathUpdate();
+    void visualDataModel();
 
 private:
     QDeclarativeView *createView();
@@ -839,6 +840,19 @@ void tst_QDeclarativePathView::pathUpdate()
     delete canvas;
 }
 
+void tst_QDeclarativePathView::visualDataModel()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/vdm.qml"));
+
+    QDeclarativePathView *obj = qobject_cast<QDeclarativePathView*>(c.create());
+    QVERIFY(obj != 0);
+
+    QCOMPARE(obj->count(), 3);
+
+    delete obj;
+}
+
 QDeclarativeView *tst_QDeclarativePathView::createView()
 {
     QDeclarativeView *canvas = new QDeclarativeView(0);
-- 
cgit v0.12


From 05b9137fe1974aa123ce6d9c16b733e1f77d8269 Mon Sep 17 00:00:00 2001
From: Martin Jones <martin.jones@nokia.com>
Date: Thu, 6 Jan 2011 16:57:06 +1000
Subject: PathView crashed when the path is provided with undefined values.

Task-number: QTBUG-16356
Reviewed-by: Bea Lam
---
 src/declarative/graphicsitems/qdeclarativepath.cpp      |  8 +++++++-
 .../qdeclarativepathview/data/undefinedpath.qml         | 17 +++++++++++++++++
 .../qdeclarativepathview/tst_qdeclarativepathview.cpp   | 14 ++++++++++++++
 3 files changed, 38 insertions(+), 1 deletion(-)
 create mode 100644 tests/auto/declarative/qdeclarativepathview/data/undefinedpath.qml

diff --git a/src/declarative/graphicsitems/qdeclarativepath.cpp b/src/declarative/graphicsitems/qdeclarativepath.cpp
index 966c51b..e63a2c3 100644
--- a/src/declarative/graphicsitems/qdeclarativepath.cpp
+++ b/src/declarative/graphicsitems/qdeclarativepath.cpp
@@ -46,6 +46,8 @@
 #include <QTime>
 
 #include <private/qbezier_p.h>
+#include <QtCore/qmath.h>
+#include <QtCore/qnumeric.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -367,9 +369,11 @@ void QDeclarativePath::createPointCache() const
 {
     Q_D(const QDeclarativePath);
     qreal pathLength = d->_path.length();
+    if (pathLength <= 0 || qIsNaN(pathLength))
+        return;
     // more points means less jitter between items as they move along the
     // path, but takes longer to generate
-    const int points = int(pathLength*5);
+    const int points = qCeil(pathLength*5);
     const int lastElement = d->_path.elementCount() - 1;
     d->_pointCache.resize(points+1);
 
@@ -418,6 +422,8 @@ QPointF QDeclarativePath::pointAt(qreal p) const
     Q_D(const QDeclarativePath);
     if (d->_pointCache.isEmpty()) {
         createPointCache();
+        if (d->_pointCache.isEmpty())
+            return QPointF();
     }
     int idx = qRound(p*d->_pointCache.size());
     if (idx >= d->_pointCache.size())
diff --git a/tests/auto/declarative/qdeclarativepathview/data/undefinedpath.qml b/tests/auto/declarative/qdeclarativepathview/data/undefinedpath.qml
new file mode 100644
index 0000000..5a647cb
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativepathview/data/undefinedpath.qml
@@ -0,0 +1,17 @@
+import QtQuick 1.0
+
+PathView {
+    id: pathView
+    width: 240; height: 200
+    path: Path {
+        startX: pathView.undef/2.0; startY: 0
+        PathLine { x: pathView.undef/2.0; y: 0 }
+    }
+
+    delegate: Text { text: value }
+    model: ListModel {
+        ListElement { value: "one" }
+        ListElement { value: "two" }
+        ListElement { value: "three" }
+    }
+}
diff --git a/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp b/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp
index 90b1056..bd8baab 100644
--- a/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp
+++ b/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp
@@ -88,6 +88,7 @@ private slots:
     void closed();
     void pathUpdate();
     void visualDataModel();
+    void undefinedPath();
 
 private:
     QDeclarativeView *createView();
@@ -853,6 +854,19 @@ void tst_QDeclarativePathView::visualDataModel()
     delete obj;
 }
 
+void tst_QDeclarativePathView::undefinedPath()
+{
+    QDeclarativeEngine engine;
+    QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/undefinedpath.qml"));
+
+    QDeclarativePathView *obj = qobject_cast<QDeclarativePathView*>(c.create());
+    QVERIFY(obj != 0);
+
+    QCOMPARE(obj->count(), 3);
+
+    delete obj;
+}
+
 QDeclarativeView *tst_QDeclarativePathView::createView()
 {
     QDeclarativeView *canvas = new QDeclarativeView(0);
-- 
cgit v0.12


From 48fdd3facb4d67b29452281c2d43577a2f0cdac3 Mon Sep 17 00:00:00 2001
From: Richard Moe Gustavsen <richard.gustavsen@nokia.com>
Date: Thu, 6 Jan 2011 09:44:22 +0100
Subject: Cocoa: add support for QEventLoop::ExcludeUserInputEvents

Seems like this was just missing when used together with the
DialogExec/EventLoopExec flags. This patch avoid using cocoas
own run methods for dispatching events when we want to
exclude user input events, and instead do it ourselves.

This patch will only fix this issue when no modal windows are
showing. For modal windows, a bit more research is needed.
---
 src/gui/kernel/qeventdispatcher_mac.mm | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/gui/kernel/qeventdispatcher_mac.mm b/src/gui/kernel/qeventdispatcher_mac.mm
index dc926e0..62c22a5 100644
--- a/src/gui/kernel/qeventdispatcher_mac.mm
+++ b/src/gui/kernel/qeventdispatcher_mac.mm
@@ -588,7 +588,10 @@ bool QEventDispatcherMac::processEvents(QEventLoop::ProcessEventsFlags flags)
         // manually (rather than from a QEventLoop), we cannot enter a tight
         // loop and block this call, but instead we need to return after one flush:
         const bool canExec_3rdParty = d->nsAppRunCalledByQt || ![NSApp isRunning];
-        const bool canExec_Qt = flags & QEventLoop::DialogExec || flags & QEventLoop::EventLoopExec;
+        const bool canExec_Qt =
+                (flags & QEventLoop::DialogExec || flags & QEventLoop::EventLoopExec)
+                && !(flags & QEventLoop::ExcludeUserInputEvents);
+
 
         if (canExec_Qt && canExec_3rdParty) {
             // We can use exec-mode, meaning that we can stay in a tight loop until
-- 
cgit v0.12


From bbf604d11d707f10337cab5b955388e95c180805 Mon Sep 17 00:00:00 2001
From: Niklas Kurkisuo <ext-niklas.kurkisuo@nokia.com>
Date: Thu, 6 Jan 2011 10:39:14 +0200
Subject: QHostInfoCache: Use QElapsedTime instead of QTime

Use QElapsedTime instead of QTime for performance gain. See QT-2965 for
more info.

Task-number: QTBUG-16468
Reviewed-by: Markus Goetz
---
 src/network/kernel/qhostinfo.cpp | 2 +-
 src/network/kernel/qhostinfo_p.h | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/network/kernel/qhostinfo.cpp b/src/network/kernel/qhostinfo.cpp
index c8fc45e..0c734d5 100644
--- a/src/network/kernel/qhostinfo.cpp
+++ b/src/network/kernel/qhostinfo.cpp
@@ -720,7 +720,7 @@ void QHostInfoCache::put(const QString &name, const QHostInfo &info)
 
     QHostInfoCacheElement* element = new QHostInfoCacheElement();
     element->info = info;
-    element->age = QTime();
+    element->age = QElapsedTimer();
     element->age.start();
 
     QMutexLocker locker(&this->mutex);
diff --git a/src/network/kernel/qhostinfo_p.h b/src/network/kernel/qhostinfo_p.h
index 134335f..80d8e14 100644
--- a/src/network/kernel/qhostinfo_p.h
+++ b/src/network/kernel/qhostinfo_p.h
@@ -66,7 +66,7 @@
 #include "QtCore/qrunnable.h"
 #include "QtCore/qlist.h"
 #include "QtCore/qqueue.h"
-#include <QTime>
+#include <QElapsedTimer>
 #include <QCache>
 
 
@@ -132,7 +132,7 @@ private:
     bool enabled;
     struct QHostInfoCacheElement {
         QHostInfo info;
-        QTime age;
+        QElapsedTimer age;
     };
     QCache<QString,QHostInfoCacheElement> cache;
     QMutex mutex;
-- 
cgit v0.12


From c5efe77d3051424db631fc9aa54cee1f735bceb8 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Thu, 6 Jan 2011 13:16:37 +0100
Subject: tst_qscriptclass: backport test from the v8 branch

From commit 4e39278225
Add test coverage to match 4.7 behaviour regarding original properties
---
 tests/auto/qscriptclass/tst_qscriptclass.cpp | 246 +++++++++++++++++++++++++++
 1 file changed, 246 insertions(+)

diff --git a/tests/auto/qscriptclass/tst_qscriptclass.cpp b/tests/auto/qscriptclass/tst_qscriptclass.cpp
index 20d62b4..12ee178 100644
--- a/tests/auto/qscriptclass/tst_qscriptclass.cpp
+++ b/tests/auto/qscriptclass/tst_qscriptclass.cpp
@@ -69,6 +69,10 @@ private slots:
     void getProperty_invalidValue();
     void enumerate();
     void extension();
+    void originalProperties1();
+    void originalProperties2();
+    void originalProperties3();
+    void originalProperties4();
     void defaultImplementations();
 };
 
@@ -1050,6 +1054,248 @@ void tst_QScriptClass::extension()
     }
 }
 
+// tests made to match Qt 4.7 (JSC) behaviour
+void tst_QScriptClass::originalProperties1()
+{
+    QScriptEngine eng;
+
+    QScriptString orig1 = eng.toStringHandle("orig1");
+    QScriptString orig2 = eng.toStringHandle("orig2");
+    QScriptString orig3 = eng.toStringHandle("orig3");
+    QScriptString new1 = eng.toStringHandle("new1");
+    QScriptString new2 = eng.toStringHandle("new2");
+
+    {
+        TestClass cls1(&eng);
+        cls1.addCustomProperty(orig2, QScriptClass::HandlesReadAccess | QScriptClass::HandlesWriteAccess, 1, 0, 89);
+        cls1.addCustomProperty(new1, QScriptClass::HandlesReadAccess | QScriptClass::HandlesWriteAccess, 1, 0, "hello");
+
+        TestClass cls2(&eng);
+        cls2.addCustomProperty(orig2, QScriptClass::HandlesReadAccess | QScriptClass::HandlesWriteAccess, 1, 0, 59);
+        cls2.addCustomProperty(new2, QScriptClass::HandlesReadAccess | QScriptClass::HandlesWriteAccess, 1, 0, "world");
+
+        QScriptValue obj1 = eng.newObject();
+        obj1.setProperty(orig1 , 42);
+        obj1.setProperty(orig2 , "foo");
+        obj1.prototype().setProperty(orig3, "bar");
+
+        QCOMPARE(obj1.property(orig1).toInt32(), 42);
+        QCOMPARE(obj1.property(orig2).toString(), QString::fromLatin1("foo"));
+        QCOMPARE(obj1.property(orig3).toString(), QString::fromLatin1("bar"));
+        QVERIFY(!obj1.property(new1).isValid());
+        QVERIFY(!obj1.property(new2).isValid());
+
+        eng.globalObject().setProperty("obj" , obj1);
+
+        obj1.setScriptClass(&cls1);
+        QCOMPARE(obj1.property(orig1).toInt32(), 42);
+        QCOMPARE(obj1.property(orig2).toString(), QString::fromLatin1("foo"));
+        QCOMPARE(obj1.property(orig3).toString(), QString::fromLatin1("bar"));
+        QCOMPARE(obj1.property(new1).toString(), QString::fromLatin1("hello"));
+        QVERIFY(!obj1.property(new2).isValid());
+
+        QScriptValue obj2 = eng.evaluate("obj");
+        QCOMPARE(obj2.scriptClass(), &cls1);
+        QCOMPARE(obj2.property(orig1).toInt32(), 42);
+        QCOMPARE(obj2.property(orig2).toString(), QString::fromLatin1("foo"));
+        QCOMPARE(obj2.property(orig3).toString(), QString::fromLatin1("bar"));
+        QCOMPARE(obj2.property(new1).toString(), QString::fromLatin1("hello"));
+        QVERIFY(!obj2.property(new2).isValid());
+
+        obj1.setScriptClass(&cls2);
+        QCOMPARE(obj1.property(orig1).toInt32(), 42);
+        QCOMPARE(obj1.property(orig2).toString(), QString::fromLatin1("foo"));
+        QCOMPARE(obj1.property(orig3).toString(), QString::fromLatin1("bar"));
+        QVERIFY(!obj1.property(new1).isValid());
+        QCOMPARE(obj1.property(new2).toString(), QString::fromLatin1("world"));
+
+        QCOMPARE(obj2.scriptClass(), &cls2);
+        QCOMPARE(obj2.property(orig1).toInt32(), 42);
+        QCOMPARE(obj2.property(orig2).toString(), QString::fromLatin1("foo"));
+        QCOMPARE(obj2.property(orig3).toString(), QString::fromLatin1("bar"));
+        QVERIFY(!obj2.property(new1).isValid());
+        QCOMPARE(obj2.property(new2).toString(), QString::fromLatin1("world"));
+
+        obj1.setScriptClass(0);
+        QCOMPARE(obj1.property(orig1).toInt32(), 42);
+        QCOMPARE(obj1.property(orig2).toString(), QString::fromLatin1("foo"));
+        QCOMPARE(obj1.property(orig3).toString(), QString::fromLatin1("bar"));
+        QVERIFY(!obj1.property(new1).isValid());
+        QVERIFY(!obj1.property(new2).isValid());
+    }
+}
+
+void tst_QScriptClass::originalProperties2()
+{
+    QScriptEngine eng;
+
+    QScriptString orig1 = eng.toStringHandle("orig1");
+    QScriptString orig2 = eng.toStringHandle("orig2");
+    QScriptString orig3 = eng.toStringHandle("orig3");
+    QScriptString new1 = eng.toStringHandle("new1");
+    QScriptString new2 = eng.toStringHandle("new2");
+
+    {
+        TestClass cls1(&eng);
+        cls1.addCustomProperty(orig2, QScriptClass::HandlesReadAccess | QScriptClass::HandlesWriteAccess, 1, 0, 89);
+        cls1.addCustomProperty(new1, QScriptClass::HandlesReadAccess | QScriptClass::HandlesWriteAccess, 1, 0, "hello");
+
+        TestClass cls2(&eng);
+        cls2.addCustomProperty(orig2, QScriptClass::HandlesReadAccess | QScriptClass::HandlesWriteAccess, 1, 0, 59);
+        cls2.addCustomProperty(new2, QScriptClass::HandlesReadAccess | QScriptClass::HandlesWriteAccess, 1, 0, "world");
+
+        QScriptValue obj1 = eng.newObject();
+        obj1.setProperty(orig1 , 42);
+        obj1.setProperty(orig2 , "foo");
+        obj1.prototype().setProperty(orig3, "bar");
+
+        QCOMPARE(obj1.property(orig1).toInt32(), 42);
+        QCOMPARE(obj1.property(orig2).toString(), QString::fromLatin1("foo"));
+        QCOMPARE(obj1.property(orig3).toString(), QString::fromLatin1("bar"));
+        QVERIFY(!obj1.property(new1).isValid());
+        QVERIFY(!obj1.property(new2).isValid());
+
+        obj1.setScriptClass(&cls1);
+        obj1.setProperty(orig1 , QScriptValue(&eng, 852));
+        obj1.setProperty(orig2 , "oli");
+        obj1.setProperty(orig3 , "fu*c");
+        obj1.setProperty(new1 , "moo");
+        obj1.setProperty(new2 , "allo?");
+        QCOMPARE(obj1.property(orig1).toInt32(), 852);
+        QCOMPARE(obj1.property(orig2).toString(), QString::fromLatin1("foo"));
+        QCOMPARE(obj1.property(orig3).toString(), QString::fromLatin1("fu*c"));
+        QCOMPARE(obj1.property(new1).toString(), QString::fromLatin1("moo"));
+        QCOMPARE(obj1.property(new2).toString(), QString::fromLatin1("allo?"));
+
+        obj1.setScriptClass(&cls2);
+        QCOMPARE(obj1.property(orig1).toInt32(), 852);
+        QCOMPARE(obj1.property(orig2).toString(), QString::fromLatin1("foo"));
+        QCOMPARE(obj1.property(orig3).toString(), QString::fromLatin1("fu*c"));
+        QVERIFY(!obj1.property(new1).isValid());
+        QCOMPARE(obj1.property(new2).toString(), QString::fromLatin1("allo?"));
+
+        obj1.setScriptClass(0);
+        QCOMPARE(obj1.property(orig1).toInt32(), 852);
+        QCOMPARE(obj1.property(orig2).toString(), QString::fromLatin1("foo"));
+        QCOMPARE(obj1.property(orig3).toString(), QString::fromLatin1("fu*c"));
+        QVERIFY(!obj1.property(new1).isValid());
+        QCOMPARE(obj1.property(new2).toString(), QString::fromLatin1("allo?"));
+    }
+}
+
+void tst_QScriptClass::originalProperties3()
+{
+    QScriptEngine eng;
+
+    QScriptString orig1 = eng.toStringHandle("orig1");
+    QScriptString orig2 = eng.toStringHandle("orig2");
+    QScriptString orig3 = eng.toStringHandle("orig3");
+    QScriptString new1 = eng.toStringHandle("new1");
+    QScriptString new2 = eng.toStringHandle("new2");
+
+    {
+        TestClass cls1(&eng);
+        cls1.addCustomProperty(orig2, QScriptClass::HandlesReadAccess | QScriptClass::HandlesWriteAccess, 1, 0, 89);
+        cls1.addCustomProperty(new1, QScriptClass::HandlesReadAccess | QScriptClass::HandlesWriteAccess, 1, 0, "hello");
+
+        TestClass cls2(&eng);
+        cls2.addCustomProperty(orig2, QScriptClass::HandlesReadAccess | QScriptClass::HandlesWriteAccess, 1, 0, 59);
+        cls2.addCustomProperty(new2, QScriptClass::HandlesReadAccess | QScriptClass::HandlesWriteAccess, 1, 0, "world");
+
+        QScriptValue obj1 = eng.newObject(&cls1);
+        QVERIFY(!obj1.property(orig1).isValid());
+        QCOMPARE(obj1.property(orig2).toInt32(), 89);
+        QCOMPARE(obj1.property(new1).toString(), QString::fromLatin1("hello"));
+        QVERIFY(!obj1.property(new2).isValid());
+        obj1.setProperty(orig1, 42);
+        QCOMPARE(obj1.property(orig1).toInt32(), 42);
+
+        eng.globalObject().setProperty("obj" , obj1);
+        obj1.setScriptClass(&cls2);
+        QCOMPARE(obj1.property(orig1).toInt32(), 42);
+        QCOMPARE(obj1.property(orig2).toInt32(), 59);
+        QVERIFY(!obj1.property(new1).isValid());
+        QCOMPARE(obj1.property(new2).toString(), QString::fromLatin1("world"));
+
+        QScriptValue obj2 = eng.evaluate("obj");
+        QCOMPARE(obj2.scriptClass(), &cls2);
+        QCOMPARE(obj2.property(orig1).toInt32(), 42);
+        QCOMPARE(obj2.property(orig2).toInt32(), 59);
+        QVERIFY(!obj2.property(new1).isValid());
+        QCOMPARE(obj2.property(new2).toString(), QString::fromLatin1("world"));
+
+        obj1.setScriptClass(0);
+        QCOMPARE(obj1.property(orig1).toInt32(), 42);
+        QVERIFY(!obj1.property(orig2).isValid());
+        QVERIFY(!obj1.property(new1).isValid());
+        QVERIFY(!obj1.property(new2).isValid());
+
+        QCOMPARE(obj2.scriptClass(), (QScriptClass *)0);
+        QCOMPARE(obj2.property(orig1).toInt32(), 42);
+        QVERIFY(!obj2.property(orig2).isValid());
+        QVERIFY(!obj2.property(new1).isValid());
+        QVERIFY(!obj2.property(new2).isValid());
+    }
+}
+
+void tst_QScriptClass::originalProperties4()
+{
+    QScriptEngine eng;
+
+    QScriptString orig1 = eng.toStringHandle("orig1");
+    QScriptString orig2 = eng.toStringHandle("orig2");
+    QScriptString orig3 = eng.toStringHandle("orig3");
+    QScriptString new1 = eng.toStringHandle("new1");
+    QScriptString new2 = eng.toStringHandle("new2");
+
+    {
+        TestClass cls1(&eng);
+        cls1.addCustomProperty(orig2, QScriptClass::HandlesReadAccess | QScriptClass::HandlesWriteAccess, 1, 0, 89);
+        cls1.addCustomProperty(new1, QScriptClass::HandlesReadAccess | QScriptClass::HandlesWriteAccess, 1, 0, "hello");
+
+        TestClass cls2(&eng);
+        cls2.addCustomProperty(orig2, QScriptClass::HandlesReadAccess | QScriptClass::HandlesWriteAccess, 1, 0, 59);
+        cls2.addCustomProperty(new2, QScriptClass::HandlesReadAccess | QScriptClass::HandlesWriteAccess, 1, 0, "world");
+
+        QScriptValue obj1 = eng.newObject(&cls1);
+        QVERIFY(!obj1.property(orig1).isValid());
+        QCOMPARE(obj1.property(orig2).toInt32(), 89);
+        QCOMPARE(obj1.property(new1).toString(), QString::fromLatin1("hello"));
+        QVERIFY(!obj1.property(new2).isValid());
+
+        eng.globalObject().setProperty("obj" , obj1);
+
+        obj1.setScriptClass(0);
+        QVERIFY(obj1.isObject());
+        QVERIFY(!obj1.property(orig1).isValid());
+        QVERIFY(!obj1.property(orig2).isValid());
+        QVERIFY(!obj1.property(new1).isValid());
+        QVERIFY(!obj1.property(new2).isValid());
+        obj1.setProperty(orig1, 42);
+        QCOMPARE(obj1.property(orig1).toInt32(), 42);
+
+        QScriptValue obj2 = eng.evaluate("obj");
+        QCOMPARE(obj2.scriptClass(), (QScriptClass *)0);
+        QVERIFY(obj2.isObject());
+        QCOMPARE(obj2.property(orig1).toInt32(), 42);
+        QVERIFY(!obj2.property(orig2).isValid());
+        QVERIFY(!obj2.property(new1).isValid());
+        QVERIFY(!obj2.property(new2).isValid());
+
+        obj1.setScriptClass(&cls2);
+        QCOMPARE(obj1.property(orig1).toInt32(), 42);
+        QCOMPARE(obj1.property(orig2).toInt32(), 59);
+        QVERIFY(!obj1.property(new1).isValid());
+        QCOMPARE(obj1.property(new2).toString(), QString::fromLatin1("world"));
+
+        QCOMPARE(obj2.scriptClass(), (QScriptClass *)(&cls2));
+        QCOMPARE(obj2.property(orig1).toInt32(), 42);
+        QCOMPARE(obj2.property(orig2).toInt32(), 59);
+        QVERIFY(!obj2.property(new1).isValid());
+        QCOMPARE(obj2.property(new2).toString(), QString::fromLatin1("world"));
+    }
+}
+
 void tst_QScriptClass::defaultImplementations()
 {
     QScriptEngine eng;
-- 
cgit v0.12


From 18447df1d021cfed69472b867cb7593401be27a6 Mon Sep 17 00:00:00 2001
From: Jiang Jiang <jiang.jiang@nokia.com>
Date: Wed, 5 Jan 2011 19:39:00 +0100
Subject: Make application font family names locale sensitive in X11

So that they will match the family names returned by
QFontDatabase::families. Because the family names returned
by FcFreeTypeQueryFace are not sorted with locale as the
names returned by FcFontList, we have to find out the
family name matching the system language in the former case.

Task-number: QTBUG-14269
Reviewed-by: Eskil
---
 src/gui/text/qfontdatabase.cpp     |  3 +++
 src/gui/text/qfontdatabase_x11.cpp | 23 +++++++++++++++++++++--
 2 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp
index bae2a20..ec94de9 100644
--- a/src/gui/text/qfontdatabase.cpp
+++ b/src/gui/text/qfontdatabase.cpp
@@ -664,6 +664,9 @@ public:
     }
 
     int count;
+#if defined(Q_WS_X11) && !defined(QT_NO_FONTCONFIG)
+    QString systemLang;
+#endif
     QtFontFamily **families;
 
     struct ApplicationFont {
diff --git a/src/gui/text/qfontdatabase_x11.cpp b/src/gui/text/qfontdatabase_x11.cpp
index 635d2cf..c67558b 100644
--- a/src/gui/text/qfontdatabase_x11.cpp
+++ b/src/gui/text/qfontdatabase_x11.cpp
@@ -1018,6 +1018,13 @@ static void loadFontConfig()
     QFontDatabasePrivate *db = privateDb();
     FcFontSet  *fonts;
 
+    FcPattern *pattern = FcPatternCreate();
+    FcDefaultSubstitute(pattern);
+    FcChar8 *lang = 0;
+    if (FcPatternGetString(pattern, FC_LANG, 0, &lang) == FcResultMatch)
+        db->systemLang = QString::fromUtf8((const char *) lang);
+    FcPatternDestroy(pattern);
+
     QString familyName;
     FcChar8 *value = 0;
     int weight_value;
@@ -2037,6 +2044,7 @@ static void registerFont(QFontDatabasePrivate::ApplicationFont *fnt)
     int count = 0;
 
     QStringList families;
+    QFontDatabasePrivate *db = privateDb();
 
     FcPattern *pattern = 0;
     do {
@@ -2048,8 +2056,19 @@ static void registerFont(QFontDatabasePrivate::ApplicationFont *fnt)
         FcPatternDel(pattern, FC_FILE);
         FcPatternAddString(pattern, FC_FILE, (const FcChar8 *)fnt->fileName.toUtf8().constData());
 
-        FcChar8 *fam = 0;
-        if (FcPatternGetString(pattern, FC_FAMILY, 0, &fam) == FcResultMatch) {
+        FcChar8 *fam = 0, *familylang = 0;
+        int i, n = 0;
+        for (i = 0; ; i++) {
+            if (FcPatternGetString(pattern, FC_FAMILYLANG, i, &familylang) != FcResultMatch)
+                break;
+            QString familyLang = QString::fromUtf8((const char *) familylang);
+            if (familyLang.compare(db->systemLang, Qt::CaseInsensitive) == 0) {
+                n = i;
+                break;
+            }
+        }
+
+        if (FcPatternGetString(pattern, FC_FAMILY, n, &fam) == FcResultMatch) {
             QString family = QString::fromUtf8(reinterpret_cast<const char *>(fam));
             families << family;
         }
-- 
cgit v0.12


From 5c3010cf467d437ccfc8a263bed167e979614504 Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Thu, 6 Jan 2011 14:01:53 +0100
Subject: qkeymapper_x11.cpp: fix compilation with LSB and without XKB

Task-number: QTBUG-16312
Reviewed-by: Marius Storm-Olsen
---
 src/gui/kernel/qkeymapper_x11.cpp | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/src/gui/kernel/qkeymapper_x11.cpp b/src/gui/kernel/qkeymapper_x11.cpp
index 825edbc..e085d11 100644
--- a/src/gui/kernel/qkeymapper_x11.cpp
+++ b/src/gui/kernel/qkeymapper_x11.cpp
@@ -61,13 +61,6 @@
 
 #include <ctype.h>
 
-QT_BEGIN_NAMESPACE
-
-#ifndef QT_NO_XKB
-
-// bring in the auto-generated xkbLayoutData
-#include "qkeymapper_x11_p.cpp"
-
 #ifdef QT_LINUXBASE
 // LSB's IsKeypadKey define is wrong - see
 // http://bugs.linuxbase.org/show_bug.cgi?id=2521
@@ -80,6 +73,13 @@ QT_BEGIN_NAMESPACE
       (((KeySym)(keysym) >= 0x11000000) && ((KeySym)(keysym) <= 0x1100FFFF))
 #endif
 
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_XKB
+
+// bring in the auto-generated xkbLayoutData
+#include "qkeymapper_x11_p.cpp"
+
 QLocale q_getKeyboardLocale(const QByteArray &layoutName, const QByteArray &variantName)
 {
     int i = 0;
@@ -92,7 +92,6 @@ QLocale q_getKeyboardLocale(const QByteArray &layoutName, const QByteArray &vari
 }
 #endif // QT_NO_XKB
 
-
 // from qapplication_x11.cpp
 extern uchar qt_alt_mask;
 extern uchar qt_meta_mask;
-- 
cgit v0.12


From 91596c9c08208690894ec11a3a99eac57ad17f2b Mon Sep 17 00:00:00 2001
From: Olivier Goffart <olivier.goffart@nokia.com>
Date: Thu, 6 Jan 2011 14:51:04 +0100
Subject: QUrl::setUrl should call detach

Task-number: QTBUG-16425
Reviewed-by: Gabriel
Reviewed-by: Markus Goetz
---
 src/corelib/io/qurl.cpp      | 1 +
 tests/auto/qurl/tst_qurl.cpp | 8 ++++++++
 2 files changed, 9 insertions(+)

diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp
index 6a3037d..45f908d 100644
--- a/src/corelib/io/qurl.cpp
+++ b/src/corelib/io/qurl.cpp
@@ -4262,6 +4262,7 @@ void QUrl::setUrl(const QString &url)
 */
 void QUrl::setUrl(const QString &url, ParsingMode parsingMode)
 {
+    detach();
     // escape all reserved characters and delimiters
     // reserved      = gen-delims / sub-delims
     if (parsingMode != TolerantMode) {
diff --git a/tests/auto/qurl/tst_qurl.cpp b/tests/auto/qurl/tst_qurl.cpp
index 63f9721..4354ffb 100644
--- a/tests/auto/qurl/tst_qurl.cpp
+++ b/tests/auto/qurl/tst_qurl.cpp
@@ -675,6 +675,14 @@ void tst_QUrl::setUrl()
         QCOMPARE(url.encodedPath().constData(), "text/javascript,d5%20%3D%20'five%5Cu0027s'%3B");
     }
 
+    { //check it calls detach
+        QUrl u1("http://aaa.com");
+        QUrl u2 = u1;
+        u2.setUrl("http://bbb.com");
+        QCOMPARE(u1.host(), QString::fromLatin1("aaa.com"));
+        QCOMPARE(u2.host(), QString::fromLatin1("bbb.com"));
+    }
+
 /*
    The tests below are copied from kdelibs/kdecore/tests/kurltest.cpp (an old version of)
 
-- 
cgit v0.12


From 6d331b6ee7711cde2bf9adc1a584a45875c07983 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Thu, 6 Jan 2011 15:34:48 +0100
Subject: Designer: Block QEvent::WinIdChange.

As it causes an obscure deletion crash related to
the formeditor rubberband on Mac.

Reviewed-by: con
---
 tools/designer/src/components/formeditor/formwindowmanager.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tools/designer/src/components/formeditor/formwindowmanager.cpp b/tools/designer/src/components/formeditor/formwindowmanager.cpp
index ce809ff..ed854cf 100644
--- a/tools/designer/src/components/formeditor/formwindowmanager.cpp
+++ b/tools/designer/src/components/formeditor/formwindowmanager.cpp
@@ -192,6 +192,7 @@ bool FormWindowManager::eventFilter(QObject *o, QEvent *e)
     case QEvent::ToolTip:
     case QEvent::WhatsThis:
     case QEvent::WhatsThisClicked:
+    case QEvent::WinIdChange:
     case QEvent::DynamicPropertyChange:
     case QEvent::HoverEnter:
     case QEvent::HoverLeave:
-- 
cgit v0.12


From 66cfe2a776b7542fe1d8bae9c0d7bb5be79406fd Mon Sep 17 00:00:00 2001
From: Shane Kearns <shane.kearns@accenture.com>
Date: Thu, 6 Jan 2011 15:16:03 +0000
Subject: Fix KERN-EXEC 0 panic on exit when bearer is searching for WLANs

The access point scanner cancels itself in the destructor.
This requires the handle to be valid, but it was closed in the symbian
engine destructor immediately before deleting the AP scanner.
Because of the way symbian active objects work, the crashing function
is only called if there was an asynchronous request in progress.
So it could be missed in cases where the scan completes faster than the
test case.

Task-number: QTBUG-16484
Reviewed-by: Markus Goetz
---
 src/plugins/bearer/symbian/symbianengine.cpp | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/plugins/bearer/symbian/symbianengine.cpp b/src/plugins/bearer/symbian/symbianengine.cpp
index f025d86..a370d78 100644
--- a/src/plugins/bearer/symbian/symbianengine.cpp
+++ b/src/plugins/bearer/symbian/symbianengine.cpp
@@ -144,6 +144,10 @@ SymbianEngine::~SymbianEngine()
 {
     Cancel();
 
+    //The scanner may be using the connection monitor so it needs to be
+    //deleted first while the handle is still valid.
+    delete ipAccessPointsAvailabilityScanner;
+
     iConnectionMonitor.CancelNotifications();
     iConnectionMonitor.Close();
     
@@ -151,8 +155,6 @@ SymbianEngine::~SymbianEngine()
     iCmManager.Close();
 #endif
     
-    delete ipAccessPointsAvailabilityScanner;
-
     // CCommsDatabase destructor uses cleanup stack. Since QNetworkConfigurationManager
     // is a global static, but the time we are here, E32Main() has been exited already and
     // the thread's default cleanup stack has been deleted. Without this line, a
-- 
cgit v0.12


From e185e5f008f6852bd7a79d74262717c8e377b918 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Wed, 5 Jan 2011 08:25:56 +0100
Subject: Restored old flushing behavior in -graphicssystem opengl on desktop.

Change 284211ccbd2cbd recently introduced a fix for EGL, to prevent
flushing when nothing has been rendered into the back buffer. However,
the skip should only be done when there's no partial update support in
the window surface. If there is partial update support we can still
flush as usual.

Reviewed-by: Gunnar Sletta
---
 src/opengl/qwindowsurface_gl.cpp | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/opengl/qwindowsurface_gl.cpp b/src/opengl/qwindowsurface_gl.cpp
index b8716ce..7243f02 100644
--- a/src/opengl/qwindowsurface_gl.cpp
+++ b/src/opengl/qwindowsurface_gl.cpp
@@ -520,9 +520,10 @@ void QGLWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoint &
 
     // did_paint is set to true in ::beginPaint. ::beginPaint means that we
     // at least cleared the background (= painted something). In EGL API it's a
-    // mistakte to call swapBuffers if nothing was painted. This check protects
-    // the flush func from being executed if it's for nothing.
-    if (!d_ptr->did_paint)
+    // mistake to call swapBuffers if nothing was painted unless
+    // EGL_BUFFER_PRESERVED is set. This check protects the flush func from
+    // being executed if it's for nothing.
+    if (!hasPartialUpdateSupport() && !d_ptr->did_paint)
         return;
 
     QWidget *parent = widget->internalWinId() ? widget : widget->nativeParentWidget();
-- 
cgit v0.12


From 84658ec4e650b12dcea6f886b530e66a195465cf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <samuel.rodal@nokia.com>
Date: Thu, 6 Jan 2011 13:09:14 +0100
Subject: Fixed bug and performance problem in windowsstyle.

QImage::fill(Qt::transparent) pre-4.8 is a bug, also using Format_ARGB32
is very unoptimal compared to Format_ARGB32_Premultiplied.

Task-number: QTBUG-16439
Reviewed-by: Eskil Abrahamsen Blomfeldt
---
 src/gui/styles/qwindowsstyle.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/gui/styles/qwindowsstyle.cpp b/src/gui/styles/qwindowsstyle.cpp
index 32a6d8d..4144b80 100644
--- a/src/gui/styles/qwindowsstyle.cpp
+++ b/src/gui/styles/qwindowsstyle.cpp
@@ -1395,8 +1395,8 @@ void QWindowsStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt,
             if (!QPixmapCache::find(pixmapName, pixmap)) {
                 int border = size/5;
                 int sqsize = 2*(size/2);
-                QImage image(sqsize, sqsize, QImage::Format_ARGB32);
-                image.fill(Qt::transparent);
+                QImage image(sqsize, sqsize, QImage::Format_ARGB32_Premultiplied);
+                image.fill(0);
                 QPainter imagePainter(&image);
 
                 QPolygon a;
-- 
cgit v0.12


From 5780ff75c1e63322f3edd6158c08f1d944919cce Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@nokia.com>
Date: Fri, 7 Jan 2011 08:47:51 +0100
Subject: QmlViewer: Remove unused class variables

---
 tools/qml/qmlruntime.h | 2 --
 1 file changed, 2 deletions(-)

diff --git a/tools/qml/qmlruntime.h b/tools/qml/qmlruntime.h
index b43aa54..a70ffc9 100644
--- a/tools/qml/qmlruntime.h
+++ b/tools/qml/qmlruntime.h
@@ -188,8 +188,6 @@ private:
     ScriptOptions m_scriptOptions;
     QDeclarativeTester *tester;
 
-    QNetworkReply *wgtreply;
-    QString wgtdir;
     NetworkAccessManagerFactory *namFactory;
 
     bool useQmlFileBrowser;
-- 
cgit v0.12


From dc11a951d30ce1c668550ab5e7b487f00cca7f1a Mon Sep 17 00:00:00 2001
From: Christian Kandeler <christian.kandeler@nokia.com>
Date: Fri, 7 Jan 2011 11:56:33 +0100
Subject: Assistant: Don't tabify "Open Pages" dock widget by default.

The user is likely to always want to see it plus one of the others.
---
 tools/assistant/tools/assistant/mainwindow.cpp | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/tools/assistant/tools/assistant/mainwindow.cpp b/tools/assistant/tools/assistant/mainwindow.cpp
index d7d01da..d6b9e24 100644
--- a/tools/assistant/tools/assistant/mainwindow.cpp
+++ b/tools/assistant/tools/assistant/mainwindow.cpp
@@ -106,7 +106,7 @@ MainWindow::MainWindow(CmdLineParser *cmdLine, QWidget *parent)
     TRACE_OBJ
 
     setToolButtonStyle(Qt::ToolButtonFollowStyle);
-    setDockOptions(ForceTabbedDocks); // Has no effect; Qt bug?
+    setDockOptions(dockOptions() | AllowNestedDocks);
 
     QString collectionFile;
     if (usesDefaultCollection()) {
@@ -218,8 +218,7 @@ MainWindow::MainWindow(CmdLineParser *cmdLine, QWidget *parent)
     } else {
         tabifyDockWidget(contentDock, indexDock);
         tabifyDockWidget(indexDock, bookmarkDock);
-        tabifyDockWidget(bookmarkDock, openPagesDock);
-        tabifyDockWidget(openPagesDock, searchDock);
+        tabifyDockWidget(bookmarkDock, searchDock);
         contentDock->raise();
         const QRect screen = QApplication::desktop()->screenGeometry();
         resize(4*screen.width()/5, 4*screen.height()/5);
-- 
cgit v0.12


From 9fd43b8bc40e3b7657dc7eba2dccff95f0d0077a Mon Sep 17 00:00:00 2001
From: Christian Kandeler <christian.kandeler@nokia.com>
Date: Fri, 7 Jan 2011 14:03:52 +0100
Subject: Assistant: Fix warnings.

---
 .../tools/assistant/bookmarkfiltermodel.cpp        | 37 +++++++++++-----------
 tools/assistant/tools/assistant/mainwindow.cpp     |  5 +--
 2 files changed, 19 insertions(+), 23 deletions(-)

diff --git a/tools/assistant/tools/assistant/bookmarkfiltermodel.cpp b/tools/assistant/tools/assistant/bookmarkfiltermodel.cpp
index fe510a5..d60e537 100644
--- a/tools/assistant/tools/assistant/bookmarkfiltermodel.cpp
+++ b/tools/assistant/tools/assistant/bookmarkfiltermodel.cpp
@@ -54,25 +54,24 @@ void BookmarkFilterModel::setSourceModel(QAbstractItemModel *_sourceModel)
 {
     beginResetModel();
 
-    disconnect(sourceModel, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this,
-        SLOT(changed(QModelIndex, QModelIndex)));
-
-    disconnect(sourceModel, SIGNAL(rowsInserted(QModelIndex, int, int)),
-        this, SLOT(rowsInserted(QModelIndex, int, int)));
-
-    disconnect(sourceModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)),
-        this, SLOT(rowsAboutToBeRemoved(QModelIndex, int, int)));
-    disconnect(sourceModel, SIGNAL(rowsRemoved(QModelIndex, int, int)), this,
-        SLOT(rowsRemoved(QModelIndex, int, int)));
-
-    disconnect(sourceModel, SIGNAL(layoutAboutToBeChanged()), this,
-        SLOT(layoutAboutToBeChanged()));
-    disconnect(sourceModel, SIGNAL(layoutChanged()), this,
-        SLOT(layoutChanged()));
-
-    disconnect(sourceModel, SIGNAL(modelAboutToBeReset()), this,
-        SLOT(modelAboutToBeReset()));
-    disconnect(sourceModel, SIGNAL(modelReset()), this, SLOT(modelReset()));
+    if (sourceModel) {
+        disconnect(sourceModel, SIGNAL(dataChanged(QModelIndex, QModelIndex)),
+            this, SLOT(changed(QModelIndex, QModelIndex)));
+        disconnect(sourceModel, SIGNAL(rowsInserted(QModelIndex, int, int)),
+            this, SLOT(rowsInserted(QModelIndex, int, int)));
+        disconnect(sourceModel,
+            SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), this,
+            SLOT(rowsAboutToBeRemoved(QModelIndex, int, int)));
+        disconnect(sourceModel, SIGNAL(rowsRemoved(QModelIndex, int, int)),
+            this, SLOT(rowsRemoved(QModelIndex, int, int)));
+        disconnect(sourceModel, SIGNAL(layoutAboutToBeChanged()), this,
+            SLOT(layoutAboutToBeChanged()));
+        disconnect(sourceModel, SIGNAL(layoutChanged()), this,
+            SLOT(layoutChanged()));
+        disconnect(sourceModel, SIGNAL(modelAboutToBeReset()), this,
+            SLOT(modelAboutToBeReset()));
+        disconnect(sourceModel, SIGNAL(modelReset()), this, SLOT(modelReset()));
+    }
 
     QAbstractProxyModel::setSourceModel(sourceModel);
     sourceModel = qobject_cast<BookmarkModel*> (_sourceModel);
diff --git a/tools/assistant/tools/assistant/mainwindow.cpp b/tools/assistant/tools/assistant/mainwindow.cpp
index d6b9e24..7852104 100644
--- a/tools/assistant/tools/assistant/mainwindow.cpp
+++ b/tools/assistant/tools/assistant/mainwindow.cpp
@@ -199,6 +199,7 @@ MainWindow::MainWindow(CmdLineParser *cmdLine, QWidget *parent)
     }
 
     QToolBar *toolBar = addToolBar(tr("Bookmark Toolbar"));
+    toolBar->setObjectName(QLatin1String("Bookmark Toolbar"));
     bookMarkManager->setBookmarksToolbar(toolBar);
 
     // Show the widget here, otherwise the restore geometry and state won't work
@@ -459,10 +460,6 @@ void MainWindow::setupActions()
     menu->addAction(globalActions->printAction());
     menu->addSeparator();
 
-    m_closeTabAction = menu->addAction(tr("&Close Tab"), m_centralWidget,
-        SLOT(closeTab()));
-    m_closeTabAction->setShortcuts(QKeySequence::Close);
-
     QIcon appExitIcon = QIcon::fromTheme("application-exit");
     QAction *tmp;
 #ifdef Q_OS_WIN
-- 
cgit v0.12


From 33379f4a8b27ee37321c4e51f0d2f75f0eedd854 Mon Sep 17 00:00:00 2001
From: aavit <qt-info@nokia.com>
Date: Fri, 7 Jan 2011 16:47:04 +0100
Subject: Added api for efficient data driven baseline testing

---
 tests/arthur/common/qbaselinetest.cpp              | 133 ++++++++++++++++-----
 tests/arthur/common/qbaselinetest.h                |  13 ++
 tests/auto/baselineexample/tst_baselineexample.cpp |  50 +++-----
 3 files changed, 133 insertions(+), 63 deletions(-)

diff --git a/tests/arthur/common/qbaselinetest.cpp b/tests/arthur/common/qbaselinetest.cpp
index e95b510..79241d5 100644
--- a/tests/arthur/common/qbaselinetest.cpp
+++ b/tests/arthur/common/qbaselinetest.cpp
@@ -44,56 +44,45 @@
 
 namespace QBaselineTest {
 
+BaselineProtocol proto;
 bool connected = false;
 bool triedConnecting = false;
-BaselineProtocol proto;
-
 
-bool checkImage(const QImage& img, const char *name, quint16 checksum, QByteArray *msg, bool *error)
-{
-    QByteArray itemName;
-    bool hasName = qstrlen(name);
-    const char *tag = QTest::currentDataTag();
-    if (qstrlen(tag)) {
-        itemName = tag;
-        if (hasName)
-            itemName.append('_').append(name);
-    } else {
-        itemName = hasName ? name : "default_name";
-    }
+QByteArray curFunction;
+ImageItemList itemList;
+bool gotBaselines;
 
-    *msg = "Baseline check of image '" + itemName + "': ";
 
+bool connect(QByteArray *msg, bool *error)
+{
     if (!triedConnecting) {
         triedConnecting = true;
         if (!proto.connect(QTest::testObject()->metaObject()->className())) {
             *msg += "Failed to connect to baseline server: " + proto.errorMessage().toLatin1();
             *error = true;
-            return true;
+            return false;
         }
         connected = true;
     }
     if (!connected) {
         *msg = "Not connected to baseline server.";
         *error = true;
-        return true;
+        return false;
     }
+    return true;
+}
 
-    ImageItem item;
-    item.itemName = QLatin1String(itemName);
-    item.itemChecksum = checksum;
-    item.testFunction = QLatin1String(QTest::currentTestFunction());
-    ImageItemList list;
-    list.append(item);
-    if (!proto.requestBaselineChecksums(QLatin1String(QTest::currentTestFunction()), &list) || list.isEmpty()) {
-        *msg = "Communication with baseline server failed: " + proto.errorMessage().toLatin1();
-        *error = true;
-        return true;
-    }
+
+bool compareItem(const ImageItem &baseline, const QImage &img, QByteArray *msg, bool *error)
+{
+    ImageItem item = baseline;
     item.image = img;
+    item.imageChecksums.clear();
     item.imageChecksums.prepend(ImageItem::computeChecksum(img));
     QByteArray srvMsg;
-    switch (list.at(0).status) {
+    switch (baseline.status) {
+    case ImageItem::Ok:
+        break;
     case ImageItem::IgnoreItem :
         qDebug() << msg->constData() << "Ignored, blacklisted on server.";
         return true;
@@ -105,8 +94,6 @@ bool checkImage(const QImage& img, const char *name, quint16 checksum, QByteArra
             qDebug() << msg->constData() << "Baseline not found on server. Uploading of new baseline failed:" << srvMsg;
         return true;
         break;
-    case ImageItem::Ok:
-        break;
     default:
         qWarning() << "Unexpected reply from baseline server.";
         return true;
@@ -114,11 +101,93 @@ bool checkImage(const QImage& img, const char *name, quint16 checksum, QByteArra
     }
     *error = false;
     // The actual comparison of the given image with the baseline:
-    if (list.at(0).imageChecksums.contains(item.imageChecksums.at(0)))
+    if (baseline.imageChecksums.contains(item.imageChecksums.at(0)))
         return true;
     proto.submitMismatch(item, &srvMsg);
     *msg += "Mismatch. See report:\n   " + srvMsg;
     return false;
 }
 
+bool checkImage(const QImage &img, const char *name, quint16 checksum, QByteArray *msg, bool *error)
+{
+    if (!connected && !connect(msg, error))
+        return true;
+
+    QByteArray itemName;
+    bool hasName = qstrlen(name);
+    const char *tag = QTest::currentDataTag();
+    if (qstrlen(tag)) {
+        itemName = tag;
+        if (hasName)
+            itemName.append('_').append(name);
+    } else {
+        itemName = hasName ? name : "default_name";
+    }
+
+    *msg = "Baseline check of image '" + itemName + "': ";
+
+
+    ImageItem item;
+    item.itemName = QString::fromLatin1(itemName);
+    item.itemChecksum = checksum;
+    item.testFunction = QString::fromLatin1(QTest::currentTestFunction());
+    ImageItemList list;
+    list.append(item);
+    if (!proto.requestBaselineChecksums(QLatin1String(QTest::currentTestFunction()), &list) || list.isEmpty()) {
+        *msg = "Communication with baseline server failed: " + proto.errorMessage().toLatin1();
+        *error = true;
+        return true;
+    }
+
+    return compareItem(list.at(0), img, msg, error);
+}
+
+
+QTestData &newRow(const char *dataTag, quint16 checksum)
+{
+    if (QTest::currentTestFunction() != curFunction) {
+        curFunction = QTest::currentTestFunction();
+        itemList.clear();
+        gotBaselines = false;
+    }
+    ImageItem item;
+    item.itemName = QString::fromLatin1(dataTag);
+    item.itemChecksum = checksum;
+    item.testFunction = QString::fromLatin1(QTest::currentTestFunction());
+    itemList.append(item);
+
+    return QTest::newRow(dataTag);
+}
+
+
+bool testImage(const QImage& img, QByteArray *msg, bool *error)
+{
+    if (!connected && !connect(msg, error))
+        return true;
+
+    if (QTest::currentTestFunction() != curFunction || itemList.isEmpty()) {
+        qWarning() << "Usage error: QBASELINE_TEST used without corresponding QBaselineTest::newRow()";
+        return true;
+    }
+
+    if (!gotBaselines) {
+        if (!proto.requestBaselineChecksums(QString::fromLatin1(QTest::currentTestFunction()), &itemList) || itemList.isEmpty()) {
+            *msg = "Communication with baseline server failed: " + proto.errorMessage().toLatin1();
+            *error = true;
+            return true;
+        }
+        gotBaselines = true;
+    }
+
+    QString curTag = QString::fromLatin1(QTest::currentDataTag());
+    ImageItemList::const_iterator it = itemList.constBegin();
+    while (it != itemList.constEnd() && it->itemName != curTag)
+        ++it;
+    if (it == itemList.constEnd()) {
+        qWarning() << "Usage error: QBASELINE_TEST used without corresponding QBaselineTest::newRow() for row" << curTag;
+        return true;
+    }
+    return compareItem(*it, img, msg, error);
+}
+
 }
diff --git a/tests/arthur/common/qbaselinetest.h b/tests/arthur/common/qbaselinetest.h
index 3445c72..e27cda2 100644
--- a/tests/arthur/common/qbaselinetest.h
+++ b/tests/arthur/common/qbaselinetest.h
@@ -46,6 +46,8 @@
 
 namespace QBaselineTest {
 bool checkImage(const QImage& img, const char *name, quint16 checksum, QByteArray *msg, bool *error);
+bool testImage(const QImage& img, QByteArray *msg, bool *error);
+QTestData &newRow(const char *dataTag, quint16 checksum = 0);
 }
 
 #define QBASELINE_CHECK_SUM(image, name, checksum)\
@@ -61,4 +63,15 @@ do {\
 
 #define QBASELINE_CHECK(image, name) QBASELINE_CHECK_SUM(image, name, 0)
 
+#define QBASELINE_TEST(image)\
+do {\
+    QByteArray _msg;\
+    bool _err = false;\
+    if (!QBaselineTest::testImage((image), &_msg, &_err)) {\
+        QFAIL(_msg.constData());\
+    } else if (_err) {\
+        QSKIP(_msg.constData(), SkipSingle);\
+    }\
+} while (0)
+
 #endif // BASELINETEST_H
diff --git a/tests/auto/baselineexample/tst_baselineexample.cpp b/tests/auto/baselineexample/tst_baselineexample.cpp
index 28cbec5..b97cc63 100644
--- a/tests/auto/baselineexample/tst_baselineexample.cpp
+++ b/tests/auto/baselineexample/tst_baselineexample.cpp
@@ -54,10 +54,8 @@ private Q_SLOTS:
     void testMultipleImages();
     void testDataDriven_data();
     void testDataDriven();
-    void testDataDrivenMultiple_data();
-    void testDataDrivenMultiple();
-    void testChecksum_data();
-    void testChecksum();
+    void testDataDrivenChecksum_data();
+    void testDataDrivenChecksum();
 };
 
 
@@ -98,9 +96,11 @@ void tst_BaselineExample::testMultipleImages()
 void tst_BaselineExample::testDataDriven_data()
 {
     QTest::addColumn<QString>("label");
-    QTest::newRow("short") << "Ok!";
-    QTest::newRow("long") << "A really long button text that just does not seem to end";
-    QTest::newRow("empty") << "";
+    QBaselineTest::newRow("short") << "Ok!";
+    QBaselineTest::newRow("long") << "A really long button text that just does not seem to end";
+    QBaselineTest::newRow("empty") << "";
+    QBaselineTest::newRow("signs") << "!@#$%^&*()_";
+    QBaselineTest::newRow("html") << "<b>BOLD</b>";
 }
 
 
@@ -111,45 +111,33 @@ void tst_BaselineExample::testDataDriven()
     b.resize(100, 50);
     b.show();
     QTest::qWaitForWindowShown(&b);
-    QBASELINE_CHECK(QPixmap::grabWidget(&b).toImage(), 0);
+    QBASELINE_TEST(QPixmap::grabWidget(&b).toImage());
 }
 
 
-void tst_BaselineExample::testDataDrivenMultiple_data()
+void tst_BaselineExample::testDataDrivenChecksum_data()
 {
-    testDataDriven_data();
-}
-
-
-void tst_BaselineExample::testDataDrivenMultiple()
-{
-    QFETCH(QString, label);
-    QPushButton b(label);
-    b.resize(100, 50);
-    b.show();
-    QTest::qWaitForWindowShown(&b);
-    QBASELINE_CHECK(QPixmap::grabWidget(&b).toImage(), "normal");
-
-    b.setText(label.prepend('&'));
-    QTest::qWait(50);
-    QBASELINE_CHECK(QPixmap::grabWidget(&b).toImage(), "shortcut");
-}
+    QTest::addColumn<QString>("label");
 
+    const int numItems = 5;
+    const char *tags[numItems] = {"short", "long", "empty", "signs", "html"};
+    const char *labels[numItems] = {"Ok!", "A really long button text that just does not seem to end", "", "!@#$%^&*()_", "<b>BOLD</b>"};
 
-void tst_BaselineExample::testChecksum_data()
-{
-    testDataDriven_data();
+    for (int i = 0; i<numItems; i++) {
+        quint16 checksum = qChecksum(labels[i], qstrlen(labels[i]));
+        QBaselineTest::newRow(tags[i], checksum) << labels[i];
+    }
 }
 
 
-void tst_BaselineExample::testChecksum()
+void tst_BaselineExample::testDataDrivenChecksum()
 {
     QFETCH(QString, label);
     QPushButton b(label);
     b.resize(100, 50);
     b.show();
     QTest::qWaitForWindowShown(&b);
-    QBASELINE_CHECK_SUM(QPixmap::grabWidget(&b).toImage(), 0, quint16(qHash(label)));
+    QBASELINE_TEST(QPixmap::grabWidget(&b).toImage());
 }
 
 
-- 
cgit v0.12


From 9a6cfc07e5ab21460cd85dbe6ac1f6de62c69524 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= <joao.abecasis@nokia.com>
Date: Wed, 5 Jan 2011 15:24:50 +0100
Subject: Check elapsed time only once

Task-number: QTBUG-16262
Reviewed-by: Bradley T. Hughes
---
 src/corelib/thread/qsemaphore.cpp | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/corelib/thread/qsemaphore.cpp b/src/corelib/thread/qsemaphore.cpp
index 8e8a88a..15f45b6 100644
--- a/src/corelib/thread/qsemaphore.cpp
+++ b/src/corelib/thread/qsemaphore.cpp
@@ -223,8 +223,9 @@ bool QSemaphore::tryAcquire(int n, int timeout)
         QElapsedTimer timer;
         timer.start();
         while (n > d->avail) {
-            if (timer.hasExpired(timeout)
-                || !d->cond.wait(locker.mutex(), timeout - timer.elapsed()))
+            const qint64 elapsed = timer.elapsed();
+            if (timeout - elapsed > 0
+                || !d->cond.wait(locker.mutex(), timeout - elapsed))
                 return false;
         }
     }
-- 
cgit v0.12


From 1638129ccbe9680a41859dc48d063a63ae103b1a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= <joao.abecasis@nokia.com>
Date: Thu, 6 Jan 2011 17:16:20 +0100
Subject: Fix compilation error on Solaris

d_type in dirent is a non-standard extension to POSIX available on some
platforms (namely BSDs, Mac, Linux, Symbian).

Taking the conservative approach and using this information only on
platforms known to support it.

Reviewed-by: Shane Kearns
---
 src/corelib/io/qfilesystemengine.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/corelib/io/qfilesystemengine.cpp b/src/corelib/io/qfilesystemengine.cpp
index d9d802e..9446ebb 100644
--- a/src/corelib/io/qfilesystemengine.cpp
+++ b/src/corelib/io/qfilesystemengine.cpp
@@ -289,6 +289,9 @@ void QFileSystemMetaData::fillFromStatBuf(const QT_STATBUF &statBuffer)
 
 void QFileSystemMetaData::fillFromDirEnt(const QT_DIRENT &entry)
 {
+#if defined(_DIRENT_HAVE_D_TYPE) || defined(Q_OS_BSD4) || defined(Q_OS_SYMBIAN)
+    // BSD4 includes Mac OS X
+
     // ### This will clear all entry flags and knownFlagsMask
     switch (entry.d_type)
     {
@@ -344,6 +347,9 @@ void QFileSystemMetaData::fillFromDirEnt(const QT_DIRENT &entry)
     default:
         clear();
     }
+#else
+    Q_UNUSED(entry)
+#endif
 }
 
 #endif
-- 
cgit v0.12


From 6e3ae781a7bd3b5ae2143ef60f969d89663508e3 Mon Sep 17 00:00:00 2001
From: miniak <milan.burda@gmail.com>
Date: Fri, 7 Jan 2011 19:16:33 +0100
Subject: Add /DYNAMICBASE /NXCOMPAT to linker options in Visual Studio 2005
 and higher

Native Win32 C++ projects created in Visual Studio have this enabled in the default configuration in order to increase security.

Merge-request: 2539
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
---
 mkspecs/win32-msvc2005/qmake.conf | 2 +-
 mkspecs/win32-msvc2008/qmake.conf | 2 +-
 mkspecs/win32-msvc2010/qmake.conf | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/mkspecs/win32-msvc2005/qmake.conf b/mkspecs/win32-msvc2005/qmake.conf
index 0c79561..63bef80 100644
--- a/mkspecs/win32-msvc2005/qmake.conf
+++ b/mkspecs/win32-msvc2005/qmake.conf
@@ -53,7 +53,7 @@ QMAKE_RUN_CXX_IMP       = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ $<
 QMAKE_RUN_CXX_IMP_BATCH = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ @<<
 
 QMAKE_LINK              = link
-QMAKE_LFLAGS            = /NOLOGO \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\"
+QMAKE_LFLAGS            = /NOLOGO /DYNAMICBASE /NXCOMPAT \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\"
 QMAKE_LFLAGS_RELEASE    = /INCREMENTAL:NO
 QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF
 QMAKE_LFLAGS_DEBUG      = /DEBUG
diff --git a/mkspecs/win32-msvc2008/qmake.conf b/mkspecs/win32-msvc2008/qmake.conf
index 24a0486..9f9c919 100644
--- a/mkspecs/win32-msvc2008/qmake.conf
+++ b/mkspecs/win32-msvc2008/qmake.conf
@@ -55,7 +55,7 @@ QMAKE_RUN_CXX_IMP       = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ $<
 QMAKE_RUN_CXX_IMP_BATCH = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ @<<
 
 QMAKE_LINK              = link
-QMAKE_LFLAGS            = /NOLOGO \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\"
+QMAKE_LFLAGS            = /NOLOGO /DYNAMICBASE /NXCOMPAT \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\"
 QMAKE_LFLAGS_RELEASE    = /INCREMENTAL:NO
 QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF
 QMAKE_LFLAGS_DEBUG      = /DEBUG
diff --git a/mkspecs/win32-msvc2010/qmake.conf b/mkspecs/win32-msvc2010/qmake.conf
index c08a74d..9471034 100644
--- a/mkspecs/win32-msvc2010/qmake.conf
+++ b/mkspecs/win32-msvc2010/qmake.conf
@@ -55,7 +55,7 @@ QMAKE_RUN_CXX_IMP       = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ $<
 QMAKE_RUN_CXX_IMP_BATCH = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ @<<
 
 QMAKE_LINK              = link
-QMAKE_LFLAGS            = /NOLOGO \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\"
+QMAKE_LFLAGS            = /NOLOGO /DYNAMICBASE /NXCOMPAT \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\"
 QMAKE_LFLAGS_RELEASE    = /INCREMENTAL:NO
 QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF
 QMAKE_LFLAGS_DEBUG      = /DEBUG
-- 
cgit v0.12


From 0faab4442040fdfe3790e3c02808fd45993f0265 Mon Sep 17 00:00:00 2001
From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>
Date: Mon, 10 Jan 2011 10:25:42 +0100
Subject: Compile when qreal != double

Compile fix for devices where qreals are floats.

Reviewed-by: Fabien Freling
---
 src/gui/text/qtextdocumentlayout.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/gui/text/qtextdocumentlayout.cpp b/src/gui/text/qtextdocumentlayout.cpp
index 22c6b8c..c0f3fb4 100644
--- a/src/gui/text/qtextdocumentlayout.cpp
+++ b/src/gui/text/qtextdocumentlayout.cpp
@@ -2513,7 +2513,7 @@ static inline void getLineHeightParams(const QTextBlockFormat &blockFormat, cons
     if (blockFormat.lineHeightType() == QTextBlockFormat::FixedHeight || blockFormat.lineHeightType() == QTextBlockFormat::MinimumHeight) {
         *lineBreakHeight = *lineHeight;
         if (blockFormat.lineHeightType() == QTextBlockFormat::FixedHeight)
-            *lineAdjustment = QFixed::fromReal(line.ascent() + qMax(line.leading(), 0.0)) - ((*lineHeight * 4) / 5);
+            *lineAdjustment = QFixed::fromReal(line.ascent() + qMax(line.leading(), qreal(0.0))) - ((*lineHeight * 4) / 5);
         else
             *lineAdjustment = QFixed::fromReal(line.height()) - *lineHeight;
     }
-- 
cgit v0.12


From 13370ead4e9184fd82c08c060dbb1ea29a51cc7c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= <joao.abecasis@nokia.com>
Date: Mon, 10 Jan 2011 12:39:16 +0100
Subject: Fix reversed condition introduced in 9a6cfc07e5

Reviewed-by: Bradley T. Hughes
---
 src/corelib/thread/qsemaphore.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/corelib/thread/qsemaphore.cpp b/src/corelib/thread/qsemaphore.cpp
index 15f45b6..5fa41f1 100644
--- a/src/corelib/thread/qsemaphore.cpp
+++ b/src/corelib/thread/qsemaphore.cpp
@@ -224,7 +224,7 @@ bool QSemaphore::tryAcquire(int n, int timeout)
         timer.start();
         while (n > d->avail) {
             const qint64 elapsed = timer.elapsed();
-            if (timeout - elapsed > 0
+            if (timeout - elapsed <= 0
                 || !d->cond.wait(locker.mutex(), timeout - elapsed))
                 return false;
         }
-- 
cgit v0.12


From 89886a34d7c4fdacc472f6e1498bc0769f2302ad Mon Sep 17 00:00:00 2001
From: Mark Brand <mabrand@mabrand.nl>
Date: Mon, 10 Jan 2011 16:41:54 +0100
Subject: qmake: fix double directory separator

Merge-request: 2543
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
---
 qmake/generators/unix/unixmake2.cpp | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/qmake/generators/unix/unixmake2.cpp b/qmake/generators/unix/unixmake2.cpp
index 7c68316..009d4b5 100644
--- a/qmake/generators/unix/unixmake2.cpp
+++ b/qmake/generators/unix/unixmake2.cpp
@@ -1353,8 +1353,13 @@ UnixMakefileGenerator::pkgConfigFileName(bool fixify)
     if(dot != -1)
         ret = ret.left(dot);
     ret += Option::pkgcfg_ext;
-    if(!project->isEmpty("QMAKE_PKGCONFIG_DESTDIR"))
-        ret.prepend(project->first("QMAKE_PKGCONFIG_DESTDIR") + Option::dir_sep);
+    QString subdir = project->first("QMAKE_PKGCONFIG_DESTDIR");
+    if(!subdir.isEmpty()) {
+        // initOutPaths() appends dir_sep, but just to be safe..
+        if (!subdir.endsWith(Option::dir_sep))
+            ret.prepend(Option::dir_sep);
+        ret.prepend(subdir);
+    }
     if(fixify) {
         if(QDir::isRelativePath(ret) && !project->isEmpty("DESTDIR"))
             ret.prepend(project->first("DESTDIR"));
-- 
cgit v0.12


From 95646b07968604aa69f7e367dab7c9966dc44772 Mon Sep 17 00:00:00 2001
From: Mark Brand <mabrand@mabrand.nl>
Date: Mon, 10 Jan 2011 16:41:55 +0100
Subject: qmake: don't limit pkg-config writing to unix generator

Move pkg-config related methods from unix generator to base class
so they can be used by other generators too.

Merge-request: 2543
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
---
 qmake/generators/makefile.cpp       | 178 ++++++++++++++++++++++++++++++++++++
 qmake/generators/makefile.h         |   5 +
 qmake/generators/unix/unixmake.h    |   4 -
 qmake/generators/unix/unixmake2.cpp | 178 ------------------------------------
 4 files changed, 183 insertions(+), 182 deletions(-)

diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp
index 9579ae4..e18c9b5 100644
--- a/qmake/generators/makefile.cpp
+++ b/qmake/generators/makefile.cpp
@@ -3123,4 +3123,182 @@ MakefileGenerator::openOutput(QFile &file, const QString &build) const
     return false;
 }
 
+QString
+MakefileGenerator::pkgConfigFileName(bool fixify)
+{
+    QString ret = var("TARGET");
+    int slsh = ret.lastIndexOf(Option::dir_sep);
+    if(slsh != -1)
+        ret = ret.right(ret.length() - slsh - 1);
+    if(ret.startsWith("lib"))
+        ret = ret.mid(3);
+    int dot = ret.indexOf('.');
+    if(dot != -1)
+        ret = ret.left(dot);
+    ret += Option::pkgcfg_ext;
+    QString subdir = project->first("QMAKE_PKGCONFIG_DESTDIR");
+    if(!subdir.isEmpty()) {
+        // initOutPaths() appends dir_sep, but just to be safe..
+        if (!subdir.endsWith(Option::dir_sep))
+            ret.prepend(Option::dir_sep);
+        ret.prepend(subdir);
+    }
+    if(fixify) {
+        if(QDir::isRelativePath(ret) && !project->isEmpty("DESTDIR"))
+            ret.prepend(project->first("DESTDIR"));
+        ret = Option::fixPathToLocalOS(fileFixify(ret, qmake_getpwd(), Option::output_dir));
+    }
+    return ret;
+}
+
+QString
+MakefileGenerator::pkgConfigPrefix() const
+{
+    if(!project->isEmpty("QMAKE_PKGCONFIG_PREFIX"))
+        return project->first("QMAKE_PKGCONFIG_PREFIX");
+    return QLibraryInfo::location(QLibraryInfo::PrefixPath);
+}
+
+QString
+MakefileGenerator::pkgConfigFixPath(QString path) const
+{
+    QString prefix = pkgConfigPrefix();
+    if(path.startsWith(prefix))
+        path = path.replace(prefix, "${prefix}");
+    return path;
+}
+
+void
+MakefileGenerator::writePkgConfigFile()
+{
+    QString fname = pkgConfigFileName(), lname = fname;
+    mkdir(fileInfo(fname).path());
+    int slsh = lname.lastIndexOf(Option::dir_sep);
+    if(slsh != -1)
+        lname = lname.right(lname.length() - slsh - 1);
+    QFile ft(fname);
+    if(!ft.open(QIODevice::WriteOnly))
+        return;
+    project->values("ALL_DEPS").append(fileFixify(fname));
+    QTextStream t(&ft);
+
+    QString prefix = pkgConfigPrefix();
+    QString libDir = project->first("QMAKE_PKGCONFIG_LIBDIR");
+    if(libDir.isEmpty())
+        libDir = prefix + Option::dir_sep + "lib" + Option::dir_sep;
+    QString includeDir = project->first("QMAKE_PKGCONFIG_INCDIR");
+    if(includeDir.isEmpty())
+        includeDir = prefix + "/include";
+
+    t << "prefix=" << prefix << endl;
+    t << "exec_prefix=${prefix}\n"
+      << "libdir=" << pkgConfigFixPath(libDir) << "\n"
+      << "includedir=" << pkgConfigFixPath(includeDir) << endl;
+    // non-standard entry. Provides useful info normally only
+    // contained in the internal .qmake.cache file
+    t << varGlue("CONFIG", "qt_config=", " ", "") << endl;
+
+    //extra PKGCONFIG variables
+    const QStringList &pkgconfig_vars = project->values("QMAKE_PKGCONFIG_VARIABLES");
+    for(int i = 0; i < pkgconfig_vars.size(); ++i) {
+        QString var = project->first(pkgconfig_vars.at(i) + ".name"),
+                val = project->values(pkgconfig_vars.at(i) + ".value").join(" ");
+        if(var.isEmpty())
+            continue;
+        if(val.isEmpty()) {
+            const QStringList &var_vars = project->values(pkgconfig_vars.at(i) + ".variable");
+            for(int v = 0; v < var_vars.size(); ++v) {
+                const QStringList &vars = project->values(var_vars.at(v));
+                for(int var = 0; var < vars.size(); ++var) {
+                    if(!val.isEmpty())
+                        val += " ";
+                    val += pkgConfigFixPath(vars.at(var));
+                }
+            }
+        }
+        t << var << "=" << val << endl;
+    }
+
+    t << endl;
+
+    QString name = project->first("QMAKE_PKGCONFIG_NAME");
+    if(name.isEmpty()) {
+        name = project->first("QMAKE_ORIG_TARGET").toLower();
+        name.replace(0, 1, name[0].toUpper());
+    }
+    t << "Name: " << name << endl;
+    QString desc = project->values("QMAKE_PKGCONFIG_DESCRIPTION").join(" ");
+    if(desc.isEmpty()) {
+        if(name.isEmpty()) {
+            desc = project->first("QMAKE_ORIG_TARGET").toLower();
+            desc.replace(0, 1, desc[0].toUpper());
+        } else {
+            desc = name;
+        }
+        if(project->first("TEMPLATE") == "lib") {
+            if(project->isActiveConfig("plugin"))
+               desc += " Plugin";
+            else
+               desc += " Library";
+        } else if(project->first("TEMPLATE") == "app") {
+            desc += " Application";
+        }
+    }
+    t << "Description: " << desc << endl;
+    t << "Version: " << project->first("VERSION") << endl;
+
+    // libs
+    t << "Libs: ";
+    QString pkgConfiglibDir;
+    QString pkgConfiglibName;
+    if (Option::target_mode == Option::TARG_MACX_MODE && project->isActiveConfig("lib_bundle")) {
+        pkgConfiglibDir = "-F${libdir}";
+        QString bundle;
+        if (!project->isEmpty("QMAKE_FRAMEWORK_BUNDLE_NAME"))
+            bundle = unescapeFilePath(project->first("QMAKE_FRAMEWORK_BUNDLE_NAME"));
+        else
+            bundle = unescapeFilePath(project->first("TARGET"));
+        int suffix = bundle.lastIndexOf(".framework");
+        if (suffix != -1)
+            bundle = bundle.left(suffix);
+        pkgConfiglibName = "-framework " + bundle + " ";
+    } else {
+        pkgConfiglibDir = "-L${libdir}";
+        pkgConfiglibName = "-l" + lname.left(lname.length()-Option::libtool_ext.length());
+    }
+    t << pkgConfiglibDir << " " << pkgConfiglibName << " " << endl;
+
+    QStringList libs;
+    if(!project->isEmpty("QMAKE_INTERNAL_PRL_LIBS")) {
+        libs = project->values("QMAKE_INTERNAL_PRL_LIBS");
+    } else {
+        libs << "QMAKE_LIBS"; //obvious one
+    }
+    libs << "QMAKE_LIBS_PRIVATE";
+    libs << "QMAKE_LFLAGS_THREAD"; //not sure about this one, but what about things like -pthread?
+    t << "Libs.private: ";
+    for(QStringList::ConstIterator it = libs.begin(); it != libs.end(); ++it) {
+        t << project->values((*it)).join(" ") << " ";
+    }
+    t << endl;
+
+    // flags
+    // ### too many
+    t << "Cflags: "
+        // << var("QMAKE_CXXFLAGS") << " "
+      << varGlue("PRL_EXPORT_DEFINES","-D"," -D"," ")
+      << project->values("PRL_EXPORT_CXXFLAGS").join(" ")
+      << project->values("QMAKE_PKGCONFIG_CFLAGS").join(" ")
+        //      << varGlue("DEFINES","-D"," -D"," ")
+      << " -I${includedir}" << endl;
+
+    // requires
+    const QString requires = project->values("QMAKE_PKGCONFIG_REQUIRES").join(" ");
+    if (!requires.isEmpty()) {
+        t << "Requires: " << requires << endl;
+    }
+
+    t << endl;
+}
+
 QT_END_NAMESPACE
diff --git a/qmake/generators/makefile.h b/qmake/generators/makefile.h
index 4c3be3d..fe611b2 100644
--- a/qmake/generators/makefile.h
+++ b/qmake/generators/makefile.h
@@ -105,6 +105,11 @@ protected:
     virtual bool writeStubMakefile(QTextStream &t);
     virtual bool writeMakefile(QTextStream &t);
 
+    QString pkgConfigPrefix() const;
+    QString pkgConfigFileName(bool fixify=true);
+    QString pkgConfigFixPath(QString) const;
+    void writePkgConfigFile();   // for pkg-config
+
     //generating subtarget makefiles
     struct SubTarget
     {
diff --git a/qmake/generators/unix/unixmake.h b/qmake/generators/unix/unixmake.h
index 0ea3350..f017672 100644
--- a/qmake/generators/unix/unixmake.h
+++ b/qmake/generators/unix/unixmake.h
@@ -51,10 +51,6 @@ class UnixMakefileGenerator : public MakefileGenerator
     bool init_flag, include_deps;
     QString libtoolFileName(bool fixify=true);
     void writeLibtoolFile();     // for libtool
-    QString pkgConfigPrefix() const;
-    QString pkgConfigFileName(bool fixify=true);
-    QString pkgConfigFixPath(QString) const;
-    void writePkgConfigFile();   // for pkg-config
     void writePrlFile(QTextStream &);
 
 public:
diff --git a/qmake/generators/unix/unixmake2.cpp b/qmake/generators/unix/unixmake2.cpp
index 009d4b5..1ea9e30 100644
--- a/qmake/generators/unix/unixmake2.cpp
+++ b/qmake/generators/unix/unixmake2.cpp
@@ -1340,182 +1340,4 @@ UnixMakefileGenerator::writeLibtoolFile()
         "libdir='" << Option::fixPathToTargetOS(install_dir, false) << "'\n";
 }
 
-QString
-UnixMakefileGenerator::pkgConfigFileName(bool fixify)
-{
-    QString ret = var("TARGET");
-    int slsh = ret.lastIndexOf(Option::dir_sep);
-    if(slsh != -1)
-        ret = ret.right(ret.length() - slsh - 1);
-    if(ret.startsWith("lib"))
-        ret = ret.mid(3);
-    int dot = ret.indexOf('.');
-    if(dot != -1)
-        ret = ret.left(dot);
-    ret += Option::pkgcfg_ext;
-    QString subdir = project->first("QMAKE_PKGCONFIG_DESTDIR");
-    if(!subdir.isEmpty()) {
-        // initOutPaths() appends dir_sep, but just to be safe..
-        if (!subdir.endsWith(Option::dir_sep))
-            ret.prepend(Option::dir_sep);
-        ret.prepend(subdir);
-    }
-    if(fixify) {
-        if(QDir::isRelativePath(ret) && !project->isEmpty("DESTDIR"))
-            ret.prepend(project->first("DESTDIR"));
-        ret = Option::fixPathToLocalOS(fileFixify(ret, qmake_getpwd(), Option::output_dir));
-    }
-    return ret;
-}
-
-QString
-UnixMakefileGenerator::pkgConfigPrefix() const
-{
-    if(!project->isEmpty("QMAKE_PKGCONFIG_PREFIX"))
-        return project->first("QMAKE_PKGCONFIG_PREFIX");
-    return QLibraryInfo::location(QLibraryInfo::PrefixPath);
-}
-
-QString
-UnixMakefileGenerator::pkgConfigFixPath(QString path) const
-{
-    QString prefix = pkgConfigPrefix();
-    if(path.startsWith(prefix))
-        path = path.replace(prefix, "${prefix}");
-    return path;
-}
-
-void
-UnixMakefileGenerator::writePkgConfigFile()
-{
-    QString fname = pkgConfigFileName(), lname = fname;
-    mkdir(fileInfo(fname).path());
-    int slsh = lname.lastIndexOf(Option::dir_sep);
-    if(slsh != -1)
-        lname = lname.right(lname.length() - slsh - 1);
-    QFile ft(fname);
-    if(!ft.open(QIODevice::WriteOnly))
-        return;
-    project->values("ALL_DEPS").append(fileFixify(fname));
-    QTextStream t(&ft);
-
-    QString prefix = pkgConfigPrefix();
-    QString libDir = project->first("QMAKE_PKGCONFIG_LIBDIR");
-    if(libDir.isEmpty())
-        libDir = prefix + Option::dir_sep + "lib" + Option::dir_sep;
-    QString includeDir = project->first("QMAKE_PKGCONFIG_INCDIR");
-    if(includeDir.isEmpty())
-        includeDir = prefix + "/include";
-
-    t << "prefix=" << prefix << endl;
-    t << "exec_prefix=${prefix}\n"
-      << "libdir=" << pkgConfigFixPath(libDir) << "\n"
-      << "includedir=" << pkgConfigFixPath(includeDir) << endl;
-    // non-standard entry. Provides useful info normally only
-    // contained in the internal .qmake.cache file
-    t << varGlue("CONFIG", "qt_config=", " ", "") << endl;
-
-    //extra PKGCONFIG variables
-    const QStringList &pkgconfig_vars = project->values("QMAKE_PKGCONFIG_VARIABLES");
-    for(int i = 0; i < pkgconfig_vars.size(); ++i) {
-        QString var = project->first(pkgconfig_vars.at(i) + ".name"),
-                val = project->values(pkgconfig_vars.at(i) + ".value").join(" ");
-        if(var.isEmpty())
-            continue;
-        if(val.isEmpty()) {
-            const QStringList &var_vars = project->values(pkgconfig_vars.at(i) + ".variable");
-            for(int v = 0; v < var_vars.size(); ++v) {
-                const QStringList &vars = project->values(var_vars.at(v));
-                for(int var = 0; var < vars.size(); ++var) {
-                    if(!val.isEmpty())
-                        val += " ";
-                    val += pkgConfigFixPath(vars.at(var));
-                }
-            }
-        }
-        t << var << "=" << val << endl;
-    }
-
-    t << endl;
-
-    QString name = project->first("QMAKE_PKGCONFIG_NAME");
-    if(name.isEmpty()) {
-        name = project->first("QMAKE_ORIG_TARGET").toLower();
-        name.replace(0, 1, name[0].toUpper());
-    }
-    t << "Name: " << name << endl;
-    QString desc = project->values("QMAKE_PKGCONFIG_DESCRIPTION").join(" ");
-    if(desc.isEmpty()) {
-        if(name.isEmpty()) {
-            desc = project->first("QMAKE_ORIG_TARGET").toLower();
-            desc.replace(0, 1, desc[0].toUpper());
-        } else {
-            desc = name;
-        }
-        if(project->first("TEMPLATE") == "lib") {
-            if(project->isActiveConfig("plugin"))
-               desc += " Plugin";
-            else
-               desc += " Library";
-        } else if(project->first("TEMPLATE") == "app") {
-            desc += " Application";
-        }
-    }
-    t << "Description: " << desc << endl;
-    t << "Version: " << project->first("VERSION") << endl;
-
-    // libs
-    t << "Libs: ";
-    QString pkgConfiglibDir;
-    QString pkgConfiglibName;
-    if (Option::target_mode == Option::TARG_MACX_MODE && project->isActiveConfig("lib_bundle")) {
-        pkgConfiglibDir = "-F${libdir}";
-        QString bundle;
-        if (!project->isEmpty("QMAKE_FRAMEWORK_BUNDLE_NAME"))
-            bundle = unescapeFilePath(project->first("QMAKE_FRAMEWORK_BUNDLE_NAME"));
-        else
-            bundle = unescapeFilePath(project->first("TARGET"));
-        int suffix = bundle.lastIndexOf(".framework");
-        if (suffix != -1)
-            bundle = bundle.left(suffix);
-        pkgConfiglibName = "-framework " + bundle + " ";
-    } else {
-        pkgConfiglibDir = "-L${libdir}";
-        pkgConfiglibName = "-l" + lname.left(lname.length()-Option::libtool_ext.length());
-    }
-    t << pkgConfiglibDir << " " << pkgConfiglibName << " " << endl;
-
-    QStringList libs;
-    if(!project->isEmpty("QMAKE_INTERNAL_PRL_LIBS")) {
-        libs = project->values("QMAKE_INTERNAL_PRL_LIBS");
-    } else {
-        libs << "QMAKE_LIBS"; //obvious one
-    }
-    libs << "QMAKE_LIBS_PRIVATE";
-    libs << "QMAKE_LFLAGS_THREAD"; //not sure about this one, but what about things like -pthread?
-    t << "Libs.private: ";
-    for(QStringList::ConstIterator it = libs.begin(); it != libs.end(); ++it) {
-        t << project->values((*it)).join(" ") << " ";
-    }
-    t << endl;
-
-    // flags
-    // ### too many
-    t << "Cflags: "
-        // << var("QMAKE_CXXFLAGS") << " "
-      << varGlue("PRL_EXPORT_DEFINES","-D"," -D"," ")
-      << project->values("PRL_EXPORT_CXXFLAGS").join(" ")
-      << project->values("QMAKE_PKGCONFIG_CFLAGS").join(" ")
-        //      << varGlue("DEFINES","-D"," -D"," ")
-      << " -I${includedir}" << endl;
-
-    // requires
-    const QString requires = project->values("QMAKE_PKGCONFIG_REQUIRES").join(" ");
-    if (!requires.isEmpty()) {
-        t << "Requires: " << requires << endl;
-    }
-
-    t << endl;
-}
-
 QT_END_NAMESPACE
-- 
cgit v0.12


From f18aca79a233c71f7a4bc72c9e31de948ba43c31 Mon Sep 17 00:00:00 2001
From: Mark Brand <mabrand@mabrand.nl>
Date: Mon, 10 Jan 2011 16:41:56 +0100
Subject: qmake: write and install pkg-config files for mingw

Merge-request: 2543
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
---
 qmake/generators/win32/mingw_make.cpp  |  3 +++
 qmake/generators/win32/winmakefile.cpp | 12 ++++++++++++
 2 files changed, 15 insertions(+)

diff --git a/qmake/generators/win32/mingw_make.cpp b/qmake/generators/win32/mingw_make.cpp
index 4717542..2210bf7 100644
--- a/qmake/generators/win32/mingw_make.cpp
+++ b/qmake/generators/win32/mingw_make.cpp
@@ -142,6 +142,9 @@ bool MingwMakefileGenerator::writeMakefile(QTextStream &t)
 
     if(project->first("TEMPLATE") == "app" ||
        project->first("TEMPLATE") == "lib") {
+        if(project->isActiveConfig("create_pc") && project->first("TEMPLATE") == "lib")
+            writePkgConfigFile();
+
         if(Option::mkfile::do_stub_makefile) {
             t << "QMAKE    = " << var("QMAKE_QMAKE") << endl;
             QStringList &qut = project->values("QMAKE_EXTRA_TARGETS");
diff --git a/qmake/generators/win32/winmakefile.cpp b/qmake/generators/win32/winmakefile.cpp
index 8cf970e..b7974e8 100644
--- a/qmake/generators/win32/winmakefile.cpp
+++ b/qmake/generators/win32/winmakefile.cpp
@@ -809,6 +809,18 @@ QString Win32MakefileGenerator::defaultInstall(const QString &t)
                 uninst.append("\n\t");
             uninst.append("-$(DEL_FILE) \"" + dst_prl + "\"");
         }
+        if(project->isActiveConfig("create_pc")) {
+            QString dst_pc = pkgConfigFileName(false);
+            if (!dst_pc.isEmpty()) {
+                dst_pc = filePrefixRoot(root, targetdir + dst_pc);
+                if(!ret.isEmpty())
+                    ret += "\n\t";
+                ret += "-$(INSTALL_FILE) \"" + pkgConfigFileName(true) + "\" \"" + dst_pc + "\"";
+                if(!uninst.isEmpty())
+                    uninst.append("\n\t");
+                uninst.append("-$(DEL_FILE) \"" + dst_pc + "\"");
+            }
+        }
         if(project->isActiveConfig("shared") && !project->isActiveConfig("plugin")) {
             QString lib_target = getLibTarget();
             lib_target.remove('"');
-- 
cgit v0.12


From 45fe2dddc3a0677b9ec9fce09f07cd4129e37afa Mon Sep 17 00:00:00 2001
From: Mark Brand <mabrand@mabrand.nl>
Date: Mon, 10 Jan 2011 16:41:57 +0100
Subject: qt project files: create pkg-config files for mingw

This is mostly the same as for unix.

Merge-request: 2543
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
---
 src/3rdparty/webkit/WebCore/WebCore.pro               | 4 +---
 src/dbus/dbus.pro                                     | 2 +-
 src/declarative/declarative.pro                       | 2 +-
 src/gui/gui.pro                                       | 2 +-
 src/multimedia/multimedia.pro                         | 2 +-
 src/network/network.pro                               | 2 +-
 src/opengl/opengl.pro                                 | 2 +-
 src/openvg/openvg.pro                                 | 2 +-
 src/phonon/phonon.pro                                 | 2 +-
 src/qbase.pri                                         | 8 ++++++++
 src/qt3support/qt3support.pro                         | 2 +-
 src/script/script.pro                                 | 2 +-
 src/scripttools/scripttools.pro                       | 2 +-
 src/sql/sql.pro                                       | 2 +-
 src/svg/svg.pro                                       | 2 +-
 src/xml/xml.pro                                       | 2 +-
 src/xmlpatterns/xmlpatterns.pro                       | 2 +-
 tools/assistant/lib/fulltextsearch/fulltextsearch.pro | 2 +-
 tools/assistant/lib/lib.pro                           | 2 +-
 tools/designer/src/components/lib/lib.pro             | 2 +-
 tools/designer/src/lib/lib.pro                        | 2 +-
 tools/designer/src/uitools/uitools.pro                | 2 +-
 22 files changed, 29 insertions(+), 23 deletions(-)

diff --git a/src/3rdparty/webkit/WebCore/WebCore.pro b/src/3rdparty/webkit/WebCore/WebCore.pro
index 3ccc57f..e82ec4c 100644
--- a/src/3rdparty/webkit/WebCore/WebCore.pro
+++ b/src/3rdparty/webkit/WebCore/WebCore.pro
@@ -86,9 +86,7 @@ moduleFile=$$PWD/../WebKit/qt/qt_webkit_version.pri
 isEmpty(QT_BUILD_TREE):include($$moduleFile)
 VERSION = $${QT_WEBKIT_MAJOR_VERSION}.$${QT_WEBKIT_MINOR_VERSION}.$${QT_WEBKIT_PATCH_VERSION}
 
-unix {
-    QMAKE_PKGCONFIG_REQUIRES = QtCore QtGui QtNetwork
-}
+unix|win32-g++*:QMAKE_PKGCONFIG_REQUIRES = QtCore QtGui QtNetwork
 
 unix:!mac:*-g++*:QMAKE_CXXFLAGS += -ffunction-sections -fdata-sections 
 unix:!mac:*-g++*:QMAKE_LFLAGS += -Wl,--gc-sections
diff --git a/src/dbus/dbus.pro b/src/dbus/dbus.pro
index 46a723a..52ed217 100644
--- a/src/dbus/dbus.pro
+++ b/src/dbus/dbus.pro
@@ -12,7 +12,7 @@ contains(QT_CONFIG, dbus-linked) {
 }
 
 # INCLUDEPATH += .
-unix { 
+unix|win32-g++* {
     QMAKE_PKGCONFIG_DESCRIPTION = Qt \
         DBus \
         module
diff --git a/src/declarative/declarative.pro b/src/declarative/declarative.pro
index 1ad888b..4ed4f9f 100644
--- a/src/declarative/declarative.pro
+++ b/src/declarative/declarative.pro
@@ -6,7 +6,7 @@ DEFINES   += QT_BUILD_DECLARATIVE_LIB QT_NO_URL_CAST_FROM_STRING
 win32-msvc*|win32-icc:QMAKE_LFLAGS += /BASE:0x66000000
 solaris-cc*:QMAKE_CXXFLAGS_RELEASE -= -O2
 
-unix:QMAKE_PKGCONFIG_REQUIRES = QtCore QtGui
+unix|win32-g++*:QMAKE_PKGCONFIG_REQUIRES = QtCore QtGui
 
 exists("qdeclarative_enable_gcov") {
     QMAKE_CXXFLAGS = -fprofile-arcs -ftest-coverage -fno-elide-constructors
diff --git a/src/gui/gui.pro b/src/gui/gui.pro
index 11a25e2..fe1a595 100644
--- a/src/gui/gui.pro
+++ b/src/gui/gui.pro
@@ -7,7 +7,7 @@ irix-cc*:QMAKE_CXXFLAGS += -no_prelink -ptused
 
 !win32:!embedded:!qpa:!mac:!symbian:CONFIG      += x11
 
-unix:QMAKE_PKGCONFIG_REQUIRES = QtCore
+unix|win32-g++*:QMAKE_PKGCONFIG_REQUIRES = QtCore
 
 include(../qbase.pri)
 
diff --git a/src/multimedia/multimedia.pro b/src/multimedia/multimedia.pro
index 852322d..e827cdd 100644
--- a/src/multimedia/multimedia.pro
+++ b/src/multimedia/multimedia.pro
@@ -4,7 +4,7 @@ QT = core gui
 
 DEFINES += QT_BUILD_MULTIMEDIA_LIB QT_NO_USING_NAMESPACE
 
-unix:QMAKE_PKGCONFIG_REQUIRES = QtCore QtGui
+unix|win32-g++*:QMAKE_PKGCONFIG_REQUIRES = QtCore QtGui
 
 include(../qbase.pri)
 
diff --git a/src/network/network.pro b/src/network/network.pro
index 7ed7d3a..948922b 100644
--- a/src/network/network.pro
+++ b/src/network/network.pro
@@ -13,7 +13,7 @@ DEFINES += QT_BUILD_NETWORK_LIB QT_NO_USING_NAMESPACE
 QT = core
 win32-msvc*|win32-icc:QMAKE_LFLAGS += /BASE:0x64000000
 
-unix:QMAKE_PKGCONFIG_REQUIRES = QtCore
+unix|win32-g++*:QMAKE_PKGCONFIG_REQUIRES = QtCore
 
 include(../qbase.pri)
 include(access/access.pri)
diff --git a/src/opengl/opengl.pro b/src/opengl/opengl.pro
index a089d55..8b587cf 100644
--- a/src/opengl/opengl.pro
+++ b/src/opengl/opengl.pro
@@ -7,7 +7,7 @@ win32-msvc*|win32-icc:QMAKE_LFLAGS += /BASE:0x63000000
 solaris-cc*:QMAKE_CXXFLAGS_RELEASE -= -O2
 irix-cc*:QMAKE_CXXFLAGS += -no_prelink -ptused
 
-unix:QMAKE_PKGCONFIG_REQUIRES = QtCore QtGui
+unix|win32-g++*:QMAKE_PKGCONFIG_REQUIRES = QtCore QtGui
 
 include(../qbase.pri)
 
diff --git a/src/openvg/openvg.pro b/src/openvg/openvg.pro
index c05af90..e7ed890 100644
--- a/src/openvg/openvg.pro
+++ b/src/openvg/openvg.pro
@@ -42,7 +42,7 @@ symbian {
 
 include(../qbase.pri)
 
-unix:QMAKE_PKGCONFIG_REQUIRES = QtCore QtGui
+unix|win32-g++*:QMAKE_PKGCONFIG_REQUIRES = QtCore QtGui
 symbian:TARGET.UID3 = 0x2001E62F
 
 !isEmpty(QMAKE_INCDIR_OPENVG): INCLUDEPATH += $$QMAKE_INCDIR_OPENVG
diff --git a/src/phonon/phonon.pro b/src/phonon/phonon.pro
index 7f79d0b..b16c5a1 100644
--- a/src/phonon/phonon.pro
+++ b/src/phonon/phonon.pro
@@ -11,7 +11,7 @@ DEFINES += MAKE_PHONON_LIB
 
 PHONON_DIR = $$QT_SOURCE_TREE/src/3rdparty/phonon/phonon
 
-unix:QMAKE_PKGCONFIG_REQUIRES = QtCore QtGui QtNetwork
+unix|win32-g++*:QMAKE_PKGCONFIG_REQUIRES = QtCore QtGui QtNetwork
 
 # Input
 HEADERS += $$PHONON_DIR/abstractaudiooutput.h \
diff --git a/src/qbase.pri b/src/qbase.pri
index d3fa426..4d835bd 100644
--- a/src/qbase.pri
+++ b/src/qbase.pri
@@ -151,6 +151,14 @@ unix:!symbian {
    QMAKE_PKGCONFIG_INSTALL_REPLACE += include_replace lib_replace prefix_replace
 }
 
+win32-g++* {
+   CONFIG += create_pc
+   QMAKE_PKGCONFIG_LIBDIR = $$[QT_INSTALL_LIBS]
+   QMAKE_PKGCONFIG_INCDIR = $$[QT_INSTALL_HEADERS]/$$TARGET
+   QMAKE_PKGCONFIG_CFLAGS = -I$$[QT_INSTALL_HEADERS]
+   QMAKE_PKGCONFIG_DESTDIR = pkgconfig
+}
+
 contains(QT_PRODUCT, OpenSource.*):DEFINES *= QT_OPENSOURCE
 DEFINES *= QT_NO_CAST_TO_ASCII QT_ASCII_CAST_WARNINGS
 contains(QT_CONFIG, qt3support):DEFINES *= QT3_SUPPORT
diff --git a/src/qt3support/qt3support.pro b/src/qt3support/qt3support.pro
index a30117c..1e0717d 100644
--- a/src/qt3support/qt3support.pro
+++ b/src/qt3support/qt3support.pro
@@ -21,7 +21,7 @@ include(canvas/canvas.pri)
 include(network/network.pri)
 include(painting/painting.pri)
 
-unix {
+unix|win32-g++* {
    QMAKE_PKGCONFIG_CFLAGS += -DQT3_SUPPORT
    QMAKE_PKGCONFIG_REQUIRES = QtCore QtGui QtNetwork QtSql
 }
diff --git a/src/script/script.pro b/src/script/script.pro
index 56d3f7a..57c58ed 100644
--- a/src/script/script.pro
+++ b/src/script/script.pro
@@ -7,7 +7,7 @@ DEFINES   += QT_NO_USING_NAMESPACE
 DEFINES   += QLALR_NO_QSCRIPTGRAMMAR_DEBUG_INFO
 #win32-msvc*|win32-icc:QMAKE_LFLAGS += /BASE:0x66000000       ### FIXME
 
-unix:QMAKE_PKGCONFIG_REQUIRES = QtCore
+unix|win32-g++*:QMAKE_PKGCONFIG_REQUIRES = QtCore
 
 include(../qbase.pri)
 
diff --git a/src/scripttools/scripttools.pro b/src/scripttools/scripttools.pro
index b1df7aa..061dea5 100644
--- a/src/scripttools/scripttools.pro
+++ b/src/scripttools/scripttools.pro
@@ -5,7 +5,7 @@ DEFINES   += QT_BUILD_SCRIPTTOOLS_LIB
 DEFINES   += QT_NO_USING_NAMESPACE
 #win32-msvc*|win32-icc:QMAKE_LFLAGS += /BASE:0x66000000
 
-unix:QMAKE_PKGCONFIG_REQUIRES = QtCore QtGui QtScript
+unix|win32-g++*:QMAKE_PKGCONFIG_REQUIRES = QtCore QtGui QtScript
 
 include(../qbase.pri)
 
diff --git a/src/sql/sql.pro b/src/sql/sql.pro
index b8f819d..54f4289 100644
--- a/src/sql/sql.pro
+++ b/src/sql/sql.pro
@@ -5,7 +5,7 @@ DEFINES += QT_BUILD_SQL_LIB
 DEFINES += QT_NO_USING_NAMESPACE
 win32-msvc*|win32-icc:QMAKE_LFLAGS += /BASE:0x62000000
 
-unix:QMAKE_PKGCONFIG_REQUIRES = QtCore
+unix|win32-g++*:QMAKE_PKGCONFIG_REQUIRES = QtCore
 
 include(../qbase.pri)
 
diff --git a/src/svg/svg.pro b/src/svg/svg.pro
index 7b5251a..79f284a 100644
--- a/src/svg/svg.pro
+++ b/src/svg/svg.pro
@@ -6,7 +6,7 @@ DEFINES   += QT_NO_USING_NAMESPACE
 win32-msvc*|win32-icc:QMAKE_LFLAGS += /BASE:0x66000000
 solaris-cc*:QMAKE_CXXFLAGS_RELEASE -= -O2
 
-unix:QMAKE_PKGCONFIG_REQUIRES = QtCore QtGui
+unix|win32-g++*:QMAKE_PKGCONFIG_REQUIRES = QtCore QtGui
 
 include(../qbase.pri)
 
diff --git a/src/xml/xml.pro b/src/xml/xml.pro
index 8d1bf68..019153c 100644
--- a/src/xml/xml.pro
+++ b/src/xml/xml.pro
@@ -4,7 +4,7 @@ QT         = core
 DEFINES   += QT_BUILD_XML_LIB QT_NO_USING_NAMESPACE
 win32-msvc*|win32-icc:QMAKE_LFLAGS += /BASE:0x61000000
 
-unix:QMAKE_PKGCONFIG_REQUIRES = QtCore
+unix|win32-g++*:QMAKE_PKGCONFIG_REQUIRES = QtCore
 
 include(../qbase.pri)
 
diff --git a/src/xmlpatterns/xmlpatterns.pro b/src/xmlpatterns/xmlpatterns.pro
index e50d184..d22f417 100644
--- a/src/xmlpatterns/xmlpatterns.pro
+++ b/src/xmlpatterns/xmlpatterns.pro
@@ -5,7 +5,7 @@ QT = core \
 DEFINES += QT_BUILD_XMLPATTERNS_LIB \
     QT_NO_USING_NAMESPACE
 win32-msvc*|win32-icc:QMAKE_LFLAGS += /BASE:0x61000000
-unix:QMAKE_PKGCONFIG_REQUIRES = QtCore \
+unix|win32-g++*:QMAKE_PKGCONFIG_REQUIRES = QtCore \
     QtNetwork
 include(../qbase.pri)
 PRECOMPILED_HEADER = ../corelib/global/qt_pch.h
diff --git a/tools/assistant/lib/fulltextsearch/fulltextsearch.pro b/tools/assistant/lib/fulltextsearch/fulltextsearch.pro
index 4d2fddb..d0e7a87 100644
--- a/tools/assistant/lib/fulltextsearch/fulltextsearch.pro
+++ b/tools/assistant/lib/fulltextsearch/fulltextsearch.pro
@@ -23,7 +23,7 @@ contains(QT_CONFIG, reduce_exports) {
     linux*-g++*:DEFINES += _GLIBCXX_EXTERN_TEMPLATE=0
 }
 
-unix:QMAKE_PKGCONFIG_REQUIRES = QtCore
+unix|win32-g++*:QMAKE_PKGCONFIG_REQUIRES = QtCore
 
 # impossible to disable exceptions in clucene atm
 CONFIG(exceptions_off) {
diff --git a/tools/assistant/lib/lib.pro b/tools/assistant/lib/lib.pro
index 26d3456..03821b2 100644
--- a/tools/assistant/lib/lib.pro
+++ b/tools/assistant/lib/lib.pro
@@ -19,7 +19,7 @@ if(!debug_and_release|build_pass):CONFIG(debug, debug|release) {
     win32:qclucene = $${qclucene}d
 }
 linux-lsb-g++:LIBS_PRIVATE += --lsb-shared-libs=$$qclucene
-unix:QMAKE_PKGCONFIG_REQUIRES += QtNetwork \
+unix|win32-g++*:QMAKE_PKGCONFIG_REQUIRES += QtNetwork \
     QtSql \
     QtXml
 LIBS_PRIVATE += -l$$qclucene
diff --git a/tools/designer/src/components/lib/lib.pro b/tools/designer/src/components/lib/lib.pro
index 0ada845..50a8b00 100644
--- a/tools/designer/src/components/lib/lib.pro
+++ b/tools/designer/src/components/lib/lib.pro
@@ -64,7 +64,7 @@ PRECOMPILED_HEADER= lib_pch.h
 include(../../sharedcomponents.pri)
 include(../component.pri)
 
-unix {
+unix|win32-g++* {
     QMAKE_PKGCONFIG_REQUIRES = QtCore QtDesigner QtGui QtXml
     contains(QT_CONFIG, script): QMAKE_PKGCONFIG_REQUIRES += QtScript
 }
diff --git a/tools/designer/src/lib/lib.pro b/tools/designer/src/lib/lib.pro
index 495976d..3ba6f52 100644
--- a/tools/designer/src/lib/lib.pro
+++ b/tools/designer/src/lib/lib.pro
@@ -13,7 +13,7 @@ isEmpty(QT_MAJOR_VERSION) {
    VERSION=$${QT_MAJOR_VERSION}.$${QT_MINOR_VERSION}.$${QT_PATCH_VERSION}
 }
 
-unix:QMAKE_PKGCONFIG_REQUIRES += QtXml
+unix|win32-g++*:QMAKE_PKGCONFIG_REQUIRES += QtXml
 
 include(../../../../src/qt_targets.pri)
 QMAKE_TARGET_PRODUCT = Designer
diff --git a/tools/designer/src/uitools/uitools.pro b/tools/designer/src/uitools/uitools.pro
index 7b94587..6e0a247 100644
--- a/tools/designer/src/uitools/uitools.pro
+++ b/tools/designer/src/uitools/uitools.pro
@@ -35,7 +35,7 @@ INSTALLS        += quitools_headers
 target.path=$$[QT_INSTALL_LIBS]
 INSTALLS        += target
 
-unix {
+unix|win32-g++* {
    CONFIG     += create_pc
    QMAKE_PKGCONFIG_LIBDIR = $$[QT_INSTALL_LIBS]
    QMAKE_PKGCONFIG_INCDIR = $$[QT_INSTALL_HEADERS]/$$TARGET
-- 
cgit v0.12


From 42b63e97fb2e7217472f4ad0685d531782e630e3 Mon Sep 17 00:00:00 2001
From: Joerg Bornemann <joerg.bornemann@nokia.com>
Date: Mon, 10 Jan 2011 17:01:06 +0100
Subject: qmake: fix wrong case label in toString(subSystemOption)

Reviewed-by: TrustMe
---
 qmake/generators/win32/msbuild_objectmodel.cpp | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/qmake/generators/win32/msbuild_objectmodel.cpp b/qmake/generators/win32/msbuild_objectmodel.cpp
index f093e90..aff03de 100644
--- a/qmake/generators/win32/msbuild_objectmodel.cpp
+++ b/qmake/generators/win32/msbuild_objectmodel.cpp
@@ -994,10 +994,6 @@ static inline QString toString(subSystemOption option)
         return "Console";
     case subSystemWindows:
         return "Windows";
-    case optLTCGOptimize:
-        return "PGOptimization";
-    case optLTCGUpdate:
-        return "PGUpdate";
     }
     return QString();
 }
-- 
cgit v0.12


From e8f9a5048987caf45f59e802326c198ca56f5293 Mon Sep 17 00:00:00 2001
From: Sergio Ahumada <sergio.ahumada@nokia.com>
Date: Mon, 10 Jan 2011 22:52:36 +0100
Subject: BM2: Little fix to make the `make check-trusted' to work on Linux and
 Windows.

Reviewed-by: Joao
---
 tests/benchmarks/trusted-benchmarks.pri | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/tests/benchmarks/trusted-benchmarks.pri b/tests/benchmarks/trusted-benchmarks.pri
index 632dcff..a835cbd 100644
--- a/tests/benchmarks/trusted-benchmarks.pri
+++ b/tests/benchmarks/trusted-benchmarks.pri
@@ -1,8 +1,11 @@
 # Edit the list of trusted benchmarks in each of the sub-targets
 
+# command terminating newline in Makefile
+NL=$$escape_expand(\\n\\t)
+
 check-trusted.depends = qmake
 for(benchmark, TRUSTED_BENCHMARKS) {
-    check-trusted.commands += (cd $$benchmark && $(MAKE) -f $(MAKEFILE) check);
+    check-trusted.commands += -cd $$benchmark && $(MAKE) -f $(MAKEFILE) check$${NL}
 }
 
 QMAKE_EXTRA_TARGETS += check-trusted
-- 
cgit v0.12


From 1e4197d2f2994d524116761046626bd430a2df3f Mon Sep 17 00:00:00 2001
From: Jiang Jiang <jiang.jiang@nokia.com>
Date: Tue, 11 Jan 2011 09:45:03 +0100
Subject: Only test control character handling in X11

It was a issue in HarfBuzz only.

Reviewed-by: Andy Shaw
---
 tests/auto/qtextscriptengine/tst_qtextscriptengine.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/tests/auto/qtextscriptengine/tst_qtextscriptengine.cpp b/tests/auto/qtextscriptengine/tst_qtextscriptengine.cpp
index b0b6b1e..88212c6 100644
--- a/tests/auto/qtextscriptengine/tst_qtextscriptengine.cpp
+++ b/tests/auto/qtextscriptengine/tst_qtextscriptengine.cpp
@@ -1114,6 +1114,7 @@ void tst_QTextScriptEngine::greek()
 
 void tst_QTextScriptEngine::controlInSyllable_qtbug14204()
 {
+#if defined(Q_WS_X11)
     QString s;
     s.append(QChar(0x0915));
     s.append(QChar(0x094d));
@@ -1127,6 +1128,9 @@ void tst_QTextScriptEngine::controlInSyllable_qtbug14204()
 
     QVERIFY(e->layoutData->items[0].num_glyphs == 2);
     QVERIFY(e->layoutData->glyphLayout.advances_x[1] != 0);
+#else
+    QSKIP("X11 specific test", SkipAll);
+#endif
 }
 
 QTEST_MAIN(tst_QTextScriptEngine)
-- 
cgit v0.12


From 222fb565e28d5ba7f402755762c6a5df6ffcdd37 Mon Sep 17 00:00:00 2001
From: Ritt Konstantin <ritt.ks@gmail.com>
Date: Tue, 11 Jan 2011 11:31:43 +0100
Subject: move POSIX-specific debug to qprocess_unix.cpp

Merge-request: 997
Reviewed-by: Olivier Goffart <olivier.goffart@nokia.com>
---
 src/corelib/io/qprocess.cpp      | 3 ---
 src/corelib/io/qprocess_unix.cpp | 2 ++
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/src/corelib/io/qprocess.cpp b/src/corelib/io/qprocess.cpp
index 739ac4d..da53014 100644
--- a/src/corelib/io/qprocess.cpp
+++ b/src/corelib/io/qprocess.cpp
@@ -963,9 +963,6 @@ bool QProcessPrivate::_q_canWrite()
         destroyPipe(stdinChannel.pipe);
         processError = QProcess::WriteError;
         q->setErrorString(QProcess::tr("Error writing to process"));
-#if defined(QPROCESS_DEBUG) && !defined(Q_OS_WINCE)
-        qDebug("QProcessPrivate::canWrite(), failed to write (%s)", strerror(errno));
-#endif
         emit q->error(processError);
         return false;
     }
diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp
index e52d132..0d5464e 100644
--- a/src/corelib/io/qprocess_unix.cpp
+++ b/src/corelib/io/qprocess_unix.cpp
@@ -866,6 +866,8 @@ qint64 QProcessPrivate::writeToStdin(const char *data, qint64 maxlen)
 #if defined QPROCESS_DEBUG
     qDebug("QProcessPrivate::writeToStdin(%p \"%s\", %lld) == %lld",
            data, qt_prettyDebug(data, maxlen, 16).constData(), maxlen, written);
+    if (written == -1)
+        qDebug("QProcessPrivate::writeToStdin(), failed to write (%s)", qt_error_string(errno));
 #endif
     return written;
 }
-- 
cgit v0.12


From 7f2e9e43234a112e845568a4329a869975f73a21 Mon Sep 17 00:00:00 2001
From: Ritt Konstantin <ritt.ks@gmail.com>
Date: Tue, 11 Jan 2011 11:31:44 +0100
Subject: handle O_NONBLOCK'ed pipes specific error on write()

according to the write(2) docs:

When write requests greater than {PIPE_BUF} bytes to a pipe that
has available space at least 1 byte, if O_NONBLOCK is set,
write transfers what it can and returns the number of bytes written.

When write requests of {PIPE_BUF} or less  bytes to a pipe that has no
enough space, or write requests for greater than {PIPE_BUF} bytes
to a pipe that has no space, if O_NONBLOCK  is  set,
write returns -1 and sets errno to EAGAIN.

Merge-request: 997
Reviewed-by: Olivier Goffart <olivier.goffart@nokia.com>
---
 src/corelib/io/qprocess.cpp      | 12 +++++++-----
 src/corelib/io/qprocess_unix.cpp |  5 +++++
 2 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/src/corelib/io/qprocess.cpp b/src/corelib/io/qprocess.cpp
index da53014..1522f8e 100644
--- a/src/corelib/io/qprocess.cpp
+++ b/src/corelib/io/qprocess.cpp
@@ -971,11 +971,13 @@ bool QProcessPrivate::_q_canWrite()
     qDebug("QProcessPrivate::canWrite(), wrote %d bytes to the process input", int(written));
 #endif
 
-    writeBuffer.free(written);
-    if (!emittedBytesWritten) {
-        emittedBytesWritten = true;
-        emit q->bytesWritten(written);
-        emittedBytesWritten = false;
+    if (written != 0) {
+        writeBuffer.free(written);
+        if (!emittedBytesWritten) {
+            emittedBytesWritten = true;
+            emit q->bytesWritten(written);
+            emittedBytesWritten = false;
+        }
     }
     if (stdinChannel.notifier && !writeBuffer.isEmpty())
         stdinChannel.notifier->setEnabled(true);
diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp
index 0d5464e..299280e 100644
--- a/src/corelib/io/qprocess_unix.cpp
+++ b/src/corelib/io/qprocess_unix.cpp
@@ -869,6 +869,11 @@ qint64 QProcessPrivate::writeToStdin(const char *data, qint64 maxlen)
     if (written == -1)
         qDebug("QProcessPrivate::writeToStdin(), failed to write (%s)", qt_error_string(errno));
 #endif
+    // If the O_NONBLOCK flag is set and If some data can be written without blocking
+    // the process, write() will transfer what it can and return the number of bytes written.
+    // Otherwise, it will return -1 and set errno to EAGAIN
+    if (written == -1 && errno == EAGAIN)
+        written = 0;
     return written;
 }
 
-- 
cgit v0.12


From 7afc73d1a894c2395ec8ba099adf4fb49ce561e3 Mon Sep 17 00:00:00 2001
From: Ritt Konstantin <ritt.ks@gmail.com>
Date: Tue, 11 Jan 2011 13:26:18 +0100
Subject: deal with utcOffset in a correct way

like how we do that for ISO format

Reviewed-by: ddenis

Merge-request: 2536
Reviewed-by: Olivier Goffart <olivier.goffart@nokia.com>
---
 src/corelib/tools/qdatetime.cpp | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp
index 6a20c7a..9f71457 100644
--- a/src/corelib/tools/qdatetime.cpp
+++ b/src/corelib/tools/qdatetime.cpp
@@ -3426,8 +3426,9 @@ QDateTime QDateTime::fromString(const QString& s, Qt::DateFormat f)
         QString tz = parts.at(5);
         if (!tz.startsWith(QLatin1String("GMT"), Qt::CaseInsensitive))
             return QDateTime();
-        int tzoffset = 0;
+        QDateTime dt(date, time, Qt::UTC);
         if (tz.length() > 3) {
+            int tzoffset = 0;
             QChar sign = tz.at(3);
             if ((sign != QLatin1Char('+'))
                 && (sign != QLatin1Char('-'))) {
@@ -3442,8 +3443,9 @@ QDateTime QDateTime::fromString(const QString& s, Qt::DateFormat f)
             tzoffset = (tzhour*60 + tzminute) * 60;
             if (sign == QLatin1Char('-'))
                 tzoffset = -tzoffset;
+            dt.setUtcOffset(tzoffset);
         }
-        return QDateTime(date, time, Qt::UTC).addSecs(-tzoffset).toLocalTime();
+        return dt.toLocalTime();
     }
 #endif //QT_NO_TEXTDATE
     }
-- 
cgit v0.12


From 54db2506e8f228487c109ec7efc7a2a9681e9087 Mon Sep 17 00:00:00 2001
From: Ritt Konstantin <ritt.ks@gmail.com>
Date: Tue, 11 Jan 2011 13:26:19 +0100
Subject: fix/stabilizate the year sign change test

this test might fail for the Qt::LocalTime spec in some cases

Merge-request: 2536
Reviewed-by: Olivier Goffart <olivier.goffart@nokia.com>
---
 tests/auto/qdatetime/tst_qdatetime.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/tests/auto/qdatetime/tst_qdatetime.cpp b/tests/auto/qdatetime/tst_qdatetime.cpp
index 1841487..851e1ee 100644
--- a/tests/auto/qdatetime/tst_qdatetime.cpp
+++ b/tests/auto/qdatetime/tst_qdatetime.cpp
@@ -705,12 +705,12 @@ void tst_QDateTime::addSecs_data()
     }
 
     // Year sign change
-    QTest::newRow("toNegative") << QDateTime(QDate(1, 1, 1), QTime(0, 0, 0))
+    QTest::newRow("toNegative") << QDateTime(QDate(1, 1, 1), QTime(0, 0, 0), Qt::UTC)
                                 << -1
-                                << QDateTime(QDate(-1, 12, 31), QTime(23, 59, 59));
-    QTest::newRow("toPositive") << QDateTime(QDate(-1, 12, 31), QTime(23, 59, 59))
+                                << QDateTime(QDate(-1, 12, 31), QTime(23, 59, 59), Qt::UTC);
+    QTest::newRow("toPositive") << QDateTime(QDate(-1, 12, 31), QTime(23, 59, 59), Qt::UTC)
                                 << 1
-                                << QDateTime(QDate(1, 1, 1), QTime(0, 0, 0));
+                                << QDateTime(QDate(1, 1, 1), QTime(0, 0, 0), Qt::UTC);
 
     // Gregorian/Julian switchover
     QTest::newRow("toGregorian") << QDateTime(QDate(1582, 10, 4), QTime(23, 59, 59))
-- 
cgit v0.12


From 76a0c085c8fc6e5f2a46b186a4a1c83e3713bd76 Mon Sep 17 00:00:00 2001
From: Ritt Konstantin <ritt.ks@gmail.com>
Date: Tue, 11 Jan 2011 14:33:33 +0300
Subject: make the modifySemaphore() signal-safe on linux

as POSIX man says, if semop() is interrupted by a signal,
it shall return -1 and set errno to EINTR.
in qcore_unix_p.h, we have EINTR_LOOP helper macro exactly for such cases ;)

Task-number: QTBUG-14434
Merge-request: 998
Reviewed-by: Olivier Goffart
---
 src/corelib/kernel/qsystemsemaphore_unix.cpp | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/corelib/kernel/qsystemsemaphore_unix.cpp b/src/corelib/kernel/qsystemsemaphore_unix.cpp
index 07e3618..9d0c0b9 100644
--- a/src/corelib/kernel/qsystemsemaphore_unix.cpp
+++ b/src/corelib/kernel/qsystemsemaphore_unix.cpp
@@ -56,6 +56,8 @@
 
 #include <sys/sem.h>
 
+#include "private/qcore_unix_p.h"
+
 // OpenBSD 4.2 doesn't define EIDRM, see BUGS section:
 // http://www.openbsd.org/cgi-bin/man.cgi?query=semop&manpath=OpenBSD+4.2
 #if defined(Q_OS_OPENBSD) && !defined(EIDRM)
@@ -218,7 +220,10 @@ bool QSystemSemaphorePrivate::modifySemaphore(int count)
     operation.sem_num = 0;
     operation.sem_op = count;
     operation.sem_flg = SEM_UNDO;
-    if (-1 == semop(semaphore, &operation, 1)) {
+
+    register int res;
+    EINTR_LOOP(res, semop(semaphore, &operation, 1));
+    if (-1 == res) {
         // If the semaphore was removed be nice and create it and then modifySemaphore again
         if (errno == EINVAL || errno == EIDRM) {
             semaphore = -1;
-- 
cgit v0.12


From 3bd2b098888432aa29cc085759963dbb7e009ecf Mon Sep 17 00:00:00 2001
From: Ritt Konstantin <ritt.ks@gmail.com>
Date: Tue, 11 Jan 2011 14:35:08 +0300
Subject: remove unused header include

sysV shm isn't used in QSystemSemaphore

Merge-request: 998
Reviewed-by: Olivier Goffart
---
 src/corelib/kernel/qsystemsemaphore_unix.cpp | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/src/corelib/kernel/qsystemsemaphore_unix.cpp b/src/corelib/kernel/qsystemsemaphore_unix.cpp
index 9d0c0b9..445fef8 100644
--- a/src/corelib/kernel/qsystemsemaphore_unix.cpp
+++ b/src/corelib/kernel/qsystemsemaphore_unix.cpp
@@ -50,11 +50,9 @@
 
 #include <sys/types.h>
 #include <sys/ipc.h>
+#include <sys/sem.h>
 #include <fcntl.h>
 #include <errno.h>
-#include <sys/shm.h>
-
-#include <sys/sem.h>
 
 #include "private/qcore_unix_p.h"
 
-- 
cgit v0.12


From 62a681d116154235325c8b13f6df0042d81851ee Mon Sep 17 00:00:00 2001
From: Konstantin Ritt <ritt.ks@gmail.com>
Date: Tue, 11 Jan 2011 13:58:19 +0100
Subject: fix warning "'SeedStorage* randTLS()' defined but not used"

by setting the proper macro-guards;
regroup macro-guards for better readability (superfluous change, I know);
fix typos in the comments

was not splited into two commits to make it more clear why and how
that warning is fixed now

Merge-request: 955
Reviewed-by: Olivier Goffart <olivier.goffart@nokia.com>
---
 src/corelib/global/qglobal.cpp | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp
index 9b597f6..5d079d0 100644
--- a/src/corelib/global/qglobal.cpp
+++ b/src/corelib/global/qglobal.cpp
@@ -2589,7 +2589,7 @@ bool qputenv(const char *varName, const QByteArray& value)
 #endif
 }
 
-#if (defined(Q_OS_UNIX) || defined(Q_OS_WIN)) && !defined(QT_NO_THREAD)
+#if defined(Q_OS_UNIX) && !defined(Q_OS_SYMBIAN) && !defined(QT_NO_THREAD)
 
 #  if defined(Q_OS_INTEGRITY) && defined(__GHS_VERSION_NUMBER) && (__GHS_VERSION_NUMBER < 500)
 // older versions of INTEGRITY used a long instead of a uint for the seed.
@@ -2620,7 +2620,7 @@ Q_GLOBAL_STATIC(SeedStorage, randTLS)  // Thread Local Storage for seed value
 */
 void qsrand(uint seed)
 {
-#if defined(Q_OS_UNIX) && !defined(QT_NO_THREAD) && !defined(Q_OS_SYMBIAN)
+#if defined(Q_OS_UNIX) && !defined(Q_OS_SYMBIAN) && !defined(QT_NO_THREAD)
     SeedStorage *seedStorage = randTLS();
     if (seedStorage) {
         SeedStorageType *pseed = seedStorage->localData();
@@ -2628,10 +2628,10 @@ void qsrand(uint seed)
             seedStorage->setLocalData(pseed = new SeedStorageType);
         *pseed = seed;
     } else {
-        //golbal static seed storage should always exist,
+        //global static seed storage should always exist,
         //except after being deleted by QGlobalStaticDeleter.
         //But since it still can be called from destructor of another
-        //global static object, fallback to sqrand(seed)
+        //global static object, fallback to srand(seed)
         srand(seed);
     }
 #else
@@ -2659,7 +2659,7 @@ void qsrand(uint seed)
 */
 int qrand()
 {
-#if defined(Q_OS_UNIX) && !defined(QT_NO_THREAD) && !defined(Q_OS_SYMBIAN)
+#if defined(Q_OS_UNIX) && !defined(Q_OS_SYMBIAN) && !defined(QT_NO_THREAD)
     SeedStorage *seedStorage = randTLS();
     if (seedStorage) {
         SeedStorageType *pseed = seedStorage->localData();
@@ -2669,10 +2669,10 @@ int qrand()
         }
         return rand_r(pseed);
     } else {
-        //golbal static seed storage should always exist,
+        //global static seed storage should always exist,
         //except after being deleted by QGlobalStaticDeleter.
         //But since it still can be called from destructor of another
-        //global static object, fallback to qrand()
+        //global static object, fallback to rand()
         return rand();
     }
 #else
-- 
cgit v0.12


From 2da612ca235fe65a7bfc7a7515fec15eaf1134e7 Mon Sep 17 00:00:00 2001
From: Konstantin Ritt <ritt.ks@gmail.com>
Date: Tue, 11 Jan 2011 13:58:19 +0100
Subject: fix warning "missing braces around initializer for
 'in_addr::<anonymous union>'"

v.s_addr = 0; does the same

Merge-request: 955
Reviewed-by: Olivier Goffart <olivier.goffart@nokia.com>
---
 src/network/socket/qnativesocketengine_win.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp
index dbf443e..eec78c4 100644
--- a/src/network/socket/qnativesocketengine_win.cpp
+++ b/src/network/socket/qnativesocketengine_win.cpp
@@ -918,7 +918,8 @@ QNetworkInterface QNativeSocketEnginePrivate::nativeMulticastInterface() const
     }
 #endif
 
-    struct in_addr v = { 0 };
+    struct in_addr v;
+    v.s_addr = 0;
     QT_SOCKOPTLEN_T sizeofv = sizeof(v);
     if (::getsockopt(socketDescriptor, IPPROTO_IP, IP_MULTICAST_IF, (char *) &v, &sizeofv) == -1)
         return QNetworkInterface();
-- 
cgit v0.12


From f30e617950de2882434bfa5707bd8cdb91102c97 Mon Sep 17 00:00:00 2001
From: Konstantin Ritt <ritt.ks@gmail.com>
Date: Tue, 11 Jan 2011 13:58:20 +0100
Subject: fix warning "comparison between signed and unsigned integer
 expressions"

sizeof produces signed int result; QT_SOCKOPTLEN_T is int

Merge-request: 955
Reviewed-by: Olivier Goffart <olivier.goffart@nokia.com>
---
 src/network/socket/qnativesocketengine_win.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp
index eec78c4..4c290f7 100644
--- a/src/network/socket/qnativesocketengine_win.cpp
+++ b/src/network/socket/qnativesocketengine_win.cpp
@@ -923,7 +923,7 @@ QNetworkInterface QNativeSocketEnginePrivate::nativeMulticastInterface() const
     QT_SOCKOPTLEN_T sizeofv = sizeof(v);
     if (::getsockopt(socketDescriptor, IPPROTO_IP, IP_MULTICAST_IF, (char *) &v, &sizeofv) == -1)
         return QNetworkInterface();
-    if (v.s_addr != 0 && sizeofv >= sizeof(v)) {
+    if (v.s_addr != 0 && sizeofv >= QT_SOCKOPTLEN_T(sizeof(v))) {
         QHostAddress ipv4(ntohl(v.s_addr));
         QList<QNetworkInterface> ifaces = QNetworkInterface::allInterfaces();
         for (int i = 0; i < ifaces.count(); ++i) {
-- 
cgit v0.12


From ebf988356f9b8aee4968250dc1f21e841c6e5dbf Mon Sep 17 00:00:00 2001
From: Konstantin Ritt <ritt.ks@gmail.com>
Date: Tue, 11 Jan 2011 13:58:21 +0100
Subject: fix another "comparison between signed and unsigned integer
 expressions"

on win, when used in FD_SET, FD_ISSET, etc., socketDescriptor assumed to be
SOCKET which is unsigned int

Merge-request: 955
Reviewed-by: Olivier Goffart <olivier.goffart@nokia.com>
---
 src/network/socket/qnativesocketengine_win.cpp | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp
index 4c290f7..f6ebcfb 100644
--- a/src/network/socket/qnativesocketengine_win.cpp
+++ b/src/network/socket/qnativesocketengine_win.cpp
@@ -1038,7 +1038,7 @@ bool QNativeSocketEnginePrivate::nativeHasPendingDatagrams() const
     bool result = false;
     fd_set readS;
     FD_ZERO(&readS);
-    FD_SET(socketDescriptor, &readS);
+    FD_SET((SOCKET)socketDescriptor, &readS);
     timeval timeout;
     timeout.tv_sec = 0;
     timeout.tv_usec = 5000;
@@ -1333,7 +1333,7 @@ int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool selectForRead) co
 
     memset(&fds, 0, sizeof(fd_set));
     fds.fd_count = 1;
-    fds.fd_array[0] = socketDescriptor;
+    fds.fd_array[0] = (SOCKET)socketDescriptor;
 
     struct timeval tv;
     tv.tv_sec = timeout / 1000;
@@ -1347,12 +1347,12 @@ int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool selectForRead) co
         // Windows needs this to report errors when connecting a socket ...
         fd_set fdexception;
         FD_ZERO(&fdexception);
-        FD_SET(socketDescriptor, &fdexception);
+        FD_SET((SOCKET)socketDescriptor, &fdexception);
 
         ret = select(0, 0, &fds, &fdexception, timeout < 0 ? 0 : &tv);
 
         // ... but if it is actually set, pretend it did not happen
-        if (ret > 0 && FD_ISSET(socketDescriptor, &fdexception))
+        if (ret > 0 && FD_ISSET((SOCKET)socketDescriptor, &fdexception))
             ret--;
     }
 
@@ -1379,16 +1379,16 @@ int QNativeSocketEnginePrivate::nativeSelect(int timeout,
     memset(&fdread, 0, sizeof(fd_set));
     if (checkRead) {
         fdread.fd_count = 1;
-        fdread.fd_array[0] = socketDescriptor;
+        fdread.fd_array[0] = (SOCKET)socketDescriptor;
     }
     memset(&fdwrite, 0, sizeof(fd_set));
     FD_ZERO(&fdexception);
     if (checkWrite) {
         fdwrite.fd_count = 1;
-        fdwrite.fd_array[0] = socketDescriptor;
+        fdwrite.fd_array[0] = (SOCKET)socketDescriptor;
 
         // Windows needs this to report errors when connecting a socket
-        FD_SET(socketDescriptor, &fdexception);
+        FD_SET((SOCKET)socketDescriptor, &fdexception);
     }
 
     struct timeval tv;
@@ -1402,7 +1402,7 @@ int QNativeSocketEnginePrivate::nativeSelect(int timeout,
 #endif
 
      //... but if it is actually set, pretend it did not happen
-    if (ret > 0 && FD_ISSET(socketDescriptor, &fdexception))
+    if (ret > 0 && FD_ISSET((SOCKET)socketDescriptor, &fdexception))
         ret--;
 
     if (readEnabled)
@@ -1411,8 +1411,8 @@ int QNativeSocketEnginePrivate::nativeSelect(int timeout,
     if (ret <= 0)
         return ret;
 
-    *selectForRead = FD_ISSET(socketDescriptor, &fdread);
-    *selectForWrite = FD_ISSET(socketDescriptor, &fdwrite);
+    *selectForRead = FD_ISSET((SOCKET)socketDescriptor, &fdread);
+    *selectForWrite = FD_ISSET((SOCKET)socketDescriptor, &fdwrite);
 
     return ret;
 }
-- 
cgit v0.12


From 5819280b42c32233e9db0981f143704995957ef4 Mon Sep 17 00:00:00 2001
From: Konstantin Ritt <ritt.ks@gmail.com>
Date: Tue, 11 Jan 2011 13:58:22 +0100
Subject: fix 'QChar::QChar(char)' is deprecated

Merge-request: 955
Reviewed-by: Olivier Goffart <olivier.goffart@nokia.com>
---
 src/gui/dialogs/qfiledialog.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/gui/dialogs/qfiledialog.cpp b/src/gui/dialogs/qfiledialog.cpp
index 9509330..f7fa705 100644
--- a/src/gui/dialogs/qfiledialog.cpp
+++ b/src/gui/dialogs/qfiledialog.cpp
@@ -3311,7 +3311,7 @@ QString QFSCompleter::pathFromIndex(const QModelIndex &index) const
         if (currentLocation == QDir::separator())
             return path.mid(currentLocation.length());
 #endif
-        if (currentLocation.endsWith('/'))
+        if (currentLocation.endsWith(QLatin1Char('/')))
             return path.mid(currentLocation.length());
         else
             return path.mid(currentLocation.length()+1);
-- 
cgit v0.12


From 540fbb2aec0e9187acd75598a050edf8929e1d68 Mon Sep 17 00:00:00 2001
From: Konstantin Ritt <ritt.ks@gmail.com>
Date: Tue, 11 Jan 2011 13:58:23 +0100
Subject: fix two more "comparison between signed and unsigned integer
 expressions" warnings

SQLLEN is unnecessarily an unsigned int

Merge-request: 955
Reviewed-by: Olivier Goffart <olivier.goffart@nokia.com>
---
 src/sql/drivers/odbc/qsql_odbc.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/sql/drivers/odbc/qsql_odbc.cpp b/src/sql/drivers/odbc/qsql_odbc.cpp
index 3e77779..445a3ac 100644
--- a/src/sql/drivers/odbc/qsql_odbc.cpp
+++ b/src/sql/drivers/odbc/qsql_odbc.cpp
@@ -391,7 +391,7 @@ static QString qGetStringData(SQLHANDLE hStmt, int column, int colSize, bool uni
                 // colSize-1: remove 0 termination when there is more data to fetch
                 int rSize = (r == SQL_SUCCESS_WITH_INFO) ? colSize : lengthIndicator/sizeof(SQLTCHAR);
                     fieldVal += fromSQLTCHAR(buf, rSize);
-                if (lengthIndicator < (unsigned int)colSize*sizeof(SQLTCHAR)) {
+                if (lengthIndicator < SQLLEN(colSize*sizeof(SQLTCHAR))) {
                     // workaround for Drivermanagers that don't return SQL_NO_DATA
                     break;
                 }
@@ -432,7 +432,7 @@ static QString qGetStringData(SQLHANDLE hStmt, int column, int colSize, bool uni
                 // colSize-1: remove 0 termination when there is more data to fetch
                 int rSize = (r == SQL_SUCCESS_WITH_INFO) ? colSize : lengthIndicator;
                     fieldVal += QString::fromUtf8((const char *)buf.constData(), rSize);
-                if (lengthIndicator < (unsigned int)colSize) {
+                if (lengthIndicator < SQLLEN(colSize)) {
                     // workaround for Drivermanagers that don't return SQL_NO_DATA
                     break;
                 }
-- 
cgit v0.12


From b500b9f35fbeaa5f0fe8bfaf7b225518bf6e636f Mon Sep 17 00:00:00 2001
From: Konstantin Ritt <ritt.ks@gmail.com>
Date: Tue, 11 Jan 2011 14:12:01 +0100
Subject: use qBinaryFind instead of bsearch

depending on platform, qBinaryFind might be up to 3 times faster than bsearch
or a bit bit slower at the worst case; so why don't simply use qBinaryFind instead of bsearch and be an optimist? ;)

also we know that all color names are in the lower case already and thus
we can avoid lowercasing of them again and again, and again;
the name to find needs to be lowercased separately instead.

some color-by-name-lookup numbers:
before:
 0.000737 msecs per iteration (total: 3,684, iterations: 5000000)
after:
 0.000154 msecs per iteration (total: 771, iterations: 5000000)

Merge-request: 906
Reviewed-by: Olivier Goffart <olivier.goffart@nokia.com>
---
 src/gui/image/qxpmhandler.cpp | 32 +++++++-------------------------
 src/gui/painting/qcolor_p.cpp | 36 ++++++++----------------------------
 2 files changed, 15 insertions(+), 53 deletions(-)

diff --git a/src/gui/image/qxpmhandler.cpp b/src/gui/image/qxpmhandler.cpp
index 453100c..6afb305 100644
--- a/src/gui/image/qxpmhandler.cpp
+++ b/src/gui/image/qxpmhandler.cpp
@@ -54,12 +54,6 @@
 #include "qplatformdefs.h"
 #endif
 
-#include <stdlib.h>
-
-#if defined(Q_OS_WINCE)
-#include "qguifunctions_wince.h"
-#endif
-
 QT_BEGIN_NAMESPACE
 
 static quint64 xpmHash(const QString &str)
@@ -751,27 +745,15 @@ static const struct XPMRGBData {
   { QRGB(139,139,  0),  "yellow4" },
   { QRGB(154,205, 50),  "yellowgreen" } };
 
-#if defined(Q_C_CALLBACKS)
-extern "C" {
-#endif
-static int rgb_cmp(const void *d1, const void *d2)
-{
-    return qstricmp(((XPMRGBData *)d1)->name, ((XPMRGBData *)d2)->name);
-}
-#if defined(Q_C_CALLBACKS)
-}
-#endif
+inline bool operator<(const char *name, const XPMRGBData &data)
+{ return qstrcmp(name, data.name) < 0; }
+inline bool operator<(const XPMRGBData &data, const char *name)
+{ return qstrcmp(data.name, name) < 0; }
 
-static bool qt_get_named_xpm_rgb(const char *name_no_space, QRgb *rgb)
+static inline bool qt_get_named_xpm_rgb(const char *name_no_space, QRgb *rgb)
 {
-    XPMRGBData x;
-    x.name = name_no_space;
-    // Function bsearch() is supposed to be
-    // void *bsearch(const void *key, const void *base, ...
-    // So why (char*)? Are there broken bsearch() declarations out there?
-    XPMRGBData *r = (XPMRGBData *)bsearch((char *)&x, (char *)xpmRgbTbl, xpmRgbTblSize,
-                                          sizeof(XPMRGBData), rgb_cmp);
-    if (r) {
+    const XPMRGBData *r = qBinaryFind(xpmRgbTbl, xpmRgbTbl + xpmRgbTblSize, name_no_space);
+    if (r != xpmRgbTbl + xpmRgbTblSize) {
         *rgb = r->value;
         return true;
     } else {
diff --git a/src/gui/painting/qcolor_p.cpp b/src/gui/painting/qcolor_p.cpp
index b1adf9f..d66990d 100644
--- a/src/gui/painting/qcolor_p.cpp
+++ b/src/gui/painting/qcolor_p.cpp
@@ -49,9 +49,6 @@
 #include "qrgb.h"
 #include "qstringlist.h"
 
-#if defined(Q_WS_WINCE)
-#include "qguifunctions_wince.h"
-#endif
 QT_BEGIN_NAMESPACE
 
 static inline int h2i(char hex)
@@ -290,33 +287,16 @@ static const int rgbTblSize = sizeof(rgbTbl) / sizeof(RGBData);
 
 #undef rgb
 
-QT_BEGIN_INCLUDE_NAMESPACE
-#include <stdlib.h>
-QT_END_INCLUDE_NAMESPACE
-
-#if defined(Q_C_CALLBACKS)
-extern "C" {
-#endif
-
-#ifdef Q_OS_WINCE
-static int __cdecl rgb_cmp(const void *d1, const void *d2)
-#else
-static int rgb_cmp(const void *d1, const void *d2)
-#endif
-{
-    return qstricmp(((RGBData *)d1)->name, ((RGBData *)d2)->name);
-}
-
-#if defined(Q_C_CALLBACKS)
-}
-#endif
+inline bool operator<(const char *name, const RGBData &data)
+{ return qstrcmp(name, data.name) < 0; }
+inline bool operator<(const RGBData &data, const char *name)
+{ return qstrcmp(data.name, name) < 0; }
 
-static bool get_named_rgb(const char *name, QRgb *rgb)
+static bool get_named_rgb(const char *name_no_space, QRgb *rgb)
 {
-    RGBData x;
-    x.name = name;
-    RGBData *r = (RGBData*)bsearch(&x, rgbTbl, rgbTblSize, sizeof(RGBData), rgb_cmp);
-    if (r) {
+    QByteArray name = QByteArray(name_no_space).toLower();
+    const RGBData *r = qBinaryFind(rgbTbl, rgbTbl + rgbTblSize, name.constData());
+    if (r != rgbTbl + rgbTblSize) {
         *rgb = r->value;
         return true;
     }
-- 
cgit v0.12


From 3e865c9f80bd3666673158e8a1664e7405fe9364 Mon Sep 17 00:00:00 2001
From: Konstantin Ritt <ritt.ks@gmail.com>
Date: Tue, 11 Jan 2011 14:12:02 +0100
Subject: use qBinaryFind instead of bsearch

Merge-request: 906
Reviewed-by: Olivier Goffart <olivier.goffart@nokia.com>
---
 src/plugins/codecs/kr/qeuckrcodec.cpp | 16 ++--------------
 1 file changed, 2 insertions(+), 14 deletions(-)

diff --git a/src/plugins/codecs/kr/qeuckrcodec.cpp b/src/plugins/codecs/kr/qeuckrcodec.cpp
index 1246164..0fbd2a0 100644
--- a/src/plugins/codecs/kr/qeuckrcodec.cpp
+++ b/src/plugins/codecs/kr/qeuckrcodec.cpp
@@ -67,11 +67,6 @@
 
 #include "qeuckrcodec.h"
 #include "cp949codetbl.h"
-#include <stdlib.h>
-
-#if defined(Q_OS_WINCE)
-#  include <qfunctions_wince.h>
-#endif
 
 QT_BEGIN_NAMESPACE
 
@@ -3402,11 +3397,6 @@ QByteArray QCP949Codec::_name()
   return "cp949";
 }
 
-int compare_ushort(const void *a, const void *b)
-{
-    return *(unsigned short *)a - *(unsigned short *)b;
-}
-
 /*!
   \reimp
 */
@@ -3434,10 +3424,8 @@ QByteArray QCP949Codec::convertFromUnicode(const QChar *uc, int len, ConverterSt
             *cursor++ = (j >> 8)   | 0x80;
             *cursor++ = (j & 0xff) | 0x80;
         } else {
-            unsigned short *ptr = (unsigned short *)bsearch(&ch, cp949_icode_to_unicode, 8822, 
-                sizeof(unsigned short), compare_ushort);
-
-            if(!ptr) {
+            const unsigned short *ptr = qBinaryFind(cp949_icode_to_unicode, cp949_icode_to_unicode + 8822, ch);
+            if (ptr == cp949_icode_to_unicode + 8822) {
                 // Error
                 *cursor++ = replacement;
                 ++invalid;
-- 
cgit v0.12


From 924238ae5a3c784d907cf6f95df8eb7c3e568970 Mon Sep 17 00:00:00 2001
From: Ritt Konstantin <ritt.ks@gmail.com>
Date: Tue, 11 Jan 2011 16:31:05 +0300
Subject: QProcessManager: minor optimization

QHash is slightly faster than QMap and should be preferred where
the key order has no meaning;
take() is faster than value() + remove()

Reviewed-by: Olivier Goffart
Merge-request: 1017
---
 src/corelib/io/qprocess_unix.cpp | 16 ++++++----------
 1 file changed, 6 insertions(+), 10 deletions(-)

diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp
index 299280e..d4cf3f5 100644
--- a/src/corelib/io/qprocess_unix.cpp
+++ b/src/corelib/io/qprocess_unix.cpp
@@ -95,7 +95,7 @@ QT_END_NAMESPACE
 #include <qfile.h>
 #include <qfileinfo.h>
 #include <qlist.h>
-#include <qmap.h>
+#include <qhash.h>
 #include <qmutex.h>
 #include <qsemaphore.h>
 #include <qsocketnotifier.h>
@@ -163,7 +163,7 @@ public:
 
 private:
     QMutex mutex;
-    QMap<int, QProcessInfo *> children;
+    QHash<int, QProcessInfo *> children;
 };
 
 
@@ -281,7 +281,7 @@ void QProcessManager::catchDeadChildren()
 
     // try to catch all children whose pid we have registered, and whose
     // deathPipe is still valid (i.e, we have not already notified it).
-    QMap<int, QProcessInfo *>::Iterator it = children.begin();
+    QHash<int, QProcessInfo *>::Iterator it = children.begin();
     while (it != children.end()) {
         // notify all children that they may have died. they need to run
         // waitpid() in their own thread.
@@ -320,15 +320,11 @@ void QProcessManager::remove(QProcess *process)
     QMutexLocker locker(&mutex);
 
     int serial = process->d_func()->serial;
-    QProcessInfo *info = children.value(serial);
-    if (!info)
-        return;
-
+    QProcessInfo *info = children.take(serial);
 #if defined (QPROCESS_DEBUG)
-    qDebug() << "QProcessManager::remove() removing pid" << info->pid << "process" << info->process;
+    if (info)
+        qDebug() << "QProcessManager::remove() removing pid" << info->pid << "process" << info->process;
 #endif
-
-    children.remove(serial);
     delete info;
 }
 
-- 
cgit v0.12


From eaf2e2187d9fec2102e3301098f85efe93518761 Mon Sep 17 00:00:00 2001
From: Sergio Ahumada <sergio.ahumada@nokia.com>
Date: Wed, 12 Jan 2011 11:07:34 +0100
Subject: Doc: Fixing typo

---
 src/gui/text/qtextformat.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/gui/text/qtextformat.cpp b/src/gui/text/qtextformat.cpp
index b05a830..15125b2 100644
--- a/src/gui/text/qtextformat.cpp
+++ b/src/gui/text/qtextformat.cpp
@@ -1858,7 +1858,7 @@ QFont QTextCharFormat::font() const
     indentation is set with setIndent(), the indentation of the first
     line with setTextIndent().
 
-    Line spacing is set with setLineHeight() and retreived via lineHeight()
+    Line spacing is set with setLineHeight() and retrieved via lineHeight()
     and lineHeightType(). The types of line spacing available are in the
     LineHeightTypes enum.
 
-- 
cgit v0.12


From a53e579a388c6bca6374b56328622bc8c1e0f138 Mon Sep 17 00:00:00 2001
From: Richard Moe Gustavsen <richard.gustavsen@nokia.com>
Date: Wed, 12 Jan 2011 10:47:29 +0100
Subject: Mac: pixmaps dont treat alpha exactly the same as other platforms

From fixing qwidget autotest, it seems to be the case that filling
a pixmap with a solid color on mac changes the hasAlpha status. This
is different from X11 (and raster engine). That is, the following
code will produce different result:

QPixmap pixmap(100, 100);
pixmap.setAlphaChannel(QPixmap(100, 100));
qDebug() << "Has alpha after setting channel?" << pixmap.hasAlpha();
pixmap.fill(Qt::red);
qDebug() << "Has alpha after fill?" << pixmap.hasAlpha();

So, this patch remove the possibility of converting an already alpha
supporting pixmap to non-alpha upon fill. NB: somewhat related, the
following code works the same on both x11, raster and mac (prints
'false'), but still seems wrong:

QPixmap pixmap2(pixmap);
qDebug() << "pixmap2 has alpha initially?" << pixmap2.hasAlpha();

Rev-By: Fabien Freling
---
 src/gui/image/qpixmap_mac.cpp | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/gui/image/qpixmap_mac.cpp b/src/gui/image/qpixmap_mac.cpp
index 31aa192..f152718 100644
--- a/src/gui/image/qpixmap_mac.cpp
+++ b/src/gui/image/qpixmap_mac.cpp
@@ -413,7 +413,11 @@ void QMacPixmapData::fill(const QColor &fillColor)
                 *(dptr + i) = colr;
         }
     }
-    macSetHasAlpha(fillColor.alpha() != 255);
+
+    // If we had an alpha channel from before, don't
+    // switch it off. Only go from no alpha to alpha:
+    if (fillColor.alpha() != 255)
+        macSetHasAlpha(true);
 }
 
 QPixmap QMacPixmapData::alphaChannel() const
-- 
cgit v0.12