diff --git a/SOURCES/evolution-shared-secondary-process.patch b/SOURCES/evolution-shared-secondary-process.patch
new file mode 100644
index 00000000..a506c0e8
--- /dev/null
+++ b/SOURCES/evolution-shared-secondary-process.patch
@@ -0,0 +1,15 @@
+diff --git a/Source/WebKit/UIProcess/API/glib/WebKitWebContext.cpp b/Source/WebKit/UIProcess/API/glib/WebKitWebContext.cpp
+index da25d96e35b5..242ce8c00eeb 100644
+--- a/Source/WebKit/UIProcess/API/glib/WebKitWebContext.cpp
++++ b/Source/WebKit/UIProcess/API/glib/WebKitWebContext.cpp
+@@ -381,6 +381,10 @@ static void webkitWebContextConstructed(GObject* object)
+ const char* useSingleWebProcess = getenv("WEBKIT_USE_SINGLE_WEB_PROCESS");
+ if (useSingleWebProcess && strcmp(useSingleWebProcess, "0"))
+ configuration.setUsesSingleWebProcess(true);
++ else {
++ if (!g_strcmp0(g_get_prgname(), "evolution"))
++ configuration.setUsesSingleWebProcess(true);
++ }
+ }
+ #endif
+
diff --git a/SOURCES/icu-7601.Indic-ccmp.patch b/SOURCES/icu-7601.Indic-ccmp.patch
new file mode 100644
index 00000000..9de5a456
--- /dev/null
+++ b/SOURCES/icu-7601.Indic-ccmp.patch
@@ -0,0 +1,44 @@
+diff -ru orig.icu/source/layout/IndicReordering.cpp icu/source/layout/IndicReordering.cpp
+--- orig.icu/source/layout/IndicReordering.cpp 2016-04-15 18:30:15.788856946 +0200
++++ icu/source/layout/IndicReordering.cpp 2016-04-15 18:30:39.244998995 +0200
+@@ -13,6 +13,7 @@
+
+ U_NAMESPACE_BEGIN
+
++#define ccmpFeatureTag LE_CCMP_FEATURE_TAG
+ #define loclFeatureTag LE_LOCL_FEATURE_TAG
+ #define initFeatureTag LE_INIT_FEATURE_TAG
+ #define nuktFeatureTag LE_NUKT_FEATURE_TAG
+@@ -35,6 +36,7 @@
+ #define caltFeatureTag LE_CALT_FEATURE_TAG
+ #define kernFeatureTag LE_KERN_FEATURE_TAG
+
++#define ccmpFeatureMask 0x00000001UL
+ #define loclFeatureMask 0x80000000UL
+ #define rphfFeatureMask 0x40000000UL
+ #define blwfFeatureMask 0x20000000UL
+@@ -73,7 +75,7 @@
+
+ #define repositionedGlyphMask 0x00000002UL
+
+-#define basicShapingFormsMask ( loclFeatureMask | nuktFeatureMask | akhnFeatureMask | rkrfFeatureMask | blwfFeatureMask | halfFeatureMask | vatuFeatureMask | cjctFeatureMask )
++#define basicShapingFormsMask ( ccmpFeatureMask | loclFeatureMask | nuktFeatureMask | akhnFeatureMask | rkrfFeatureMask | blwfFeatureMask | halfFeatureMask | vatuFeatureMask | cjctFeatureMask )
+ #define positioningFormsMask ( kernFeatureMask | distFeatureMask | abvmFeatureMask | blwmFeatureMask )
+ #define presentationFormsMask ( presFeatureMask | abvsFeatureMask | blwsFeatureMask | pstsFeatureMask | halnFeatureMask | caltFeatureMask )
+
+@@ -484,6 +486,7 @@
+ #define tagArray0 (rphfFeatureMask | tagArray1)
+
+ static const FeatureMap featureMap[] = {
++ {ccmpFeatureTag, ccmpFeatureMask},
+ {loclFeatureTag, loclFeatureMask},
+ {initFeatureTag, initFeatureMask},
+ {nuktFeatureTag, nuktFeatureMask},
+@@ -506,6 +509,7 @@
+ static const le_int32 featureCount = LE_ARRAY_SIZE(featureMap);
+
+ static const FeatureMap v2FeatureMap[] = {
++ {ccmpFeatureTag, ccmpFeatureMask},
+ {loclFeatureTag, loclFeatureMask},
+ {nuktFeatureTag, nuktFeatureMask},
+ {akhnFeatureTag, akhnFeatureMask},
diff --git a/SOURCES/icu-8198.revert.icu5431.patch b/SOURCES/icu-8198.revert.icu5431.patch
new file mode 100644
index 00000000..4c3e78b8
--- /dev/null
+++ b/SOURCES/icu-8198.revert.icu5431.patch
@@ -0,0 +1,129 @@
+Index: icu/trunk/source/layout/IndicReordering.cpp
+===================================================================
+--- icu/trunk/source/layout/IndicReordering.cpp (revision 25772)
++++ icu/trunk/source/layout/IndicReordering.cpp (revision 26090)
+@@ -126,4 +126,8 @@
+ FeatureMask fSMFeatures;
+
++ LEUnicode fPreBaseConsonant;
++ LEUnicode fPreBaseVirama;
++ le_int32 fPBCIndex;
++ FeatureMask fPBCFeatures;
+
+ void saveMatra(LEUnicode matra, le_int32 matraIndex, IndicClassTable::CharClass matraClass)
+@@ -172,5 +176,6 @@
+ fMatraFeatures(0), fMPreOutIndex(-1), fMPreFixups(mpreFixups),
+ fVMabove(0), fVMpost(0), fVMIndex(0), fVMFeatures(0),
+- fSMabove(0), fSMbelow(0), fSMIndex(0), fSMFeatures(0)
++ fSMabove(0), fSMbelow(0), fSMIndex(0), fSMFeatures(0),
++ fPreBaseConsonant(0), fPreBaseVirama(0), fPBCIndex(0), fPBCFeatures(0)
+ {
+ // nothing else to do...
+@@ -191,4 +196,6 @@
+ fVMabove = fVMpost = 0;
+ fSMabove = fSMbelow = 0;
++
++ fPreBaseConsonant = fPreBaseVirama = 0;
+ }
+
+@@ -386,4 +393,12 @@
+ }
+
++ void notePreBaseConsonant(le_uint32 index,LEUnicode PBConsonant, LEUnicode PBVirama, FeatureMask features)
++ {
++ fPBCIndex = index;
++ fPreBaseConsonant = PBConsonant;
++ fPreBaseVirama = PBVirama;
++ fPBCFeatures = features;
++ }
++
+ void noteBaseConsonant()
+ {
+@@ -465,4 +480,20 @@
+ }
+
++ void writePreBaseConsonant()
++ {
++ // The TDIL spec says that consonant + virama + RRA should produce a rakar in Malayalam. However,
++ // it seems that almost none of the fonts for Malayalam are set up to handle this.
++ // So, we're going to force the issue here by using the rakar as defined with RA in most fonts.
++
++ if (fPreBaseConsonant == 0x0d31) { // RRA
++ fPreBaseConsonant = 0x0d30; // RA
++ }
++
++ if (fPreBaseConsonant != 0) {
++ writeChar(fPreBaseConsonant, fPBCIndex, fPBCFeatures);
++ writeChar(fPreBaseVirama,fPBCIndex-1,fPBCFeatures);
++ }
++ }
++
+ le_int32 getOutputIndex()
+ {
+@@ -723,4 +754,5 @@
+ }
+
++
+ IndicClassTable::CharClass charClass = CC_RESERVED;
+ IndicClassTable::CharClass nextClass = CC_RESERVED;
+@@ -730,7 +762,9 @@
+ le_bool seenVattu = FALSE;
+ le_bool seenBelowBaseForm = FALSE;
++ le_bool seenPreBaseForm = FALSE;
+ le_bool hasNukta = FALSE;
+ le_bool hasBelowBaseForm = FALSE;
+ le_bool hasPostBaseForm = FALSE;
++ le_bool hasPreBaseForm = FALSE;
+
+ if (postBase < markStart && classTable->isNukta(chars[postBase])) {
+@@ -746,12 +780,20 @@
+ hasBelowBaseForm = IndicClassTable::hasBelowBaseForm(charClass) && !hasNukta;
+ hasPostBaseForm = IndicClassTable::hasPostBaseForm(charClass) && !hasNukta;
++ hasPreBaseForm = IndicClassTable::hasPreBaseForm(charClass) && !hasNukta;
+
+ if (IndicClassTable::isConsonant(charClass)) {
+ if (postBaseLimit == 0 || seenVattu ||
+ (baseConsonant > baseLimit && !classTable->isVirama(chars[baseConsonant - 1])) ||
+- !(hasBelowBaseForm || hasPostBaseForm)) {
++ !(hasBelowBaseForm || hasPostBaseForm || hasPreBaseForm)) {
+ break;
+ }
+
++ // Note any pre-base consonants
++ if ( baseConsonant == lastConsonant && lastConsonant > 0 &&
++ hasPreBaseForm && classTable->isVirama(chars[baseConsonant - 1])) {
++ output.notePreBaseConsonant(lastConsonant,chars[lastConsonant],chars[lastConsonant-1],tagArray2);
++ seenPreBaseForm = TRUE;
++
++ }
+ // consonants with nuktas are never vattus
+ seenVattu = IndicClassTable::isVattu(charClass) && !hasNukta;
+@@ -786,10 +828,12 @@
+
+ // write any pre-base consonants
++ output.writePreBaseConsonant();
++
+ le_bool supressVattu = TRUE;
+
+ for (i = baseLimit; i < baseConsonant; i += 1) {
+ LEUnicode ch = chars[i];
+- // Don't put 'blwf' on first consonant.
+- FeatureMask features = (i == baseLimit? tagArray2 : tagArray1);
++ // Don't put 'pstf' or 'blwf' on anything before the base consonant.
++ FeatureMask features = tagArray1 & ~( pstfFeatureMask | blwfFeatureMask );
+
+ charClass = classTable->getCharClass(ch);
+@@ -842,5 +886,5 @@
+
+ // write below-base consonants
+- if (baseConsonant != lastConsonant) {
++ if (baseConsonant != lastConsonant && !seenPreBaseForm) {
+ for (i = bcSpan + 1; i < postBase; i += 1) {
+ output.writeChar(chars[i], i, tagArray1);
+@@ -872,5 +916,5 @@
+ // write post-base consonants
+ // FIXME: does this put the right tags on post-base consonants?
+- if (baseConsonant != lastConsonant) {
++ if (baseConsonant != lastConsonant && !seenPreBaseForm) {
+ if (postBase <= lastConsonant) {
+ for (i = postBase; i <= lastConsonant; i += 1) {
diff --git a/SOURCES/icu-8800.freeserif.crash.patch b/SOURCES/icu-8800.freeserif.crash.patch
new file mode 100644
index 00000000..6d8061aa
--- /dev/null
+++ b/SOURCES/icu-8800.freeserif.crash.patch
@@ -0,0 +1,14 @@
+diff -ru orig.icu/source/layout/LookupProcessor.cpp icu/source/layout/LookupProcessor.cpp
+--- orig.icu/source/layout/LookupProcessor.cpp 2016-03-23 21:56:44.000000000 +0100
++++ icu/source/layout/LookupProcessor.cpp 2016-04-15 18:19:26.903927005 +0200
+@@ -223,7 +223,9 @@
+
+ if (requiredFeatureIndex != 0xFFFF) {
+ requiredFeatureTable = featureListTable->getFeatureTable(featureListTable, requiredFeatureIndex, &requiredFeatureTag, success);
+- featureReferences += SWAPW(requiredFeatureTable->lookupCount);
++ if (requiredFeatureTable.isValid()) {
++ featureReferences += SWAPW(requiredFeatureTable->lookupCount);
++ }
+ }
+
+ lookupOrderArray = LE_NEW_ARRAY(le_uint16, featureReferences);
diff --git a/SOURCES/icu-armv7hl-disable-tests.patch b/SOURCES/icu-armv7hl-disable-tests.patch
new file mode 100644
index 00000000..2d869b1a
--- /dev/null
+++ b/SOURCES/icu-armv7hl-disable-tests.patch
@@ -0,0 +1,96 @@
+diff -ru orig.icu/source/test/cintltst/cnmdptst.c icu/source/test/cintltst/cnmdptst.c
+--- orig.icu/source/test/cintltst/cnmdptst.c 2016-03-23 21:48:18.000000000 +0100
++++ icu/source/test/cintltst/cnmdptst.c 2016-04-15 18:34:06.148251985 +0200
+@@ -186,6 +186,12 @@
+ /* Test exponential pattern*/
+ static void TestExponential(void)
+ {
++/* erAck: fails on armv7hl, https://bugzilla.redhat.com/show_bug.cgi?id=1239574 */
++#if 1
++ /* Actually only 3 tests fail, but given the nested structure depending on
++ * array sizes there's no simple "disable this and that". */
++ return;
++#endif
+ int32_t pat_length, val_length, lval_length;
+ int32_t ival, ilval, p, v, lneed;
+ UNumberFormat *fmt;
+diff -ru orig.icu/source/test/intltest/dcfmtest.cpp icu/source/test/intltest/dcfmtest.cpp
+--- orig.icu/source/test/intltest/dcfmtest.cpp 2016-03-23 21:48:38.000000000 +0100
++++ icu/source/test/intltest/dcfmtest.cpp 2016-04-15 18:34:06.148251985 +0200
+@@ -279,6 +279,13 @@
+ //
+ formatLineMat.reset(testLine);
+ if (formatLineMat.lookingAt(status)) {
++/* erAck: fails on armv7hl, https://bugzilla.redhat.com/show_bug.cgi?id=1239574 */
++#if 1
++// [Formattable] file dcfmtest.txt, line 62: expected "12.35E5", got "1.235E6"
++// [StringPiece] file dcfmtest.txt, line 62: expected "12.35E5", got "1.235E6"
++ if (lineNum == 62)
++ continue;
++#endif
+ execFormatTest(lineNum,
+ formatLineMat.group(1, status), // Pattern
+ formatLineMat.group(2, status), // rounding mode
+diff -ru orig.icu/source/test/intltest/numfmtspectest.cpp icu/source/test/intltest/numfmtspectest.cpp
+--- orig.icu/source/test/intltest/numfmtspectest.cpp 2016-03-23 21:48:40.000000000 +0100
++++ icu/source/test/intltest/numfmtspectest.cpp 2016-04-15 18:34:06.148251985 +0200
+@@ -137,11 +137,14 @@
+
+ void NumberFormatSpecificationTest::TestScientificNotation() {
+ assertPatternFr("1,23E4", 12345.0, "0.00E0", TRUE);
++/* erAck: fails on armv7hl, https://bugzilla.redhat.com/show_bug.cgi?id=1239574 */
++#if 0
+ assertPatternFr("123,00E2", 12300.0, "000.00E0", TRUE);
+ assertPatternFr("123,0E2", 12300.0, "000.0#E0", TRUE);
+ assertPatternFr("123,0E2", 12300.1, "000.0#E0", TRUE);
+ assertPatternFr("123,01E2", 12301.0, "000.0#E0", TRUE);
+ assertPatternFr("123,01E+02", 12301.0, "000.0#E+00", TRUE);
++#endif
+ assertPatternFr("12,3E3", 12345.0, "##0.00E0", TRUE);
+ assertPatternFr("12,300E3", 12300.1, "##0.0000E0", TRUE);
+ assertPatternFr("12,30E3", 12300.1, "##0.000#E0", TRUE);
+@@ -221,6 +224,8 @@
+ assertEquals("", "USD (433.22)", result, TRUE);
+ }
+ }
++/* erAck: fails on armv7hl, https://bugzilla.redhat.com/show_bug.cgi?id=1239574 */
++#if 0
+ const char *paddedSciPattern = "QU**00.#####E0";
+ assertPatternFr("QU***43,3E-1", 4.33, paddedSciPattern, TRUE);
+ {
+@@ -242,6 +247,7 @@
+ }
+ // padding cannot work as intended with scientific notation.
+ assertPatternFr("QU**43,32E-1", 4.332, paddedSciPattern, TRUE);
++#endif
+ }
+
+ void NumberFormatSpecificationTest::assertPatternFr(
+diff -ru orig.icu/source/test/intltest/numfmtst.cpp icu/source/test/intltest/numfmtst.cpp
+--- orig.icu/source/test/intltest/numfmtst.cpp 2016-03-23 21:48:40.000000000 +0100
++++ icu/source/test/intltest/numfmtst.cpp 2016-04-15 18:34:06.150251997 +0200
+@@ -730,6 +730,12 @@
+ void
+ NumberFormatTest::TestExponential(void)
+ {
++/* erAck: fails on armv7hl, https://bugzilla.redhat.com/show_bug.cgi?id=1239574 */
++#if 1
++ /* Actually only 3 tests fail, but given the nested structure depending on
++ * array sizes there's no simple "disable this and that". */
++ return;
++#endif
+ UErrorCode status = U_ZERO_ERROR;
+ DecimalFormatSymbols sym(Locale::getUS(), status);
+ if (U_FAILURE(status)) { errcheckln(status, "FAIL: Bad status returned by DecimalFormatSymbols ct - %s", u_errorName(status)); return; }
+@@ -1846,8 +1852,11 @@
+ (int32_t) 45678000, "5E7", status);
+ expect(new DecimalFormat("00E0", US, status),
+ (int32_t) 45678000, "46E6", status);
++/* erAck: fails on armv7hl, https://bugzilla.redhat.com/show_bug.cgi?id=1239574 */
++#if 0
+ expect(new DecimalFormat("000E0", US, status),
+ (int32_t) 45678000, "457E5", status);
++#endif
+ /*
+ expect(new DecimalFormat("###E0", US, status),
+ new Object[] { new Double(0.0000123), "12.3E-6",
diff --git a/SOURCES/icu-diff-icu_trunk_source_common_locid.cpp-from-39282-to-39384.patch b/SOURCES/icu-diff-icu_trunk_source_common_locid.cpp-from-39282-to-39384.patch
new file mode 100644
index 00000000..896cddaa
--- /dev/null
+++ b/SOURCES/icu-diff-icu_trunk_source_common_locid.cpp-from-39282-to-39384.patch
@@ -0,0 +1,156 @@
+Index: icu/trunk/source/common/locid.cpp
+===================================================================
+--- icu/source/common/locid.cpp (revision 39282)
++++ icu/source/common/locid.cpp (revision 39384)
+@@ -45,4 +45,5 @@
+ #include "ucln_cmn.h"
+ #include "ustr_imp.h"
++#include "charstr.h"
+
+ U_CDECL_BEGIN
+@@ -59,4 +60,10 @@
+ static UHashtable *gDefaultLocalesHashT = NULL;
+ static Locale *gDefaultLocale = NULL;
++
++/**
++ * \def ULOC_STRING_LIMIT
++ * strings beyond this value crash in CharString
++ */
++#define ULOC_STRING_LIMIT 357913941
+
+ U_NAMESPACE_END
+@@ -286,5 +293,5 @@
+ else
+ {
+- MaybeStackArray togo;
++ UErrorCode status = U_ZERO_ERROR;
+ int32_t size = 0;
+ int32_t lsize = 0;
+@@ -292,5 +299,4 @@
+ int32_t vsize = 0;
+ int32_t ksize = 0;
+- char *p;
+
+ // Calculate the size of the resulting string.
+@@ -300,6 +306,12 @@
+ {
+ lsize = (int32_t)uprv_strlen(newLanguage);
++ if ( lsize < 0 || lsize > ULOC_STRING_LIMIT ) { // int32 wrap
++ setToBogus();
++ return;
++ }
+ size = lsize;
+ }
++
++ CharString togo(newLanguage, lsize, status); // start with newLanguage
+
+ // _Country
+@@ -307,4 +319,8 @@
+ {
+ csize = (int32_t)uprv_strlen(newCountry);
++ if ( csize < 0 || csize > ULOC_STRING_LIMIT ) { // int32 wrap
++ setToBogus();
++ return;
++ }
+ size += csize;
+ }
+@@ -321,4 +337,8 @@
+ // remove trailing _'s
+ vsize = (int32_t)uprv_strlen(newVariant);
++ if ( vsize < 0 || vsize > ULOC_STRING_LIMIT ) { // int32 wrap
++ setToBogus();
++ return;
++ }
+ while( (vsize>1) && (newVariant[vsize-1] == SEP_CHAR) )
+ {
+@@ -345,48 +365,30 @@
+ {
+ ksize = (int32_t)uprv_strlen(newKeywords);
++ if ( ksize < 0 || ksize > ULOC_STRING_LIMIT ) {
++ setToBogus();
++ return;
++ }
+ size += ksize + 1;
+ }
+
+-
+ // NOW we have the full locale string..
+-
+- /*if the whole string is longer than our internal limit, we need
+- to go to the heap for temporary buffers*/
+- if (size >= togo.getCapacity())
+- {
+- // If togo_heap could not be created, initialize with default settings.
+- if (togo.resize(size+1) == NULL) {
+- init(NULL, FALSE);
+- }
+- }
+-
+- togo[0] = 0;
+-
+ // Now, copy it back.
+- p = togo.getAlias();
+- if ( lsize != 0 )
+- {
+- uprv_strcpy(p, newLanguage);
+- p += lsize;
+- }
++
++ // newLanguage is already copied
+
+ if ( ( vsize != 0 ) || (csize != 0) ) // at least: __v
+ { // ^
+- *p++ = SEP_CHAR;
++ togo.append(SEP_CHAR, status);
+ }
+
+ if ( csize != 0 )
+ {
+- uprv_strcpy(p, newCountry);
+- p += csize;
++ togo.append(newCountry, status);
+ }
+
+ if ( vsize != 0)
+ {
+- *p++ = SEP_CHAR; // at least: __v
+-
+- uprv_strncpy(p, newVariant, vsize); // Must use strncpy because
+- p += vsize; // of trimming (above).
+- *p = 0; // terminate
++ togo.append(SEP_CHAR, status)
++ .append(newVariant, vsize, status);
+ }
+
+@@ -394,19 +396,23 @@
+ {
+ if (uprv_strchr(newKeywords, '=')) {
+- *p++ = '@'; /* keyword parsing */
++ togo.append('@', status); /* keyword parsing */
+ }
+ else {
+- *p++ = '_'; /* Variant parsing with a script */
++ togo.append('_', status); /* Variant parsing with a script */
+ if ( vsize == 0) {
+- *p++ = '_'; /* No country found */
++ togo.append('_', status); /* No country found */
+ }
+ }
+- uprv_strcpy(p, newKeywords);
+- p += ksize;
+- }
+-
++ togo.append(newKeywords, status);
++ }
++
++ if (U_FAILURE(status)) {
++ // Something went wrong with appending, etc.
++ setToBogus();
++ return;
++ }
+ // Parse it, because for example 'language' might really be a complete
+ // string.
+- init(togo.getAlias(), FALSE);
++ init(togo.data(), FALSE);
+ }
+ }
diff --git a/SOURCES/icu-dont_use_clang_even_if_installed.patch b/SOURCES/icu-dont_use_clang_even_if_installed.patch
new file mode 100644
index 00000000..fb4d191e
--- /dev/null
+++ b/SOURCES/icu-dont_use_clang_even_if_installed.patch
@@ -0,0 +1,16 @@
+diff -up icu/source/configure.ac.dont_use_clang_even_if_installed icu/source/configure.ac
+--- icu/source/configure.ac.dont_use_clang_even_if_installed 2017-02-10 13:36:23.708830671 +0100
++++ icu/source/configure.ac 2017-02-10 13:37:00.618423307 +0100
+@@ -132,10 +132,10 @@ AC_SUBST(ENABLE_RELEASE)
+ : ${CXXFLAGS=""}
+
+ # Checks for compilers
+-AC_PROG_CC([clang gcc cc c99 c89 xlc_r xlc cl.exe icc])
++AC_PROG_CC([gcc cc c99 c89 xlc_r xlc cl.exe icc])
+ # Make sure that we try clang++ first, which provides C++11 support.
+ # The g++ compiler is less likely to support C++11.
+-AC_PROG_CXX([clang++ g++ c++ gpp xlC_r xlC aCC CC cxx cc++ cl.exe icc FCC KCC RCC])
++AC_PROG_CXX([g++ c++ gpp xlC_r xlC aCC CC cxx cc++ cl.exe icc FCC KCC RCC])
+
+ # pkg-config is needed for harfbuzz support
+ PKG_PROG_PKG_CONFIG([0.20])
diff --git a/SOURCES/icu-gennorm2-man.patch b/SOURCES/icu-gennorm2-man.patch
new file mode 100644
index 00000000..07b5b9d3
--- /dev/null
+++ b/SOURCES/icu-gennorm2-man.patch
@@ -0,0 +1,128 @@
+Description: supply manual page for program that doesn't have one
+Author: Jay Berkenbilt
+Bug: http://bugs.icu-project.org/trac/ticket/7554
+
+diff -r -u -N icu.orig/source/tools/gennorm2/gennorm2.8.in icu/source/tools/gennorm2/gennorm2.8.in
+--- icu.orig/source/tools/gennorm2/gennorm2.8.in 1970-01-01 01:00:00.000000000 +0100
++++ icu/source/tools/gennorm2/gennorm2.8.in 2013-02-25 16:43:28.297062638 +0100
+@@ -0,0 +1,71 @@
++.\" Hey, Emacs! This is -*-nroff-*- you know...
++.\"
++.\" gennorm2.8: manual page for the gennorm2 utility
++.\"
++.\" Copyright (C) 2005-2006 International Business Machines Corporation and others
++.\"
++.TH GENNORM2 8 "15 March 2010" "ICU MANPAGE" "ICU @VERSION@ Manual"
++.SH NAME
++.B gennorm2
++\- Builds binary data file with Unicode normalization data.
++.SH SYNOPSIS
++.B gennorm2
++[
++.BR "\-h\fP, \fB\-?\fP, \fB\-\-help"
++]
++[
++.BR "\-V\fP, \fB\-\-version"
++]
++[
++.BR "\-c\fP, \fB\-\-copyright"
++]
++[
++.BR "\-v\fP, \fB\-\-verbose"
++]
++[
++.BI "\-u\fP, \fB\-\-unicode" " unicode\-version\-number"
++]
++[
++.BI "\-s\fP, \fB\-\-sourcedir" " source\-directory"
++]
++[
++.BI "\-o\fP, \fB\-\-output" " output\-filename"
++]
++.BI "\fB\-\-fast"
++.SH DESCRIPTION
++.B gennorm2
++reads text files that define Unicode normalization,
++them, and builds a binary data file.
++.SH OPTIONS
++.TP
++.BR "\-h\fP, \fB\-?\fP, \fB\-\-help"
++Print help about usage and exit.
++.TP
++.BR "\-V\fP, \fB\-\-version"
++Print the version of
++.B gennorm2
++and exit.
++.TP
++.BR "\-c\fP, \fB\-\-copyright"
++Include a copyright notice.
++.TP
++.BR "\-v\fP, \fB\-\-verbose"
++Display extra informative messages during execution.
++.TP
++.BR "\-u\fP, \fB\-\-unicode"
++Specify Unicode version number, such as 5.2.0.
++.TP
++.BI "\-s\fP, \fB\-\-sourcedir" " source\-directory"
++Specify the input directory.
++.TP
++.BI "\-s\fP, \fB\-\-sourcedir" " source\-directory"
++Set the name of the output file.
++.TP
++.BI "\fB\-\-fast"
++optimize the .nrm file for fast normalization,
++which might increase its size (Writes fully decomposed
++regular mappings instead of delta mappings.
++You should measure the runtime speed to make sure that
++this is a good trade-off.)
++.SH COPYRIGHT
++Copyright (C) 2009-2010 International Business Machines Corporation and others
+diff -r -u -N icu.orig/source/tools/gennorm2/Makefile.in icu/source/tools/gennorm2/Makefile.in
+--- icu.orig/source/tools/gennorm2/Makefile.in 2013-01-11 01:23:32.000000000 +0100
++++ icu/source/tools/gennorm2/Makefile.in 2013-02-25 16:43:28.296062632 +0100
+@@ -16,8 +16,13 @@
+
+ TARGET_STUB_NAME = gennorm2
+
++SECTION = 8
++
++MAN_FILES = $(TARGET_STUB_NAME).$(SECTION)
++
++
+ ## Extra files to remove for 'make clean'
+-CLEANFILES = *~ $(DEPS)
++CLEANFILES = *~ $(DEPS) $(MAN_FILES)
+
+ ## Target information
+ TARGET = $(BINDIR)/$(TARGET_STUB_NAME)$(EXEEXT)
+@@ -44,12 +49,16 @@
+ dist: dist-local
+ check: all check-local
+
+-all-local: $(TARGET)
++all-local: $(TARGET) $(MAN_FILES)
+
+-install-local: all-local
++install-local: all-local install-man
+ $(MKINSTALLDIRS) $(DESTDIR)$(sbindir)
+ $(INSTALL) $(TARGET) $(DESTDIR)$(sbindir)
+
++install-man: $(MAN_FILES)
++ $(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man$(SECTION)
++ $(INSTALL_DATA) $? $(DESTDIR)$(mandir)/man$(SECTION)
++
+ dist-local:
+
+ clean-local:
+@@ -70,6 +79,11 @@
+ $(POST_BUILD_STEP)
+
+
++%.$(SECTION): $(srcdir)/%.$(SECTION).in
++ cd $(top_builddir) \
++ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
++
++
+ ifeq (,$(MAKECMDGOALS))
+ -include $(DEPS)
+ else
diff --git a/SOURCES/icu-icuinfo-man.patch b/SOURCES/icu-icuinfo-man.patch
new file mode 100644
index 00000000..987e8799
--- /dev/null
+++ b/SOURCES/icu-icuinfo-man.patch
@@ -0,0 +1,145 @@
+Description: supply manual page for program that doesn't have one
+Author: Jay Berkenbilt
+Bug: http://bugs.icu-project.org/trac/ticket/7665
+erAck: adapted to ICU 56.1 icu/source/tools/icuinfo/Makefile.in
+
+diff -Nur orig.icu/source/tools/icuinfo/icuinfo.1.in icu/source/tools/icuinfo/icuinfo.1.in
+--- orig.icu/source/tools/icuinfo/icuinfo.1.in 1970-01-01 01:00:00.000000000 +0100
++++ icu/source/tools/icuinfo/icuinfo.1.in 2015-10-27 19:19:35.184056800 +0100
+@@ -0,0 +1,76 @@
++.\" Hey, Emacs! This is -*-nroff-*- you know...
++.\"
++.\" icuinfo.1: manual page for the icuinfo utility
++.\"
++.\" Copyright (C) 2005-2006 International Business Machines Corporation and others
++.\"
++.TH ICUINFO 1 "1 May 2010" "ICU MANPAGE" "ICU @VERSION@ Manual"
++.SH NAME
++.B icuinfo
++\- Shows some basic info about the current ICU
++.SH SYNOPSIS
++.B icuinfo
++[
++.BR "\-h\fP, \fB\-?\fP, \fB\-\-help"
++]
++[
++.BR "\-V\fP, \fB\-\-version"
++]
++[
++.BR "\-c\fP, \fB\-\-copyright"
++]
++[
++.BI "\-i\fP, \fB\-\-icudatadir" " directory"
++]
++[
++.BR "\-v\fP, \fB\-\-verbose"
++]
++[
++.BI "\-L\fP, \fB\-\-list-plugins"
++]
++[
++.BI "\-m\fP, \fB\-\-milisecond-time"
++]
++[
++.BI "\-K\fP, \fB\-\-cleanup"
++]
++.SH DESCRIPTION
++.B icuinfo
++prints basic information about the current version of ICU.
++.SH OPTIONS
++.TP
++.BR "\-h\fP, \fB\-?\fP, \fB\-\-help"
++Print help about usage and exit.
++.TP
++.BR "\-V\fP, \fB\-\-version"
++Print the version of
++.B icuinfo
++and exit.
++.TP
++.BR "\-c\fP, \fB\-\-copyright"
++Embeds the standard ICU copyright into the
++.IR output-file .
++.TP
++.BR "\-v\fP, \fB\-\-verbose"
++Display extra informative messages during execution.
++.TP
++.BI "\-i\fP, \fB\-\-icudatadir" " directory"
++Look for any necessary ICU data files in
++.IR directory .
++For example, the file
++.B pnames.icu
++must be located when ICU's data is not built as a shared library.
++The default ICU data directory is specified by the environment variable
++.BR ICU_DATA .
++Most configurations of ICU do not require this argument.
++.TP
++.BI "\-L\fP, \fB\-\-list-plugins"
++If specified, list and diagnose issues with ICU plugins.
++.TP
++.BI "\-K\fP, \fB\-\-cleanup"
++Attempt to unload plugins before exiting.
++.TP
++.BI "\-m\fP, \fB\-\-milisecond-time"
++Print the current UTC time in milliseconds.
++.SH COPYRIGHT
++Copyright (C) 2010 International Business Machines Corporation and others
+diff -Nur orig.icu/source/tools/icuinfo/Makefile.in icu/source/tools/icuinfo/Makefile.in
+--- orig.icu/source/tools/icuinfo/Makefile.in 2015-10-08 05:53:56.000000000 +0200
++++ icu/source/tools/icuinfo/Makefile.in 2015-10-27 19:23:19.115509906 +0100
+@@ -14,8 +14,15 @@
+ ## Build directory information
+ subdir = tools/icuinfo
+
++TARGET_STUB_NAME = icuinfo
++
++SECTION = 1
++
++MAN_FILES = $(TARGET_STUB_NAME).$(SECTION)
++
++
+ ## Extra files to remove for 'make clean'
+-CLEANFILES = *~ $(DEPS) $(PLUGIN_OBJECTS) $(PLUGINFILE) $(PLUGIN)
++CLEANFILES = *~ $(DEPS) $(PLUGIN_OBJECTS) $(PLUGINFILE) $(PLUGIN) $(MAN_FILES)
+
+ ## Target information
+ TARGET = icuinfo$(EXEEXT)
+@@ -35,7 +42,8 @@
+
+ ## List of phony targets
+ .PHONY : all all-local install install-local clean clean-local \
+-distclean distclean-local dist dist-local check check-local plugin-check
++distclean distclean-local dist dist-local check check-local plugin-check \
++install-man
+
+ ## Clear suffix list
+ .SUFFIXES :
+@@ -48,12 +56,16 @@
+ dist: dist-local
+ check: all check-local
+
+-all-local: $(TARGET)
++all-local: $(TARGET) $(MAN_FILES)
+
+-install-local: all-local
++install-local: all-local install-man
+ $(MKINSTALLDIRS) $(DESTDIR)$(bindir)
+ $(INSTALL) $(TARGET) $(DESTDIR)$(bindir)
+
++install-man: $(MAN_FILES)
++ $(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man$(SECTION)
++ $(INSTALL_DATA) $? $(DESTDIR)$(mandir)/man$(SECTION)
++
+ dist-local:
+
+ clean-local:
+@@ -103,6 +115,10 @@
+ @echo "Plugins are disabled (use --enable-plugins to enable)"
+ endif
+
++%.$(SECTION): $(srcdir)/%.$(SECTION).in
++ cd $(top_builddir) \
++ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
++
+ ifeq (,$(MAKECMDGOALS))
+ -include $(DEPS)
+ else
diff --git a/SOURCES/icu-rhbz1360340-icu-changeset-39109.patch b/SOURCES/icu-rhbz1360340-icu-changeset-39109.patch
new file mode 100644
index 00000000..90f4d1eb
--- /dev/null
+++ b/SOURCES/icu-rhbz1360340-icu-changeset-39109.patch
@@ -0,0 +1,244 @@
+# Offsets corected from https://ssl.icu-project.org/trac/changeset/39109
+diff -ru icu.orig/source/common/uloc.cpp icu/source/common/uloc.cpp
+--- icu.orig/source/common/uloc.cpp 2016-03-23 21:50:12.000000000 +0100
++++ icu/source/common/uloc.cpp 2016-11-01 15:21:16.542151312 +0100
+@@ -2246,7 +2246,7 @@
+ typedef struct {
+ float q;
+ int32_t dummy; /* to avoid uninitialized memory copy from qsort */
+- char *locale;
++ char locale[ULOC_FULLNAME_CAPACITY+1];
+ } _acceptLangItem;
+
+ static int32_t U_CALLCONV
+@@ -2288,9 +2288,7 @@
+ UEnumeration* availableLocales,
+ UErrorCode *status)
+ {
+- _acceptLangItem *j;
+- _acceptLangItem smallBuffer[30];
+- char **strs;
++ MaybeStackArray<_acceptLangItem, 4> items; // Struct for collecting items.
+ char tmp[ULOC_FULLNAME_CAPACITY +1];
+ int32_t n = 0;
+ const char *itemEnd;
+@@ -2300,11 +2298,7 @@
+ int32_t res;
+ int32_t i;
+ int32_t l = (int32_t)uprv_strlen(httpAcceptLanguage);
+- int32_t jSize;
+- char *tempstr; /* Use for null pointer check */
+
+- j = smallBuffer;
+- jSize = UPRV_LENGTHOF(smallBuffer);
+ if(U_FAILURE(*status)) {
+ return -1;
+ }
+@@ -2332,27 +2326,29 @@
+ while(isspace(*t)) {
+ t++;
+ }
+- j[n].q = (float)_uloc_strtod(t,NULL);
++ items[n].q = (float)_uloc_strtod(t,NULL);
+ } else {
+ /* no semicolon - it's 1.0 */
+- j[n].q = 1.0f;
++ items[n].q = 1.0f;
+ paramEnd = itemEnd;
+ }
+- j[n].dummy=0;
++ items[n].dummy=0;
+ /* eat spaces prior to semi */
+ for(t=(paramEnd-1);(paramEnd>s)&&isspace(*t);t--)
+ ;
+- /* Check for null pointer from uprv_strndup */
+- tempstr = uprv_strndup(s,(int32_t)((t+1)-s));
+- if (tempstr == NULL) {
+- *status = U_MEMORY_ALLOCATION_ERROR;
+- return -1;
+- }
+- j[n].locale = tempstr;
+- uloc_canonicalize(j[n].locale,tmp,UPRV_LENGTHOF(tmp),status);
+- if(strcmp(j[n].locale,tmp)) {
+- uprv_free(j[n].locale);
+- j[n].locale=uprv_strdup(tmp);
++ int32_t slen = ((t+1)-s);
++ if(slen > ULOC_FULLNAME_CAPACITY) {
++ *status = U_BUFFER_OVERFLOW_ERROR;
++ return -1; // too big
++ }
++ uprv_strncpy(items[n].locale, s, slen);
++ items[n].locale[slen]=0; // terminate
++ int32_t clen = uloc_canonicalize(items[n].locale, tmp, UPRV_LENGTHOF(tmp)-1, status);
++ if(U_FAILURE(*status)) return -1;
++ if((clen!=slen) || (uprv_strncmp(items[n].locale, tmp, slen))) {
++ // canonicalization had an effect- copy back
++ uprv_strncpy(items[n].locale, tmp, clen);
++ items[n].locale[clen] = 0; // terminate
+ }
+ #if defined(ULOC_DEBUG)
+ /*fprintf(stderr,"%d: s <%s> q <%g>\n", n, j[n].locale, j[n].q);*/
+@@ -2362,63 +2358,29 @@
+ while(*s==',') { /* eat duplicate commas */
+ s++;
+ }
+- if(n>=jSize) {
+- if(j==smallBuffer) { /* overflowed the small buffer. */
+- j = static_cast<_acceptLangItem *>(uprv_malloc(sizeof(j[0])*(jSize*2)));
+- if(j!=NULL) {
+- uprv_memcpy(j,smallBuffer,sizeof(j[0])*jSize);
+- }
++ if(n>=items.getCapacity()) { // If we need more items
++ if(NULL == items.resize(items.getCapacity()*2, items.getCapacity())) {
++ *status = U_MEMORY_ALLOCATION_ERROR;
++ return -1;
++ }
+ #if defined(ULOC_DEBUG)
+- fprintf(stderr,"malloced at size %d\n", jSize);
++ fprintf(stderr,"malloced at size %d\n", items.getCapacity());
+ #endif
+- } else {
+- j = static_cast<_acceptLangItem *>(uprv_realloc(j, sizeof(j[0])*jSize*2));
+-#if defined(ULOC_DEBUG)
+- fprintf(stderr,"re-alloced at size %d\n", jSize);
+-#endif
+- }
+- jSize *= 2;
+- if(j==NULL) {
+- *status = U_MEMORY_ALLOCATION_ERROR;
+- return -1;
+- }
+ }
+ }
+- uprv_sortArray(j, n, sizeof(j[0]), uloc_acceptLanguageCompare, NULL, TRUE, status);
++ uprv_sortArray(items.getAlias(), n, sizeof(items[0]), uloc_acceptLanguageCompare, NULL, TRUE, status);
++ LocalArray strs(new const char*[n], *status);
+ if(U_FAILURE(*status)) {
+- if(j != smallBuffer) {
+-#if defined(ULOC_DEBUG)
+- fprintf(stderr,"freeing j %p\n", j);
+-#endif
+- uprv_free(j);
+- }
+- return -1;
+- }
+- strs = static_cast(uprv_malloc((size_t)(sizeof(strs[0])*n)));
+- /* Check for null pointer */
+- if (strs == NULL) {
+- uprv_free(j); /* Free to avoid memory leak */
+- *status = U_MEMORY_ALLOCATION_ERROR;
+- return -1;
++ return -1;
+ }
+ for(i=0;i q <%g>\n", i, j[i].locale, j[i].q);*/
+ #endif
+- strs[i]=j[i].locale;
++ strs[i]=items[i].locale;
+ }
+ res = uloc_acceptLanguage(result, resultAvailable, outResult,
+- (const char**)strs, n, availableLocales, status);
+- for(i=0;i0)&&uprv_strcmp(tmp, tests[i].expect)) {
+- log_err_status(status, "FAIL: #%d: expected %s but got %s\n", i, tests[i].expect, tmp);
+- log_info("test #%d: http[%s], ICU[%s], expect %s, %s\n",
+- i, http[tests[i].httpSet], tests[i].icuSet, tests[i].expect, acceptResult(tests[i].res));
++ }
++ if((outResult>0)&&uprv_strcmp(tmp, tests[i].expect)) {
++ log_err_status(status, "FAIL: #%d: expected %s but got %s\n", i, tests[i].expect, tmp);
++ log_info("test #%d: http[%s], ICU[%s], expect %s, %s\n",
++ i, http[tests[i].httpSet], tests[i].icuSet, tests[i].expect, acceptResult(tests[i].res));
++ }
+ }
+ }
+ }
diff --git a/SOURCES/icu-rhbz1444101-icu-changeset-39671.patch b/SOURCES/icu-rhbz1444101-icu-changeset-39671.patch
new file mode 100644
index 00000000..59e43752
--- /dev/null
+++ b/SOURCES/icu-rhbz1444101-icu-changeset-39671.patch
@@ -0,0 +1,156 @@
+# https://ssl.icu-project.org/trac/changeset/39671
+Index: /trunk/icu4c/source/common/utext.cpp
+===================================================================
+--- icu.orig/source/common/utext.cpp
++++ icu/source/common/utext.cpp
+@@ -848,7 +848,13 @@
+
+ // Chunk size.
+-// Must be less than 85, because of byte mapping from UChar indexes to native indexes.
+-// Worst case is three native bytes to one UChar. (Supplemenaries are 4 native bytes
+-// to two UChars.)
++// Must be less than 42 (256/6), because of byte mapping from UChar indexes to native indexes.
++// Worst case there are six UTF-8 bytes per UChar.
++// obsolete 6 byte form fd + 5 trails maps to fffd
++// obsolete 5 byte form fc + 4 trails maps to fffd
++// non-shortest 4 byte forms maps to fffd
++// normal supplementaries map to a pair of utf-16, two utf8 bytes per utf-16 unit
++// mapToUChars array size must allow for the worst case, 6.
++// This could be brought down to 4, by treating fd and fc as pure illegal,
++// rather than obsolete lead bytes. But that is not compatible with the utf-8 access macros.
+ //
+ enum { UTF8_TEXT_CHUNK_SIZE=32 };
+@@ -890,5 +896,5 @@
+ // one for a supplementary starting in the last normal position,
+ // and one for an entry for the buffer limit position.
+- uint8_t mapToUChars[UTF8_TEXT_CHUNK_SIZE*3+6]; // Map native offset from bufNativeStart to
++ uint8_t mapToUChars[UTF8_TEXT_CHUNK_SIZE*6+6]; // Map native offset from bufNativeStart to
+ // correspoding offset in filled part of buf.
+ int32_t align;
+@@ -1033,4 +1039,5 @@
+ u8b = (UTF8Buf *)ut->p; // the current buffer
+ mapIndex = ix - u8b->toUCharsMapStart;
++ U_ASSERT(mapIndex < (int32_t)sizeof(UTF8Buf::mapToUChars));
+ ut->chunkOffset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx;
+ return TRUE;
+@@ -1299,4 +1306,8 @@
+ // If index is at the end, there is no character there to look at.
+ if (ix != ut->b) {
++ // Note: this function will only move the index back if it is on a trail byte
++ // and there is a preceding lead byte and the sequence from the lead
++ // through this trail could be part of a valid UTF-8 sequence
++ // Otherwise the index remains unchanged.
+ U8_SET_CP_START(s8, 0, ix);
+ }
+@@ -1312,5 +1323,8 @@
+ uint8_t *mapToNative = u8b->mapToNative;
+ uint8_t *mapToUChars = u8b->mapToUChars;
+- int32_t toUCharsMapStart = ix - (UTF8_TEXT_CHUNK_SIZE*3 + 1);
++ int32_t toUCharsMapStart = ix - sizeof(UTF8Buf::mapToUChars) + 1;
++ // Note that toUCharsMapStart can be negative. Happens when the remaining
++ // text from current position to the beginning is less than the buffer size.
++ // + 1 because mapToUChars must have a slot at the end for the bufNativeLimit entry.
+ int32_t destIx = UTF8_TEXT_CHUNK_SIZE+2; // Start in the overflow region
+ // at end of buffer to leave room
+@@ -1339,4 +1353,5 @@
+ // Special case ASCII range for speed.
+ buf[destIx] = (UChar)c;
++ U_ASSERT(toUCharsMapStart <= srcIx);
+ mapToUChars[srcIx - toUCharsMapStart] = (uint8_t)destIx;
+ mapToNative[destIx] = (uint8_t)(srcIx - toUCharsMapStart);
+@@ -1368,4 +1383,5 @@
+ mapToUChars[sIx-- - toUCharsMapStart] = (uint8_t)destIx;
+ } while (sIx >= srcIx);
++ U_ASSERT(toUCharsMapStart <= (srcIx+1));
+
+ // Set native indexing limit to be the current position.
+@@ -1542,4 +1558,5 @@
+ U_ASSERT(index<=ut->chunkNativeLimit);
+ int32_t mapIndex = index - u8b->toUCharsMapStart;
++ U_ASSERT(mapIndex < (int32_t)sizeof(UTF8Buf::mapToUChars));
+ int32_t offset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx;
+ U_ASSERT(offset>=0 && offset<=ut->chunkLength);
+Index: /trunk/icu4c/source/test/intltest/utxttest.cpp
+===================================================================
+--- icu.orig/source/test/intltest/utxttest.cpp
++++ icu/source/test/intltest/utxttest.cpp
+@@ -68,4 +68,6 @@
+ case 7: name = "Ticket12130";
+ if (exec) Ticket12130(); break;
++ case 8: name = "Ticket12888";
++ if (exec) Ticket12888(); break;
+ default: name = ""; break;
+ }
+@@ -1584,2 +1586,62 @@
+ utext_close(&ut);
+ }
++
++// Ticket 12888: bad handling of illegal utf-8 containing many instances of the archaic, now illegal,
++// six byte utf-8 forms. Original implementation had an assumption that
++// there would be at most three utf-8 bytes per UTF-16 code unit.
++// The five and six byte sequences map to a single replacement character.
++
++void UTextTest::Ticket12888() {
++ const char *badString =
++ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
++ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
++ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
++ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
++ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
++ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
++ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
++ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
++ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
++ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
++ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
++ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
++ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
++ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
++ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
++ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
++ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
++ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
++ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
++ "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80";
++
++ UErrorCode status = U_ZERO_ERROR;
++ LocalUTextPointer ut(utext_openUTF8(NULL, badString, -1, &status));
++ TEST_SUCCESS(status);
++ for (;;) {
++ UChar32 c = utext_next32(ut.getAlias());
++ if (c == U_SENTINEL) {
++ break;
++ }
++ }
++ int32_t endIdx = utext_getNativeIndex(ut.getAlias());
++ if (endIdx != (int32_t)strlen(badString)) {
++ errln("%s:%d expected=%d, actual=%d", __FILE__, __LINE__, strlen(badString), endIdx);
++ return;
++ }
++
++ for (int32_t prevIndex = endIdx; prevIndex>0;) {
++ UChar32 c = utext_previous32(ut.getAlias());
++ int32_t currentIndex = utext_getNativeIndex(ut.getAlias());
++ if (c != 0xfffd) {
++ errln("%s:%d (expected, actual, index) = (%d, %d, %d)\n",
++ __FILE__, __LINE__, 0xfffd, c, currentIndex);
++ break;
++ }
++ if (currentIndex != prevIndex - 6) {
++ errln("%s:%d: wrong index. Expected, actual = %d, %d",
++ __FILE__, __LINE__, prevIndex - 6, currentIndex);
++ break;
++ }
++ prevIndex = currentIndex;
++ }
++}
+Index: /trunk/icu4c/source/test/intltest/utxttest.h
+===================================================================
+--- icu.orig/source/test/intltest/utxttest.h
++++ icu/source/test/intltest/utxttest.h
+@@ -39,4 +39,5 @@
+ void Ticket10983();
+ void Ticket12130();
++ void Ticket12888();
+
+ private:
diff --git a/SOURCES/webkit-aarch64_page_size.patch b/SOURCES/webkit-aarch64_page_size.patch
new file mode 100644
index 00000000..6baf1381
--- /dev/null
+++ b/SOURCES/webkit-aarch64_page_size.patch
@@ -0,0 +1,16 @@
+diff --git a/Source/WTF/wtf/PageBlock.h b/Source/WTF/wtf/PageBlock.h
+index 33d9118d..3e99decf 100644
+--- a/Source/WTF/wtf/PageBlock.h
++++ b/Source/WTF/wtf/PageBlock.h
+@@ -49,9 +49,9 @@ namespace WTF {
+ // Use 64 KiB for any unknown CPUs to be conservative.
+ #if OS(DARWIN)
+ constexpr size_t CeilingOnPageSize = 16 * KB;
+-#elif OS(WINDOWS) || CPU(MIPS) || CPU(MIPS64) || CPU(X86) || CPU(X86_64) || CPU(ARM) || CPU(ARM64)
++#elif OS(WINDOWS) || CPU(MIPS) || CPU(MIPS64) || CPU(X86) || CPU(X86_64) || CPU(ARM)
+ constexpr size_t CeilingOnPageSize = 4 * KB;
+-#elif CPU(UNKNOWN) || CPU(PPC) || CPU(PPC64) || CPU(PPC64LE)
++#elif CPU(UNKNOWN) || CPU(PPC) || CPU(PPC64) || CPU(PPC64LE) || CPU(ARM64)
+ constexpr size_t CeilingOnPageSize = 64 * KB;
+ #else
+ #error Must set CeilingOnPageSize in PageBlock.h when adding a new CPU architecture!
diff --git a/SOURCES/webkit-fix-ppc64le-s390x.patch b/SOURCES/webkit-fix-ppc64le-s390x.patch
new file mode 100644
index 00000000..3171b859
--- /dev/null
+++ b/SOURCES/webkit-fix-ppc64le-s390x.patch
@@ -0,0 +1,25 @@
+Index: /Source/JavaScriptCore/heap/GCMemoryOperations.h
+===================================================================
+--- /Source/JavaScriptCore/heap/GCMemoryOperations.h (revision 261325)
++++ /Source/JavaScriptCore/heap/GCMemoryOperations.h (revision 261326)
+@@ -54,5 +54,5 @@
+ };
+
+-#if COMPILER(GCC_COMPATIBLE) && USE(JSVALUE64)
++#if COMPILER(GCC_COMPATIBLE) && (CPU(X86_64) || CPU(ARM64))
+ if (bytes <= smallCutoff)
+ slowPathForwardMemcpy();
+@@ -122,6 +122,4 @@
+ : "d0", "d1", "memory"
+ );
+-#else
+- slowPathForwardMemcpy();
+ #endif // CPU(X86_64)
+ } else {
+@@ -140,5 +138,5 @@
+ #else
+ slowPathForwardMemcpy();
+-#endif // COMPILER(GCC_COMPATIBLE)
++#endif // COMPILER(GCC_COMPATIBLE) && (CPU(X86_64) || CPU(ARM64))
+ #else
+ memcpy(dst, src, bytes);
diff --git a/SOURCES/webkit-jscoptions-fix-s390.patch b/SOURCES/webkit-jscoptions-fix-s390.patch
new file mode 100644
index 00000000..522175b8
--- /dev/null
+++ b/SOURCES/webkit-jscoptions-fix-s390.patch
@@ -0,0 +1,53 @@
+diff --git a/Source/JavaScriptCore/API/glib/JSCOptions.cpp b/Source/JavaScriptCore/API/glib/JSCOptions.cpp
+index e730b85563f3..0d66596626d6 100644
+--- a/Source/JavaScriptCore/API/glib/JSCOptions.cpp
++++ b/Source/JavaScriptCore/API/glib/JSCOptions.cpp
+@@ -73,7 +73,6 @@ static void valueToGValue(int32_t value, GValue* gValue)
+ g_value_set_int(gValue, value);
+ }
+
+-#if CPU(ADDRESS64)
+ static bool valueFromGValue(const GValue* gValue, unsigned& value)
+ {
+ value = g_value_get_uint(gValue);
+@@ -84,7 +83,6 @@ static void valueToGValue(unsigned value, GValue* gValue)
+ {
+ g_value_set_uint(gValue, value);
+ }
+-#endif
+
+ static bool valueFromGValue(const GValue* gValue, size_t& value)
+ {
+@@ -542,12 +540,10 @@ static JSCOptionType jscOptionsType(int)
+ return JSC_OPTION_INT;
+ }
+
+-#if CPU(ADDRESS64)
+ static JSCOptionType jscOptionsType(unsigned)
+ {
+ return JSC_OPTION_UINT;
+ }
+-#endif
+
+ static JSCOptionType jscOptionsType(size_t)
+ {
+diff --git a/Source/JavaScriptCore/runtime/Options.cpp b/Source/JavaScriptCore/runtime/Options.cpp
+index 74ccdeb2794c..359618472534 100644
+--- a/Source/JavaScriptCore/runtime/Options.cpp
++++ b/Source/JavaScriptCore/runtime/Options.cpp
+@@ -88,7 +88,6 @@ Optional parse(const char* string)
+ return WTF::nullopt;
+ }
+
+-#if CPU(ADDRESS64) || OS(DARWIN)
+ template<>
+ Optional parse(const char* string)
+ {
+@@ -97,7 +96,6 @@ Optional parse(const char* string)
+ return value;
+ return WTF::nullopt;
+ }
+-#endif // CPU(ADDRESS64) || OS(DARWIN)
+
+ template<>
+ Optional parse(const char* string)
diff --git a/SOURCES/webkit-library_typos.patch b/SOURCES/webkit-library_typos.patch
new file mode 100644
index 00000000..b18bada1
--- /dev/null
+++ b/SOURCES/webkit-library_typos.patch
@@ -0,0 +1,35 @@
+From ecbb859d88eacad10bf556044abaeaed6c9b32fc Mon Sep 17 00:00:00 2001
+From: "berto@igalia.com"
+
+Date: Thu, 2 Nov 2017 13:41:16 +0000
+Subject: [PATCH] Unreviewed, fix typos in library names for the GTK+ port.
+
+* Source/cmake/OptionsGTK.cmake:
+
+git-svn-id: http://svn.webkit.org/repository/webkit/trunk@224329 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+---
+ ChangeLog | 6 ++++++
+ Source/cmake/OptionsGTK.cmake | 4 ++--
+ 2 files changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/Source/cmake/OptionsGTK.cmake b/Source/cmake/OptionsGTK.cmake
+index 2b440a27376..6c99868ae86 100644
+--- a/Source/cmake/OptionsGTK.cmake
++++ b/Source/cmake/OptionsGTK.cmake
+@@ -367,11 +367,11 @@ endif ()
+ if (USE_WOFF2)
+ find_package(BrotliDec 1.0.1)
+ if (NOT BROTLIDEC_FOUND)
+- message(FATAL_ERROR "librotlidec is needed for USE_WOFF2.")
++ message(FATAL_ERROR "libbrotlidec is needed for USE_WOFF2.")
+ endif ()
+ find_package(WOFF2Dec 1.0.1)
+ if (NOT WOFF2DEC_FOUND)
+- message(FATAL_ERROR "liwoff2dec is needed for USE_WOFF2.")
++ message(FATAL_ERROR "libwoff2dec is needed for USE_WOFF2.")
+ endif ()
+ endif ()
+
+--
+2.16.2
+
diff --git a/SOURCES/webkit-lower_libgcrypt_version.patch b/SOURCES/webkit-lower_libgcrypt_version.patch
new file mode 100644
index 00000000..0f4b48d0
--- /dev/null
+++ b/SOURCES/webkit-lower_libgcrypt_version.patch
@@ -0,0 +1,13 @@
+diff --git a/Source/cmake/OptionsGTK.cmake b/Source/cmake/OptionsGTK.cmake
+index 79012303d508..4ca6d6acbc6f 100644
+--- a/Source/cmake/OptionsGTK.cmake
++++ b/Source/cmake/OptionsGTK.cmake
+@@ -20,7 +20,7 @@ set(INTROSPECTION_INSTALL_TYPELIBDIR "${LIB_INSTALL_DIR}/girepository-1.0")
+ find_package(Cairo 1.14.0 REQUIRED)
+ find_package(Fontconfig 2.8.0 REQUIRED)
+ find_package(Freetype 2.4.2 REQUIRED)
+-find_package(LibGcrypt 1.6.0 REQUIRED)
++find_package(LibGcrypt 1.5.3 REQUIRED)
+ find_package(GLIB 2.44.0 REQUIRED COMPONENTS gio gio-unix gobject gthread gmodule)
+ find_package(GTK3 3.22.0 REQUIRED)
+ find_package(GDK3 3.22.0 REQUIRED)
diff --git a/SOURCES/webkit-no_webp_demux.patch b/SOURCES/webkit-no_webp_demux.patch
new file mode 100644
index 00000000..fe5472bd
--- /dev/null
+++ b/SOURCES/webkit-no_webp_demux.patch
@@ -0,0 +1,509 @@
+--- webkitgtk-2.22.5/Source/cmake/FindWebP.cmake.no_webp_demux 2019-01-22 13:38:34.224690921 +0100
++++ webkitgtk-2.22.5/Source/cmake/FindWebP.cmake 2019-01-22 14:21:18.442548284 +0100
+@@ -33,34 +33,20 @@ find_package(PkgConfig)
+ pkg_check_modules(PC_WEBP QUIET libwebp)
+
+ # Look for the header file.
+-find_path(WEBP_INCLUDE_DIR
++find_path(WEBP_INCLUDE_DIRS
+ NAMES webp/decode.h
+ HINTS ${PC_WEBP_INCLUDEDIR} ${PC_WEBP_INCLUDE_DIRS}
+ )
+-list(APPEND WEBP_INCLUDE_DIRS ${WEBP_INCLUDE_DIR})
+ mark_as_advanced(WEBP_INCLUDE_DIRS)
+
+ # Look for the library.
+ find_library(
+- WEBP_LIBRARY
++ WEBP_LIBRARIES
+ NAMES webp
+ HINTS ${PC_WEBP_LIBDIR} ${PC_WEBP_LIBRARY_DIRS}
+ )
+-list(APPEND WEBP_LIBRARIES ${WEBP_LIBRARY})
+
+-find_path(WEBP_DEMUX_INCLUDE_DIR
+- NAMES webp/demux.h
+- HINTS ${PC_WEBP_INCLUDEDIR} ${PC_WEBP_INCLUDE_DIRS}
+-)
+-list(APPEND WEBP_INCLUDE_DIRS ${WEBP_DEMUX_INCLUDE_DIR})
+-
+-find_library(WEBP_DEMUX_LIBRARY
+- NAMES webpdemux
+- HINTS ${PC_WEBP_LIBDIR} ${PC_WEBP_LIBRARY_DIRS}
+-)
+-list(APPEND WEBP_LIBRARIES ${WEBP_DEMUX_LIBRARY})
+-
+-mark_as_advanced(WEBP_DEMUX_INCLUDE_DIR WEBP_DEMUX_LIBRARY WEBP_INCLUDE_DIR WEBP_LIBRARY WEBP_LIBRARIES)
++mark_as_advanced(WEBP_LIBRARIES)
+
+ include(FindPackageHandleStandardArgs)
+ find_package_handle_standard_args(WebP REQUIRED_VARS WEBP_INCLUDE_DIRS WEBP_LIBRARIES
+--- webkitgtk-2.22.5/Source/WebCore/platform/graphics/ImageBackingStore.h.no_webp_demux 2017-11-30 11:23:29.000000000 +0100
++++ webkitgtk-2.22.5/Source/WebCore/platform/graphics/ImageBackingStore.h 2019-01-22 13:38:34.224690921 +0100
+@@ -147,6 +147,7 @@ public:
+ setPixel(pixelAt(x, y), r, g, b, a);
+ }
+
++#if ENABLE(APNG)
+ void blendPixel(uint32_t* dest, unsigned r, unsigned g, unsigned b, unsigned a)
+ {
+ if (!a)
+@@ -174,6 +175,7 @@ public:
+ else
+ *dest = makeUnPremultipliedRGBA(r, g, b, a).value();
+ }
++#endif
+
+ static bool isOverSize(const IntSize& size)
+ {
+--- webkitgtk-2.22.5/Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp.no_webp_demux 2019-01-22 13:38:34.225690919 +0100
++++ webkitgtk-2.22.5/Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp 2019-01-22 14:48:11.041983180 +0100
+@@ -32,49 +32,47 @@
+
+ #if USE(WEBP)
+
+-namespace WebCore {
++// Backward emulation for earlier versions than 0.1.99.
++#if (WEBP_DECODER_ABI_VERSION < 0x0163)
++#define MODE_rgbA MODE_RGBA
++#define MODE_bgrA MODE_BGRA
++#endif
++
++#if CPU(BIG_ENDIAN) || CPU(MIDDLE_ENDIAN)
++inline WEBP_CSP_MODE outputMode(bool hasAlpha) { return hasAlpha ? MODE_rgbA : MODE_RGBA; }
++#else // LITTLE_ENDIAN, output BGRA pixels.
++inline WEBP_CSP_MODE outputMode(bool hasAlpha) { return hasAlpha ? MODE_bgrA : MODE_BGRA; }
++#endif
+
+-// Convenience function to improve code readability, as WebPDemuxGetFrame is +1 based.
+-bool webpFrameAtIndex(WebPDemuxer* demuxer, size_t index, WebPIterator* webpFrame)
+-{
+- return WebPDemuxGetFrame(demuxer, index + 1, webpFrame);
+-}
++namespace WebCore {
+
+ WEBPImageDecoder::WEBPImageDecoder(AlphaOption alphaOption, GammaAndColorProfileOption gammaAndColorProfileOption)
+ : ScalableImageDecoder(alphaOption, gammaAndColorProfileOption)
++ , m_decoder(0)
++ , m_hasAlpha(false)
+ {
+ }
+
+-WEBPImageDecoder::~WEBPImageDecoder() = default;
+-
+-void WEBPImageDecoder::setData(SharedBuffer& data, bool allDataReceived)
++WEBPImageDecoder::~WEBPImageDecoder()
+ {
+- if (failed())
+- return;
+-
+- // We need to ensure that the header is parsed everytime new data arrives, as the number
+- // of frames may change until we have the complete data. If the size has not been obtained
+- // yet, the call to ScalableImageDecoder::setData() will call parseHeader() and set
+- // m_headerParsed to true, so the call to parseHeader() at the end won't do anything. If the size
+- // is available, then parseHeader() is only called once.
+- m_headerParsed = false;
+- ScalableImageDecoder::setData(data, allDataReceived);
+- parseHeader();
++ clear();
+ }
+
+-RepetitionCount WEBPImageDecoder::repetitionCount() const
++void WEBPImageDecoder::clear()
+ {
+- if (failed())
+- return RepetitionCountOnce;
+-
+- return m_repetitionCount ? m_repetitionCount : RepetitionCountInfinite;
++ if (m_decoder)
++ WebPIDelete(m_decoder);
++ m_decoder = 0;
+ }
+
+ ScalableImageDecoderFrame* WEBPImageDecoder::frameBufferAtIndex(size_t index)
+ {
+- if (index >= frameCount())
++ if (index)
+ return 0;
+
++ if (m_frameBufferCache.isEmpty())
++ m_frameBufferCache.grow(1);
++
+ // The size of m_frameBufferCache may be smaller than the index requested. This can happen
+ // because new data may have arrived with a bigger frameCount, but decode() hasn't been called
+ // yet, which is the one that resizes the cache.
+@@ -86,275 +84,73 @@ ScalableImageDecoderFrame* WEBPImageDeco
+ return &m_frameBufferCache[index];
+ }
+
+-size_t WEBPImageDecoder::findFirstRequiredFrameToDecode(size_t frameIndex, WebPDemuxer* demuxer)
+-{
+- // The first frame doesn't depend on any other.
+- if (!frameIndex)
+- return 0;
+-
+- // Go backwards and find the first complete frame.
+- size_t firstIncompleteFrame = frameIndex;
+- for (; firstIncompleteFrame; --firstIncompleteFrame) {
+- if (m_frameBufferCache[firstIncompleteFrame - 1].isComplete())
+- break;
+- }
+-
+- // Check if there are any independent frames between firstIncompleteFrame and frameIndex.
+- for (size_t firstIndependentFrame = frameIndex; firstIndependentFrame > firstIncompleteFrame ; --firstIndependentFrame) {
+- WebPIterator webpFrame;
+- if (!webpFrameAtIndex(demuxer, firstIndependentFrame, &webpFrame))
+- continue;
+-
+- IntRect frameRect(webpFrame.x_offset, webpFrame.y_offset, webpFrame.width, webpFrame.height);
+- if (!frameRect.contains({ { }, size() }))
+- continue;
+-
+- // This frame covers the whole area and doesn't have alpha, so it can be rendered without
+- // dependencies.
+- if (!webpFrame.has_alpha)
+- return firstIndependentFrame;
+-
+- // This frame covers the whole area and its disposalMethod is RestoreToBackground, which means
+- // that the next frame will be rendered on top of a transparent background, and can be decoded
+- // without dependencies. This can only be checked for frames prior to frameIndex.
+- if (firstIndependentFrame < frameIndex && m_frameBufferCache[firstIndependentFrame].disposalMethod() == ScalableImageDecoderFrame::DisposalMethod::RestoreToBackground)
+- return firstIndependentFrame + 1;
+- }
+-
+- return firstIncompleteFrame;
+-}
+-
+-void WEBPImageDecoder::decode(size_t frameIndex, bool allDataReceived)
++bool WEBPImageDecoder::decode(bool onlySize, bool)
+ {
+ if (failed())
+- return;
+-
+- // This can be executed both in the main thread (when not using async decoding) or in the decoding thread.
+- // When executed in the decoding thread, a call to setData() from the main thread may change the data
+- // the WebPDemuxer is using, leaving it in an inconsistent state, so we need to protect the data.
+- RefPtr protectedData(m_data);
+- WebPData inputData = { reinterpret_cast(protectedData->data()), protectedData->size() };
+- WebPDemuxState demuxerState;
+- WebPDemuxer* demuxer = WebPDemuxPartial(&inputData, &demuxerState);
+- if (!demuxer) {
+- setFailed();
+- return;
+- }
+-
+- m_frameBufferCache.resize(m_frameCount);
+-
+- // It is a fatal error if all data is received and we have decoded all frames available but the file is truncated.
+- if (frameIndex >= m_frameBufferCache.size() - 1 && allDataReceived && demuxer && demuxerState != WEBP_DEMUX_DONE) {
+- WebPDemuxDelete(demuxer);
+- setFailed();
+- return;
+- }
+-
+- for (size_t i = findFirstRequiredFrameToDecode(frameIndex, demuxer); i <= frameIndex; i++)
+- decodeFrame(i, demuxer);
++ return false;
+
+- WebPDemuxDelete(demuxer);
+-}
++ const uint8_t* dataBytes = reinterpret_cast(m_data->data());
++ const size_t dataSize = m_data->size();
+
+-void WEBPImageDecoder::decodeFrame(size_t frameIndex, WebPDemuxer* demuxer)
+-{
+- if (failed())
+- return;
++ if (ScalableImageDecoder::encodedDataStatus() < EncodedDataStatus::SizeAvailable) {
++ static const size_t imageHeaderSize = 30;
++ if (dataSize < imageHeaderSize)
++ return false;
++ int width, height;
++#if (WEBP_DECODER_ABI_VERSION >= 0x0163)
++ WebPBitstreamFeatures features;
++ if (WebPGetFeatures(dataBytes, dataSize, &features) != VP8_STATUS_OK)
++ return setFailed();
++ width = features.width;
++ height = features.height;
++ m_hasAlpha = features.has_alpha;
++#else
++ // Earlier version won't be able to display WebP files with alpha.
++ if (!WebPGetInfo(dataBytes, dataSize, &width, &height))
++ return setFailed();
++ m_hasAlpha = false;
++#endif
++ if (!setSize(IntSize(width, height)))
++ return setFailed();
++ }
++
++ ASSERT(ScalableImageDecoder::encodedDataStatus() >= EncodedDataStatus::SizeAvailable);
++ if (onlySize)
++ return true;
+
+- WebPIterator webpFrame;
+- if (!webpFrameAtIndex(demuxer, frameIndex, &webpFrame))
+- return;
+-
+- const uint8_t* dataBytes = reinterpret_cast(webpFrame.fragment.bytes);
+- size_t dataSize = webpFrame.fragment.size;
+- bool blend = webpFrame.blend_method == WEBP_MUX_BLEND ? true : false;
+-
+- ASSERT(m_frameBufferCache.size() > frameIndex);
+- auto& buffer = m_frameBufferCache[frameIndex];
+- buffer.setDuration(Seconds::fromMilliseconds(webpFrame.duration));
+- buffer.setDisposalMethod(webpFrame.dispose_method == WEBP_MUX_DISPOSE_BACKGROUND ? ScalableImageDecoderFrame::DisposalMethod::RestoreToBackground : ScalableImageDecoderFrame::DisposalMethod::DoNotDispose);
++ ASSERT(!m_frameBufferCache.isEmpty());
++ auto& buffer = m_frameBufferCache[0];
+ ASSERT(!buffer.isComplete());
+
+- if (buffer.isInvalid() && !initFrameBuffer(frameIndex, &webpFrame)) {
+- setFailed();
+- return;
+- }
+-
+- WebPDecBuffer decoderBuffer;
+- WebPInitDecBuffer(&decoderBuffer);
+- decoderBuffer.colorspace = MODE_RGBA;
+- decoderBuffer.u.RGBA.stride = webpFrame.width * sizeof(uint32_t);
+- decoderBuffer.u.RGBA.size = decoderBuffer.u.RGBA.stride * webpFrame.height;
+- decoderBuffer.is_external_memory = 1;
+- auto p = makeUniqueArray(decoderBuffer.u.RGBA.size);
+- decoderBuffer.u.RGBA.rgba = p.get();
+- if (!decoderBuffer.u.RGBA.rgba) {
+- setFailed();
+- return;
+- }
+-
+- WebPIDecoder* decoder = WebPINewDecoder(&decoderBuffer);
+- if (!decoder) {
+- setFailed();
+- return;
++ if (buffer.isInvalid()) {
++ if (!buffer.initialize(size(), m_premultiplyAlpha))
++ return setFailed();
++ buffer.setDecodingStatus(DecodingStatus::Partial);
++ buffer.setHasAlpha(m_hasAlpha);
++ }
++
++ if (!m_decoder) {
++ WEBP_CSP_MODE mode = outputMode(m_hasAlpha);
++ if (!m_premultiplyAlpha)
++ mode = outputMode(false);
++ int rowStride = size().width() * sizeof(RGBA32);
++ uint8_t* output = reinterpret_cast(buffer.backingStore()->pixelAt(0, 0));
++ int outputSize = size().height() * rowStride;
++ m_decoder = WebPINewRGB(mode, output, outputSize, rowStride);
++ if (!m_decoder)
++ return setFailed();
+ }
+
+- switch (WebPIUpdate(decoder, dataBytes, dataSize)) {
++ switch (WebPIUpdate(m_decoder, dataBytes, dataSize)) {
+ case VP8_STATUS_OK:
+- applyPostProcessing(frameIndex, decoder, decoderBuffer, blend);
+ buffer.setDecodingStatus(DecodingStatus::Complete);
+- break;
++ clear();
++ return true;
+ case VP8_STATUS_SUSPENDED:
+- if (!isAllDataReceived()) {
+- applyPostProcessing(frameIndex, decoder, decoderBuffer, blend);
+- buffer.setDecodingStatus(DecodingStatus::Partial);
+- break;
+- }
+- // Fallthrough.
+- default:
+- setFailed();
+- }
+-
+- WebPIDelete(decoder);
+-}
+-
+-bool WEBPImageDecoder::initFrameBuffer(size_t frameIndex, const WebPIterator* webpFrame)
+-{
+- if (frameIndex >= frameCount())
+ return false;
+-
+- auto& buffer = m_frameBufferCache[frameIndex];
+-
+- // Initialize the frame rect in our buffer.
+- IntRect frameRect(webpFrame->x_offset, webpFrame->y_offset, webpFrame->width, webpFrame->height);
+-
+- // Make sure the frameRect doesn't extend outside the buffer.
+- frameRect.intersect({ { }, size() });
+-
+- if (!frameIndex || !m_frameBufferCache[frameIndex - 1].backingStore()) {
+- // This frame doesn't rely on any previous data.
+- if (!buffer.initialize(size(), m_premultiplyAlpha))
+- return false;
+- } else {
+- const auto& prevBuffer = m_frameBufferCache[frameIndex - 1];
+- ASSERT(prevBuffer.isComplete());
+-
+- // Preserve the last frame as the starting state for this frame.
+- if (!prevBuffer.backingStore() || !buffer.initialize(*prevBuffer.backingStore()))
+- return false;
+-
+- if (prevBuffer.disposalMethod() == ScalableImageDecoderFrame::DisposalMethod::RestoreToBackground) {
+- // We want to clear the previous frame to transparent, without
+- // affecting pixels in the image outside of the frame.
+- const IntRect& prevRect = prevBuffer.backingStore()->frameRect();
+- buffer.backingStore()->clearRect(prevRect);
+- }
+- }
+-
+- buffer.setHasAlpha(webpFrame->has_alpha);
+- buffer.backingStore()->setFrameRect(frameRect);
+-
+- return true;
+-}
+-
+-void WEBPImageDecoder::applyPostProcessing(size_t frameIndex, WebPIDecoder* decoder, WebPDecBuffer& decoderBuffer, bool blend)
+-{
+- auto& buffer = m_frameBufferCache[frameIndex];
+- int decodedWidth = 0;
+- int decodedHeight = 0;
+- if (!WebPIDecGetRGB(decoder, &decodedHeight, &decodedWidth, 0, 0))
+- return; // See also https://bugs.webkit.org/show_bug.cgi?id=74062
+- if (decodedHeight <= 0)
+- return;
+-
+- const IntRect& frameRect = buffer.backingStore()->frameRect();
+- ASSERT_WITH_SECURITY_IMPLICATION(decodedWidth == frameRect.width());
+- ASSERT_WITH_SECURITY_IMPLICATION(decodedHeight <= frameRect.height());
+- const int left = frameRect.x();
+- const int top = frameRect.y();
+-
+- for (int y = 0; y < decodedHeight; y++) {
+- const int canvasY = top + y;
+- for (int x = 0; x < decodedWidth; x++) {
+- const int canvasX = left + x;
+- auto* address = buffer.backingStore()->pixelAt(canvasX, canvasY);
+- uint8_t* pixel = decoderBuffer.u.RGBA.rgba + (y * frameRect.width() + x) * sizeof(uint32_t);
+- if (blend && (pixel[3] < 255))
+- buffer.backingStore()->blendPixel(address, pixel[0], pixel[1], pixel[2], pixel[3]);
+- else
+- buffer.backingStore()->setPixel(address, pixel[0], pixel[1], pixel[2], pixel[3]);
+- }
+- }
+-}
+-
+-void WEBPImageDecoder::parseHeader()
+-{
+- if (m_headerParsed)
+- return;
+-
+- m_headerParsed = true;
+-
+- const unsigned webpHeaderSize = 30; // RIFF_HEADER_SIZE + CHUNK_HEADER_SIZE + VP8_FRAME_HEADER_SIZE
+- if (m_data->size() < webpHeaderSize)
+- return; // Await VP8X header so WebPDemuxPartial succeeds.
+-
+- WebPData inputData = { reinterpret_cast(m_data->data()), m_data->size() };
+- WebPDemuxState demuxerState;
+- WebPDemuxer* demuxer = WebPDemuxPartial(&inputData, &demuxerState);
+- if (!demuxer) {
+- setFailed();
+- return;
+- }
+-
+- m_frameCount = WebPDemuxGetI(demuxer, WEBP_FF_FRAME_COUNT);
+- if (!m_frameCount) {
+- WebPDemuxDelete(demuxer);
+- return; // Wait until the encoded image frame data arrives.
+- }
+-
+- int width = WebPDemuxGetI(demuxer, WEBP_FF_CANVAS_WIDTH);
+- int height = WebPDemuxGetI(demuxer, WEBP_FF_CANVAS_HEIGHT);
+- if (!isSizeAvailable() && !setSize(IntSize(width, height))) {
+- WebPDemuxDelete(demuxer);
+- return;
+- }
+-
+- m_formatFlags = WebPDemuxGetI(demuxer, WEBP_FF_FORMAT_FLAGS);
+- if (!(m_formatFlags & ANIMATION_FLAG))
+- m_repetitionCount = WebCore::RepetitionCountNone;
+- else {
+- // Since we have parsed at least one frame, even if partially,
+- // the global animation (ANIM) properties have been read since
+- // an ANIM chunk must precede the ANMF frame chunks.
+- m_repetitionCount = WebPDemuxGetI(demuxer, WEBP_FF_LOOP_COUNT);
+- ASSERT(m_repetitionCount == (m_repetitionCount & 0xffff)); // Loop count is always <= 16 bits.
+- if (!m_repetitionCount)
+- m_repetitionCount = WebCore::RepetitionCountInfinite;
+- }
+-
+- WebPDemuxDelete(demuxer);
+-}
+-
+-void WEBPImageDecoder::clearFrameBufferCache(size_t clearBeforeFrame)
+-{
+- if (m_frameBufferCache.isEmpty())
+- return;
+-
+- // We don't want to delete the last frame in the cache, as is may be needed for
+- // decoding when new data arrives. See GIFImageDecoder for the full explanation.
+- clearBeforeFrame = std::min(clearBeforeFrame, m_frameBufferCache.size() - 1);
+-
+- // Also from GIFImageDecoder: We need to preserve frames such that:
+- // * We don't clear |clearBeforeFrame|.
+- // * We don't clear the frame we're currently decoding.
+- // * We don't clear any frame from which a future initFrameBuffer() call will copy bitmap data.
+- //
+- // In WEBP every frame depends on the previous one or none. That means that frames after clearBeforeFrame
+- // won't need any frame before them to render, so we can clear them all.
+- for (int i = clearBeforeFrame - 1; i >= 0; i--) {
+- auto& buffer = m_frameBufferCache[i];
+- if (!buffer.isInvalid())
+- buffer.clear();
++ default:
++ clear();
++ return setFailed();
+ }
+ }
+
+--- webkitgtk-2.22.5/Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.h.no_webp_demux 2018-07-25 13:56:31.000000000 +0200
++++ webkitgtk-2.22.5/Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.h 2019-01-22 14:11:28.656237722 +0100
+@@ -33,7 +33,6 @@
+ #if USE(WEBP)
+
+ #include "webp/decode.h"
+-#include "webp/demux.h"
+
+ namespace WebCore {
+
+@@ -47,26 +46,18 @@ public:
+ virtual ~WEBPImageDecoder();
+
+ String filenameExtension() const override { return "webp"_s; }
+- void setData(SharedBuffer&, bool) final;
+ ScalableImageDecoderFrame* frameBufferAtIndex(size_t index) override;
+- RepetitionCount repetitionCount() const override;
+- size_t frameCount() const override { return m_frameCount; }
+- void clearFrameBufferCache(size_t) override;
+
+ private:
+ WEBPImageDecoder(AlphaOption, GammaAndColorProfileOption);
+- void tryDecodeSize(bool) override { parseHeader(); }
+- void decode(size_t, bool);
+- void decodeFrame(size_t, WebPDemuxer*);
+- void parseHeader();
+- bool initFrameBuffer(size_t, const WebPIterator*);
+- void applyPostProcessing(size_t, WebPIDecoder*, WebPDecBuffer&, bool);
+- size_t findFirstRequiredFrameToDecode(size_t, WebPDemuxer*);
+-
+- int m_repetitionCount { 0 };
+- size_t m_frameCount { 0 };
+- int m_formatFlags { 0 };
+- bool m_headerParsed { false };
++ void tryDecodeSize(bool allDataReceived) override { decode(true, allDataReceived); }
++
++ bool decode(bool onlySize, bool allDataReceived);
++
++ WebPIDecoder* m_decoder;
++ bool m_hasAlpha;
++
++ void clear();
+ };
+
+ } // namespace WebCore
diff --git a/SOURCES/webkit-objectidentifier-undefined.patch b/SOURCES/webkit-objectidentifier-undefined.patch
new file mode 100644
index 00000000..c970feac
--- /dev/null
+++ b/SOURCES/webkit-objectidentifier-undefined.patch
@@ -0,0 +1,371 @@
+diff --git a/Source/WebCore/dom/ElementIdentifier.h b/Source/WebCore/dom/ElementIdentifier.h
+index 2ed378242a4c..5cea026d9362 100644
+--- a/Source/WebCore/dom/ElementIdentifier.h
++++ b/Source/WebCore/dom/ElementIdentifier.h
+@@ -25,11 +25,150 @@
+
+ #pragma once
+
+-#include
++#include
++#include
++#include
++#include
++#include
++#include
+
+ namespace WebCore {
+
+ enum ElementIdentifierType { };
+-using ElementIdentifier = ObjectIdentifier;
+
++class ElementIdentifierBase {
++protected:
++ WTF_EXPORT_PRIVATE static uint64_t generateIdentifierInternal();
++ WTF_EXPORT_PRIVATE static uint64_t generateThreadSafeIdentifierInternal();
++};
++
++class ElementIdentifier : private ElementIdentifierBase {
++public:
++ static ElementIdentifier generate()
++ {
++ RELEASE_ASSERT(!m_generationProtected);
++ return ElementIdentifier { generateIdentifierInternal() };
++ }
++
++ static ElementIdentifier generateThreadSafe()
++ {
++ RELEASE_ASSERT(!m_generationProtected);
++ return ElementIdentifier { generateThreadSafeIdentifierInternal() };
++ }
++
++ static void enableGenerationProtection()
++ {
++ m_generationProtected = true;
++ }
++
++ ElementIdentifier() = default;
++
++ ElementIdentifier(WTF::HashTableDeletedValueType) : m_identifier(hashTableDeletedValue()) { }
++ bool isHashTableDeletedValue() const { return m_identifier == hashTableDeletedValue(); }
++
++ template void encode(Encoder& encoder) const
++ {
++ ASSERT(isValidIdentifier(m_identifier));
++ encoder << m_identifier;
++ }
++ template static Optional decode(Decoder& decoder)
++ {
++ Optional identifier;
++ decoder >> identifier;
++ if (!identifier || !isValidIdentifier(*identifier))
++ return WTF::nullopt;
++ return ElementIdentifier { *identifier };
++ }
++
++ bool operator==(const ElementIdentifier& other) const
++ {
++ return m_identifier == other.m_identifier;
++ }
++
++ bool operator!=(const ElementIdentifier& other) const
++ {
++ return m_identifier != other.m_identifier;
++ }
++
++ operator uint64_t() const { return m_identifier; }
++ uint64_t toUInt64() const { return m_identifier; }
++ explicit operator bool() const { return m_identifier; }
++
++ String loggingString() const
++ {
++ return String::number(m_identifier);
++ }
++
++ struct MarkableTraits {
++ static bool isEmptyValue(ElementIdentifier identifier)
++ {
++ return !identifier.m_identifier;
++ }
++
++ static constexpr ElementIdentifier emptyValue()
++ {
++ return ElementIdentifier();
++ }
++ };
++
++private:
++ friend ElementIdentifier makeElementIdentifier(uint64_t);
++ friend struct HashTraits;
++ friend struct ElementIdentifierHash;
++
++ static uint64_t hashTableDeletedValue() { return std::numeric_limits::max(); }
++ static bool isValidIdentifier(uint64_t identifier) { return identifier && identifier != hashTableDeletedValue(); }
++
++ explicit constexpr ElementIdentifier(uint64_t identifier)
++ : m_identifier(identifier)
++ {
++ }
++
++ uint64_t m_identifier { 0 };
++ inline static bool m_generationProtected { false };
++};
++
++inline ElementIdentifier makeElementIdentifier(uint64_t identifier)
++{
++ return ElementIdentifier { identifier };
++}
++
++struct ElementIdentifierHash {
++ static unsigned hash(const ElementIdentifier& identifier) { return WTF::intHash(identifier.m_identifier); }
++ static bool equal(const ElementIdentifier& a, const ElementIdentifier& b) { return a == b; }
++ static constexpr bool safeToCompareToEmptyOrDeleted = true;
++};
++
++inline TextStream& operator<<(TextStream& ts, const ElementIdentifier& identifier)
++{
++ ts << identifier.toUInt64();
++ return ts;
++}
++
++inline uint64_t ElementIdentifierBase::generateIdentifierInternal()
++{
++ static uint64_t current;
++ return ++current;
+ }
++
++inline uint64_t ElementIdentifierBase::generateThreadSafeIdentifierInternal()
++{
++ static LazyNeverDestroyed> current;
++ static std::once_flag initializeCurrentIdentifier;
++ std::call_once(initializeCurrentIdentifier, [] {
++ current.construct(0);
++ });
++ return ++current.get();
++}
++
++} // namespace WebCore
++
++namespace WTF {
++
++template<> struct HashTraits : SimpleClassHashTraits { };
++
++template<> struct DefaultHash {
++ typedef WebCore::ElementIdentifierHash Hash;
++};
++
++} // namespace WTF
+diff --git a/Source/WebCore/page/PageIdentifier.h b/Source/WebCore/page/PageIdentifier.h
+index 44d5f8d29756..07f7f2750af2 100644
+--- a/Source/WebCore/page/PageIdentifier.h
++++ b/Source/WebCore/page/PageIdentifier.h
+@@ -25,11 +25,150 @@
+
+ #pragma once
+
+-#include
++#include
++#include
++#include
++#include
++#include
++#include
+
+ namespace WebCore {
+
+ enum PageIdentifierType { };
+-using PageIdentifier = ObjectIdentifier;
+
++class PageIdentifierBase {
++protected:
++ WTF_EXPORT_PRIVATE static uint64_t generateIdentifierInternal();
++ WTF_EXPORT_PRIVATE static uint64_t generateThreadSafeIdentifierInternal();
++};
++
++class PageIdentifier : private PageIdentifierBase {
++public:
++ static PageIdentifier generate()
++ {
++ RELEASE_ASSERT(!m_generationProtected);
++ return PageIdentifier { generateIdentifierInternal() };
++ }
++
++ static PageIdentifier generateThreadSafe()
++ {
++ RELEASE_ASSERT(!m_generationProtected);
++ return PageIdentifier { generateThreadSafeIdentifierInternal() };
++ }
++
++ static void enableGenerationProtection()
++ {
++ m_generationProtected = true;
++ }
++
++ PageIdentifier() = default;
++
++ PageIdentifier(WTF::HashTableDeletedValueType) : m_identifier(hashTableDeletedValue()) { }
++ bool isHashTableDeletedValue() const { return m_identifier == hashTableDeletedValue(); }
++
++ template void encode(Encoder& encoder) const
++ {
++ ASSERT(isValidIdentifier(m_identifier));
++ encoder << m_identifier;
++ }
++ template static Optional decode(Decoder& decoder)
++ {
++ Optional identifier;
++ decoder >> identifier;
++ if (!identifier || !isValidIdentifier(*identifier))
++ return WTF::nullopt;
++ return PageIdentifier { *identifier };
++ }
++
++ bool operator==(const PageIdentifier& other) const
++ {
++ return m_identifier == other.m_identifier;
++ }
++
++ bool operator!=(const PageIdentifier& other) const
++ {
++ return m_identifier != other.m_identifier;
++ }
++
++ operator uint64_t() const { return m_identifier; }
++ uint64_t toUInt64() const { return m_identifier; }
++ explicit operator bool() const { return m_identifier; }
++
++ String loggingString() const
++ {
++ return String::number(m_identifier);
++ }
++
++ struct MarkableTraits {
++ static bool isEmptyValue(PageIdentifier identifier)
++ {
++ return !identifier.m_identifier;
++ }
++
++ static constexpr PageIdentifier emptyValue()
++ {
++ return PageIdentifier();
++ }
++ };
++
++private:
++ friend PageIdentifier makePageIdentifier(uint64_t);
++ friend struct HashTraits;
++ friend struct PageIdentifierHash;
++
++ static uint64_t hashTableDeletedValue() { return std::numeric_limits::max(); }
++ static bool isValidIdentifier(uint64_t identifier) { return identifier && identifier != hashTableDeletedValue(); }
++
++ explicit constexpr PageIdentifier(uint64_t identifier)
++ : m_identifier(identifier)
++ {
++ }
++
++ uint64_t m_identifier { 0 };
++ inline static bool m_generationProtected { false };
++};
++
++inline PageIdentifier makePageIdentifier(uint64_t identifier)
++{
++ return PageIdentifier { identifier };
++}
++
++struct PageIdentifierHash {
++ static unsigned hash(const PageIdentifier& identifier) { return WTF::intHash(identifier.m_identifier); }
++ static bool equal(const PageIdentifier& a, const PageIdentifier& b) { return a == b; }
++ static constexpr bool safeToCompareToEmptyOrDeleted = true;
++};
++
++inline TextStream& operator<<(TextStream& ts, const PageIdentifier& identifier)
++{
++ ts << identifier.toUInt64();
++ return ts;
++}
++
++inline uint64_t PageIdentifierBase::generateIdentifierInternal()
++{
++ static uint64_t current;
++ return ++current;
+ }
++
++inline uint64_t PageIdentifierBase::generateThreadSafeIdentifierInternal()
++{
++ static LazyNeverDestroyed> current;
++ static std::once_flag initializeCurrentIdentifier;
++ std::call_once(initializeCurrentIdentifier, [] {
++ current.construct(0);
++ });
++ return ++current.get();
++}
++
++} // namespace WebCore
++
++namespace WTF {
++
++template<> struct HashTraits : SimpleClassHashTraits { };
++
++template<> struct DefaultHash {
++ typedef WebCore::PageIdentifierHash Hash;
++};
++
++} // namespace WTF
+diff --git a/Source/WebKit/NetworkProcess/cache/NetworkCache.h b/Source/WebKit/NetworkProcess/cache/NetworkCache.h
+index 04d7d6af73bc..d7bfee11b030 100644
+--- a/Source/WebKit/NetworkProcess/cache/NetworkCache.h
++++ b/Source/WebKit/NetworkProcess/cache/NetworkCache.h
+@@ -225,7 +225,7 @@ struct GlobalFrameIDHash {
+ template<> struct HashTraits : GenericHashTraits {
+ static WebKit::NetworkCache::GlobalFrameID emptyValue() { return { }; }
+
+- static void constructDeletedValue(WebKit::NetworkCache::GlobalFrameID& slot) { slot.webPageID = makeObjectIdentifier(std::numeric_limits::max()); }
++ static void constructDeletedValue(WebKit::NetworkCache::GlobalFrameID& slot) { slot.webPageID = WebCore::makePageIdentifier(std::numeric_limits::max()); }
+
+ static bool isDeletedValue(const WebKit::NetworkCache::GlobalFrameID& slot) { return slot.webPageID.toUInt64() == std::numeric_limits::max(); }
+ };
+diff --git a/Source/WebKit/UIProcess/gtk/WaylandCompositor.cpp b/Source/WebKit/UIProcess/gtk/WaylandCompositor.cpp
+index b34d13b865c5..26083eda5486 100644
+--- a/Source/WebKit/UIProcess/gtk/WaylandCompositor.cpp
++++ b/Source/WebKit/UIProcess/gtk/WaylandCompositor.cpp
+@@ -388,7 +388,7 @@ static const struct wl_webkitgtk_interface webkitgtkInterface = {
+ return;
+
+ auto* compositor = static_cast(wl_resource_get_user_data(resource));
+- compositor->bindSurfaceToWebPage(surface, makeObjectIdentifier(pageID));
++ compositor->bindSurfaceToWebPage(surface, WebCore::makePageIdentifier(pageID));
+ }
+ };
+
+diff --git a/Source/WebKit/WebProcess/Network/NetworkProcessConnection.cpp b/Source/WebKit/WebProcess/Network/NetworkProcessConnection.cpp
+index 5f3cca93e3ac..b52c36838dcd 100644
+--- a/Source/WebKit/WebProcess/Network/NetworkProcessConnection.cpp
++++ b/Source/WebKit/WebProcess/Network/NetworkProcessConnection.cpp
+@@ -98,7 +98,7 @@ void NetworkProcessConnection::didReceiveMessage(IPC::Connection& connection, IP
+ return;
+ }
+ if (decoder.messageReceiverName() == Messages::WebPage::messageReceiverName()) {
+- if (auto* webPage = WebProcess::singleton().webPage(makeObjectIdentifier(decoder.destinationID())))
++ if (auto* webPage = WebProcess::singleton().webPage(WebCore::makePageIdentifier(decoder.destinationID())))
+ webPage->didReceiveWebPageMessage(connection, decoder);
+ return;
+ }
+@@ -152,7 +152,7 @@ void NetworkProcessConnection::didReceiveMessage(IPC::Connection& connection, IP
+
+ #if ENABLE(APPLE_PAY_REMOTE_UI)
+ if (decoder.messageReceiverName() == Messages::WebPaymentCoordinator::messageReceiverName()) {
+- if (auto webPage = WebProcess::singleton().webPage(makeObjectIdentifier(decoder.destinationID())))
++ if (auto webPage = WebProcess::singleton().webPage(WebCore::makePageIdentifier(decoder.destinationID())))
+ webPage->paymentCoordinator()->didReceiveMessage(connection, decoder);
+ return;
+ }
+@@ -174,7 +174,7 @@ void NetworkProcessConnection::didReceiveSyncMessage(IPC::Connection& connection
+
+ #if ENABLE(APPLE_PAY_REMOTE_UI)
+ if (decoder.messageReceiverName() == Messages::WebPaymentCoordinator::messageReceiverName()) {
+- if (auto webPage = WebProcess::singleton().webPage(makeObjectIdentifier(decoder.destinationID())))
++ if (auto webPage = WebProcess::singleton().webPage(WebCore::makePageIdentifier(decoder.destinationID())))
+ webPage->paymentCoordinator()->didReceiveSyncMessage(connection, decoder, replyEncoder);
+ return;
+ }
diff --git a/SOURCES/webkit-old-cmake.patch b/SOURCES/webkit-old-cmake.patch
new file mode 100644
index 00000000..19d0845e
--- /dev/null
+++ b/SOURCES/webkit-old-cmake.patch
@@ -0,0 +1,385 @@
+diff -urpN webkitgtk-2.28.0.orig/CMakeLists.txt webkitgtk-2.28.0.cmake/CMakeLists.txt
+--- webkitgtk-2.28.0.orig/CMakeLists.txt 2020-02-04 04:23:40.000000000 -0600
++++ webkitgtk-2.28.0.cmake/CMakeLists.txt 2020-03-19 15:44:50.038776382 -0500
+@@ -2,13 +2,13 @@
+ # Determine CMake version and build type.
+ # -----------------------------------------------------------------------------
+ #
+-# NOTE: cmake_minimum_required() and project() *MUST* be the two first commands
++# NOTE: cmake_minimum_required() and project() *MUST* be the two fist commands
+ # used, see https://cmake.org/cmake/help/v3.3/command/project.html -- the
+ # latter in particular handles loading a bunch of shared CMake definitions
+ # and loading the cross-compilation settings from CMAKE_TOOLCHAIN_FILE.
+ #
+
+-cmake_minimum_required(VERSION 3.10)
++cmake_minimum_required(VERSION 3.3)
+
+ project(WebKit)
+
+diff -urpN webkitgtk-2.28.0.orig/Source/cmake/FindICU.cmake webkitgtk-2.28.0.cmake/Source/cmake/FindICU.cmake
+--- webkitgtk-2.28.0.orig/Source/cmake/FindICU.cmake 1969-12-31 18:00:00.000000000 -0600
++++ webkitgtk-2.28.0.cmake/Source/cmake/FindICU.cmake 2020-03-19 15:44:50.042776404 -0500
+@@ -0,0 +1,110 @@
++# Finds the International Components for Unicode (ICU) Library
++#
++# ICU_FOUND - True if ICU found.
++# ICU_I18N_FOUND - True if ICU's internationalization library found.
++# ICU_INCLUDE_DIRS - Directory to include to get ICU headers
++# Note: always include ICU headers as, e.g.,
++# unicode/utypes.h
++# ICU_LIBRARIES - Libraries to link against for the common ICU
++# ICU_I18N_LIBRARIES - Libraries to link against for ICU internationaliation
++# (note: in addition to ICU_LIBRARIES)
++
++find_package(PkgConfig)
++pkg_check_modules(PC_ICU icu-uc)
++
++# Look for the header file.
++find_path(
++ ICU_INCLUDE_DIR
++ NAMES unicode/utypes.h
++ HINTS ${PC_ICU_INCLUDE_DIRS}
++ ${PC_ICU_INCLUDEDIR}
++ ${WEBKIT_LIBRARIES_INCLUDE_DIR}
++ DOC "Include directory for the ICU library")
++mark_as_advanced(ICU_INCLUDE_DIR)
++
++# Look for the library.
++find_library(
++ ICU_LIBRARY
++ NAMES libicuuc cygicuuc cygicuuc32 icuuc
++ HINTS ${PC_ICU_LIBRARY_DIRS}
++ ${PC_ICU_LIBDIR}
++ ${WEBKIT_LIBRARIES_LINK_DIR}
++ DOC "Libraries to link against for the common parts of ICU")
++mark_as_advanced(ICU_LIBRARY)
++
++# Copy the results to the output variables.
++if (ICU_INCLUDE_DIR AND ICU_LIBRARY)
++ set(ICU_FOUND 1)
++ set(ICU_LIBRARIES ${ICU_LIBRARY})
++ set(ICU_INCLUDE_DIRS ${ICU_INCLUDE_DIR})
++
++ set(ICU_VERSION 0)
++ set(ICU_MAJOR_VERSION 0)
++ set(ICU_MINOR_VERSION 0)
++ file(READ "${ICU_INCLUDE_DIR}/unicode/uversion.h" _ICU_VERSION_CONENTS)
++ string(REGEX REPLACE ".*#define U_ICU_VERSION_MAJOR_NUM ([0-9]+).*" "\\1" ICU_MAJOR_VERSION "${_ICU_VERSION_CONENTS}")
++ string(REGEX REPLACE ".*#define U_ICU_VERSION_MINOR_NUM ([0-9]+).*" "\\1" ICU_MINOR_VERSION "${_ICU_VERSION_CONENTS}")
++
++ set(ICU_VERSION "${ICU_MAJOR_VERSION}.${ICU_MINOR_VERSION}")
++
++ # Look for the ICU internationalization libraries
++ pkg_check_modules(PC_ICU_I18N icu-i18n)
++ find_library(
++ ICU_I18N_LIBRARY
++ NAMES icui18n libicui18n libicuin cygicuin cygicuin32 icuin
++ HINTS ${PC_ICU_I18N_LIBRARY_DIRS}
++ ${PC_ICU_I18N_LIBDIR}
++ ${WEBKIT_LIBRARIES_LINK_DIR}
++ DOC "Libraries to link against for ICU internationalization")
++ mark_as_advanced(ICU_I18N_LIBRARY)
++ if (ICU_I18N_LIBRARY)
++ set(ICU_I18N_FOUND 1)
++ set(ICU_I18N_LIBRARIES ${ICU_I18N_LIBRARY})
++ else ()
++ set(ICU_I18N_FOUND 0)
++ set(ICU_I18N_LIBRARIES)
++ endif ()
++
++ # Look for the ICU data libraries
++ find_library(
++ ICU_DATA_LIBRARY
++ NAMES icudata libicudata cygicudata cygicudata32
++ HINTS ${PC_ICU_I18N_LIBRARY_DIRS}
++ ${PC_ICU_I18N_LIBDIR}
++ ${WEBKIT_LIBRARIES_LINK_DIR}
++ DOC "Libraries to link against for ICU data")
++ mark_as_advanced(ICU_DATA_LIBRARY)
++ if (ICU_DATA_LIBRARY)
++ set(ICU_DATA_FOUND 1)
++ set(ICU_DATA_LIBRARIES ${ICU_DATA_LIBRARY})
++ else ()
++ set(ICU_DATA_FOUND 0)
++ set(ICU_DATA_LIBRARIES)
++ endif ()
++else ()
++ set(ICU_FOUND 0)
++ set(ICU_I18N_FOUND 0)
++ set(ICU_DATA_FOUND 0)
++ set(ICU_LIBRARIES)
++ set(ICU_I18N_LIBRARIES)
++ set(ICU_DATA_LIBRARIES)
++ set(ICU_INCLUDE_DIRS)
++ set(ICU_VERSION)
++ set(ICU_MAJOR_VERSION)
++ set(ICU_MINOR_VERSION)
++endif ()
++
++if (ICU_FOUND)
++ if (NOT ICU_FIND_QUIETLY)
++ message(STATUS "Found ICU header files in ${ICU_INCLUDE_DIRS}")
++ message(STATUS "Found ICU libraries: ${ICU_LIBRARIES}")
++ message(STATUS "Found ICU internationaliation libraries: ${ICU_I18N_LIBRARIES}")
++ message(STATUS "Found ICU data libraries: ${ICU_DATA_LIBRARIES}")
++ endif ()
++else ()
++ if (ICU_FIND_REQUIRED)
++ message(FATAL_ERROR "Could not find ICU")
++ else ()
++ message(STATUS "Optional package ICU was not found")
++ endif ()
++endif ()
+diff -urpN webkitgtk-2.28.0.orig/Source/cmake/OptionsCommon.cmake webkitgtk-2.28.0.cmake/Source/cmake/OptionsCommon.cmake
+--- webkitgtk-2.28.0.orig/Source/cmake/OptionsCommon.cmake 2020-02-04 04:24:08.000000000 -0600
++++ webkitgtk-2.28.0.cmake/Source/cmake/OptionsCommon.cmake 2020-03-19 15:44:50.042776404 -0500
+@@ -1,7 +1,3 @@
+-set(CMAKE_CXX_STANDARD 17)
+-set(CMAKE_CXX_STANDARD_REQUIRED ON)
+-set(CMAKE_CXX_EXTENSIONS OFF)
+-
+ add_definitions(-DBUILDING_WITH_CMAKE=1)
+ add_definitions(-DHAVE_CONFIG_H=1)
+
+diff -urpN webkitgtk-2.28.0.orig/Source/cmake/OptionsGTK.cmake webkitgtk-2.28.0.cmake/Source/cmake/OptionsGTK.cmake
+--- webkitgtk-2.28.0.orig/Source/cmake/OptionsGTK.cmake 2020-03-10 03:31:09.000000000 -0500
++++ webkitgtk-2.28.0.cmake/Source/cmake/OptionsGTK.cmake 2020-03-23 14:27:09.176026963 -0500
+@@ -25,7 +25,7 @@ find_package(GLIB 2.44.0 REQUIRED COMPON
+ find_package(GTK3 3.22.0 REQUIRED)
+ find_package(GDK3 3.22.0 REQUIRED)
+ find_package(HarfBuzz 0.9.18 REQUIRED COMPONENTS ICU)
+-find_package(ICU REQUIRED COMPONENTS data i18n uc)
++find_package(ICU REQUIRED)
+ find_package(JPEG REQUIRED)
+ find_package(LibSoup 2.54.0 REQUIRED)
+ find_package(LibXml2 2.8.0 REQUIRED)
+diff -urpN webkitgtk-2.28.0.orig/Source/cmake/OptionsJSCOnly.cmake webkitgtk-2.28.0.cmake/Source/cmake/OptionsJSCOnly.cmake
+--- webkitgtk-2.28.0.orig/Source/cmake/OptionsJSCOnly.cmake 2020-02-04 04:24:08.000000000 -0600
++++ webkitgtk-2.28.0.cmake/Source/cmake/OptionsJSCOnly.cmake 2020-03-19 15:44:50.046776424 -0500
+@@ -96,8 +96,9 @@ else ()
+ endif ()
+
+ if (NOT APPLE)
+- find_package(ICU REQUIRED COMPONENTS data i18n uc)
++ find_package(ICU REQUIRED)
+ else ()
+ add_definitions(-DU_DISABLE_RENAMING=1 -DU_SHOW_CPLUSPLUS_API=0)
+- include(target/icu)
++ set(ICU_INCLUDE_DIRS ${CMAKE_BINARY_DIR}/ICU/Headers)
++ set(ICU_LIBRARIES libicucore.dylib)
+ endif ()
+diff -urpN webkitgtk-2.28.0.orig/Source/cmake/OptionsWin.cmake webkitgtk-2.28.0.cmake/Source/cmake/OptionsWin.cmake
+--- webkitgtk-2.28.0.orig/Source/cmake/OptionsWin.cmake 2020-02-04 04:24:08.000000000 -0600
++++ webkitgtk-2.28.0.cmake/Source/cmake/OptionsWin.cmake 2020-03-19 15:44:50.046776424 -0500
+@@ -164,6 +164,8 @@ set(WTF_LIBRARY_TYPE SHARED)
+ set(PAL_LIBRARY_TYPE STATIC)
+ set(WebKitLegacy_LIBRARY_TYPE SHARED)
+
++find_package(ICU REQUIRED)
++
+ # If is not included before redefinition errors occur
+ # unless _WINSOCKAPI_ is defined before is included
+ add_definitions(-D_WINSOCKAPI_=)
+diff -urpN webkitgtk-2.28.0.orig/Source/cmake/WebKitCompilerFlags.cmake webkitgtk-2.28.0.cmake/Source/cmake/WebKitCompilerFlags.cmake
+--- webkitgtk-2.28.0.orig/Source/cmake/WebKitCompilerFlags.cmake 2020-02-25 07:02:33.000000000 -0600
++++ webkitgtk-2.28.0.cmake/Source/cmake/WebKitCompilerFlags.cmake 2020-03-19 15:44:50.046776424 -0500
+@@ -104,6 +104,13 @@ if (COMPILER_IS_GCC_OR_CLANG)
+ WEBKIT_APPEND_GLOBAL_COMPILER_FLAGS(-fno-exceptions)
+ WEBKIT_APPEND_GLOBAL_CXX_FLAGS(-fno-rtti)
+
++ check_cxx_compiler_flag("-std=c++17" CXX_COMPILER_SUPPORTS_CXX17)
++ if (CXX_COMPILER_SUPPORTS_CXX17)
++ WEBKIT_APPEND_GLOBAL_CXX_FLAGS(-std=c++17)
++ else ()
++ message(FATAL_ERROR "Compiler with C++17 support is required")
++ endif ()
++
+ if (WIN32)
+ WEBKIT_APPEND_GLOBAL_COMPILER_FLAGS(-mno-ms-bitfields)
+ WEBKIT_PREPEND_GLOBAL_COMPILER_FLAGS(-Wno-unknown-pragmas)
+diff -urpN webkitgtk-2.28.0.orig/Source/JavaScriptCore/CMakeLists.txt webkitgtk-2.28.0.cmake/Source/JavaScriptCore/CMakeLists.txt
+--- webkitgtk-2.28.0.orig/Source/JavaScriptCore/CMakeLists.txt 2020-02-04 04:23:58.000000000 -0600
++++ webkitgtk-2.28.0.cmake/Source/JavaScriptCore/CMakeLists.txt 2020-03-19 15:44:50.050776446 -0500
+@@ -1,4 +1,4 @@
+-cmake_minimum_required(VERSION 3.10)
++cmake_minimum_required(VERSION 2.8.12)
+ include(WebKitCommon)
+ include(target/TargetWTF)
+ set_property(DIRECTORY . PROPERTY FOLDER "JavaScriptCore")
+@@ -54,6 +54,10 @@ if (USE_CAPSTONE)
+ list(APPEND JavaScriptCore_PRIVATE_INCLUDE_DIRECTORIES "${THIRDPARTY_DIR}/capstone/Source/include")
+ endif ()
+
++set(JavaScriptCore_SYSTEM_INCLUDE_DIRECTORIES
++ "${ICU_INCLUDE_DIRS}"
++)
++
+ set(JavaScriptCore_OBJECT_LUT_SOURCES
+ runtime/ArrayConstructor.cpp
+ runtime/AsyncFromSyncIteratorPrototype.cpp
+@@ -222,11 +226,7 @@ add_custom_command(
+ VERBATIM)
+
+
+-if (WTF_OS_MAC_OS_X)
+ execute_process(COMMAND bash -c "date +'%s'" OUTPUT_VARIABLE BUILD_TIME OUTPUT_STRIP_TRAILING_WHITESPACE)
+-else ()
+- string(TIMESTAMP BUILD_TIME "%s")
+-endif ()
+
+ list(APPEND JavaScriptCore_HEADERS
+ ${JavaScriptCore_DERIVED_SOURCES_DIR}/BytecodeStructs.h
+diff -urpN webkitgtk-2.28.0.orig/Source/ThirdParty/ANGLE/include/CMakeLists.txt webkitgtk-2.28.0.cmake/Source/ThirdParty/ANGLE/include/CMakeLists.txt
+--- webkitgtk-2.28.0.orig/Source/ThirdParty/ANGLE/include/CMakeLists.txt 2020-02-04 04:24:05.000000000 -0600
++++ webkitgtk-2.28.0.cmake/Source/ThirdParty/ANGLE/include/CMakeLists.txt 2020-03-20 16:05:39.703431614 -0500
+@@ -1,19 +1,39 @@
+ string(REGEX REPLACE "(^|;)include/" "\\1" includes "${libangle_includes}")
+
+-set(egl_headers ${includes})
+-list(FILTER egl_headers INCLUDE REGEX "EGL/.*")
++set(egl_headers
++ EGL/egl.h
++ EGL/eglext.h
++ EGL/eglext_angle.h
++ EGL/eglplatform.h
++)
++
++set(gles_headers
++ GLES/egl.h
++ GLES/gl.h
++ GLES/glext.h
++ GLES/glext_explicit_context_autogen.inc
++ GLES/glext_angle.h
++ GLES/glplatform.h
++)
++
++set(gles2_headers
++ GLES2/gl2.h
++ GLES2/gl2ext.h
++ GLES2/gl2ext_explicit_context_autogen.inc
++ GLES2/gl2ext_angle.h
++ GLES2/gl2platform.h
++)
++
++set(gles3_headers
++ GLES3/gl3.h
++ GLES3/gl3ext_explicit_context_autogen.inc
++ GLES3/gl31.h
++ GLES3/gl31ext_explicit_context_autogen.inc
++ GLES3/gl32.h
++ GLES3/gl3platform.h
++)
+
+-set(gles_headers ${includes})
+-list(FILTER gles_headers INCLUDE REGEX "GLES/.*")
+-
+-set(gles2_headers ${includes})
+-list(FILTER gles2_headers INCLUDE REGEX "GLES2/.*")
+-
+-set(gles3_headers ${includes})
+-list(FILTER gles3_headers INCLUDE REGEX "GLES3/.*")
+-
+-set(khr_headers ${includes})
+-list(FILTER khr_headers INCLUDE REGEX "KHR/.*")
++set(khr_headers KHR/khrplatform.h)
+
+ set(glslang_headers
+ GLSLANG/ShaderLang.h
+diff -urpN webkitgtk-2.28.0.orig/Source/WebCore/CMakeLists.txt webkitgtk-2.28.0.cmake/Source/WebCore/CMakeLists.txt
+--- webkitgtk-2.28.0.orig/Source/WebCore/CMakeLists.txt 2020-02-04 04:24:07.000000000 -0600
++++ webkitgtk-2.28.0.cmake/Source/WebCore/CMakeLists.txt 2020-03-20 15:38:13.886631507 -0500
+@@ -1,4 +1,4 @@
+-cmake_minimum_required(VERSION 3.10)
++cmake_minimum_required(VERSION 2.8.12)
+
+ include(WebKitCommon)
+ include(target/TargetWTF)
+@@ -173,6 +173,7 @@ set(WebCore_PRIVATE_INCLUDE_DIRECTORIES
+ )
+
+ set(WebCore_SYSTEM_INCLUDE_DIRECTORIES
++ ${ICU_INCLUDE_DIRS}
+ ${LIBXML2_INCLUDE_DIR}
+ ${LIBXSLT_INCLUDE_DIR}
+ ${ZLIB_INCLUDE_DIRS}
+@@ -1220,7 +1221,8 @@ set(WebCore_PLUG_INS_RESOURCES
+ )
+
+ set(WebCore_LIBRARIES
+- SQLite::SQLite3
++ ${ICU_LIBRARIES}
++ ${SQLite3_LIBRARIES}
+ ${LIBXML2_LIBRARIES}
+ ${LIBXSLT_LIBRARIES}
+ ${ZLIB_LIBRARIES}
+diff -urpN webkitgtk-2.28.0.orig/Source/WebCore/PAL/pal/CMakeLists.txt webkitgtk-2.28.0.cmake/Source/WebCore/PAL/pal/CMakeLists.txt
+--- webkitgtk-2.28.0.orig/Source/WebCore/PAL/pal/CMakeLists.txt 2020-02-04 04:24:07.000000000 -0600
++++ webkitgtk-2.28.0.cmake/Source/WebCore/PAL/pal/CMakeLists.txt 2020-03-19 15:44:50.054776467 -0500
+@@ -38,6 +38,10 @@ set(PAL_PRIVATE_INCLUDE_DIRECTORIES
+ "${PAL_DIR}/pal/text"
+ )
+
++set(PAL_SYSTEM_INCLUDE_DIRECTORIES
++ ${ICU_INCLUDE_DIRS}
++)
++
+ set(PAL_LIBRARIES
+ WebKit::JavaScriptCore
+ )
+diff -urpN webkitgtk-2.28.0.orig/Source/WebCore/platform/FreeType.cmake webkitgtk-2.28.0.cmake/Source/WebCore/platform/FreeType.cmake
+--- webkitgtk-2.28.0.orig/Source/WebCore/platform/FreeType.cmake 2020-02-04 04:24:07.000000000 -0600
++++ webkitgtk-2.28.0.cmake/Source/WebCore/platform/FreeType.cmake 2020-03-20 15:52:06.347082668 -0500
+@@ -34,8 +34,7 @@ list(APPEND WebCore_SYSTEM_INCLUDE_DIREC
+ )
+
+ list(APPEND WebCore_LIBRARIES
+- HarfBuzz::HarfBuzz
+- HarfBuzz::ICU
+ ${FONTCONFIG_LIBRARIES}
+ ${FREETYPE_LIBRARIES}
++ ${HarfBuzz_LIBRARIES}
+ )
+diff -urpN webkitgtk-2.28.0.orig/Source/WebKit/CMakeLists.txt webkitgtk-2.28.0.cmake/Source/WebKit/CMakeLists.txt
+--- webkitgtk-2.28.0.orig/Source/WebKit/CMakeLists.txt 2020-02-04 04:24:08.000000000 -0600
++++ webkitgtk-2.28.0.cmake/Source/WebKit/CMakeLists.txt 2020-03-19 15:44:50.054776467 -0500
+@@ -109,6 +109,10 @@ set(WebKit_INCLUDE_DIRECTORIES
+
+ set(PROTOCOL_GENERATOR_SCRIPTS_DIR "${JAVASCRIPTCORE_DIR}/inspector/scripts")
+
++set(WebKit_SYSTEM_INCLUDE_DIRECTORIES
++ ${ICU_INCLUDE_DIRS}
++)
++
+ list(APPEND WebKit_UNIFIED_SOURCE_LIST_FILES
+ "Sources.txt"
+ )
+diff -urpN webkitgtk-2.28.0.orig/Source/WTF/CMakeLists.txt webkitgtk-2.28.0.cmake/Source/WTF/CMakeLists.txt
+--- webkitgtk-2.28.0.orig/Source/WTF/CMakeLists.txt 2020-02-04 04:24:07.000000000 -0600
++++ webkitgtk-2.28.0.cmake/Source/WTF/CMakeLists.txt 2020-03-19 15:44:50.054776467 -0500
+@@ -1,4 +1,4 @@
+-cmake_minimum_required(VERSION 3.10)
++cmake_minimum_required(VERSION 2.8.12)
+ include(WebKitCommon)
+ set_property(DIRECTORY . PROPERTY FOLDER "WTF")
+
+diff -urpN webkitgtk-2.28.0.orig/Source/WTF/wtf/CMakeLists.txt webkitgtk-2.28.0.cmake/Source/WTF/wtf/CMakeLists.txt
+--- webkitgtk-2.28.0.orig/Source/WTF/wtf/CMakeLists.txt 2020-02-04 04:24:07.000000000 -0600
++++ webkitgtk-2.28.0.cmake/Source/WTF/wtf/CMakeLists.txt 2020-03-19 15:44:50.054776467 -0500
+@@ -517,10 +517,13 @@ if (NOT USE_SYSTEM_MALLOC)
+ list(APPEND WTF_LIBRARIES WebKit::bmalloc)
+ endif ()
+
++set(WTF_SYSTEM_INCLUDE_DIRECTORIES
++ ${ICU_INCLUDE_DIRS}
++)
+ list(APPEND WTF_LIBRARIES
+- ICU::data
+- ICU::i18n
+- ICU::uc
++ ${ICU_DATA_LIBRARIES}
++ ${ICU_I18N_LIBRARIES}
++ ${ICU_LIBRARIES}
+ )
+
+ set(WTF_INTERFACE_LIBRARIES WTF)
diff --git a/SOURCES/webkit-remove_brotli.patch b/SOURCES/webkit-remove_brotli.patch
new file mode 100644
index 00000000..2c634faa
--- /dev/null
+++ b/SOURCES/webkit-remove_brotli.patch
@@ -0,0 +1,12845 @@
+diff -up webkitgtk-2.20.0/Source/cmake/FindBrotliDec.cmake.remove_brotli webkitgtk-2.20.0/Source/cmake/FindBrotliDec.cmake
+--- webkitgtk-2.20.0/Source/cmake/FindBrotliDec.cmake.remove_brotli 2018-03-12 14:43:28.679016345 +0100
++++ webkitgtk-2.20.0/Source/cmake/FindBrotliDec.cmake 2018-03-12 14:46:44.967630278 +0100
+@@ -1,53 +0,0 @@
+-# - Try to find BrotliDec.
+-# Once done, this will define
+-#
+-# BROTLIDEC_FOUND - system has BrotliDec.
+-# BROTLIDEC_INCLUDE_DIRS - the BrotliDec include directories
+-# BROTLIDEC_LIBRARIES - link these to use BrotliDec.
+-#
+-# Copyright (C) 2017 Igalia S.L.
+-#
+-# Redistribution and use in source and binary forms, with or without
+-# modification, are permitted provided that the following conditions
+-# are met:
+-# 1. Redistributions of source code must retain the above copyright
+-# notice, this list of conditions and the following disclaimer.
+-# 2. Redistributions in binary form must reproduce the above copyright
+-# notice, this list of conditions and the following disclaimer in the
+-# documentation and/or other materials provided with the distribution.
+-#
+-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS
+-# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+-# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS
+-# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+-# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+-# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+-# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+-# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+-# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+-# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-
+-find_package(PkgConfig)
+-pkg_check_modules(PC_BROTLIDEC libbrotlidec)
+-
+-find_path(BROTLIDEC_INCLUDE_DIRS
+- NAMES brotli/decode.h
+- HINTS ${PC_BROTLIDEC_INCLUDEDIR}
+-)
+-
+-find_library(BROTLIDEC_LIBRARIES
+- NAMES brotlidec
+- HINTS ${PC_BROTLIDEC_LIBDIR}
+-)
+-
+-include(FindPackageHandleStandardArgs)
+-find_package_handle_standard_args(BrotliDec
+- REQUIRED_VARS BROTLIDEC_INCLUDE_DIRS BROTLIDEC_LIBRARIES
+- FOUND_VAR BROTLIDEC_FOUND
+- VERSION_VAR PC_BROTLIDEC_VERSION)
+-
+-mark_as_advanced(
+- BROTLIDEC_INCLUDE_DIRS
+- BROTLIDEC_LIBRARIES
+-)
+diff -up webkitgtk-2.20.0/Source/CMakeLists.txt.remove_brotli webkitgtk-2.20.0/Source/CMakeLists.txt
+--- webkitgtk-2.20.0/Source/CMakeLists.txt.remove_brotli 2018-03-12 14:43:28.690016267 +0100
++++ webkitgtk-2.20.0/Source/CMakeLists.txt 2018-03-12 14:43:28.708016140 +0100
+@@ -22,6 +22,7 @@ if (USE_OPENVR)
+ endif ()
+
+ if (USE_WOFF2)
++ add_subdirectory(ThirdParty/brotli)
+ add_subdirectory(ThirdParty/woff2)
+ endif ()
+
+diff -up webkitgtk-2.20.0/Source/cmake/OptionsGTK.cmake.remove_brotli webkitgtk-2.20.0/Source/cmake/OptionsGTK.cmake
+--- webkitgtk-2.20.0/Source/cmake/OptionsGTK.cmake.remove_brotli 2018-03-12 14:43:28.729015992 +0100
++++ webkitgtk-2.20.0/Source/cmake/OptionsGTK.cmake 2018-03-12 14:46:14.846842972 +0100
+@@ -47,6 +47,7 @@ include(GStreamerDefinitions)
+
+ SET_AND_EXPOSE_TO_BUILD(USE_ATK TRUE)
+ SET_AND_EXPOSE_TO_BUILD(USE_CAIRO TRUE)
++SET_AND_EXPOSE_TO_BUILD(USE_WOFF2 TRUE)
+ SET_AND_EXPOSE_TO_BUILD(USE_XDGMIME TRUE)
+ SET_AND_EXPOSE_TO_BUILD(USE_GCRYPT TRUE)
+
+@@ -340,13 +340,6 @@ if (USE_LIBHYPHEN)
+ endif ()
+ endif ()
+
+-if (USE_WOFF2)
+- find_package(BrotliDec 1.0.1)
+- if (NOT BROTLIDEC_FOUND)
+- message(FATAL_ERROR "librotlidec is needed for USE_WOFF2.")
+- endif ()
+-endif ()
+-
+ # https://bugs.webkit.org/show_bug.cgi?id=182247
+ if (ENABLED_COMPILER_SANITIZERS)
+ set(ENABLE_INTROSPECTION OFF)
+diff -up webkitgtk-2.20.0/Source/ThirdParty/brotli/CMakeLists.txt.remove_brotli webkitgtk-2.20.0/Source/ThirdParty/brotli/CMakeLists.txt
+--- webkitgtk-2.20.0/Source/ThirdParty/brotli/CMakeLists.txt.remove_brotli 2018-03-12 14:43:28.709016133 +0100
++++ webkitgtk-2.20.0/Source/ThirdParty/brotli/CMakeLists.txt 2018-03-12 14:43:28.709016133 +0100
+@@ -0,0 +1,24 @@
++set(BROTLI_DIR "${THIRDPARTY_DIR}/brotli")
++
++set(BROTLI_INCLUDE_DIRECTORIES
++ "${BROTLI_DIR}/common"
++ "${BROTLI_DIR}/dec"
++ "${BROTLI_DIR}/include"
++)
++
++set(BROTLI_SOURCES
++ ${BROTLI_DIR}/common/dictionary.c
++ ${BROTLI_DIR}/dec/bit_reader.c
++ ${BROTLI_DIR}/dec/decode.c
++ ${BROTLI_DIR}/dec/huffman.c
++ ${BROTLI_DIR}/dec/state.c
++)
++
++include_directories("${BROTLI_INCLUDE_DIRECTORIES}")
++add_definitions(-DBROTLI_BUILD_PORTABLE)
++add_library(brotli STATIC ${BROTLI_SOURCES})
++
++if (COMPILER_IS_GCC_OR_CLANG)
++ WEBKIT_ADD_TARGET_C_FLAGS(brotli -Wno-cast-align
++ -Wno-implicit-fallthrough)
++endif ()
+diff -up webkitgtk-2.20.0/Source/ThirdParty/brotli/common/constants.h.remove_brotli webkitgtk-2.20.0/Source/ThirdParty/brotli/common/constants.h
+--- webkitgtk-2.20.0/Source/ThirdParty/brotli/common/constants.h.remove_brotli 2018-03-12 14:43:28.710016126 +0100
++++ webkitgtk-2.20.0/Source/ThirdParty/brotli/common/constants.h 2018-03-12 14:43:28.710016126 +0100
+@@ -0,0 +1,57 @@
++/* Copyright 2016 Google Inc. All Rights Reserved.
++
++ Distributed under MIT license.
++ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
++*/
++
++#ifndef BROTLI_COMMON_CONSTANTS_H_
++#define BROTLI_COMMON_CONSTANTS_H_
++
++/* Specification: 7.3. Encoding of the context map */
++#define BROTLI_CONTEXT_MAP_MAX_RLE 16
++
++/* Specification: 2. Compressed representation overview */
++#define BROTLI_MAX_NUMBER_OF_BLOCK_TYPES 256
++
++/* Specification: 3.3. Alphabet sizes: insert-and-copy length */
++#define BROTLI_NUM_LITERAL_SYMBOLS 256
++#define BROTLI_NUM_COMMAND_SYMBOLS 704
++#define BROTLI_NUM_BLOCK_LEN_SYMBOLS 26
++#define BROTLI_MAX_CONTEXT_MAP_SYMBOLS (BROTLI_MAX_NUMBER_OF_BLOCK_TYPES + \
++ BROTLI_CONTEXT_MAP_MAX_RLE)
++#define BROTLI_MAX_BLOCK_TYPE_SYMBOLS (BROTLI_MAX_NUMBER_OF_BLOCK_TYPES + 2)
++
++/* Specification: 3.5. Complex prefix codes */
++#define BROTLI_REPEAT_PREVIOUS_CODE_LENGTH 16
++#define BROTLI_REPEAT_ZERO_CODE_LENGTH 17
++#define BROTLI_CODE_LENGTH_CODES (BROTLI_REPEAT_ZERO_CODE_LENGTH + 1)
++/* "code length of 8 is repeated" */
++#define BROTLI_INITIAL_REPEATED_CODE_LENGTH 8
++
++/* Specification: 4. Encoding of distances */
++#define BROTLI_NUM_DISTANCE_SHORT_CODES 16
++#define BROTLI_MAX_NPOSTFIX 3
++#define BROTLI_MAX_NDIRECT 120
++#define BROTLI_MAX_DISTANCE_BITS 24U
++/* BROTLI_NUM_DISTANCE_SYMBOLS == 520 */
++#define BROTLI_NUM_DISTANCE_SYMBOLS (BROTLI_NUM_DISTANCE_SHORT_CODES + \
++ BROTLI_MAX_NDIRECT + \
++ (BROTLI_MAX_DISTANCE_BITS << \
++ (BROTLI_MAX_NPOSTFIX + 1)))
++/* Distance that is guaranteed to be representable in any stream. */
++#define BROTLI_MAX_DISTANCE 0x3FFFFFC
++
++/* 7.1. Context modes and context ID lookup for literals */
++/* "context IDs for literals are in the range of 0..63" */
++#define BROTLI_LITERAL_CONTEXT_BITS 6
++
++/* 7.2. Context ID for distances */
++#define BROTLI_DISTANCE_CONTEXT_BITS 2
++
++/* 9.1. Format of the Stream Header */
++/* Number of slack bytes for window size. Don't confuse
++ with BROTLI_NUM_DISTANCE_SHORT_CODES. */
++#define BROTLI_WINDOW_GAP 16
++#define BROTLI_MAX_BACKWARD_LIMIT(W) (((size_t)1 << (W)) - BROTLI_WINDOW_GAP)
++
++#endif /* BROTLI_COMMON_CONSTANTS_H_ */
+diff -up webkitgtk-2.20.0/Source/ThirdParty/brotli/common/dictionary.bin.remove_brotli webkitgtk-2.20.0/Source/ThirdParty/brotli/common/dictionary.bin
+--- webkitgtk-2.20.0/Source/ThirdParty/brotli/common/dictionary.bin.remove_brotli 2018-03-12 14:43:28.712016112 +0100
++++ webkitgtk-2.20.0/Source/ThirdParty/brotli/common/dictionary.bin 2018-03-12 14:43:28.711016119 +0100
+@@ -0,0 +1,432 @@
++timedownlifeleftbackcodedatashowonlysitecityopenjustlikefreeworktextyearoverbodyloveformbookplaylivelinehelphomesidemorewordlongthemviewfindpagedaysfullheadtermeachareafromtruemarkableuponhighdatelandnewsevennextcasebothpostusedmadehandherewhatnameLinkblogsizebaseheldmakemainuser') +holdendswithNewsreadweresigntakehavegameseencallpathwellplusmenufilmpartjointhislistgoodneedwayswestjobsmindalsologorichuseslastteamarmyfoodkingwilleastwardbestfirePageknowaway.pngmovethanloadgiveselfnotemuchfeedmanyrockicononcelookhidediedHomerulehostajaxinfoclublawslesshalfsomesuchzone100%onescareTimeracebluefourweekfacehopegavehardlostwhenparkkeptpassshiproomHTMLplanTypedonesavekeepflaglinksoldfivetookratetownjumpthusdarkcardfilefearstaykillthatfallautoever.comtalkshopvotedeepmoderestturnbornbandfellroseurl(skinrolecomeactsagesmeetgold.jpgitemvaryfeltthensenddropViewcopy1.0"stopelseliestourpack.gifpastcss?graymean>rideshotlatesaidroadvar feeljohnrickportfast'UA-deadpoorbilltypeU.S.woodmust2px;Inforankwidewantwalllead[0];paulwavesure$('#waitmassarmsgoesgainlangpaid!-- lockunitrootwalkfirmwifexml"songtest20pxkindrowstoolfontmailsafestarmapscorerainflowbabyspansays4px;6px;artsfootrealwikiheatsteptriporg/lakeweaktoldFormcastfansbankveryrunsjulytask1px;goalgrewslowedgeid="sets5px;.js?40pxif (soonseatnonetubezerosentreedfactintogiftharm18pxcamehillboldzoomvoideasyringfillpeakinitcost3px;jacktagsbitsrolleditknewnearironfreddiskwentsoilputs/js/holyT22:ISBNT20:adamseesjson', 'contT21: RSSloopasiamoon
soulLINEfortcartT14:80px!--<9px;T04:mike:46ZniceinchYorkricezh:'));puremageparatonebond:37Z_of_']);000,zh:tankyardbowlbush:56ZJava30px
++|}
++%C3%:34ZjeffEXPIcashvisagolfsnowzh:quer.csssickmeatmin.binddellhirepicsrent:36ZHTTP-201fotowolfEND xbox:54ZBODYdick;
++}
++exit:35Zvarsbeat'});diet999;anne}}[i].Langkm²wiretoysaddssealalex;
++ }echonine.org005)tonyjewssandlegsroof000) 200winegeardogsbootgarycutstyletemption.xmlcockgang$('.50pxPh.Dmiscalanloandeskmileryanunixdisc);}
++dustclip).
++
++70px-200DVDs7]>sonyguysfuckpipe|-
++!002)ndow[1];[];
++Log salt
++ bangtrimbath){
++00px
++});ko:feesad>
s:// [];tollplug(){
++{
++ .js'200pdualboat.JPG);
++}quot);
++
++');
++
++}
201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037201320122011201020092008200720062005200420032002200120001999199819971996199519941993199219911990198919881987198619851984198319821981198019791978197719761975197419731972197119701969196819671966196519641963196219611960195919581957195619551954195319521951195010001024139400009999comomásesteestaperotodohacecadaañobiendíaasívidacasootroforosolootracualdijosidograntipotemadebealgoquéestonadatrespococasabajotodasinoaguapuesunosantediceluisellamayozonaamorpisoobraclicellodioshoracasiзанаомрарутанепоотизнодотожеонихНаеебымыВысовывоНообПолиниРФНеМытыОнимдаЗаДаНуОбтеИзейнуммТыужفيأنمامعكلأورديافىهولملكاولهبسالإنهيأيقدهلثمبهلوليبلايبكشيامأمنتبيلنحبهممشوشfirstvideolightworldmediawhitecloseblackrightsmallbooksplacemusicfieldorderpointvalueleveltableboardhousegroupworksyearsstatetodaywaterstartstyledeathpowerphonenighterrorinputabouttermstitletoolseventlocaltimeslargewordsgamesshortspacefocusclearmodelblockguideradiosharewomenagainmoneyimagenamesyounglineslatercolorgreenfront&watchforcepricerulesbeginaftervisitissueareasbelowindextotalhourslabelprintpressbuiltlinksspeedstudytradefoundsenseundershownformsrangeaddedstillmovedtakenaboveflashfixedoftenotherviewschecklegalriveritemsquickshapehumanexistgoingmoviethirdbasicpeacestagewidthloginideaswrotepagesusersdrivestorebreaksouthvoicesitesmonthwherebuildwhichearthforumthreesportpartyClicklowerlivesclasslayerentrystoryusagesoundcourtyour birthpopuptypesapplyImagebeinguppernoteseveryshowsmeansextramatchtrackknownearlybegansuperpapernorthlearngivennamedendedTermspartsGroupbrandusingwomanfalsereadyaudiotakeswhile.com/livedcasesdailychildgreatjudgethoseunitsneverbroadcoastcoverapplefilescyclesceneplansclickwritequeenpieceemailframeolderphotolimitcachecivilscaleenterthemetheretouchboundroyalaskedwholesincestock namefaithheartemptyofferscopeownedmightalbumthinkbloodarraymajortrustcanonunioncountvalidstoneStyleLoginhappyoccurleft:freshquitefilmsgradeneedsurbanfightbasishoverauto;route.htmlmixedfinalYour slidetopicbrownalonedrawnsplitreachRightdatesmarchquotegoodsLinksdoubtasyncthumballowchiefyouthnovel10px;serveuntilhandsCheckSpacequeryjamesequaltwice0,000Startpanelsongsroundeightshiftworthpostsleadsweeksavoidthesemilesplanesmartalphaplantmarksratesplaysclaimsalestextsstarswrongthing.org/multiheardPowerstandtokensolid(thisbringshipsstafftriedcallsfullyfactsagentThis //-->adminegyptEvent15px;Emailtrue"crossspentblogsbox">notedleavechinasizesguestrobotheavytrue,sevengrandcrimesignsawaredancephase>
++
++
++name=diegopage swiss-->
++
++#fff;">Log.com"treatsheet) && 14px;sleepntentfiledja:id="cName"worseshots-box-delta
++<bears:48Z spendbakershops= "";php">ction13px;brianhellosize=o=%2F joinmaybe, fjsimg" ")[0]MTopBType"newlyDanskczechtrailknowsfaq">zh-cn10);
++-1");type=bluestrulydavis.js';>
++
++form jesus100% menu.
++
++walesrisksumentddingb-likteachgif" vegasdanskeestishqipsuomisobredesdeentretodospuedeañosestátienehastaotrospartedondenuevohacerformamismomejormundoaquídíassóloayudafechatodastantomenosdatosotrassitiomuchoahoralugarmayorestoshorastenerantesfotosestaspaísnuevasaludforosmedioquienmesespoderchileserávecesdecirjoséestarventagrupohechoellostengoamigocosasnivelgentemismaairesjuliotemashaciafavorjuniolibrepuntobuenoautorabrilbuenatextomarzosaberlistaluegocómoenerojuegoperúhaberestoynuncamujervalorfueralibrogustaigualvotoscasosguíapuedosomosavisousteddebennochebuscafaltaeurosseriedichocursoclavecasasleónplazolargoobrasvistaapoyojuntotratavistocrearcampohemoscincocargopisosordenhacenáreadiscopedrocercapuedapapelmenorútilclarojorgecalleponertardenadiemarcasigueellassiglocochemotosmadreclaserestoniñoquedapasarbancohijosviajepabloéstevienereinodejarfondocanalnorteletracausatomarmanoslunesautosvillavendopesartipostengamarcollevapadreunidovamoszonasambosbandamariaabusomuchasubirriojavivirgradochicaallíjovendichaestantalessalirsuelopesosfinesllamabuscoéstalleganegroplazahumorpagarjuntadobleislasbolsabañohablaluchaÁreadicenjugarnotasvalleallácargadolorabajoestégustomentemariofirmacostofichaplatahogarartesleyesaquelmuseobasespocosmitadcielochicomiedoganarsantoetapadebesplayaredessietecortecoreadudasdeseoviejodeseaaguas"domaincommonstatuseventsmastersystemactionbannerremovescrollupdateglobalmediumfilternumberchangeresultpublicscreenchoosenormaltravelissuessourcetargetspringmodulemobileswitchphotosborderregionitselfsocialactivecolumnrecordfollowtitle>eitherlengthfamilyfriendlayoutauthorcreatereviewsummerserverplayedplayerexpandpolicyformatdoublepointsseriespersonlivingdesignmonthsforcesuniqueweightpeopleenergynaturesearchfigurehavingcustomoffsetletterwindowsubmitrendergroupsuploadhealthmethodvideosschoolfutureshadowdebatevaluesObjectothersrightsleaguechromesimplenoticesharedendingseasonreportonlinesquarebuttonimagesenablemovinglatestwinterFranceperiodstrongrepeatLondondetailformeddemandsecurepassedtoggleplacesdevicestaticcitiesstreamyellowattackstreetflighthiddeninfo">openedusefulvalleycausesleadersecretseconddamagesportsexceptratingsignedthingseffectfieldsstatesofficevisualeditorvolumeReportmuseummoviesparentaccessmostlymother" id="marketgroundchancesurveybeforesymbolmomentspeechmotioninsidematterCenterobjectexistsmiddleEuropegrowthlegacymannerenoughcareeransweroriginportalclientselectrandomclosedtopicscomingfatheroptionsimplyraisedescapechosenchurchdefinereasoncorneroutputmemoryiframepolicemodelsNumberduringoffersstyleskilledlistedcalledsilvermargindeletebetterbrowselimitsGlobalsinglewidgetcenterbudgetnowrapcreditclaimsenginesafetychoicespirit-stylespreadmakingneededrussiapleaseextentScriptbrokenallowschargedividefactormember-basedtheoryconfigaroundworkedhelpedChurchimpactshouldalwayslogo" bottomlist">){var prefixorangeHeader.push(couplegardenbridgelaunchReviewtakingvisionlittledatingButtonbeautythemesforgotSearchanchoralmostloadedChangereturnstringreloadMobileincomesupplySourceordersviewed courseAbout islandPhilipawardshandleimportOfficeregardskillsnationSportsdegreeweekly (e.g.behinddoctorloggedunitedbeyond-scaleacceptservedmarineFootercamera
++_form"leavesstress" />
++.gif" onloadloaderOxfordsistersurvivlistenfemaleDesignsize="appealtext">levelsthankshigherforcedanimalanyoneAfricaagreedrecentPeople
wonderpricesturned|| {};main">inlinesundaywrap">failedcensusminutebeaconquotes150px|estateremoteemail"linkedright;signalformal1.htmlsignupprincefloat:.png" forum.AccesspaperssoundsextendHeightsliderUTF-8"& Before. WithstudioownersmanageprofitjQueryannualparamsboughtfamousgooglelongeri++) {israelsayingdecidehome">headerensurebranchpiecesblock;statedtop">boston.test(avatartested_countforumsschemaindex,filledsharesreaderalert(appearSubmitline">body">
++* TheThoughseeingjerseyNews
++System DavidcancertablesprovedApril reallydriveritem">more">boardscolorscampusfirst || [];media.guitarfinishwidth:showedOther .php" assumelayerswilsonstoresreliefswedenCustomeasily your String
++
++Whiltaylorclear:resortfrenchthough") + "buyingbrandsMembername">oppingsector5px;">vspacepostermajor coffeemartinmaturehappenkansaslink">Images=falsewhile hspace0&
++
++In powerPolski-colorjordanBottomStart -count2.htmlnews">01.jpgOnline-rightmillerseniorISBN 00,000 guidesvalue)ectionrepair.xml" rights.html-blockregExp:hoverwithinvirginphones
using
++ var >');
++
++
++bahasabrasilgalegomagyarpolskisrpskiردو中文简体繁體信息中国我们一个公司管理论坛可以服务时间个人产品自己企业查看工作联系没有网站所有评论中心文章用户首页作者技术问题相关下载搜索使用软件在线主题资料视频回复注册网络收藏内容推荐市场消息空间发布什么好友生活图片发展如果手机新闻最新方式北京提供关于更多这个系统知道游戏广告其他发表安全第一会员进行点击版权电子世界设计免费教育加入活动他们商品博客现在上海如何已经留言详细社区登录本站需要价格支持国际链接国家建设朋友阅读法律位置经济选择这样当前分类排行因为交易最后音乐不能通过行业科技可能设备合作大家社会研究专业全部项目这里还是开始情况电脑文件品牌帮助文化资源大学学习地址浏览投资工程要求怎么时候功能主要目前资讯城市方法电影招聘声明任何健康数据美国汽车介绍但是交流生产所以电话显示一些单位人员分析地图旅游工具学生系列网友帖子密码频道控制地区基本全国网上重要第二喜欢进入友情这些考试发现培训以上政府成为环境香港同时娱乐发送一定开发作品标准欢迎解决地方一下以及责任或者客户代表积分女人数码销售出现离线应用列表不同编辑统计查询不要有关机构很多播放组织政策直接能力来源時間看到热门关键专区非常英语百度希望美女比较知识规定建议部门意见精彩日本提高发言方面基金处理权限影片银行还有分享物品经营添加专家这种话题起来业务公告记录简介质量男人影响引用报告部分快速咨询时尚注意申请学校应该历史只是返回购买名称为了成功说明供应孩子专题程序一般會員只有其它保护而且今天窗口动态状态特别认为必须更新小说我們作为媒体包括那么一样国内是否根据电视学院具有过程由于人才出来不过正在明星故事关系标题商务输入一直基础教学了解建筑结果全球通知计划对于艺术相册发生真的建立等级类型经验实现制作来自标签以下原创无法其中個人一切指南关闭集团第三关注因此照片深圳商业广州日期高级最近综合表示专辑行为交通评价觉得精华家庭完成感觉安装得到邮件制度食品虽然转载报价记者方案行政人民用品东西提出酒店然后付款热点以前完全发帖设置领导工业医院看看经典原因平台各种增加材料新增之后职业效果今年论文我国告诉版主修改参与打印快乐机械观点存在精神获得利用继续你们这么模式语言能够雅虎操作风格一起科学体育短信条件治疗运动产业会议导航先生联盟可是問題结构作用调查資料自动负责农业访问实施接受讨论那个反馈加强女性范围服務休闲今日客服觀看参加的话一点保证图书有效测试移动才能决定股票不断需求不得办法之间采用营销投诉目标爱情摄影有些複製文学机会数字装修购物农村全面精品其实事情水平提示上市谢谢普通教师上传类别歌曲拥有创新配件只要时代資訊达到人生订阅老师展示心理贴子網站主題自然级别简单改革那些来说打开代码删除证券节目重点次數多少规划资金找到以后大全主页最佳回答天下保障现代检查投票小时沒有正常甚至代理目录公开复制金融幸福版本形成准备行情回到思想怎样协议认证最好产生按照服装广东动漫采购新手组图面板参考政治容易天地努力人们升级速度人物调整流行造成文字韩国贸易开展相關表现影视如此美容大小报道条款心情许多法规家居书店连接立即举报技巧奥运登入以来理论事件自由中华办公妈妈真正不错全文合同价值别人监督具体世纪团队创业承担增长有人保持商家维修台湾左右股份答案实际电信经理生命宣传任务正式特色下来协会只能当然重新內容指导运行日志賣家超过土地浙江支付推出站长杭州执行制造之一推广现场描述变化传统歌手保险课程医疗经过过去之前收入年度杂志美丽最高登陆未来加工免责教程版块身体重庆出售成本形式土豆出價东方邮箱南京求职取得职位相信页面分钟网页确定图例网址积极错误目的宝贝机关风险授权病毒宠物除了評論疾病及时求购站点儿童每天中央认识每个天津字体台灣维护本页个性官方常见相机战略应当律师方便校园股市房屋栏目员工导致突然道具本网结合档案劳动另外美元引起改变第四会计說明隐私宝宝规范消费共同忘记体系带来名字發表开放加盟受到二手大量成人数量共享区域女孩原则所在结束通信超级配置当时优秀性感房产遊戲出口提交就业保健程度参数事业整个山东情感特殊分類搜尋属于门户财务声音及其财经坚持干部成立利益考虑成都包装用戶比赛文明招商完整真是眼睛伙伴威望领域卫生优惠論壇公共良好充分符合附件特点不可英文资产根本明显密碼公众民族更加享受同学启动适合原来问答本文美食绿色稳定终于生物供求搜狐力量严重永远写真有限竞争对象费用不好绝对十分促进点评影音优势不少欣赏并且有点方向全新信用设施形象资格突破随着重大于是毕业智能化工完美商城统一出版打造產品概况用于保留因素中國存储贴图最愛长期口价理财基地安排武汉里面创建天空首先完善驱动下面不再诚信意义阳光英国漂亮军事玩家群众农民即可名稱家具动画想到注明小学性能考研硬件观看清楚搞笑首頁黄金适用江苏真实主管阶段註冊翻译权利做好似乎通讯施工狀態也许环保培养概念大型机票理解匿名cuandoenviarmadridbuscariniciotiempoporquecuentaestadopuedenjuegoscontraestánnombretienenperfilmaneraamigosciudadcentroaunquepuedesdentroprimerpreciosegúnbuenosvolverpuntossemanahabíaagostonuevosunidoscarlosequiponiñosmuchosalgunacorreoimagenpartirarribamaríahombreempleoverdadcambiomuchasfueronpasadolíneaparecenuevascursosestabaquierolibroscuantoaccesomiguelvarioscuatrotienesgruposseráneuropamediosfrenteacercademásofertacochesmodeloitalialetrasalgúncompracualesexistecuerposiendoprensallegarviajesdineromurciapodrápuestodiariopuebloquieremanuelpropiocrisisciertoseguromuertefuentecerrargrandeefectopartesmedidapropiaofrecetierrae-mailvariasformasfuturoobjetoseguirriesgonormasmismosúnicocaminositiosrazóndebidopruebatoledoteníajesúsesperococinaorigentiendacientocádizhablarseríalatinafuerzaestiloguerraentraréxitolópezagendavídeoevitarpaginametrosjavierpadresfácilcabezaáreassalidaenvíojapónabusosbienestextosllevarpuedanfuertecomúnclaseshumanotenidobilbaounidadestáseditarcreadoдлячтокакилиэтовсеегопритакещеужеКакбезбылониВсеподЭтотомчемнетлетразонагдемнеДляПринаснихтемктогодвоттамСШАмаяЧтовасвамемуТакдванамэтиэтуВамтехпротутнаддняВоттринейВаснимсамтотрубОнимирнееОООлицэтаОнанемдоммойдвеоносудकेहैकीसेकाकोऔरपरनेएककिभीइसकरतोहोआपहीयहयातकथाjagranआजजोअबदोगईजागएहमइनवहयेथेथीघरजबदीकईजीवेनईनएहरउसमेकमवोलेसबमईदेओरआमबसभरबनचलमनआगसीलीعلىإلىهذاآخرعددالىهذهصورغيركانولابينعرضذلكهنايومقالعليانالكنحتىقبلوحةاخرفقطعبدركنإذاكمااحدإلافيهبعضكيفبحثومنوهوأناجدالهاسلمعندليسعبرصلىمنذبهاأنهمثلكنتالاحيثمصرشرححولوفياذالكلمرةانتالفأبوخاصأنتانهاليعضووقدابنخيربنتلكمشاءوهيابوقصصومارقمأحدنحنعدمرأياحةكتبدونيجبمنهتحتجهةسنةيتمكرةغزةنفسبيتللهلناتلكقلبلماعنهأولشيءنورأمافيكبكلذاترتببأنهمسانكبيعفقدحسنلهمشعرأهلشهرقطرطلبprofileservicedefaulthimselfdetailscontentsupportstartedmessagesuccessfashioncountryaccountcreatedstoriesresultsrunningprocesswritingobjectsvisiblewelcomearticleunknownnetworkcompanydynamicbrowserprivacyproblemServicerespectdisplayrequestreservewebsitehistoryfriendsoptionsworkingversionmillionchannelwindow.addressvisitedweathercorrectproductedirectforwardyou canremovedsubjectcontrolarchivecurrentreadinglibrarylimitedmanagerfurthersummarymachineminutesprivatecontextprogramsocietynumberswrittenenabledtriggersourcesloadingelementpartnerfinallyperfectmeaningsystemskeepingculture",journalprojectsurfaces"expiresreviewsbalanceEnglishContentthroughPlease opinioncontactaverageprimaryvillageSpanishgallerydeclinemeetingmissionpopularqualitymeasuregeneralspeciessessionsectionwriterscounterinitialreportsfiguresmembersholdingdisputeearlierexpressdigitalpictureAnothermarriedtrafficleadingchangedcentralvictoryimages/reasonsstudiesfeaturelistingmust beschoolsVersionusuallyepisodeplayinggrowingobviousoverlaypresentactions
++wrapperalreadycertainrealitystorageanotherdesktopofferedpatternunusualDigitalcapitalWebsitefailureconnectreducedAndroiddecadesregular & animalsreleaseAutomatgettingmethodsnothingPopularcaptionletterscapturesciencelicensechangesEngland=1&History = new CentralupdatedSpecialNetworkrequirecommentwarningCollegetoolbarremainsbecauseelectedDeutschfinanceworkersquicklybetweenexactlysettingdiseaseSocietyweaponsexhibit<!--Controlclassescoveredoutlineattacksdevices(windowpurposetitle="Mobile killingshowingItaliandroppedheavilyeffects-1']);
++confirmCurrentadvancesharingopeningdrawingbillionorderedGermanyrelatedincludewhetherdefinedSciencecatalogArticlebuttonslargestuniformjourneysidebarChicagoholidayGeneralpassage,"animatefeelingarrivedpassingnaturalroughly.
++
++The but notdensityBritainChineselack oftributeIreland" data-factorsreceivethat isLibraryhusbandin factaffairsCharlesradicalbroughtfindinglanding:lang="return leadersplannedpremiumpackageAmericaEdition]"Messageneed tovalue="complexlookingstationbelievesmaller-mobilerecordswant tokind ofFirefoxyou aresimilarstudiedmaximumheadingrapidlyclimatekingdomemergedamountsfoundedpioneerformuladynastyhow to SupportrevenueeconomyResultsbrothersoldierlargelycalling."AccountEdward segmentRobert effortsPacificlearnedup withheight:we haveAngelesnations_searchappliedacquiremassivegranted: falsetreatedbiggestbenefitdrivingStudiesminimumperhapsmorningsellingis usedreversevariant role="missingachievepromotestudentsomeoneextremerestorebottom:evolvedall thesitemapenglishway to AugustsymbolsCompanymattersmusicalagainstserving})();
++paymenttroubleconceptcompareparentsplayersregionsmonitor ''The winningexploreadaptedGalleryproduceabilityenhancecareers). The collectSearch ancientexistedfooter handlerprintedconsoleEasternexportswindowsChannelillegalneutralsuggest_headersigning.html">settledwesterncausing-webkitclaimedJusticechaptervictimsThomas mozillapromisepartieseditionoutside:false,hundredOlympic_buttonauthorsreachedchronicdemandssecondsprotectadoptedprepareneithergreatlygreateroverallimprovecommandspecialsearch.worshipfundingthoughthighestinsteadutilityquarterCulturetestingclearlyexposedBrowserliberal} catchProjectexamplehide();FloridaanswersallowedEmperordefenseseriousfreedomSeveral-buttonFurtherout of != nulltrainedDenmarkvoid(0)/all.jspreventRequestStephen
++
++When observe
++Modern provide" alt="borders.
++
++For
++
++Many artistspoweredperformfictiontype ofmedicalticketsopposedCouncilwitnessjusticeGeorge Belgium...twitternotablywaitingwarfare Other rankingphrasesmentionsurvivescholar
++ Countryignoredloss ofjust asGeorgiastrange
++ severalbecomesselect wedding00.htmlmonarchoff theteacherhighly biologylife ofor evenrise of»plusonehunting(thoughDouglasjoiningcirclesFor theAncientVietnamvehiclesuch ascrystalvalue =Windowsenjoyeda smallassumed