summaryrefslogtreecommitdiff
path: root/libre/iceweasel-libre
diff options
context:
space:
mode:
Diffstat (limited to 'libre/iceweasel-libre')
-rw-r--r--libre/iceweasel-libre/Bug-756390-Make-the-Reset-Firefox-feature-more-gener.patch287
-rw-r--r--libre/iceweasel-libre/Fixup-Reset-Firefox-after-bad-merge.patch108
-rw-r--r--libre/iceweasel-libre/PKGBUILD244
-rw-r--r--libre/iceweasel-libre/gnu_headshadow.pngbin0 -> 6785 bytes
-rw-r--r--libre/iceweasel-libre/iceweasel-20.0.1-fixed-loading-icon.pngbin0 -> 12184 bytes
-rw-r--r--libre/iceweasel-libre/iceweasel-install-dir.patch29
-rw-r--r--libre/iceweasel-libre/iceweasel.desktop105
-rw-r--r--libre/iceweasel-libre/iceweasel.install13
-rw-r--r--libre/iceweasel-libre/libre.patch891
-rw-r--r--libre/iceweasel-libre/mozconfig38
-rw-r--r--libre/iceweasel-libre/mozconfig.pgo3
-rw-r--r--libre/iceweasel-libre/vendor.js22
12 files changed, 1740 insertions, 0 deletions
diff --git a/libre/iceweasel-libre/Bug-756390-Make-the-Reset-Firefox-feature-more-gener.patch b/libre/iceweasel-libre/Bug-756390-Make-the-Reset-Firefox-feature-more-gener.patch
new file mode 100644
index 000000000..82ba01a9c
--- /dev/null
+++ b/libre/iceweasel-libre/Bug-756390-Make-the-Reset-Firefox-feature-more-gener.patch
@@ -0,0 +1,287 @@
+From: Mike Hommey <mh@glandium.org>
+Date: Tue, 5 Jun 2012 08:57:06 +0200
+Subject: Bug 756390 - Make the "Reset Firefox" feature more generic
+
+diff --git a/browser/components/migration/content/migration.js b/browser/components/migration/content/migration.js
+index 91c5c1c..2f8bd1a 100644
+--- a/browser/components/migration/content/migration.js
++++ b/browser/components/migration/content/migration.js
+@@ -249,7 +249,7 @@ var MigrationWizard = {
+ }
+
+ var brandBundle = document.getElementById("brandBundle");
+- // These strings don't exist when not using official branding. If that's
++ // These strings may not exist when not using official branding. If that's
+ // the case, just skip this page.
+ try {
+ var pageTitle = brandBundle.getString("homePageMigrationPageTitle");
+@@ -281,8 +281,8 @@ var MigrationWizard = {
+ case "chrome":
+ source = "sourceNameChrome";
+ break;
+- case "firefox":
+- source = "sourceNameFirefox";
++ case "self":
++ source = "brand";
+ break;
+ }
+
+@@ -292,7 +292,12 @@ var MigrationWizard = {
+ var oldHomePageURL = this._migrator.sourceHomePageURL;
+
+ if (oldHomePageURL && source) {
+- var appName = MigrationUtils.getLocalizedString(source);
++ var appName;
++ if (source == "brand") {
++ appName = brandBundle.GetStringFromName("brandFullName");
++ } else {
++ appName = MigrationUtils.getLocalizedString(source);
++ }
+ var oldHomePageLabel =
+ brandBundle.getFormattedString("homePageImport", [appName]);
+ var oldHomePage = document.getElementById("oldHomePage");
+diff --git a/browser/components/migration/content/migration.xul b/browser/components/migration/content/migration.xul
+index f030756..23e37ff 100644
+--- a/browser/components/migration/content/migration.xul
++++ b/browser/components/migration/content/migration.xul
+@@ -42,7 +42,7 @@
+ #elifdef XP_UNIX
+ <radio id="chrome" label="&importFromChrome.label;" accesskey="&importFromChrome.accesskey;"/>
+ #endif
+- <radio id="firefox" label="&importFromFirefox.label;" accesskey="&importFromFirefox.accesskey;"/>
++ <radio id="self" hidden="true"/>
+ <radio id="nothing" label="&importFromNothing.label;" accesskey="&importFromNothing.accesskey;" hidden="true"/>
+ </radiogroup>
+ <label id="noSources" hidden="true">&noMigrationSources.label;</label>
+diff --git a/browser/components/migration/src/BrowserProfileMigrators.manifest b/browser/components/migration/src/BrowserProfileMigrators.manifest
+index d7fec75..d531b83 100644
+--- a/browser/components/migration/src/BrowserProfileMigrators.manifest
++++ b/browser/components/migration/src/BrowserProfileMigrators.manifest
+@@ -3,7 +3,7 @@ contract @mozilla.org/toolkit/profile-migrator;1 {6F8BB968-C14F-4D6F-9733-6C6737
+ component {4cec1de4-1671-4fc3-a53e-6c539dc77a26} ChromeProfileMigrator.js
+ contract @mozilla.org/profile/migrator;1?app=browser&type=chrome {4cec1de4-1671-4fc3-a53e-6c539dc77a26}
+ component {91185366-ba97-4438-acba-48deaca63386} FirefoxProfileMigrator.js
+-contract @mozilla.org/profile/migrator;1?app=browser&type=firefox {91185366-ba97-4438-acba-48deaca63386}
++contract @mozilla.org/profile/migrator;1?app=browser&type=self {91185366-ba97-4438-acba-48deaca63386}
+ #ifdef HAS_IE_MIGRATOR
+ component {3d2532e3-4932-4774-b7ba-968f5899d3a4} IEProfileMigrator.js
+ contract @mozilla.org/profile/migrator;1?app=browser&type=ie {3d2532e3-4932-4774-b7ba-968f5899d3a4}
+diff --git a/browser/components/migration/src/FirefoxProfileMigrator.js b/browser/components/migration/src/FirefoxProfileMigrator.js
+index 3db6720..a3b3dda 100644
+--- a/browser/components/migration/src/FirefoxProfileMigrator.js
++++ b/browser/components/migration/src/FirefoxProfileMigrator.js
+@@ -128,7 +128,7 @@ Object.defineProperty(FirefoxProfileMigrator.prototype, "startupOnlyMigrator", {
+
+
+ FirefoxProfileMigrator.prototype.classDescription = "Firefox Profile Migrator";
+-FirefoxProfileMigrator.prototype.contractID = "@mozilla.org/profile/migrator;1?app=browser&type=firefox";
++FirefoxProfileMigrator.prototype.contractID = "@mozilla.org/profile/migrator;1?app=browser&type=self";
+ FirefoxProfileMigrator.prototype.classID = Components.ID("{91185366-ba97-4438-acba-48deaca63386}");
+
+ this.NSGetFactory = XPCOMUtils.generateNSGetFactory([FirefoxProfileMigrator]);
+diff --git a/browser/components/migration/src/MigrationUtils.jsm b/browser/components/migration/src/MigrationUtils.jsm
+index 2c91e9a..08962c4 100644
+--- a/browser/components/migration/src/MigrationUtils.jsm
++++ b/browser/components/migration/src/MigrationUtils.jsm
+@@ -405,12 +405,6 @@ this.MigrationUtils = Object.freeze({
+ * @see nsIStringBundle
+ */
+ getLocalizedString: function MU_getLocalizedString(aKey, aReplacements) {
+- const OVERRIDES = {
+- "4_firefox": "4_firefox_history_and_bookmarks",
+- "64_firefox": "64_firefox_other"
+- };
+- aKey = OVERRIDES[aKey] || aKey;
+-
+ if (aReplacements === undefined)
+ return getMigrationBundle().GetStringFromName(aKey);
+ return getMigrationBundle().formatStringFromName(
+@@ -625,6 +619,17 @@ this.MigrationUtils = Object.freeze({
+ },
+
+ /**
++ * Returns whether a given migration type is supported.
++ *
++ * @param aKey Migrator key
++ * @returns whether the migrator key is supported.
++ */
++ canMigrate:
++ function MU_canMigrate(aMigratorKey) {
++ return "@mozilla.org/profile/migrator;1?app=browser&type=" + aMigratorKey in Cc;
++ },
++
++ /**
+ * Cleans up references to migrators and nsIProfileInstance instances.
+ */
+ finishMigration: function MU_finishMigration() {
+diff --git a/browser/components/migration/src/ProfileMigrator.js b/browser/components/migration/src/ProfileMigrator.js
+index f67823b..36016b8 100644
+--- a/browser/components/migration/src/ProfileMigrator.js
++++ b/browser/components/migration/src/ProfileMigrator.js
+@@ -12,6 +12,7 @@ function ProfileMigrator() {
+
+ ProfileMigrator.prototype = {
+ migrate: MigrationUtils.startupMigration.bind(MigrationUtils),
++ canMigrate: MigrationUtils.canMigrate.bind(MigrationUtils),
+ QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIProfileMigrator]),
+ classDescription: "Profile Migrator",
+ contractID: "@mozilla.org/toolkit/profile-migrator;1",
+diff --git a/browser/locales/en-US/chrome/browser/migration/migration.dtd b/browser/locales/en-US/chrome/browser/migration/migration.dtd
+index 21cf405..f3c1a6b 100644
+--- a/browser/locales/en-US/chrome/browser/migration/migration.dtd
++++ b/browser/locales/en-US/chrome/browser/migration/migration.dtd
+@@ -17,8 +17,6 @@
+ <!ENTITY importFromSafari.accesskey "S">
+ <!ENTITY importFromChrome.label "Chrome">
+ <!ENTITY importFromChrome.accesskey "C">
+-<!ENTITY importFromFirefox.label "Firefox">
+-<!ENTITY importFromFirefox.accesskey "X">
+
+ <!ENTITY noMigrationSources.label "No programs that contain bookmarks, history or password data could be found.">
+
+diff --git a/browser/locales/en-US/chrome/browser/migration/migration.properties b/browser/locales/en-US/chrome/browser/migration/migration.properties
+index 094a9dc..a620905 100644
+--- a/browser/locales/en-US/chrome/browser/migration/migration.properties
++++ b/browser/locales/en-US/chrome/browser/migration/migration.properties
+@@ -24,30 +24,30 @@ importedSafariReadingList=Reading List (From Safari)
+ 2_ie=Cookies
+ 2_safari=Cookies
+ 2_chrome=Cookies
+-2_firefox=Cookies
++2_self=Cookies
+
+ 4_ie=Browsing History
+ 4_safari=Browsing History
+ 4_chrome=Browsing History
+-4_firefox_history_and_bookmarks=Browsing History and Bookmarks
++4_self=Browsing History and Bookmarks
+
+ 8_ie=Saved Form History
+ 8_safari=Saved Form History
+ 8_chrome=Saved Form History
+-8_firefox=Saved Form History
++8_self=Saved Form History
+
+ 16_ie=Saved Passwords
+ 16_safari=Saved Passwords
+ 16_chrome=Saved Passwords
+-16_firefox=Saved Passwords
++16_self=Saved Passwords
+
+-32_ie=Favorites
++32_ie=Favourites
+ 32_safari=Bookmarks
+ 32_chrome=Bookmarks
+
+ 64_ie=Other Data
+ 64_safari=Other Data
+ 64_chrome=Other Data
+-64_firefox_other=Other Data
++64_self=Other Data
+
+-128_firefox=Windows and Tabs
++128_self=Windows and Tabs
+diff --git a/toolkit/content/resetProfile.js b/toolkit/content/resetProfile.js
+index d46b43b..2253994 100644
+--- a/toolkit/content/resetProfile.js
++++ b/toolkit/content/resetProfile.js
+@@ -28,6 +28,58 @@ function onResetProfileLoad() {
+ populateResetPane("migratedItems");
+ }
+
++<<<<<<< HEAD
++=======
++/**
++ * Check if reset is supported for the currently running profile.
++ *
++ * @return boolean whether reset is supported.
++ */
++function resetSupported() {
++ let profileService = Cc["@mozilla.org/toolkit/profile-service;1"].
++ getService(Ci.nsIToolkitProfileService);
++ let currentProfileDir = Services.dirsvc.get("ProfD", Ci.nsIFile);
++
++ // Reset is only supported for the default profile if the self-migrator used for reset exists.
++ try {
++ if (currentProfileDir.equals(profileService.selectedProfile.rootDir) &&
++ "@mozilla.org/toolkit/profile-migrator;1" in Cc) {
++ let pm = Cc["@mozilla.org/toolkit/profile-migrator;1"].createInstance(Ci.nsIProfileMigrator);
++ return ("canMigrate" in pm) && pm.canMigrate("self");
++ }
++ } catch (e) {
++ // Catch exception when there is no selected profile.
++ Cu.reportError(e);
++ }
++ return false;
++}
++
++function getMigratedData() {
++ Components.utils.import("resource:///modules/MigrationUtils.jsm");
++
++ // From migration.properties
++ const MIGRATED_TYPES = [
++ 4, // History and Bookmarks
++ 16, // Passwords
++ 8, // Form History
++ 2, // Cookies
++ ];
++
++ // Loop over possible data to migrate to give the user a list of what will be preserved.
++ let dataTypes = [];
++ for (let itemID of MIGRATED_TYPES) {
++ try {
++ let typeName = MigrationUtils.getLocalizedString(itemID + "_self");
++ dataTypes.push(typeName);
++ } catch (x) {
++ // Catch exceptions when the string for a data type doesn't exist.
++ Components.utils.reportError(x);
++ }
++ }
++ return dataTypes;
++}
++
++>>>>>>> Bug 756390 - Make the "Reset Firefox" feature more generic
+ function onResetProfileAccepted() {
+ let retVals = window.arguments[0];
+ retVals.reset = true;
+diff --git a/toolkit/profile/nsIProfileMigrator.idl b/toolkit/profile/nsIProfileMigrator.idl
+index f35c227..7062886 100644
+--- a/toolkit/profile/nsIProfileMigrator.idl
++++ b/toolkit/profile/nsIProfileMigrator.idl
+@@ -37,7 +37,7 @@ interface nsIProfileStartup : nsISupports
+ * @client Toolkit (Startup code)
+ * @obtainable service, contractid("@mozilla.org/toolkit/profile-migrator;1")
+ */
+-[scriptable, uuid(3df284a5-2258-4d46-a664-761ecdc04c22)]
++[scriptable, uuid(96d9ab66-082c-4a9e-82ad-f8c21b391342)]
+ interface nsIProfileMigrator : nsISupports
+ {
+ /**
+@@ -60,6 +60,14 @@ interface nsIProfileMigrator : nsISupports
+ * @note The startup code ignores COM exceptions thrown from this method.
+ */
+ void migrate(in nsIProfileStartup aStartup, in ACString aKey);
++
++ /**
++ * Returns whether a given migration type is supported.
++ *
++ * @param aKey Migrator key
++ * @returns whether the migrator key is supported.
++ */
++ bool canMigrate(in ACString aKey);
+ };
+
+ %{C++
+diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp
+index 20a3d6e..87e351d 100644
+--- a/toolkit/xre/nsAppRunner.cpp
++++ b/toolkit/xre/nsAppRunner.cpp
+@@ -3843,7 +3843,7 @@ XREMain::XRE_mainRun()
+ if (gDoProfileReset) {
+ // Automatically migrate from the current application if we just
+ // reset the profile.
+- aKey = MOZ_APP_NAME;
++ aKey = "self";
+ }
+ pm->Migrate(&mDirProvider, aKey);
+ }
diff --git a/libre/iceweasel-libre/Fixup-Reset-Firefox-after-bad-merge.patch b/libre/iceweasel-libre/Fixup-Reset-Firefox-after-bad-merge.patch
new file mode 100644
index 000000000..c7c4c355b
--- /dev/null
+++ b/libre/iceweasel-libre/Fixup-Reset-Firefox-after-bad-merge.patch
@@ -0,0 +1,108 @@
+From: Mike Hommey <mh@glandium.org>
+Date: Sat, 16 Nov 2013 13:01:17 +0900
+Subject: Fixup "Reset Firefox" after bad merge
+
+---
+ toolkit/content/resetProfile.js | 52 ----------------------------------------
+ toolkit/modules/ResetProfile.jsm | 11 +++++----
+ 2 files changed, 6 insertions(+), 57 deletions(-)
+
+diff --git a/toolkit/content/resetProfile.js b/toolkit/content/resetProfile.js
+index 2253994..d46b43b 100644
+--- a/toolkit/content/resetProfile.js
++++ b/toolkit/content/resetProfile.js
+@@ -28,58 +28,6 @@ function onResetProfileLoad() {
+ populateResetPane("migratedItems");
+ }
+
+-<<<<<<< HEAD
+-=======
+-/**
+- * Check if reset is supported for the currently running profile.
+- *
+- * @return boolean whether reset is supported.
+- */
+-function resetSupported() {
+- let profileService = Cc["@mozilla.org/toolkit/profile-service;1"].
+- getService(Ci.nsIToolkitProfileService);
+- let currentProfileDir = Services.dirsvc.get("ProfD", Ci.nsIFile);
+-
+- // Reset is only supported for the default profile if the self-migrator used for reset exists.
+- try {
+- if (currentProfileDir.equals(profileService.selectedProfile.rootDir) &&
+- "@mozilla.org/toolkit/profile-migrator;1" in Cc) {
+- let pm = Cc["@mozilla.org/toolkit/profile-migrator;1"].createInstance(Ci.nsIProfileMigrator);
+- return ("canMigrate" in pm) && pm.canMigrate("self");
+- }
+- } catch (e) {
+- // Catch exception when there is no selected profile.
+- Cu.reportError(e);
+- }
+- return false;
+-}
+-
+-function getMigratedData() {
+- Components.utils.import("resource:///modules/MigrationUtils.jsm");
+-
+- // From migration.properties
+- const MIGRATED_TYPES = [
+- 4, // History and Bookmarks
+- 16, // Passwords
+- 8, // Form History
+- 2, // Cookies
+- ];
+-
+- // Loop over possible data to migrate to give the user a list of what will be preserved.
+- let dataTypes = [];
+- for (let itemID of MIGRATED_TYPES) {
+- try {
+- let typeName = MigrationUtils.getLocalizedString(itemID + "_self");
+- dataTypes.push(typeName);
+- } catch (x) {
+- // Catch exceptions when the string for a data type doesn't exist.
+- Components.utils.reportError(x);
+- }
+- }
+- return dataTypes;
+-}
+-
+->>>>>>> Bug 756390 - Make the "Reset Firefox" feature more generic
+ function onResetProfileAccepted() {
+ let retVals = window.arguments[0];
+ retVals.reset = true;
+diff --git a/toolkit/modules/ResetProfile.jsm b/toolkit/modules/ResetProfile.jsm
+index db57f2a..d618d08 100644
+--- a/toolkit/modules/ResetProfile.jsm
++++ b/toolkit/modules/ResetProfile.jsm
+@@ -7,8 +7,6 @@
+ this.EXPORTED_SYMBOLS = ["ResetProfile"];
+
+ const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
+-#expand const MOZ_APP_NAME = "__MOZ_APP_NAME__";
+-#expand const MOZ_BUILD_APP = "__MOZ_BUILD_APP__";
+
+ Cu.import("resource://gre/modules/Services.jsm");
+
+@@ -25,8 +23,11 @@ this.ResetProfile = {
+
+ // Reset is only supported for the default profile if the self-migrator used for reset exists.
+ try {
+- return currentProfileDir.equals(profileService.selectedProfile.rootDir) &&
+- ("@mozilla.org/profile/migrator;1?app=" + MOZ_BUILD_APP + "&type=" + MOZ_APP_NAME in Cc);
++ if (currentProfileDir.equals(profileService.selectedProfile.rootDir) &&
++ "@mozilla.org/toolkit/profile-migrator;1" in Cc) {
++ let pm = Cc["@mozilla.org/toolkit/profile-migrator;1"].createInstance(Ci.nsIProfileMigrator);
++ return ("canMigrate" in pm) && pm.canMigrate("self");
++ }
+ } catch (e) {
+ // Catch exception when there is no selected profile.
+ Cu.reportError(e);
+@@ -50,7 +51,7 @@ this.ResetProfile = {
+ let dataTypes = [];
+ for (let itemID of MIGRATED_TYPES) {
+ try {
+- let typeName = MigrationUtils.getLocalizedString(itemID + "_" + MOZ_APP_NAME);
++ let typeName = MigrationUtils.getLocalizedString(itemID + "_self");
+ dataTypes.push(typeName);
+ } catch (x) {
+ // Catch exceptions when the string for a data type doesn't exist.
diff --git a/libre/iceweasel-libre/PKGBUILD b/libre/iceweasel-libre/PKGBUILD
new file mode 100644
index 000000000..5c6313e9e
--- /dev/null
+++ b/libre/iceweasel-libre/PKGBUILD
@@ -0,0 +1,244 @@
+# Maintainer (Parabola): André Silva <emulatorman@parabola.nu>
+# Contributor (Parabola): Márcio Silva <coadde@parabola.nu>
+# Contributor (ConnochaetOS): Henry Jensen <hjensen@connochaetos.org>
+# Contributor (Parabola): Luke Shumaker <lukeshu@sbcglobal.net>
+# Contributor (Parabola): fauno <fauno@kiwwwi.com.ar>
+# Contributor (Parabola): vando <facundo@esdebian.org>
+# Contributor (Arch): Jakub Schmidtke <sjakub@gmail.com>
+# Contributor: Figue <ffigue at gmail>
+# Thank you very much to the older contributors:
+# Contributor: evr <evanroman at gmail>
+# Contributor: Muhammad 'MJ' Jassim <UnbreakableMJ@gmail.com>
+
+_pgo=true
+
+# We're getting this from Debian Experimental
+_debname=iceweasel
+_debver=27.0
+_debrel=deb2
+_debrepo=http://ftp.debian.org/debian/pool/main/
+debfile() { echo $@|sed -r 's@(.).*@\1/&/&@'; }
+
+_pkgname=iceweasel
+pkgname=iceweasel-libre
+epoch=1
+pkgver=$_debver.$_debrel
+pkgrel=1
+
+pkgdesc="A libre version of Debian Iceweasel, the standalone web browser based on Mozilla Firefox."
+arch=(i686 x86_64 mips64el)
+license=(MPL GPL LGPL)
+depends=(alsa-lib dbus-glib desktop-file-utils gtk2 hicolor-icon-theme hunspell libevent libnotify libvpx libxt mime-types mozilla-common mozilla-searchplugins nss sqlite startup-notification)
+makedepends=(autoconf2.13 diffutils gstreamer0.10-base imagemagick imake inetutils libidl2 libpulse librsvg libxslt mesa pkg-config python2 quilt unzip zip)
+[ "$CARCH" != "mips64el" ] && makedepends+=('yasm')
+options=(!emptydirs !makeflags)
+if $_pgo; then
+ makedepends+=(xorg-server-xvfb)
+ options+=(!ccache)
+fi
+optdepends=('networkmanager: Location detection via available WiFi networks'
+ 'gstreamer0.10-base-plugins: vorbis decoding, ogg demuxing'
+ 'gstreamer0.10-good-plugins: webm and mp4 demuxing'
+ 'gstreamer0.10-bad-plugins: aac, vp8 and opus decoding'
+ 'gstreamer0.10-ugly-plugins: h.264 and mp3 decoding'
+ 'gstreamer0.10-ffmpeg: more decoders'
+ 'libpulse: PulseAudio audio driver')
+url="http://packages.debian.org/experimental/${_pkgname}"
+install=iceweasel.install
+replaces=('firefox')
+conflicts=('firefox')
+provides=('firefox')
+source=("$_debrepo/`debfile $_debname`_$_debver.orig.tar.bz2"
+ "$_debrepo/`debfile $_debname`_$_debver-${_debrel#deb}.debian.tar.xz"
+ mozconfig
+ mozconfig.pgo
+ libre.patch
+ gnu_headshadow.png
+ iceweasel.desktop
+ iceweasel-install-dir.patch
+ vendor.js
+ iceweasel-20.0.1-fixed-loading-icon.png
+ Bug-756390-Make-the-Reset-Firefox-feature-more-gener.patch
+ Fixup-Reset-Firefox-after-bad-merge.patch)
+md5sums=('0baf0b166421f785db79bd33fe7b0748'
+ '2446de5f7844caae8cd7e46b3b72119c'
+ '023120a970670dc85cea19393f0b94b6'
+ 'df08eaa1ac3bc6c2356be4fbf8ec8932'
+ '641e8b54a684161c60209b81f260a19b'
+ 'b03a979a78484503ba8dddad4f2c96d1'
+ '7b9e5996dd9fe0b186a43a297db1c6b5'
+ '6620e724ec9a1be74e65089d81d802f7'
+ '816013881cfc9a1f4f0ede72b014f8b3'
+ '6e335a517c68488941340ee1c23f97b0'
+ '3dcb1f1eccce5b6b90fa48ab94bf7a47'
+ '8e165ef85ddd72491f0b48f8954afca6')
+
+prepare() {
+ export DEBIAN_BUILD="mozilla-release"
+
+ export QUILT_PATCHES=debian/patches
+ export QUILT_REFRESH_ARGS='-p ab --no-timestamps --no-index'
+ export QUILT_DIFF_ARGS='--no-timestamps'
+
+ mv debian "$srcdir/$DEBIAN_BUILD"
+ cd "$srcdir/$DEBIAN_BUILD"
+
+ # Doesn't apply and seems unimportant
+ rm -v debian/patches/l10n/Place-google-and-gmail-before-yandex.patch || true
+
+ # Doesn't works in some parts due it has patches for others locales languages, source code hasn't it
+ rm -v debian/patches/debian-hacks/Bug-756390-Make-the-Reset-Firefox-feature-more-gener.patch || true
+
+ # It needs to be patched after Bug-756390-Make-the-Reset-Firefox-feature-more-gener.patch
+ rm -v debian/patches/debian-hacks/Fixup-Reset-Firefox-after-bad-merge.patch || true
+
+ quilt push -av
+
+ install -m644 "$srcdir/gnu_headshadow.png" browser/base/content/abouthome # Put gnu_headshadow.png on the source code
+
+ patch -Np1 -i "$srcdir/Bug-756390-Make-the-Reset-Firefox-feature-more-gener.patch" # Adding fixed Bug-756390-Make-the-Reset-Firefox-feature-more-gener.patch
+ patch -Np1 -i "$srcdir/Fixup-Reset-Firefox-after-bad-merge.patch"
+ patch -Np1 -i "$srcdir/iceweasel-install-dir.patch" # install to /usr/lib/$_pkgname
+
+ # Patch and remove anything that's left
+ patch -Np1 -i "$srcdir/libre.patch"
+ sed -i 's|Adobe Flash|SWF Player|g;
+ ' browser/base/content/pageinfo/permissions.js \
+ browser/base/content/browser-plugins.js
+ sed -i '\|URL of the GeoLocation backend|d;
+ \|geo[.]wifi[.]uri|d;
+ ' browser/app/profile/firefox.js \
+ browser/metro/profile/metro.js
+ rm -v browser/base/content/abouthome/snippet*.png || true
+ sed -i "\|abouthome/snippet|d" browser/base/jar.mn
+
+ # Replace common URLs
+ sed -i '\|extensions[.]getAddons[.]get[.]url| s|https://services[.]addons[.]mozilla[.]org.\+["][)][;]|http://directory.fsf.org/wiki/GNU_IceCat");|g;
+ \|extensions[.]getAddons[.]search[.]browseURL| s|https://addons[.]mozilla[.]org.\+["][)][;]|http://directory.fsf.org/wiki/GNU_IceCat");|g;
+ \|extensions[.]getAddons[.]search[.]url| s|https://services[.]addons[.]mozilla[.]org.\+["][)][;]|http://directory.fsf.org/wiki/GNU_IceCat");|g;
+ \|extensions[.]webservice[.]discoverURL| s|https://services[.]addons[.]mozilla[.]org.\+["][)][;]|http://directory.fsf.org/wiki/GNU_IceCat");|g;
+ \|browser[.]search[.]searchEnginesURL| s|https://addons[.]mozilla[.]org.\+["][)][;]|http://directory.fsf.org/wiki/GNU_IceCat");|g;
+ ' browser/app/profile/firefox.js
+
+ cp "$srcdir/mozconfig" .mozconfig # Load our build config, disable SafeSearch
+
+ if $_pgo; then
+ cat "$srcdir/mozconfig.pgo" >> .mozconfig
+ fi
+
+ # From js on abslibre-mips64el.git
+ if [ "$CARCH" = "mips64el" ]; then
+ msg "Force disabling JIT."
+ sed -ri 's/#define ENABLE_(JIT|ASSEMBLER) 1/#define ENABLE_\1 0/' \
+ js/src/assembler/wtf/Platform.h
+ sed -ri 's/ENABLE_(JIT|ASSEMBLER)=1/ENABLE_\1=0/' js/src/Makefile.{in,ref}
+
+ echo "ac_add_options --disable-methodjit" >> .mozconfig
+ echo "ac_add_options --disable-tracejit" >> .mozconfig
+ fi
+
+ # This is a bug, we should fix it
+ if [ "$CARCH" = "mips64el" ]; then
+ # Fix MIPS N32 support.
+ sed -i 's/defined(_ABIO32)/(defined(_ABIO32) || defined(_ABIN32))/' \
+ js/src/assembler/wtf/Platform.h
+ # Disable JIT.
+ sed -ri 's/#define ENABLE_(JIT|ASSEMBLER) 1/#define ENABLE_\1 0/' \
+ js/src/assembler/wtf/Platform.h
+ sed -ri 's/ENABLE_(JIT|ASSEMBLER)=1/ENABLE_\1=0/' js/src/Makefile.in
+ echo 'ac_add_options --disable-methodjit' >> .mozconfig
+ echo 'ac_add_options --disable-tracejit' >> .mozconfig
+ echo 'ac_add_options --disable-jemalloc' >> .mozconfig
+ fi
+
+ # Fix PRE_RELEASE_SUFFIX
+ sed -i '/^PRE_RELEASE_SUFFIX := ""/s/ ""//' \
+ browser/base/Makefile.in
+
+ mkdir "$srcdir/path"
+
+ # WebRTC build tries to execute "python" and expects Python 2
+ ln -s /usr/bin/python2 "$srcdir/path/python"
+
+ # Use gold, as Mozilla can use some of its features, such as safe ICF
+ #ln -s /usr/bin/ld.gold "$srcdir/path/ld"
+
+ # configure script misdetects the preprocessor without an optimization level
+ # https://bugs.archlinux.org/task/34644
+ sed -i '/ac_cpp=/s/$CPPFLAGS/& -O2/' configure
+
+ # Fix tab loading icon (flickers with libpng 1.6)
+ # https://bugzilla.mozilla.org/show_bug.cgi?id=841734
+ cp "$srcdir/iceweasel-20.0.1-fixed-loading-icon.png" \
+ browser/themes/linux/tabbrowser/loading.png
+
+ # Remove non-existent file on Makefile.in
+ sed -i '\|build/pgo/blueprint/valid.png|d' build/Makefile.in
+
+}
+
+build() {
+ export DEBIAN_BUILD="mozilla-release"
+
+ cd "$srcdir/$DEBIAN_BUILD"
+
+ export PATH="$srcdir/path:$PATH"
+ export LDFLAGS="$LDFLAGS -Wl,-rpath,/usr/lib/$_pkgname"
+ export PYTHON="/usr/bin/python2"
+
+ if [[ $CARCH == i686 ]]; then
+ # Work around memory address space exhaustion during linking on i686
+ LDFLAGS+=' -Wl,--no-keep-memory'
+ fi
+
+ if $_pgo; then
+ # Set up PGO
+ export DISPLAY=:99
+ Xvfb -nolisten tcp -extension GLX -screen 0 1280x1024x24 $DISPLAY &
+
+ if ! make -f client.mk build MOZ_PGO=1; then
+ kill $!
+ return 1
+ fi
+
+ kill $! || true
+ else
+ make -f client.mk build
+ fi
+}
+
+package() {
+ export DEBIAN_BUILD="mozilla-release"
+
+ cd "$srcdir/$DEBIAN_BUILD"
+ make -f client.mk DESTDIR="$pkgdir" install
+
+ install -Dm644 ../vendor.js "$pkgdir/usr/lib/$_pkgname/browser/defaults/preferences/vendor.js"
+
+ # I don't even know why we're hitting the objdir, and ConnOS didn't
+ _brandingdir=debian/branding
+ brandingdir=moz-objdir/$_brandingdir
+ icondir="$pkgdir/usr/share/icons/hicolor"
+ for i in 16x16 32x32 48x48 64x64; do
+ install -Dm644 "$brandingdir/default${i/x*/}.png" "$icondir/$i/apps/$_pkgname.png"
+ done
+ install -Dm644 "$brandingdir/mozicon128.png" "$icondir/128x128/apps/$_pkgname.png"
+ install -Dm644 "$_brandingdir/iceweasel_icon.svg" "$icondir/scalable/apps/$_pkgname.svg"
+
+ install -d "$pkgdir/usr/share/applications"
+ install -m644 "$srcdir/iceweasel.desktop" "$pkgdir/usr/share/applications"
+
+ rm -rf "$pkgdir/usr/lib/$_pkgname/"{dictionaries,hyphenation}
+ ln -sf /usr/share/hunspell "$pkgdir/usr/lib/$_pkgname/dictionaries"
+ ln -sf /usr/share/hyphen "$pkgdir/usr/lib/$_pkgname/hyphenation"
+
+ rm -rf "$pkgdir/usr/lib/$_pkgname/browser/"{searchplugins,plugins}
+ ln -sf /usr/lib/mozilla/plugins "$pkgdir/usr/lib/$_pkgname/browser/plugins"
+ ln -sf /usr/lib/mozilla/searchplugins "$pkgdir/usr/lib/$_pkgname/browser/searchplugins"
+
+ # We don't want the development stuff
+ rm -rf "$pkgdir"/usr/{include,lib/$_pkgname-devel,share/idl}
+
+ # Workaround for now: https://bugzilla.mozilla.org/show_bug.cgi?id=658850
+ ln -sf $_pkgname "$pkgdir/usr/lib/$_pkgname/$_pkgname-bin"
+}
diff --git a/libre/iceweasel-libre/gnu_headshadow.png b/libre/iceweasel-libre/gnu_headshadow.png
new file mode 100644
index 000000000..e0f73a3bf
--- /dev/null
+++ b/libre/iceweasel-libre/gnu_headshadow.png
Binary files differ
diff --git a/libre/iceweasel-libre/iceweasel-20.0.1-fixed-loading-icon.png b/libre/iceweasel-libre/iceweasel-20.0.1-fixed-loading-icon.png
new file mode 100644
index 000000000..55f25e591
--- /dev/null
+++ b/libre/iceweasel-libre/iceweasel-20.0.1-fixed-loading-icon.png
Binary files differ
diff --git a/libre/iceweasel-libre/iceweasel-install-dir.patch b/libre/iceweasel-libre/iceweasel-install-dir.patch
new file mode 100644
index 000000000..3938c0b3e
--- /dev/null
+++ b/libre/iceweasel-libre/iceweasel-install-dir.patch
@@ -0,0 +1,29 @@
+diff --git a/config/baseconfig.mk b/config/baseconfig.mk
+index 9c70e24..eff0fd2 100644
+--- a/config/baseconfig.mk
++++ b/config/baseconfig.mk
+@@ -1,8 +1,8 @@
+ MOZ_APP_BASE_VERSION = $(firstword $(subst ., ,$(MOZ_APP_VERSION))).$(word 2,$(subst ., ,$(MOZ_APP_VERSION)))
+-includedir := $(includedir)/$(MOZ_APP_NAME)-$(MOZ_APP_BASE_VERSION)
+-idldir = $(datadir)/idl/$(MOZ_APP_NAME)-$(MOZ_APP_BASE_VERSION)
+-installdir = $(libdir)/$(MOZ_APP_NAME)-$(MOZ_APP_BASE_VERSION)
+-sdkdir = $(libdir)/$(MOZ_APP_NAME)-devel-$(MOZ_APP_BASE_VERSION)
++includedir := $(includedir)/$(MOZ_APP_NAME)
++idldir = $(datadir)/idl/$(MOZ_APP_NAME)
++installdir = $(libdir)/$(MOZ_APP_NAME)
++sdkdir = $(libdir)/$(MOZ_APP_NAME)-devel
+ DIST = $(DEPTH)/dist
+
+ # We do magic with OBJ_SUFFIX in config.mk, the following ensures we don't
+diff --git a/js/src/config/baseconfig.mk b/js/src/config/baseconfig.mk
+index 1ff076c..5386569 100644
+--- a/js/src/config/baseconfig.mk
++++ b/js/src/config/baseconfig.mk
+@@ -1,5 +1,5 @@
+-installdir = $(libdir)/$(MOZ_APP_NAME)-$(MOZ_APP_VERSION)
+-sdkdir = $(libdir)/$(MOZ_APP_NAME)-devel-$(MOZ_APP_VERSION)
++installdir = $(libdir)/$(MOZ_APP_NAME)
++sdkdir = $(libdir)/$(MOZ_APP_NAME)-devel
+
+ ifneq (,$(filter /%,$(TOP_DIST)))
+ DIST = $(TOP_DIST)
diff --git a/libre/iceweasel-libre/iceweasel.desktop b/libre/iceweasel-libre/iceweasel.desktop
new file mode 100644
index 000000000..c4a338cc6
--- /dev/null
+++ b/libre/iceweasel-libre/iceweasel.desktop
@@ -0,0 +1,105 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=Iceweasel
+Name[bg]=Iceweasel
+Name[ca]=Iceweasel
+Name[cs]=Iceweasel
+Name[el]=Iceweasel
+Name[es]=Iceweasel
+Name[fa]=Iceweasel
+Name[fi]=Iceweasel
+Name[fr]=Iceweasel
+Name[hu]=Iceweasel
+Name[it]=Iceweasel
+Name[ja]=Iceweasel
+Name[ko]=Iceweasel
+Name[nb]=Iceweasel
+Name[nl]=Iceweasel
+Name[nn]=Iceweasel
+Name[no]=Iceweasel
+Name[pl]=Iceweasel
+Name[pt]=Iceweasel
+Name[pt_BR]=Iceweasel
+Name[ru]=Iceweasel
+Name[sk]=Iceweasel
+Name[sv]=Iceweasel
+Comment=Browse the World Wide Web
+Comment[bg]=Сърфиране в Мрежата
+Comment[ca]=Navegueu per el web
+Comment[cs]=Prohlížení stránek World Wide Webu
+Comment[de]=Im Internet surfen
+Comment[el]=Περιηγηθείτε στον παγκόσμιο ιστό
+Comment[es]=Navegue por la web
+Comment[fa]=صفحات شبکه جهانی اینترنت را مرور نمایید
+Comment[fi]=Selaa Internetin WWW-sivuja
+Comment[fr]=Navigue sur Internet
+Comment[hu]=A világháló böngészése
+Comment[it]=Esplora il web
+Comment[ja]=ウェブを閲覧します
+Comment[ko]=웹을 돌아 다닙니다
+Comment[nb]=Surf på nettet
+Comment[nl]=Verken het internet
+Comment[nn]=Surf på nettet
+Comment[no]=Surf på nettet
+Comment[pl]=Przeglądanie stron WWW
+Comment[pt]=Navegue na Internet
+Comment[pt_BR]=Navegue na Internet
+Comment[ru]=Обозреватель Всемирной Паутины
+Comment[sk]=Prehliadanie internetu
+Comment[sv]=Surfa på webben
+GenericName=Web Browser
+GenericName[bg]=Интернет браузър
+GenericName[ca]=Navegador web
+GenericName[cs]=Webový prohlížeč
+GenericName[de]=Webbrowser
+GenericName[el]=Περιηγητής ιστού
+GenericName[es]=Navegador web
+GenericName[fa]=مرورگر اینترنتی
+GenericName[fi]=WWW-selain
+GenericName[fr]=Navigateur Web
+GenericName[hu]=Webböngésző
+GenericName[it]=Browser Web
+GenericName[ja]=ウェブ・ブラウザ
+GenericName[ko]=웹 브라우저
+GenericName[nb]=Nettleser
+GenericName[nl]=Webbrowser
+GenericName[nn]=Nettlesar
+GenericName[no]=Nettleser
+GenericName[pl]=Przeglądarka WWW
+GenericName[pt]=Navegador Web
+GenericName[pt_BR]=Navegador Web
+GenericName[ru]=Интернет-браузер
+GenericName[sk]=Internetový prehliadač
+GenericName[sv]=Webbläsare
+X-GNOME-FullName=Iceweasel Web Browser
+X-GNOME-FullName[bg]=Интернет браузър (Iceweasel)
+X-GNOME-FullName[ca]=Navegador web Iceweasel
+X-GNOME-FullName[cs]=Iceweasel Webový prohlížeč
+X-GNOME-FullName[el]=Περιηγήτης Ιστού Iceweasel
+X-GNOME-FullName[es]=Navegador web Iceweasel
+X-GNOME-FullName[fa]=مرورگر اینترنتی Iceweasel
+X-GNOME-FullName[fi]=Iceweasel-selain
+X-GNOME-FullName[fr]=Navigateur Web Iceweasel
+X-GNOME-FullName[hu]=Iceweasel webböngésző
+X-GNOME-FullName[it]=Iceweasel Browser Web
+X-GNOME-FullName[ja]=Iceweasel ウェブ・ブラウザ
+X-GNOME-FullName[ko]=Iceweasel 웹 브라우저
+X-GNOME-FullName[nb]=Iceweasel Nettleser
+X-GNOME-FullName[nl]=Iceweasel webbrowser
+X-GNOME-FullName[nn]=Iceweasel Nettlesar
+X-GNOME-FullName[no]=Iceweasel Nettleser
+X-GNOME-FullName[pl]=Przeglądarka WWW Iceweasel
+X-GNOME-FullName[pt]=Iceweasel Navegador Web
+X-GNOME-FullName[pt_BR]=Navegador Web Iceweasel
+X-GNOME-FullName[ru]=Интернет-браузер Iceweasel
+X-GNOME-FullName[sk]=Internetový prehliadač Iceweasel
+X-GNOME-FullName[sv]=Webbläsaren Iceweasel
+Exec=/usr/lib/iceweasel/iceweasel %u
+Terminal=false
+X-MultipleArgs=false
+Type=Application
+Icon=iceweasel
+Categories=Network;WebBrowser;
+MimeType=text/html;text/xml;application/xhtml+xml;application/xml;application/vnd.mozilla.xul+xml;application/rss+xml;application/rdf+xml;image/gif;image/jpeg;image/png;x-scheme-handler/http;x-scheme-handler/https;
+StartupWMClass=Iceweasel
+StartupNotify=true
diff --git a/libre/iceweasel-libre/iceweasel.install b/libre/iceweasel-libre/iceweasel.install
new file mode 100644
index 000000000..1a1f4b16b
--- /dev/null
+++ b/libre/iceweasel-libre/iceweasel.install
@@ -0,0 +1,13 @@
+post_install() {
+ update-desktop-database -q
+ gtk-update-icon-cache -q -t -f usr/share/icons/hicolor
+}
+
+post_upgrade() {
+ post_install
+}
+
+post_remove() {
+ post_install
+}
+
diff --git a/libre/iceweasel-libre/libre.patch b/libre/iceweasel-libre/libre.patch
new file mode 100644
index 000000000..4be59abff
--- /dev/null
+++ b/libre/iceweasel-libre/libre.patch
@@ -0,0 +1,891 @@
+diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js
+index 3840da4..fe1c05c 100644
+--- a/browser/app/profile/firefox.js
++++ b/browser/app/profile/firefox.js
+@@ -272,11 +272,6 @@ pref("browser.slowStartup.notificationDisabled", false);
+ pref("browser.slowStartup.timeThreshold", 60000);
+ pref("browser.slowStartup.maxSamples", 5);
+
+-// This url, if changed, MUST continue to point to an https url. Pulling arbitrary content to inject into
+-// this page over http opens us up to a man-in-the-middle attack that we'd rather not face. If you are a downstream
+-// repackager of this code using an alternate snippet url, please keep your users safe
+-pref("browser.aboutHomeSnippets.updateUrl", "https://snippets.mozilla.com/%STARTPAGE_VERSION%/%NAME%/%VERSION%/%APPBUILDID%/%BUILD_TARGET%/%LOCALE%/%CHANNEL%/%OS_VERSION%/%DISTRIBUTION%/%DISTRIBUTION_VERSION%/");
+-
+ pref("browser.enable_automatic_image_resizing", true);
+ pref("browser.chrome.site_icons", true);
+ pref("browser.chrome.favicons", true);
+@@ -1318,11 +1313,7 @@ pref("shumway.disabled", true);
+ // (This is intentionally on the high side; see bug 746055.)
+ pref("image.mem.max_decoded_image_kb", 256000);
+
+-// Default social providers
+-pref("social.manifest.facebook", "{\"origin\":\"https://www.facebook.com\",\"name\":\"Facebook Messenger\",\"workerURL\":\"https://www.facebook.com/desktop/fbdesktop2/socialfox/fbworker.js.php\",\"shareURL\":\"https://www.facebook.com/sharer/sharer.php?u=%{url}\",\"iconURL\":\"data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAAAX0lEQVQ4jWP4%2F%2F8%2FAyUYTFhHzjgDxP9JxGeQDSBVMxgTbUBCxer%2Fr999%2BQ8DJBuArJksA9A10s8AXIBoA0B%2BR%2FY%2FjD%2BEwoBoA1yT5v3PbdmCE8MAshhID%2FUMoDgzUYIBj0Cgi7ar4coAAAAASUVORK5CYII%3D\",\"sidebarURL\":\"https://www.facebook.com/desktop/fbdesktop2/?socialfox=true\",\"icon32URL\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAADbklEQVRYCc1Xv08UQRj99tctexAuCEFjRE0kGBEtLDSGqIWNxkYKbTAxNlY2JhaGWltNtNFeKgsKKxITK43/gCYW+IsoRhA4D47bH7fn9+bcvdm5JR7sefolC3Ozu9978+bNN7PayUv3HN3umdY0Y6IWBtSJ0HSTarXqTOiuTep6Lj+tdxAcA8RAgSmwdd2aCDs0clldYALb/FvgYVhjmfliVA2XpjEgWo0Attn42Z6WH1RFor5ehwo9XQIUZMoVn4qlCoVMSo62EvD8Kh0b3U2Xz43R2PBO6mUCGDlAf65V6MadZzT/rUimoccc2kYA4BfPHqJb105RzjJigKhRq9kEJUBIjgYVuXeL7SAI6eD+Abp5dTwVHOmEHxT50d8WBYJqSOdPj5BjW8gZR8UNqFR2xagx/65XFYaMH+BGWwiYpi4UkBPPLxTp9v1Z+lHc4DWvCQXWmIy6EjITgKowVd5Jjv7N3Hd6y5esigoOwpkJIAmMpZpLJGdiaaC4F0UmAj6bD84GCEwmB/qxMmRilmnwb/mpjAocHh4UEoNAt5NLZB7oy9OJo0PxqkAtePdhiSqunyC1LQUwWMPQaOr6GRre258Ajn4cP7KHcEXhsxpXbj+lT19X2TMNGTLVAcjcalS8gDwsQ2UOMhH4k8FkcrEn5E5ub2sKohxLK2VR77Hl9RUcsrgeRIEiVOT6z+tDbIeLy+vk+kGTCbXxycet6xhl//3f6bJEkdHYhA+mLtDIvoH4ieev5+juoxdk5+pjhALYEdXIpEB5w+NlSKSzqVQ/+H7IO6BLtl3fngGMiqhGJgIwlM6qpyUGFjySdk8m0Zg0ubeD7X9OIDEFajltRQgUJaUKx69tdgaQa0FMADuahZPMFtcEwNPm2hA7ZI5sK4aoE2NvYI+o8hkCIe7CwTv68zS0q9Dk5vpbm/8FXxitSzmMFHpsGj0wyLUheTwD2Y9fVgh1Ae0EPUgD9241ZEnld+v5kgnVZ/8fE0brVh5BK+1oCqKKF72Dk7HwBsssB/pklU1dfChy3S659H5+uelgIb+8WRv1/uGTV9Sdb5wJFlfW6fPCalMhwhSU1j2xKwKbP838GcOwJja4TqO0bjdmXxYTy1EYjFdCWoCEYZhseH/GDL3yJPHnuW6YmT7P1SlIA4768Hke4vOcsX8BE346lLHhDUQAAAAASUVORK5CYII=\", \"icon64URL\":\"data:image/png;base64,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\", \"description\":\"Keep up with friends wherever you go on the web.\",\"author\":\"Facebook\",\"homepageURL\":\"https://www.facebook.com/about/messenger-for-firefox\",\"builtin\":\"true\"}");
+-
+-pref("social.sidebar.open", true);
+-pref("social.sidebar.unload_timeout_ms", 10000);
++// removed facebook sidebar with Iceweasel.
+
+ pref("social.allowMultipleWorkers", true);
+
+diff --git a/browser/base/content/abouthome/aboutHome.css b/browser/base/content/abouthome/aboutHome.css
+index c270318..049fe6e 100644
+--- a/browser/base/content/abouthome/aboutHome.css
++++ b/browser/base/content/abouthome/aboutHome.css
+@@ -49,11 +49,6 @@ a {
+ background-repeat: no-repeat;
+ }
+
+-#searchForm,
+-#snippets {
+- width: 470px;
+-}
+-
+ #searchForm {
+ display: -moz-box;
+ }
+@@ -72,8 +67,7 @@ a {
+ #searchEngineLogo {
+ display: inline-block;
+ height: 28px;
+- width: 70px;
+- min-width: 70px;
++ width: 47px;
+ }
+
+ #searchText {
+@@ -145,48 +139,6 @@ a {
+ transition-duration: 0ms;
+ }
+
+-#defaultSnippet1,
+-#defaultSnippet2,
+-#rightsSnippet {
+- display: block;
+- min-height: 38px;
+- background: 30px center no-repeat;
+- padding: 6px 0;
+- -moz-padding-start: 79px;
+-}
+-
+-#rightsSnippet[hidden] {
+- display: none;
+-}
+-
+-#defaultSnippet1:-moz-dir(rtl),
+-#defaultSnippet2:-moz-dir(rtl),
+-#rightsSnippet:-moz-dir(rtl) {
+- background-position: right 30px center;
+-}
+-
+-#defaultSnippet1 {
+- background-image: url("chrome://browser/content/abouthome/snippet1.png");
+-}
+-
+-#defaultSnippet2 {
+- background-image: url("chrome://browser/content/abouthome/snippet2.png");
+-}
+-
+-#snippets {
+- display: inline-block;
+- text-align: start;
+- margin: 12px 0;
+- color: #3c3c3c;
+- font-size: 75%;
+- /* 12px is the computed font size, 15px the computed line height of the snippets
+- with Segoe UI on a default Windows 7 setup. The 15/12 multiplier approximately
+- converts em from units of font-size to units of line-height. The goal is to
+- preset the height of a three-line snippet to avoid visual moving/flickering as
+- the snippets load. */
+- min-height: calc(15/12 * 3em);
+-}
+-
+ #launcher {
+ display: -moz-box;
+ -moz-box-align: center;
+@@ -335,26 +287,25 @@ body[narrow] #restorePreviousSession::before {
+ width: 32px;
+ }
+
+-#aboutMozilla {
++#aboutGNU {
+ display: block;
+- position: relative; /* pin wordmark to edge of document, not of viewport */
+ -moz-box-ordinal-group: 0;
+ opacity: .5;
+ transition: opacity 150ms;
+ }
+
+-#aboutMozilla:hover {
++#aboutGNU:hover {
+ opacity: 1;
+ }
+
+-#aboutMozilla::before {
+- content: url("chrome://browser/content/abouthome/mozilla.png");
++#aboutGNU::before {
++ content: url("chrome://browser/content/abouthome/gnu_headshadow.png");
+ display: block;
+ position: absolute;
+ top: 12px;
+ right: 12px;
+- width: 69px;
+- height: 19px;
++ width: 200px;
++ height: 110px;
+ }
+
+ /* [HiDPI]
+@@ -366,26 +317,6 @@ body[narrow] #restorePreviousSession::before {
+ background-image: url("chrome://branding/content/about-logo@2x.png");
+ }
+
+- #defaultSnippet1,
+- #defaultSnippet2,
+- #rightsSnippet {
+- background-size: 40px;
+- }
+-
+- #defaultSnippet1 {
+- background-image: url("chrome://browser/content/abouthome/snippet1@2x.png");
+- }
+-
+- #defaultSnippet2 {
+- background-image: url("chrome://browser/content/abouthome/snippet2@2x.png");
+- }
+-
+- .launchButton::before,
+- #aboutMozilla::before {
+- transform: scale(.5);
+- transform-origin: 0 0;
+- }
+-
+ #downloads::before {
+ content: url("chrome://browser/content/abouthome/downloads@2x.png");
+ }
+@@ -421,9 +352,5 @@ body[narrow] #restorePreviousSession::before {
+ body[narrow] #restorePreviousSession::before {
+ content: url("chrome://browser/content/abouthome/restore@2x.png");
+ }
+-
+- #aboutMozilla::before {
+- content: url("chrome://browser/content/abouthome/mozilla@2x.png");
+- }
+ }
+
+diff --git a/browser/base/content/abouthome/aboutHome.js b/browser/base/content/abouthome/aboutHome.js
+index 432fcdc..bd1692a 100644
+--- a/browser/base/content/abouthome/aboutHome.js
++++ b/browser/base/content/abouthome/aboutHome.js
+@@ -3,152 +3,44 @@
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+ const SEARCH_ENGINES = {
+- "Google": {
+- // This is the "2x" image designed for OS X retina resolution, Windows at 192dpi, etc.;
+- // it will be scaled down as necessary on lower-dpi displays.
++ "DuckDuckGo HTML": {
+ image: "data:image/png;base64," +
+- "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"
+ }
+ };
+
+-// The process of adding a new default snippet involves:
+-// * add a new entity to aboutHome.dtd
+-// * add a <span/> for it in aboutHome.xhtml
+-// * add an entry here in the proper ordering (based on spans)
+-// The <a/> part of the snippet will be linked to the corresponding url.
+-const DEFAULT_SNIPPETS_URLS = [
+- "https://www.mozilla.org/firefox/features/?utm_source=snippet&utm_medium=snippet&utm_campaign=default+feature+snippet"
+-, "https://addons.mozilla.org/firefox/?utm_source=snippet&utm_medium=snippet&utm_campaign=addons"
+-];
+-
+-const SNIPPETS_UPDATE_INTERVAL_MS = 86400000; // 1 Day.
+-
+-// IndexedDB storage constants.
+-const DATABASE_NAME = "abouthome";
+-const DATABASE_VERSION = 1;
+-const SNIPPETS_OBJECTSTORE_NAME = "snippets";
+-
+ // This global tracks if the page has been set up before, to prevent double inits
+ let gInitialized = false;
+ let gObserver = new MutationObserver(function (mutations) {
+@@ -156,7 +48,6 @@ let gObserver = new MutationObserver(function (mutations) {
+ if (mutation.attributeName == "searchEngineName") {
+ setupSearchEngine();
+ if (!gInitialized) {
+- ensureSnippetsMapThen(loadSnippets);
+ gInitialized = true;
+ }
+ return;
+@@ -181,117 +72,6 @@ window.addEventListener("pagehide", function() {
+ window.removeEventListener("resize", fitToWidth);
+ });
+
+-// This object has the same interface as Map and is used to store and retrieve
+-// the snippets data. It is lazily initialized by ensureSnippetsMapThen(), so
+-// be sure its callback returned before trying to use it.
+-let gSnippetsMap;
+-let gSnippetsMapCallbacks = [];
+-
+-/**
+- * Ensure the snippets map is properly initialized.
+- *
+- * @param aCallback
+- * Invoked once the map has been initialized, gets the map as argument.
+- * @note Snippets should never directly manage the underlying storage, since
+- * it may change inadvertently.
+- */
+-function ensureSnippetsMapThen(aCallback)
+-{
+- if (gSnippetsMap) {
+- aCallback(gSnippetsMap);
+- return;
+- }
+-
+- // Handle multiple requests during the async initialization.
+- gSnippetsMapCallbacks.push(aCallback);
+- if (gSnippetsMapCallbacks.length > 1) {
+- // We are already updating, the callbacks will be invoked when done.
+- return;
+- }
+-
+- let invokeCallbacks = function () {
+- if (!gSnippetsMap) {
+- gSnippetsMap = Object.freeze(new Map());
+- }
+-
+- for (let callback of gSnippetsMapCallbacks) {
+- callback(gSnippetsMap);
+- }
+- gSnippetsMapCallbacks.length = 0;
+- }
+-
+- let openRequest = indexedDB.open(DATABASE_NAME, DATABASE_VERSION);
+-
+- openRequest.onerror = function (event) {
+- // Try to delete the old database so that we can start this process over
+- // next time.
+- indexedDB.deleteDatabase(DATABASE_NAME);
+- invokeCallbacks();
+- };
+-
+- openRequest.onupgradeneeded = function (event) {
+- let db = event.target.result;
+- if (!db.objectStoreNames.contains(SNIPPETS_OBJECTSTORE_NAME)) {
+- db.createObjectStore(SNIPPETS_OBJECTSTORE_NAME);
+- }
+- }
+-
+- openRequest.onsuccess = function (event) {
+- let db = event.target.result;
+-
+- db.onerror = function (event) {
+- invokeCallbacks();
+- }
+-
+- db.onversionchange = function (event) {
+- event.target.close();
+- invokeCallbacks();
+- }
+-
+- let cache = new Map();
+- let cursorRequest = db.transaction(SNIPPETS_OBJECTSTORE_NAME)
+- .objectStore(SNIPPETS_OBJECTSTORE_NAME).openCursor();
+- cursorRequest.onerror = function (event) {
+- invokeCallbacks();
+- }
+-
+- cursorRequest.onsuccess = function(event) {
+- let cursor = event.target.result;
+-
+- // Populate the cache from the persistent storage.
+- if (cursor) {
+- cache.set(cursor.key, cursor.value);
+- cursor.continue();
+- return;
+- }
+-
+- // The cache has been filled up, create the snippets map.
+- gSnippetsMap = Object.freeze({
+- get: function (aKey) cache.get(aKey),
+- set: function (aKey, aValue) {
+- db.transaction(SNIPPETS_OBJECTSTORE_NAME, "readwrite")
+- .objectStore(SNIPPETS_OBJECTSTORE_NAME).put(aValue, aKey);
+- return cache.set(aKey, aValue);
+- },
+- has: function (aKey) cache.has(aKey),
+- delete: function (aKey) {
+- db.transaction(SNIPPETS_OBJECTSTORE_NAME, "readwrite")
+- .objectStore(SNIPPETS_OBJECTSTORE_NAME).delete(aKey);
+- return cache.delete(aKey);
+- },
+- clear: function () {
+- db.transaction(SNIPPETS_OBJECTSTORE_NAME, "readwrite")
+- .objectStore(SNIPPETS_OBJECTSTORE_NAME).clear();
+- return cache.clear();
+- },
+- get size() cache.size
+- });
+-
+- setTimeout(invokeCallbacks, 0);
+- }
+- }
+-}
+-
+ function onSearchSubmit(aEvent)
+ {
+ let searchTerms = document.getElementById("searchText").value;
+@@ -350,147 +130,6 @@ function loadSucceeded()
+ document.dispatchEvent(event);
+ }
+
+-/**
+- * Update the local snippets from the remote storage, then show them through
+- * showSnippets.
+- */
+-function loadSnippets()
+-{
+- if (!gSnippetsMap)
+- throw new Error("Snippets map has not properly been initialized");
+-
+- // Allow tests to modify the snippets map before using it.
+- var event = new CustomEvent("AboutHomeLoadSnippets", {bubbles:true});
+- document.dispatchEvent(event);
+-
+- // Check cached snippets version.
+- let cachedVersion = gSnippetsMap.get("snippets-cached-version") || 0;
+- let currentVersion = document.documentElement.getAttribute("snippetsVersion");
+- if (cachedVersion < currentVersion) {
+- // The cached snippets are old and unsupported, restart from scratch.
+- gSnippetsMap.clear();
+- }
+-
+- // Check last snippets update.
+- let lastUpdate = gSnippetsMap.get("snippets-last-update");
+- let updateURL = document.documentElement.getAttribute("snippetsURL");
+- let shouldUpdate = !lastUpdate ||
+- Date.now() - lastUpdate > SNIPPETS_UPDATE_INTERVAL_MS;
+- if (updateURL && shouldUpdate) {
+- // Try to update from network.
+- let xhr = new XMLHttpRequest();
+- try {
+- xhr.open("GET", updateURL, true);
+- } catch (ex) {
+- showSnippets();
+- loadSucceeded();
+- return;
+- }
+- // Even if fetching should fail we don't want to spam the server, thus
+- // set the last update time regardless its results. Will retry tomorrow.
+- gSnippetsMap.set("snippets-last-update", Date.now());
+- xhr.onerror = function (event) {
+- showSnippets();
+- };
+- xhr.onload = function (event)
+- {
+- if (xhr.status == 200) {
+- gSnippetsMap.set("snippets", xhr.responseText);
+- gSnippetsMap.set("snippets-cached-version", currentVersion);
+- }
+- showSnippets();
+- loadSucceeded();
+- };
+- xhr.send(null);
+- } else {
+- showSnippets();
+- loadSucceeded();
+- }
+-}
+-
+-/**
+- * Shows locally cached remote snippets, or default ones when not available.
+- *
+- * @note: snippets should never invoke showSnippets(), or they may cause
+- * a "too much recursion" exception.
+- */
+-let _snippetsShown = false;
+-function showSnippets()
+-{
+- let snippetsElt = document.getElementById("snippets");
+-
+- // Show about:rights notification, if needed.
+- let showRights = document.documentElement.getAttribute("showKnowYourRights");
+- if (showRights) {
+- let rightsElt = document.getElementById("rightsSnippet");
+- let anchor = rightsElt.getElementsByTagName("a")[0];
+- anchor.href = "about:rights";
+- snippetsElt.appendChild(rightsElt);
+- rightsElt.removeAttribute("hidden");
+- return;
+- }
+-
+- if (!gSnippetsMap)
+- throw new Error("Snippets map has not properly been initialized");
+- if (_snippetsShown) {
+- // There's something wrong with the remote snippets, just in case fall back
+- // to the default snippets.
+- showDefaultSnippets();
+- throw new Error("showSnippets should never be invoked multiple times");
+- }
+- _snippetsShown = true;
+-
+- let snippets = gSnippetsMap.get("snippets");
+- // If there are remotely fetched snippets, try to to show them.
+- if (snippets) {
+- // Injecting snippets can throw if they're invalid XML.
+- try {
+- snippetsElt.innerHTML = snippets;
+- // Scripts injected by innerHTML are inactive, so we have to relocate them
+- // through DOM manipulation to activate their contents.
+- Array.forEach(snippetsElt.getElementsByTagName("script"), function(elt) {
+- let relocatedScript = document.createElement("script");
+- relocatedScript.type = "text/javascript;version=1.8";
+- relocatedScript.text = elt.text;
+- elt.parentNode.replaceChild(relocatedScript, elt);
+- });
+- return;
+- } catch (ex) {
+- // Bad content, continue to show default snippets.
+- }
+- }
+-
+- showDefaultSnippets();
+-}
+-
+-/**
+- * Clear snippets element contents and show default snippets.
+- */
+-function showDefaultSnippets()
+-{
+- // Clear eventual contents...
+- let snippetsElt = document.getElementById("snippets");
+- snippetsElt.innerHTML = "";
+-
+- // ...then show default snippets.
+- let defaultSnippetsElt = document.getElementById("defaultSnippets");
+- let entries = defaultSnippetsElt.querySelectorAll("span");
+- // Choose a random snippet. Assume there is always at least one.
+- let randIndex = Math.floor(Math.random() * entries.length);
+- let entry = entries[randIndex];
+- // Inject url in the eventual link.
+- if (DEFAULT_SNIPPETS_URLS[randIndex]) {
+- let links = entry.getElementsByTagName("a");
+- // Default snippets can have only one link, otherwise something is messed
+- // up in the translation.
+- if (links.length == 1) {
+- links[0].href = DEFAULT_SNIPPETS_URLS[randIndex];
+- }
+- }
+- // Move the default snippet to the snippets element.
+- snippetsElt.appendChild(entry);
+-}
+-
+ function fitToWidth() {
+ if (window.scrollMaxX) {
+ document.body.setAttribute("narrow", "true");
+diff --git a/browser/base/content/abouthome/aboutHome.xhtml b/browser/base/content/abouthome/aboutHome.xhtml
+index 1d03d38..5d808db 100644
+--- a/browser/base/content/abouthome/aboutHome.xhtml
++++ b/browser/base/content/abouthome/aboutHome.xhtml
+@@ -43,15 +43,6 @@
+ <input id="searchSubmit" type="submit" value="&abouthome.searchEngineButton.label;"/>
+ </form>
+ </div>
+-
+- <div id="snippetContainer">
+- <div id="defaultSnippets" hidden="true">
+- <span id="defaultSnippet1">&abouthome.defaultSnippet1.v1;</span>
+- <span id="defaultSnippet2">&abouthome.defaultSnippet2.v1;</span>
+- </div>
+- <span id="rightsSnippet" hidden="true">&abouthome.rightsSnippet;</span>
+- <div id="snippets"/>
+- </div>
+ </div>
+ <div class="spacer"/>
+
+@@ -67,6 +58,6 @@
+ <button class="launchButton" id="restorePreviousSession">&historyRestoreLastSession.label;</button>
+ </div>
+
+- <a id="aboutMozilla" href="https://www.mozilla.org/about/?utm_source=about-home&amp;utm_medium=Referral"/>
++ <a id="aboutGNU" href="http://gnu.org"></a>
+ </body>
+ </html>
+diff --git a/browser/base/jar.mn b/browser/base/jar.mn
+index 3113094..e852cec 100644
+--- a/browser/base/jar.mn
++++ b/browser/base/jar.mn
+@@ -33,7 +33,7 @@ browser.jar:
+ content/browser/abouthome/settings.png (content/abouthome/settings.png)
+ content/browser/abouthome/restore.png (content/abouthome/restore.png)
+ content/browser/abouthome/restore-large.png (content/abouthome/restore-large.png)
+- content/browser/abouthome/mozilla.png (content/abouthome/mozilla.png)
++ content/browser/abouthome/gnu_headshadow.png (content/abouthome/gnu_headshadow.png)
+ content/browser/abouthome/snippet1@2x.png (content/abouthome/snippet1@2x.png)
+ content/browser/abouthome/snippet2@2x.png (content/abouthome/snippet2@2x.png)
+ content/browser/abouthome/downloads@2x.png (content/abouthome/downloads@2x.png)
+@@ -45,7 +45,6 @@ browser.jar:
+ content/browser/abouthome/settings@2x.png (content/abouthome/settings@2x.png)
+ content/browser/abouthome/restore@2x.png (content/abouthome/restore@2x.png)
+ content/browser/abouthome/restore-large@2x.png (content/abouthome/restore-large@2x.png)
+- content/browser/abouthome/mozilla@2x.png (content/abouthome/mozilla@2x.png)
+ #ifdef MOZ_SERVICES_HEALTHREPORT
+ content/browser/abouthealthreport/abouthealth.xhtml (content/abouthealthreport/abouthealth.xhtml)
+ content/browser/abouthealthreport/abouthealth.js (content/abouthealthreport/abouthealth.js)
+diff --git a/browser/locales/en-US/chrome/browser/aboutHome.dtd b/browser/locales/en-US/chrome/browser/aboutHome.dtd
+index e84341f..5476d32 100644
+--- a/browser/locales/en-US/chrome/browser/aboutHome.dtd
++++ b/browser/locales/en-US/chrome/browser/aboutHome.dtd
+@@ -13,17 +13,6 @@
+
+ <!ENTITY abouthome.searchEngineButton.label "Search">
+
+-<!-- LOCALIZATION NOTE (abouthome.defaultSnippet1.v1):
+- text in <a/> will be linked to the Firefox features page on mozilla.com
+--->
+-<!ENTITY abouthome.defaultSnippet1.v1 "Thanks for choosing Firefox! To get the most out of your browser, learn more about the <a>latest features</a>.">
+-<!-- LOCALIZATION NOTE (abouthome.defaultSnippet2.v1):
+- text in <a/> will be linked to the featured add-ons on addons.mozilla.org
+--->
+-<!ENTITY abouthome.defaultSnippet2.v1 "It's easy to customize your Firefox exactly the way you want it. <a>Choose from thousands of add-ons</a>.">
+-<!-- LOCALIZATION NOTE (abouthome.rightsSnippet): text in <a/> will be linked to about:rights -->
+-<!ENTITY abouthome.rightsSnippet "&brandFullName; is free and open source software from the non-profit Mozilla Foundation. <a>Know your rights…</a>">
+-
+ <!ENTITY abouthome.bookmarksButton.label "Bookmarks">
+ <!ENTITY abouthome.historyButton.label "History">
+ <!ENTITY abouthome.settingsButton.label "Settings">
+diff --git a/browser/locales/en-US/chrome/browser-region/region.properties b/browser/locales/en-US/chrome/browser-region/region.properties
+index 087cc50..5654eb9 100644
+--- a/browser/locales/en-US/chrome/browser-region/region.properties
++++ b/browser/locales/en-US/chrome/browser-region/region.properties
+@@ -3,17 +3,12 @@
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+ # Default search engine
+-browser.search.defaultenginename=Google
++browser.search.defaultenginename=DuckDuckGo HTML
+
+ # Search engine order (order displayed in the search bar dropdown)s
+-browser.search.order.1=Google
+-browser.search.order.2=Yahoo
+-browser.search.order.3=Bing
+-
+-# This is the default set of web based feed handlers shown in the reader
+-# selection UI
+-browser.contentHandlers.types.0.title=My Yahoo!
+-browser.contentHandlers.types.0.uri=http://add.my.yahoo.com/rss?url=%s
++browser.search.order.1=DuckDuckGo HTML
++browser.search.order.2=DuckDuckGo Lite
++browser.search.order.3=Seeks Search
+
+ # increment this number when anything gets changed in the list below. This will
+ # cause Firefox to re-read these prefs and inject any new handlers into the
+@@ -22,20 +17,10 @@ browser.contentHandlers.types.0.uri=http://add.my.yahoo.com/rss?url=%s
+ # don't make any spelling errors here.
+ gecko.handlerService.defaultHandlersVersion=4
+
+-# The default set of protocol handlers for webcal:
+-gecko.handlerService.schemes.webcal.0.name=30 Boxes
+-gecko.handlerService.schemes.webcal.0.uriTemplate=https://30boxes.com/external/widget?refer=ff&url=%s
+-
+-# The default set of protocol handlers for mailto:
+-gecko.handlerService.schemes.mailto.0.name=Yahoo! Mail
+-gecko.handlerService.schemes.mailto.0.uriTemplate=https://compose.mail.yahoo.com/?To=%s
+-gecko.handlerService.schemes.mailto.1.name=Gmail
+-gecko.handlerService.schemes.mailto.1.uriTemplate=https://mail.google.com/mail/?extsrc=mailto&url=%s
+-
+ # The default set of protocol handlers for irc:
+-gecko.handlerService.schemes.irc.0.name=Mibbit
+-gecko.handlerService.schemes.irc.0.uriTemplate=https://www.mibbit.com/?url=%s
++gecko.handlerService.schemes.irc.0.name=Freenode Web IRC
++gecko.handlerService.schemes.irc.0.uriTemplate=https://webchat.freenode.net
+
+ # The default set of protocol handlers for ircs:
+-gecko.handlerService.schemes.ircs.0.name=Mibbit
+-gecko.handlerService.schemes.ircs.0.uriTemplate=https://www.mibbit.com/?url=%s
++gecko.handlerService.schemes.ircs.0.name=Freenode Web IRC
++gecko.handlerService.schemes.ircs.0.uriTemplate=https://webchat.freenode.net
+diff --git a/browser/locales/generic/profile/bookmarks.html.in b/browser/locales/generic/profile/bookmarks.html.in
+index e925c1e..8c121fc 100644
+--- a/browser/locales/generic/profile/bookmarks.html.in
++++ b/browser/locales/generic/profile/bookmarks.html.in
+@@ -15,13 +15,20 @@
+ <DT><H3 PERSONAL_TOOLBAR_FOLDER="true" ID="rdf:#$FvPhC3">@bookmarks_toolbarfolder@</H3>
+ <DD>@bookmarks_toolbarfolder_description@
+ <DL><p>
+- <DT><A HREF="https://www.mozilla.org/@AB_CD@/firefox/central/" ID="rdf:#$GvPhC3">@getting_started@</A>
++ <DT><A HREF="https://parabolagnulinux.org/" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABL0lEQVQ4jWNgoCcoq16VU1GzygnEBtEVDWuV8GooKFuhWVG3uiM3d5UokG4qr1szAaa5vGbVt4ralacwNDU0rGIrr10VBVG0+lxhwyqVsqqVtRW1q6eD5IvL19oB2V+B+D9QzQu4xtDQVZylVavygRKHqurWOlbUrknKK12qWlCwWLK8elUFA8N/xvLy5VYVtas+gzWDDVi9E2QjT1XdcufymjWpQJt1cXmnvHwVP1DzR7hmIC6vW+kOtpnYQKysW30arrlm9RVi9cFBRfXKJTADympWJZNsQFnN6rUQA1adAQU2SZqBXmUGBtozUDiU1qxQJtl2oCY3kO2l1avCSdYMAsBAWwyM2plkaS4p6eYGOv1YQ0MDB1kGlFWuDChuWKZBlmYQqK5eJU22ZkIAAEIlnQZQkzITAAAAAElFTkSuQmCC">Parabola GNU/Linux-libre</A>
+ </DL><p>
+- <DT><H3 ID="rdf:#$ZvPhC3">@firefox_heading@</H3>
++ <DT><H3 ID="rdf:#$YvPhC3">Parabola GNU/Linux-libre</H3>
+ <DL><p>
+- <DT><A HREF="https://www.mozilla.org/@AB_CD@/firefox/help/" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==" ID="rdf:#$22iCK1">@firefox_help@</A>
+- <DT><A HREF="https://www.mozilla.org/@AB_CD@/firefox/customize/" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==" ID="rdf:#$32iCK1">@firefox_customize@</A>
+- <DT><A HREF="https://www.mozilla.org/@AB_CD@/contribute/" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==" ID="rdf:#$42iCK1">@firefox_community@</A>
+- <DT><A HREF="https://www.mozilla.org/@AB_CD@/about/" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==" ID="rdf:#$52iCK1">@firefox_about@</A>
++ <DT><A HREF="https://parabolagnulinux.org/" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABL0lEQVQ4jWNgoCcoq16VU1GzygnEBtEVDWuV8GooKFuhWVG3uiM3d5UokG4qr1szAaa5vGbVt4ralacwNDU0rGIrr10VBVG0+lxhwyqVsqqVtRW1q6eD5IvL19oB2V+B+D9QzQu4xtDQVZylVavygRKHqurWOlbUrknKK12qWlCwWLK8elUFA8N/xvLy5VYVtas+gzWDDVi9E2QjT1XdcufymjWpQJt1cXmnvHwVP1DzR7hmIC6vW+kOtpnYQKysW30arrlm9RVi9cFBRfXKJTADympWJZNsQFnN6rUQA1adAQU2SZqBXmUGBtozUDiU1qxQJtl2oCY3kO2l1avCSdYMAsBAWwyM2plkaS4p6eYGOv1YQ0MDB1kGlFWuDChuWKZBlmYQqK5eJU22ZkIAAEIlnQZQkzITAAAAAElFTkSuQmCC">Parabola GNU/Linux-libre</A>
++ <DT><A HREF="https://parabolagnulinux.org/packages/" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABL0lEQVQ4jWNgoCcoq16VU1GzygnEBtEVDWuV8GooKFuhWVG3uiM3d5UokG4qr1szAaa5vGbVt4ralacwNDU0rGIrr10VBVG0+lxhwyqVsqqVtRW1q6eD5IvL19oB2V+B+D9QzQu4xtDQVZylVavygRKHqurWOlbUrknKK12qWlCwWLK8elUFA8N/xvLy5VYVtas+gzWDDVi9E2QjT1XdcufymjWpQJt1cXmnvHwVP1DzR7hmIC6vW+kOtpnYQKysW30arrlm9RVi9cFBRfXKJTADympWJZNsQFnN6rUQA1adAQU2SZqBXmUGBtozUDiU1qxQJtl2oCY3kO2l1avCSdYMAsBAWwyM2plkaS4p6eYGOv1YQ0MDB1kGlFWuDChuWKZBlmYQqK5eJU22ZkIAAEIlnQZQkzITAAAAAElFTkSuQmCC">Parabola GNU/Linux-libre Packages</A>
++ <DT><A HREF="https://wiki.parabolagnulinux.org/" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABL0lEQVQ4jWNgoCcoq16VU1GzygnEBtEVDWuV8GooKFuhWVG3uiM3d5UokG4qr1szAaa5vGbVt4ralacwNDU0rGIrr10VBVG0+lxhwyqVsqqVtRW1q6eD5IvL19oB2V+B+D9QzQu4xtDQVZylVavygRKHqurWOlbUrknKK12qWlCwWLK8elUFA8N/xvLy5VYVtas+gzWDDVi9E2QjT1XdcufymjWpQJt1cXmnvHwVP1DzR7hmIC6vW+kOtpnYQKysW30arrlm9RVi9cFBRfXKJTADympWJZNsQFnN6rUQA1adAQU2SZqBXmUGBtozUDiU1qxQJtl2oCY3kO2l1avCSdYMAsBAWwyM2plkaS4p6eYGOv1YQ0MDB1kGlFWuDChuWKZBlmYQqK5eJU22ZkIAAEIlnQZQkzITAAAAAElFTkSuQmCC">Parabola GNU/Linux-libre Wiki</A>
++ <DT><A HREF="https://labs.parabola.nu/" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABL0lEQVQ4jWNgoCcoq16VU1GzygnEBtEVDWuV8GooKFuhWVG3uiM3d5UokG4qr1szAaa5vGbVt4ralacwNDU0rGIrr10VBVG0+lxhwyqVsqqVtRW1q6eD5IvL19oB2V+B+D9QzQu4xtDQVZylVavygRKHqurWOlbUrknKK12qWlCwWLK8elUFA8N/xvLy5VYVtas+gzWDDVi9E2QjT1XdcufymjWpQJt1cXmnvHwVP1DzR7hmIC6vW+kOtpnYQKysW30arrlm9RVi9cFBRfXKJTADympWJZNsQFnN6rUQA1adAQU2SZqBXmUGBtozUDiU1qxQJtl2oCY3kO2l1avCSdYMAsBAWwyM2plkaS4p6eYGOv1YQ0MDB1kGlFWuDChuWKZBlmYQqK5eJU22ZkIAAEIlnQZQkzITAAAAAElFTkSuQmCC">Parabola GNU/Linux-libre Labs</A>
++ </DL><p>
++ <DT><H3 ID="rdf:#$ZvPhC3">Free Software Foundation</H3>
++ <DL><p>
++ <DT><A HREF="http://www.fsf.org/" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAACXBIWXMAAAsTAAALEwEAmpwYAAADG0lEQVQoFQEQA+/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQECAAAAAAAAAAAAAAAAAAAA2qOp7tTXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP///wAAAAAAAOCyt7pUXQcSEgcQDwAAAP///wAAAAAAAAD//x9NSDqNhQEBAQQAAAAAAAAAAAAAAAAQJiQGDQ0aPToZPjoAAQEAAAAAAAAAAAABAQEpZV4AAAAAAAAAAAAA////////////////pSIv05KZ////////////////////////////////AAAAAQAAAP///6krNwAAAAAAAPHc3ggSEQcSEQAAAAAAAAAAABY3NEGelQAAAAAAAAEBAQEAAAD///+YARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGDg1g690CBgYAAAABAQEEAAAAAAAAS7etAAAAAAAAwGVtHklFIlJOAAAAAAAAAAAAAAAA+/X2BwYGAAAAAAAABAAAAAAAAB1IQwAAAAAAAAYNDBAmJB1IQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAgL//v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAQEB//7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAECAv/+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////cqK3qzM////////////////////////////////8AAAABAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGuLjDf9F8oBAAAAAElFTkSuQmCC">Free Software Foundation</A>
++ <DT><A HREF="http://libreplanet.org/" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACfElEQVQ4jZXTS0hUcRTH8f+9M3fGd0gRRq1a2bZdBAotWtS6TQtB6IHgKzRy0UKqjRaRCAq+R21MDMsUR83JR5fJxhmaK2lzsWAWw+ToEHJxgnFm7reFIgza66z/58P/dzhHcESZpsluIsFPwyCVSmGa5lHPEEIIkdGYTqPPvqUlP4fK8nJ2DINYNEq71YJ3fv4QlAGkUynaj+VRdfUK7580M52rEN/ZYWNjg2GrjEMSPFXsmOn0YcA0TZ4V5tNZUkJTTTWfJiZIJhJ8U1VczwcZs0o4JUHzufM0ZGcf/OQASCaTxGIxDMNA00P8iEbpuXyJ8Tw77+wWJhWZQYuVbiHoFIKwpmUC4XCYzc1NDMMgHo9z8+IFvl6/xsf7D9ArbjOpyAxLEt1C0CUErfvJDwBd14lEImxvb/N9fR1fgY3egmyWsq0sO/poUyw4pb3mLiFolyRM09wDEokEfr+fUChEJBJh4HgBS7kKn92zLIy9ZriqklFZwiEEHfsRRp1O0un0HpDa3cU9M8PKygp3Tp5AzbKgZlmYt1uYtkn02q0MyYKmnBxWNI27Nhtut5tkMrkHmKZJbWkpqqryQpFxKTJTisyEVeaVRWJIlqgpLuZRWRkejwe/34/P58ucwZvWVhYXF5l2uejIzeHGqbM4ZYmB/dy1hUV8mJpibm4On8/H1tbW4T1YXV3F6/WysLDA5Pg4nfsDe5yfz8OiIjweD5qmEQwGf7/KwWCQtbU1NE2jRZbpEoI2SWKqr49lVUXX9T/fAkAgEKC/e5SW6mo6hKD+zGn6e0bw+/x/PyaA9S/rvOwfobGukfpbddyraMDR7iCwHPg34H9KCCF+Abts3KCj/p6aAAAAAElFTkSuQmCC">LibrePlanet</A>
++ <DT><A HREF="http://www.gnu.org/software/gnuzilla/addons.html" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAGFBMVEVFRUV+fn6mpqa/v7/Ozs7Y2Njg4OD8/Pwuhn+TAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAALEQAACxEBf2RfkQAAAAd0SU1FB9MBDhQ6Gd8s57cAAAEVSURBVBgZBcGxVtpgGADQL9gHSBzqSognzMixmcWWzB6pmRHhnyvku6/fewMAIPD3TwHmQxHs6vr+A16bphNum/vV0x429201hcPjAGBTDZGnR/Kw1U181+u4HXvOdSxjUcztz8jjg1xGVBG9XPYxt4PviKiaWLg168iXtbrq+mPT1utjNcR1U73deRnL43M2sRgj3+oYs8uL3rLphPd2QWmHbMu/VS/cnk6UdtSW657g9yBlcZ0UAkUWzPvyRaAYmfd+HT4IZtvC59ibEJxXiqJjQpBpNEufBYE0McoOAunGhRMEFIPc7h4goJigQEBxk8u7AgEpL3IEAUZfcgAByGFXQACm5+4MAuB19QMEgI8CAgDgP4rivVgoKP6ZAAAAAElFTkSuQmCC">Free addons</A>
++ <DT><A HREF="http://www.h-node.org/" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABgElEQVQ4jaXRz2uSARzHcb0vlRGEzTVWISU1BVkFYTIyjNK1pKcxHA+yhWMWIamHYikFgpoLIi9jwegi3QbL9SzdLmMbM9J+DkJBgm5RDvEPeHeQHOyQz0OH9+V7ePGBr0pqpPmfVPsP8a0AR4MnMEwf48x9K0s/E8oAY9iEMOvD+8yP2qVjrhhRBnSN61n5sIpULqC+pGHh8wNlgEY8jPQXcGh4VXukDND5evYAl46odIuXtYdKAANSudAChO52/XeMZMohecCbcoGdH99Y+7LO72adT9+/4nh8nYOjBl7/SsoB8gBkpHk8T0S2K++pN3fRin3cfnFDHvCuWkI9rEMvHGEo5gbAHnXhnLF1BpZLeRaLOVT2A8Q3A5wMngXgWtKLxX9KPqC+rCWQvYkpeK4NWKcGOgO50ts2MJJ0cPreeQDciTHMchZYIhcwh2wcuqjn+ccwGm9v6wsTxxn0dVgQXZ7Ek3Agpq6QrcaQGmmebtxFSDkRU1fJVmL/BpT2ByV/3eDMhinRAAAAAElFTkSuQmCC">h-node</A>
+ </DL><p>
+ </DL><p>
+diff --git a/browser/modules/AboutHome.jsm b/browser/modules/AboutHome.jsm
+index c3dc6b2..df312e3 100644
+--- a/browser/modules/AboutHome.jsm
++++ b/browser/modules/AboutHome.jsm
+@@ -8,7 +8,7 @@ let Cc = Components.classes;
+ let Ci = Components.interfaces;
+ let Cu = Components.utils;
+
+-this.EXPORTED_SYMBOLS = [ "AboutHomeUtils", "AboutHome" ];
++this.EXPORTED_SYMBOLS = [ "AboutHome" ];
+
+ Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+ Components.utils.import("resource://gre/modules/Services.jsm");
+@@ -16,66 +16,6 @@ Components.utils.import("resource://gre/modules/Services.jsm");
+ XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
+ "resource://gre/modules/PrivateBrowsingUtils.jsm");
+
+-// Url to fetch snippets, in the urlFormatter service format.
+-const SNIPPETS_URL_PREF = "browser.aboutHomeSnippets.updateUrl";
+-
+-// Should be bumped up if the snippets content format changes.
+-const STARTPAGE_VERSION = 4;
+-
+-this.AboutHomeUtils = {
+- get snippetsVersion() STARTPAGE_VERSION,
+-
+- /*
+- * showKnowYourRights - Determines if the user should be shown the
+- * about:rights notification. The notification should *not* be shown if
+- * we've already shown the current version, or if the override pref says to
+- * never show it. The notification *should* be shown if it's never been seen
+- * before, if a newer version is available, or if the override pref says to
+- * always show it.
+- */
+- get showKnowYourRights() {
+- // Look for an unconditional override pref. If set, do what it says.
+- // (true --> never show, false --> always show)
+- try {
+- return !Services.prefs.getBoolPref("browser.rights.override");
+- } catch (e) { }
+- // Ditto, for the legacy EULA pref.
+- try {
+- return !Services.prefs.getBoolPref("browser.EULA.override");
+- } catch (e) { }
+-
+-#ifndef MOZILLA_OFFICIAL
+- // Non-official builds shouldn't show the notification.
+- return false;
+-#endif
+-
+- // Look to see if the user has seen the current version or not.
+- var currentVersion = Services.prefs.getIntPref("browser.rights.version");
+- try {
+- return !Services.prefs.getBoolPref("browser.rights." + currentVersion + ".shown");
+- } catch (e) { }
+-
+- // Legacy: If the user accepted a EULA, we won't annoy them with the
+- // equivalent about:rights page until the version changes.
+- try {
+- return !Services.prefs.getBoolPref("browser.EULA." + currentVersion + ".accepted");
+- } catch (e) { }
+-
+- // We haven't shown the notification before, so do so now.
+- return true;
+- }
+-};
+-
+-/**
+- * Returns the URL to fetch snippets from, in the urlFormatter service format.
+- */
+-XPCOMUtils.defineLazyGetter(AboutHomeUtils, "snippetsURL", function() {
+- let updateURL = Services.prefs
+- .getCharPref(SNIPPETS_URL_PREF)
+- .replace("%STARTPAGE_VERSION%", STARTPAGE_VERSION);
+- return Services.urlFormatter.formatURL(updateURL);
+-});
+-
+ /**
+ * This code provides services to the about:home page. Whenever
+ * about:home needs to do something chrome-privileged, it sends a
+@@ -186,18 +126,9 @@ let AboutHome = {
+ ss.promiseInitialized.then(function() {
+ let data = {
+ showRestoreLastSession: ss.canRestoreLastSession,
+- snippetsURL: AboutHomeUtils.snippetsURL,
+- showKnowYourRights: AboutHomeUtils.showKnowYourRights,
+- snippetsVersion: AboutHomeUtils.snippetsVersion,
+ defaultEngineName: Services.search.defaultEngine.name
+ };
+
+- if (AboutHomeUtils.showKnowYourRights) {
+- // Set pref to indicate we've shown the notification.
+- let currentVersion = Services.prefs.getIntPref("browser.rights.version");
+- Services.prefs.setBoolPref("browser.rights." + currentVersion + ".shown", true);
+- }
+-
+ if (target) {
+ target.messageManager.sendAsyncMessage("AboutHome:Update", data);
+ } else {
diff --git a/libre/iceweasel-libre/mozconfig b/libre/iceweasel-libre/mozconfig
new file mode 100644
index 000000000..957ea0dbf
--- /dev/null
+++ b/libre/iceweasel-libre/mozconfig
@@ -0,0 +1,38 @@
+. $topsrcdir/browser/config/mozconfig
+
+ac_add_options --prefix=/usr
+ac_add_options --libdir=/usr/lib
+
+# Iceweasel
+ac_add_options --disable-official-branding
+ac_add_options --with-branding=debian/branding
+
+# System libraries
+ac_add_options --with-system-nspr
+ac_add_options --with-system-nss
+ac_add_options --with-system-jpeg
+ac_add_options --with-system-zlib
+ac_add_options --with-system-bz2
+ac_add_options --with-system-png
+ac_add_options --with-system-libevent
+ac_add_options --with-system-libvpx
+ac_add_options --enable-system-hunspell
+ac_add_options --enable-system-sqlite
+ac_add_options --enable-system-ffi
+#ac_add_options --enable-system-cairo
+ac_add_options --enable-system-pixman
+
+# Features
+ac_add_options --enable-startup-notification
+ac_add_options --enable-pulseaudio
+
+ac_add_options --disable-crashreporter
+ac_add_options --disable-updater
+ac_add_options --disable-installer
+ac_add_options --disable-debug-symbols
+
+# Parabola features
+ac_add_options --disable-safe-browsing
+
+# Other
+mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/moz-objdir
diff --git a/libre/iceweasel-libre/mozconfig.pgo b/libre/iceweasel-libre/mozconfig.pgo
new file mode 100644
index 000000000..71ba205a4
--- /dev/null
+++ b/libre/iceweasel-libre/mozconfig.pgo
@@ -0,0 +1,3 @@
+
+# PGO
+mk_add_options PROFILE_GEN_SCRIPT='EXTRA_TEST_ARGS=10 $(MAKE) -C $(MOZ_OBJDIR) pgo-profile-run'
diff --git a/libre/iceweasel-libre/vendor.js b/libre/iceweasel-libre/vendor.js
new file mode 100644
index 000000000..6510944a7
--- /dev/null
+++ b/libre/iceweasel-libre/vendor.js
@@ -0,0 +1,22 @@
+// Use LANG environment variable to choose locale
+pref("intl.locale.matchOS", true);
+
+// Disable default browser checking.
+pref("browser.shell.checkDefaultBrowser", false);
+
+// Don't disable our bundled extensions in the application directory
+pref("extensions.autoDisableScopes", 11);
+pref("extensions.shownSelectionUI", true);
+
+// Disable Social API
+pref("social.remote-install.enabled", false);
+
+// Make sure that safebrowsing is disabled
+pref("browser.safebrowsing.enabled", false);
+pref("browser.safebrowsing.malware.enabled", false);
+
+// Disable localstorage for privacy reasons.
+pref("dom.storage.enabled", false);
+
+// Disable missing nonfree flash notification
+pref("plugins.notifyMissingFlash", false);